Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I share my VIM configuration file between several computers. However, I want some settings to be specific for certain computers.

For example, font sizes on the high-res laptop should be different to the low-res desktop. And more importantly, I want gVIM on Windows to behave more windowsy and MacVim on OSX to behave more maccy and gVIM on Linux to just behave like it always does. (That might be a strange sentiment, but I am very used to switch mental modes when switching OSes)

Is there a way to make a few settings in the .vimrc machine- or OS-dependent?

share|improve this question
up vote 29 down vote accepted

OS detection in .vimrc:

if has('win32')
elseif has('mac')
elseif has('unix')
share|improve this answer
Also useful: has('gui_running') if you need to differentiate between tty mode and GUI mode. – Chris Johnsen Oct 1 '10 at 13:20
The has() function tests the presence of Vim features. There is no 'linux' feature. The proper argument is 'unix'. Also, the proper argument for OS-X is 'macunix'. There is also a 'mac' feature, but I don't know whether has('mac') is true for all Macs or just pre-OS-X Macs. See :help feature-list for the full list. – garyjohn Oct 1 '10 at 15:14
Yes, has('unix'). My mistake. – Casual Coder Oct 1 '10 at 17:14
A very late answer, but yes, has('mac') triggers in OSX for me. – Diablo-D3 Mar 28 '15 at 9:13
I've tested vim 1) that comes with OS X, and 2) that I installed via Gentoo Prefix (something similar to Homebrew), and 3) that comes from MacVim. Only the one comes from MacVim will correctly return true for has("mac"). My guess is that they used some patch that actually make the feature test work. If you do rely on has("mac") test, do some test to make sure it's supported on your vim. – yegle Oct 10 '15 at 4:26

To test for a particular machine, you can test the output of the hostname command. For example,

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

You could also test the value of available environment variables:

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

The $DISPLAY variable can also be useful.

share|improve this answer
hostname() will do this, eg: if hostname() == 'tigger'..., without having to make the system call. – tvon Apr 15 '11 at 16:03
The result for system('hostname') was\n, so I had to change the substitute command to substitute(system('hostname'), '\.\_.*$', '', ''). – JPaget Oct 20 '15 at 18:35

I have this snippet in my vimrc:

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

This simply executes source $HOME/.$HOSTNAME.vimrc if it exists. I've used hostname() and concatenation, you could also use the more succinct expand('$HOME/.$HOSTNAME.vimrc') if you know that $HOSTNAME is always set.

share|improve this answer

The previous answer about OS detection does not detect OS X in MacVim for me (and neither does using has("macunix") as the documentation suggests it should).

Here's what I use to distiguish between Windows and OS X:

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

Note that has("win32") worked for me, even in 64 bit Vim on 64 bit Windows.

You could also use similar tests of uname within the if has("unix") block to distinguish other flavours of Unix. Just run uname or uname -a from the command-line to see what you need to compare s:uname with. See also :h matchstr() if you need to compare just a part of uname's output.

share|improve this answer

You could just put the OS-specific stuff in a custom .gvimrc for each machine, and use a common .vimrc on all of them. Both files are read when GVim starts, only .vimrc is read when the non-gui Vim starts.

share|improve this answer

With a lot of machines, listing all hostnames in .vimrc can become tedious, it might be easier to distinguish between different unix flavors:

" set font when running on Solaris
if (match(system('uname -s'), 'SunOS') >= 0)  
   set guifont=*   " fixes "E665: Cannot start GUI, no valid font found"
share|improve this answer
Unfortunately, this breaks on windows machines. – oligofren Aug 23 '15 at 19:26

Regarding separation between Linux and Windows - you can simply put different settings in .vimrc and _vimrc, accordingly.

share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .