Ermitteln Sie das Betriebssystem in Vimscript


37

Kann ich das aktuelle Betriebssystem (Windows, Linux, OS X, ..) mit reinem Vimscript (ohne Python oder Perl) abrufen ?

Ich möchte verschiedene Einstellungen in meinem (synchronisierten) .vimrc für verschiedene Arten von Betriebssystemen aktivieren , die ich verwende.


Können Sie einige spezifische Beispiele für betriebssystemabhängige Verhaltensweisen angeben, die Sie implementieren möchten?
200_success

@ 200_success Ich habe einige Skripte und Tastenzuordnungen für MS TFS und msbuild, die in Nicht-Windows-Umgebungen ziemlich nutzlos sind, während ich in gVim unter Windows keine tmux- Unterstützung benötige. Außerdem sind auf verschiedenen Systemen unterschiedliche Schriftarten installiert, und auch die Pfade können unterschiedlich sein.
Muffel

Antworten:


42

Die beste Möglichkeit ist has(), mit dieser Funktion nach Funktionen von Vim zu suchen. Betriebssystemspezifische Funktionen von :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)

Und einige ältere (teilweise veraltete) Systeme:

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.

Beispiel:

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

Eine andere Möglichkeit mit größerer Flexibilität besteht darin, das Externe anzurufen uname. Auf diese Weise können Sie auch die Versionsnummer und Folgendes abrufen :

let uname = system('uname -a')

Beachten Sie, dass unamedies auf den meisten Windows-Systemen nicht vorhanden ist.

Im Allgemeinen empfiehlt es sich, die Feature-Erkennung anstelle der Betriebssystemerkennung zu verwenden . Zum Beispiel, indem Sie eine der Funktionen in verwenden has()oder prüfen, ob ein Pfad vorhanden ist. 200_success 'Beitrag gibt einen guten Überblick darüber, daher werde ich hier nicht den gleichen Inhalt wiederholen.


5
Es ist sehr wichtig, Romainls Antwort zu notieren , wenn Sie möchten, dass es unter OS X funktioniert.
Rich

+1 für Zeiger auf:h feature-list
JESii

23

has()klingt wie eine gute Idee , bis es auf Mac OS X versuchen: in dem Standard /usr/bin/vim, has('unix')ist wahr , aber beide has('macunix')und has('mac')sind falsch während in der regulären MacVim herunterladen, alle drei sind wahr , ob Sie die GUI oder die TUI verwenden.

Die beste Lösung ist also eine Mischung aus has('winXX')für Windows und unameauf Unix-ähnlichen Systemen. Beachten Sie, dass die Ausgabe von unamemit einem Zeilenumbruch endet, sodass sie vor der Verwendung gereinigt werden muss.

Hier ist der Code, den ich seit einiger Zeit verwende, aktualisiert für 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

Danach können Sie die g:osVariable an einer beliebigen Stelle in Ihrem 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

Nun, OSX ist ein UNIX-System, ich glaube, es ist sogar "zertifiziertes UNIX". Ist has('unix')also genau. Es ist jedoch seltsam, dass dies has('macunix')falsch ist. Das klingt fast wie ein Bug?
Martin Tournoij

1
Ich habe einige Kontrollen, und has('macunix')scheint zu hängen von MACOS_X_UNIX, welcher Satz ist , wenn unameist Darwinim configureSkript ...
Martin Tournoij

Seltsamerweise has ("win32")scheint das bei mir sogar in 64-Bit-Vim zu funktionieren.
Rich

@Rich Ja, und das ist so dokumentiert. Dies ist wirklich die vernünftige Vorgehensweise. Interessiert es Sie, ob Ihre App 32 oder 64 Bit umfasst? Ich nicht. Der Grund für die Bezeichnung "win32" ist, dass Microsoft diesen Namen für die Windows NT-API gewählt hat. Dinge zu benennen ist nicht die Stärke von Microsoft .
Martin Tournoij

1
has('unix')trifft auch auf Windows Git Bash zu, so dass es nicht sehr nützlich ist, um echtes Unix von emuliertem zu unterscheiden.
wisbucky

8

Umgebungsvariablen wären nützlich.

Zum Erkennen tmuxkönnen Sie if !empty($TMUX)oder überprüfen if $TERM == 'screen'.

Sie können das Betriebssystem auch aus Umgebungsvariablen ableiten, z. B. $MACHTYPE( die von Bash festgelegt werden ) oder $PATH.

Mit dieser executable()Funktion können Sie feststellen, ob eine Funktion wie TFS installiert ist .


Msgstr "$ MACHTYPE (wird von Bash gesetzt)" . Wenn eine Variable von Bash gesetzt wird, bedeutet dies, dass es sich nicht um eine Umgebungsvariable handelt und Sie nicht in der Lage sind, in vim einfach mit darauf zuzugreifen $MACHTYPE. Sie müssen so etwas let machtype=system('echo -n $MACHTYPE')zuerst tun .
wisbucky

4

Wie andere bereits angedeutet haben, kann eine zuverlässige Erkennung schwierig sein. Besser nicht das Rad neu erfinden, deshalb möchte ich die vim-misc-Bibliothek erwähnen , die bietet xolox#misc#os#is_mac()und xolox#misc#os#is_win()funktioniert.


1

Ich habe es versucht has('unix'), aber ich fand es nicht hilfreich, da alle meine Linux-, Mac- und Windows-Git-Bash-Versionen darauf zurückgingen true.

Ich fand unamees passend, da es zwischen Linux, Mac und Windows ohne allzu große Granularität unterscheidet.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.