changeset 65:3ae6964078ab

Merge pull request #30 from GitHub.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 15 Jul 2015 23:15:39 -0700
parents 0f5b4a36c920 (diff) 547df6917df9 (current diff)
children 6900302dae0b
files
diffstat 3 files changed, 84 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/autoload/gutentags.vim	Mon Jun 01 14:15:04 2015 +0200
+++ b/autoload/gutentags.vim	Wed Jul 15 23:15:39 2015 -0700
@@ -95,6 +95,13 @@
         return
     endif
 
+    " Don't setup gutentags for anything that's not a normal buffer
+    " (so don't do anything for help buffers and quickfix windows and
+    "  other such things)
+    if &buftype != ''
+        return
+    endif
+
     " Try and find what tags file we should manage.
     call gutentags#trace("Scanning buffer '" . bufname('%') . "' for gutentags setup...")
     try
--- a/autoload/gutentags/ctags.vim	Mon Jun 01 14:15:04 2015 +0200
+++ b/autoload/gutentags/ctags.vim	Wed Jul 15 23:15:39 2015 -0700
@@ -14,6 +14,10 @@
     let g:gutentags_auto_set_tags = 1
 endif
 
+if !exists('g:gutentags_ctags_options_file')
+    let g:gutentags_ctags_options_file = '.gutctags'
+endif
+
 " }}}
 
 " Gutentags Module Interface {{{
@@ -57,8 +61,11 @@
         if g:gutentags_pause_after_update
             let l:cmd .= ' -c'
         endif
-        let l:proj_options_file = a:proj_dir . '/.ctags'
+        let l:proj_options_file = a:proj_dir . '/' . 
+                    \g:gutentags_ctags_options_file
         if filereadable(l:proj_options_file)
+            let l:proj_options_file = s:process_options_file(
+                        \a:proj_dir, l:proj_options_file)
             let l:cmd .= ' -o "' . l:proj_options_file . '"'
         endif
         if g:gutentags_trace
@@ -99,3 +106,58 @@
 
 " }}}
 
+" Utilities {{{
+
+function! s:process_options_file(proj_dir, path) abort
+    if g:gutentags_cache_dir == ""
+        " If we're not using a cache directory to store tag files, we can
+        " use the options file straight away.
+        return a:path
+    endif
+
+    " See if we need to process the options file.
+    let l:do_process = 0
+    let l:proj_dir = gutentags#stripslash(a:proj_dir)
+    let l:out_path = gutentags#get_cachefile(l:proj_dir, 'options')
+    if !filereadable(l:out_path)
+        call gutentags#trace("Processing options file '".a:path."' because ".
+                    \"it hasn't been processed yet.")
+        let l:do_process = 1
+    elseif getftime(a:path) > getftime(l:out_path)
+        call gutentags#trace("Processing options file '".a:path."' because ".
+                    \"it has changed.")
+        let l:do_process = 1
+    endif
+    if l:do_process == 0
+        " Nothing's changed, return the existing processed version of the
+        " options file.
+        return l:out_path
+    endif
+
+    " We have to process the options file. Right now this only means capturing
+    " all the 'exclude' rules, and rewrite them to make them absolute.
+    "
+    " This is because since `ctags` is run with absolute paths (because we
+    " want the tag file to be in a cache directory), it will do its path
+    " matching with absolute paths too, so the exclude rules need to be
+    " absolute.
+    let l:lines = readfile(a:path)
+    let l:outlines = []
+    for line in l:lines
+        let l:exarg = matchend(line, '\v^\-\-exclude=')
+        if l:exarg < 0
+            call add(l:outlines, line)
+            continue
+        endif
+        let l:fullp = gutentags#normalizepath(l:proj_dir.'/'.
+                    \strpart(line, l:exarg + 1))
+        let l:ol = '--exclude='.l:fullp
+        call add(l:outlines, l:ol)
+    endfor
+
+    call writefile(l:outlines, l:out_path)
+    return l:out_path
+endfunction
+
+" }}}
+
--- a/doc/gutentags.txt	Mon Jun 01 14:15:04 2015 +0200
+++ b/doc/gutentags.txt	Wed Jul 15 23:15:39 2015 -0700
@@ -279,6 +279,20 @@
                         |GutentagsUpdate| or |GutentagsGenerate| is run.
                         Defaults to 1.
 
+                                                *gutentags_generate_on_new*
+g:gutentags_generate_on_new
+                        If set to 1, Gutentags will start generating the tag
+                        file when a new project is open. A new project is
+                        considered open when a buffer is created for a file
+                        whose corresponding tag file has not been "seen" yet
+                        in the current Vim session -- which pretty much means
+                        when you open the first file in a given source control
+                        repository.
+                        When set to 0, Gutentags won't do anything special.
+                        See also |gutentags_generate_on_missing| and
+                        |gutentags_generate_on_write|.
+                        Defaults to 1.
+
                                                 *gutentags_generate_on_write*
 g:gutentags_generate_on_write
                         If set to 1, Gutentags will update the current