指定されたウィンドウを開いた状態で起動するようにtmuxを設定するにはどうすればよいですか?


回答:


258

必要なプログラムでtmuxを起動する小さなシェルスクリプトを作成できます。私はdev-tmuxと呼ぶシェルスクリプトに以下を記述しています。開発環境:

#!/bin/sh
tmux new-session -d 'vim'
tmux split-window -v 'ipython'
tmux split-window -h
tmux new-window 'mutt'
tmux -2 attach-session -d

だから、好きな開発環境を起動したいときはいつでも、

$ dev-tmux

4
ありがとう!bash --rcfile特定のdevtoolsバージョンを有効にした科学的なLinuxで素晴らしいシェルを取得するためにこれを組み合わせて動作させるには、恐ろしいエスケープをいくつか実行する必要がありました。誰かが同じことをしようとした場合、これをここに残します。tmux new-window -n "git lg" "scl enable devtoolset-3 'bash --rcfile <(echo \"source \"$HOME/.bashrc\";cd ~/workspace/coolproject/;git lg\")'"
Lallen

1
2行目は変更する必要があると思います。「vim」の前に-sオプションが必要です。「tmux new-session -d 'vim'」を「tmux new-session -d -s 'vim'」に置き換える必要があることを意味します
Ahmad Yoosofan

2
@ AhmadYoosofan、ther vimは、ウィンドウの最初の(その時点でのみ)ペインで実行されるコマンドを表します。代わりにセッションに「vim」という名前を付けたい場合は、はい、そうです、-sフラグを使用する必要があります。構文全体: tmux new-session -d -s SessionName -n WindowName Command
Mitja

注意:tmuxセッションをすでに(他の場所で)開始している場合、コマンドは他のセッションで終了する可能性があります。@ waqar-limの回答にはこの問題はありません。
ハジャ

174

私はペインの複雑なグリッドを作成しようとしており、ペインの切り替えと分割を何度も何度も処理する必要がありました。ここに私の学習があります:

tmux new-session \;

新しいセッションを開始します。それを水平または垂直に分割するには、split-window -hまたは-vそのように使用します:

tmux new-session \; split-window -v \; split-window -h \;

次のような3つのペインを作成します。

------------
|          |
|----------|
|    |     |
------------

そのペインでコマンドを実行するには、send-keys 'my-command'コマンドを追加してC-m実行するだけです。

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v \; \
  split-window -h \; \
  send-keys 'top' C-m \; 

そして、結果のセッションはそのようになります。

------------
|  tail    |
|----------|
|    | top |
------------

ここで、左下のペインを再びlast-pane細分割しようとしました。そのため、を使用して切り替えるか、より複雑なウィンドウで、select-pane -t 1where 1はで始まる順序で作成されたペインの番号です0

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v \; \
  split-window -h \; \
  send-keys 'top' C-m \; \
  select-pane -t 1 \; \
  split-window -v \; \
  send-keys 'weechat' C-m \;

それをします。基本的にあなたの方法を知っておりsplit-windowselect-pane必要なのはそれだけです。また-p 75、ペインのサイズをsplit-windowより詳細に制御するために作成されたペインのパーセンテージサイズで渡すのも便利です。

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v -p 75 \; \
  split-window -h -p 30 \; \
  send-keys 'top' C-m \; \
  select-pane -t 1 \; \
  split-window -v \; \
  send-keys 'weechat' C-m \;

その結果、セッションはそのようになります

------------------
|      tail      |
|----------------|
|          | top |
|----------|     |
| weechat  |     |
------------------

tmux将来の愛好家に役立つことを願っています。


2
驚くべきガイドライン、分割後に垂直パネルの幅を変更する方法を教えてくれませんか。
MinhNV

2
@MinhNV -h -p 30は、使用可能な高さの30%の水平パネルを作成します。-v -p 75幅75%の縦型も同じです。
1

1
の目的は何\:ですか?私は、スクリプトがこれを使用してもしなくても動作することを確認しました。
ケビンマクドノウ

2
UPDATE:\;セミコロンをbashではなくtmuxに渡し、コマンドをtmuxへの1回の呼び出しで送信できるようにします。stackoverflow.com/questions/20913198/...
ケビン・マクドナー

96

あなたはあなたの.tmux.conf好きなものから異なるセッションを調達することができます:

# initialize sessions
bind S source-file ~/.tmux/session1 
bind s source-file ~/.tmux/session2

そして、必要に応じてセッションをフォーマットします。

#session1
new  -s SessionName -n WindowName Command
neww -n foo/bar foo
splitw -v -p 50 -t 0 bar
selectw -t 1 
selectp -t 0

これにより2つのウィンドウが開き、2番目のウィンドウはfoo / barという名前になり、fooがbarの上で実行されるように垂直方向に半分(50%)に分割されます。フォーカスはウィンドウ2(foo / bar)、上部ペイン(foo)にあります。

次に、次のコマンドを使用して、好みのtmuxセッション(この場合は、session1)を開始できます。 PrefixShifts


4
追加のファイルを必要とせずに、これらのセッションを.tmux.conf内で開始することはできませんか?
イーノ

2
そのうちの1つ:このようにして、テーラードセッションを簡単に追加できます。また、いくつかの小さなテキストファイルはオーバーヘッドにはなりません...
jasonwryan

1
これはセッションのネストではないでしょうか?私は実行するPrefix Shift Sことを意味します。tmuxにいる必要があり、ファイルを調達すると、強制的に実行しない限り、tmuxが好まない新しいセッションを開始しようとします。
user35915

1
@ user35915それは単に子セッションを開始しますが、別の一つではないでしょう-あなたは例えば接頭-Sまたはprefix-の使用に切り替えることができることに)とprefix-(
sehe

1
これは受け入れられる答えになるはずです。ただし、(Sではなく)sにバインドすると、セッションをリストするための組み込みtmuxバインドがオーバーライドされます。
count0 '12年

54

tmuxinatorを使用します。複数のセッションを構成することができ、いつでも起動するセッションを選択できます。特定のウィンドウまたはペインでコマンドを起動して、ウィンドウにタイトルを付けることができます。ここでDjangoのアプリケーションを開発して使用例は

サンプル構成ファイル:

# ~/.tmuxinator/project_name.yml
# you can make as many tabs as you wish...

project_name: Tmuxinator
project_root: ~/code/rails_project
socket_name: foo # Not needed. Remove to use default socket
rvm: 1.9.2@rails_project
pre: sudo /etc/rc.d/mysqld start
tabs:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - #empty, will just run plain bash
        - top
  - shell: git pull
  - database: rails db
  - server: rails s
  - logs: tail -f logs/development.log
  - console: rails c
  - capistrano:
  - server: ssh me@myhost

詳細については、上記のリンクにあるREADMEを参照してください。


2
tmuxinatorは基本的にはまさに私が探していたものです。ありがとう!
ジャスティンフォース

3
かなり似ているtmuxpもあります:github.com/tony/tmuxp
Ben Creasy


16
:~$ tmux new-session "tmux source-file ~/session1"  

セッション1

neww
split-window -v 'ipython'  
split-window -h  
new-window 'mutt'  

.bashrcにエイリアスを作成する

:~$ echo `alias tmux_s1='tmux new-session "tmux source-file ~/session1"'` >>~/.bashrc  
:~$ . ~/.bashrc  
:~$ tmux_s1  

〜何newwですか?そのコマンドはどこにも見つかりません。〜と思われますがnew-window、長い形式と短い形式の両方を使用する理由を理解できません。
オリゴフレン

11

まず、@ jasonwryanからアプローチしましたが、2つ以上のがある場合、混乱する可能性があります。

だから私はエイリアス関数を作成しました:

tmx () {
    tmux "$2" source-file "$HOME/.tmux/$1.conf";
}

~/.tmux/私は多くの用途のために複数のセッションを持っています。たとえば、私はお互いに開発環境を持っているさまざまな会社で働いています。したがって、上記のエイリアス関数を使用すると、次のように呼び出すだけで済みtmx company1、必要な構成をロードできます。

更新:tmuxコマンドの後の「$ 2」の目的は、追加のtmux引数を渡すことができるようにすることです。


1
これを@ soc1cのヒントと組み合わせることで、非常に優れたセットアップが行われました(github.com/fatso83/dotfiles/commit/35a7ed)。ありがとう!
オリゴフレン

(get no server running on /tmp/tmux-1000/default)にフックする既存のtmuxセッションがまだない場合、関数は実際には機能しません。そのため、コマンドをでパッチする必要がありましたtmux new-session。参考github.com/fatso83/dotfiles/commit/...
oligofren

1
systemdでtmuxセットアップを行いました。したがって、起動後には常にセッションが実行されます。wiki.archlinux.org/index.php/Tmux#Autostart_with_systemd申し訳ありません。
danbruegge

10

毎朝呼び出す「get.all」スクリプトから、一連の「get.XXX」ジョブを実行して、追跡するソフトウェアを更新します。それらのいくつかは自動終了します。getacが終了すると(emacsをビルドするように要求するなど)より多くの対話が必要なものもあります。

#!/bin/sh
tmux att -t get ||
tmux \
  new -s get -n capp \; \
  send-keys 'get.capp' C-m \; \
  neww -n emacs \; \
  send-keys 'get.emacs' C-m \; \
  neww -n git \; \
  send-keys 'get.git' C-m \; \
  neww -n mini \; \
  send-keys 'get.mini' C-m \; \
  neww -n port \; \
  send-keys 'get.port' C-m \; \
  neww -n rakudo \; \
  send-keys 'get.rakudo' C-m \; \
  neww -n neil \; \
  send-keys 'get.neil && get.neil2 && exit' C-m \; \
  neww -n red \; \
  send-keys 'get.red && exit' C-m \; \
  neww -n cpan \; \
  send-keys 'get.cpan && exit' C-m \; \
  selectw -t emacs

8

画面を2つのペイン(水平方向など)に分割したいだけの場合は、次のコマンドを実行できます(tmuxまたはシェルスクリプトは必要ありません)。

tmux new-session \; split-window -h \;

画面は次のようになります。

[ks@localhost ~]$                      │[ks@localhost ~]$ 
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
[10] 0:ks@localhost:~*                  "localhost.localdomain" 19:51 31-янв-16

8

そして、これは私がそれをする方法です:

#!/bin/bash

function has-session {
  tmux has-session -t name_of_my_session 2>/dev/null
}

if has-session ; then
  echo "Session already exists"
else
  cd /path/to/my/project
  tmux new-session -d -s name_of_my_session 'vim'
  tmux split-window -h -p 40 start_web_server
  tmux split-window -v
  tmux attach-session -d -t name_of_my_session
fi

プロジェクトごとに1つのファイルがあります。また、それらをグループ化して、趣味のプロジェクトのためにいくつかの仕事をすることもできます。

また、あなたはそれを移動することができ~/bin、フォルダに追加PATHして与えるtmux_my_awesome_project名前を。その後、各場所から実行できます。


4

これは私にとってはうまくいきます。指定された名前で5つのウィンドウを作成し、homeウィンドウを自動的に選択します。

new  -n home
neww -n emacs
neww -n puppet
neww -n haskell
neww -n ruby
selectw -t 1

3

仲間を試す。これはプロジェクトのブートストラップです。

対話するための簡単なAPIを提供します tmuxます。

それはこのようなものです:

#!/bin/sh
# @ project_name/tasks/init.sh
structure project_name
  window editor
    run 'vim'
  window terminal
    run 'echo happy coding ...'
focus editor
connect project_name

プロジェクトを起動するには、次のコマンドを実行するだけです-

bro start <project_name>

以下のスクリーンキャストを確認してください。APIのbro使用方法と使用方法が示されていますtmux

https://user-images.githubusercontent.com/8296449/50532502-2cf3e400-0b6e-11e9-84af-c5f77a04e5cc.gif


2

プラグインtmux-continuumはtmuxセッションを自動的に保存し、次にtmuxが起動したときにそれをロードします。ここにあるカスタムスクリプトソリューションよりも簡単にセットアップできます。

特徴:

  • tmux環境の継続的な保存
  • コンピュータ/サーバーの電源が入ったときにtmuxが自動的に起動する
  • tmuxの起動時に自動復元

セッションをオンデマンドで保存するには、tmux-resurrectプラグインを使用できます。tmux- continuumを実行するには、tmux-resurrectも必要です

tmux-resurrectはtmux環境の細かい詳細をすべて保存するため、システムの再起動後(または希望するときに)完全に復元できます。設定は必要ありません。tmuxを終了しないように感じる必要があります。


2

これにはtmuxプラグインがあります。

tmux-resurrectをチェックしてください

システムの再起動後にtmux環境を復元します。

Tmuxは、コンピュータを再起動する必要がある場合を除き、優れています。実行中のすべてのプログラム、作業ディレクトリ、ペインレイアウトなどが失われます。便利な管理ツールはそこにありますが、ワークフローの発展や新しいプロジェクトの開始に合わせて、初期構成と継続的な更新が必要です。

tmux-resurrectはtmux環境の細かい詳細をすべて保存するため、システムの再起動後(または希望するときに)完全に復元できます。設定は必要ありません。tmuxを終了しないように感じる必要があります。

またはtmux-continuum

特徴:

  • tmux環境の継続的な保存
  • コンピュータ/サーバーの電源が入ったときにtmuxが自動的に起動する
  • tmuxの起動時に自動復元

2

tmuxフックを使用して、新しいセッションが作成されたときにコマンドを実行できます。具体的には、これはsession-createdフックを使用して実現されます。

たとえば、画面右下でhtopが実行されている3つの方法で画面を分割するには、次の行を~/.tmux.confファイルに追加します。

set-hook -g session-created 'split -h ; split -v top'

この方法の利点は、望ましい結果を得るために特別な方法(つまり、シェルスクリプトやエイリアス)でtmuxを実行する必要がないことです。これをこの他の回答tmux new-session -A -s mysession説明されているものと組み合わせることもできますて、フックコマンドが最初にセッションを作成するときにのみ実行され、後続の添付ファイルでは実行されないようにすることもできます。

この機能は2016年にd15d54c2cによって追加されました。これを含む最初のリリースは2.4です。


1

tmux構成ファイル(~/.tmux.conf)で指定する必要があります。次に例を示します。

new mocp
neww mutt

new -d
neww
neww

(2つのウィンドウで1つのセッションを開き、最初にmocpを起動し、2番目にmuttを起動し、3つの空のウィンドウで別のセッションを開きます)。


1

このスクリプトを作成しました。tmuxinator、rubyなどは必要ありません。これは単なるbashスクリプトであり、構成可能です。

configという名前のファイルには、次のようなものが含まれているはずです。

combo=()
combo+=('logs' 'cd /var/log; clear; pwd')
combo+=('home' 'cd ~; clear; pwd')

そしてbashコードは次のようになります:

#!/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

こんにちは、sensorarioです。このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。こちらをご覧ください:なぜ、どのようにしていくつかの回答が削除されますか?
bummi 2015

Nbは驚くべきことに、tmux start_serverそれ自体でサーバーを起動しません。github.com/tmux/tmux/issues/182を
Jack

1

このページのすべてのアイデアを試してみたところ、どれも気に入らなかった。端末が開いたときに特定のウィンドウセットでtmuxを起動するソリューションが欲しかっただけです。また、それをべき等にしたかったのです。つまり、新しいターミナルウィンドウを開くと、前のセッションからtmuxセッションが引き継がれます。

上記のソリューションは、複数のtmuxセッションを開く傾向があることが多く、1つだけ必要です。まず、これをmyに追加しました~/.bash_profile

tmux start-server
if [[ -z "$TMUX" ]]
then
  exec tmux attach -d -t default
fi

次に、以下をmyに追加しました~/.tmux.conf

new -s default -n emacs /usr/local/bin/emacs
neww -n shell /usr/local/bin/bash
neww -n shell /usr/local/bin/bash
selectw -t 1

端末を起動したり、tmuxを起動したりするたびに、既存の目的のセットアップ(というセッションdefault)に再接続するか、そのセットアップで新しいセッションを作成します。


驚くべきことに、tmux start_serverそれ自体でサーバーを起動しません。github.com/tmux/tmux/issues/182を
Jack

1

tmuxpは、 JSONまたはYAMLセッション構成とPython APIをサポートしています。YAML構文で新しいセッションを作成する簡単なtmuxp構成ファイルは次のとおりです。

session_name: 2-pane-vertical
windows:
  - window_name: my test window
    panes:
      - pwd
      - pwd

0

このスクリプトは、「e」という名前のセッションと3つのウィンドウを開始します

#!/bin/sh 
tmux new-session -s e   -n etc -d 'cd /etc; bash -i'
tmux new-window  -t e:1 -n home   'cd ~; bash -i'
tmux new-window  -t e:2 -n log   'cd /var/log; bash -i'

tmux select-window -t e:1
tmux -2 attach-session -t e
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.