Як перезавантажити файл tmux config, який визначив кілька сеансів?


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, рубін чи інші. Це просто баш сценарій, який можна налаштувати.

Я конфігурую файл mi config на зразок:

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.