VimscriptでOSを検出する


38

純粋な Vimscript(PythonまたはPerlなし)を使用して、現在のオペレーティングシステム(Windows、Linux、OS X、..)を取得できますか?

使用しているオペレーティングシステムの種類ごとに、(同期された).vimrcで異なる設定を有効にしたい。


実装しようとしているOS依存の動作の具体例をいくつか教えていただけますか?
200_success

@ 200_success Windows以外の環境ではかなり役に立たないMS TFSとmsbuildのスクリプトとキーバインディングがいくつかありますが、WindowsのgVimではtmuxのサポートは必要ありません。さらに、異なるシステムに異なるフォントがインストールされており、パスも異なる場合があります。
マッフェル

回答:


42

最適な方法は、を使用has()することです。この関数では、Vimの機能を確認できます。OS固有の機能 :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

より柔軟な別の方法は、externalを呼び出すunameことです。これにより、バージョン番号なども取得できます。

let uname = system('uname -a')

unameほとんどのWindowsシステムには存在しないことに注意してください。

一般に、OS検出ではなく機能検出を使用するのが最善です。たとえば、いずれかの機能を使用するか、何らかのパスが存在するかどうかを確認します。200_successの投稿でその概要を説明しているので、ここでは同じ内容を繰り返しません。has()


5
ただし、OS Xで動作させたい場合は、romainlの答えに注意することが非常に重要です。
リッチ

+1へのポインタ:h feature-list
JESii

24

has()良いアイデアのような音は、Mac OS X上でそれを試してみてくださいまで:デフォルトでは/usr/bin/vimhas('unix')ある真実が、両方has('macunix')has('mac')されている偽の中には、定期的なMacVimのダウンロードには、すべての3つがあり、真のあなたはGUIや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

OSXはUNIXシステムであり、「認定UNIX」でさえあると思います。だから、has('unix')正確です。has('macunix')しかし、それが間違っているのは奇妙です。これはほとんどバグのように聞こえますか?
マーティントゥルノイ

1
私はいくつかのチェックをした、そしてhas('macunix')依存するように思われるMACOS_X_UNIX場合はセットである、unameあるDarwinconfigure...スクリプト
マーティンTournoij

奇妙なことに、has ("win32")64ビットVimでも動作するようです。
リッチ

@Richはい、それはそのように文書化されています。これは本当に正しいことです。アプリが32ビットか64ビットかを気にしますか?しません。「win32」と呼ばれる理由は、MicrosoftがWindows NT APIに選んだ名前だからです。ものに名前を付けることは、Microsoftの強みではありません
マーティントゥルノイ

1
has('unix')は、Windows Git Bashにも当てはまるため、実際のUNIXとエミュレートされたものを区別するのにはあまり役立ちません。
ウィスバッキー

8

環境変数が役立ちます。

検出するにはtmuxif !empty($TMUX)またはを確認できますif $TERM == 'screen'

また、$MACHTYPEBashによって設定される)や$PATH。などの環境変数からオペレーティングシステムを推測することもできます。

TFSなどの機能がインストールされているかどうかを検出するには、このexecutable()機能を使用できます。


「$ MACHTYPE(Bashによって設定されます)」。実際、変数がBashによって設定されている場合、それは環境変数ではないことを意味し、vimで単純ににアクセスすることはできません$MACHTYPElet machtype=system('echo -n $MACHTYPE')最初に何かをする必要があります。
ウィスバッキー

4

他の人がすでに指摘しているように、信頼できる検出には注意が必要です。車輪を再発明しない方が良いので、vim-misc libraryに言及して、それが提供xolox#misc#os#is_mac()xolox#misc#os#is_win()機能します。


1

試しましたhas('unix')が、Linux、Mac、およびWindows Git Bashがすべて戻ってきtrueたので、役に立たなかった。

unameLinux、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.