ฉันจะทำให้เชลล์นามแฝงพร้อมใช้งานได้อย่างไรเมื่อ shelling จาก Vim


11

ในตัวฉัน.zshrcฉันประกาศนามแฝงบางอย่าง เช่นwhich dbstartแสดงเนื้อหาของนามแฝงนั้น

ถ้าฉันเปิดเป็นกลุ่มจากเชลล์นั้นมันเป็นกระบวนการลูก :! some_commandในกลุ่มผมสามารถเรียกใช้คำสั่งเปลือก ถ้าฉันทำ:! echo $0เพื่อดูว่าเชลล์ Vim ใช้อะไรอยู่มันจะส่งเอาต์พุต '/ bin / zsh' อย่างไรก็ตามชื่อแทนของฉันไม่สามารถใช้งานได้ที่นั่น

ฉันจะทำให้เชลล์ปกติของฉันพร้อมใช้งานได้อย่างไรเมื่อฉัน shell ออกจาก Vim

สองความคิด:

  • อย่างใดEXPORTนามแฝงจากเปลือกเดิมเพื่อกระบวนการของเด็กvimและอีกครั้งเพื่อดำเนินการเปลือกเด็ก
  • กำหนดค่า Vim ให้อ่านของฉัน.zshrcเมื่อสร้าง subshells

รวมของคุณ.zshrcเป็น. profile (ซึ่งดูเหมือนว่าจะใช้โดยvim
Kiwy

คำตอบ:


13

คำถามเก่า แต่วิธีแก้ปัญหาที่สะอาดที่สุดสำหรับ vim ใน zsh คือการเพิ่มนามแฝงไป~/.zshenvยังไฟล์ที่ zsh โหลดสำหรับเชลล์ทั้งหมดล็อกอินล็อกอินหรืออื่น ๆ สิ่งนี้หลีกเลี่ยงการเริ่มต้นเป็นกลุ่มหรือ zsh กับค่าสถานะและปัญหาที่เป็นไปได้ใด ๆ กับที่

มีคำอธิบายที่ดีเกี่ยว~/.zshenvกับ vs ~/.zshrcที่นี่: http://tanguy.ortolo.eu/blog/article25/shrc

โดยทั่วไปมักจะ zsh ~/.zshenvแหล่งที่มา แหล่งหอยแบบโต้ตอบ~/.zshrcและเข้าสู่ระบบแหล่งหอยและ~/.zprofile ~/.zloginดังนั้นจึงเป็นแหล่งที่มาของเปลือกเข้าสู่ระบบแบบโต้ตอบ~/.zshenv ~/.zprofile ~/.zlogin ~/.zloginและไม่โต้ตอบเปลือก nonlogin ~/.zshenvเช่นใช้เป็นกลุ่มหนึ่งที่จะเรียกใช้คำสั่งเพียงแหล่งที่มา


นี่ไม่ใช่คำตอบสำหรับลิงค์เท่านั้น แต่จะดีที่สุดถ้าคุณอนุมานถึงความแตกต่างจากลิงก์ ด้วยวิธีนี้ทุกคนจะได้ประโยชน์จากคำอธิบายที่นี่และเราปลอดภัยจาก linkrot
HalosGhost

1
อัปเดตคำตอบของฉันด้วยประเด็นหลักจากลิงค์
เควินลี

สิ่งนี้ทำงานได้ดีกว่าสำหรับฉันมากกว่าคำตอบอื่น ๆ เมื่อฉันเพิ่มเป็นกลุ่มเพื่อเริ่มเปลือกโต้ตอบมันก็หยุดทันที เมื่อฉันใช้ไฟล์. zshenv (ซึ่งฉันไม่เคยรู้จักมาก่อน) ฉันได้นามแฝงกลับมาแล้ว!
คาเลบ

5

ดูเหมือนว่างานนี้สำหรับ zsh:

  • ตรวจสอบให้แน่ใจว่า$ZDOTDIR=ไดเร็กทอรีที่.zshrcตั้งอยู่ เช่น,export ZDOTDIR=$HOME
  • ใน.vimrc, set shell=zsh\ -iหรือset shellcmdflag+=iสำหรับผลเช่นเดียวกัน

-iเป็นเพราะเมื่อเริ่มต้นในโหมดโต้ตอบ zshell $ZDOTDIR/.zshrcโหลด ดูman zshและค้นหา$ZDOTDIRรายละเอียด


1
อืมมันทำให้เกิดปัญหาแปลก ๆ สำหรับฉัน: การคัดลอกไปยังคลิปบอร์ดของระบบเหมือน"+yตอนนี้จะระงับ Vim! superuser.com/questions/712245/…
นาธานลอง

5
เสียงเรียกเข้าของฉันจะถูกระงับทันทีที่ฉันเปิด
คาเลบ

0

ผมเชื่อว่าเมื่อคุณอยู่ในvimและคุณใช้มันโดยใช้สิ่งที่เปลือกจะถูกกำหนดโดยตัวแปรสภาพแวดล้อม:!some_command$SHELL

สิ่งนี้สามารถกำหนดค่าได้ดังนั้นคุณสามารถเปลี่ยนแปลงได้โดยการแทนที่$SHELLพฤติกรรมใน$HOME/.vimrcไฟล์ของคุณเพื่อใช้zshแทน

:set shell
shell=/bin/bash
:set shell=zsh\ -i

หรือในการ.vimrcใช้ 1 ใน 2 บรรทัดนี้

 set shell=/bin/bash\ -i
 set shell=/bin/zsh\ -i

เป็นกลุ่มช่วย

ดู:help shellจากภายในvimสำหรับข้อมูลเพิ่มเติม

:!{cmd}                 Execute {cmd} with the shell.  See also the 'shell'
                        and 'shelltype' option.
                        Any '!' in {cmd} is replaced with the previous
                        external command (see also 'cpoptions').  But not when
                        there is a backslash before the '!', then that
                        backslash is removed.  Example: ":!ls" followed by
                        ":!echo ! \! \\!" executes "echo ls ! \!".
                        After the command has been executed, the timestamp of
                        the current file is checked timestamp.

ไม่อย่างที่ฉันพูด: "ถ้าฉันทำ:! echo $ 0 เพื่อดูว่าเชลล์ Vim ใช้อะไรมันเอาท์พุท '/ bin / zsh'"
นาธานลอง

@NathanLong - ไม่ฉันคิดว่านั่นทำให้คุณเข้าใจผิดดูการอัพเดตของฉัน
slm

@slm $SHELLเป็นกลุ่มดึงค่าจาก /bin/bashดังนั้นเปลือกของคุณคือ ถ้าเปลือกของฉันคือ/bin/zshสิ่งที่มันจะใช้
Patrick

0

โดยการตั้งค่าshell=/usr/bin/zsh\ -lในการ.vimrcแก้ไขปัญหาของฉัน

บันทึก:

ฉันกำลังใช้: linux mint 17.1


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