Sur ma machine locale, j'ai 3 instances node.js exécutées simultanément. Chacun a son propre volet dans une fenêtre tmux appelée «serveurs». Le problème est qu'il n'est pas si facile de déterminer quel nœud s'exécute dans quel volet, car leurs journaux sont similaires.
Ce dont j'ai besoin, c'est d'un titre pour chaque volet. Comme je l'ai compris, tmux lui-même n'a pas la fonctionnalité: il n'a que des titres pour les fenêtres et non pour les volets. Lancer une session tmux distincte dans chaque volet pour chaque instance de node.js ressemble à une exagération.
Alors, y a-t-il un petit programme qui lance une commande, enveloppant sa sortie avec une barre d'état spécifiée?
Merci d'avance
command-line
title
tmux
pane
Andrey Lushnikov
la source
la source
Réponses:
tmux prend en charge les titres par volet, mais il ne fournit pas d'emplacement par volet pour afficher ces titres.
Vous pouvez définir le titre d'un volet avec la séquence d'échappement ESC
]2;
… ESC\
(par exemple, voir la section intitulée Noms et titres dans la page de manuel tmux ). Vous pouvez le faire à partir du shell comme ceci:Le titre de chaque volet est par défaut le nom d'hôte du système. Par défaut, le titre du volet actif est affiché sur le côté droit de la ligne d'état de tmux (la valeur globale par défaut de la variable de session
status-right
est"#22T" %H:%M %d-%b-%y
, qui affiche 22 caractères du titre du volet, l'heure et la date).Ainsi, tant que vous êtes satisfait de pouvoir voir le titre du volet actif (c'est-à-dire que vous souhaitez changer de volet pour voir le titre d'un volet inactif), vous pouvez vous en tirer avec la fonctionnalité par défaut. Envoyez simplement la séquence d'échappement de réglage de titre appropriée avant de lancer la commande principale pour chaque volet.
Si vous avez absolument besoin d'une ligne dédiée pour afficher certaines informations par volet, les sessions tmux imbriquées peuvent ne pas être autant (inutiles) «exagérées» que vous ne le pensez.
Dans le cas général, pour fournir une ligne d'état inviolable sur un terminal donné, vous aurez besoin d'un (ré) émulateur de terminal complet qui se trouve entre le terminal d'origine et un nouveau terminal (un avec une ligne en moins). Une telle (ré) émulation est nécessaire pour traduire les séquences de contrôle envoyées au terminal interne et les traduire pour le terminal d'origine. Par exemple, pour maintenir une ligne d'état en bas du terminal externe, la commande
envoyé au terminal interne doit être devenu
une fois traduit et envoyé au terminal externe. De même, un LF envoyé au terminal interne doit devenir
dans le terminal externe.
Des programmes comme tmux et screen ne sont que de tels réémulateurs de terminaux. Bien sûr, il existe de nombreuses autres fonctionnalités intégrées à l'émulateur de terminal, mais vous auriez besoin d'un gros morceau de code d'émulation de terminal juste pour fournir une ligne d'état fiable .
Il existe cependant une solution légère tant que
Comme beaucoup d'émulateurs de terminal, tmux prend en charge une commande de contrôle de terminal «définir la région de défilement» dans ses volets. Vous pouvez utiliser cette commande pour limiter la zone de défilement aux N-1 lignes supérieures (ou inférieures) du terminal et écrire une sorte de texte d'identification d'instance dans la ligne sans défilement.
Les restrictions (pas de commandes de déplacement du curseur autorisées, pas de redimensionnement) sont requises car le programme qui génère la sortie (par exemple une instance Node.js ) n'a aucune idée que le défilement a été limité à une région particulière. Si le programme de génération de sortie déplaçait le curseur en dehors de la région de défilement, alors la sortie pourrait devenir brouillée. De même, l'émulateur de terminal réinitialise probablement automatiquement la région de défilement lorsque le terminal est redimensionné (ainsi la «ligne sans défilement» finira probablement par défiler).
J'ai écrit un script qui utilise
tput
pour générer les séquences de contrôle appropriées, écrire dans la ligne sans défilement et exécuter un programme après avoir déplacé le curseur dans la région de défilement:Vous pouvez l'utiliser comme ceci:
Le script doit également fonctionner en dehors de tmux tant que le terminal prend en charge et publie ses capacités
csr
etcup
terminfo.la source
tput
pour inclure les séquences de contrôle appropriées dans l'argument «contenu de la ligne». Avec la plupart des terminaux, vous pouvez faire en sorte que la ligne soit «cyan (6) et vert (3) sur magenta (5)» avecno_scroll_line top "$(tput setaf 6; tput setab 5)Node: $(tput setaf 3)foo$(tput op)" node foo.js
.setaf
définit le premier plan,setab
définit l'arrière-plan,op
réinitialise les couleurs par défaut des terminaux. Les capacités de couleur prennent un nombre compris entre 0–7, 0–15, 0–87 ou 0–255, selon l'émulation de votre terminal.Cette fonctionnalité a été ajoutée à tmux dans ce commit . Ce n'est pas dans la version 2.2, mais il semble que ce sera dans la version 2.3.
Pour l'activer:
ou si vous préférez:
Pour définir un texte personnalisé comme ligne d'état de la bordure de votre volet, vous pouvez utiliser
pane-border-format
, par exemple, comme suit:la source
tmux
vous avez besoin d'une commande à l'extérieurtmux
pour le changer. Droite? Ou y a-t-il une séquence à l'intérieur qui peut le mettre à jour?pane-border-format
pour définir une chaîne de format personnalisée pour le volet à afficher (le#{...}
format habituel ). J'ai modifié votre réponse pour l'inclure.Puisque
tmux 2.6
vous pouvez faire:Vous pouvez voir le titre par volet dans une barre d'état avec:
Désactivez la barre d'état avec:
la source
cd $HOME
, le titre prend la valeur de$HOME
. (Je vois ceci sur tmux 2.8.)set-window-option automatic-rename off
.set-option -g allow-rename off
dans mon.tmux.conf
dossier.pane-border-format
et une variable fournie par l'utilisateur (je ne suis pas sûr qu'il existe un nom officiel pour cette fonctionnalité) pour contrôler ce qui est affiché. Voici un exemple.Je travaille sur la barre d'état du volet pour tmux - ticket. Ma branche de développement peut être trouvée ici sur github: https://github.com/jonathanslenders/tmux
À l'heure actuelle, cela ajoute déjà une commande "titre" du volet de changement de nom . Il y a encore quelques bugs et l'API va s'améliorer. L'idée est de créer une barre d'état par volet, qui peut avoir une certaine mise en forme, comme la barre d'état de session. Comme le reste de tmux, tout devrait devenir scriptable et personnalisable. Une fois terminé et stable, il sera probablement inclus dans le tmux officiel.
la source
J'utilise la version 2.3 de tmux, je pense que le style de bordure n'est pas pris en charge dans les versions précédentes. C'est ce qui a fonctionné pour moi:
Pour chaque volet, définissez le titre:
Ensuite:
la source
select-pane -T "my title"
fait ceci. Vous pouvez même configurer une liaison de clé, il vous suffit donc de fournir le titre:bind-key T command-prompt -p "New title:" 'select-pane -T "%%"'
pane-border-status
option est définie sur quelque chose (top
oubottom
).Un gif vaut mille mots. ( source )
tmux-xpanes est un diviseur de terminal basé sur tmux, qui prend en charge l'affichage du titre pour chaque volet via l'
-t
option nouvellement ajoutée .la source
Oui , il y a une telle commande:
tmux
. Donnez un nom à votre session et elle s'affichera dans une barre d'état interne:la source
Cela n'est pas utile à court terme, mais il existe une demande de fonctionnalité pour les titres par volet dans tmux: http://sourceforge.net/tracker/?func=detail&aid=3495916&group_id=200378&atid=973265#
En attendant, comme d'autres l'ont mentionné, l'imbrication de tmux fonctionne décemment.
la source
TL; DR
Ajoutez les configurations suivantes à votre fichier de configuration tmux (dans mon cas est
~/.tmux.conf.local
)puis exécutez:
Profitez-en
Merci à https://stackoverflow.com/a/37602055/5121972
la source