ウィンドウを分割するための単純なtmux confを作成する方法は?

ウィンドウを分割するための単純なtmux confを作成する方法は?

次のように単純なtmux confを作成したいと思います。

  1. 水平に分割されたウィンドウ/ウィンドウ/whatever_stupid_terminology(hsplit)
  2. トップウィンドウで開くtail -f foo
  3. 下のウィンドウで開くtail -f bar

tmuxでどうすればいいですか?

これが私が持っているものです。

#!/bin/sh
tmux new-session -s asdf -n myWindow
tmux select-window -t myWindow
tmux split-window "tail -f /var/log/apache2/samperror.log" 
tmux attach-session -t asdf

考えられる解決策は考えられません。だから私はそれがすべて間違っていることを知っています。最も直感的ではないconfファイルの1つ

答え1

必要なものを達成するための迅速で簡単なコマンドラインは次のとおりです。

$ tmux new-session -s asdf -n myWindow -d 'tail -f foo'\; \
       split-window -d 'tail -f bar'\; attach-session

このソリューションにはいくつかの欠点があります。

  • スケーラビリティが悪い(コマンドがさらに追加され、結果を理解するのが難しい)。

  • 2つのtailコマンドはインタラクティブシェルでは実行されないため、2つのコマンドを終了するとウィンドウがmyWindow破棄されます(セッションが作成されない場合はウィンドウがセッションとともに破棄されます)。


以下は、試した方法で動作するシェルスクリプトです。私の目標を達成する方法について考えることは常に最も簡単です。手動その後、tmux コマンドに変換します。これは最も簡単でクリーンなアプローチではありませんが、通常は次のように機能します。

#!/bin/sh
# create a new session. Note the -d flag, we do not want to attach just yet!
tmux new-session -s asdf -n 'myWindow' -d

# send 'tail -f foo<enter>' to the first pane.
# I address the first pane using the -t flag. This is not necessary,
# I'm doing it so explicitly to show you how to do it.
# for the <enter> key, we can use either C-m (linefeed) or C-j (newline)
tmux send-keys -t asdf:myWindow.0 'tail -f foo' C-j

# split the window *vertically*
tmux split-window -v

# we now have two panes in myWindow: pane 0 is above pane 1
# again, specifying pane 1 with '-t 1' is optional
tmux send-keys -t 1 'tail -f bar' C-j

# uncomment the following command if you want to attach
# explicitly to the window we just created

#tmux select-window -t asdf:mywindow

# finally attach to the session
tmux attach -t asdf

試してもコマンドと設定の構文が気に入らない場合は、次のtmux点を検討してください。tmuxatorシンプルでより透明な構文を使用してtmuxセッションを管理できるRuby gemです。


私の答えにXサーバーなしで複数の端末を同時に使用するtmux役に立つリソースへのリンクを見つけることができます

答え2

外部スクリプトではなくユーザースクリプトで実際に実行したい場合は、次のように~/.tmux.conf設定ファイルに追加できます。

# session initialisation
new -s SessionName -n WindowName 'tail -f /var/log/apache2/samperror.log'
splitw -h -p 50 -t 0 'tail -f /var/log/apache2/other.log'
selectw -t 0

その後、セッションに接続されたコマンドを使用してtmuxを起動すると、tmux aSessionNameが作成され、-hウィンドウを水平に半分に分割(-p 50)し、両方のコマンドを実行します。

答え3

に基づいて回答より一般的なコードは次のとおりです。

tmuxMany(){
    #https://unix.stackexchange.com/a/149729/47116
    if [ $# -lt 2 ]; then
        echo usage: sessionName command1 command2 ...
        return 1
    fi
    local sessionName=$1
    local firstCommand=$2
    local secondAndRestCommands=( "${@:3}" )

    tmux new-session -s $sessionName -n 'myWindow' -d
    tmux send-keys -t $sessionName:myWindow.0 "$firstCommand" C-j
    local i
    for i in "${!secondAndRestCommands[@]}"
    do
        echo $i
        local command=${secondAndRestCommands[$i]}
        echo $command

        tmux split-window -v
        local tabNumber=$((i+1))
        tmux send-keys -t $tabNumber "$command" C-j
    done
    tmux select-layout even-vertical
    tmux attach -t $sessionName
}

使用法:

tmuxMany sessionName "tail -f file" "tail -f file2" htop

tmuxは同じ高さの3つのウィンドウで開きます。

答え4

次のようにしてみてください。

$ chmod +x tmux.conf
$ cat tmux.conf
#!/usr/bin/tmux source-file
new-session -s asdf -n myWindow "tail -f /var/log/maillog"
split-window "tail -f /var/log/messages"

を実行すると、./tmux.conftmuxは各コマンドを順番に実行して、要求されたレイアウトを作成します。

驚くべきことにtmux -f tmux.conf、このコマンドは最初に作成されたセッションでのみ実行されます。tmux.confすでに実行中のセッションがある場合は、-f tmux.conf自動的に無視されます。を使用してこの問題を解決できますtmux source-file tmux.conf。 Shebang行でこれを使用してスクリプトにすることができます。

私はこの技術が非常に役に立つと思います。各プロジェクトディレクトリのルートには実行可能ファイルがありますtmux.conf。再びプロジェクト作業を始めると、./tmux.confプロジェクトに好みの作業環境を作るために駆けつけます。

関連情報