Jak uzależnić ustawienia VIM od komputera w .vimrc?

44

Udostępniam plik konfiguracyjny VIM między kilkoma komputerami. Chcę jednak, aby niektóre ustawienia były specyficzne dla niektórych komputerów.

Na przykład rozmiary czcionek na laptopie o wysokiej rozdzielczości powinny być inne niż na pulpicie o niskiej rozdzielczości. A co ważniejsze, chcę, aby gVIM w systemie Windows zachowywał się bardziej windowsy, a MacVim w OSX, aby zachowywał się bardziej maccy, a gVIM w systemie Linux, aby zachowywał się tak jak zawsze. (To może być dziwny sentyment, ale jestem bardzo przyzwyczajony do przełączania trybów mentalnych podczas przełączania systemów operacyjnych)

Czy istnieje sposób na dokonanie kilku ustawień w .vimrczależności od komputera lub systemu operacyjnego?

bastibe
źródło

Odpowiedzi:

44

Wykrywanie systemu operacyjnego w .vimrc:

if has('win32')
    ......
elseif has('mac')
    ......
elseif has('unix')
    ......
endif
Casual Coder
źródło
4
Przydatne również: has('gui_running')jeśli potrzebujesz rozróżnić tryb tty i tryb GUI.
Chris Johnsen
10
Funkcja has () sprawdza obecność funkcji Vima. Nie ma funkcji „linux”. Właściwym argumentem jest „unix”. Ponadto właściwym argumentem dla OS-X jest „macunix”. Istnieje również funkcja „mac”, ale nie wiem, czy has('mac')dotyczy to wszystkich komputerów Mac, czy tylko komputerów Mac z wersją wcześniejszą niż OS-X. Zobacz :help feature-listpełną listę.
garyjohn
1
Tak has('unix'). Mój błąd.
Casual Coder
Bardzo późna odpowiedź, ale tak, ma dla mnie („mac”) wyzwalacze w OSX.
Diablo-D3
1
Przetestowałem vim 1), który jest dostarczany z OS X i 2), który zainstalowałem przez Gentoo Prefix (coś podobnego do Homebrew), i 3), który pochodzi z MacVim. Tylko ten, który pochodzi od MacVima, poprawnie zwróci wartość true has("mac"). Domyślam się, że użyli łatki, która faktycznie sprawia, że ​​test funkcji działa. Jeśli polegasz na has("mac")teście, zrób test, aby upewnić się, że jest obsługiwany w twoim vimie.
yegle 10.10.2015
26

Aby przetestować konkretną maszynę, możesz przetestować dane wyjściowe hostnamepolecenia. Na przykład,

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

Możesz również przetestować wartość dostępnych zmiennych środowiskowych:

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

$DISPLAYZmienna może być również użyteczne.

garyjohn
źródło
13
hostname () zrobi to, np .: if hostname () == 'tigger' ... bez konieczności wykonywania wywołania systemowego.
tvon
Wynik system('hostname')był machine.mycompany.com\ntaki, więc musiałem zmienić polecenie zastępcze na substitute(system('hostname'), '\.\_.*$', '', '').
JPaget,
9

Mam ten fragment w moim vimrc:

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

Wykonuje się source $HOME/.$HOSTNAME.vimrcto, jeśli istnieje. Użyłem hostname()i konkatenacji, możesz również użyć bardziej zwięzłego, expand('$HOME/.$HOSTNAME.vimrc')jeśli wiesz, że $HOSTNAMEto jest zawsze ustawione.

nieprzemyślane
źródło
7

Poprzednia odpowiedź na temat wykrywania systemu operacyjnego nie wykrywa dla mnie OS X w MacVimie (i nie używa tego, has("macunix")jak sugeruje to dokumentacja).

Oto, czego używam do rozróżnienia między Windows a OS X:

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

Zauważ, że has("win32")działało dla mnie, nawet w 64-bitowym Vimie na 64-bitowym systemie Windows.

Możesz również użyć podobnych testów unamewewnątrz if has("unix")bloku, aby rozróżnić inne smaki Uniksa. Wystarczy uruchomić unamelub uname -az wiersza polecenia, aby zobaczyć, co należy porównać s:uname with. Zobacz także, :h matchstr()czy musisz porównać tylko część wyniku działania uname.

Bogaty
źródło
2

Przy wielu maszynach wyświetlanie wszystkich nazw hostów .vimrcmoże być uciążliwe, łatwiej jest odróżnić różne odmiany uniksowe:

" 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
filant
źródło
Niestety psuje się to na komputerach z systemem Windows.
oligofren,
1

Możesz po prostu umieścić elementy specyficzne dla systemu operacyjnego w niestandardowym pliku .gvimrc dla każdej maszyny i użyć wspólnego .vimrc na każdym z nich. Oba pliki są odczytywane podczas uruchamiania GVim, tylko .vimrc jest odczytywany, gdy uruchamia się Vim inny niż GUI.

Neil
źródło
1

Jeśli chodzi o separację między Linuksem a Windowsem - możesz po prostu wprowadzić różne ustawienia .vimrci _vimrcodpowiednio.

bjauy
źródło