如何在不手动输入的情况下让tmux打开一组窗格?


30

因此,我想进行一个特定于项目的tmux会话,该会话会自动弹出某些窗格中的某些命令。遵循在线教程tmux手册页之后,这就是我想到的配置文件:

new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

结果是……什么都没有。 tmux从一个窗口和该窗口中的单个窗格启动,而不执行任何命令。

我将如何制作一个配置文件,该配置文件实际上允许我使用预先执行的某些命令来创建一组窗口和窗格?

Answers:


36

您的配置文件正在运行,但是有一些麻烦。

短命命令

首先,您正在启动的命令(例如ls)非常快地完成运行。命令的窗口和窗格已创建,但是一旦退出每个命令,它们就会消失。

如果您的目标是在最终配置中实际使用这样的“一次性”命令,则您可能应该使用window选项remain-on-exit(并可能使用session选项set-remain-on-exit为会话中创建的所有窗口提供默认设置)。当remain-on-exit设置为一个窗口,它不会消失的命令退出时。您可能希望将映射respawn-window到键(注意:respawn-window将重新生成原始命令;respawn-panetmux 1.5中也可用以重新生成各个窗格)。

bind-key R respawn-window

# set global r-o-e so that initial window of initial session gets it
set -g set-remain-on-exit on

# create a session and its windows/panes
new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# restore global r-o-e
set -g set-remain-on-exit off

# let session r-o-e inherit from global value for future windows
set -u set-remain-on-exit

或者,如果您不介意初始窗口是数字1而不是数字0,那么我们可以避免更改全局值:

bind-key R respawn-window

# create a session with a throw-away window
new true

# for future windows, stay open after the command exits
set set-remain-on-exit on

# create the windows we really want
neww -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# for future windows, revert r-o-e to global value
set -u set-remain-on-exit

如果您只是ls用作简化的占位符命令,而您实际上打算在Windows /窗格中生成某种类型的交互式命令,那么您可能应该只生成最终要运行的命令。如果您打算命令的时间太长启动过程中使用它TMUX测试,然后替换一个壳或其它简单的交互式命令(例如topsqlite3等)。

new-session 是默认命令

其次,在没有命令参数(例如)的情况下运行tmuxtmux等同于使用new-session命令(即tmux与相同tmux new-session)。您.tmux.conf为其窗口/窗格创建一个会话(new是的别名new-session),并且正在为new-session通过启动tmux而没有命令参数指定的隐式命令创建另一个会话。如果使用默认状态栏,[1]则在“额外”会话中(在中创建的初始会话.tmux.conf为数字0),您将在状态栏的左侧看到a 。

如果要避免创建额外的会话,请使用tmux attach代替plain tmux。您的命令.tmux.conf将运行,创建会话0,然后您的客户端将附加到该会话,而不是创建一个新的会话。


2
好的,我这里可能像鲸鱼三明治一样厚,但是现在我只有一个配置文件,splitw里面没有其他东西,而且仍然没有分屏显示,因为它说无法建立当前会话。如果new在其之前添加,我将得到一个窗口,一个窗格。在我的一生中,我似乎无法在启动时得到两个窗格。
我的正确观点

1
使用的配置文件newsplitw当我通过开启tmux时对我有用tmux attach。要记住的一件事是.tmux.conf(或使用该-f选项指定的文件)仅在没有服务器正在运行时才使用。检查服务器是否正在通过运行tmux ls。如果要在服务器已经运行时从文件运行命令,请按以下步骤操作:(tmux source-file /path/to/conf-file-that-creates-a-session-and-windows \; attach如果在没有服务器的情况下运行此命令,则您的.tmux.conf(或-f文件)将先运行,然后运行source-file文件)。
克里斯·约翰森

配置文件用-f指定-所以我要去tmux new -f myconfig。该配置文件的内容 包含new后跟splitw。在尝试命令行之前,我正在杀死所有tmux进程tmux -f myconfig。我没有两个窗格。在这之后,我真的不知所措(除了放弃tmux)。
我的正确观点2010年

4
@Just:是否使用-ftmux带命令参数的情况相同tmux new-session(对于新服务器,它将在配置文件执行的操作的基础上创建一个新会话)。拆分前的窗口是在会话0中创建的,但是隐式new-session命令正在创建(并附加到)额外的会话(会话1;[1]在状态行中查找)。使用tmux -f myconfig attach以避免创建隐藏了预裂窗新的会话。
克里斯·约翰森

1
好吧,我想学习阅读最终会为我带来回报。:)感谢您的努力和回答。现在一切正常。我希望这里有一个“小费罐”的声誉,这样我可以给您的不仅仅是一个被接受的答案。
只是我的正确观点,2010年

9

我不确定我是否理解“手动输入”的意思,但这就是我的做法。我写了一个窗口管理器启动的“自动启动”脚本。它包含:

tmux start-server                                                                                                                                                                                                                                                                                                                                                            
for i in ~/sessions_tmux/*.session; do "$i"; done

每个.session文件的外观如下所示:

#!/bin/bash

SESSION_NAME="flaskr_tutorial"
if [[ ! -z "$TMUX" ]] || [[ ! -z "$TMUX_PANE" ]]; then
    echo "Already inside a tmux session, do not know what to do"
    exit 1
fi
tmux -q has-session -t "$SESSION_NAME"
if [ $? ]; then
    exit 0
fi
NEWCWD=~/projects/flaskr/
( cd "${NEWCWD}"; tmux new-session -d -s "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'vim flaskr.py' Enter
( cd "${NEWCWD}"; tmux split -h -t "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'sudo tail -F -n 100 /var/log/messages | ccze' Enter

等等,还有更多!我使用konsole加载的.session文件越来越多:

konsole --background-mode --profile Shell --tabs-from-file ~/sessions_tmux/work_console.tabs

其中work_console.tabs看起来像这样:

.
.
.
title: projectx;;    command: tmux attach -t projectx
title: flaskr;;      command: tmux attach -t flaskr_tutorial
.
.
.

然后按F12键启动konsole。


konsole似乎坏了,所以我切换到Terminal,它运行良好。我在tmux-users邮件列表上有更详细的帖子
约翰·施密特

1
只需发表一点评论,您就可以替换“!-z'在您的测试中带有'-n';)
lilorox

6

假设您要启动3个服务器监视任务(在此处ping localhost),则无需弄乱配置文件和保存的会话。所有这些都可以从命令行完成。

tmux new-session 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    select-layout even-vertical

感谢您的简单性-正是我想要的示例!
dsz 2015年

5

我发现teamocil对于自动化tmux窗口/会话非常有用。

它是用Ruby编写的,因此您需要安装它。

这是一个示例配置:

session:
  name: 'my project'
  windows:
    -name: vim
     root: '~/code/my_project'
     splits:
       - cmd: vim
       - cmd: guard

您可以安排窗口和拆分。



4

**

  • 更好地保存您的会话!

**我发现对于像我这样的懒惰管理员,我宁愿节省tmux的时间,而不是花费数小时来尝试完美地构建它。我管理着30多台服务器,我的tmux会话是动态的,配置一直在变化。脖子很痛,直到我最近发现tmux-resurrect 这个插件很棒。试试看。当前,Ubuntu存储库具有tmux 1.8,此插件需要1.9,因此您需要手动升级

sudo apt-get install python-software-properties software-properties-common
sudo add-apt-repository ppa:pi-rho/dev
sudo apt-get update
sudo apt-get install  tmux=2.0-1~ppa1~t

之后,您可以通过安装

git clone https://github.com/tmux-plugins/tmux-resurrect ~/clone/path

然后dd这行到〜/ .tmux.conf的底部(如果〜/ .tmux.conf不可用,请创建一个空文件)

run-shell ~/clone/path/resurrect.tmux

我还在〜/ .tmux.conf的末尾添加了这一行,以便该插件保存我运行的所有程序的会话

set -g @resurrect-processes ':all:'

然后重新加载tmux环境。

tmux source-file ~/.tmux.conf

而已!大功告成 现在,正常运行tmux,调整窗格大小,创建新窗格,创建新会话...等。对配置感到满意时(在多个窗口和多个会话中),只需单击ctrl + b,然后单击ctrl + s即可保存会话。为了测试结果,只需杀死所有tmux

killall tmux

然后,再次运行tmux

tmux

然后,从tmux中单击ctrl + b,然后单击ctrl + r(用于还原)神奇地,所有窗口,窗格和会话都以相同的几何形状和排列进行还原。希望这会有所帮助。

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.