Как я узнаю, что я в оболочке из команды vi: sh?

9

В vi я могу получить оболочку терминала с помощью :shкоманды. А позже я могу вернуться к vi с помощью exitоболочки.

Но, если я долгое время пользовался терминалом оболочки, и я забыл, exitзакроет ли что-нибудь или вернет мне ви.

Есть ли способ проверить, вернусь ли я к vi? jobsили fgне работает.

hailinzeng
источник
3
Я перестал использовать команду: sh много лет назад из-за проблем с отдельной оболочкой, которую запускает Vim, и невозможности вернуться к ней. Вместо этого я начал помещать 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

Так это выглядит , как Vim устанавливает 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

Моя командная строка настроена на добавление красного символа «+», который указывает, что я нахожусь в vim «: 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), описанный в другом месте, кажется лучше, чем этот, но я оставлю это, поскольку он работает для определения, являетесь ли вы дочерним процессом чего-либо (не только vim).

Дэн
источник
1
Vim помещает три переменные в среду оболочки, с которой он запускается :sh: MYVIMRC, VIM и VIMRUNTIME. Все, что вам нужно сделать, чтобы знать, что вы работаете в под-оболочке Vim, это проверить наличие любого из них.
garyjohn
2

Выполнить psили лучше 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  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заключается в том, что он позволяет вам видеть, находитесь ли вы в под-оболочке 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
garyjohn
источник