鮭とばとコーヒー

四度目の正直ブログ

tmux設定メモ

シェルコマンドの結果を文字列として入力したくなったため、ちょっとした設定を加えたのでそのメモです。 シェルであればコマンド置換$(command)を使えば問題ありません。zshだとタブを押すと展開もされますよね。 同じようなことをシェル以外のインタプリタ上で実現したくなりました。

僕のケースではSQLiteインタラクティブシェル上で適当なUUIDをデータとして挿入したくなったのですが、わざわざペインを分割してuuidgenを実行してコピペとか面倒だと思った訳です。 pipe-paneというtmuxコマンドで実現できるのですが、もうちょっと簡単にしようと思いcommand-promptと組み合わせることにしました。

~/.tmux.confに以下のように書きます。

bind | command-prompt -p "<!" "pipe-pane -I \"echo -n \\\"$(%%%)\\\"\""

これでPrefix + |を押すと、プロンプト<!が表示されて、そこに入力したコマンドの出力があたかもキーボードから入力したかのように入力されます。 複数行コマンドとかには対応していないのでセミコロン区切りにする必要がありますが、まあそれほど困っていません。これで、

INSERT INTO some_table (name, order_id) VALUES ('John', '

まで入力してprefix + |, uuidgen<CR>とするとUUIDが生成されて入力できるという訳です。

簡単にやっていることを書いておきます。 %%%の部分はcommand-promptの入力文字列で置換されます。%%でも良いのですが、%%%の方が引用符がエスケープされるので扱いやすいのです。 pipe-pane -Iが入力として外部コマンドを受けつけるのですが、末尾の改行が入ると色々と面倒なのでecho -n "$(command)"として除去しています。

今は何層目のクオートの中身を書いてるのか分からなくなりエスケープと引用符の周りでゴタつきましたが、上のものでOKなはず。 バインドするキーは好きに変えて下さい。

余談ですが、僕は今まで|split-window -h -c '#{pane_current_path}に割り当てていました。これは%を使うことにしました。 ほぼデフォルトと同じですが、カレントディレクトリでシェルを開くところだけが違います。"も同じようにカレントディレクトリで開くようにしています。 ホームディレクトリに移動したければcdすればよいだけですからね。カレントディレクトリで作業をしたいことの方が多いですし、こっちの方が僕は好みです。

なお、tmuxのバージョンは3.2aでした。古いやつだと動かないかもしれません。

おわり。