4

I'm looking for a way to make a single configuration file both for windows platform and for unix one. So for now i have two configs .vimrc for unix and _vimrc for windows platform and the only difference between them is a necessary commands to vundle plugin manager. (i desregard the difference with filename, as i aim only to store a common version of file on my dotfiles repo and symlink with the right name at place)

Unix:

set rtp+=~/.vim/bundle/Vundle.vim/
call vundle#rc()
Plugin 'VundleVim/Vundle.vim'
...
call vundle#end()

Win:

set rtp+=$HOME/vimfiles/bundle/Vundle.vim/
call vundle#begin('$USERPROFILE/vimfiles/bundle/')
Plugin 'VundleVim/Vundle.vim
...
call vundle#end()

So it's boring to maintain changes in both as i'm working on linux as well on windows platform. I guess i could do operating system detection like if has("win32") but i think it's not a good idea to wrap every system dependent statement in construction like this. I'm wondering if there any option to this and how you deal with this.

5
  • 1
    Does the .vimrc have an "include" syntax that could be made conditional on OS? You could keep everything common in one file, and then have an include for unix-specific and an include for windows-specific. That way you would only have one "if" structure, and all the stuff specific to a given OS would be in its respective file.
    – msouth
    Jan 23, 2018 at 9:14
  • 5
    I don't understand your objection to wrapping the system dependent statements in an if block that checks the operating system. Why do you think this is a bad idea?
    – Rich
    Jan 23, 2018 at 9:39
  • I agree with msouth comment: in your vimrc define a variable containing an OS-dependent path let $MYLOCALVIMRC = has('win32') ? "~/_windows.vim" : "~/.unix.vim" then you can test if the file exists (if filereadable($MYLOCALVIMRC)) and source it (source $MYLOCALVIMRC). It works pretty well I use that in my own vimrc.
    – statox
    Jan 23, 2018 at 12:16
  • Yes, i've construction like this in my vimrc if has("win32") set rtp+=$HOME/vimfiles/bundle/Vundle.vim/ call vundle#begin('$USERPROFILE/vimfiles/bundle/') else set rtp+=~/.vim/bundle/Vundle.vim/ call vundle#rc() endif but it's only requirement of plugin. May be someone has configuration with two lines - one for rtp and another for the procedure start. If not i will keep on with this config.
    – Dmitrii
    Jan 23, 2018 at 12:41
  • Actually at the time i was making this question i was sure that only me how do with Vundle like this, but if it's wide practice than ok.
    – Dmitrii
    Jan 23, 2018 at 12:52

2 Answers 2

2

If you are already using symlinks to set up your Vim configuration, and if — as I infer from your comments — the only operating system dependent part of your current config is your Vundle setup, then you don't actually need any special code in your vimrc:

Windows Command Line

:: You'll already be setting up this symlink
mklink /D %HOMEDRIVE%%HOMEPATH%\vimfiles <path_to_repo\vimfiles>

:: Set up another link for access via "~/.vim" path
mklink /D %HOMEDRIVE%%HOMEPATH%\.vim <path_to_repo\vimfiles>

N.B. Instead of creating two symlinks, you could fiddle with 'runtimepath', but the above seems simpler to me.

Unix Shell

:: You'll already be setting up this symlink
ln -s <path_to_repo/vimfiles> ~/.vim

vimrc

" This code will now work on both Unix and Windows
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

N.B. ~ can be used in options on both Windows and Unix. See :help $HOME.

If you remove the leading _ or . from your vimrc filename you won't need to symlink it separately: you can just place it inside your .vim directory (See :help vimrc):

~/.vim/vimrc
5
  • Yes, i changed my congig like this. So on windows i clone Vundle in .vim directory but symlink has to be with underscore at beginning as i use gvim which requires this, anyway it's not a big problem. Don't know why i used vimfiles directory before, i thought it was required by vundle. Thanks.
    – Dmitrii
    Jan 25, 2018 at 9:13
  • @Dmitrii Windows Vim expects you to use ~/vimfiles for your configuration. It doesn't care if this is a real directory or a symlink to a directory elsewhere. I'm suggesting you also symlink .vim to the same source location, so on Windows ~/vimfiles and ~/.vim point to the same directory.
    – Rich
    Jan 25, 2018 at 10:01
  • @Dmitrii Gvim doesn't have any special requirements about using an underscore. It does the same thing that Vim does: first it checks if ~/_vimrc exists, and if it doesn't find it, it then checks for ~/vimfiles/vimrc (which, after setting up your directory symlink, will be equivalent to ~/.vim/vimrc). Unix also searches in that location, so you don't need separate/different symlinks for the vimrc file.
    – Rich
    Jan 25, 2018 at 10:05
  • @Dmitrii I was presuming you were placing your entire .vim directory in your dotfiles repo. If only your vimrc is in the repo then you'll obviously still need to symlink it!
    – Rich
    Jan 25, 2018 at 10:09
  • Yes i only store my vimrc and simple install script which installs vundle first, then making necessary symlinks and then i manually insatll what i need. And it's only vimrc file without underscore and symlink with underscore at home.
    – Dmitrii
    Jan 25, 2018 at 10:17
3

As it turned out there are common practice to wrap platform specific options in statements which checks the system and set properties accrodingly to this. For some could be convenient to separate such statements into different files. As to me i end up with this:

if has("win32")
  set rtp+=$HOME/vimfiles/bundle/Vundle.vim/
  call vundle#begin('$USERPROFILE/vimfiles/bundle/')
else
  set rtp+=~/.vim/bundle/Vundle.vim/
  call vundle#rc()
endif

So i made changes in single vimrc and symlink it depending on platform.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.