Comment savoir si je suis dans un shell de la commande vi: sh?

9

Dans vi, je peux obtenir un terminal shell avec :shcommande. Et plus tard, je peux retourner à vi par exitshell.

Mais, si j'utilisais le terminal shell depuis longtemps, et j'ai oublié si exitje fermerai quoi que ce soit ou me renverra le vi.

Existe-t-il un moyen de vérifier si je reviendrai à vi? jobsou fgne fonctionne pas.

hailinzeng
la source
3
J'ai arrêté d'utiliser la commande: sh il y a de nombreuses années en raison de problèmes avec le shell séparé que Vim démarre et de l'impossibilité d'y revenir. Au lieu de cela, j'ai commencé à mettre Vim en arrière-plan (ctrl-z) pour revenir au shell normal. Il est facile de revenir à Vim à partir du shell normal en utilisant les fonctions de contrôle des tâches bash.
bsnyder

Réponses:

8

Dans une coque régulière:

$ env | grep -i vim
EDITOR=vim

Après avoir utilisé :shell

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

Il semble donc que Vim fixe les VIMRUNTIME, VIMet les MYVIMRCvariables d'environnement. Parmi ceux-ci, il VIMme semble le plus fiable (vous n'avez peut-être pas de runtime vimrc ou même vim).

Vous pouvez également définir vos propres variables d'environnement:

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

Ceci est particulièrement utile pour communiquer des informations sur le tampon que vous modifiez; par exemple:

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

S'affichera comme quelque chose comme:

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

J'ai mon invite de commande configurée pour ajouter un symbole "+" rouge qui indique si je suis dans un vim ": sh" par opposition à une session shell normale. La pierre angulaire de celui-ci est que "$$" est le pid du processus actuel, donc:

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.

Une fois que vous avez cela, vous pouvez facilement intégrer et construire quelque chose comme je l'ai décrit pour l'utiliser dans votre ".bashrc" ou similaire.

Remarque : La méthode de la variable d'environnement ($ VIM) décrite ailleurs semble meilleure que cela, mais je vais laisser cela car elle fonctionne pour identifier si vous êtes un processus enfant de quelque chose (pas seulement vim).

Dan
la source
1
Vim place trois variables dans l'environnement du shell avec :shlequel il se lance: MYVIMRC, VIM et VIMRUNTIME. Tout ce que vous avez à faire pour savoir que vous utilisez un sous-shell de Vim est de tester la présence de l'un d'entre eux.
garyjohn
2

Exécuter ps, ou mieux, 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

L'avantage d'utiliser ps -fHover just psest qu'il vous permet de voir si vous êtes dans un sous-shell vimou si vous le mettez vimen arrière-plan. Dans ce cas, ps -fHressemblerait à ceci:

$ 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
la source