Skąd mam wiedzieć, że jestem w powłoce z komendy vi: sh?

9

W vi mogę uzyskać terminal powłoki z :shpoleceniem. Później mogę wrócić do vi przez exitpowłokę.

Ale jeśli długo korzystałem z terminalu powłoki i zapomniałem, czy exitcoś zamknę, czy zwrócę vi.

Czy jest jakiś sposób, aby sprawdzić, czy wrócę do vi? jobslub fgnie działa.

hailinzeng
źródło
3
Przestałem używać komendy: sh wiele lat temu z powodu problemów z oddzielną powłoką, którą uruchamia Vim i niemożności powrotu do niej. Zamiast tego zacząłem umieszczać Vima w tle (ctrl-z), aby wrócić do normalnej powłoki. Powrót do Vima z normalnej powłoki jest łatwy przy użyciu funkcji kontroli zadań bash.
bsnyder

Odpowiedzi:

8

W zwykłej powłoce:

$ env | grep -i vim
EDITOR=vim

Po użyciu :shell

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

Wygląda więc na to Vim ustawia VIMRUNTIME, VIMi MYVIMRCzmiennych środowiskowych. Spośród nich VIMwydaje mi się najbardziej niezawodny (możesz nie mieć vimrc ani nawet środowiska uruchomieniowego vim).

Możesz także ustawić własne zmienne środowiskowe:

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

Jest to szczególnie przydatne do przekazywania informacji o edytowanym buforze; na przykład:

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

Pojawi się jako coś takiego:

VIM_FILETYPE=go
VIM_FILENAME=/home/martin/a.go
Martin Tournoij
źródło
3

Mam ustawiony wiersz polecenia, aby dodać czerwony symbol „+”, który wskazuje, czy jestem w vimie „: sh” w przeciwieństwie do normalnej sesji powłoki. Podstawą tego jest to, że „$$” jest pid bieżącego procesu, więc:

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.

Gdy już to zrobisz, możesz łatwo wstawić i skonstruować coś takiego, jak opisałem, do użycia w twoim „.bashrc” lub podobnym.

Uwaga : Metoda zmiennej środowiskowej ($ VIM) opisana gdzie indziej wydaje się lepsza niż ta, ale zostawię to, ponieważ działa w celu identyfikacji, czy jesteś procesem potomnym (nie tylko vim).

Dan
źródło
1
Vim umieszcza trzy zmienne w środowisku powłoki, którą się śmieje :sh: MYVIMRC, VIM i VIMRUNTIME. Wszystko, co musisz zrobić, aby wiedzieć, że korzystasz z podpowłoki Vima, to przetestować obecność któregokolwiek z nich.
garyjohn
2

Wykonaj pslub lepiej ps -fH. Dawny:

$ 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

Zaletą używania ps -fHpo prostu psjest to, że pozwala zobaczyć, czy znajdujesz się w podpowłoce vimlub czy umieszczasz ją vimw tle. W takim przypadku ps -fHwyglądałoby to tak:

$ 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
źródło