tmuxのススメ!! conf設定@2020

2020年12月31日

この記事を読むと得られる情報

下記特徴を持つ、便利で視認性の高いTmux環境の構築方法

  • 見た目の特徴
    • 非アクティブのペインが若干白っぽくなる(アクティブペインが見やすい)
    • ステータスバーに欲しい情報を乗せることが出来る
  • 機能的特徴
    • マウスが使える
    • クリップボードとの連携(プラグインは不要)
    • ペインの移動がprefix不要でスムーズに
    • ペインの並列実行の有無をトグルで行う
tmuxの完成予想図
tmuxの完成図

快適なコンソール生活を送りたい!

コンソールを使わなければならないなら、せっかくなら快適でカッコイイコンソールを使いたい!!
そう思ってひたすらカスタムした今までの系譜を記したいと思います。
みなさんのより良いコンソールライフの足しになればと思います。

その前に

🤔「そもそもtmuxってなに?」
🤨「何が便利なの?」

という人向けに簡単に説明しますと

  • どんなコンソールアプリやサーバー画面でもインストールさえすれば仮想ターミナルが使えるソフト
  • 殺風景なコンソール画面を自分好みにカスタマイズ可能
  • コンソールの状態を保存可能

のようなスーパー便利ツールです!

😰「MacにあるiTerm2でよくない?」

というお声もあるかと思いますが、とにかくインストールさえすればどんな環境でも使えるという冪等性が魅力的です。
インストールさえ、といいますがインストール権限さえあればLinuxもMacもWSLにもインストール可能なので実質どこでも使えます!

さて実践

環境

  • Mac(Mojabe)
    • tmux 2.9a
    • iTerm2(デフォルトのコンソールでもOK)
      • クリップボードとの連携をするため(赤い部分にチェックをつける)
iterm2設定画面
iterm2設定画面
  • Ubuntu(18.04) in WSL
  • win32yank.exeを導入してクリップボードと連携する
    • win32yankはクリップボードと連携するツール
    • 上記URLからダウンロード&解凍後Windows側でパスの通ったディレクトリに配置

confの内容

以下の内容をホームディレクトリ.tmux.confという名前で保存してください。

# 基本設定
## 256色端末を使用する
set -g default-terminal "screen-256color"
set -g terminal-overrides 'xterm:colors=256'
## Escキーの遅延を解消
set -s escape-time 0
## status line を更新する間隔を1秒にする
set-option -g status-interval 1
## ウィンドウのインデックスを1から始める
set -g base-index 1
## ペインのインデックスを1から始める
setw -g pane-base-index 1
## アクティブなペインのみ白っぽく変更(真っ黒は232)
set -g window-style 'bg=colour234'
set -g window-active-style 'bg=colour232'
# キーの割り当て変更
## prefixキーの割り当て(Ctr+a)
set -g prefix C-a
## prefix + -で水平分割
bind - split-window -v
## prefix + |で垂直分割
bind | split-window -h
## ペインの移動をprefixなしで行う(Shift + 矢印キー)
bind -n S-left select-pane -L
bind -n S-down select-pane -D
bind -n S-up select-pane -U
bind -n S-right select-pane -R
## ペインの順次移動をCtr + o に設定
bind -n C-o select-pane -t :.+
## 並列実行のトグル化
bind e setw synchronize-panes ; display "synchronize-panes #{?pane_synchronized,on,off}"
# status lineの設定
## window-status を中央揃えで配置する
set-option -g status-justify "centre"
## status line の背景色を指定する。
set-option -g status-bg "colour238"
## status line の文字色を指定する。
set-option -g status-fg "colour255"
## status-left の最大の長さを指定する。
set-option -g status-left-length 10
## status-left のフォーマットを指定する。
set-option -g status-left "#[fg=colour255,bg=colour241]Session: #S #[default]"
## window-status のフォーマットを指定する。
set-window-option -g window-status-format " #I: #W "
## カレントウィンドウの window-status のフォーマットを指定する
set-window-option -g window-status-current-format "#[fg=colour255,bg=colour27,bold] #I: #W #[default]"
## status-right の最大の長さを指定する。
set-option -g status-right-length 120
## status line をトップに表示
set-option -g status-position top
# メモリの量、音量、時刻、Wi-FiのSSIDと強度を表示
set-option -g status-right "Vol.#(sh get_volume_tmux) #(sh get_ssid_tmux) FRAM:#(top -l 1 -s 5 | grep PhysMem | cut -d ' ' -f 6)B | %x(%a)%T #[default]"
# 操作系
## マウス操作を有効化
set -g mouse on
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
bind -n WheelDownPane select-pane -t= ; send-keys -M
## コマンドモードでの選択方法をvim風に変更
set-window-option -g mode-keys vi
setw -g mode-keys vi
bind-key -T copy-mode-vi v send -X begin-selection
## ☆クリップボートとの連携(Mac)
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"
## ☆クリップボートとの連携(WLS)
bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel "win32yank.exe -i"
unbind -T copy-mode-vi Enter
bind-key -T copy-mode-vi Enter send -X copy-pipe-and-cancel "win32yank.exe -i"
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "win32yank.exe -i"
unbind-key -T prefix v
bind-key v run "win32yank.exe -o | tmux load-buffer - && tmux paste-buffer"

最後の☆2つの箇所はOSによって書き分けてください。

解説

基本設定

これらは見た目の問題なので拘る必要はないです。
今回は割とシンプルに基本的なものしか入れてませんが個性が出るところなのでこだわりたい人はここでもりもりしてください。
基本的にはコメントのとおりです。

キーの割り当て

  • tmuxの操作はprefixキーのあとに打ち込んだキーで決まってます
  • デフォルトのprefixは個人的には使いにくいのでControl + aに変えてます
  • ペインの切り替えはより直感的に"prefix + -“で水平分割、“prefix + |"で垂直分割
  • ペインの移動はシフトキー + 矢印キーで動けます
    • bind -nはprefix不要、という意味です。他でも使えますのでお好みで設定してください。
    • 別途 Control + oで順次移動もできます。
  • “prefix + e"で同時実行のオンオフにできます。
    • オンオフの様子は最初のGIFで確認してみてください
    • 一斉に日付が表示されているのがわかるかと思います

ステータスラインの設定

今回ステータスラインを上に表示してますが、そこの設定を書いてます。
基本的にはコメントのとおりですが、最後の行でtopやら別のスクリプトを叩いてその情報を表示してます。
スクリプト実行出来るので何でも表示できます。今回は私が使ってるスクリプトも公開します。
(Macの動作しか保証できません)

ボリュームレベルの表示

#!/bin/sh
if sound_info=$(osascript -e 'get volume settings') ; then
  if [ "$(echo $sound_info | awk '{print $8}')" = "muted:false" ]; then
    sound_volume=$(expr $(echo $sound_info | awk '{print $2}' | sed "s/[^0-9]//g") / 6 )
    str=""
    for ((i=0; i < $sound_volume; i++ )); do
      str="${str}="
    done
    for ((i=$sound_volume; i < 16; i++ )); do
      str="${str} "
    done
    sound="#[bold][$str]#[default] "
  else
    sound="#[bold][      mute      ]#[default] "
  fi
  echo $sound
fi

Wi-Fiの電波レベルの表示

#!/bin/sh
airport_path="/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport"
if air_info=($(eval "$airport_path" -I | grep -E "^ *(agrCtlRSSI|state|SSID):" | awk '{print $2}')) ; then
  rssi=${air_info[0]}
  state=${air_info[1]}
  ssid=${air_info[2]}
  case "$state" in
    "running" )
      signals=(▁ ▂ ▄ ▆ █)
      signal=""
      rssi_=$(expr 5 - ${rssi} / -20)
      for ((i=0; i < $rssi_; i++ )); do
        signal="${signal}${signals[$i]}"
      done
      airport_=" #[underscore]${ssid}#[default] | ${signal} "
    ;;
    "init"    ) airport_="#[fg=yellow] ... #[default]" ;;
    *         ) airport_="#[fg=red] Wired #[default]" ;;
  esac
  echo "#[bold]|#[default]${airport_}|#[default] "
fi

操作系

基本的にはマウスでのスクロールを有効化したり、prefix+[で入るコマンドモードでのコピーの仕方をvi風にしています。
またそのコピーしたデータをクリップボードと連携するための設定を記載してます。
WindowsもMacも同じことができますが、書き方が違うので環境に応じて書き換えてください。