changeset 291:aac9b5b1f921

Fix how we set the CWD in Vim based on the project root.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 19 Mar 2015 17:06:31 -0700
parents 65a5097587d4
children 6938fb0146f5
files vim/vimrc
diffstat 1 files changed, 21 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/vim/vimrc	Thu Mar 19 17:02:58 2015 -0700
+++ b/vim/vimrc	Thu Mar 19 17:06:31 2015 -0700
@@ -196,8 +196,8 @@
     set background=dark
 else
     set background=dark
-    let g:solarized_termcolors = 256
-    let g:solarized_termtrans = 1
+    "let g:solarized_termcolors = 256
+    "let g:solarized_termtrans = 1
 endif
 colorscheme solarized
 
@@ -324,7 +324,8 @@
 " I'm in.
 augroup VimRCAutoCWD
     au!
-    autocmd BufEnter * call s:SetProjectRootCwd()
+    autocmd BufReadPost * call s:SetProjectRootCwd(1)
+    autocmd BufEnter * call s:SetProjectRootCwd(0)
 augroup END
 
 augroup VimRCFileType_markdown
@@ -581,7 +582,7 @@
     let l:previous_cur = ''
     let l:slash = '/'
     if has('win32')
-        let l:slash = '\\'
+        let l:slash = '\'
     endif
     while l:cur != l:previous_cur
         let l:marker_path = l:cur . l:slash . a:marker
@@ -594,28 +595,40 @@
     return ''
 endfunction
 
-function! s:SetProjectRootCwd() abort
+function! s:SetProjectRootCwd(recompute) abort
+    if a:recompute != 1 && exists('b:ludo_workdir')
+        execute 'lcd!' fnameescape(b:ludo_workdir)
+        return
+    endif
+
     let l:cur_file_dir = expand('%:p:h', 1)
     if l:cur_file_dir =~ '\v^(\w+:)?(//|\\\\)'
         " Don't do shit on filenames coming from the network or something.
         return
     endif
     let l:found_root = 0
-    let l:root = l:cur_file_dir
+    let l:root = ''
     let l:markers = []
     if exists('g:ctrlp_root_markers')
         let l:markers += g:ctrlp_root_markers
     endif
     let l:markers += ['.git', '.hg', '.svn', '.bzr', '_darcs']
+    let l:unique_markers = []
     for marker in l:markers
+        if index(l:unique_markers, marker) < 0
+            call add(l:unique_markers, marker)
+        endif
+    endfor
+    " Find the project root closest to the current file.
+    for marker in l:unique_markers
         let l:proj_root = s:FindProjectRoot(l:cur_file_dir, marker)
-        if l:proj_root != ''
+        if l:proj_root != '' && len(l:proj_root) > len(l:root)
             let l:root = l:proj_root
             let l:found_root = 1
-            break
         endif
     endfor
     if l:found_root
+        let b:ludo_workdir = l:root
         execute 'lcd!' fnameescape(l:root)
     endif
 endfunction