Отправить текст из одного разделенного окна в другое

17

Недавно появилось дополнение к NeoVim, которое позволяет открывать терминал в буфере vim. Это имеет привлекательные возможности для отправки текста из одного окна vim в другое, например, в режиме REPL.

В прошлом я использовал tmux для такой конфигурации. Однако теперь я хотел бы попробовать это, используя только NeoVim.

У меня вопрос - как я могу отправить блок текста из одного VIM-сплит в другой? Или, может быть, скорее - как я могу автоматизировать последовательность выделения текста, его восстановления, изменения разбиения и вставки?

Каролис Концевичюс
источник

Ответы:

15

В основном, когда у вас выделен текст, вы хотите переназначить последовательность клавиш для копирования, переключиться на терминал, вставить, а затем, возможно, переключить окна назад и повторно выбрать текст. Если у вас открыто два сплита, это будет выглядеть примерно так:

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

Если есть более двух разделений, и терминал не является тем, после которого выбран ваш текст, вы можете либо использовать другое отображение, которое работает для вашего макета (то есть <c-w>tперемещается в верхнее левое окно), либо вам нужно написать функцию, которая перебирает все окна и находит правильное.

Мэтт Бём
источник
Из того, что я вижу, использование pв буфере терминала не входит в режим терминала, поэтому следующее <C-\><C-N>не должно быть необходимым. (Тем не менее, это также совершенно безвредно.)
Tommcdo
@tommcdo хороший звонок, я еще не пробовал эту функцию, поэтому просто делал снимок. Я удалю эту часть.
Мэтт Бём
17

Терминальные буферы Neovim всегда имеют связанный идентификатор задания, поэтому одним из способов является использование API управления заданиями для отправки текста. Добавьте это к вашему vimrc:

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

Который сохранит идентификатор задания последнего созданного терминала в g:last_terminal_job_idпеременную. Затем вы можете создать некоторые функции / команды / отображения, которые будут отправлять данные, используя jobsendфункцию, вот пример:

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

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

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

Выше будет посылать текущую строку, но вы можете расширить ее, чтобы отправить визуальный выбор.

Тьяго де Арруда
источник
2

Neoterm - это плагин для neovim, который разработан для этой цели. Он реализует новую команду, :TREPLSendкоторая возьмет текущую строку и отправит ее в окно терминала. Прекрасно работает для базового Bash и любого языка, который имеет режим REPL.

placeybordeaux
источник
0

В дополнение к ответам здесь я реализовал плагин для этой цели: vim-sendtowindow .

Он предоставляет оператор send-to-window, который можно комбинировать с любым движением vim для выбора текста для отправки в соседнее окно. Кроме того, он удобно позиционирует курсор после отправляемого текста и является точечно повторяемым.

Небольшой пример ниже:

пример

Каролис Концевичюс
источник