Как сделать настройки VIM компьютерно-зависимыми в .vimrc?


44

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

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

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

Ответы:


44

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

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

4
Также полезно: has('gui_running')если вам нужно различать режим tty и режим GUI.
Крис Джонсен

10
Функция has () проверяет наличие функций Vim. Там нет функции "Linux". Правильный аргумент - «Unix». Также правильным аргументом для OS-X является «Macunix». Существует также функция «Mac», но я не знаю, has('mac')верно ли это для всех Mac или только для Mac с предустановленной OS-X. Смотрите :help feature-listполный список.
garyjohn

1
Да, has('unix'). Моя ошибка.
Казуальный кодер

Очень поздний ответ, но да, для меня в OSX есть триггеры ('mac').
Diablo-D3

1
Я протестировал vim 1), который поставляется с OS X, и 2), который я установил с помощью Gentoo Prefix (что-то похожее на Homebrew), и 3), который поставляется с MacVim. Только тот, который прибывает из MacVim, правильно вернет true для has("mac"). Я предполагаю, что они использовали какой-то патч, который на самом деле заставляет работать функциональный тест. Если вы полагаетесь на has("mac")test, сделайте несколько тестов, чтобы убедиться, что они поддерживаются вашим vim.
Yegle

26

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

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

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

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

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


13
hostname () сделает это, например: if hostname () == 'tigger' ..., без необходимости делать системный вызов.
tvon

Результат system('hostname')был machine.mycompany.com\n, поэтому мне пришлось изменить команду замены на substitute(system('hostname'), '\.\_.*$', '', '').
JPaget

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

К сожалению, это ломается на окнах машин.
oligofren

1

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


1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.