Как перезагрузить конфигурационный файл tmux, который определил несколько сессий?


9

Я использую две отдельные сессии tmux, и у меня есть следующие записи в /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

Я начинаю сессию standard, вызывая следующую команду:

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

Если сеанса нет, он создает его, если он есть, он присоединяется. Как видите, у меня есть два окна, одно из которых разделено на 2 панели. Когда я перезагружаю файл конфигурации, я получил 2 дополнительных окна из другого сеанса, и оба были добавлены к уже существующим. Кроме того, предыдущие окна получили одну дополнительную панель. Две дополнительные панели понятны, ни в одной из них нет выполненных команд (htop).

Есть ли способ перезагрузить конфигурационный файл так, чтобы он применялся только к присоединенному сеансу? Или я должен забыть о перезагрузке файла конфигурации, когда я использую сеансы, и чтобы применить новые настройки, я должен использовать tmux kill-serverи начать сеансы заново?

Ответы:


5

Построить обертку

Я думаю, что ваши потребности лучше всего удовлетворяются некоторой формой скрипта-обертки для настройки пользовательских сессий. Что-то вроде ответа на этот .

Это будет выглядеть примерно так, но вы должны изменить это для ваших конкретных потребностей.

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

Чтобы перезагрузить файл конфигурации

Если вы вносите изменения в файл конфигурации при использовании tmux, вы можете запустить это приглашение

tmux source-file /path/to/conf

Или вы можете привязать его к ключу в .tmux.conf

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

Конфигурации домашнего каталога

Наконец, вам действительно не следует добавлять значительные настройки, /etc/tmux.confпотому что это будет бесполезно для других, если вам нужно использовать общую систему. Вместо этого я предлагаю вам добавить любую настройку, ~/.tmux.confпотому что она локальна и специфична для ваших личных потребностей.


Я получил ошибку при выполнении сценария: [[: not found(7-я строка)
Михаил Морфиков

1
@MikhailMorfikov Это может быть из-за другой версии sh. Попробуйте изменить верхнюю строку на #!/bin/bash.
scicalculator

Да, это работает.
Михаил Морфиков

1

Вам не нужно использовать скрипт-обертку, вы можете сделать это с помощью source-fileкоманды.

Я разделил мою .tmux.confна две части, и это только источник тех:

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

Затем session.confсодержит определения панели:

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

И options.confсодержит только определения параметров:

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

Таким образом, bind Rисточник может быть только источником options.confи все будет перезагружено, но новые панели не будут созданы.
Один небольшой недостаток заключается в том, что если вы хотите изменить расположение окон, вам нужно выйти и начать новый сеанс.


0

Я создал этот скрипт . Для этого не нужен tmuxinator, ruby ​​или другие. Это просто скрипт bash, настраиваемый.

Я настраиваю конфигурационный файл mi как:

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

Я могу настроить все свои проекты. Остальное делается скриптом:

#!/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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.