複数のセッションを定義したtmux構成ファイルをリロードする方法は?


9

私はで2つの別々のセッションを使用し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つのウィンドウがあり、そのうちの1つは2つのペインに分割されています。設定ファイルをリロードすると、他のセッションから2つの余分なウィンドウが表示され、両方が既存のウィンドウに追加されました。さらに、以前のウィンドウには1つの余分なペインが表示されました。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行目)
ミハイルモルフィコフ2013

1
@MikhailMorfikov shが別のバージョンであることが原因である可能性があります。上の行をに変更してみてください#!/bin/bash
scicalculator 2013

うん、それはうまくいく。
ミハイルモルフィコフ2013

1

ラッパースクリプトを使用する必要はありませんsource-file。コマンドを使用して実行できます。

.tmux.confは2つに分割しました。

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、すべてがリロードされますが、新しいペインは作成されません。
小さな欠点の1つは、ウィンドウのレイアウトを変更する場合は、終了して新しいセッションを開始する必要があることです。


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.