如何重新加载定义了多个会话的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个窗格。当我重新加载配置文件时,我从另一个会话中获得了两个额外的窗口,并且两个都已添加到预先存在的窗口中。此外,以前的窗口还多了一个窗格。这两个额外的窗格很清楚,它们中没有任何执行的命令(htop)。

有没有一种方法可以重新加载配置文件,使其仅应用于连接的会话?还是我必须忘记在使用会话时重新加载配置文件,并且为了应用新设置,我应该使用tmux kill-server并重新启动会话?

Answers:


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行)
Mikhail Morfikov 2013年

1
@MikhailMorfikov可能是由于sh是其他版本。尝试将顶行更改为#!/bin/bash
scicalculator 2013年

是的,行得通。
Mikhail Morfikov

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

我已经创建了这个脚本。它不需要解毒剂,红宝石或其他。它只是一个可配置的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.