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?

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ą.


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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.