Lorsque vous démarrez XTerm, l'invite commence à la première ligne du terminal. Lors de l'exécution des commandes, l'invite se déplace vers le bas jusqu'à ce qu'elle atteigne le bas, et à partir de là, elle y reste (même pas Shift- Page Downou la souris peut changer cela). Plutôt que d'avoir le début de la durée de vie du terminal "spécial", l'invite doit toujours être en bas du terminal. Veuillez noter que j'ai une invite sur plusieurs lignes .
Bien sûr, cela devrait sinon fonctionner comme avant (redimensionnable, défilable, pas de nouvelle ligne inutile dans la sortie, et aucune sortie disparaissant mystérieusement), donc PROMPT_COMMAND='echo;echo;...'
ou similaire n'est pas une option. Idéalement, la solution ne doit pas être spécifique au shell.
Edit: La solution actuelle , tout en travaillant dans des cas simples, a quelques problèmes:
- C'est spécifique à Bash . Une solution idéale devrait être portable à d'autres coquilles.
- Il échoue si d'autres processus se modifient
PS1
. Un exemple est virtualenv, qui ajoute(virtualenv)
au début dePS1
, qui disparaît ensuite toujours juste au-dessus du pli. - Ctrl- supprimel désormais la dernière page de l'historique.
Existe-t-il un moyen d'éviter ces problèmes, à moins de bifurquer XTerm?
clear
commande.Réponses:
Si vous utilisez
bash
, ce qui suit devrait faire l'affaire:Ou (moins efficace car il exécute une
tput
commande avant chaque invite, mais fonctionne après que la fenêtre du terminal a été redimensionnée):Pour éviter
tput
de modifier le code de sortie, vous pouvez l'enregistrer et le réinitialiser explicitement:Notez que la variable
retval
est locale; cela n'affecte aucuneretval
variable que vous auriez pu définir autrement dans le shell.Étant donné que la plupart des
cup
capacités des terminaux sont les mêmes\e[y;xH
, vous pouvez également les coder en dur:Si vous souhaitez éviter toute réinitialisation ultérieure de PS1, vous pouvez également utiliser la
PROMPT_COMMAND
variable. S'il est défini, il est exécuté en tant que commande avant la sortie de l'invite. Ainsi, l'effet peut également être obtenu enBien sûr, bien que la réinitialisation
PS1
n'affecte pas cela, certains autres logiciels peuvent également changerPROMPT_COMMAND
.la source
tput
diffèrent-ils de nombreusesecho
commandes? (Demande par curiosité)'\[$(tput cup "$LINES")\]'
fonctionne magnifiquement . Merci!tput
: il semble se réinitialiser$exit_code
. Fixé en utilisant\[\e[$LINES;1H\]
.tput
qui préserve le code de sortie.Pour simplifier légèrement la réponse précédente, j'ai trouvé plus facile d'exécuter simplement:
au début de
.bashrc
ou.zshrc
. Il fait juste le travail.Avantages:
Les inconvénients:
clear
versclear; tput ...
n'aide pas;la source
Les réponses utilisant
$LINES
sont inutilement non portables. Comme cela est fait dansresize
, vous pouvez simplement demanderxterm
de définir la position sur un numéro de ligne arbitrairement grand, par exemple,(en supposant que vous avez une fenêtre inférieure à 10 000 lignes, sans tenir compte du défilement arrière ).
Étant donné que la chaîne ne changera pas en tant qu'effet secondaire du redimensionnement de la fenêtre, vous pouvez le calculer une fois et le coller dans votre chaîne d'invite en tant que constante, par exemple,
et ensuite
selon vos préférences.
En ce qui concerne les autres processus modifiant
PS1
: vous devrez recalculerPS1
après ces changements, pour vous assurer qu'il ressemble à ce que vous voulez. Mais la question ne contient pas suffisamment de détails pour indiquer où apporter les modifications.Et enfin: le comportement de tabulation ne correspond pas à ce type de changement, en raison des hypothèses de bash.
la source
PS1="${TPUT_END} myprompt: "
, ou mêmePS1="${TPUT_END}${PS1}"