如何在.vimrc中使VIM设置与计算机有关?


44

我在多台计算机之间共享我的VIM配置文件。但是,我希望某些设置特定于某些计算机。

例如,高分辨率笔记本电脑上的字体大小应与低分辨率台式机上的字体大小不同。更重要的是,我希望Windows上的gVIM表现出更多的Windows风格,而OSX上的MacVim表现出更多的maccy,而Linux上的gVIM表现得与以往一样。(这可能是一个奇怪的想法,但是我非常习惯在切换操作系统时切换思维模式)

有没有一种方法可以根据计算机.vimrc或操作系统进行一些设置?

Answers:


44

操作系统检测.vimrc

if has('win32')
    ......
elseif has('mac')
    ......
elseif has('unix')
    ......
endif

4
也很有用:has('gui_running')如果需要区分tty模式和GUI模式。
克里斯·约翰森

10
has()函数测试Vim功能的存在。没有“ Linux”功能。正确的参数是“ unix”。另外,OS-X的正确参数是'macunix'。还有一个“ mac”功能,但我不知道has('mac')对于所有Mac还是仅适用于OS-X之前的Mac是正确的。请参阅:help feature-list完整列表。
garyjohn

1
是的has('unix')。我的错。
Casual Coder 2010年

一个很晚的答案,但是的,对我来说,在OSX中具有('mac')触发器。
Diablo-D3

1
我已经测试了OS X随附的vim 1)和2)我通过Gentoo Prefix(类似于Homebrew)安装的vim,以及3)来自MacVim的vim。仅来自MacVim的一个会正确为返回true has("mac")。我的猜测是他们使用了一些补丁,这些补丁实际上使功能测试正常工作。如果您确实依赖has("mac")测试,请进行一些测试以确保您的vim支持该测试。
yegle 2015年

26

要测试特定机器,可以测试hostname命令的输出。例如,

let hostname = substitute(system('hostname'), '\n', '', '')
if hostname == "tigger"
   ...
elseif hostname == "pooh"
   ...
endif

您还可以测试可用环境变量的值:

if $HOSTNAME == "tigger"
   ...
elseif $HOSTNAME == "pooh"
   ...
endif

$DISPLAY变量也可能有用。


13
hostname()将执行此操作,例如:if hostname()=='tigger'...,而无需进行系统调用。
tvon 2011年

的结果system('hostname')machine.mycompany.com\n,因此我不得不将替代命令更改为substitute(system('hostname'), '\.\_.*$', '', '')
JPaget

9

我的片段vimrc如下:

let s:host_vimrc = $HOME . '/.' . hostname() . '.vimrc'                                                                                                                               
if filereadable(s:host_vimrc)                                                                                                                                                        
  execute 'source ' . s:host_vimrc                                                                                                                                                   
endif

source $HOME/.$HOSTNAME.vimrc如果存在,这将简单地执行。我使用过hostname()并置,expand('$HOME/.$HOSTNAME.vimrc')如果您知道$HOSTNAME总是设置的话,也可以使用更简洁的方法。


7

先前关于操作系统检测的答案对我来说并不能在MacVim中检测到OS X(而且has("macunix")文档中也没有建议这样做)。

这是我用来区分Windows和OS X的方法:

if has("win32")
  "Windows options here
else
  if has("unix")
    let s:uname = system("uname")
    if s:uname == "Darwin\n"
      "Mac options here
    endif
  endif
endif

请注意has("win32"),即使在64位Windows上的64位Vim中,它也对我有用。

您也可以unameif has("unix")块中使用类似的测试来区分Unix的其他类型。只需运行unameuname -a从命令行查看需要比较的内容s:uname with。另请参阅:h matchstr()是否仅需要比较uname输出的一部分。


2

在很多机器上,列出所有主机名.vimrc可能变得很乏味,可能更容易区分不同的unix风格:

" set font when running on Solaris
if (match(system('uname -s'), 'SunOS') >= 0)  
   set guifont=*   " fixes "E665: Cannot start GUI, no valid font found"
endif

不幸的是,这在Windows计算机上中断了。
oligofren 2015年

1

您可以将特定于操作系统的内容放入每台计算机的自定义.gvimrc中,并在所有机器上使用通用的.vimrc。当GVim启动时,两个文件都被读取,当非GUI Vim启动时,仅读取.vimrc。


1

关于Linux和Windows之间的分离-您只需在.vimrc和中分别设置不同的设置即可_vimrc

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.