¿Cómo sé que estoy en un shell del comando vi: sh?

9

En vi, puedo obtener una terminal de shell con :shcomando. Y luego, puedo volver a vi por exitshell.

Pero, si estuve usando el terminal de shell durante mucho tiempo, y olvidé si exitcerrará algo o me devolverá el vi.

¿Hay alguna forma de verificar si volveré a vi? jobso fgno está funcionando

hailinzeng
fuente
3
Dejé de usar el comando: sh hace muchos años debido a problemas con el shell separado que inicia Vim y la incapacidad de volver a él. En cambio, comencé a poner a Vim en segundo plano (ctrl-z) para volver al shell normal. Volver a Vim desde el shell normal es fácil usando las funciones de control de trabajo bash.
bsnyder

Respuestas:

8

En una cáscara regular:

$ env | grep -i vim
EDITOR=vim

Después de usar :shell

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

Así que parece que Vim establece las VIMRUNTIME, VIMy MYVIMRClas variables de entorno. De ellos, me VIMparece el más confiable (es posible que no tenga un vimrc o incluso vim runtime).

También puede establecer sus propias variables de entorno:

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

Esto es especialmente útil para comunicar información sobre el búfer que está editando; por ejemplo:

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

Aparecerá como algo así como:

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

Tengo mi símbolo del sistema configurado para agregar un símbolo rojo "+" que indica si estoy en un vim ": sh" en lugar de una sesión de shell normal. La piedra angular es que "$$" es el pid del proceso actual, entonces:

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 vez que tenga esto, puede alinearlo fácilmente y construir algo como lo que describí para usar en su ".bashrc" o similar.

Nota : El método de variable de entorno ($ VIM) descrito en otra parte parece mejor que esto, pero lo dejaré, ya que funciona para identificar si usted es un proceso hijo de algo (no solo vim).

Dan
fuente
1
Vim pone tres variables en el entorno del shell con el que se :shinicia: MYVIMRC, VIM y VIMRUNTIME. Todo lo que tiene que hacer para saber que se está ejecutando en un sub-shell de Vim es probar la presencia de cualquiera de ellos.
garyjohn
2

Ejecutar ps, o mejor, 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

La ventaja de usar ps -fHover over pses que te permite ver si estás en un sub-shell vimo si lo pones vimen segundo plano. En ese caso, ps -fHse vería así:

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