Setting vim options only for files in a certain directory tree?
Hire the world's top talent on demand or became one of them at Toptal: https://topt.al/25cXVn
and get $2,000 discount on your first invoice
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Droplet of life
--
Chapters
00:00 Setting Vim Options Only For Files In A Certain Directory Tree?
00:27 Answer 1 Score 4
00:54 Accepted Answer Score 25
02:09 Answer 3 Score 1
02:37 Answer 4 Score 0
03:46 Thank you
--
Full question
https://superuser.com/questions/598947/s...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#vim #vimrc
#avk47
ACCEPTED ANSWER
Score 25
local / project-specific configuration
If it's okay to configure the specific commands / local exceptions centrally, you can put such autocmds into your ~/.vimrc
:
:autocmd BufRead,BufNewFile /path/to/dir/* setlocal ts=4 sw=4
It is important to use :setlocal
instead of :set
, and likewise :map <buffer> ...
and :command! -buffer ...
.
On the other hand, if you want the specific configuration stored with the project (and don't want to embed this in all files via modelines), you have the following two options:
Local config with built-in functionality
If you always start Vim from the project root directory, the built-in
:set exrc
enables the reading of a .vimrc
file from the current directory. You can place the :set ts=4 sw=4
commands in there.
Local config through plugin
Otherwise, you need the help of a plugin; there are several on vim.org; I can recommend the localrc plugin (especially with my own enhancements), which even allows local filetype-specific configuration.
Note that reading configuration from the file system has security implications; you may want to :set secure
.
ANSWER 2
Score 4
You can configure vim to read further commands using the source
(so) command.
Add this to your ~/.vimrc
- it searches the current directory and if .vimrc_proj file not found there searches for .vimrc_proj in the parent directory.
if filereadable(".vimrc_proj")
so .vimrc_proj
else
if filereadable("../.vimrc_proj")
so .vimrc_proj
endif
endif
Then add any custom commands in .vimrc_proj
config files to suit your projects.
ANSWER 3
Score 1
You can use a plugin for Vim to solve the problem in a more general way by trying to detect the indention.
The plugin of choice for me is DetectIndent. It took some time for me to test all the forks of the plugin to find one that suits my needs. The original one was really close but not quite so I made my own fork.
For debugging it is very helpful to :set verbose=1
and run the plugin again with :DetectIndent
ANSWER 4
Score 0
One possible solution which was not mentioned yet is to go one level above and implement project-specific shell scripts to fire up your vim environment.
This allows vim-specific settings to be passed using the -S
command-line option. The advantage is that it also allows configuring other aspects of the environment, such as the terminal or cscope settings.
For example, let's say I have a C++ project called foo
, for which I want to load vim settings of the file ~/.vim/projects/foo.vim
. I also want to set up a cscope index and launch a terminal window if the command is invoked from some quick launch tool or desktop shortcut. To open up my environment, I have the following script, called vim-foo
:
#!/bin/bash
# Script to setup the VIM development environment of my "foo" project
# Includes building ctags and cscope databases.
VIM_CONFIG=$HOME/.vim/projects/foo.vim
BASE_DIR=$HOME/work/foo
function setup_cscope()
{
CSCOPE_FILES=$BASE_DIR/cscope.files
created_files=false
# check if global cscope.files exist
if [ ! -f $CSCOPE_FILES ]; then
echo "Creating cscope.files"
find $BASE_DIR/src -name '*.cpp' -o -name '*.h' >> $CSCOPE_FILES
created_files=true
fi
# create cscope database
if [ $created_files ] || \
[ ! -f $BASE_DIR/cscope.in.out ] || \
[ ! -f $BASE_DIR/cscope.po.out ] || \
[ ! -f $BASE_DIR/cscope.out ]; then
echo "Creating cscope database"
cscope -b -q -i $CSCOPE_FILES
for f in in.out po.out out; do
mv cscope.$f $BASE_DIR/
done
fi
export CSCOPE_DB=$BASE_DIR/cscope.out
}
# setup everything and finally launch vim
setup_cscope
cd $BASE_DIR
if [[ $TERM == "rxvt-unicode" ]]; then
vim -S $VIM_CONFIG
else
urxvt -e vim -S $VIM_CONFIG
fi