Bir bölünmüş pencereden diğerine metin gönderme


17

Son zamanlarda bir vim tamponunda terminalin açılmasına izin veren NeoVim'e bir eklenti vardı. Bu, bir vim penceresinden başka bir çoğaltma, örneğin REPL benzeri bir davranışa metin göndermek için çekici olasılıklara sahiptir.

Geçmişte bu tür bir yapılandırma için tmux kullanıyordum. Ancak şimdi sadece NeoVim kullanarak denemek istiyorum.

Sorum şu - bir vimden diğerine bir metin bloğunu nasıl gönderebilirim? Ya da daha doğrusu - metin seçme, sorma, bölmeleri değiştirme ve sonra yapıştırma sırasını nasıl otomatikleştirebilirim?

Yanıtlar:


15

Temel olarak metin seçtiğinizde, kopyalamak, terminale geçmek, yapıştırmak ve muhtemelen pencereleri geri değiştirmek ve metni yeniden seçmek için bir tuş sırasını yeniden eşlemek istersiniz. Açık iki bölmeniz varsa, bu şöyle görünecektir:

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

İkiden fazla bölme varsa ve terminal metninizin seçildiği noktadan sonra değilse, mizanpajınız için çalışan (yani <c-w>tsol üst pencereye hareket eden) farklı bir eşleme kullanmak istersiniz veya tüm pencerelerden dönüp doğru olanı bulan bir fonksiyon yazmak için.


Gördüğüm kadarıyla, pbir terminal arabelleğinde kullanmak Terminal moduna girmez, bu nedenle aşağıdakiler <C-\><C-N>gerekli olmamalıdır. (Dedi ki, o da tamamen zararsız.)
tommcdo

@tommcdo iyi çağrı, henüz kendimi denememişti, bu yüzden sadece bir çekim yapıyordu. O parçayı çıkaracağım.
Matt Boehm

17

Neovim terminal arabellekleri her zaman ilişkili bir iş kimliğine sahiptir, bu nedenle bir yol metni göndermek için iş kontrol API'sini kullanmaktır. Bunu vimrc'nize ekleyin:

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

Bu, son oluşturulan terminalin iş kimliğini g:last_terminal_job_iddeğişkene kaydeder. Ardından, jobsendişlevi kullanarak verileri gönderecek bazı işlevler / komutlar / eşlemeler oluşturabilirsiniz , işte bir örnek:

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

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

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

Yukarıdakiler geçerli satırı gönderir, ancak görsel seçim göndermek için genişletebilirsiniz.


2

Neoterm , bu amaç için geliştirilen neovim için bir eklentidir. :TREPLSendGeçerli satırı alıp bir terminal penceresine gönderecek yeni bir komut uygular . Temel bash ve REPL modu olan herhangi bir dil için iyi çalışır.


0

Buradaki cevaplara ek olarak, bu amaçla bir eklenti uyguladım: vim-sendtowindow .

Bu bir sağlar Send-to-pencereye bitişik pencereye göndermek için metni seçmek için herhangi vim hareket ile kombine edilebilir operatörü. Ek olarak, imleci gönderilen metnin arkasına uygun şekilde konumlandırır ve nokta tekrarlanabilir.

Aşağıda küçük bir örnek:

misal

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.