「Tmux」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
(→‎256色: 同期)
 
(6人の利用者による、間の26版が非表示)
1行目: 1行目:
 
{{lowercase title}}
 
{{lowercase title}}
[[Category:ターミナルエミュータ]]
+
[[Category:ターミナルマルチプクサ]]
 
[[en:Tmux]]
 
[[en:Tmux]]
 
[[es:Tmux]]
 
[[es:Tmux]]
 
[[ru:Tmux]]
 
[[ru:Tmux]]
[[tr:Tmux]]
 
 
[[zh-hans:Tmux]]
 
[[zh-hans:Tmux]]
 
{{Related articles start}}
 
{{Related articles start}}
11行目: 10行目:
 
{{Related articles end}}
 
{{Related articles end}}
   
[http://tmux.github.io/ Tmux] はターミナルマルチプレクサです: 一つのスクリーンから別々のプログラムが動作する多数のターミナル (またはウィンドウ) を作成・アクセス・制御することができます。tmux はスクリーンから分離させてバックグラウンドで動作させることができ、後でまた繋ぎ直すことができます。
+
[http://tmux.github.io/ tmux] はターミナルマルチプレクサ: 一つのスクリーンから別々のプログラムが動作する多数のターミナル (またはウィンドウ) を作成・アクセス・制御することができます。tmux はスクリーンから分離させてバックグラウンドで動作させることができ、後でまた繋ぎ直すことができます。」です。
   
Tmux は [[GNU Screen]] の代わりになるものとして ISC ライセンスで配布されています。似ているところもありますが、プログラムには様々な違いが存在します。[https://raw.githubusercontent.com/tmux/tmux/master/FAQ tmux の FAQ ページ] を見て下さい。
+
tmux は [[GNU Screen]] の代わりになるものとして ISC ライセンスで配布されています。似ているところもありますが、プログラムには様々な違いが存在します。[https://github.com/tmux/tmux/wiki/FAQ tmux の FAQ ページ] を見て下さい。
   
 
== インストール ==
 
== インストール ==
[[公式リポジトリ]]にある {{Pkg|tmux}} パッケージを[[インストール]]してください。任意で {{Aur|tmux-bash-completion}} をインストールすることで tmux の bash 補完を使うことができます。
+
{{Pkg|tmux}} パッケージを[[インストール]]してください。任意で {{Aur|tmux-bash-completion-git}} をインストールすることで tmux の bash 補完を使うことができます。
   
 
== 設定 ==
 
== 設定 ==
  +
ユーザーごとの設定ファイルは {{ic|~/.tmux.conf}} に、グローバルな設定ファイルは {{ic|/etc/tmux.conf}} に配置されます。
 
  +
デフォルトでは、tmux はユーザ毎の設定として {{ic|~/.tmux.conf}} を探します。しかし、{{ic|~/.config/tmux/tmux.conf}} も使用可能です (このパスはハードコードされていて、{{ic|$XDG_CONFIG_HOME}} は無視されます)。グローバルな設定ファイルは {{ic|/etc/tmux.conf}} を使用できます。しかし、デフォルトでは Arch のパッケージはこのファイルを同梱していません。
   
 
=== キーバインド ===
 
=== キーバインド ===
26行目: 26行目:
   
 
ウィンドウを複数のペインに分割した後、ペインのサイズを変更するには、プレフィックスキー (例: {{Ic|Ctrl-b}}) を押してから、Ctrl を押しながら、Left/Right/Up/Down を押します。ペイン間の移動も同じ方法で行い、矢印キーの代わりに ''o'' を使います。
 
ウィンドウを複数のペインに分割した後、ペインのサイズを変更するには、プレフィックスキー (例: {{Ic|Ctrl-b}}) を押してから、Ctrl を押しながら、Left/Right/Up/Down を押します。ペイン間の移動も同じ方法で行い、矢印キーの代わりに ''o'' を使います。
 
{{Tip|[[GNU Screen|screen]] と同じキーバインドを使いたい場合は {{ic|/usr/share/tmux/screen-keys.conf}} を設定ファイルにコピーしてください。}}
 
   
 
キーバインドは {{ic|tmux.conf}} の bind と unbind コマンドで変更することができます。例えばデフォルトのプレフィックスキーである {{Ic|Ctrl-b}} を {{Ic|Ctrl-a}} に変更するには設定ファイルに以下のコマンドを追加します:
 
キーバインドは {{ic|tmux.conf}} の bind と unbind コマンドで変更することができます。例えばデフォルトのプレフィックスキーである {{Ic|Ctrl-b}} を {{Ic|Ctrl-a}} に変更するには設定ファイルに以下のコマンドを追加します:
37行目: 35行目:
 
}}
 
}}
   
{{Tip|特殊文字はクォートで囲ってプレフィックスとして使ってください。{{ic|Ctrl}} の代わりに {{ic|Alt}} (Meta) を使うこともできます。例: {{ic|set -g prefix m-'\'}}}}
+
{{Tip|特殊文字はクォートで囲ってプレフィックスとして使ってください。{{ic|Ctrl}} の代わりに {{ic|Alt}} (Meta) を使うこともできます。例: {{ic|set -g prefix m-'\'}}}}
   
 
さらに、ウィンドウ間の移動をする方法には以下のものもあります:
 
さらに、ウィンドウ間の移動をする方法には以下のものもあります:
80行目: 78行目:
   
 
==== 256色 ====
 
==== 256色 ====
256色のターミナルを使っている場合、tmux で適切なターミナルを設定する必要があります。[https://raw.githubusercontent.com/tmux/tmux/master/CHANGES tmux 2.1] から、''tmux'' または ''tmux-256color'' が適切な設定値です。{{ic|tmux.conf}} で以下のように設定できます:
 
 
set -g default-terminal "tmux-256color"
 
   
  +
256色のターミナルを使っている場合、tmux で適切なターミナル (''tmux'' または ''tmux-256color'') を設定する必要があります。設定ファイルで以下のように設定できます:
もしくは ''screen'' や ''screen-256color'' などに設定する場合もあります:
 
   
set -g default-terminal "screen-256color"
+
{{hc|tmux.conf|set -g default-terminal "tmux-256color"}}
   
また、{{ic|.bashrc}} に以下を追加することで強制的に tmux から256色をサポートしているターミナルを認識させことができます:
+
また、tmux の表示がおかしくなってしまう場合、[[.bashrc]] に以下のエイリアスを追加することで tmux はターミナルが256色をサポートしていると仮定すようになります:
   
 
alias tmux="tmux -2"
 
alias tmux="tmux -2"
   
 
==== 24ビットカラー ====
 
==== 24ビットカラー ====
  +
Tmux はバージョン 2.2 から24ビットカラーをサポートしています ([https://github.com/tmux/tmux/commit/427b8204268af5548d09b830e101c59daa095df9])。使用しているターミナルが24ビットカラーをサポートしている場合 ([https://gist.github.com/XVilka/8346728 gist] を参照)、ターミナルを {{ic|terminal-overrides}} 設定に追加してください。例えば、[[Termite]] を使っているのであれば以下のように追加します:
 
  +
Tmux はバージョン 2.2 から24ビットカラーをサポートしています [https://github.com/tmux/tmux/commit/427b8204268af5548d09b830e101c59daa095df9] 使用しているターミナルが24ビットカラーをサポートしている場合 ([https://gist.github.com/XVilka/8346728 gist] を参照) ターミナルを {{ic|terminal-overrides}} 設定に追加してください。例えば、[[Termite]] を使っているのであれば以下のように追加します:
   
 
set -ga terminal-overrides ",xterm-termite:Tc"
 
set -ga terminal-overrides ",xterm-termite:Tc"
   
他のターミナルの場合、{{ic|xterm-termite}} を適切なターミナルのタイプに置き換えてください ({{ic|$TERM}} に保存されています)。{{ic|Tc}} の terminfo 拡張について詳しくは tmux(1) の man ページを見てください。
+
他のターミナルの場合、{{ic|xterm-termite}} を適切なターミナルのタイプに置き換えてください ({{ic|$TERM}} に保存されています)。{{ic|Tc}} の terminfo 拡張について詳しくは {{man|1|tmux}} ページを見てください。
   
 
==== xterm-keys ====
 
==== xterm-keys ====
139行目: 135行目:
 
起動時に tmux サーバーを立ち上げることには複数の利点が存在します。特に、新しい tmux セッションを起動する場合、既にサービスが動作していれば起動時間が短縮されます。
 
起動時に tmux サーバーを立ち上げることには複数の利点が存在します。特に、新しい tmux セッションを起動する場合、既にサービスが動作していれば起動時間が短縮されます。
   
さらに、tmux セッションのカスタマイズは維持され、たとえログインしなくても tmux セッションを永続的にすることができます (tmux の設定をスクリプトで管理している場合やユーザーの tmux セッションを共有する場合などに有用です)
+
さらに、tmux セッションのカスタマイズは維持され、たとえログインしなくても tmux セッションを永続することができます (tmux の設定をスクリプトで管理している場合やユーザーの tmux セッションを共有する場合などに有用です)
   
 
以下のサービスは特定のユーザーで ''tmux'' を起動します ({{ic|tmux@''username''.service}} で起動と同じ):
 
以下のサービスは特定のユーザーで ''tmux'' を起動します ({{ic|tmux@''username''.service}} で起動と同じ):
157行目: 153行目:
 
</nowiki>}}
 
</nowiki>}}
   
{{Tip|{{ic|1=WorkingDirectory=''custom_path''}} を追加することで作業ディレクトリをカスタマイズするも可能です。}}
+
{{Tip|{{ic|1=WorkingDirectory=''custom_path''}} を追加して、作業ディレクトリをカスタマイズできます。 {{ic|~}} に設定すると、{{ic|1=User=}} 指定されたユーザーのホームディレクトリが使用されます。}}
   
または、({{ic|1=User=%I}} を使わずに) 上記のファイルを [[systemd/ユーザー]]ディレクトリに配置することもできます、例: {{ic|~/.config/systemd/user/tmux.service}}この方法だと[[systemd/ユーザー#systemd のユーザーインスタンスを自動起動|ユーザーインスタンスの自動起動]]を有効にしていない場合、ログイン時に tmux サービスが起動します。
+
または、({{ic|1=User=%I}} を使わずに) 上記のファイルを [[systemd/ユーザー]]ディレクトリに配置することもできます、例: {{ic|~/.config/systemd/user/tmux.service}} この方法だと [[systemd/ユーザー#systemd のユーザーインスタンスを自動起動|ユーザーインスタンスの自動起動]] を有効にしていない場合、ログイン時に tmux サービスが起動します。
   
 
== セッションの開始 ==
 
== セッションの開始 ==
185行目: 181行目:
 
bind F source-file ~/.tmux/foo
 
bind F source-file ~/.tmux/foo
 
bind B source-file ~/.tmux/bar
 
bind B source-file ~/.tmux/bar
 
== トラブルシューティング ==
 
 
=== スクロールの問題 ===
 
ターミナルで Shift-Page Up/Down を使ってスクロールができない場合、以下の設定で {{ic|xterm}} から識別子が始まるターミナルで smcup と rmcup の機能を削除できます:
 
 
set -ga terminal-overrides ',xterm*:smcup@:rmcup@'
 
 
上記の設定を使うとターミナルエミュレータは tmux のことを [[pico]] や [[mutt]] と同じようなフルスクリーンのアプリケーションと認識するようになり [http://superuser.com/questions/310251/use-terminal-scrollbar-with-tmux]、スクロールバックが正しく記録されるようになります。ただし、ウィンドウやペインを切り替えたときに多少表示が崩れるかもしれません。Tmux のネイティブのスクロールバックを使うことを推奨します。
 
 
=== マウスのスクロール ===
 
 
{{Note|以下の設定はセレクションバッファのコピー・ペーストと干渉します。セレクションバッファからコピー・ペーストするときは shift キーを押してください。}}
 
 
マウスホイールでスクロールしたい場合、{{ic|.tmux.conf}} で mode-mouse をオンにして下さい:
 
set -g mouse on
 
 
スクロール履歴を設定するには:
 
set -g history-limit 30000
 
 
tmux 2.1 からは、マウスホイールでスクロールするには {{ic|~/.tmux.conf}} に以下のどちらかあるいは両方を追加してみてください:
 
bind -T root WheelUpPane if-shell -F -t = "#{alternate_on}" "send-keys -M" "select-pane -t =; copy-mode -e; send-keys -M"
 
bind -T root WheelDownPane if-shell -F -t = "#{alternate_on}" "send-keys -M" "select-pane -t =; send-keys -M"
 
 
上記の設定では一行ずつしかスクロールしませんが、以下を追加することでページ単位でスクロールすることができます:
 
bind -t vi-copy WheelUpPane page-up
 
bind -t vi-copy WheelDownPane page-down
 
bind -t emacs-copy WheelUpPane page-up
 
bind -t emacs-copy WheelDownPane page-down
 
 
=== UTF-8 のマウスイベントをターミナルエミュレータがサポートしていない ===
 
 
ターミナルエミュレータが UTF-8 のマウスイベントに対応していない場合、tmux の {{ic|mouse on}} オプションを設定しても、ターミナルウィンドウの中で左クリックすると {{ic|[M#}} や {{ic|[Ma}} などの文字列がプロンプトに貼り付けられてしまいます。
 
 
この問題を解決するには以下を設定:
 
 
set -g mouse-utf8 off
 
 
=== Shift+F6 が Midnight Commander で動作しない ===
 
 
[[Midnight Commander#ショートカットが機能しない]]を参照してください。
 
   
 
== X クリップボードの統合 ==
 
== X クリップボードの統合 ==
234行目: 189行目:
   
 
# Emacs style
 
# Emacs style
bind-key -T copy-mode y send-key -X copy-pipe-and-cancel "xsel -i -p && xsel -o -p | xsel -i -b"
+
bind-key -T copy-mode y send-keys -X copy-pipe-and-cancel "xsel -i -p && xsel -o -p | xsel -i -b"
 
bind-key C-y run "xsel -o | tmux load-buffer - ; tmux paste-buffer"
 
bind-key C-y run "xsel -o | tmux load-buffer - ; tmux paste-buffer"
   
251行目: 206行目:
 
{{Note|以下の設定を使うにはマウスのサポートを有効にする必要があります。}}
 
{{Note|以下の設定を使うにはマウスのサポートを有効にする必要があります。}}
   
中マウスのクリックによって tmux で urxvt のコピーアンドペーストを有効にする非公式の perl 拡張が存在します (公式の [http://sourceforge.net/p/tmux/tmux-code/ci/master/tree/FAQ FAQ] に記載があります)。
+
中マウスのクリックによって tmux で urxvt のコピーアンドペーストを有効にする非公式の perl 拡張が存在します (公式の [https://github.com/tmux/tmux/wiki/FAQ FAQ] に記載があります [https://github.com/tmux/tmux/wiki/FAQ#how-do-i-copy-a-selection-from-tmux-to-the-systems-clipboard])。
   
 
まず、perl スクリプトをダウンロードして urxvts の perl ライブラリに配置してください:
 
まず、perl スクリプトをダウンロードして urxvts の perl ライブラリに配置してください:
280行目: 235行目:
 
tmux の中では Shift+中マウスクリックを使うことでクリップボードのセレクションが貼り付けられます。中マウスのクリックだけの場合、tmux のバッファが貼り付けられます。
 
tmux の中では Shift+中マウスクリックを使うことでクリップボードのセレクションが貼り付けられます。中マウスのクリックだけの場合、tmux のバッファが貼り付けられます。
   
  +
== ヒントとテクニック ==
== Tips and tricks ==
 
 
=== デフォルトのセッションレイアウトで tmux を起動 ===
 
=== デフォルトのセッションレイアウトで tmux を起動 ===
 
tmuxinator や [[tmuxp]] などのセッションマネージャを使うことで共通のセッション設定を簡単に管理できます。
 
tmuxinator や [[tmuxp]] などのセッションマネージャを使うことで共通のセッション設定を簡単に管理できます。
   
tmuxinator の場合、[[AUR]] から {{AUR|tmuxinator}} をインストールします。次のコマンドでインストールをテストできます:
+
tmuxinator の場合、{{AUR|tmuxinator}} パッケージをインストールします。次のコマンドでインストールをテストできます:
   
 
tmuxinator doctor
 
tmuxinator doctor
335行目: 290行目:
 
fi
 
fi
 
</nowiki>}}
 
</nowiki>}}
  +
  +
==== デフォルトセッションの代替アプローチ ====
  +
上記の方法を使用する代わりに、実行時にデフォルトのセッションを作成してそれにアタッチする bash スクリプトを作成します。
  +
次に、端末から実行して、その端末で事前に設計された構成を取得できます。
  +
  +
#!/bin/bash
  +
tmux new-session -d -n WindowName Command
  +
tmux new-window -n NewWindowName
  +
tmux split-window -v
  +
tmux selectp -t 1
  +
tmux split-window -h
  +
tmux selectw -t 1
  +
tmux -2 attach-session -d
   
 
=== urxvt で tmux を起動 ===
 
=== urxvt で tmux を起動 ===
340行目: 308行目:
 
{{bc|<nowiki>urxvt -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"</nowiki>}}
 
{{bc|<nowiki>urxvt -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"</nowiki>}}
   
=== シェルのログイン時に tmux を起動 ===
+
=== すべてのシェルのログイン時に tmux を起動 ===
   
  +
if [ -x "$(command -v tmux)" ] && [ -n "${DISPLAY}" ] && [ -z "${TMUX}" ]; then
以下の bash コードを {{ic|.bashrc}} のエイリアスの前に追加してください。他のシェルのコードも同じようになります:
 
  +
tmux attach || tmux >/dev/null 2>&1
  +
fi
   
  +
上記のスニペットは以下のことを行います:
{{hc|~/.bashrc|<nowiki>
 
# If not running interactively, do not do anything
 
[[ $- != *i* ]] && return
 
[[ -z "$TMUX" ]] && exec tmux
 
</nowiki>}}
 
   
  +
# tmux が実行可能であることを確認する。
{{note|This snippet ensures that tmux is not launched inside of itself (something tmux usually already checks for anyway). tmux sets $TMUX to the socket it is using whenever it runs, so if $TMUX isn't set or is length 0, we know we aren't already running tmux.}}
 
  +
# グラフィカルセッションが実行中であることを確認する (tmux をログインシェル内で起動したい場合は'''この条件式を削除してください'''。ただし、[[Xinit#ログイン時に X を自動起動|ログイン時の X の自動起動]]と干渉するかもしれません)。
  +
# まだ tmux セッション内にいないことを確認する。
  +
# これらの条件を満たす場合、アタッチする。アタッチに失敗した場合、新しいセッションを起動する。
   
  +
[[#systemd で自動起動|systemd を使用してユーザとしてセッションを維持している]]場合、if ブロック内のコマンドを以下のコマンドで置き換えることができます。このコマンドは、維持されているセッションにアタッチし、その他の接続済みクライアントをデタッチします:
ログイン時にまずアタッチできないか試してみて tmux が実行されていない場合にのみセッションを作成したい場合、以下のスニペットを追加します:
 
 
{{bc|<nowiki>
 
# TMUX
 
if which tmux >/dev/null 2>&1; then
 
#if not inside a tmux session, and if no session is started, start a new session
 
test -z "$TMUX" && (tmux attach || tmux new-session)
 
fi
 
</nowiki>}}
 
   
  +
if ! systemctl --user is-active --quiet tmux.service; then
以下のスニペットは起動する前に tmux がインストールされているかどうかチェックします。また、ログアウト時に既存の tmux セッションに再アタッチすることで、同一のターミナルからすばやく全ての tmux セッションをシャットダウンできるようにしています。.
 
  +
systemctl --user start tmux.service
{{bc|<nowiki>
 
  +
fi
# TMUX
 
if which tmux >/dev/null 2>&1; then
+
exec tmux attach-session -d -t "${USER}" >/dev/null 2>&1
# if no session is started, start a new session
 
test -z ${TMUX} && tmux
 
 
# when quitting tmux, try to attach
 
while test -z ${TMUX}; do
 
tmux attach || break
 
done
 
fi
 
</nowiki>}}
 
 
既存のデタッチされたセッションにアタッチしたり新しいセッションを起動する場合:
 
 
{{bc|<nowiki>
 
if [[ -z "$TMUX" ]] ;then
 
ID="`tmux ls | grep -vm1 attached | cut -d: -f1`" # get the id of a deattached session
 
if [[ -z "$ID" ]] ;then # if not available create a new one
 
tmux new-session
 
else
 
tmux attach-session -t "$ID" # if available attach to it
 
fi
 
fi
 
</nowiki>}}
 
   
 
=== 非ログインシェルを起動する ===
 
=== 非ログインシェルを起動する ===
   
Tmux は [http://comments.gmane.org/gmane.comp.terminal-emulators.tmux.user/5997 デフォルト] で [http://unix.stackexchange.com/questions/38175 ログインシェル] を起動するようになっていますが、これは複数の副作用があります:
+
Tmux は [http://comments.gmane.org/gmane.comp.terminal-emulators.tmux.user/5997 デフォルト] で [https://unix.stackexchange.com/questions/38175 ログインシェル] を起動するようになっていますが、これは複数の副作用があります:
 
* [[fortune]] を使っている場合、新しいパネルを作成するたびに引用句が表示されることがあります。
 
* [[fortune]] を使っている場合、新しいパネルを作成するたびに引用句が表示されることがあります。
 
* 新しいパネルを作成するたびに {{ic|~/.profile}} などのログインシェルの設定ファイルが解釈されるため、セッションの初期化時に実行するようにしていたコマンド (例: オーディオレベルの設定) が実行されてしまいます。
 
* 新しいパネルを作成するたびに {{ic|~/.profile}} などのログインシェルの設定ファイルが解釈されるため、セッションの初期化時に実行するようにしていたコマンド (例: オーディオレベルの設定) が実行されてしまいます。
401行目: 340行目:
 
=== tmux のウィンドウをタブのように使う ===
 
=== tmux のウィンドウをタブのように使う ===
   
以下の設定を {{ic|~/.tmux.conf}} に追加することで tmux のウィンドウをタブのように使うことができます ([[rxvt-unicode/Tips and tricks#urxvtq とタブ|urxvt のタブ拡張]]を参照)。仮想タブはターミナルエミュレータから独立しているという利点があります。
+
以下の設定を {{ic|~/.tmux.conf}} に追加することで tmux のウィンドウをタブのように使うことができます ([[rxvt-unicode/ヒントとテクニック#urxvtq とタブ|urxvt のタブ拡張]]を参照)。仮想タブはターミナルエミュレータから独立しているという利点があります。
   
 
#urxvt tab like window switching (-n: no prior escape seq)
 
#urxvt tab like window switching (-n: no prior escape seq)
412行目: 351行目:
 
もちろん、ターミナルなど他のアプリケーションのホットキーと重複させてはいけません。そのような場合、ターミナルのタブ機能を無効化して置き換えるほうが良いでしょう。
 
もちろん、ターミナルなど他のアプリケーションのホットキーと重複させてはいけません。そのような場合、ターミナルのタブ機能を無効化して置き換えるほうが良いでしょう。
   
It can also come handy to supplement the EOT hotkey {{ic|Ctrl+d}} with one for tmux's detach:
+
tmux detach EOT ホットキー {{ic|Ctrl+d}} を補完するのも便利です:
   
 
bind-key -n C-j detach
 
bind-key -n C-j detach
421行目: 360行目:
   
 
: 複数のクライアントを一つのセッションにアタッチする際、Screen と tmux の挙動は少々異なっています。Screen では、各クライアントがセッションに接続され、セッションの中で別々のウィンドウが表示されます。tmux では、一つのセッションに接続された全てのクライアントが同じウィンドウを表示します。
 
: 複数のクライアントを一つのセッションにアタッチする際、Screen と tmux の挙動は少々異なっています。Screen では、各クライアントがセッションに接続され、セッションの中で別々のウィンドウが表示されます。tmux では、一つのセッションに接続された全てのクライアントが同じウィンドウを表示します。
  +
: この問題は tmux の中でセッションを2つ生成して2番目のセッションを1番目のセッションのウィンドウに同期してから、2番目の新しいセッションを1番目のセッションに指定することで解決します。
: This problem can be solved in tmux by spawning two separate sessions and synchronizing the second one to the windows of the first, then pointing a second new session to the first.
 
   
  +
以下の “{{Ic|tmx}}” スクリプトは上記を実装しています — 2番目のパラメータが “1” の場合は “{{Ic|tmux new-window}}” を実行するように修正を加えています。{{Ic|tmx <base session name> [1]}} として呼び出すことで必要に応じてベースセッションが起動します。それ以外の場合は新しい “client” セッションはベースに接続され、任意で新しいウィンドウを追加してアタッチします。“zombie” になったときは終了するように設定します。
The script “{{Ic|tmx}}” below implements this — the version here is slightly modified to execute “{{Ic|tmux new-window}}” if “1” is its second parameter. Invoked as {{Ic|tmx <base session name> [1]}} it launches the base session if necessary. Otherwise a new “client” session linked to the base, optionally add a new window and attach, setting it to kill itself once it turns “zombie”.
 
   
 
{{hc|tmx|2=<nowiki>
 
{{hc|tmx|2=<nowiki>
430行目: 369行目:
 
#
 
#
 
# Modified TMUX start script from:
 
# Modified TMUX start script from:
# http://forums.gentoo.org/viewtopic-t-836006-start-0.html
+
# https://forums.gentoo.org/viewtopic-t-836006-start-0.html
 
#
 
#
 
# Store it to `~/bin/tmx` and issue `chmod +x`.
 
# Store it to `~/bin/tmx` and issue `chmod +x`.
475行目: 414行目:
 
</nowiki>}}
 
</nowiki>}}
   
  +
{{ic|~/.tmux.conf}} に以下の設定を追加すると便利です:
A useful setting for this is
 
   
 
setw -g aggressive-resize on
 
setw -g aggressive-resize on
   
  +
セッション全体に接続されている一番小さいクライアントではなく、表示している一番小さいクライアントにあわせてウィンドウのサイズが変更されるようになります。
added to {{ic|~/.tmux.conf}}. It causes tmux to resize a window based on the smallest client actually viewing it, not on the smallest one attached to the entire session.
 
   
An alternative taken from [http://comments.gmane.org/gmane.comp.terminal-emulators.tmux.user/2632] is to put the following ~/.bashrc:
+
~/.bashrc に以下を追加する方法もあります [http://comments.gmane.org/gmane.comp.terminal-emulators.tmux.user/2632]:
   
 
{{hc|.bashrc|2=<nowiki>
 
{{hc|.bashrc|2=<nowiki>
495行目: 434行目:
 
</nowiki>}}
 
</nowiki>}}
   
  +
著者より:
Citing the author:
 
   
 
: "mksc foo" creates a always detached permanent client named "foo". It also calls "rsc foo" to create a client to newly created session. "rsc foo" creates a new client grouped by "foo" name. It has destroy-unattached turned on so when I leave it, it kills client.
 
: "mksc foo" creates a always detached permanent client named "foo". It also calls "rsc foo" to create a client to newly created session. "rsc foo" creates a new client grouped by "foo" name. It has destroy-unattached turned on so when I leave it, it kills client.
514行目: 453行目:
   
 
{{hc|1=~/.zshrc|2=
 
{{hc|1=~/.zshrc|2=
## workaround for handling TERM variable in multiple tmux sessions properly from http://sourceforge.net/p/tmux/mailman/message/32751663/ by Nicholas Marriott
+
## workaround for handling TERM variable in multiple tmux sessions properly from https://sourceforge.net/p/tmux/mailman/message/32751663/ by Nicholas Marriott
 
if [[ -n ${TMUX} && -n ${commands[tmux]} ]];then
 
if [[ -n ${TMUX} && -n ${commands[tmux]} ]];then
 
case $(tmux showenv TERM 2>/dev/null) in
 
case $(tmux showenv TERM 2>/dev/null) in
541行目: 480行目:
 
===既存のセッションに新しいセッションがアタッチされるたびにプログラムを実行するテンプレートスクリプト===
 
===既存のセッションに新しいセッションがアタッチされるたびにプログラムを実行するテンプレートスクリプト===
   
  +
以下のスクリプトはプログラムが以前に実行されたかどうかチェックします。見つからなかった場合、新しい tmux セッションを作成してからウィンドウにアタッチしてプログラムを実行します。プログラムが見つかった場合はセッションにアタッチしてウィンドウを選択だけします:
This script checks for a program presumed to have been started by a previous run of itself. Unless found it creates a new tmux session and attaches to a window named after and running the program. If however the program was found it merely attaches to the session and selects the window.
 
   
 
#!/bin/bash
 
#!/bin/bash
570行目: 509行目:
 
bind-key -n M-c kill-pane \; select-layout
 
bind-key -n M-c kill-pane \; select-layout
 
bind-key -n M-n split-window \; select-layout
 
bind-key -n M-n split-window \; select-layout
  +
  +
=== Vim の colorscheme がロードされない ===
  +
  +
vim の colorscheme が tmux に読み込まれていない場合は、以下を参照してください: [https://stackoverflow.com/a/47994805/1766555] [https://github.com/vim/vim/issues/993#issuecomment-255651605]
   
 
=== Vim フレンドリな設定 ===
 
=== Vim フレンドリな設定 ===
586行目: 529行目:
 
bind-key -T copy-mode-vi 'Space' send -X halfpage-down
 
bind-key -T copy-mode-vi 'Space' send -X halfpage-down
 
bind-key -T copy-mode-vi 'Bspace' send -X halfpage-up
 
bind-key -T copy-mode-vi 'Bspace' send -X halfpage-up
  +
  +
=== フレンドリーなペイン分割 ===
  +
  +
ペインを垂直方向に分割するためのデフォルトのキーバインドは {{ic|Ctrl}} + {{ic|b}}} {{ic|%}} であり、ペインを水平方向に分割するためのデフォルトのキーバインドは {{ic|Ctrl}} + {{ic|b}} {{ic|"}} キーボードのレイアウトによっては入力が難しく、覚えにくい場合もあります。
  +
  +
よりわかりやすいキーバインディングは、水平方向に分割する場合は {{ic|Ctrl}} + {{ic|b}} {{ic|h}} を使用し、ペインを垂直方向に分割する場合は {{ic|Ctrl}} + {{ic|b}} {{ic|v}} を使用することです。これは覚えておくと非常に便利です。
  +
  +
この変更を行うには、 {{ic|~/.tmux.conf}}に次の行を追加します。
  +
  +
=== システムの停止を禁止 ===
  +
  +
ホストがスリープ状態になると別のデバイスから接続したときに tmux がハングする場合は、セッションのシェルコマンドを禁止してロックします。
  +
  +
tmux new-session -A "systemd-inhibit --what=idle $SHELL"
  +
  +
== トラブルシューティング ==
  +
  +
=== スクロールの問題 ===
  +
ターミナルで Shift-Page Up/Down を使ってスクロールができない場合、以下の設定で {{ic|xterm}} から識別子が始まるターミナルで smcup と rmcup の機能を削除できます:
  +
  +
set -ga terminal-overrides ',xterm*:smcup@:rmcup@'
  +
  +
上記の設定を使うとターミナルエミュレータは tmux のことを [[pico]] や [[mutt]] と同じようなフルスクリーンのアプリケーションと認識するようになり [https://superuser.com/questions/310251/use-terminal-scrollbar-with-tmux]、スクロールバックが正しく記録されるようになります。ただし、ウィンドウやペインを切り替えたときに多少表示が崩れるかもしれません。Tmux のネイティブのスクロールバックを使うことを推奨します。
  +
  +
=== マウスのスクロール ===
  +
  +
{{Note|以下の設定はセレクションバッファのコピー・ペーストと干渉します。セレクションバッファからコピー・ペーストするときは shift キーを押してください。}}
  +
  +
マウスホイールでスクロールしたい場合、{{ic|.tmux.conf}} で mode-mouse をオンにして下さい:
  +
set -g mouse on
  +
  +
スクロール履歴を設定するには:
  +
set -g history-limit 30000
  +
  +
tmux 2.1 からは、マウスホイールでスクロールするには {{ic|~/.tmux.conf}} に以下のどちらかあるいは両方を追加してみてください:
  +
bind -T root WheelUpPane if-shell -F -t = "#{alternate_on}" "send-keys -M" "select-pane -t =; copy-mode -e; send-keys -M"
  +
bind -T root WheelDownPane if-shell -F -t = "#{alternate_on}" "send-keys -M" "select-pane -t =; send-keys -M"
  +
  +
上記の設定では一行ずつしかスクロールしませんが、以下を追加することでページ単位でスクロールすることができます:
  +
bind -t vi-copy WheelUpPane page-up
  +
bind -t vi-copy WheelDownPane page-down
  +
bind -t emacs-copy WheelUpPane page-up
  +
bind -t emacs-copy WheelDownPane page-down
  +
  +
=== UTF-8 のマウスイベントをターミナルエミュレータがサポートしていない ===
  +
  +
ターミナルエミュレータが UTF-8 のマウスイベントに対応していない場合、tmux の {{ic|mouse on}} オプションを設定しても、ターミナルウィンドウの中で左クリックすると {{ic|[M#}} や {{ic|[Ma}} などの文字列がプロンプトに貼り付けられてしまいます。
  +
  +
この問題を解決するには以下を設定:
  +
  +
set -g mouse-utf8 off
  +
  +
=== Shift+F6 が Midnight Commander で動作しない ===
  +
  +
[[Midnight Commander#ショートカットが機能しない]]を参照してください。
   
 
== 参照 ==
 
== 参照 ==
593行目: 591行目:
 
* [https://github.com/Lokaltog/powerline powerline] - tmux で使えるダイナミックステータスバー
 
* [https://github.com/Lokaltog/powerline powerline] - tmux で使えるダイナミックステータスバー
 
* [https://github.com/tmux-plugins tmux のプラグイン]
 
* [https://github.com/tmux-plugins tmux のプラグイン]
  +
* [https://github.com/gpakosz/.tmux Oh My Tmux!]
   
 
'''チュートリアル'''
 
'''チュートリアル'''

2023年10月29日 (日) 08:24時点における最新版

関連記事

tmux は「ターミナルマルチプレクサ: 一つのスクリーンから別々のプログラムが動作する多数のターミナル (またはウィンドウ) を作成・アクセス・制御することができます。tmux はスクリーンから分離させてバックグラウンドで動作させることができ、後でまた繋ぎ直すことができます。」です。

tmux は GNU Screen の代わりになるものとして ISC ライセンスで配布されています。似ているところもありますが、プログラムには様々な違いが存在します。tmux の FAQ ページ を見て下さい。

目次

インストール

tmux パッケージをインストールしてください。任意で tmux-bash-completion-gitAUR をインストールすることで tmux の bash 補完を使うことができます。

設定

デフォルトでは、tmux はユーザ毎の設定として ~/.tmux.conf を探します。しかし、~/.config/tmux/tmux.conf も使用可能です (このパスはハードコードされていて、$XDG_CONFIG_HOME は無視されます)。グローバルな設定ファイルは /etc/tmux.conf を使用できます。しかし、デフォルトでは Arch のパッケージはこのファイルを同梱していません。

キーバインド

デフォルトでは、コマンドのキーバインドには Ctrl-b が前に付きます。例えば、ウィンドウを縦に分割するには Ctrl-b+% を押します。

ウィンドウを複数のペインに分割した後、ペインのサイズを変更するには、プレフィックスキー (例: Ctrl-b) を押してから、Ctrl を押しながら、Left/Right/Up/Down を押します。ペイン間の移動も同じ方法で行い、矢印キーの代わりに o を使います。

キーバインドは tmux.conf の bind と unbind コマンドで変更することができます。例えばデフォルトのプレフィックスキーである Ctrl-bCtrl-a に変更するには設定ファイルに以下のコマンドを追加します:

unbind C-b
set -g prefix C-a
bind C-a send-prefix
ヒント: 特殊文字はクォートで囲ってプレフィックスとして使ってください。Ctrl の代わりに Alt (Meta) を使うこともできます。例: set -g prefix m-'\'

さらに、ウィンドウ間の移動をする方法には以下のものもあります:

Ctrl-b l (直前に選択されていたウィンドウに移動します)
Ctrl-b w (すべてのウィンドウ、及びウィンドウの番号の一覧を表示します)
Ctrl-b <ウィンドウの番号> (指定された番号のウィンドウに移動する。なお、デフォルトでは 0 - 9 の番号が割り当てられています)
Ctrl-b q  (ペインの番号を表示する。表示された番号を入力すると対応するペインに移動できます)

Tmux にはウィンドウを探す機能とそれへのキー割り当てがあり、多数のウィンドウを容易に行き来することができます:

Ctrl-b f <ウィンドウの名前> (名前でウィンドウを検索する)
Ctrl-b w (ウィンドウの一覧からウィンドウを選択する)

コピーモード

tmux ウィンドウには複数のモードが存在します。デフォルトのモードではウィンドウにアタッチされたターミナルに直接アクセスすることができ、もうひとつのモードはコピーモードです。コピーモードではバッファを移動することができ履歴をスクロールすることが可能です。vi または emacs スタイルのキーバインドが使えます。VISUAL や EDITOR に ‘vi’ が含まれていない場合、デフォルトでは emacs のキーバインドが使われます。

コピーモードに入るには以下を実行:

Ctrl-b [

デフォルトエディタと同じようにバッファを操作することができます。

コピーモードを終了するには、以下のキーバインドのどちらかを使います:

vi モード:

q

emacs モード:

Esc

URL のブラウズ

tmux の中で URL をブラウズするには urlviewAUR をインストールして設定する必要があります。

新しいターミナルの中で:

bind-key u capture-pane \; save-buffer /tmp/tmux-buffer \; run-shell "$TERMINAL -e urlview /tmp/tmux-buffer"

新しい tmux ウィンドウの中で (新しいターミナルは不要です):

bind-key u capture-pane \; save-buffer /tmp/tmux-buffer \; new-window -n "urlview" '$SHELL -c "urlview < /tmp/tmux-buffer"'

適切なターミナルの設定

256色

256色のターミナルを使っている場合、tmux で適切なターミナル (tmux または tmux-256color) を設定する必要があります。設定ファイルで以下のように設定できます:

tmux.conf
set -g default-terminal "tmux-256color"

また、tmux の表示がおかしくなってしまう場合、.bashrc に以下のエイリアスを追加することで tmux はターミナルが256色をサポートしていると仮定するようになります:

alias tmux="tmux -2"

24ビットカラー

Tmux はバージョン 2.2 から24ビットカラーをサポートしています [1] 使用しているターミナルが24ビットカラーをサポートしている場合 (gist を参照) ターミナルを terminal-overrides 設定に追加してください。例えば、Termite を使っているのであれば以下のように追加します:

set -ga terminal-overrides ",xterm-termite:Tc"

他のターミナルの場合、xterm-termite を適切なターミナルのタイプに置き換えてください ($TERM に保存されています)。Tc の terminfo 拡張について詳しくは tmux(1) ページを見てください。

xterm-keys

tmux.conf で xterm-keys を有効にするには、以下の行を追加してください:

set-option -g xterm-keys on

tmux.conf で xterm-keys を有効にしたら、新しいエスケープコードがアプリケーションから認識されるようにカスタム terminfo を作成して宣言する必要があります。tic で以下のコードをコンパイルして TERM に "xterm-screen-256color" を指定してください:

# A screen- based TERMINFO that declares the escape sequences
# enabled by the tmux config "set-window-option -g xterm-keys".
#
# Prefix the name with xterm- since some applications inspect
# the TERM *name* in addition to the terminal capabilities advertised.
xterm-screen-256color|GNU Screen with 256 colors bce and tmux xterm-keys,

# As of Nov'11, the below keys are picked up by
# .../tmux/blob/master/trunk/xterm-keys.c:
	kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H,
	kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~,
	kRIT=\E[1;2C,

# Change this to screen-256color if the terminal you run tmux in
# doesn't support bce:
	use=screen-256color-bce,

他の設定

スクロールバックバッファを10000行に設定:

set -g history-limit 10000

ターミナルエミュレータの設定を上書き:

set -ga terminal-overrides ',xterm*:smcup@:rmcup@'
set -ga terminal-override ',rxvt-uni*:XT:Ms=\E]52;%p1%s;%p2%s\007'

マウスを切り替える:

bind-key m set-option -g mouse on \; display 'Mouse: ON'
bind-key M set-option -g mouse off \; display 'Mouse: OFF'

systemd で自動起動

起動時に tmux サーバーを立ち上げることには複数の利点が存在します。特に、新しい tmux セッションを起動する場合、既にサービスが動作していれば起動時間が短縮されます。

さらに、tmux セッションのカスタマイズは維持され、たとえログインしなくても tmux セッションを永続化することができます (tmux の設定をスクリプトで管理している場合やユーザーの tmux セッションを共有する場合などに有用です)

以下のサービスは特定のユーザーで tmux を起動します (tmux@username.service で起動と同じ):

/etc/systemd/system/tmux@.service
[Unit]
Description=Start tmux in detached session

[Service]
Type=forking
User=%I
ExecStart=/usr/bin/tmux new-session -s %u -d
ExecStop=/usr/bin/tmux kill-session -t %u

[Install]
WantedBy=multi-user.target
ヒント: WorkingDirectory=custom_path を追加して、作業ディレクトリをカスタマイズできます。 ~ に設定すると、User= で指定されたユーザーのホームディレクトリが使用されます。

または、(User=%I を使わずに) 上記のファイルを systemd/ユーザーディレクトリに配置することもできます、例: ~/.config/systemd/user/tmux.service この方法だと ユーザーインスタンスの自動起動 を有効にしていない場合、ログイン時に tmux サービスが起動します。

セッションの開始

~/.tmux.conf に以下のように記述することでウィンドウがプリロードされた状態で tmux でセッションを開くことができます:

new  -n WindowName Command
neww -n WindowName Command
neww -n WindowName Command

ウィンドウが分割された状態でセッションを起動するには (マルチペイン)、分割したい neww の下に splitw コマンドを追加してください:

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 という名前で縦に半分に分割されます (50%)。bar の上で foo が実行されます。フォーカスはウィンドウ 2 (foo/bar) のトップペイン (foo) になります。

ノート: .conf で base-index を 1 に指定しないかぎり、セッション・ウィンドウ・ペインの番号は 0 から割り振られます。

複数のセッションを管理したい場合、設定ファイルから別のセッションファイルを読み込んでください:

# initialize sessions
bind F source-file ~/.tmux/foo
bind B source-file ~/.tmux/bar

X クリップボードの統合

ヒント: tmux のプラグイン tmux-yank は同じような機能を提供します。

tmux のセレクションを X クリップボード (や X プライマリ/セカンダリセレクション) にコピーしたり、その逆ができます。以下の tmux 設定ファイルのスニペットは xsel プログラムを使って X クリップボード/セレクションと tmux のセレクションを効果的に統合します:

# Emacs style
bind-key -T copy-mode y send-keys -X copy-pipe-and-cancel "xsel -i -p && xsel -o -p | xsel -i -b"
bind-key C-y run "xsel -o | tmux load-buffer - ; tmux paste-buffer"
# Vim style
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xsel -i -p && xsel -o -p | xsel -i -b"
bind-key p run "xsel -o | tmux load-buffer - ; tmux paste-buffer"

xclip を使うことも可能です。xsel と違って現在のロケールに適合しない生のビットストリームの出力も上手く処理されます。ただし、tmux のバッファを読み込んだ後に xclip は標準出力を閉じないため、xclip ではなく xsel を使う方が簡単です。xclip では tmux からコピー作業の完了を知ることができないため、xclip が終了するまで待機することになり、tmux が反応しなくなってしまいます。以下のように xclipSTDOUT/dev/null にリダイレクトすれば解決します:

# Vim style
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -i -sel clip > /dev/null"
bind-key p run "xclip -o -sel clip | tmux load-buffer - ; tmux paste-buffer"

Urxvt の中クリック

ノート: 以下の設定を使うにはマウスのサポートを有効にする必要があります。

中マウスのクリックによって tmux で urxvt のコピーアンドペーストを有効にする非公式の perl 拡張が存在します (公式の FAQ に記載があります [2])。

まず、perl スクリプトをダウンロードして urxvts の perl ライブラリに配置してください:

wget http://anti.teamidiot.de/static/nei/*/Code/urxvt/osc-xterm-clipboard
mv osc-xterm-clipboard /usr/lib/urxvt/perl/

また、.Xdefaults で perl スクリプトを有効にする必要があります:

~/.Xdefaults
...
*URxvt.perl-ext-common:		osc-xterm-clipboard
...

次に、tmux に新しい関数を指定してマウスのサポートを有効にします:

~/.tmux.conf
...
set-option -ga terminal-override ',rxvt-uni*:XT:Ms=\E]52;%p1%s;%p2%s\007'
set -g mouse on
...

新しい中クリック機能を試すには全ての tmux インスタンスを終了してください。

tmux の中では Shift+中マウスクリックを使うことでクリップボードのセレクションが貼り付けられます。中マウスのクリックだけの場合、tmux のバッファが貼り付けられます。

ヒントとテクニック

デフォルトのセッションレイアウトで tmux を起動

tmuxinator や tmuxp などのセッションマネージャを使うことで共通のセッション設定を簡単に管理できます。

tmuxinator の場合、tmuxinatorAUR パッケージをインストールします。次のコマンドでインストールをテストできます:

tmuxinator doctor

デフォルトのレイアウト値を取得

Tmux を通常通りに起動してウィンドウとペインのレイアウトを好きなように設定してください。設定が完了したら、以下のコマンドを実行することで現在のレイアウト値を取得できます (Tmux セッションの中から実行してください):

tmux list-windows

3つのペインと2つのペインの2つのウィンドウからなるレイアウトの場合、出力は以下のようになります:

0: default* (3 panes) [274x83] [layout 20a0,274x83,0,0{137x83,0,0,3,136x83,138,0[136x41,138,0,5,136x41,138,42,6]}] @2 (active)
1: remote- (2 panes) [274x83] [layout e3d3,274x83,0,0[274x41,0,0,4,274x41,0,42,7]] @3                                         

コピーする必要があるのは [layout... の後から ... ] @2 (active) を除いた部分です。1番目のウィンドウレイアウトであれば 20a0,274x83,0,0{137x83,0,0,3,136x83,138,0[136x41,138,0,5,136x41,138,42,6]} をコピーします。

デフォルトの tmux レイアウトを定義する

レイアウト値がわかったら現在の tmux セッションを終了してください。その後、Tmuxinator の設定ファイルを編集して Tmux のデフォルトセッションレイアウトを作成します (以下の例をそのままコピーするのではなく、上のセクションで確認したレイアウト値を使ってください):

~/.tmuxinator/default.yml
name: default
root: ~/
windows:
  - default:
      layout: 20a0,274x83,0,0{137x83,0,0,3,136x83,138,0[136x41,138,0,5,136x41,138,42,6]}
      panes:
        - clear
        - vim
        - clear && emacs -nw
  - remote:
      layout: 24ab,274x83,0,0{137x83,0,0,3,136x83,138,0,4}
      panes:
        - 
        - 

例では2つのウィンドウを "default" と "remote" として定義しています。適当なレイアウト値を決めてください。各ペインに対して最低でも1行は - を使う必要があります。1番目のウィンドウペインでは、1番目のペインでコマンドライン "clear" を、2番目のペインで "vim" を、3番目のペインで "clear && emacs -nw" を実行します。2番目のウィンドウレイアウトには何も起動コマンドを定義していません。

新しいデフォルトレイアウトをテストするには:

mux default

デフォルトの tmux レイアウトで tmux を自動起動

デフォルトの Tmux セッションレイアウトでターミナルセッションを起動したい場合、以下を編集してください:

~/.bashrc
 if [ -z "$TMUX" ]; then
   mux default          
 fi                     

デフォルトセッションの代替アプローチ

上記の方法を使用する代わりに、実行時にデフォルトのセッションを作成してそれにアタッチする bash スクリプトを作成します。 次に、端末から実行して、その端末で事前に設計された構成を取得できます。

#!/bin/bash
tmux new-session -d -n WindowName Command
tmux new-window -n NewWindowName
tmux split-window -v
tmux selectp -t 1
tmux split-window -h
tmux selectw -t 1
tmux -2 attach-session -d

urxvt で tmux を起動

以下のコマンドで urxvt を起動することで tmux セッションも起動します。.ratpoisonrc ファイルの exec コマンドなどから使うことができます。

urxvt -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"

すべてのシェルのログイン時に tmux を起動

if [ -x "$(command -v tmux)" ] && [ -n "${DISPLAY}" ] && [ -z "${TMUX}" ]; then
    tmux attach || tmux >/dev/null 2>&1
fi

上記のスニペットは以下のことを行います:

  1. tmux が実行可能であることを確認する。
  2. グラフィカルセッションが実行中であることを確認する (tmux をログインシェル内で起動したい場合はこの条件式を削除してください。ただし、ログイン時の X の自動起動と干渉するかもしれません)。
  3. まだ tmux セッション内にいないことを確認する。
  4. これらの条件を満たす場合、アタッチする。アタッチに失敗した場合、新しいセッションを起動する。

systemd を使用してユーザとしてセッションを維持している場合、if ブロック内のコマンドを以下のコマンドで置き換えることができます。このコマンドは、維持されているセッションにアタッチし、その他の接続済みクライアントをデタッチします:

if ! systemctl --user is-active --quiet tmux.service; then
    systemctl --user start tmux.service
fi
exec tmux attach-session -d -t "${USER}" >/dev/null 2>&1

非ログインシェルを起動する

Tmux は デフォルトログインシェル を起動するようになっていますが、これは複数の副作用があります:

  • fortune を使っている場合、新しいパネルを作成するたびに引用句が表示されることがあります。
  • 新しいパネルを作成するたびに ~/.profile などのログインシェルの設定ファイルが解釈されるため、セッションの初期化時に実行するようにしていたコマンド (例: オーディオレベルの設定) が実行されてしまいます。

この挙動を無効化するには、以下を ~/.tmux.conf に追加してください:

set -g default-command "${SHELL}"

tmux のウィンドウをタブのように使う

以下の設定を ~/.tmux.conf に追加することで tmux のウィンドウをタブのように使うことができます (urxvt のタブ拡張を参照)。仮想タブはターミナルエミュレータから独立しているという利点があります。

#urxvt tab like window switching (-n: no prior escape seq)
bind -n S-down new-window
bind -n S-left prev
bind -n S-right next
bind -n C-left swap-window -t -1
bind -n C-right swap-window -t +1

もちろん、ターミナルなど他のアプリケーションのホットキーと重複させてはいけません。そのような場合、ターミナルのタブ機能を無効化して置き換えるほうが良いでしょう。

tmux の detach で EOT ホットキー Ctrl+d を補完するのも便利です:

bind-key -n C-j detach

様々なウィンドウのセッションを同時に操作するクライアント

Practical Tmux で、Brandur Leach は以下のように書いています:

複数のクライアントを一つのセッションにアタッチする際、Screen と tmux の挙動は少々異なっています。Screen では、各クライアントがセッションに接続され、セッションの中で別々のウィンドウが表示されます。tmux では、一つのセッションに接続された全てのクライアントが同じウィンドウを表示します。
この問題は tmux の中でセッションを2つ生成して2番目のセッションを1番目のセッションのウィンドウに同期してから、2番目の新しいセッションを1番目のセッションに指定することで解決します。

以下の “tmx” スクリプトは上記を実装しています — 2番目のパラメータが “1” の場合は “tmux new-window” を実行するように修正を加えています。tmx <base session name> [1] として呼び出すことで必要に応じてベースセッションが起動します。それ以外の場合は新しい “client” セッションはベースに接続され、任意で新しいウィンドウを追加してアタッチします。“zombie” になったときは終了するように設定します。

tmx
#!/bin/bash

#
# Modified TMUX start script from:
#     https://forums.gentoo.org/viewtopic-t-836006-start-0.html
#
# Store it to `~/bin/tmx` and issue `chmod +x`.
#

# Works because bash automatically trims by assigning to variables and by 
# passing arguments
trim() { echo $1; }

if [[ -z "$1" ]]; then
    echo "Specify session name as the first argument"
    exit
fi

# Only because I often issue `ls` to this script by accident
if [[ "$1" == "ls" ]]; then
    tmux ls
    exit
fi

base_session="$1"
# This actually works without the trim() on all systems except OSX
tmux_nb=$(trim `tmux ls | grep "^$base_session" | wc -l`)
if [[ "$tmux_nb" == "0" ]]; then
    echo "Launching tmux base session $base_session ..."
    tmux new-session -s $base_session
else
    # Make sure we are not already in a tmux session
    if [[ -z "$TMUX" ]]; then
        echo "Launching copy of base session $base_session ..."
        # Session id is date and time to prevent conflict
        session_id=`date +%Y%m%d%H%M%S`
        # Create a new session (without attaching it) and link to base session 
        # to share windows
        tmux new-session -d -t $base_session -s $session_id
        if [[ "$2" == "1" ]]; then
		# Create a new window in that session
		tmux new-window
	fi
        # Attach to the new session & kill it once orphaned
	tmux attach-session -t $session_id \; set-option destroy-unattached
    fi
fi

~/.tmux.conf に以下の設定を追加すると便利です:

setw -g aggressive-resize on

セッション全体に接続されている一番小さいクライアントではなく、表示している一番小さいクライアントにあわせてウィンドウのサイズが変更されるようになります。

~/.bashrc に以下を追加する方法もあります [3]:

.bashrc
function rsc() {
  CLIENTID=$1.`date +%S`
  tmux new-session -d -t $1 -s $CLIENTID \; set-option destroy-unattached \; attach-session -t $CLIENTID
}

function mksc() {
  tmux new-session -d -s $1
  rsc $1
}

著者より:

"mksc foo" creates a always detached permanent client named "foo". It also calls "rsc foo" to create a client to newly created session. "rsc foo" creates a new client grouped by "foo" name. It has destroy-unattached turned on so when I leave it, it kills client.
Therefore, when my computer looses network connectivity, all "foo.something" clients are killed while "foo" remains. I can then call "rsc foo" to continue work from where I stopped.

ターミナルタイプにあわせて TERM 変数を修正する

tmux で TERM 変数を固定で設定する代わりに、ターミナルエミュレータのタイプにあわせて適切な TERM (screen または screen-256color) を設定することができます:

~/.tmux.conf
## set the default TERM
set -g default-terminal screen

## update the TERM variable of terminal emulator when creating a new session or attaching a existing session
set -g update-environment 'DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY TERM'
## determine if we should enable 256-colour support
if "[[ ${TERM} =~ 256color || ${TERM} == fbterm ]]" 'set -g default-terminal screen-256color'
~/.zshrc
## workaround for handling TERM variable in multiple tmux sessions properly from https://sourceforge.net/p/tmux/mailman/message/32751663/ by Nicholas Marriott
if [[ -n ${TMUX} && -n ${commands[tmux]} ]];then
        case $(tmux showenv TERM 2>/dev/null) in
                *256color) ;&
                TERM=fbterm)
                        TERM=screen-256color ;;
                *)
                        TERM=screen
        esac
fi

tmux を再起動せずに変更した設定を適用する

デフォルトでは tmux は起動時にしか ~/.tmux.conf を読み込みません。起動した後に設定ファイルを tmux に読み込ませるには、次を実行:

tmux source-file <path>

~/.tmux.conf に以下のように追加することもできます:

bind r source-file <path>

^: を実行してから以下を入力する方法もあります:

source .tmux.conf

既存のセッションに新しいセッションがアタッチされるたびにプログラムを実行するテンプレートスクリプト

以下のスクリプトはプログラムが以前に実行されたかどうかチェックします。見つからなかった場合、新しい tmux セッションを作成してからウィンドウにアタッチしてプログラムを実行します。プログラムが見つかった場合はセッションにアタッチしてウィンドウを選択だけします:

#!/bin/bash

PID=$(pidof $1)

if [ -z "$PID" ]; then
    tmux new-session -d -s main ;
    tmux new-window -t main -n $1 "$*" ;
fi
    tmux attach-session -d -t main ;
    tmux select-window -t $1 ;
exit 0

nicklist プラグインを使って irssi を実行する派生版は irssi の ArchWiki ページにあります。

ターミナルエミュレータのウィンドウタイトル

tmux ウィンドウで SSH 接続を行うと、ターミナルエミュレータのウィンドウタイトルが user@localhost のままで user@server にならないことに気づくかもしれません。タイトルバーを接続先のホストにあわせて変えられるようにするには、~/.tmux.conf に以下を設定します:

set -g set-titles on
set -g set-titles-string "#T"

set-titles-string#Tuser@host:~ を表示して、接続したホストによって表示が変わります。

自動レイアウト

新しい分割を作成したり古い分割を解除する際に、現在選択されているレイアウトは適用されません。修正するには、以下のバインドを追加することで新しい、あるいは既存のペインに現在選択中のレイアウトが適用されるようになります:

bind-key -n M-c kill-pane \; select-layout
bind-key -n M-n split-window \; select-layout

Vim の colorscheme がロードされない

vim の colorscheme が tmux に読み込まれていない場合は、以下を参照してください: [4] [5]

Vim フレンドリな設定

vim ユーザーに使いやすい設定は [6] を見て下さい。

tmux 2.4 では、以下の部分を:

bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection
bind -t vi-copy 'Space' halfpage-down
bind -t vi-copy 'Bspace' halfpage-up

以下のように変更してください:

bind-key -T copy-mode-vi 'v' send -X begin-selection
bind-key -T copy-mode-vi 'y' send -X copy-selection
bind-key -T copy-mode-vi 'Space' send -X halfpage-down
bind-key -T copy-mode-vi 'Bspace' send -X halfpage-up

フレンドリーなペイン分割

ペインを垂直方向に分割するためのデフォルトのキーバインドは Ctrl + b} % であり、ペインを水平方向に分割するためのデフォルトのキーバインドは Ctrl + b " キーボードのレイアウトによっては入力が難しく、覚えにくい場合もあります。

よりわかりやすいキーバインディングは、水平方向に分割する場合は Ctrl + b h を使用し、ペインを垂直方向に分割する場合は Ctrl + b v を使用することです。これは覚えておくと非常に便利です。

この変更を行うには、 ~/.tmux.confに次の行を追加します。

システムの停止を禁止

ホストがスリープ状態になると別のデバイスから接続したときに tmux がハングする場合は、セッションのシェルコマンドを禁止してロックします。

tmux new-session -A "systemd-inhibit --what=idle $SHELL"

トラブルシューティング

スクロールの問題

ターミナルで Shift-Page Up/Down を使ってスクロールができない場合、以下の設定で xterm から識別子が始まるターミナルで smcup と rmcup の機能を削除できます:

set -ga terminal-overrides ',xterm*:smcup@:rmcup@'

上記の設定を使うとターミナルエミュレータは tmux のことを picomutt と同じようなフルスクリーンのアプリケーションと認識するようになり [7]、スクロールバックが正しく記録されるようになります。ただし、ウィンドウやペインを切り替えたときに多少表示が崩れるかもしれません。Tmux のネイティブのスクロールバックを使うことを推奨します。

マウスのスクロール

ノート: 以下の設定はセレクションバッファのコピー・ペーストと干渉します。セレクションバッファからコピー・ペーストするときは shift キーを押してください。

マウスホイールでスクロールしたい場合、.tmux.conf で mode-mouse をオンにして下さい:

set -g mouse on

スクロール履歴を設定するには:

set -g history-limit 30000

tmux 2.1 からは、マウスホイールでスクロールするには ~/.tmux.conf に以下のどちらかあるいは両方を追加してみてください:

bind -T root WheelUpPane   if-shell -F -t = "#{alternate_on}" "send-keys -M" "select-pane -t =; copy-mode -e; send-keys -M"
bind -T root WheelDownPane if-shell -F -t = "#{alternate_on}" "send-keys -M" "select-pane -t =; send-keys -M"

上記の設定では一行ずつしかスクロールしませんが、以下を追加することでページ単位でスクロールすることができます:

bind -t vi-copy    WheelUpPane   page-up
bind -t vi-copy    WheelDownPane page-down
bind -t emacs-copy WheelUpPane   page-up
bind -t emacs-copy WheelDownPane page-down

UTF-8 のマウスイベントをターミナルエミュレータがサポートしていない

ターミナルエミュレータが UTF-8 のマウスイベントに対応していない場合、tmux の mouse on オプションを設定しても、ターミナルウィンドウの中で左クリックすると [M#[Ma などの文字列がプロンプトに貼り付けられてしまいます。

この問題を解決するには以下を設定:

set -g mouse-utf8 off

Shift+F6 が Midnight Commander で動作しない

Midnight Commander#ショートカットが機能しないを参照してください。

参照

チュートリアル