Kirim teks dari satu jendela terpisah ke jendela lainnya

17

Baru-baru ini ada add-on untuk NeoVim yang memungkinkan pembukaan terminal dalam buffer vim. Ini memiliki kemungkinan menarik untuk mengirim teks dari satu jendela vim ke replikasi lain, misalnya, perilaku seperti REPL.

Di masa lalu saya menggunakan tmux untuk konfigurasi seperti ini. Namun sekarang saya ingin mencobanya hanya menggunakan NeoVim.

Pertanyaan saya adalah - bagaimana saya bisa mengirim blok teks dari satu vim split ke yang lain? Atau mungkin lebih - bagaimana saya bisa mengotomatiskan urutan pemilihan teks, menariknya, mengubah pemisahan dan menempelkannya?

Karolis Koncevičius
sumber

Jawaban:

15

Pada dasarnya ketika Anda memiliki teks yang dipilih, Anda ingin memetakan ulang urutan tombol untuk menyalin, beralih ke terminal, tempel, dan kemudian mungkin beralih windows kembali dan pilih kembali teks. Jika Anda memiliki dua belahan terbuka, ini akan terlihat seperti:

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

Jika ada lebih dari dua pemisahan dan terminal bukanlah yang setelah di mana teks Anda dipilih, Anda ingin menggunakan pemetaan yang berbeda yang berfungsi untuk tata letak Anda (yaitu <c-w>tbergerak ke jendela kiri atas) atau Anda ingin untuk menulis fungsi yang melewati semua jendela dan menemukan yang benar.

Matt Boehm
sumber
Dari apa yang saya lihat, menggunakan pbuffer terminal tidak masuk ke mode Terminal, jadi yang berikut ini <C-\><C-N>tidak perlu. (Yang mengatakan, itu juga sama sekali tidak berbahaya.)
tommcdo
@tommcdo panggilan bagus, belum mencoba fitur sendiri namun hanya mengambil gambar. Saya akan menghapus bagian itu.
Matt Boehm
17

Buffer terminal Neovim selalu memiliki id pekerjaan terkait, jadi salah satu caranya adalah dengan menggunakan API kontrol pekerjaan untuk mengirim teks. Tambahkan ini ke vimrc Anda:

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

Yang akan menyimpan id pekerjaan terminal yang dibuat terakhir ke dalam g:last_terminal_job_idvariabel. Kemudian Anda dapat membuat beberapa fungsi / perintah / pemetaan yang akan mengirim data menggunakan jobsendfungsi, berikut ini contohnya:

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

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

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

Di atas akan mengirim baris saat ini, tetapi Anda dapat memperluasnya untuk mengirim pemilihan visual.

Thiago de Arruda
sumber
2

Neoterm adalah plugin untuk neovim yang dikembangkan untuk tujuan ini. Ini mengimplementasikan perintah baru :TREPLSendyang akan mengambil baris saat ini dan mengirimkannya ke jendela terminal. Berfungsi baik untuk bash dasar dan bahasa apa pun yang memiliki mode REPL.

placeybordeaux
sumber
0

Selain jawaban di sini saya telah menerapkan plugin untuk tujuan ini: vim-sendtowindow .

Ini menyediakan operator kirim-ke-jendela yang dapat dikombinasikan dengan gerakan vim apa pun untuk memilih teks untuk dikirim ke jendela yang berdekatan. Selain itu, posisi kursor tepat setelah teks yang dikirim dan dot berulang

Contoh kecil di bawah ini:

contoh

Karolis Koncevičius
sumber