web-dev-qa-db-ja.com

vimから親tmuxセッションにコマンドを送信する

TmuxにvimとLynxを使用して分割ウィンドウを設定しています。作業中のスクリプトを保存し、フォーカスをLynxペインに切り替え、Lynxページを更新してから、vimペインに戻るカスタムコマンドをvimに送信できるように、スクリプトを作成しようとしています。

これを行う既存のスクリプトはありますか?そうでない場合、このスクリプトを作成するための最良のアプローチは何でしょうか?

7
leo

おそらくVimを使用することができます :! コマンドを実行してtmux send-keysを実行し、Control-Rを送信します 他のペインに。 send-keysは(アクティブなペインだけでなく)任意のペインにキーストロークを送信できるため、アクティブなペインを前後に切り替える必要もありません。

これがVimマッピングです(.vimrcに入れるか、:プロンプトに貼り付けて試してみてください):

:map <Leader>rl :w<Bar>execute 'silent !tmux send-keys -t bottom C-r'<Bar>redraw!<C-M>

これにより、\rlキーシーケンス( <Leader> デフォルトは\になりますが、カスタマイズできます)は、次のVimコマンドシーケンス(<Bar>で区切られます。 :help map_bar を参照)にマップされます。

  1. 現在のバッファをそのファイルに書き込みます。
  2. tmuxコマンドを実行して、Control-Rを下部に送信します ペイン。
    ここでは execute を使用して、次のVimコマンド(redraw)が:!Shellコマンドの一部として使用されないようにします。
    silent prefixコマンドを使用して、「Enterキーを押して続行」というプロンプトを回避します。
    プロンプトが必要な場合、または:!コマンドの出力を表示する場合は、slientを省略できます(例:tmuxコマンドが機能しない、エラーメッセージが表示されているかどうかを確認します)。
  3. 画面を再描画します。
    これは通常、「Enterキーを押す」プロンプトの後に発生しますが、silentで抑制しています。

手元にlynxがありませんが、「lynxreload」の検索に基づくとControl-Rがリロードキーのようです(つまり 「ファイルの再読み込みと表示の更新」 ユーザーガイドの)。

bottomの他に、ターゲットペインを指定する方法が他にもあります( tmuxマニュアルページで「target-pane」を検索してください )::

  • .+1.-1:このウィンドウの次の前のペイン
  • topbottomleftright、およびtop/bottomleft/rightの組み合わせ
    (つまり、bottom-left
  • %42tmux1.5+):ターゲットペインのTMUX_PANE環境変数からの%-プレフィックス付きペイン番号

    この最後のフォームは、LynxペインがVimのインスタンスと常に同じtmuxウィンドウにあるとは限らない場合に便利です。 Lynxを起動する前に、TMUX_PANEの値を一時ファイルに保存し、ファイルを読み取ってターゲットペイン引数を形成します。

    # before running Lynx (anytime really, but "before" is usually scriptable)
    echo "$TMUX_PANE" > /tmp/my-lynx-pane
    
    # in the Vim :! command in the mapping:
    tmux send-keys -t "$(cat /tmp/my-lynx-pane)" C-r
    
13
Chris Johnsen

手動で選択したtmuxセッションと対話し、それにバッファーを送信するtslime.vimプラグインから始める必要があります。ほぼ同じプラグインを作成することになります。ただし、バッファを送信する代わりに、コマンドを発行します(man 1 tmuxを参照)。

tslime.vim @ vimscripts

2
user836295