Виявити ОС у Vimscript


38

Чи можна завантажити поточну операційну систему (Windows, Linux, OS X, ..) за допомогою чистого Vimscript (без Python чи Perl)?

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


Чи можете ви надати конкретні приклади поведінки, залежної від ОС, яку ви прагнете реалізувати?
200_успіх

@ 200_success У мене є кілька сценаріїв і клавіш для MS TFS і MSBuild, які досить марні в не-Windows середовищах, в той час як я не потрібна tmux підтримка в GVim на Windows. Крім того, у різних системах встановлені різні шрифти, і шляхи можуть також відрізнятися.
muffel

Відповіді:


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, хоча.
Багатий

+1 для вказівника на:h feature-list
JESii

24

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

Тож найкращим рішенням є суміш has('winXX')для Windows та unameдля Unix-подібних систем. Зверніть увагу, що висновок 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

Ну, OSX - це система UNIX, я вважаю, що це навіть "сертифікований UNIX". Так has('unix')точно. Це не дивно, але has('macunix')це помилково. Це майже звучить як помилка?
Мартін Турноїй

1
Я зробив деяку перевірку, і, has('macunix')здається, залежить від того MACOS_X_UNIX, що встановлено, якщо unameє Darwinв configureсценарії ...
Мартін Турной

Як не дивно, has ("win32")здається, працює на мене навіть у 64-розрядному Vim.
Багатий

@Rich Так, і це документально підтверджено як таке. Це дійсно розумне, що вам потрібно зробити, чи вам байдуже, чи ваш додаток має 32 або 64 біти? Я не. Причина, яку називають "win32", полягає в тому, що саме таку назву Microsoft обирає для свого API NT Windows. Названня речей не є сильним моментом Microsoft .
Мартін Турноїй

1
has('unix')також вірно в Windows Git Bash, тому це не дуже корисно для розрізнення реального Unix від емуляційного.
вісбукі

8

Змінні середовища були б корисні.

Для того, щоб виявити tmux, ви можете перевірити if !empty($TMUX)чи if $TERM == 'screen'.

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

Щоб визначити, чи встановлена ​​така функція, як TFS, ви можете використовувати цю executable()функцію.


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