Envoyer du texte d'une fenêtre fractionnée à une autre

17

Récemment, il y avait un add-on à NeoVim qui permet d'ouvrir le terminal dans un tampon vim. Cela offre des possibilités intéressantes pour envoyer du texte d'une fenêtre vim à une autre en répliquant, par exemple, un comportement de type REPL.

Dans le passé, j'utilisais tmux pour ce type de configuration. Mais maintenant, je voudrais l'essayer en utilisant uniquement NeoVim.

Ma question est - comment puis-je envoyer un bloc de texte d'un split vim à un autre? Ou peut-être plutôt - comment puis-je automatiser la séquence de sélection de texte, de tirage, de changement de fractionnement puis de collage?

Karolis Koncevičius
la source

Réponses:

15

Fondamentalement, lorsque vous avez sélectionné du texte, vous souhaitez remapper une séquence de touches à copier, basculer vers le terminal, coller, puis éventuellement revenir à Windows et resélectionner le texte. Si vous avez deux divisions ouvertes, cela ressemblerait à quelque chose comme:

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

S'il y a plus de deux divisions et que le terminal n'est pas celui après lequel votre texte est sélectionné, vous souhaitez soit utiliser un mappage différent qui fonctionne pour votre mise en page (c'est- <c-w>tà- dire se déplace vers la fenêtre en haut à gauche) ou vous souhaitez pour écrire une fonction qui parcourt toutes les fenêtres et trouve la bonne.

Matt Boehm
la source
D'après ce que je peux voir, l'utilisation pdans un tampon de terminal n'entre pas en mode Terminal, donc ce qui suit <C-\><C-N>ne devrait pas être nécessaire. (Cela dit, c'est aussi totalement inoffensif.)
tommcdo
@tommcdo bon appel, je n'avais pas encore essayé la fonctionnalité moi-même, donc je prenais juste une photo. Je vais supprimer cette partie.
Matt Boehm
17

Les tampons de terminal Neovim ont toujours un identifiant de travail associé, donc une façon consiste à utiliser l'API de contrôle des travaux pour envoyer le texte. Ajoutez ceci à votre vimrc:

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

Ce qui enregistrera l'ID de travail du dernier terminal créé dans la g:last_terminal_job_idvariable. Ensuite, vous pouvez créer des fonctions / commandes / mappages qui enverront les données à l'aide de la jobsendfonction, voici un exemple:

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

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

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

Ce qui précède enverrait la ligne actuelle, mais vous pouvez l'étendre pour envoyer une sélection visuelle.

Thiago de Arruda
la source
2

Neoterm est un plugin pour neovim développé à cet effet. Il implémente une nouvelle commande :TREPLSendqui prendra la ligne courante et l'enverra dans une fenêtre de terminal. Fonctionne bien pour bash basique et toute langue qui a un mode REPL.

placeybordeaux
la source
0

En plus des réponses ici, j'ai implémenté un plugin à cet effet: vim-sendtowindow .

Il fournit un opérateur d' envoi vers la fenêtre qui peut être combiné avec n'importe quel mouvement vim afin de sélectionner le texte à envoyer à la fenêtre adjacente. De plus, il positionne commodément le curseur après le texte envoyé et est répétable par points.

Un petit exemple ci-dessous:

exemple

Karolis Koncevičius
la source