我可以使用纯Vimscript(没有Python或Perl)检索当前的操作系统(Windows,Linux,OS X等)吗?

我想在我的(同步).vimrc中启用不同的设置我正在使用的不同类型的操作系统。

评论

您能否提供一些特定的示例,以寻求实现与操作系统相关的行为?

@ 200_success我有一些MS TFS和msbuild的脚本和键绑定,这些脚本和键绑定在非Windows环境中几乎没有用,而在Windows的gVim中我不需要tmux支持。此外,在不同的系统上安装了不同的字体,并且路径也可能不同。

#1 楼

最好的方法是使用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')


请注意,大多数Windows系统上都不存在uname。检测。例如,通过使用has()中的功能之一或检查是否存在某些路径。 200_success的帖子对此进行了很好的概述,因此在此不再重复相同的内容。

评论


但是,如果您希望romainl在OS X上运行,请注意它的答案非常重要。

–丰富
15年3月16日在10:33

+1指向:h功能列表的指针

–JESii
17年4月4日在19:18

#2 楼

在Mac OS X上尝试使用has()之前,它听起来是个好主意:在默认/usr/bin/vim中,has('unix')为true,但是has('macunix')has('mac')均为false,而在常规MacVim下载中,无论使用GUI还是TUI,这三个都是正确的。

因此,最好的解决方案是混合使用Windows版has('winXX')和类Unix系统上的uname。请注意,uname的输出以换行符结尾,因此必须在使用前进行清理。 >
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


之后,您可以在win64的任何位置使用g:os变量:

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')是错误的很奇怪。这听起来像是个错误?

–马丁·图尔诺伊(Martin Tournoij)
15年3月16日在10:48



我做了一些检查,并且has('macunix')似乎依赖于MACOS_X_UNIX,如果在配置脚本中的unwin是Darwin则设置了该参数...

–马丁·图尔诺伊(Martin Tournoij)
15年3月16日在10:56

奇怪的是,即使在64位Vim中,has(“ win32”)似乎也对我有用。

–丰富
15年3月16日在14:29

@Rich是的,这已被记录在案。这确实是理智的做法,您是否关心您的应用是32位还是64位?我不。之所以称为“ win32”,是因为这是Microsoft为Windows NT API选择的名称。命名不是Microsoft的强项。

–马丁·图尔诺伊(Martin Tournoij)
15年3月16日在16:55

has('unix')在Windows Git Bash上也是如此,因此对于区分真实的unix和仿真的不是很有用。

– Wisbucky
18年6月5日在9:45

#3 楼

环境变量将很有用。

要检测tmux,可以检查if !empty($TMUX)if $TERM == 'screen'

还可以从诸如$MACHTYPE(已设置通过Bash)或$PATH

要检测是否安装了TFS之类的功能,可以使用executable()函数。

评论


“ $ MACHTYPE(由Bash设置)”。实际上,如果Bash设置了变量,则意味着它不是环境变量,并且您将无法仅通过$ MACHTYPE在vim中访问它。您将必须先执行诸如let machtype = system('echo -n $ MACHTYPE')之类的操作。

– Wisbucky
18年6月6日,0:02

#4 楼

正如其他人已经指出的那样,可靠的检测可能很棘手。最好不要重新发明轮子,所以我想提到vim-misc库,该库提供xolox#misc#os#is_mac()xolox#misc#os#is_win()函数。

#5 楼

我尝试过has('unix'),但是由于所有Linux,Mac和Windows Git Bash都返回了true,所以我发现它没有帮助。 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