Определить ОС в Vimscript

38

Могу ли я получить текущую операционную систему (Windows, Linux, OS X, ..), используя чистый Vimscript (без Python или Perl)?

Я хочу включить разные настройки в моем (синхронизированном) .vimrc для разных типов операционных систем, которые я использую.

муфель-
источник
Не могли бы вы привести конкретные примеры поведения, зависящего от ОС, которое вы пытаетесь реализовать?
200_success
@ 200_success У меня есть несколько сценариев и привязок клавиш для MS TFS и msbuild, которые довольно бесполезны в средах, отличных от Windows, хотя мне не нужна поддержка tmux в gVim в Windows. Кроме того, в разных системах установлены разные шрифты, и пути могут отличаться.
муфель-

Ответы:

42

Лучше всего использовать has()эту функцию, чтобы проверить возможности Vim; Особенности ОС от :help feature-list:

macunix                 Macintosh version of Vim, using Unix files (OS-X).
unix                    Unix version of Vim.
win32                   Win32 version of Vim (MS-Windows 95 and later, 32 or
                        64 bits)
win32unix               Win32 version of Vim, using Unix files (Cygwin)

И некоторые старые (полу-устаревшие) системы:

amiga                   Amiga version of Vim.
os2                     OS/2 version of Vim.
win16                   Win16 version of Vim (MS-Windows 3.1).
win64                   Win64 version of Vim (MS-Windows 64 bit).
win95                   Win32 version for MS-Windows 95/98/ME.

Пример:

if has('win32')
    echo "Someone please open the Window(s)!"
endif

Альтернативный способ с большей гибкостью - это вызов внешнего uname, это также позволяет вам получить номер версии и такой:

let uname = system('uname -a')

Обратите внимание, что unameотсутствует в большинстве систем Windows.

Как правило, лучше использовать функцию обнаружения , а не ОС . Например, используя одну из функций has()или проверяя, существует ли какой-либо путь. Пост 200_success ' дает хороший обзор этого, поэтому я не буду повторять здесь тот же контент.

Мартин Турной
источник
5
Очень важно отметить ответ romainl, если вы хотите, чтобы он работал на OS X, хотя.
Rich
+1 за указатель на:h feature-list
JESii
24

has()звучит как хорошая идея , пока не попробуешь его на Mac OS X: в по умолчанию /usr/bin/vim, has('unix')это верно , но как has('macunix')и has('mac')являются ложными , тогда как в обычной MacVim загрузки, все три являются верно ли использовать вас графический интерфейс или TUI.

Поэтому лучшее решение - это сочетание has('winXX')для Windows и unameUnix-подобных систем. Обратите внимание, что вывод unameзаканчивается символом новой строки, поэтому его необходимо очистить перед использованием.

Вот код, который я использовал некоторое время, обновлен для win64:

if !exists("g:os")
    if has("win64") || has("win32") || has("win16")
        let g:os = "Windows"
    else
        let g:os = substitute(system('uname'), '\n', '', '')
    endif
endif

После этого вы можете использовать g:osпеременную в любом месте вашего vimrc:

if has("gui_running")
    if g:os == "Darwin"
        set guifont=Fira\ Mono:h12
    elseif g:os == "Linux"
        set guifont=Fira\ Mono\ 10
    elseif g:os == "Windows"
        set guifont=Fira_Mono:h12:cANSI
    endif
endif
romainl
источник
Ну, OSX - это система UNIX, я считаю, что это даже «сертифицированная UNIX». Так has('unix')точно. Странно, что has('macunix')это неправда. Это звучит почти как ошибка?
Мартин Турной
1
Я сделал некоторую проверку, и, has('macunix')кажется, зависит от того MACOS_X_UNIX, что установлено, если unameесть Darwinв configureсценарии ...
Martin Tournoij
Как ни странно, has ("win32")мне кажется , что это работает даже в 64-битном Vim.
Рич
@Rich Да, и это задокументировано как таковое. Это действительно нормальное занятие, вас волнует, 32-битное или 64-битное приложение? Я не. Причина, по которой он называется «win32», заключается в том, что это имя Microsoft выбирает для своего Windows NT API. Называть вещи не является сильной стороной Microsoft .
Мартин Турной
1
has('unix')Это также верно для Windows Git Bash, поэтому не очень полезно отличать реальный Unix от эмулируемого.
Висбуки
8

Переменные среды были бы полезны.

Чтобы обнаружить tmux, вы можете проверить if !empty($TMUX)или if $TERM == 'screen'.

Вы также можете вывести операционную систему из переменных среды, таких как $MACHTYPE( устанавливается Bash ) или $PATH.

Чтобы определить, установлена ​​ли такая функция, как TFS, вы можете использовать эту executable()функцию.

200_success
источник
Msgstr "$ MACHTYPE (который устанавливается Bash)" . На самом деле, если переменная установлена ​​Bash, это означает, что она не является переменной окружения, и вы не сможете получить к ней доступ через vim просто с помощью $MACHTYPE. Вы должны будете сделать что-то вроде let machtype=system('echo -n $MACHTYPE')первого.
wisbucky
4

Как уже указывали другие, надежное обнаружение может быть сложным. Лучше не изобретать велосипед, поэтому я хотел бы упомянуть библиотеку vim-misc , которая предоставляет xolox#misc#os#is_mac()и xolox#misc#os#is_win()функционирует.

Инго Каркат
источник
1

Я пытался has('unix'), но я не нашел это полезным, так как все мои Linux, Mac и Windows Git Bash вернулись trueза ним.

Я нашел unameподходящим, поскольку он различает Linux, Mac, Windows, без особой детализации.

let uname = substitute(system('uname'), '\n', '', '')
" Example values: Linux, Darwin, MINGW64_NT-10.0, MINGW32_NT-6.1

if uname == 'Linux' || uname == 'Darwin'
    " do linux/mac command
else " windows
    " do windows command
endif
wisbucky
источник