LoginSignup
4
2

More than 3 years have passed since last update.

vimの中からtmuxを操作する

Last updated at Posted at 2019-12-14

この記事は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を走らせたりすると便利ですね。
こんな感じ

gamen_test1.gif

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

個人的にいい感じだと思ってるのは、送信するコマンドをグローバル変数にしているので、
送信するコマンドを別のものにしたかったらその場で変数をいじるだけになってるポイントです。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2