Wie mache ich VIM-Einstellungen in .vimrc computerabhängig?

44

Ich teile meine VIM-Konfigurationsdatei zwischen mehreren Computern. Ich möchte jedoch, dass einige Einstellungen für bestimmte Computer spezifisch sind.

Beispielsweise sollten sich die Schriftgrößen auf dem hochauflösenden Laptop von denen auf dem niedrigauflösenden Desktop unterscheiden. Und was noch wichtiger ist, ich möchte, dass sich gVIM unter Windows mehr als Windows und MacVim unter OSX mehr als MacCy verhält und dass sich gVIM unter Linux einfach so verhält, wie es immer der Fall ist. (Das mag ein seltsames Gefühl sein, aber ich bin es sehr gewohnt, beim Wechseln des Betriebssystems den mentalen Modus zu wechseln.)

Gibt es eine Möglichkeit, einige Einstellungen in der .vimrcmaschinen- oder betriebssystemabhängigen Umgebung vorzunehmen ?

Bastibe
quelle

Antworten:

44

Betriebssystemerkennung in .vimrc:

if has('win32')
    ......
elseif has('mac')
    ......
elseif has('unix')
    ......
endif
Casual Coder
quelle
4
Ebenfalls nützlich: has('gui_running')wenn Sie zwischen dem tty-Modus und dem GUI-Modus unterscheiden müssen.
Chris Johnsen
10
Die Funktion has () testet das Vorhandensein von Vim-Funktionen. Es gibt keine "Linux" -Funktion. Das richtige Argument ist "Unix". Das richtige Argument für OS-X ist auch 'macunix'. Es gibt auch eine "Mac" -Funktion, aber ich weiß nicht, ob has('mac')dies für alle Macs oder nur für Macs vor OS-X gilt. Siehe :help feature-listdie vollständige Liste.
Garyjohn
1
Ja has('unix'). Mein Fehler.
Casual Coder
Eine sehr späte Antwort, aber ja, hat ('mac') in OSX für mich ausgelöst.
Diablo-D3
1
Ich habe vim 1) getestet, das mit OS X geliefert wird, und 2) das ich über Gentoo Prefix (ähnlich wie Homebrew) installiert habe, und 3) das von MacVim stammt. Nur derjenige, der von MacVim stammt, wird für "true" zurückgegeben has("mac"). Ich vermute, dass sie einen Patch verwendet haben, mit dem der Funktionstest tatsächlich funktioniert. Wenn Sie sich auf has("mac")test verlassen, führen Sie einen Test durch, um sicherzustellen, dass er von Ihrem vim unterstützt wird.
Yegle
26

Um für einen bestimmten Computer zu testen, können Sie die Ausgabe des hostnameBefehls testen . Zum Beispiel,

let hostname = substitute(system('hostname'), '\n', '', '')
if hostname == "tigger"
   ...
elseif hostname == "pooh"
   ...
endif

Sie können auch den Wert verfügbarer Umgebungsvariablen testen:

if $HOSTNAME == "tigger"
   ...
elseif $HOSTNAME == "pooh"
   ...
endif

Die $DISPLAYVariable kann auch nützlich sein.

garyjohn
quelle
13
hostname () erledigt dies, zB: if hostname () == 'tigger' ..., ohne den Systemaufruf ausführen zu müssen.
Uhr
Das Ergebnis für system('hostname')war machine.mycompany.com\n, also musste ich den Ersatzbefehl auf ändern substitute(system('hostname'), '\.\_.*$', '', '').
JPaget 20.10.15
9

Ich habe diesen Ausschnitt in meinem vimrc:

let s:host_vimrc = $HOME . '/.' . hostname() . '.vimrc'                                                                                                                               
if filereadable(s:host_vimrc)                                                                                                                                                        
  execute 'source ' . s:host_vimrc                                                                                                                                                   
endif

Dies wird einfach ausgeführt, source $HOME/.$HOSTNAME.vimrcwenn es existiert. Ich habe hostname()und Verkettung verwendet, Sie könnten auch die prägnantere verwenden, expand('$HOME/.$HOSTNAME.vimrc')wenn Sie wissen, dass $HOSTNAMEimmer gesetzt ist.

ungedacht
quelle
7

In der vorherigen Antwort zur Betriebssystemerkennung wurde OS X in MacVim für mich nicht erkannt (und es wird auch nicht so verwendet, has("macunix")wie es in der Dokumentation vorgeschlagen wird).

Folgendes verwende ich, um zwischen Windows und OS X zu unterscheiden:

if has("win32")
  "Windows options here
else
  if has("unix")
    let s:uname = system("uname")
    if s:uname == "Darwin\n"
      "Mac options here
    endif
  endif
endif

Beachten Sie, dass es has("win32")bei mir auch in 64-Bit-Vim unter 64-Bit-Windows funktioniert hat.

Sie können auch ähnliche Tests unameinnerhalb des if has("unix")Blocks verwenden, um andere Unix-Varianten zu unterscheiden. Führen Sie einfach unameoder uname -aüber die Befehlszeile aus, um zu sehen, was Sie vergleichen müssen s:uname with. Siehe auch, :h matchstr()wenn Sie nur einen Teil der Ausgabe von uname vergleichen müssen.

Reich
quelle
2

Bei vielen Rechnern .vimrckann es mühsam werden, alle Hostnamen in aufzulisten. Unter Umständen ist es einfacher, zwischen verschiedenen Unix-Varianten zu unterscheiden:

" set font when running on Solaris
if (match(system('uname -s'), 'SunOS') >= 0)  
   set guifont=*   " fixes "E665: Cannot start GUI, no valid font found"
endif
Philant
quelle
Leider bricht dies auf Windows-Maschinen.
Oligofren
1

Sie können das betriebssystemspezifische Material einfach für jeden Computer in eine benutzerdefinierte GVIMRC-Datei einfügen und für alle Computer eine gemeinsame GVIMRC-Datei verwenden. Beide Dateien werden beim Start von GVim gelesen, nur .vimrc wird beim Start von Nicht-GUI-Vim gelesen.

Neil
quelle
1

In Bezug auf Trennung zwischen Linux und Windows - Sie einfach verschiedene Einstellungen in setzen kann .vimrcund _vimrcdementsprechend.

Bjauy
quelle