ハイパーマッスルエンジニア

Vim、ShellScriptについてよく書く

tmux popupで遊ぶ

tmux popupとは

tmuxのバージョン3.2-rcより導入された新たな機能。
どのようなものかはGIF見ていていただくのが一番早い。

https://github.com/Rasukarusan/blog-assets/blob/master/tmux-popup/popupdemo.gif?raw=true
fzfの絞り込みをtmux popupで実行したり、popup内で作業ができる

paneやwindowの概念とは別に、新規ウィンドウがtmux上に表示される。

使用用途としてはmanにも書いてあるとおり、一時的な作業をするのに適している。
またはfzfの絞り込みをpopup上で行うというものが挙げられる。ちなみにfzfはすでにtmux popupに対応しており、fzfと書いていたところをfzf-tmuxと書き換えてあげればpopupで絞り込みができるようになっている。無論使用しているtmuxがバージョン3.2以上であることが前提。

popup対応しているtmuxをインストールする

現状(2020/09/27)、brewでインストールできるtmuxは3.1bが最新なので、popupが使えない。
なのでtmuxをgit cloneして手動でインストールするしかない。といってもREADMEに記載してあるとおりにするだけなので簡単だ。

git clone https://github.com/tmux/tmux.git
cd tmux
sh autogen.sh
./configure && make

tmuxという実行ファイルが誕生していればOK。 実行時は今起動しているtmuxは終了して./tmuxで実行できる。すでにインストールしているtmuxのセッションを全て終了していないと、エラーが出たりpopupが使えないので、必ず終了しておく。tmux kill-serverしておけばOK。

# 現在のtmuxを終了しておく
$ tmux kill-server
# 最新版のtmuxを起動
$ ./tmux
# バージョン確認(3.2以上だったらOK)
$ tmux -V
tmux next-3.3

popupの実行方法

popupを実行するのは下記の通りでとても簡単。

tmux popup

f:id:rasukarusan:20200927184056p:plain
ENTERなど適当なキーを押せばpopupは消える

-w-hで幅、高さの指定も可能。

tmux popup -w80% -h10%

f:id:rasukarusan:20200927184024p:plain
-w100, -h50など数字で指定することもできる

-x-yで位置の指定も可能。

tmux popup -x10 -y40

f:id:rasukarusan:20200927184110p:plain

popupでコマンドの実行結果を表示する

popup内でshellコマンドを実行するには-Rオプションを使う
tmuxのバージョンアップで修正されました。現在は-Rオプションがなくなり、第一引数にコマンドを渡すだけで実行されます。

tmux popup "cat README"

f:id:rasukarusan:20200927184142p:plain
popup内でshellコマンドを実行

ShellScript内で実行するときなどで、現在のディレクトリをpopupにも渡したいときは下記

tmux popup -d '#{pane_current_path}' "cat README"

また、popup内でshellを起動して作業をしたいときは-KERをオプションにつける。
tmuxのバージョンアップで修正されました。現在は-EのみでOKです

tmux popup -E "zsh"

f:id:rasukarusan:20200927184205p:plain
popup内でzsh起動

-KEについては、popup内でshellを起動して自由に動き回りたいなら必須だと思ってくれていい。

一応説明

  • -KをつけるとCtrl-CESC以外ではpopupを終了させることができなくなる。デフォルトはどんなキーを押してもpopupは消えてしまうので、popup内でコマンドを打ちたいときは-Kは必須。 ただ、Ctrl-CESCでpopupが消えてしまうので、popup内でCtrl-C(処理をやめたいときなど)を使いたいときは後述の-Eを使う。
  • -Eをつけるとshellのexitコマンドでpopupを終了できるようになる。なので-KRとセットで使われることが前提。

色々遊んで見た感想

  • 1セッションにつき、1popupなので、複数のpopupを同時に起動とかはできない
  • neovimのfloating windowのように、popupと現在のwindowを行ったり来たりはできない
  • どんなにpaneが小さくても、真ん中にドカンと表示することができるので、fzfの絞り込みと相性は抜群

https://github.com/Rasukarusan/blog-assets/blob/master/tmux-popup/lupin.gif?raw=true
何か面白いことできないかと思ったけどこれが限界だった

# toiletコマンドが必要
tmux popup -w30 -h15 -E " toilet -f mono12 ル && sleep 0.1"
tmux popup -w30 -h15 -E " toilet -f mono12 パ && sleep 0.1"
tmux popup -w30 -h15 -E " toilet -f mono12 ン && sleep 0.1"
tmux popup -w30 -h15 -E " toilet -f mono12 ル && sleep 0.1"
tmux popup -w30 -h15 -E " toilet -f mono12 パ && sleep 0.1"
tmux popup -w30 -h15 -E " toilet -f mono12 ー && sleep 0.1"
tmux popup -w30 -h15 -E " toilet -f mono12 ー && sleep 0.1"
tmux popup -w30 -h15 -E " toilet -f mono12 ー && sleep 0.1"
tmux popup -w30 -h15 -E " toilet -f mono12 ー && sleep 0.1"
tmux popup -w30 -h15 -E " toilet -f mono12 ン && sleep 0.1"
tmux popup -w100% -h15 " toilet -w $(tput cols) -f mono12   ルパンルパーーーン"

終わり

複数のpopup起動ができればアニメーションっぽい動きもできて、面白くなりそう。