如何创建一个简单的 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

这是一个快速而肮脏的命令行,可以实现您想要的:

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

该解决方案有一些缺点:

  • 它的扩展性不太好(多一些命令,结果难以理解)。

  • 这两个 tail 命令不在交互式 shell 中运行,因此如果您退出这两个命令,窗口myWindow将被销毁(如果您没有创建更多会话,则窗口将与会话一起被销毁)。


这是一个按照您尝试过的方式工作的 shell 脚本。对我来说,思考如何实现我的目标总是最容易的手动然后将其转换为 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,一个 Ruby gem,可让您使用简化且更透明的语法来管理 tmux 会话。


在我的回答中无需 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 a,它将创建 SessionName,并将窗口水平 ( -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.conf,tmux 会依次执行每个命令,创建您请求的布局。

令人惊讶的是,仅在创建的第一个会话tmux -f tmux.conf中运行命令。tmux.conf如果您已经有会话正在运行,-f tmux.conf则会默默地忽略该会话。您可以使用 来解决这个问题tmux source-file tmux.conf。您可以在 shebang 行中使用它,使其成为脚本。

我发现这项技术非常有用。在每个项目目录的根目录中,我都有一个可执行文件tmux.conf。当我再次开始处理该项目时,我会跑去./tmux.conf创建我喜欢的该项目的工作环境。

相关内容