handlename's blog

コード片など

tmuxのcopy-pipeとsplit-windowを組み合わせると捗る

  • tmux 1.8

以前こういうエントリを書いた。

ローカルで使っているtmux.confに以下のような設定を書いて、 選択範囲をnopasteに投げられるようにしていた。

bind-key -temacs-copy C-q copy-pipe "cat | ~/bin/np"

上の例にあるnpというコマンドは、

  • nopasteした後にそのURLを標準出力に出す
  • そのURLをブラウザで開く

というもの。

copy-pipeした場合は標準出力が見られないものの、 ブラウザで開くというのは有効なのでローカルで使っている分には特に問題がなかった。

しかし、リモートでtmuxを使っている場合は ブラウザが開けないのでnopasteしたURLが得られず 無意味な設定になってしまう。

アカウントに紐付いたものリストが見られるような nopasteサービスを使っていればそこから辿れなくはないが、 めんどくさいし今使っている社内nopasteにはそんな機能はない。

とはいえこれが使えないとちょっとしたテキストを 共有するのにすごく不便(一度ファイルに落としてからnpコマンドに食わせないといけない)。

そこでtmuxのsplit-window(ウィンドウの分割)と組み合わせて その場でnopaste先のURLを確認できるようにしてみた。

bind-key -temacs-copy C-q copy-pipe "cat | ~/bin/np > ~/.last_np; tmux split-window -p 1 'less ~/.last_np'"

f:id:handlename:20141209193750p:plain

下の方にピコッと表示される (社内nopasteのURLなのでモザイクだらけとなっております)

ちょっと長いがやっていることは簡単で、 nopasteした後にその結果をtmuxのsplit-windowに渡している。

  • npコマンドの結果(=nopaste先のURL)を~/.last_npというファイルに保存
  • split-windowコマンドで~/.last_npの内容をlessで表示
  • URLが表示できればいいだけなので-pは最小の1に

split-windowは引数にコマンドを指定すると そのコマンドが終了すると同時にペインを閉じる。 今回はlessで開いているので、qを入力すればペインごと閉じてくれる。

いちいちファイルを介さないといけないので無駄な感じもするが、 手を動かさないといけないわけではないし、 履歴を確認できると思えばまあいいかな、と。

cat | ~/bin/np >> ~/.last_np; tmux split-window -p 1 'tail -n1 ~/.last_np' | less

とすればすべての履歴を残すことも。

とりあえず捗る。