Come faccio a sapere che sono in una shell dal comando vi: sh?


9

In vi, posso ottenere un terminale shell con :shcomando. E più tardi, posso tornare a vi con la exitshell.

Ma, se stavo usando il terminale shell da molto tempo, e ho dimenticato se exitchiudevo qualcosa o mi restituiva il vi.

C'è un modo per verificare se tornerò a vi? jobso fgnon funziona.


3
Ho smesso di usare il comando: sh molti anni fa a causa di problemi con la shell separata avviata da Vim e dell'incapacità di ritornarci. Invece, ho iniziato a mettere Vim in background (ctrl-z) per tornare alla shell normale. Tornare a Vim dalla normale shell è facile usando le funzioni di controllo del lavoro bash.
bsnyder,

Risposte:


8

In una shell normale:

$ env | grep -i vim
EDITOR=vim

Dopo aver usato :shell

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

Così sembra che Vim imposta i VIMRUNTIME, VIMe MYVIMRCle variabili di ambiente. Di quelli, mi VIMsembra il più affidabile (potresti non avere un vimrc o addirittura un runtime di vim).

Puoi anche impostare le tue variabili d'ambiente:

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

Ciò è particolarmente utile per comunicare informazioni sul buffer che si sta modificando; per esempio:

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

Verrà visualizzato come qualcosa di simile:

VIM_FILETYPE=go
VIM_FILENAME=/home/martin/a.go

3

Ho impostato il mio prompt dei comandi per aggiungere un simbolo "+" rosso che indica se sono in un vim ": sh" invece di una normale sessione di shell. La chiave di volta è che "$$" è il pid del processo attuale, quindi:

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.

Una volta che hai questo puoi facilmente incorporare e costruire qualcosa come ho descritto da usare nel tuo ".bashrc" o simile.

Nota : il metodo della variabile di ambiente ($ VIM) descritto altrove sembra migliore di questo, ma lo lascerò in quanto funziona per identificare se sei un processo figlio di qualcosa (non solo vim).


1
Vim inserisce tre variabili nell'ambiente della shell con cui lancia :sh: MYVIMRC, VIM e VIMRUNTIME. Tutto quello che devi fare per sapere che stai correndo in una sotto-shell di Vim è testare la presenza di una di quelle.
garyjohn,

2

Esegui ps, o meglio, 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

Il vantaggio di usare ps -fHover psè che ti permette di vedere se sei in una sotto-shell vimo se metti vimin background. In tal caso, ps -fHsarebbe simile al seguente:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.