Enviar texto de una ventana dividida a otra


17

Recientemente hubo un complemento para NeoVim que permite abrir la terminal en un búfer vim. Esto tiene posibilidades atractivas para enviar texto desde una ventana vim a otra replicando, por ejemplo, un comportamiento similar a REPL.

En el pasado estaba usando tmux para este tipo de configuración. Sin embargo, ahora me gustaría probarlo usando solo NeoVim.

Mi pregunta es: ¿cómo puedo enviar un bloque de texto de una división vim a otra? O tal vez, más bien, ¿cómo puedo automatizar la secuencia de seleccionar texto, tirarlo, cambiar divisiones y luego pegar?

Respuestas:


15

Básicamente, cuando tiene texto seleccionado, desea reasignar una secuencia de teclas para copiar, cambiar a terminal, pegar y, posiblemente, volver a cambiar las ventanas y volver a seleccionar el texto. Si tiene dos divisiones abiertas, esto se vería así:

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

Si hay más de dos divisiones y el terminal no es el que está después de donde se selecciona el texto, querrá usar una asignación diferente que funcione para su diseño (es decir, se <c-w>tmueve a la ventana superior izquierda) o desearía para escribir una función que recorra todas las ventanas y encuentre la correcta.


Por lo que puedo ver, el uso pen un búfer de terminal no ingresa al modo Terminal, por lo que lo siguiente <C-\><C-N>no debería ser necesario. (Dicho esto, también es totalmente inofensivo).
Tommcdo

@tommcdo buena decisión, todavía no había probado la función, así que solo estaba tomando una foto. Quitaré esa parte.
Matt Boehm

17

Las memorias intermedias de terminal de Neovim siempre tienen una identificación de trabajo asociada, por lo que una forma es usar la API de control de trabajo para enviar el texto. Agregue esto a su vimrc:

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

Lo que guardará la identificación del trabajo del último terminal creado en la g:last_terminal_job_idvariable. Luego puede crear algunas funciones / comandos / asignaciones que enviarán los datos utilizando la jobsendfunción, aquí hay un ejemplo:

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

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

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

Lo anterior enviaría la línea actual, pero puede extenderla para enviar una selección visual.


2

Neoterm es un complemento para neovim desarrollado para este propósito. Implementa un nuevo comando :TREPLSendque tomará la línea actual y la enviará a una ventana de terminal. Funciona bien para bash básico y cualquier idioma que tenga un modo REPL.


0

Además de las respuestas aquí, he implementado un complemento para este propósito: vim-sendtowindow .

Proporciona un operador de envío a ventana que se puede combinar con cualquier movimiento vim para seleccionar texto para enviar a la ventana adyacente. Además, posiciona convenientemente el cursor después del texto enviado y es repetible por puntos.

Un pequeño ejemplo a continuación:

ejemplo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.