ใน vi ฉันจะได้รับ shell terminal พร้อม:sh
คำสั่ง และต่อมาฉันสามารถกลับไปที่ vi โดยexit
เชลล์
แต่ถ้าฉันใช้เชลล์เทอร์มินัลเป็นเวลานานและฉันลืมไปว่าexit
จะปิดอะไรหรือคืน vi ให้ฉัน
มีวิธีการตรวจสอบว่าฉันจะกลับไปที่ vi หรือไม่? jobs
หรือfg
ไม่ทำงาน
ใน vi ฉันจะได้รับ shell terminal พร้อม:sh
คำสั่ง และต่อมาฉันสามารถกลับไปที่ vi โดยexit
เชลล์
แต่ถ้าฉันใช้เชลล์เทอร์มินัลเป็นเวลานานและฉันลืมไปว่าexit
จะปิดอะไรหรือคืน vi ให้ฉัน
มีวิธีการตรวจสอบว่าฉันจะกลับไปที่ vi หรือไม่? jobs
หรือfg
ไม่ทำงาน
คำตอบ:
ในเปลือกปกติ:
$ env | grep -i vim
EDITOR=vim
หลังการใช้งาน :shell
$ env | grep -i vim
EDITOR=vim
VIMRUNTIME=/usr/share/vim/vim80
VIM=/usr/share/vim
MYVIMRC=/home/martin/.vim/vimrc
เพื่อให้ดูเหมือนว่าเป็นกลุ่มชุดVIMRUNTIME
, VIM
และMYVIMRC
ตัวแปรสภาพแวดล้อม ในบรรดาที่VIM
ดูเหมือนว่าน่าเชื่อถือที่สุดสำหรับฉัน (คุณอาจไม่มี vimrc หรือแม้กระทั่ง vim runtime)
คุณยังสามารถตั้งค่าตัวแปรสภาพแวดล้อมของคุณเอง:
:let $HELLO = "test"
:shell
$ echo $HELLO
test
สิ่งนี้มีประโยชน์อย่างยิ่งในการสื่อสารข้อมูลเกี่ยวกับบัฟเฟอร์ที่คุณกำลังแก้ไข ตัวอย่างเช่น:
:let $VIM_FILETYPE = &filetype
:let $VIM_FILENAME = expand('%:p')
จะปรากฏเป็นอย่างเช่น:
VIM_FILETYPE=go
VIM_FILENAME=/home/martin/a.go
ฉันได้ตั้งค่าพรอมต์คำสั่งของฉันเพื่อเพิ่มสัญลักษณ์ "+" สีแดงที่ระบุว่าฉันอยู่ในกลุ่ม ": sh" ซึ่งตรงข้ามกับเซสชันเชลล์ปกติ รากฐานที่สำคัญของมันคือ "$$" เป็น pid ของกระบวนการปัจจุบันดังนั้น:
MY_PPID=$(ps --no-header -o ppid -p $$) # Gets the pid of the parent
# process.
MY_PCMDLINE=$(ps --no-header -o cmd -p $MY_PPID) # Gets its command line.
MY_CMDDASH=$(awk '{print $1}' <<<$MY_PCMDLINE) # Gets the command name, possibly
# with a preceding hyphen.
MY_CMD=${MY_CMDDASH#-} # Get the bare command name.
เมื่อคุณมีสิ่งนี้คุณสามารถอินไลน์และสร้างสิ่งที่ฉันอธิบายให้ใช้ใน ".bashrc" ของคุณหรือคล้ายกัน
หมายเหตุ : วิธีการตัวแปรสภาพแวดล้อม ($ VIM) อธิบายไว้ที่อื่นดูเหมือนจะดีกว่านี้ แต่ฉันจะปล่อยให้มันทำงานในการระบุว่าคุณเป็นกระบวนการลูกของอะไร (ไม่ใช่แค่เสียงเรียกเข้า)
:sh
: MYVIMRC, VIM และ VIMRUNTIME สิ่งที่คุณต้องทำเพื่อรู้ว่าคุณกำลังใช้งาน sub-shell ของ Vim คือการทดสอบว่ามีสิ่งเหล่านี้อยู่หรือไม่
ดำเนินการหรือดีกว่าps
ps -fH
Ex:
$ ps -fH
UID PID PPID C STIME TTY TIME CMD
garyjohn 31140 31139 0 10:26 pts/11 00:00:00 bash
garyjohn 31267 31140 2 10:26 pts/11 00:00:00 vim hello.txt
garyjohn 31271 31267 0 10:26 pts/11 00:00:00 /bin/bash
garyjohn 31332 31271 0 10:26 pts/11 00:00:00 ps -fH
ข้อดีของการใช้งานแบบps -fH
over-just ps
คือมันช่วยให้คุณเห็นว่าคุณอยู่ใน sub-shell ของvim
หรือถ้าคุณใส่ไว้vim
ในพื้นหลัง ในกรณีนั้นps -fH
จะมีลักษณะเช่นนี้:
$ ps -fH
UID PID PPID C STIME TTY TIME CMD
garyjohn 31140 31139 0 10:26 pts/11 00:00:00 bash
garyjohn 31267 31140 0 10:26 pts/11 00:00:00 vim hello.txt
garyjohn 31924 31140 0 10:29 pts/11 00:00:00 ps -fH