ส่งข้อความจากหน้าต่างหนึ่งไปยังอีกหน้าต่างหนึ่ง


17

เมื่อเร็ว ๆ นี้มี add-on เพื่อ NeoVim ซึ่งอนุญาตให้เปิด terminal ใน vim buffer สิ่งนี้มีความเป็นไปได้ที่น่าสนใจในการส่งข้อความจากหน้าต่าง vim หนึ่งไปยังการจำลองแบบอื่นเช่น REPL like behavior

ในอดีตฉันใช้ 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>ไม่จำเป็นต้องใช้สิ่งต่อไปนี้ (ที่กล่าวว่ามันไม่เป็นอันตรายโดยสิ้นเชิง)
tommcdo

@ tommcdo โทรดีไม่ได้ลองใช้คุณสมบัติของตัวเองเลยแค่ถ่ายภาพ ฉันจะลบส่วนนั้น
Matt Boehm

17

บัฟเฟอร์เทอร์มินัล Neovim มี id งานที่เชื่อมโยงอยู่เสมอดังนั้นวิธีหนึ่งคือใช้ API การควบคุมงานเพื่อส่งข้อความ เพิ่มไปยัง vimrc ของคุณ:

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

ซึ่งจะบันทึก id งานของเทอร์มินัลที่สร้างล่าสุดลงใน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ซึ่งจะนำบรรทัดปัจจุบันและส่งไปที่หน้าต่างเทอร์มินัล ทำงานได้ดีสำหรับทุบตีพื้นฐานและภาษาใด ๆ ที่มีโหมด REPL


0

นอกเหนือไปจากคำตอบที่นี่ฉันได้ดำเนินการปลั๊กอินสำหรับวัตถุประสงค์นี้: เป็นกลุ่ม-sendtowindow

มันมีโอเปอเรเตอร์send-to-windowที่สามารถใช้ร่วมกับการเคลื่อนไหว vim ใด ๆ เพื่อเลือกข้อความสำหรับส่งไปยังหน้าต่างที่อยู่ติดกัน นอกจากนี้ยังวางตำแหน่งเคอร์เซอร์อย่างสะดวกสบายหลังข้อความที่ส่งและเป็นจุดที่ทำซ้ำได้

ตัวอย่างเล็ก ๆ ด้านล่าง:

ตัวอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.