Wyślij tekst z jednego podzielonego okna do drugiego

17

Ostatnio pojawił się dodatek do NeoVim, który pozwala otwierać terminal w buforze vim. Daje to atrakcyjne możliwości wysyłania tekstu z jednego okna vim do drugiego w celu replikacji, na przykład zachowanie podobne do REPL.

W przeszłości używałem tmux do tego rodzaju konfiguracji. Jednak teraz chciałbym to wypróbować, używając tylko NeoVim.

Moje pytanie brzmi - jak mogę wysłać blok tekstu z jednego vima podzielonego na inny? A może raczej - jak mogę zautomatyzować sekwencję zaznaczania tekstu, szarpania go, zmiany podziałów, a następnie wklejania?

Karolis Koncevičius
źródło

Odpowiedzi:

15

Zasadniczo, gdy masz zaznaczony tekst, chcesz ponownie przypisać sekwencję klawiszy do skopiowania, przełączenia na terminal, wklejenia, a następnie ewentualnie przełącz ponownie okna i ponownie zaznacz tekst. Jeśli masz otwarte dwa podziały, wyglądałoby to mniej więcej tak:

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

Jeśli są więcej niż dwa podziały, a terminal nie jest tym, po którym zaznaczony jest tekst, możesz użyć innego odwzorowania, które działa dla twojego układu (tj. <c-w>tPrzenosi się do lewego górnego okna) lub chcesz aby napisać funkcję, która zapętla wszystkie okna i znajduje właściwą.

Matt Boehm
źródło
Z tego, co widzę, użycie pw buforze terminala nie wchodzi w tryb terminala, więc poniższe czynności <C-\><C-N>nie powinny być konieczne. (To powiedziawszy, jest również całkowicie nieszkodliwe.)
tommcdo
@tommcdo dobre połączenie, sam jeszcze nie wypróbowałem tej funkcji, więc po prostu spróbowałem. Usunę tę część.
Matt Boehm
17

Bufory terminali Neovim zawsze mają powiązany identyfikator zadania, więc jednym ze sposobów jest użycie interfejsu API kontroli zadania do wysłania tekstu. Dodaj to do swojego vimrc:

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

Który zapisze identyfikator zadania ostatnio utworzonego terminala w g:last_terminal_job_idzmiennej. Następnie możesz utworzyć niektóre funkcje / polecenia / odwzorowania, które wyślą dane za pomocą jobsendfunkcji, oto przykład:

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

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

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

Powyższe spowoduje wysłanie bieżącej linii, ale możesz ją rozszerzyć, aby wysłać zaznaczenie wizualne.

Thiago de Arruda
źródło
2

Neoterm to wtyczka dla neovim, która została opracowana w tym celu. Implementuje nowe polecenie, :TREPLSendktóre pobierze bieżącą linię i wyśle ​​ją do okna terminala. Działa dobrze dla podstawowego bash i dowolnego języka, który ma tryb REPL.

Placeybordeaux
źródło
0

Oprócz odpowiedzi tutaj zaimplementowałem wtyczkę do tego celu: vim-sendtowindow .

Zapewnia operatora wysyłania do okna , który można łączyć z dowolnym ruchem vim, aby wybrać tekst do wysłania do sąsiedniego okna. Ponadto wygodnie ustawia kursor za wysłanym tekstem i jest powtarzalny kropkowo.

Mały przykład poniżej:

przykład

Karolis Koncevičius
źródło