「Tmux」の版間の差分
Kusakata.bot (トーク | 投稿記録) 細 (文字列「Tips and tricks」を「ヒントとテクニック」に置換) |
(→256色: 同期) |
||
(6人の利用者による、間の25版が非表示) | |||
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/ |
+ | [http://tmux.github.io/ tmux] は「ターミナルマルチプレクサ: 一つのスクリーンから別々のプログラムが動作する多数のターミナル (またはウィンドウ) を作成・アクセス・制御することができます。tmux はスクリーンから分離させてバックグラウンドで動作させることができ、後でまた繋ぎ直すことができます。」です。 |
− | + | tmux は [[GNU Screen]] の代わりになるものとして ISC ライセンスで配布されています。似ているところもありますが、プログラムには様々な違いが存在します。[https://github.com/tmux/tmux/wiki/FAQ tmux の FAQ ページ] を見て下さい。 |
|
== インストール == |
== インストール == |
||
− | + | {{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'' などに設定する場合もあります: |
||
− | + | {{hc|tmux.conf|set -g default-terminal "tmux-256color"}} |
|
− | また、 |
+ | また、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 拡張について詳しくは |
+ | 他のターミナルの場合、{{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'' を起動します ({{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}} |
+ | または、({{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- |
+ | 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 拡張が存在します (公式の [ |
+ | 中マウスのクリックによって 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 ライブラリに配置してください: |
||
284行目: | 239行目: | ||
tmuxinator や [[tmuxp]] などのセッションマネージャを使うことで共通のセッション設定を簡単に管理できます。 |
tmuxinator や [[tmuxp]] などのセッションマネージャを使うことで共通のセッション設定を簡単に管理できます。 |
||
− | 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 |
||
− | + | 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 デフォルト] で [ |
+ | Tmux は [http://comments.gmane.org/gmane.comp.terminal-emulators.tmux.user/5997 デフォルト] で [https://unix.stackexchange.com/questions/38175 ログインシェル] を起動するようになっていますが、これは複数の副作用があります: |
* [[fortune]] を使っている場合、新しいパネルを作成するたびに引用句が表示されることがあります。 |
* [[fortune]] を使っている場合、新しいパネルを作成するたびに引用句が表示されることがあります。 |
||
* 新しいパネルを作成するたびに {{ic|~/.profile}} などのログインシェルの設定ファイルが解釈されるため、セッションの初期化時に実行するようにしていたコマンド (例: オーディオレベルの設定) が実行されてしまいます。 |
* 新しいパネルを作成するたびに {{ic|~/.profile}} などのログインシェルの設定ファイルが解釈されるため、セッションの初期化時に実行するようにしていたコマンド (例: オーディオレベルの設定) が実行されてしまいます。 |
||
412行目: | 351行目: | ||
もちろん、ターミナルなど他のアプリケーションのホットキーと重複させてはいけません。そのような場合、ターミナルのタブ機能を無効化して置き換えるほうが良いでしょう。 |
もちろん、ターミナルなど他のアプリケーションのホットキーと重複させてはいけません。そのような場合、ターミナルのタブ機能を無効化して置き換えるほうが良いでしょう。 |
||
− | + | 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: |
||
− | # |
+ | # 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. |
||
− | + | ~/.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 |
+ | ## 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 ページ を見て下さい。
目次
- 1 インストール
- 2 設定
- 3 セッションの開始
- 4 X クリップボードの統合
- 5 ヒントとテクニック
- 5.1 デフォルトのセッションレイアウトで tmux を起動
- 5.2 urxvt で tmux を起動
- 5.3 すべてのシェルのログイン時に tmux を起動
- 5.4 非ログインシェルを起動する
- 5.5 tmux のウィンドウをタブのように使う
- 5.6 様々なウィンドウのセッションを同時に操作するクライアント
- 5.7 ターミナルタイプにあわせて TERM 変数を修正する
- 5.8 tmux を再起動せずに変更した設定を適用する
- 5.9 既存のセッションに新しいセッションがアタッチされるたびにプログラムを実行するテンプレートスクリプト
- 5.10 ターミナルエミュレータのウィンドウタイトル
- 5.11 自動レイアウト
- 5.12 Vim の colorscheme がロードされない
- 5.13 Vim フレンドリな設定
- 5.14 フレンドリーなペイン分割
- 5.15 システムの停止を禁止
- 6 トラブルシューティング
- 7 参照
インストール
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-b
を Ctrl-a
に変更するには設定ファイルに以下のコマンドを追加します:
unbind C-b set -g prefix C-a bind C-a send-prefix
さらに、ウィンドウ間の移動をする方法には以下のものもあります:
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
または、(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) になります。
複数のセッションを管理したい場合、設定ファイルから別のセッションファイルを読み込んでください:
# initialize sessions bind F source-file ~/.tmux/foo bind B source-file ~/.tmux/bar
X クリップボードの統合
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 が反応しなくなってしまいます。以下のように xclip
の STDOUT
を /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
上記のスニペットは以下のことを行います:
- tmux が実行可能であることを確認する。
- グラフィカルセッションが実行中であることを確認する (tmux をログインシェル内で起動したい場合はこの条件式を削除してください。ただし、ログイン時の X の自動起動と干渉するかもしれません)。
- まだ tmux セッション内にいないことを確認する。
- これらの条件を満たす場合、アタッチする。アタッチに失敗した場合、新しいセッションを起動する。
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
の #T
は user@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 フレンドリな設定
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 のことを pico や mutt と同じようなフルスクリーンのアプリケーションと認識するようになり [7]、スクロールバックが正しく記録されるようになります。ただし、ウィンドウやペインを切り替えたときに多少表示が崩れるかもしれません。Tmux のネイティブのスクロールバックを使うことを推奨します。
マウスのスクロール
マウスホイールでスクロールしたい場合、.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#ショートカットが機能しないを参照してください。
参照
- フォーラムスレッド
- Screen と tmux の機能比較
- powerline - tmux で使えるダイナミックステータスバー
- tmux のプラグイン
- Oh My Tmux!
チュートリアル
- Practical Tmux
- man ページ (OpenBSD)
- Tmux チュートリアル Part 1 と Part 2
- The Tao of tmux - tmuxp と libtmux を開発した Tony Narlock による電子書籍