Enviar texto de uma janela dividida para outra

17

Recentemente, houve um complemento para o NeoVim, que permite abrir o terminal em um buffer vim. Isso tem possibilidades atraentes de enviar texto de uma janela do vim para outra, replicando, por exemplo, um comportamento semelhante ao REPL.

No passado, eu estava usando o tmux para esse tipo de configuração. No entanto, agora eu gostaria de experimentá-lo usando apenas o NeoVim.

Minha pergunta é - como posso enviar um bloco de texto de um vim dividido para outro? Ou talvez - como posso automatizar a sequência de seleção de texto, puxando-o, alterando divisões e colando?

Karolis Koncevičius
fonte

Respostas:

15

Basicamente, quando você seleciona o texto, deseja remapear uma sequência de teclas para copiar, alternar para terminal, colar e, em seguida, alternar novamente as janelas e selecionar novamente o texto. Se você tiver duas divisões abertas, seria algo como:

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 houver mais de duas divisões e o terminal não for o local após o qual o texto estiver selecionado, você poderá usar um mapeamento diferente que funcione para o seu layout (ou seja, <c-w>tmover para a janela superior esquerda) ou desejar para escrever uma função que percorre todas as janelas e encontra a correta.

Matt Boehm
fonte
Pelo que pude ver, usar pum buffer de terminal não entra no modo Terminal, portanto, o seguinte <C-\><C-N>não deve ser necessário. (Dito isto, também é totalmente inofensivo.)
tommcdo
@ tommcdo boa ligação, ainda não havia tentado o recurso, então estava apenas tentando. Vou remover essa parte.
precisa
17

Os buffers de terminal do Neovim sempre têm um ID de trabalho associado; portanto, uma maneira é usar a API de controle de trabalho para enviar o texto. Adicione isso ao seu vimrc:

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

O que salvará o ID do trabalho do último terminal criado na g:last_terminal_job_idvariável. Então você pode criar algumas funções / comandos / mapeamentos que enviarão os dados usando a jobsendfunção, aqui está um exemplo:

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

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

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

O exemplo acima enviaria a linha atual, mas você pode estendê-la para enviar a seleção visual.

Thiago de Arruda
fonte
2

Neoterm é um plugin para o neovim desenvolvido para esse fim. Ele implementa um novo comando :TREPLSendque pega a linha atual e a envia para uma janela do terminal. Funciona bem para o bash básico e qualquer idioma que tenha um modo REPL.

placeybordeaux
fonte
0

Além das respostas aqui, implementei um plugin para esse fim: vim-sendtowindow .

Ele fornece um operador de envio para janela que pode ser combinado com qualquer movimento do vim para selecionar o texto a ser enviado para a janela adjacente. Além disso, posiciona convenientemente o cursor após o texto enviado e é repetível em pontos.

Um pequeno exemplo abaixo:

exemplo

Karolis Koncevičius
fonte