Bagaimana saya tahu saya di shell dari perintah vi: sh?

9

In vi, saya bisa mendapatkan terminal shell dengan :shperintah. Dan nanti, saya bisa kembali ke vi dengan exitshell.

Tetapi, jika saya menggunakan terminal shell untuk waktu yang lama, dan saya lupa apakah exitakan menutup sesuatu atau mengembalikan saya vi.

Apakah ada cara untuk memeriksa apakah saya akan kembali ke vi? jobsatau fgtidak berfungsi.

hailinzeng
sumber
3
Saya berhenti menggunakan perintah: sh bertahun-tahun yang lalu karena masalah dengan shell terpisah yang Vim mulai dan ketidakmampuan untuk kembali ke sana. Sebagai gantinya, saya mulai meletakkan Vim di latar belakang (ctrl-z) untuk kembali ke shell normal. Kembali ke Vim dari shell normal mudah menggunakan fungsi kontrol pekerjaan bash.
bsnyder

Jawaban:

8

Dalam shell biasa:

$ env | grep -i vim
EDITOR=vim

Setelah menggunakan :shell

$ env | grep -i vim
EDITOR=vim
VIMRUNTIME=/usr/share/vim/vim80
VIM=/usr/share/vim
MYVIMRC=/home/martin/.vim/vimrc

Jadi sepertinya Vim menetapkan VIMRUNTIME, VIMdan MYVIMRCvariabel lingkungan. Dari mereka, VIMtampaknya yang paling dapat diandalkan untuk saya (Anda mungkin tidak memiliki vimrc atau bahkan vim runtime).

Anda juga dapat mengatur variabel lingkungan Anda sendiri:

:let $HELLO = "test"
:shell
$ echo $HELLO
test

Ini sangat berguna untuk mengkomunikasikan info tentang buffer yang sedang Anda edit; sebagai contoh:

:let $VIM_FILETYPE = &filetype
:let $VIM_FILENAME = expand('%:p')

Akan muncul sebagai sesuatu seperti:

VIM_FILETYPE=go
VIM_FILENAME=/home/martin/a.go
Martin Tournoij
sumber
3

Saya meminta command prompt saya untuk menambahkan simbol "+" merah yang menunjukkan jika saya berada di vim ": sh" sebagai lawan dari sesi shell normal. Landasannya adalah bahwa "$$" adalah pid dari proses saat ini sehingga:

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.

Setelah Anda memiliki ini, Anda dapat dengan mudah inline dan membangun sesuatu seperti yang saya jelaskan untuk digunakan dalam ".bashrc" Anda atau serupa.

Catatan : Metode variabel lingkungan ($ VIM) yang dijelaskan di tempat lain tampaknya lebih baik daripada ini, tetapi saya akan membiarkannya karena ini berfungsi dalam mengidentifikasi apakah Anda adalah anak proses apa pun (bukan hanya vim).

Dan
sumber
1
Vim menempatkan tiga variabel ke dalam lingkungan shell yang digabungkan dengan :sh: MYVIMRC, VIM dan VIMRUNTIME. Yang harus Anda lakukan untuk mengetahui Anda menjalankan sub-shell Vim adalah menguji keberadaan semua itu.
garyjohn
2

Jalankan ps, atau lebih baik 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

Keuntungan menggunakan ps -fHlebih dari itu psadalah memungkinkan Anda melihat apakah Anda berada di sub-shell vimatau jika Anda meletakkannya vimdi latar belakang. Dalam hal ini, ps -fHakan terlihat seperti ini:

$ 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
garyjohn
sumber