Invia testo da una finestra divisa a un'altra


17

Recentemente è stato aggiunto un componente aggiuntivo a NeoVim che consente l'apertura del terminale in un buffer vim. Ciò ha interessanti possibilità di inviare testo da una finestra di vim a un'altra replicando, ad esempio, un comportamento simile a REPL.

In passato utilizzavo tmux per questo tipo di configurazione. Tuttavia ora vorrei provarlo usando solo NeoVim.

La mia domanda è: come posso inviare un blocco di testo da una vim divisa a un'altra? O forse piuttosto: come posso automatizzare la sequenza di selezione del testo, strappandolo, cambiando le divisioni e quindi incollando?

Risposte:


15

Fondamentalmente quando hai selezionato il testo, vuoi rimappare una sequenza di tasti per copiare, passare al terminale, incollare e quindi eventualmente tornare indietro a Windows e selezionare nuovamente il testo. Se hai due divisioni aperte, sarebbe simile a:

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

Se ci sono più di due divisioni e il terminale non è quello dopo il punto in cui è stato selezionato il testo, ti consigliamo di utilizzare una mappatura diversa che funzioni per il tuo layout (ovvero si <c-w>tsposta nella finestra in alto a sinistra) o che vorresti per scrivere una funzione che scorre in tutte le finestre e trova quella giusta.


Da quello che posso vedere, l'utilizzo pin un buffer terminale non entra in modalità Terminale, quindi <C-\><C-N>non dovrebbe essere necessario quanto segue . (Detto questo, è anche totalmente innocuo.)
Tommaso

@tommcdo buona chiamata, non avevo ancora provato la funzione da solo, quindi stavo solo facendo un tentativo. Rimuoverò quella parte.
Matt Boehm,

17

I buffer dei terminali Neovim hanno sempre un ID lavoro associato, quindi un modo è utilizzare l'API di controllo lavoro per inviare il testo. Aggiungi questo al tuo vimrc:

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

Il che salverà l'id del lavoro dell'ultimo terminale creato nella g:last_terminal_job_idvariabile. Quindi puoi creare alcune funzioni / comandi / mappature che invieranno i dati usando la jobsendfunzione, ecco un esempio:

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

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

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

Quanto sopra invierebbe la riga corrente, ma è possibile estenderla per inviare la selezione visiva.


2

Neoterm è un plugin per neovim sviluppato per questo scopo. Implementa un nuovo comando :TREPLSendche prenderà la linea corrente e la invierà ad una finestra terminale. Funziona bene per bash di base e qualsiasi lingua che abbia una modalità REPL.


0

Oltre alle risposte qui ho implementato un plugin per questo scopo: vim-sendtowindow .

Fornisce un operatore di invio alla finestra che può essere combinato con qualsiasi movimento vim per selezionare il testo da inviare alla finestra adiacente. Inoltre posiziona comodamente il cursore dopo il testo inviato ed è ripetibile a punti.

Un piccolo esempio di seguito:

esempio

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.