Détecter l'OS dans Vimscript

38

Puis-je récupérer le système d'exploitation actuel (Windows, Linux, OS X, ..) à l' aide de Vimscript pur (pas de Python ni de Perl)?

Je souhaite activer différents paramètres dans mon fichier .vimrc (synchronisé) pour différents types de systèmes d'exploitation que j'utilise.

muffel
la source
Pourriez-vous fournir des exemples spécifiques de comportements dépendants du système d'exploitation que vous souhaitez implémenter?
200_success
@ 200_success J'ai quelques scripts et les raccourcis clavier pour MS TFS et msbuild qui sont assez inutiles dans des environnements non-Windows, alors que je ne ai pas besoin tmux soutien gVim sous Windows. En outre, différentes polices sont installées sur différents systèmes et les chemins peuvent également différer.
Muffel

Réponses:

42

Le meilleur moyen est d'utiliser has(), avec cette fonction, vous pouvez vérifier les fonctionnalités de Vim; Caractéristiques spécifiques du système d'exploitation à partir de :help feature-list:

macunix                 Macintosh version of Vim, using Unix files (OS-X).
unix                    Unix version of Vim.
win32                   Win32 version of Vim (MS-Windows 95 and later, 32 or
                        64 bits)
win32unix               Win32 version of Vim, using Unix files (Cygwin)

Et certains systèmes plus anciens (semi-obsolètes):

amiga                   Amiga version of Vim.
os2                     OS/2 version of Vim.
win16                   Win16 version of Vim (MS-Windows 3.1).
win64                   Win64 version of Vim (MS-Windows 64 bit).
win95                   Win32 version for MS-Windows 95/98/ME.

Exemple:

if has('win32')
    echo "Someone please open the Window(s)!"
endif

Une autre manière plus flexible consiste à appeler l'externe uname, ce qui vous permet également d'obtenir le numéro de version, par exemple:

let uname = system('uname -a')

Notez que ce unamen'est pas présent sur la plupart des systèmes Windows.

Il est généralement préférable d'utiliser la détection de fonctionnalités plutôt que la détection de système d' exploitation . Par exemple, en utilisant l’une des fonctionnalités de has()ou en vérifiant si un chemin existe. 200_success ' donne un bon aperçu de cela, je ne vais donc pas répéter le même contenu ici.

Martin Tournoij
la source
5
Il est très important de noter la réponse de romainl si vous voulez que cela fonctionne sous OS X, cependant.
Rich
+1 pour le pointeur sur:h feature-list
JESii
24

has()sonne comme une bonne idée jusqu'à ce que vous l' essayer sur Mac OS X: dans la valeur par défaut /usr/bin/vim, has('unix')est vrai , mais les deux has('macunix')et has('mac')sont faux alors que, dans le téléchargement de MacVim régulièrement, tous les trois sont vrai si vous utilisez l'interface graphique ou TUI.

La meilleure solution est donc un mélange de has('winXX')Windows et unamede systèmes de type Unix. Notez que la sortie de unamese termine par une nouvelle ligne, elle doit donc être nettoyée avant utilisation.

Voici le code que j'utilise depuis un moment, mis à jour pour win64:

if !exists("g:os")
    if has("win64") || has("win32") || has("win16")
        let g:os = "Windows"
    else
        let g:os = substitute(system('uname'), '\n', '', '')
    endif
endif

Après cela, vous pouvez utiliser la g:osvariable n'importe où dans votre vimrc:

if has("gui_running")
    if g:os == "Darwin"
        set guifont=Fira\ Mono:h12
    elseif g:os == "Linux"
        set guifont=Fira\ Mono\ 10
    elseif g:os == "Windows"
        set guifont=Fira_Mono:h12:cANSI
    endif
endif
romainl
la source
Eh bien, OSX est un système UNIX, je crois même qu’il est "certifié UNIX". Donc, has('unix')c'est exact. C'est étrange que ce has('macunix')soit faux, cependant. Cela ressemble presque à un bug?
Martin Tournoij
1
J'ai fait quelques vérifications, et has('macunix')semble dépendre de MACOS_X_UNIXce qui est défini si unamec'est Darwindans le configurescript ...
Martin Tournoij
Curieusement, has ("win32")semble fonctionner pour moi même dans Vim 64 bits.
Rich
@Rich Oui, et c'est documenté en tant que tel. C’est vraiment la bonne chose à faire. Est-ce que vous vous souciez de savoir si votre application est en 32 ou 64 bits? Je ne. La raison pour laquelle il s'appelle 'win32', c'est parce que c'est le nom que Microsoft a choisi pour leur API Windows NT. Nommer les choses n'est pas le point fort de Microsoft .
Martin Tournoij
1
has('unix')Cela est également vrai sous Windows Git Bash, ce qui n’est donc pas très utile pour distinguer le véritable Unix de l’émulé.
Wisbucky
8

Les variables d'environnement seraient utiles.

Pour détecter tmux, vous pouvez vérifier if !empty($TMUX)ou if $TERM == 'screen'.

Vous pouvez également déduire le système d'exploitation de variables d'environnement telles que $MACHTYPE( définies par Bash ) ou $PATH.

Pour détecter si une fonctionnalité telle que TFS est installée, vous pouvez utiliser cette executable()fonction.

200_success
la source
"$ MACHTYPE (qui est défini par Bash)" . En fait, si une variable est définie par Bash, cela signifie qu'il ne s'agit pas d'une variable d'environnement et que vous ne pourrez pas y accéder simplement avec vim $MACHTYPE. Vous devrez faire quelque chose comme en let machtype=system('echo -n $MACHTYPE')premier.
Wisbucky
4

Comme d'autres l'ont déjà indiqué, une détection fiable peut être délicate. Mieux vaut ne pas réinventer la roue, donc je voudrais mentionner la bibliothèque vim-divers , qui fournit xolox#misc#os#is_mac()et xolox#misc#os#is_win()fonctions.

Ingo Karkat
la source
1

J'ai essayé has('unix'), mais je ne l'ai pas trouvé utile, car tous mes Linux, Mac et Windows Git Bash sont revenus true.

Je trouve unameque cela convient car il fait la distinction entre Linux, Mac et Windows, sans trop de granularité.

let uname = substitute(system('uname'), '\n', '', '')
" Example values: Linux, Darwin, MINGW64_NT-10.0, MINGW32_NT-6.1

if uname == 'Linux' || uname == 'Darwin'
    " do linux/mac command
else " windows
    " do windows command
endif
sage
la source