Как сделать настройки 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.