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.
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.
Risposte:
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 uname
non è 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.
:h feature-list
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 uname
su sistemi unix-like. Si noti che l'output di uname
termina 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:os
variabile 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
has('unix')
è preciso. È strano che has('macunix')
sia falso, però. Sembra quasi un bug?
has('macunix')
sembra dipendere da MACOS_X_UNIX
, che è impostato se uname
è Darwin
nella configure
sceneggiatura ...
has ("win32")
sembra funzionare anche per me in Vim a 64 bit.
has('unix')
è vero anche su Windows Git Bash, quindi non è molto utile per distinguere il vero unix dall'emulato.
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
. Dovrai fare qualcosa come let machtype=system('echo -n $MACHTYPE')
prima.
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.
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 uname
adatto 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