blob: 5c9a532229240ad2713171ceaec1db80459b94dd [file] [log] [blame]
" Copyright 2018 The Chromium OS Authors. All rights reserved.
" Use of this source code is governed by a BSD-style license that can be
" found in the LICENSE file.
"
" Find and source local vimrc files in each parent directory. The order of
" finding and sourcing files is from parent to child. Therefore, if the
" directory structure is:
"
" project_root
" |-- a
" | |-- b
" | | `-- .local.vimrc
" | `-- .local.vimrc
" `-- .local.vimrc
"
" Then the order of loading .local.vimrc is::
"
" source project_root/.local.vimrc
" source project_root/a/.local.vimrc
" source project_root/a/b/.local.vimrc
"
" To use this script, copy this script to .vim/autoload/localrc.vim
" And in your vimrc, add::
"
" call localrc#load()
"
let s:save_cpo = &cpo
set cpo&vim
let g:localrc_default_depth = -1 " unlimited
let g:localrc_filename = '.local.vimrc'
function! localrc#load(...)
" filename we would like to load
let fname = 1 <= a:0 ? a:1 : g:localrc_filename
" If starting point is not given, will use working directory
let search_dir = 2 <= a:0 ? a:2 : getcwd()
" If max search depth is not given, use the default one
let max_depth = 3 <= a:0 ? a:3 : g:localrc_default_depth
for filepath in s:search(fname, search_dir, max_depth)
source `=filepath`
endfor
endfunction
function! s:search(fname, current_dir, depth)
" expand to full path
let current_dir = fnamemodify(a:current_dir, ':p')
" maximum depth to search for a localrc
let depth = a:depth
" current path ends with '/', remove it
if current_dir =~ '\/$'
let current_dir = fnamemodify(current_dir, ':h')
endif
let found_files = []
while depth != 0
for fpath in split(globpath(current_dir, a:fname, 1), "\n")
if filereadable(fpath)
let found_files = [fpath] + found_files
endif
endfor
let depth -= 1
if current_dir == '/'
break
else
let current_dir = fnamemodify(current_dir, ':h')
endif
endwhile
return found_files
endfunction
let &cpo = s:save_cpo
unlet s:save_cpo