ある分割ウィンドウから別のウィンドウにテキストを送信する


17

最近、vimバッファーで端末を開くことができるNeoVimのアドオンがありました。これにより、あるvimウィンドウから別の複製にテキストを送信する魅力的な可能性があります。たとえば、REPLのような動作です。

以前は、この種の構成にtmuxを使用していました。ただし、NeoVimのみを使用して試してみたいと思います。

私の質問は-あるvimから別のvimにテキストブロックを送信するにはどうすればよいですか?または多分-テキストの選択、ヤンク、分割の変更、貼り付けのシーケンスを自動化するにはどうすればよいですか?

回答:


15

基本的に、テキストを選択したら、キーシーケンスを再マップして、コピー、ターミナルへの切り替え、貼り付けを行い、ウィンドウを元に戻してテキストを再選択します。2つのスプリットを開いている場合、これは次のようになります。

vnoremap <F5> y<c-w>wp<c-w>pgv
"explanation:
xnoremap <F5>                   Remap F5 in visual/select mode (could be any key combo)
              y                 copy selected text
               <c-w>w           switch to next window
                     p          paste (for terminals this sends the text to the terminal)
                      <c-w>p    switch to previous window
                            gv  reselect

3つ以上の分割があり、テキストが選択された後のターミナルが1つではない場合は、レイアウトに適した別のマッピングを使用する(つまり<c-w>t、左上のウィンドウに移動する)か、すべてのウィンドウをループして適切なウィンドウを見つける関数を作成します。


私が見ることができることからp、ターミナルバッファで使用してもターミナルモードに入らないので、以下<C-\><C-N>は必要ないはずです。(それは言った、それはまた完全に無害です。)
tommcdo

@tommcdoいいですね、まだ自分でこの機能を試していなかったので、ちょうどショットを撮っていました。その部分を削除します。
マットベーム

17

Neovimターミナルバッファには常にジョブIDが関連付けられているため、1つの方法は、ジョブ制御APIを使用してテキストを送信することです。これをvimrcに追加します。

augroup Terminal
  au!
  au TermOpen * let g:last_terminal_job_id = b:terminal_job_id
augroup END

これにより、最後に作成された端末のジョブIDがg:last_terminal_job_id変数に保存されます。次に、jobsend関数を使用してデータを送信する関数/コマンド/マッピングを作成できます。以下に例を示します。

function! REPLSend(lines)
  call jobsend(g:last_terminal_job_id, add(a:lines, ''))
endfunction

command! REPLSendLine call REPLSend([getline('.')])

nnoremap <silent> <f6> :REPLSendLine<cr>

上記は現在の行を送信しますが、視覚的な選択を送信するためにそれを拡張できます。


2

Neotermは、この目的のために開発されたneovimのプラグインです。:TREPLSend現在の行を取得してターミナルウィンドウに送信する新しいコマンドを実装します。基本的なbashおよびREPLモードを持つすべての言語で正常に動作します。


0

ここでの回答に加えて、この目的のためのプラグインvim-sendtowindowを実装しました

これは、隣接するウィンドウに送信するテキストを選択するために、任意のvimモーションと組み合わせることができるウィンドウへの送信演算子を提供します。さらに、送信されたテキストの後に便利にカーソルを配置し、ドットの繰り返しが可能です。

以下の小さな例:

例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.