vim functions to detect OS and platform
for creating a cross-platform vim configuration
You want to use one vim configuration across multiple machines: Linux, macOS, FreeBSD, even windows.
There are a few ways you can set up a vim configuration that works across operating systems. One option is spf13/spf13-vim.
I prefer a middle ground. I like some elements of spf13’s configuration, but prefer to be methodical on what I add to keep things lean as possible. I maintain my own vim configuration at tony/vim-config-framework.
This snippet is derived from spf13-vim (see the original blog post). License Apache 2.
OS / Platform detectionLink to section
This is from spf13-vim’s .vimrc.
" Environment { " Identify platform { silent function! OSX() return has('macunix') endfunction silent function! LINUX() return has('unix') && !has('macunix') && !has('win32unix') endfunction silent function! WINDOWS() return (has('win16') || has('win32') || has('win64')) endfunction " }" }This allows your vim configuration to use the functions OSX(),
LINUX(), WINDOWS(), and FREEBSD() to configure based on the
environment vim is running.
We can make it a bit more cross platform. Let’s add support for FreeBSD and clean up the indentation / comments a bit:
" Platform identification { silent function! OSX() return has('macunix') endfunction silent function! LINUX() return has('unix') && !has('macunix') && !has('win32unix') endfunction silent function! WINDOWS() return (has('win16') || has('win32') || has('win64')) endfunction silent function! FREEBSD() let s:uname = system("uname -s") return (match(s:uname, 'FreeBSD') >= 0) endfunction" }Let’s see some examples of how functions like this can be implemented.
UsageLink to section
This requires the snippet above since it will use the platform-detection functions. Here is how spf13-vim uses it the first time:
" Environment { " Basics { set nocompatible " Must be first line if !WINDOWS() set shell=/bin/sh endif " }" }It’s using !WINDOWS() to infer that the platform is Unix-like. If only
we had a way to make it more concise to the reader:
" Platform identification { silent function! OSX() return has('macunix') endfunction silent function! LINUX() return has('unix') && !has('macunix') && !has('win32unix') endfunction silent function! WINDOWS() return (has('win16') || has('win32') || has('win64')) endfunction silent function! UNIXLIKE() return !WINDOWS() endfunction silent function! FREEBSD() let s:uname = system("uname -s") return (match(s:uname, 'FreeBSD') >= 0) endfunction" }With UNIXLIKE(), we can do:
" Basics { set nocompatible " Must be first line if UNIXLIKE() set shell=/bin/sh endif" }Here’s how I use it to load freebsd’s vim configuration settings:
if FREEBSD() call SourceIfExists("~/.vim/compat/freebsd.vim") call SourceIfExists("/usr/src/tools/tools/editing/freebsd.vim")endIf you want to learn more about SourceIfExists check out
:postvIIMz8vZ.