changeset 176:c6a072353606

Vim config changes: * Better working dir management in `vimrc`. * Better shortcuts for NERDTree and CtrlP. * Misc stuff.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 20 Jul 2014 17:43:25 -0700
parents 095fb39b2096
children 94a131d9a200
files vim/vimrc
diffstat 1 files changed, 76 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/vim/vimrc	Thu Jul 10 11:05:19 2014 -0700
+++ b/vim/vimrc	Sun Jul 20 17:43:25 2014 -0700
@@ -244,6 +244,12 @@
 
 if has("autocmd")
 
+    augroup VimRCAutoCWD
+        au!
+
+        autocmd BufEnter * call s:SetProjectRootCwd()
+    augroup END
+
     augroup VimRCFileTypeSettings
         au!
     
@@ -282,7 +288,6 @@
 " Tab navigation
 nnoremap <C-Tab> :tabnext<cr>
 nnoremap <C-S-Tab> :tabprevious<cr>
-nnoremap <C-W> :tabclose<cr>
 
 " Buffer navigation
 nnoremap <C-S-right> :bnext<cr>
@@ -294,14 +299,16 @@
 nnoremap <C-left> :wincmd h<cr>
 nnoremap <C-right> :wincmd l<cr>
 
-" Open NERDtree.
-nnoremap <F2> :NERDTreeToggle %:p:h<cr>
+" Switch buffers.
+nnoremap <F2> :execute ("buffer " . bufname("#"))<cr>
 
-" Switch buffers.
-nnoremap <F3> :execute ("buffer " . bufname("#"))<cr>
+" NERDTree.
+nnoremap <F3> :call <SID>ToggleNERDTree()<cr>
+nnoremap <F4> :call <SID>FindInNERDTree()<cr>
 
 " Tagbar.
-nnoremap <F8> :TagbarToggle<cr>
+nnoremap <F5> :TagbarToggle<cr>
+nnoremap <F6> :TagbarOpenAutoClose<cr>
 
 " Common typos.
 nnoremap ; :
@@ -330,7 +337,8 @@
 " Ctrl-P mappings.
 nnoremap <silent> <C-p> :CtrlP<cr>
 nnoremap <silent> <C-o> :CtrlPBuffer<cr>
-nnoremap <silent> <C-i> :CtrlPMRU<cr>
+nnoremap <silent> <C-i> :CtrlPTag<cr>
+nnoremap <silent> <Tab> :CtrlPMRUFiles<cr>
 
 " Switch between FR and US keyboard layouts.
 nnoremap <C-l>f :setlocal keymap=french<cr>
@@ -430,6 +438,65 @@
     call cursor(l, c)
 endfunction
 
+function! s:FindProjectRoot(cur, marker) abort
+    let l:cur = a:cur
+    let l:previous_cur = ''
+    let l:slash = '/'
+    if has('win32')
+        let l:slash = '\\'
+    endif
+    while l:cur != l:previous_cur
+        let l:marker_path = l:cur . l:slash . a:marker
+        if glob(l:marker_path) != ''
+            return fnamemodify(l:cur, ':p')
+        endif
+        let l:previous_cur = l:cur
+        let l:cur = fnamemodify(l:cur, ':h')
+    endwhile
+    return ''
+endfunction
+
+function! s:SetProjectRootCwd() abort
+    let l:cur_file_dir = expand('%:p:h', 1)
+    if l:cur_file_dir =~ '\v^.+://'
+        return
+    endif
+    let l:root = l:cur_file_dir
+    let l:markers = g:ctrlp_root_markers[:]
+    let l:markers += ['.git', '.hg', '.svn', '.bzr', '_darcs']
+    for marker in l:markers
+        let l:proj_root = s:FindProjectRoot(l:cur_file_dir, marker)
+        if l:proj_root != ''
+            let l:root = l:proj_root
+            break
+        endif
+    endfor
+    execute 'lcd!' fnameescape(l:root)
+endfunction
+
+function! s:ToggleNERDTree() abort
+    let l:was_open = nerdtree#isTreeOpen()
+    NERDTreeToggle
+    if !l:was_open
+        wincmd p
+        NERDTreeCWD
+        wincmd p
+        NERDTreeFind
+    endif
+endfunction
+
+function! s:FindInNERDTree() abort
+    if !nerdtree#isTreeOpen()
+        call s:ToggleNERDTree()
+    else
+        if getbufvar('%', 'NERDTreeType') != ''
+            wincmd p
+        else
+            NERDTreeFind
+        endif
+    endif
+endfunction
+
 " }}}
 
 " Temporary stuff {{{
@@ -441,6 +508,8 @@
 command! LawrenciumEnableTrace  :call lawrencium#debugtrace(1)
 command! LawrenciumDisableTrace :call lawrencium#debugtrace(0)
 
+let g:autotags_debug = 1
+
 " Enable debugging PieCrust
 let g:piecrust_debug = 1
 let g:piecrust_trace = 0