我想在我的(同步).vimrc中启用不同的设置我正在使用的不同类型的操作系统。
#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
评论
您能否提供一些特定的示例,以寻求实现与操作系统相关的行为?@ 200_success我有一些MS TFS和msbuild的脚本和键绑定,这些脚本和键绑定在非Windows环境中几乎没有用,而在Windows的gVim中我不需要tmux支持。此外,在不同的系统上安装了不同的字体,并且路径也可能不同。