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.

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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.