![如何重新加载已定义多个会话的 tmux 配置文件?](https://linux22.com/image/1390056/%E5%A6%82%E4%BD%95%E9%87%8D%E6%96%B0%E5%8A%A0%E8%BD%BD%E5%B7%B2%E5%AE%9A%E4%B9%89%E5%A4%9A%E4%B8%AA%E4%BC%9A%E8%AF%9D%E7%9A%84%20tmux%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我在 中使用两个独立的会话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