Como sei que estou em um shell do comando vi: sh?

9

No vi, posso obter um terminal shell com o :shcomando E depois, eu posso retornar ao vi por exitshell.

Mas, se eu estava usando o terminal shell por um longo tempo, e esqueci se exitfecharia alguma coisa ou me devolveria o vi.

Existe alguma maneira de verificar se eu retornarei ao vi? jobsou fgnão está funcionando.

hailinzeng
fonte
3
Parei de usar o comando: sh há muitos anos devido a problemas com o shell separado que o Vim inicia e a incapacidade de retornar a ele. Em vez disso, comecei a colocar o Vim em segundo plano (ctrl-z) para voltar ao shell normal. É fácil voltar ao Vim a partir do shell normal usando as funções de controle do trabalho do bash.
bsnyder

Respostas:

8

Em uma concha regular:

$ env | grep -i vim
EDITOR=vim

Depois de usar :shell

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

Portanto, parece que Vim define os VIMRUNTIME, VIMe MYVIMRCvariáveis de ambiente. Dessas, me VIMparece a mais confiável (você pode não ter um tempo de execução do vimrc ou mesmo do vim).

Você também pode definir suas próprias variáveis ​​de ambiente:

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

Isso é especialmente útil para comunicar informações sobre o buffer que você está editando; por exemplo:

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

Aparecerá algo como:

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

Eu tenho meu prompt de comando configurado para adicionar um símbolo "+" vermelho que indica se estou em um vim ": sh" em oposição a uma sessão normal do shell. A pedra angular é que "$$" é o pid do processo atual, portanto:

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.

Depois de ter isso, você pode facilmente incorporar e construir algo como eu descrevi para usar no seu ".bashrc" ou similar.

Nota : O método da variável de ambiente ($ VIM) descrito em outro lugar parece melhor que isso, mas deixarei isso, pois ele identifica se você é um processo filho de alguma coisa (não apenas do vim).

Dan
fonte
11
O Vim coloca três variáveis ​​no ambiente do shell com o qual lança :sh: MYVIMRC, VIM e VIMRUNTIME. Tudo o que você precisa fazer para saber que está executando um sub-shell do Vim é testar a presença de qualquer um deles.
5607 garyjohn
2

Execute ps, ou melhor 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

A vantagem de usar ps -fHover just psé que ele permite ver se você está em uma subcasca vimou se coloca vimem segundo plano. Nesse caso, ps -fHficaria assim:

$ 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
fonte