Sortie de borne de refoulement

16

Existe-t-il un moyen standard d'inverser l'ordre de sortie d'une sortie de borne, c'est-à-dire:

~/Developer $ command0 
-bash: comman0: command not found 
~/Developer $ command2 
-bash: command2: command not found 
~/Developer $ command3 
-bash: command3: command not found 
~/Developer $ 

serait affiché comme:

~/Developer $ 
-bash: command3: command not found 
~/Developer $ command3 
-bash: command2: command not found 
~/Developer $ command2 
-bash: comman0: command not found 
~/Developer $ comman0

Je pense que toujours avoir votre invite en bas est contre-intuitif un moyen plus efficace de présenter la sortie serait d'inverser l'ordre de sortie. Comment pourrais-je procéder pour l'implémenter? Plus précisément, où la partie de sortie du programme de terminal OSX définie?

rudolph9
la source
Cela m'embrouillerait, mais j'applaudis vos efforts. L'une des principales leçons de Linux / Unix / Open Source est que la taille unique ne convient pas à tous.
Bruce Ediger
Je pense que ce n'est pas possible du tout sauf si vous changez le code source du shell (par exemple bash).
Renan
5
Vous auriez besoin de pirater plus que le shell. Les terminaux défilent de cette façon depuis qu'ils sont électromécaniques. À tout le moins, je dirais que vous devez pirater un émulateur de terminal, peut-être aussi un shell.
Alexios
C'est en fait contre-intuitif. Avez-vous remarqué la flèche de la touche ENTRÉE? Il pointe vers la ligne ci-dessous, pas au-dessus.
dresende
Existe-t-il un moyen de récupérer les éléments de sortie d'un terminal, ma pensée est de créer une sorte de wrapper qui saisit chacun de ces éléments de sortie, les traite chacun de la même manière que les tweets sont publiés avec le plus récent toujours en haut et coller l'invite de saisie en haut de l'interface utilisateur du wrapper.
rudolph9

Réponses:

6

En bash, cela affichera l'invite / commande actuelle en haut et sa sortie ci-dessous, mais sans défilement ni commandes précédentes:

PROMPT_COMMAND='tput cup 0 0; tput el; tput el1'

Cette fonction mettra les commandes précédentes ci-dessous, mais vous devez diriger chaque commande individuellement. Malheureusement, exec > >(f)cela ne peut pas aider car il redirige l'ensemble de bash, pas les commandes individuelles. Voici la fonction:

f () { tee ~/.STDIN | wc -l | xargs expr 1 + | xargs tput il && cat ~/.STDIN; }

Ensuite, exécutez chaque commande comme:

command args |f

Il enregistre la sortie, crée un nombre de lignes vierges égal à la longueur + 1, puis replace la sortie. Vous pouvez marquer une ligne à la fin qui affichera une fausse invite ou une règle horizontale si vous le souhaitez. Par exemple

printf '%*s' $COLUMNS | tr ' ' _;

Comme alternative merde mais automatique à toute cette fonction, nous pouvons ajouter une commande à la fin de notre $ PROMPT_COMMAND précédente qui efface 11 lignes quelque peu arbitraires:

PROMPT_COMMAND='tput cup 0 0; tput el; tput el1; tput il 11'

Vous pouvez également utiliser tput -Spour éviter plusieurs appels binaires.


Je l'ai obtenu $PROMPT_COMMANDsur https://github.com/swirepe/alwaysontop .

Tommy Jollyboat
la source
6

Malheureusement, ce sera assez difficile. Le protocole entre les applications et le terminal OS-X est une variante du protocole de contrôle du terminal VT100 / ANSI , en particulier le protocole XTerm .

Cela inclut un tas d'hypothèses sur la position de l'écran, etc., qui seraient difficiles à réadapter à un monde où l'affichage était inversé.

Pire encore, tout ce que votre émulateur de terminal obtient est une chaîne de commandes de type "mettre ce caractère à cette position". Il n'y a pas de distinction entre l'invite de commande et la sortie d'une commande exécutée par elle, donc vous ne pouvez pas faire une chose pour les deux parties - du moins, non sans la coopération du shell en dessous.

Le shell et les programmes supposent que l'écran progresse vers le haut - de nouvelles données en bas, et continue vers le bas pour toujours.

Vous pourriez, au moins théoriquement, faire modifier votre émulateur de terminal pour qu'il affiche les lignes dans l'ordre inverse - la ligne "en bas" en premier, et ainsi de suite jusqu'à la ligne "en haut" en bas de l'écran.

Cela inverserait cependant l'ordre des lignes dans la sortie de la commande, de sorte que le reste du contenu ressortirait également en arrière. Si vous vouliez que les commandes (par exemple: ls, cat) s'exécutent "vers le bas", mais vous invite à passer "vers le haut", la vie est plus difficile.

Je ne connais aucun logiciel qui implémente cela. (... mais voir le commentaire de JdeBD à ce sujet pour un lien vers celui-ci.) :)

Daniel Pittman
la source
Je fais. (-:
JdeBP
6

Bien que cela n'inverse pas exactement la sortie, cela gardera votre invite en haut:

https://github.com/swirepe/alwaysontop

Pour l'utiliser, exécutez:

git clone https://github.com/swirepe/alwaysontop.git
cd alwaysontop/
source alwaysontop.sh

Si vous décidez que vous l'aimez, sourcez-le simplement dans votre .bash_profile avec quelque chose comme:

echo "source ~/alwaysontop/alwaysontop.sh" >> ~/.bash_profile
ryanpcmcquen
la source
1
C'est un peu bogué (par exemple avec la saisie semi-automatique et l'historique) mais c'est une très bonne démo de ce que cette interface utilisateur pourrait ressembler si elle était implémentée correctement. Je pense que c'est utile pour cela - pour aider les gens à savoir s'ils le veulent ou non!
scipilot