Como recarregar o arquivo de configuração tmux, que definiu várias sessões?

9

Estou usando duas sessões separadas tmuxe tenho as seguintes entradas em /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

Inicio a sessão standardchamando o seguinte comando:

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

Se não houver sessão, ele cria uma; se houver, ela anexa. Como você pode ver, tenho duas janelas, uma das quais é dividida em 2 painéis. Quando recarrego o arquivo de configuração, recebi 2 janelas extras da outra sessão e ambas foram adicionadas às pré-existentes. Além disso, as janelas anteriores receberam um painel extra. Os dois painéis extras são limpos, não há comandos executados (htop) em nenhum deles.

Existe uma maneira de recarregar o arquivo de configuração da maneira que isso seria aplicado apenas à sessão anexada? Ou devo esquecer de recarregar o arquivo de configuração quando estiver usando sessões e, para aplicar uma nova configuração, devo usar tmux kill-servere iniciar novamente as sessões?

Mikhail Morfikov
fonte

Respostas:

5

Construir um wrapper

Acho que suas necessidades são melhor atendidas por algum tipo de script wrapper para configurar sessões personalizadas. Algo como a resposta para este .

Seria algo parecido com isto, mas você deve alterá-lo para suas necessidades específicas.

#!/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

Para recarregar um arquivo de configuração

Se você editar o arquivo de configuração enquanto estiver usando o tmux, poderá executar este é o prompt

tmux source-file /path/to/conf

Ou, você pode vinculá-lo a uma chave .tmux.conf

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

Configurações do diretório inicial

Por fim, você realmente não deve adicionar personalizações significativas, /etc/tmux.confpois isso seria inútil para outras pessoas se você precisar usar um sistema compartilhado. Em vez disso, sugiro que você adicione qualquer personalização ~/.tmux.confporque é local e específico para suas necessidades pessoais.

scicalculator
fonte
[[: not found
Ocorreu
11
@MikhailMorfikov Pode ser que sh seja uma versão diferente. Tente alterar a linha superior para #!/bin/bash.
Scicalculator
Sim, isso funciona.
Mikhail Morfikov
1

Você não precisa usar um script de wrapper, pode fazê-lo com o source-filecomando

Dividi o meu .tmux.confem dois pedaços, e ele apenas os fonte:

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

Em seguida, session.confcontém as definições do painel:

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

E options.confcontém apenas as definições de opção:

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

Dessa forma, a bind Rúnica fonte options.confe o tudo serão recarregados, mas nenhum novo painel será criado.
Uma pequena desvantagem é que, se você deseja alterar o layout da janela, precisa sair e iniciar uma nova sessão.

kissgyorgy
fonte
0

Eu criei esse script . Não precisa de tmuxinator, ruby ​​ou outros. É apenas um script bash, configurável.

Eu configuro o arquivo mi config como:

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

Eu posso configurar todos os meus projetos. O resto é feito pelo 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
fonte