Table of Contents

Vimprj

Vimprj is a Vim plugin that helps you manage options for multiple projects.

Consider reading the article Vim: convenient code navigation for your projects, which explains the topic on Indexer + Vimprj usage very thoroughly.

Overview

Many times I faced a problem. That's the story:

I'd like to use 3-space indent in my projects. No tabs, exactly three spaces. One day I need to work on another project written by someone else, and there's 4-space indent. Or maybe tabs.

I need to work on this project too, and of course I need to stick to existing formatting options.

I strongly dislike that i have to switch these options by hand: &shiftwidth, &tabstop, &expandtab.

So I decided to write this plugin to make my life easier.

Installation

The project is hosted at bitbucket. Stable versions are at vim.org. Download source code from there and install it as any other Vim plugin.

There is a dependency: a simple library Vim-DFUtil.

Usage

Usage of this plugin is quite easy. In the root directory of your project, you need to create new directory .vimprj and put any number of files *.vim inside. Every time you open new file in Vim, plugin looks for .vimprj directory up by tree, and if it is found, then all *.vim files from it will be sourced.

Or, you can just put file .vimprj, then this file will be sourced. Name .vimprj can be changed by editing option g:vimprj_dirNameForSearch.

For my own projects, I usually create the file .vimprj/my.vim with the following contents:

let &tabstop = 3
let &shiftwidth = 3
set expandtab

My .vimprj directory also contain tags and other project-specific files, so, I prefer to use directory instead of just one file.

Now, when I open file from my project, file my.vim is sourced. When I open file from some another project, its own file with options is sourced too. Of course, when I switch buffer, this files are sourced too if project is changed.

So, I always have correct options, and simultaneus work on several projects with different formatting options is not painful anymore for me.

And, of course, you can use it not only to manage formatting options. For instance, in some projects I use mapping <F9> to open project window (from plugin Project), but for some java projects i use Eclim, and <F9> should be mapped to another command (to open Eclim's project). All these options can also be specified in .vimprj dir.

Attentive reader might notice an issue: as I already said, I would like to use shiftwidth=3. Say, I open some file from my project with shiftwidth=3. Everything's fine here. Then I open file from another project with shiftwidth=4. Things are still OK. Then I open some file not from any project (there's no .vimprj directory). Of course, I would like to use my favorite options (that is, shiftwidth=3), but current shiftwidth is 4, because it was changed when I opened last project. It leads us to the fact that we should define default options. But here, let me make a digression.

Plugin provides some hooks for any other plugin. Namely, plugin Vim-Indexer (since version 4.0) uses these hooks to provide correct behavior when user works on multiple project simultaneusly.

Right now I have not yet documented all of them, because of lack of free time, but I just tell you about one hook that allows you to specify your default options.

It's SetDefaultOptions hook. Now I'm going to show you an example. You might want to paste this example to your .vimrc, and just specify your own default options instead of mine ones:

function! <SID>SetMainDefaults()
 
   " your default options go here!
   set tabstop=3
   set shiftwidth=3
   set expandtab
 
endfunction
 
call <SID>SetMainDefaults()
 
" initialize vimprj plugin
call vimprj#init()
 
" define a hook. note that 'main_options' is an arbitrary string,
" each entity that uses these hooks should pick an unique name.
function! g:vimprj#dHooks['SetDefaultOptions']['main_options'](dParams)
   call <SID>SetMainDefaults()
endfunction

Now, Vimprj plugin will call your function SetMainDefaults just before sourcing your .vimprj directory, and when you open file not from any project.

If you are interested about other hooks, you can just look how they are used in Vim-Indexer plugin.

More

For further information, such as options and so on, refer to :help vimprj.