Les lignes de terminal OS X ne vont pas dans le défilement

12

J'ai un problème qui survient lors de l'utilisation du terminal de Mac OS X (TERM = xterm): parfois, il se met dans un état où les lignes qui défilent en haut ne sont pas ajoutées au tampon de défilement. Je n'utilise pas screenou similaire; il s'agit d'un shell bash simple à l'intérieur d'un onglet Terminal.

Il ne le fait pas immédiatement après l'ouverture d'un nouvel onglet. Je crois que c'est un effet secondaire de quelque chose que j'ai exécuté dans l'onglet problème. Je suppose que cela a quelque chose à voir avec l'émulation xterm, peut-être la région de défilement.

Ce qui n'a pas fonctionné:

  • Réinitialisation logicielle et matérielle via le menu Shell
  • Exécuter resetdans l'onglet

Existe-t-il un moyen fiable de réinitialiser le terminal et / ou l'état xterm?

Quelqu'un peut-il expliquer ce qui se passe, même si le seul correctif consiste à fermer l'onglet et à en ouvrir un nouveau?

Steve Madsen
la source
Quelle version de Mac OS X utilisez-vous? Avez-vous le tampon sur quelque chose de moins que "illimité" et les lignes qui vous manquent sont simplement les lignes les plus anciennes qui sont tombées à l'arrière du tampon?
Spiff
Mac OS X 10.6.2 et le tampon est de 10 000 lignes, mais les lignes perdues sont celles qui défilent juste à côté de l'écran. Si je fais défiler un écran vers le haut, ces lignes ne sont pas là, et en fait, lorsque les lignes défilent en haut, la page de défilement la plus récente ne change jamais.
Steve Madsen

Réponses:

19

Cela signifie que le terminal utilise le tampon d'écran alternatif. Il existe un écran principal, qui défile dans le journal de défilement, et un autre écran qui ne le fait pas. Les programmes "plein écran" ou "orientés écran" comme top, less, emacs, vim et screen font basculer le terminal sur l'écran alternatif par défaut.

Chaque écran a son propre contenu et son propre état. Le fait d'avoir un écran alternatif permet aux programmes de reprendre la totalité de l'affichage, puis de restaurer le contenu précédent à leur sortie, en revenant à l'écran principal.

Depuis Mac OS X Lion 10.7, Terminal dispose d'un élément de menu que vous pouvez utiliser pour changer manuellement d'écran:

Affichage> Afficher / masquer un autre écran

Ceci est fourni principalement afin que vous puissiez afficher ou copier du texte à partir de l'écran secondaire après la fermeture d'un programme "plein écran". Xterm a une commande similaire.

Vous pouvez également l'utiliser pour forcer manuellement un programme à utiliser un écran particulier, pour contrôler si la sortie va dans le journal de défilement, par exemple. Cependant, si vous utilisez actuellement un programme qui bascule explicitement vers l'écran alternatif, vous pouvez le confondre ou obtenir des résultats inattendus si vous le forcez à l'écran principal pendant que le programme est en cours d'exécution, utilisez donc cela avec prudence.

Selon le programme, il peut avoir un argument de ligne de commande ou un autre moyen pour le configurer pour utiliser l'écran principal à la place. par exemple less -X.

Certaines entrées terminfo sont spécialement conçues pour supprimer l'utilisation de l'écran alternatif, par exemple xterm1. TERM=xterm1 emacsexécutera Emacs sur l'écran principal. Je ne recommande pas d'utiliser en xterm1permanence, car il désactive un certain nombre d'autres fonctionnalités utiles par rapport à la valeur par défaut xterm-256colorsur Lion.

Vous pouvez également changer d'écran en utilisant la tputcommande pour émettre les séquences d'échappement depuis l'intérieur d'un shell ou d'un script. tput smcupbascule vers l'écran tput rmcupsecondaire et revient à l'écran principal.

Pour voir quel programme est en cours d'exécution, regardez le nom du programme affiché dans la fenêtre Terminal ou le titre de l'onglet, ou regardez la fenêtre Inspecteur ( Shell> Afficher l'inspecteur ). Le dernier processus de la liste dans l'inspecteur est (généralement) le programme en cours à l'aide de l'écran. C'est celui que vous devrez configurer pour utiliser l'écran principal à la place.

Chris Page
la source
1
Cela ressemble à une réponse très prometteuse. Est-ce une explication raisonnable qu'un programme pourrait se fermer anormalement, laissant l'écran alternatif actif?
Steve Madsen
Si vous êtes de retour dans le shell après avoir exécuté un programme "plein écran", oui, c'est une possibilité, bien que la plupart des programmes populaires, comme ceux que j'ai énumérés, soient fiables pour nettoyer après eux-mêmes. Si un programme "plein écran" se bloque, il peut laisser le terminal sur un autre écran. Cependant, vous avez dit que vous avez essayé Shell> Envoyer une réinitialisation matérielle , ce qui inclut le retour à l'écran principal. Si cela se reproduit, vous pouvez essayer d'utiliser cette commande pour revenir en arrière:tput rmcup
Chris Page
Une autre possibilité est qu'un programme quitte le terminal avec une "zone de défilement". Il existe des codes pour indiquer au terminal de faire défiler uniquement une sous-plage de lignes lors du défilement. Les programmes l'utilisent pour afficher des lignes d'état, par exemple, qui ne défilent pas hors de l'écran. Si la région de défilement n'inclut pas la ligne supérieure, le texte ne défilera pas dans le journal de défilement. Encore une fois, cependant, vous avez dit que vous avez essayé une réinitialisation matérielle, ce qui devrait également le supprimer.
Chris Page
2
Dans mon cas, ce qui semble s'être produit, c'est que ma sshsession sur une machine distante a échoué (expiration?) Pendant que j'étais à l'intérieur vi, laissant apparemment le terminal dans l'écran alternatif (car vion ne m'a jamais donné la possibilité de nettoyer). Par la suite, toute nouvelle sshsession dans le même terminal présenterait le problème décrit par l'OP, jusqu'à ce que je résolve le problème en sélectionnant l' élément de menu Affichage> Masquer l'écran alternatif .
Hephaestus
Merci, Affichage> Afficher / Masquer l'écran alternatif aidé. Il a une combinaison de touches que je dois avoir frappé sans le savoir et je ne savais pas ce qui s'est passé ni comment l'annuler
aexl