Як зробити налаштування VIM залежними від комп'ютера у .vimrc?


44

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

Наприклад, розміри шрифту на ноутбуці з високою роздільною здатністю повинні відрізнятися від робочого столу з низькою роздільною здатністю. І що ще важливіше, я хочу, щоб gVIM в Windows поводився більш віконно, а 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')справедливо це для всіх Macs або лише для Mac OS перед X-OS. Дивіться :help feature-listповний список.
garyjohn

1
Так, has('unix'). Моя помилка.
Повсякденний кодер

Дуже пізня відповідь, але так, для мене (OS) викликає ('mac') запуск.
Diablo-D3

1
Я перевірив vim 1), що постачається з OS X, і 2), який я встановив через префікс Gentoo (щось подібне до Homebrew), і 3), що надходить від MacVim. Тільки той, який походить з MacVim, правильно поверне справжнє значення для has("mac"). Я здогадуюсь, що вони використовували деякий патч, який фактично змушує тестування функції працювати. Якщо ви покладаєтесь на has("mac")тест, зробіть кілька тестів, щоб переконатися, що він підтримується у вашому 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 name host () == 'tigger' ..., без необхідності робити системний виклик.
Твон

Результат для 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()якщо вам потрібно порівняти лише частину результатів уніме.


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

На жаль, це ламається на машинах Windows.
олігофрен

1

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


1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.