changeset 69:6900302dae0b

Merge pull request #28 from GitHub.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 16 Jul 2015 21:40:52 -0700
parents 3ae6964078ab (diff) ca61487b3215 (current diff)
children 661a97eaf608
files autoload/gutentags.vim autoload/gutentags/ctags.vim doc/gutentags.txt
diffstat 4 files changed, 85 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/autoload/gutentags.vim	Sun May 17 10:53:41 2015 +0200
+++ b/autoload/gutentags.vim	Thu Jul 16 21:40:52 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	Sun May 17 10:53:41 2015 +0200
+++ b/autoload/gutentags/ctags.vim	Thu Jul 16 21:40:52 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	Sun May 17 10:53:41 2015 +0200
+++ b/doc/gutentags.txt	Thu Jul 16 21:40:52 2015 -0700
@@ -288,6 +288,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
--- a/plat/unix/update_tags.sh	Sun May 17 10:53:41 2015 +0200
+++ b/plat/unix/update_tags.sh	Thu Jul 16 21:40:52 2015 -0700
@@ -67,7 +67,7 @@
 echo $$ > "$TAGS_FILE.lock"
 
 # Remove lock and temp file if script is stopped unexpectedly.
-trap "rm -f \"$TAGS_FILE.lock\" \"$TAGS_FILE.temp\"" 0 3 4 15
+trap "errorcode=$?; rm -f \"$TAGS_FILE.lock\" \"$TAGS_FILE.temp\"; exit $errorcode" INT TERM EXIT
 
 if [ -f "$TAGS_FILE" ]; then
     if [ "$UPDATED_SOURCE" != "" ]; then