Comment recharger le fichier de configuration tmux qui a défini plusieurs sessions?

9

J'utilise deux sessions séparées dans tmux, et j'ai les entrées suivantes dans /etc/tmux.conf:

set -g base-index 1

new -s logi -n cmd
neww -n logi "cat /dev/logi | ccze -m ansi -p syslog -C"
splitw -t 1 -v -p 50
selectw -t 2
selectp -t 0

new -s standard -n htop "htop"
neww -n cmd
splitw -t 2 -v -p 50
selectw -t 2 
selectp -t 1

Je démarre la session standarden appelant la commande suivante:

urxvtc -name 'tmux' -e bash -c 'tmux attach-session -t standard'

S'il n'y a pas de session, il en crée une, s'il y en a une, il l'attache. Comme vous pouvez le voir, j'ai deux fenêtres, dont l'une est divisée en 2 volets. Lorsque je recharge le fichier de configuration, j'ai obtenu 2 fenêtres supplémentaires de l'autre session, et les deux ont été ajoutées aux préexistantes. De plus, les fenêtres précédentes ont reçu un volet supplémentaire. Les deux volets supplémentaires sont clairs, il n'y a aucune commande exécutée (htop) dans aucun d'entre eux.

Existe-t-il un moyen de recharger le fichier de configuration de la manière qui ne s'appliquerait qu'à la session attachée? Ou dois-je oublier de recharger le fichier de configuration lorsque j'utilise des sessions, et pour appliquer un nouveau paramètre, je devrais utiliser tmux kill-serveret recommencer les sessions?

Mikhail Morfikov
la source

Réponses:

5

Construire un wrapper

Je pense que vos besoins sont mieux servis par une certaine forme de script wrapper pour configurer des sessions personnalisées. Quelque chose comme la réponse à celle-ci .

Cela ressemblerait à quelque chose comme ça, mais vous devriez le changer pour vos besoins spécifiques.

#!/bin/bash

# test if the session has windows
is_closed(){ 
    sess=$1
    n=$(tmux ls 2> /dev/null | grep "^$sess" | wc -l)
    [[ $n -eq 0 ]]
}

# either create it or attach to it
if is_closed logi ; then
  tmux new -d -s logi -n cmd
  tmux neww -t logi -n logi "cat /dev/logi | ccze -m ansi -p syslog -C"
  tmux splitw -t logi:1 -v -p 50
  tmux selectw -t logi:2
  tmux selectp -t logi:1
fi
if is_closed standard ; then
  tmux new -d -s standard -n htop "htop"
  tmux neww -n cmd -t standard
  tmux splitw -t standard:2 -v -p 50
  tmux selectw -t standard:2 
  tmux selectp -t standard:1
fi

Pour recharger un fichier de configuration

Si vous apportez une modification au fichier de configuration lors de l'utilisation de tmux, vous pouvez exécuter ceci est l'invite

tmux source-file /path/to/conf

Ou, vous pouvez le lier à une clé dans .tmux.conf

bind r source-file ${HOME}/.tmux.conf \; display-message "source-file reloaded"

Configurations du répertoire personnel

Enfin, vous ne devriez vraiment pas ajouter de personnalisations importantes à, /etc/tmux.confcar cela ne serait d' aucune utilité pour les autres si vous avez besoin d'utiliser un système partagé. Au lieu de cela, je vous suggère d'ajouter une personnalisation à ~/.tmux.confcar elle est locale et spécifique à vos besoins personnels.

scicalculator
la source
J'ai eu une erreur lors de l'exécution du script: [[: not found(7e ligne)
Mikhail Morfikov
1
@MikhailMorfikov C'est peut-être dû au fait qu'il s'agit d'une version différente. Essayez de changer la ligne supérieure en #!/bin/bash.
scicalculator
Oui, ça marche.
Mikhail Morfikov
1

Vous n'avez pas besoin d'utiliser un script wrapper, vous pouvez le faire avec la source-filecommande.

J'ai divisé mon .tmux.confen deux morceaux, et il ne source que ceux-ci:

source-file ~/.config/tmux/options.conf
source-file ~/.config/tmux/session.conf

Ensuite, session.confcontient les définitions du volet:

new -s logi -n cmd
neww -n logi "cat /dev/logi | ccze -m ansi -p syslog -C"
splitw -t 1 -v -p 50
selectw -t 2
selectp -t 0

new -s standard -n htop "htop"
neww -n cmd
splitw -t 2 -v -p 50
selectw -t 2 
selectp -t 1

Et options.confne contient que les définitions des options:

bind R source-file ~/.config/tmux/options.conf \; display-message "Config reloaded..."
set -g base-index 1

De cette façon, le bind Rpeut uniquement source options.confet tout sera rechargé, mais aucun nouveau volet ne sera créé.
Un petit inconvénient est que si vous souhaitez modifier la disposition des fenêtres, vous devez quitter et démarrer une nouvelle session.

kissgyorgy
la source
0

J'ai créé ce script . Il n'a pas besoin de tmuxinator, rubis ou autres. C'est juste un script bash, configurable.

Je configure le fichier mi config comme:

combo=()
combo+=('logs' 'cd /var/log; clear; pwd')
combo+=('home' 'cd ~; clear; pwd')

Je peux configurer tous mes projets. Le reste est fait par le script:

#!/bin/bash

if [ -r config ]; then
    echo ""
    echo "Loading custom file"
    . config
else
    . config.dist
fi

tmux start-server

window=0
windownumber=-1

for i in "${combo[@]}"; do

    if [ $((window%2)) == 0 ]; then
        name=${i}
        ((windownumber++))
    else
        command=${i}
    fi

    if [ ${combo[0]} == "${i}" ]; then
        tmux new-session -d -s StarTmux -n "${name}"
    else
        if [ $((window%2)) == 0 ]; then
            tmux new-window -tStarTmux:$windownumber -n "${name}"
        fi
    fi

    if [ $((window%2)) == 1 ]; then
        tmux send-keys -tStarTmux:$windownumber "${command}" C-m
    fi

    ((window++))
done

tmux select-window -tStarTmux:0
tmux attach-session -d -tStarTmux
sensorario
la source