ฉันจะรู้ได้อย่างไรว่าฉันอยู่ในเชลล์จากคำสั่ง vi: sh?


9

ใน vi ฉันจะได้รับ shell terminal พร้อม:shคำสั่ง และต่อมาฉันสามารถกลับไปที่ vi โดยexitเชลล์

แต่ถ้าฉันใช้เชลล์เทอร์มินัลเป็นเวลานานและฉันลืมไปว่าexitจะปิดอะไรหรือคืน vi ให้ฉัน

มีวิธีการตรวจสอบว่าฉันจะกลับไปที่ vi หรือไม่? jobsหรือfgไม่ทำงาน


3
ฉันหยุดใช้คำสั่ง: sh เมื่อหลายปีก่อนเนื่องจากปัญหาเกี่ยวกับเชลล์แยกต่างหากที่ Vim เริ่มทำงานและการไม่สามารถย้อนกลับไปได้ แต่ฉันเริ่มวางเป็นกลุ่มในพื้นหลัง (ctrl-z) เพื่อกลับไปที่เปลือกปกติ การกลับไปยัง Vim จากเชลล์ปกตินั้นเป็นเรื่องง่ายโดยใช้ฟังก์ชั่นควบคุม bash
bsnyder

คำตอบ:


8

ในเปลือกปกติ:

$ 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

3

ฉันได้ตั้งค่าพรอมต์คำสั่งของฉันเพื่อเพิ่มสัญลักษณ์ "+" สีแดงที่ระบุว่าฉันอยู่ในกลุ่ม ": 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) อธิบายไว้ที่อื่นดูเหมือนจะดีกว่านี้ แต่ฉันจะปล่อยให้มันทำงานในการระบุว่าคุณเป็นกระบวนการลูกของอะไร (ไม่ใช่แค่เสียงเรียกเข้า)


1
Vim นำตัวแปรสามตัวเข้าสู่สภาพแวดล้อมของเชลล์ที่ lauches ด้วย:sh: MYVIMRC, VIM และ VIMRUNTIME สิ่งที่คุณต้องทำเพื่อรู้ว่าคุณกำลังใช้งาน sub-shell ของ Vim คือการทดสอบว่ามีสิ่งเหล่านี้อยู่หรือไม่
garyjohn

2

ดำเนินการหรือดีกว่าps ps -fHEx:

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