如何重新加载已定义多个会话的 tmux 配置文件?

如何重新加载已定义多个会话的 tmux 配置文件?

我在 中使用两个独立的会话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 个额外的窗口,并且这两个窗口都已添加到预先存在的窗口中。此外,先前的窗口获得了一个额外的窗格。两个额外的窗格是透明的,其中任何一个都没有执行的命令(htop)。

有没有办法重新加载配置文件,使其仅适用于附加会话?或者,当我使用会话时,我是否必须忘记重新加载配置文件,并且为了应用新设置,我应该使用tmux kill-server并重新启动会话?

答案1

构建包装器

我认为,通过某种形式的包装脚本来设置自定义会话可以最好地满足您的需求。例如这个问题的答案

它看起来像这样,但是你应该根据你的特定需要改变它。

#!/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因为它是本地的并且特定于您的个人需求。

答案2

您不必使用包装脚本,您可以使用命令来完成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所有内容都会重新加载,但不会创建新的窗格。
一个小缺点是,如果您想更改窗口布局,则需要退出并开始新的会话。

答案3

我已经创建这个脚本。它不需要 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

相关内容