Wykryj system operacyjny w Vimscript

38

Czy mogę pobrać bieżący system operacyjny (Windows, Linux, OS X, ..) przy użyciu czystego Vimscript (bez Pythona lub Perla)?

Chcę włączyć różne ustawienia w moim (zsynchronizowanym) .vimrc dla różnych typów systemów operacyjnych, z których korzystam.

tłumić
źródło
Czy możesz podać konkretne przykłady zachowań zależnych od systemu operacyjnego, które chcesz wdrożyć?
200_success
@ 200_success Mam kilka skryptów i klawiszy dla MS TFS i msbuild, które są całkiem bezużyteczne w środowiskach innych niż Windows, a nie muszę tmux wsparcie w gVim na Windows. Ponadto w różnych systemach są zainstalowane różne czcionki, a ścieżki mogą się również różnić.
tłumik

Odpowiedzi:

42

Najlepszym sposobem jest użycie has(), dzięki tej funkcji możesz sprawdzić funkcje Vima; Funkcje specyficzne dla systemu operacyjnego :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)

I niektóre starsze (częściowo przestarzałe) systemy:

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.

Przykład:

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

Alternatywnym sposobem z większą elastycznością jest wywoływanie zewnętrznego uname, pozwala to również uzyskać numer wersji i takie:

let uname = system('uname -a')

Pamiętaj, że unamenie jest obecny w większości systemów Windows.

Zazwyczaj najlepiej jest korzystać z funkcji wykrywania , a nie systemu operacyjnego . Na przykład przez użycie jednej z funkcji has()lub sprawdzenie, czy istnieje ścieżka. Post 200_success daje dobry przegląd tego, więc nie powtórzę tutaj tej samej treści.

Martin Tournoij
źródło
5
Bardzo ważne jest, aby zwrócić uwagę na odpowiedź romainla, jeśli chcesz, aby działała w systemie OS X.
Bogaty
+1 za wskaźnik do:h feature-list
JESii
24

has()brzmi jak dobry pomysł, dopóki nie spróbujesz na Mac OS X: w domyślnej /usr/bin/vim, has('unix')to prawda , ale zarówno has('macunix')i has('mac')fałszywe podczas gdy w regularnym MacVim pobrania, wszystkie trzy są prawdziwe , czy używasz GUI lub Tui.

Najlepszym rozwiązaniem jest połączenie has('winXX')systemu Windows i unamesystemów uniksowych. Zauważ, że wyjście unamekończy się znakiem nowej linii, więc przed użyciem należy je wyczyścić.

Oto kod, którego używam od dłuższego czasu, zaktualizowany dla 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

Następnie możesz użyć g:oszmiennej w dowolnym miejscu w 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
źródło
Cóż, OSX jest systemem UNIX, wierzę, że jest nawet „certyfikowany UNIX”. To has('unix')jest dokładne. Dziwne has('macunix')to jednak fałsz. To prawie brzmi jak błąd?
Martin Tournoij
1
Zrobiłem trochę sprawdzania i has('macunix')wydaje się, że zależy od tego MACOS_X_UNIX, co jest ustawione, jeśli unamejest Darwinw configureskrypcie ...
Martin Tournoij
Co dziwne, has ("win32")wydaje się , że działa dla mnie nawet w 64-bitowym Vimie.
Bogaty
@Rich Tak, i to jako takie udokumentowane. To naprawdę rozsądna rzecz, czy obchodzi Cię, czy Twoja aplikacja ma 32 czy 64 bity? Ja nie. Powodem jest tak zwana „win32”, ponieważ właśnie taką nazwę Microsoft wybiera dla swojego interfejsu Windows NT API. Nazewnictwo rzeczy nie jest mocną stroną Microsoftu .
Martin Tournoij,
1
has('unix')jest również prawdziwe w Windows Git Bash, więc nie jest bardzo przydatne do odróżniania prawdziwego unixa od emulowanego.
wisbucky
8

Przydałyby się zmienne środowiskowe.

Aby wykryć tmux, możesz sprawdzić if !empty($TMUX)lub if $TERM == 'screen'.

Możesz także wywnioskować system operacyjny ze zmiennych środowiskowych, takich jak $MACHTYPE( które jest ustawione przez Bash ) lub $PATH.

Aby wykryć, czy zainstalowana jest funkcja taka jak TFS, możesz użyć tej executable()funkcji.

200_sukces
źródło
„$ MACHTYPE (który jest ustawiany przez Bash)” . W rzeczywistości, jeśli zmienna jest ustawiona przez Bash, oznacza to, że nie jest to zmienna środowiskowa i nie będziesz w stanie uzyskać do niej dostępu w vimie po prostu $MACHTYPE. let machtype=system('echo -n $MACHTYPE')Najpierw musisz zrobić coś takiego .
wisbucky
4

Jak już inni wskazali, niezawodne wykrycie może być trudne. Lepiej nie wymyślaj koła na nowo, dlatego chciałbym wspomnieć o bibliotece vim-misc , która udostępnia xolox#misc#os#is_mac()i xolox#misc#os#is_win()działa.

Ingo Karkat
źródło
1

Próbowałem has('unix'), ale nie uważałem tego za pomocne, ponieważ wszystkie moje Linux, Mac i Windows Git Bash wróciły truepo to.

Stwierdziłem, unameże jest odpowiedni, ponieważ rozróżnia Linux, Mac, Windows, bez zbyt dużej szczegółowości.

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
wisbucky
źródło