feat: project specific vimrc configuration
This commit is contained in:
parent
5c0868f369
commit
6377141608
68
README.md
Normal file
68
README.md
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
# Project Config
|
||||||
|
|
||||||
|
Drop the plugin into `~/.vim/pack/{foo}/start/projectconfig`.
|
||||||
|
|
||||||
|
In your ~/.vimrc you need to set up the project directories and the
|
||||||
|
configuration file to map to:
|
||||||
|
|
||||||
|
```
|
||||||
|
let g:projectconfig_projects = {
|
||||||
|
\ '~/dev/my-project' : '~/.config/my-project.vim',
|
||||||
|
\ '~/wiki' : '~/wiki/.vimrc',
|
||||||
|
\ }
|
||||||
|
```
|
||||||
|
|
||||||
|
And to load the configuration for the file that you opened:
|
||||||
|
|
||||||
|
E.g.
|
||||||
|
|
||||||
|
```
|
||||||
|
au BufNewFile,BufRead ~/dev/* call projectconfig#load()
|
||||||
|
```
|
||||||
|
|
||||||
|
# Buffer scope for project configuration
|
||||||
|
|
||||||
|
Prefer `setlocal`, `localleader` and `<buffer>` for project
|
||||||
|
configuration, so that the changes are scoped to a specific buffer and
|
||||||
|
doesn't override your default, or other project config when you open
|
||||||
|
various files.
|
||||||
|
|
||||||
|
E.g. to override my default from 4 spaces to 2 spaces in a project I
|
||||||
|
would use:
|
||||||
|
|
||||||
|
`~/.vimrc`:
|
||||||
|
|
||||||
|
```
|
||||||
|
# default configuration
|
||||||
|
|
||||||
|
set tabstop=4
|
||||||
|
set shiftwidth=4
|
||||||
|
```
|
||||||
|
|
||||||
|
and in e.g. `~/.config/my-project.vim`
|
||||||
|
|
||||||
|
```
|
||||||
|
# my-project configuration
|
||||||
|
|
||||||
|
setlocal tabstop=2
|
||||||
|
setlocal shiftwidth=2
|
||||||
|
```
|
||||||
|
|
||||||
|
# Caveats
|
||||||
|
|
||||||
|
## `('._.)`
|
||||||
|
|
||||||
|
- Only tested with VIM 8.2.
|
||||||
|
|
||||||
|
## `(;._.)`
|
||||||
|
|
||||||
|
- **BE MINDFUL OF WHERE THE CONFIG LIVES**. If you have `vimrc` file
|
||||||
|
stored in the project repo, changes to it will happily be sourced the
|
||||||
|
next time you pull. This plugin does not do verification.
|
||||||
|
|
||||||
|
## `(╯._.)╯︵ ┻━┻`
|
||||||
|
|
||||||
|
- If a project config sets a setting that the base, or next project
|
||||||
|
config doesn't, then the project config will still be active when
|
||||||
|
changing to a file in another project. Work around this by customising the `autocmd` and use `setlocal`,
|
||||||
|
`localleader`, and `<buffer>` in [project configuration](#buffer-scope-for-project-configuration).
|
19
autoload/projectconfig.vim
Normal file
19
autoload/projectconfig.vim
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
function! projectconfig#find() abort
|
||||||
|
let l:basedir = expand('%:p:h')
|
||||||
|
for l:project in keys(g:projectconfig_projects)
|
||||||
|
if l:basedir =~ l:project
|
||||||
|
return get(g:projectconfig_projects, l:project, '')
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! projectconfig#load() abort
|
||||||
|
let l:file = projectconfig#find()
|
||||||
|
if filereadable(l:file)
|
||||||
|
let l:safe = fnameescape(l:file)
|
||||||
|
execute 'source' l:safe
|
||||||
|
return 'Loaded project configuration: ' . l:safe
|
||||||
|
else
|
||||||
|
return 'Using default project configuration'
|
||||||
|
endif
|
||||||
|
endfunction
|
13
plugin/projectconfig.vim
Normal file
13
plugin/projectconfig.vim
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
" Title: Project Config
|
||||||
|
" Description: Load local configuration for a project
|
||||||
|
" Last Change: 2022-05-09
|
||||||
|
" Maintainer: Viktor Varland <https://github.com/varl>
|
||||||
|
|
||||||
|
if exists("g:loaded_projectconfig")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let g:loaded_projectconfig = 1
|
||||||
|
|
||||||
|
" Exposes the plugin's functions for use as commands in Vim.
|
||||||
|
command! -nargs=0 ProjectConfigFind call projectconfig#find()
|
||||||
|
command! -nargs=0 ProjectConfigLoad call projectconfig#load()
|
Loading…
Reference in a new issue