Надсилайте текст з одного розділеного вікна в інше


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.


0

На додаток до відповідей тут я реалізував плагін для цієї мети: vim-sendtowindow .

Він надає оператору передачі до вікна, який може поєднуватися з будь-яким рухом vim, щоб вибрати текст для надсилання у сусіднє вікно. Крім того, він зручно розташовує курсор після надісланого тексту і є крапковим для повторення.

Маленький приклад нижче:

приклад

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.