42

Я разделяю файл конфигурации VIM между несколькими компьютерами. Однако я хочу, чтобы некоторые настройки были специфичны для определенных компьютеров.

Например, размеры шрифта на ноутбуке с высоким разрешением должны отличаться от размера рабочего стола с низким разрешением. И что еще более важно, я хочу, чтобы gVIM в Windows вел себя более Windowsy, а MacVim в OSX вел себя более maccy, а gVIM в Linux вел себя так, как всегда. (Это может быть странное чувство, но я очень привык переключать ментальные режимы при переключении ОС)

Есть ли способ сделать несколько настроек в .vimrc зависимости от машины или ОС?

7 ответов7

41

Обнаружение ОС в .vimrc:

if has('win32')
    ......
elseif has('mac')
    ......
elseif has('unix')
    ......
endif
26

Чтобы проверить конкретную машину, вы можете проверить вывод команды hostname . Например,

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

Вы также можете проверить значение доступных переменных среды:

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

Переменная $DISPLAY также может быть полезна.

9

У меня есть этот фрагмент в моем vimrc:

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

Это просто выполняет source $HOME/.$HOSTNAME.vimrc если он существует. Я использовал hostname() и конкатенацию, вы также можете использовать более лаконичное expand('$HOME/.$HOSTNAME.vimrc') если вы знаете, что $HOSTNAME всегда установлен.

7

Предыдущий ответ об обнаружении ОС не обнаруживает OS X в MacVim для меня (и ни один из них не использует has("macunix") как следует из документации).

Вот что я использую, чтобы отличить Windows от 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

Обратите внимание, что has("win32") работал для меня даже в 64-битном Vim на 64-битной Windows.

Вы также можете использовать аналогичные тесты uname в блоке if has("unix") чтобы отличать другие варианты Unix. Просто запустите uname или uname -a из командной строки, чтобы увидеть, с чем вам нужно сравнить s:uname with . Смотрите также :h matchstr() если вам нужно сравнить только часть вывода uname.

2

На многих машинах перечисление всех имен хостов в .vimrc может стать утомительным, возможно, будет легче отличить разные варианты Unix:

" 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
1

Вы можете просто поместить специфичные для ОС вещи в пользовательский .gvimrc для каждой машины и использовать общий .vimrc на всех них. Оба файла читаются при запуске GVim, только .vimrc читается при запуске Vim без графического интерфейса.

1

Что касается разделения между Linux и Windows - вы можете просто поставить разные настройки в .vimrc и _vimrc , соответственно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .