この記事はdotfileアドベントカレンダーの15日目です!
はじめに
みなさんvim + tmux生活エンジョイしていますか?
エンジョイしている方、エンジョイしたい方にオススメの設定をお教えします。
ズバリ、vimの中からtmuxを操作する
というものです。
基本的にはこちらを参考にし、コードをリファクタしました。
15年目のVim | POSTD
動きとしてはこちらの動画のような形になります。
tmuxにはcommandでpaneに好きなコマンドを送ることができる、
tmux send-keys
というコマンドがあります。
実態
試しにお手元のtmuxで新しいセッションを開き、
3つほどpane分割をした後以下のコマンドを実行してみてください。
$ tmux send-keys -t $(tmux display-message -p "#S"):0.2 'echo hogefuga' c-j
おそらく別のpaneにてecho hogefuga
というコマンドが実行されたかと思います。
(これで実行されない場合、おそらくtmuxのwindowやpaneの番号が1から始まる
といった設定をしている
ことが考えられます)
-t
オプションにて送信先のpaneを指定します。
フォーマットはsession名:window番号.pane番号
となっております。
今回は$(tmux display-message -p "#S")
にてsession名を取得し、柔軟に仕上げました。
こちらをvim内でsystem()
を用いて実行してあげる、というものです。
参考実装
apiのエンドポイントを開発しているときとかに別paneにcurlとjqを走らせておいて、
こいつを用いてvim内からそのcurlを走らせたりすると便利ですね。
こんな感じ
nnoremap <leader>rt :call TmuxPaneRepeat()<CR>
let g:target_pane = '2'
let g:repeat_command = 'c-c c-p c-j'
function! TmuxPaneRepeat()
echo system('tmux send-keys -t '.g:target_pane." ".g:repeat_command)
endfunction
個人的にいい感じだと思ってるのは、送信するコマンドをグローバル変数にしているので、
送信するコマンドを別のものにしたかったらその場で変数をいじるだけになってるポイントです。