SPIDERPLUS Tech Blog

建設SaaS「スパイダープラス」のエンジニアとデザイナーのブログ

tmuxの右クリックメニューを日本語化する

1.はじめに

こんにちは、技術開発部の宮囿です。
唐突ですが、私はtmuxが好きです。急なWi-Fiの不調やLANケーブルの断線、割り込みで入ってきた打合せ等の様々なアクシデントがあっても、tmux上で作業しておくことで作業の中断・再開は思うがまま、tmuxは最高です。
私の業務は割り込みが多いので、私はtmuxの利便性をとても享受しています。そしてとても便利なので布教したいと思っています。

さて、tmuxを布教するにあたってハードルになっているのは操作を覚えるコストの重さだと思っているのですが、tmuxはこのハードルに対し、コンソールアプリでありながら右クリックメニューを実装するという解を提示しています。実際に使うと以下のような感じになります。

最高ですね。ベテランtmuxユーザーのような速度で操作できることが分かります。

これならtmuxを布教するのも簡単だ、と思ったのですが、メニュー上の表現がどうも目に馴染みません。
というわけでこれをより布教しやすくするため、この記事ではtmuxの右クリックメニューの日本語化を行っていきます。

対象読者

  • tmuxを布教したい人

  • tmuxなんてたまにしか使わないから操作を覚えられないよ、という人

  • 正直コンソール作業でマウスとか使わないけどコンソールでのマウス操作ってロマンがあるよね、という理解のある人

検証環境

  • ターミナル:Windows terminal + Powershellからsshで↓のOSが動いているサーバーに接続
  • フォント: Cascadia Code
  • tmuxを動かしているOS:Ubuntu 22.04 LTS
  • tmux:3.2a-4ubuntu0.2

2. 右クリックメニューを使えるようにする

まず右クリックメニューを使えるようにします。
~/.config/tmux/tmux.confを作成して(もしくは作成済みの ~/.tmux.conf 等に) `setw -g mouse on` を追加します。
この設定によりtmuxでのマウス操作が有効になり、冒頭のgifのような操作が可能になります。
※マウス操作をシェルに送っているターミナルでしか利用できないのでご注意ください。

3. デフォルトの挙動を.tmux.confに転記する

tmuxで使えるマウス操作のうち、冒頭のGif画像での操作にあたるMouseDown3Pane(ペイン上での右クリック操作)を対象にして説明していきます。

今回はマウス操作をONにしたときに利用できるデフォルトの挙動をそのままに、メニューの文字列だけ日本語にしたいので、デフォルトの挙動(現在の挙動)がどう書いてあるのか確認し、tmux.conf に転記します。

現在の挙動がどうなっているかを確認するときはtmux list-keysを利用します。出力結果からMouseDown3Paneの項目を抜き出し、(読みやすさのために)各メニューの内容毎にバックスラッシュ+改行を入れたものを以下に掲載します。

bind-key    -T root         MouseDown3Pane       if-shell -F -t = "#{||:#{mouse_any_flag},#{&&:#{pane_in_mode},#{?#{m/r:(copy|view)-mode,#{pane_mode}},0,1}}}" "select-pane -t= ; send -M" "display-menu -t= -xM -yM -T \"#[align=centre]#{pane_index} (#{pane_id})\" \
\"#{?#{m/r:(copy|view)-mode,#{pane_mode}},Go To Top,}\" < \"send -X history-top\" \
\"#{?#{m/r:(copy|view)-mode,#{pane_mode}},Go To Bottom,}\" > \"send -X history-bottom\" \
'' \
\"#{?mouse_word,Search For #[underscore]#{=/9/...:mouse_word},}\" C-r \"if -F \\\"#{?#{m/r:(copy|view)-mode,#{pane_mode}},0,1}\\\" \\\"copy-mode -t=\\\" ; send -Xt= search-backward \\\"#{q:mouse_word}\\\"\" \
\"#{?mouse_word,Type #[underscore]#{=/9/...:mouse_word},}\" C-y \"copy-mode -q ; send-keys -l -- \\\"#{q:mouse_word}\\\"\" \
\"#{?mouse_word,Copy #[underscore]#{=/9/...:mouse_word},}\" c \"copy-mode -q ; set-buffer -- \\\"#{q:mouse_word}\\\"\" \
\"#{?mouse_line,Copy Line,}\" l \"copy-mode -q ; set-buffer -- \\\"#{q:mouse_line}\\\"\" \
'' \ \"Horizontal Split\" h \"split-window -h\" \ \"Vertical Split\" v \"split-window -v\" \ '' \ \"#{?#{>:#{window_panes},1},,-}Swap Up\" u \"swap-pane -U\" \ \"#{?#{>:#{window_panes},1},,-}Swap Down\" d \"swap-pane -D\" \ \"#{?pane_marked_set,,-}Swap Marked\" s swap-pane \ '' \ Kill X kill-pane \ Respawn R \"respawn-pane -k\" \ \"#{?pane_marked,Unmark,Mark}\" m \"select-pane -m\" \ \"#{?#{>:#{window_panes},1},,-}#{?window_zoomed_flag,Unzoom,Zoom}\" z \"resize-pane -Z\""

これを tmux.conf に転記します。

ざっくり説明すると、1行目に「ペイン内で右クリックをしたらdisplay-menuコマンドでメニューを表示する」ということが書いてあり、表示するメニューの内容が2行目以降に name key command の形式で並んでいます。
内容が読みにくくなっている要因である#{?A,B,C}等の表記については、tmuxのwikiにこってりとした説明がありますので、これどうなってんだよって感じた方は是非ご一読ください。コンソール内で確認したい場合は man tmuxFORMATSにも同様に詳しく説明がありますので是非。

4. 日本語化する

あとは3で追加したtmux.confの内容を日本語化していくだけです。簡単ですね。
現在tmuxを右クリックした時に表示されている文言を日本語に置換していけば大丈夫です。
操作を忘れても大丈夫なようにという気持ちと、布教される人の脳にペイン(pane 区画、の意味)という単語が染み込むようにという気持ちで、くどい日本語にします。
項目ごとに簡単に挙動を説明します。

4-1 Go to Top /Go to Bottom

copy/viewモードにおいて、スクロールした画面の一番上、一番下に移動します。
この二つはtmux上でマウスホイールを利用したとき等、copy/viewモードになった時に表示されます。
日本語は「一番上に移動する/一番下に移動する」にしました。

4-2 Search for [単語]/ Type [単語]/ Copy [単語]

選択した単語の検索・入力・コピーができます。
カーソルが単語上にある時に表示されます。
このコピー機能は単語をtmuxのバッファに入れる機能で、OS側のクリップボードには入らないのでご注意ください。
日本語は「[単語]を検索する / [単語]と入力する / [単語]をコピーする」にしました。
日本語化にあたり[単語]を先頭に持ってきたのですが、#[underscore]で[単語]にアンダースコアを入れていたので、[単語]の後に#[none]を入れてアンダースコアを外しています。

4-3 Line Copy

選択した行のコピーができます。
カーソルがある行に何らかの文字がある時に表示されます。
こちらも、一行をtmuxのバッファに入れる機能で、OS側のクリップボードには入らないのでご注意ください。
日本語は「一行コピーする」にしました。

4-4 Horizontal Split/ Vertical Split

画面分割ができます。
水平分割・垂直分割でも良かったんですが個人的にどっちがどっちか分からないことがあったので、
日本語は「ペインを横に増やす、ペインを縦に増やす」にしました。

4-5 Swap Up / Swap Down / Swap Marked

上のペイン/下のペイン/マーク付きのペインとの入れ替えを行います。
交換するペインがない時にDisable表示になります。
日本語は 「上のペインと交換する/下のペインと交換する/マーク付きペインと交換する」にしました。

4-6 Kill

ペインを閉じます。
日本語は「ペインを閉じる」にしました。

4-7 Respawn

ペインを閉じて開きなおします。
日本語は「ペインを初期化する」にしました。

4-8 Mark/Unmark

ペインにマークを付ける/外す機能です。
日本語は「ペインにマークを付ける/ペインからマークを外す」にしました。

4-9 Zoom/Unzoom

ペインを全画面表示します。
全画面表示中はUnzoomが表示され、実行すると全画面表示が解除されます。
日本語は「ペインを最大化する/ペインの最大化を解除する」にしました。

5. 完成

というわけで、最終的に出来上がったものが以下です。絵文字入れちゃいました。
どうでしょう、冒頭のGif画像よりは何をやってるかが多少分かりやすくないでしょうか。

tmux.conf は以下のようになりました。

setw -g mouse on
bind-key    -T root         MouseDown3Pane       if-shell -F -t = "#{||:#{mouse_any_flag},#{&&:#{pane_in_mode},#{?#{m/r:(copy|view)-mode,#{pane_mode}},0,1}}}" "select-pane -t= ; send -M" "display-menu -t= -xM -yM -T \"#[align=centre]#{pane_index} (#{pane_id})\" \
\"#{?#{m/r:(copy|view)-mode,#{pane_mode}},一番上に移動する,}\" < \"send -X history-top\" \
\"#{?#{m/r:(copy|view)-mode,#{pane_mode}},一番下に移動する,}\" > \"send -X history-bottom\" \
'' \
\"#{?mouse_word,#[underscore]#{=/9/...:mouse_word}#[none]を検索する,}\" C-r \"if -F \\\"#{?#{m/r:(copy|view)-mode,#{pane_mode}},0,1}\\\" \\\"copy-mode -t=\\\" ; send -Xt= search-backward \\\"#{q:mouse_word}\\\"\" \
\"#{?mouse_word,#[underscore]#{=/9/...:mouse_word}#[none]と入力する,}\" C-y \"copy-mode -q ; send-keys -l -- \\\"#{q:mouse_word}\\\"\" \
\"#{?mouse_word,#[underscore]#{=/9/...:mouse_word}#[none]をコピーする,}\" c \"copy-mode -q ; set-buffer -- \\\"#{q:mouse_word}\\\"\" \
\"#{?mouse_line,1行コピーする,}\" l \"copy-mode -q ; set-buffer -- \\\"#{q:mouse_line}\\\"\" \
'' \
\"🍻ペインを横に増やす\" h \"split-window -h\" \
\"🍣ペインを縦に増やす\" v \"split-window -v\" \
'' \
\"#{?#{>:#{window_panes},1},,-}👆ペインを上と交換する\" u \"swap-pane -U\" \
\"#{?#{>:#{window_panes},1},,-}👇ペインを下と交換する\" d \"swap-pane -D\" \
\"#{?pane_marked_set,,-}✅マーク付きペインと入れ替える\" s swap-pane \
'' \
❌ペインを閉じる X kill-pane \
📖ペインを初期化する R \"respawn-pane -k\" \
\"#{?pane_marked,🟩マークを外す,✅マークを付ける}\" m \"select-pane -m\" \
\"#{?#{>:#{window_panes},1},,-}#{?window_zoomed_flag,🌱最大化を解除する,🌳最大化する}\" z \"resize-pane -Z\""

最後に

半分冗談のつもりで始めた日本語化でしたが、思いのほか右クリックメニューの利便性が高く、カスタマイズしてマウス操作だけでサーバー上の一定の調査ができるようにしてもよさそうな感触を得ました。また、デフォルトの右クリックメニューはtmuxの様々な機能が絡んでいて、一行読むだけでもtmuxの理解が深まって良かったです。推しているアプリに詳しくなれるっていうのはそれだけでも楽しいですね。この知見からtmuxユーザーをさらに増やして業務効率化を図っていければと思います。

ところで、スパイダープラスでは仲間を募集中です。

tmuxの布教に興味が出てきた方はもちろん、スパイダープラスにちょっと興味が出てきたなという方がいらっしゃったらお気軽にご連絡ください。

最後までご覧くださり、ありがとうございます。