Rileva il sistema operativo in Vimscript


38

Posso recuperare l'attuale sistema operativo (Windows, Linux, OS X, ..) usando Vimscript puro (no Python o Perl)?

Voglio abilitare diverse impostazioni nel mio .vimrc (sincronizzato) per diversi tipi di sistemi operativi che sto usando.


Potresti fornire alcuni esempi specifici di comportamenti dipendenti dal sistema operativo che desideri implementare?
200_successo

@ 200_success Ho alcuni script e associazioni di tasti per MS TFS e msbuild che sono abbastanza inutili in ambienti non Windows, mentre non ho bisogno del supporto tmux in gVim su Windows. Inoltre, ci sono diversi tipi di carattere installati su sistemi diversi e anche i percorsi possono differire.
muffel

Risposte:


42

Il modo migliore è usare has(), con questa funzione è possibile verificare le funzionalità di Vim; Funzionalità specifiche del sistema operativo da :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)

E alcuni vecchi sistemi (semi-deprecati):

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.

Esempio:

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

Un modo alternativo con maggiore flessibilità è quello di chiamare l'esterno uname, ciò consente anche di ottenere il numero di versione e tale:

let uname = system('uname -a')

Nota che unamenon è presente sulla maggior parte dei sistemi Windows.

In genere è preferibile utilizzare il rilevamento delle funzionalità , piuttosto che il rilevamento del sistema operativo . Ad esempio utilizzando una delle funzionalità has()o verificando l'esistenza di un percorso. Il post di 200_success offre una buona panoramica di ciò, quindi non ripeterò lo stesso contenuto qui.


5
Tuttavia, è molto importante notare la risposta di Romainl se vuoi che funzioni su OS X.
Rich

+1 per il puntatore a:h feature-list
JESii

24

has()suona come una buona idea fino a quando non la provi su Mac OS X: per impostazione predefinita /usr/bin/vim, has('unix')è vera ma entrambe has('macunix')e has('mac')sono false mentre, nel normale download di MacVim, tutte e tre sono vere se usi la GUI o la TUI.

Quindi la soluzione migliore è un mix di has('winXX') per Windows e unamesu sistemi unix-like. Si noti che l'output di unametermina con una nuova riga, quindi deve essere pulito prima dell'uso.

Ecco il codice che sto usando da un po ', aggiornato per 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

Successivamente, puoi usare la g:osvariabile ovunque nel tuo 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

Bene, OSX è un sistema UNIX, credo sia persino "UNIX certificato". Quindi has('unix')è preciso. È strano che has('macunix')sia falso, però. Sembra quasi un bug?
Martin Tournoij,

1
Ho fatto qualche controllo, e has('macunix')sembra dipendere da MACOS_X_UNIX, che è impostato se unameè Darwinnella configuresceneggiatura ...
Martin Tournoij

Stranamente, has ("win32")sembra funzionare anche per me in Vim a 64 bit.
Rich

@Rich Sì, e questo è documentato come tale. Questa è davvero la cosa sana da fare, ti importa se la tua app è a 32 o 64 bit? Io non. Il motivo per cui si chiama "win32" è perché questo è il nome scelto da Microsoft per l'API di Windows NT. Nominare le cose non è il punto di forza di Microsoft .
Martin Tournoij,

1
has('unix')è vero anche su Windows Git Bash, quindi non è molto utile per distinguere il vero unix dall'emulato.
Wisbucky,

8

Le variabili d'ambiente sarebbero utili.

Per rilevare tmux, è possibile selezionare if !empty($TMUX)oif $TERM == 'screen' .

Puoi anche dedurre il sistema operativo da variabili d'ambiente come $MACHTYPE( che è impostato da Bash ) o$PATH .

Per rilevare se è installata una funzione come TFS, è possibile utilizzare la executable()funzione.


"$ MACHTYPE (che è impostato da Bash)" . In realtà, se una variabile è impostata da Bash, ciò significa che non è una variabile di ambiente e non sarà possibile accedervi in ​​vim semplicemente con $MACHTYPE. Dovrai fare qualcosa come let machtype=system('echo -n $MACHTYPE')prima.
wisbucky,

4

Come altri hanno già indicato, un rilevamento affidabile può essere complicato. Meglio non reinventare la ruota, quindi vorrei menzionare la libreria vim-misc , che fornisce xolox#misc#os#is_mac()e xolox#misc#os#is_win()funzioni.


1

Ci ho provato has('unix'), ma non l'ho trovato utile da quando sono tornati tutti i miei Linux, Mac e Windows Git Bash true.

Ho trovato unameadatto in quanto distingue tra Linux, Mac, Windows, senza troppa 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.