Gửi văn bản từ một cửa sổ chia sang một cửa sổ khác


17

Gần đây có một tiện ích bổ sung cho NeoVim cho phép mở terminal trong bộ đệm vim. Điều này có khả năng hấp dẫn để gửi văn bản từ một cửa sổ vim sang một bản sao khác, ví dụ, một hành vi giống như REPL.

Trong quá khứ tôi đã sử dụng tmux cho loại cấu hình này. Tuy nhiên bây giờ tôi muốn dùng thử chỉ sử dụng NeoVim.

Câu hỏi của tôi là - làm thế nào tôi có thể gửi một khối văn bản từ một vim tách sang một khác? Hoặc có thể đúng hơn - làm thế nào tôi có thể tự động hóa trình tự chọn văn bản, kéo nó, thay đổi phân tách và sau đó dán?

Câu trả lời:


15

Về cơ bản khi bạn đã chọn văn bản, bạn muốn sắp xếp lại một chuỗi khóa để sao chép, chuyển sang thiết bị đầu cuối, dán và sau đó có thể chuyển cửa sổ trở lại và chọn lại văn bản. Nếu bạn có hai phần tách mở, nó sẽ trông giống như:

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

Nếu có nhiều hơn hai lần phân tách và thiết bị đầu cuối không phải là phân chia sau khi văn bản của bạn được chọn, bạn muốn sử dụng một ánh xạ khác hoạt động cho bố cục của mình (nghĩa là <c-w>tdi chuyển đến cửa sổ trên cùng bên trái) hoặc bạn muốn để viết một hàm lặp qua tất cả các cửa sổ và tìm đúng.


Từ những gì tôi có thể thấy, sử dụng ptrong bộ đệm đầu cuối không vào chế độ Terminal, vì vậy <C-\><C-N>không cần thiết phải có những điều sau đây . (Điều đó nói rằng, nó cũng hoàn toàn vô hại.)
tommcdo

@tommcdo cuộc gọi tốt, bản thân tôi chưa thử tính năng này nên chỉ chụp. Tôi sẽ xóa phần đó.
Matt Boehm

17

Bộ đệm thiết bị đầu cuối Neovim luôn có id công việc liên quan, vì vậy một cách là sử dụng API kiểm soát công việc để gửi văn bản. Thêm phần này vào vimrc của bạn:

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

Điều này sẽ lưu id công việc của thiết bị đầu cuối được tạo cuối cùng vào g:last_terminal_job_idbiến. Sau đó, bạn có thể tạo một số hàm / lệnh / ánh xạ sẽ gửi dữ liệu bằng jobsendhàm, đây là một ví dụ:

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

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

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

Ở trên sẽ gửi dòng hiện tại, nhưng bạn có thể mở rộng nó để gửi lựa chọn trực quan.


2

Neoterm là một plugin cho neovim được phát triển cho mục đích này. Nó thực hiện một lệnh mới :TREPLSendsẽ lấy dòng hiện tại và gửi nó đến một cửa sổ đầu cuối. Hoạt động tốt cho bash cơ bản và bất kỳ ngôn ngữ nào có chế độ REPL.


0

Ngoài các câu trả lời ở đây, tôi đã triển khai một plugin cho mục đích này: vim-sendtowindow .

Nó cung cấp một toán tử gửi đến cửa sổ có thể được kết hợp với bất kỳ chuyển động vim nào để chọn văn bản để gửi đến cửa sổ liền kề. Ngoài ra, nó thuận tiện định vị con trỏ sau văn bản đã gửi và có thể lặp lại dấu chấm.

Một ví dụ nhỏ dưới đây:

thí dụ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.