Comment détecter que le shell actuel (Bash) est une sous-coque (Vi / Vim)?

3

Depuis Vi / Vim, je peux taper:

:shell

tomber dans une coquille.

Existe-t-il un moyen de détecter que je suis dans une sous-coque générée par Vi?

La variable d'environnement SHLVL est 2, mais cela ne me dit pas explicitement que je suis dans un sous-shell généré par Vi / Vim .

Sur OS X, les variables suivantes sont également définies: MYVIMRC, VIMRUNTIME, VIM.

Comment sont-ils universels? Puis-je compter sur ces paramètres dans n'importe quel système, si et seulement si je suis dans un sous-shell Vi / Vim?

Sinon, y a-t-il un moyen portable, robuste et, espérons-le, efficace de dire que je suis dans un sous-shell Vi / Vim?

Merci.

Jeet
la source

Réponses:

2

Je vois ces mêmes variables dans Ubuntu 9.10 avec Vim 7.2 et sous Cygwin 1.7 avec Vim 7.2 sous Vista.

Voici la documentation.

Notez que cela MYVIMRCpeut ne pas être présent s'il n'y a pas de .vimrcfichier.

Dennis Williamson
la source
idem ici sur Debian Lenny, vim 7.1. Je reçois également SHLVL 2 à l' écran ( SHLVL 3 dans un sous-shell généré par vim dans l'une de ces fenêtres d'écran), donc SHLVL en soi n'est probablement pas un bon test. peut-être SHLVL> 1 et un ou plusieurs des types suivants
Quack Quichotte
1
Si vous trouvez que parfois l'un de ceux-ci est défini en dehors de vim (puisqu'il s'agit de variables de configuration pour vim ), vous pouvez utiliser let $UNDER_VIM='Yes, probably.'votre fichier .vimrc et archiver test -n "${UNDER_VIM:-}"votre shell. Ou, si votre shell en a PPID, utilisez ps pour rechercher la commande et voir si elle ressemble à vim (par exemple, vim, vi, rvim, evim, view, rview, etc.).
Chris Johnsen
@ Chris: Sauf que rvimet rviewne vous laissera pas faire :shell.
Dennis Williamson
Merci pour l'info. Chris Johnsen - votre idée "let $ UNDER_VIM = 'Oui, probablement.'" Fonctionne parfaitement . ... MERCI!
Jeet
@Chris: Au fait, pourquoi utiliser un défaut à null dans votre test? Je ne vois aucune différence entre le vôtre et test -n "${UNDER_VIM}.
Dennis Williamson
1

Je ne connais pas très bien OSX, mais s'il a un système de fichiers / proc, vous pouvez probablement vérifier le nom du processus parent, comme ceci:

parent=$(</proc/$PPID/exename)
if expr match $parent $(which vim) > /dev/null
then
    ...
fi
njd
la source
Pas de système de fichiers / proc, j'ai bien peur. Bien que le concept puisse être mis en œuvre de la manière suivante: if [ $(ps -o command -p $(ps -o ppid -o command -p $$ | tail -1 | awk '{print $1}') | tail -1) == vi then ... fi assez gênant cependant!
Jeet
Cela ne suffirait-il pas? : ps -o commande -p $ PPID
njd Le
njd: ce serait effectivement le cas. Je ne savais pas que $PPIDc'était exporté. Merci!
Jeet