Як дізнатися, що я в оболонці з команди vi: sh?


9

У vi, я можу отримати термінал оболонки з :shкомандою. А пізніше я можу повернутися до vi за exitоболонкою.

Але, якщо я довго використовував термінал оболонки, і я забув, чи exitзакрию щось, чи поверне мені ві.

Чи є спосіб перевірити, чи повернусь я до vi? jobsабо fgне працює.


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 час виконання).

Ви також можете встановити власні змінні середовища:

: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" на відміну від звичайного сеансу оболонки. Наріжний камінь цього полягає в тому, що "$$" є підписом поточного процесу, так що:

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.

Після цього ви зможете легко вбудувати та сконструювати щось подібне до того, як я описав, щоб використовувати у вашому ".

Примітка . Метод змінної середовища ($ 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.