एक स्प्लिट विंडो से दूसरे में टेक्स्ट भेजें


17

हाल ही में NeoVim में एक ऐड-ऑन था जो विम बफर में टर्मिनल खोलने की अनुमति देता है। इसमें एक विम विंडो से दूसरे रेप्लिकेटिंग के लिए पाठ भेजने की संभावनाएं हैं, उदाहरण के लिए, व्यवहार की तरह एक REPL।

अतीत में मैं इस तरह के विन्यास के लिए tmux का उपयोग कर रहा था। हालाँकि अब मैं केवल NeoVim का उपयोग करके इसे आज़माना चाहूंगा।

मेरा सवाल है - मैं एक विम से दूसरे में पाठ का एक ब्लॉक कैसे भेज सकता हूं? या शायद इसके बजाय - मैं पाठ का चयन करने, अनुक्रम देने, विभाजन बदलने और फिर चिपकाने का क्रम कैसे स्वचालित कर सकता हूं?

जवाबों:


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>आवश्यक नहीं होना चाहिए। (यह कहा, यह भी पूरी तरह से हानिरहित है।)
tomcdo

@tommcdo अच्छी कॉल, अभी तक खुद को फीचर की कोशिश नहीं की थी इसलिए सिर्फ एक शॉट ले रहा था। मैं उस हिस्से को हटा दूंगा।
मैट बोहम

17

नियोविम टर्मिनल बफ़र्स में हमेशा एक संबद्ध जॉब आईडी होती है, इसलिए एक तरीका यह है कि टेक्स्ट भेजने के लिए जॉब कंट्रोल एपीआई का उपयोग किया जाए। इसे अपने 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

नियोटर्म नियोविम के लिए एक प्लगइन है जो इस उद्देश्य के लिए विकसित किया गया है। यह एक नई कमांड लागू करता है :TREPLSendजो वर्तमान लाइन को ले जाएगा और इसे टर्मिनल विंडो पर भेज देगा। बेसिक बैश और रेप्लस मोड वाली किसी भी भाषा के लिए ठीक काम करता है।


0

यहाँ जवाब के अलावा मैंने इस उद्देश्य के लिए एक प्लगइन लागू किया है: vim-sendtowindow

यह एक भेज-टू-विंडो ऑपरेटर प्रदान करता है जिसे किसी भी विम गति के साथ जोड़ा जा सकता है ताकि आसन्न खिड़की पर भेजने के लिए पाठ का चयन किया जा सके। इसके अलावा यह भेजे गए टेक्स्ट के बाद कर्सर को सुविधाजनक रूप से रखता है और डॉट रिपीटेबल है।

नीचे एक छोटा सा उदाहरण:

उदाहरण

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.