ฉันสามารถออกเชลล์แบบโต้ตอบในหน้าต่าง Vim ได้หรือไม่?


17

ฉันรู้ว่าฉันสามารถ:!หรือ:r!ดำเนินการคำสั่งภายนอกและเลือกที่จะแทรกเอาต์พุตลงในข้อความ ฉันสามารถแสดงได้:!shและฉันจะวางไข่กระสุนที่จะมีชีวิตอยู่จนกว่าฉันจะออก - แต่ในขณะที่กระสุนทำงานอยู่ Vim คือ 'หลับ' และไม่สามารถเข้าถึงได้ ฉันต้องออกจากเปลือกหอยและวางไข่ใหม่ถ้าฉันต้องการกลับไปเป็นกลุ่มชั่วครู่ - ไม่มีประโยชน์มาก

ฉันสามารถเข้าถึงเปลือกปลายตรงข้ามโดยระงับการเป็นกลุ่มที่มี^Zและจัดการงานที่เป็นกลุ่มผ่านbg, และfg jobsมันสมเหตุสมผลมากกว่า แต่ยุ่งยากในระยะยาว ฉันสามารถใช้Screenถ้ามันมีอยู่ (มักจะไม่) หรือเปิดหลายหน้าต่างของตัวจัดการหน้าต่างของฉัน (และ ssh เพื่อกำหนดเป้าหมายโฮสต์จากแต่ละหน้าต่างตามลำดับเพื่อให้ทั้งกลุ่มและเชลล์บนโฮสต์ระยะไกลยุ่งยากอีกครั้ง)

มันจะเรียบร้อยถ้า Vim อนุญาตให้ฉันเปิดเซสชันของเชลล์และเก็บไว้พูดในหน้าต่าง (ภายใน) ของหน้าต่างหรืออนุญาตให้ฉันสลับไปมาและย้อนกลับ เป็นไปได้อย่างนี้ไหม?


1
ดังนั้นโดยทั่วไปคุณต้องการเปิดเชลล์ใน a :splitในขณะที่เก็บไฟล์ไว้ในหน้าต่างอื่นหรือไม่? ... นี่ฟังดูเหมือนเป็นงานสำหรับ tmux หรือ screen to me ...
Martin Tournoij

1
@Carpetsmoker: ฉันมักจะไม่สามารถควบคุมสิ่งที่ติดตั้งบนระบบระยะไกลและบ่อยกว่าไม่ทั้งสองคือในขณะที่เป็นกลุ่มอยู่ที่นั่นเสมอ
เอสเอฟ

ลองเปลี่ยนมาใช้ Neovim ตอนนี้มีเทอร์มินัลอีมูเลเตอร์ซึ่งทำงานได้ค่อนข้างดีและสามารถเปิดในบัฟเฟอร์แบบกลุ่มได้
ซัค

คำตอบ:


16

มีปลั๊กอินที่เป็นกลุ่มสองอันที่อนุญาตให้ทำสิ่งนี้ ฉันใช้Conque ( Github )

หลังจากวางไว้ในไดเรกทอรีปลั๊กอินของคุณสิ่งที่คุณต้องทำคือ:

:ConqueTermSplit bash

และคุณจะมี bash shell แบบโต้ตอบในกลุ่ม จากนั้นคุณสามารถใช้ท่าทางท่าทางปกติของคุณเพื่อทำสิ่งอื่นที่คุณอาจต้องการทำในหน้าต่าง

นอกจากนี้ยังมีปลั๊กอินอื่น ๆ ที่เป็นvimshell


1
ไม่มีวิธีการทำสิ่งนี้โดยไม่ต้องใช้ปลั๊กอินหรือไม่?
เอสเอฟ

3
@SF :help shell-windowดู (คำตอบสั้น ๆ : ไม่)
muru

3

ด้วย VIM ฉันเชื่อว่าปลั๊กอินที่ทำสิ่งนี้ไม่ใช่สิ่งที่ยอดเยี่ยมถึงแม้ว่า IMO vimshell จะใกล้เคียงที่สุด อย่างไรก็ตามคุณต้องเข้าใจว่ามันเป็นปัญหา 2 ส่วน

  1. VIM ไม่ได้รับการออกแบบมาให้สามารถทำสิ่งนี้โดยเฉพาะอย่างยิ่งความยุ่งยากสามารถดำเนินงานที่ต้องใช้เวลานานและพูดคุยกับมันแบบอะซิงโครนัสโดยไม่ปิดกั้น VIM ในกรณีนี้มันไม่เพียง แต่เชลล์เอง แต่ยังงานอื่น ๆ ที่คุณอาจดำเนินการภายในกระบวนการเชลล์
  2. ปรัชญาคำกริยาของ VIM นั้นเล่นได้ไม่ดีนักกับวิธีที่เราโต้ตอบกับกระสุน ในเปลือกเท่านั้นบรรทัดปัจจุบันสามารถแก้ไขได้แม้ว่าคุณจะสามารถเลื่อนและดูข้อความเก่าของประวัติของคุณด้วยเปลือกคุณไม่สามารถแก้ไขได้ สิ่งนี้ไม่สอดคล้องกับปรัชญาของ VIM เลยถ้าคุณกด ESC และกลับไปที่โหมดปกติมันจะค่อนข้างยากที่จะไม่อนุญาตให้ผู้ใช้ย้อนกลับและแก้ไขส่วนต่างๆของประวัติด้านบน

ในความคิดของฉันมี 2 วิธีที่ทำงานได้ดีขึ้นในเรื่องนี้

  1. การใช้ TMUX / Screen และหน้าต่างเทอร์มินัลมัลติเพล็กซ์เพื่อให้มีทั้งกลุ่มและเชลล์ ด้วยวิธีนี้ทั้งสองจะถูกแยกออกจากกันอย่างเป็นระเบียบและคุณยังสามารถดูทั้งสองด้วยความพยายามเพียงเล็กน้อยและทั้งสองสามารถทำงานได้อย่างเต็มศักยภาพโดยไม่ขัดแย้งกับการไหลของกันและกัน
  2. การใช้ปลั๊กอินเช่นtpope / vim-dispatchและไลค์ที่คุณสามารถเรียกใช้งานได้อย่างง่ายดายหนึ่งคำสั่งเชลล์และให้มันทำงานแบบอะซิงโครนัสในพื้นหลังในเทอร์มินัลเชลล์จริงและดึงผลลัพธ์กลับมาเป็นกลุ่มเมื่อเสร็จสมบูรณ์ สิ่งนี้ยังช่วยให้คุณแยกระดับเดียวกันระหว่างสองและด้วยเหตุนี้ทั้งสองจึงสามารถทำงานได้อย่างเต็มความสามารถโดยไม่ต้องเหยียบนิ้วเท้าของกันและกัน

ฉันควรเพิ่มว่ามีโอกาสที่ดีที่ NeoVIM อาจนำมาซึ่งการเปลี่ยนแปลงในด้านนี้เนื่องจากหนึ่งในเป้าหมายหลักคือความสามารถในการปฏิบัติงานแบบอะซิงโครนัส แต่จนถึงตอนนี้เป็นสิ่งที่ดีที่สุดที่เราจะได้รับในความคิดของฉัน


3

ใน:help shell-windowเราสามารถอ่านเกี่ยวกับการดำเนินการคำสั่งเชลล์ในหน้าต่าง:

มีคำถามเกี่ยวกับความเป็นไปได้ในการเรียกใช้เชลล์ในหน้าต่างภายในกลุ่ม

คำตอบ: คุณทำไม่ได้!

การรวมสิ่งนี้จะเพิ่มโค้ดจำนวนมากให้กับ Vim ซึ่งเป็นเหตุผลที่ดีที่จะไม่ทำเช่นนี้ ท้ายที่สุด, Vim เป็นตัวแก้ไข , มันไม่ควรที่จะทำงานที่ไม่แก้ไข อย่างไรก็ตามเพื่อให้ได้สิ่งนี้คุณอาจลองแยกหน้าจอเทอร์มินัลหรือหน้าต่างแสดงด้วยโปรแกรม " splitvt "

อีกทางเลือกหนึ่งคือคำสั่ง " หน้าต่าง " ซึ่งพบในระบบ BSD Unix ซึ่งรองรับหน้าต่างที่ซ้อนทับหลายหน้าต่าง หรือโปรแกรม " หน้าจอ "

อย่างไรก็ตามมีวิธีแก้ปัญหาเล็กน้อยที่คุณสามารถใช้:

  • ใช้screenซึ่งออกแบบมาเป็นพิเศษสำหรับสิ่งนั้นเช่น:

    • Ctrl+ a,Sเพื่อแยกหน้าต่างปัจจุบันในแนวนอน
    • Ctrl+ a,Tabเพื่อสลับระหว่างหน้าต่าง
    • Ctrl+ a,Xเพื่อลบภูมิภาคปัจจุบัน
    • Ctrl+ a, Qที่จะลบทุกภูมิภาค แต่อย่างหนึ่ง

    ดูเพิ่มเติมได้ที่: GNU Screen Survival Guideที่ stackoverflow SE

    หรือ: GNU Screen Splitting , อ้างอิงหน้าจอด่วนสำหรับรายละเอียดเพิ่มเติม

  • VIM-Shell - แพตช์ของบุคคลที่สาม

    VIM-shell เป็นส่วนเสริมสำหรับ VIM ซึ่งมีคุณสมบัติแยก windows และแพตช์นี้ทำให้สามารถเริ่มเชลล์ใน windows เหล่านั้นได้ มันใช้ได้เฉพาะกับระบบ POSIX

  • vterm - โปรแกรมจำลองเทอร์มินัลภายในกลุ่ม

    เป้าหมายของการ vterm คือการให้การโคลนของเทอร์มินัลยูนิกซ์ภายในกลุ่มที่ทำงานได้ทันทีจากกล่องโดยไม่ต้องพึ่งพาใด ๆ

  • Vimux - โต้ตอบกับ tmux จาก vim ได้อย่างง่ายดาย

    แรงบันดาลใจจากtslime.vimปลั๊กอินที่ให้คุณส่งอินพุตไปยัง tmux, vimux คือการโต้ตอบกับ tmux จาก vim ได้อย่างง่ายดาย

  • อื่น ๆ ที่กล่าวถึงแล้ว: Conque

ที่เกี่ยวข้อง: วิธีการเรียกใช้ terminal ภายในเป็นกลุ่ม? ที่ stackoverflow


วิธีการกำจัดของการแยก ?? : - /
0xc0de

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