aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--README.md29
-rw-r--r--autoload/xolox/easytags.vim159
-rw-r--r--autoload/xolox/misc/README.md33
-rw-r--r--autoload/xolox/misc/buffer.vim42
-rw-r--r--autoload/xolox/misc/compat.vim23
-rw-r--r--autoload/xolox/misc/path.vim11
-rw-r--r--doc/easytags.txt97
-rw-r--r--plugin/easytags.vim7
9 files changed, 317 insertions, 85 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..926ccaa
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+doc/tags
diff --git a/README.md b/README.md
index a7b3d24..c8af518 100644
--- a/README.md
+++ b/README.md
@@ -54,6 +54,26 @@ The plug-in will try to determine the location where Exuberant Ctags is installe
:let g:easytags_cmd = '/usr/local/bin/ctags'
+If you rely entirely on language-specific configuration and don't have a general ctags program, set this to the empty string.
+
+### The `g:easytags_languages` option
+
+Exuberant Ctags supports many languages and can be extended via regular expression patterns, but for some languages separate tools with ctags-compatible output exist (e.g. [jsctags] [jsctags] for Javascript). To use these, the executable and its arguments must be configured:
+
+ let g:easytags_languages = {
+ \ 'language': {
+ \ 'cmd': g:easytags_cmd,
+ \ 'args': [],
+ \ 'fileoutput_opt': '-f',
+ \ 'stdout_opt': '-f-',
+ \ 'recurse_flag': '-R'
+ \ }
+ \}
+
+Each key is a special language definition. The key is in the notation of ctags in lowercase; you still need to use `xolox#easytags#map_filetypes()` to map this to Vim's filetypes, if necessary.
+
+Above snippets shows the defaults; you only need to specify options that differ.
+
### The `g:easytags_file` option
As mentioned above the plug-in will store your tags in `~/.vimtags` on UNIX and `~/_vimtags` on Windows. To change the location of this file, set the global variable `g:easytags_file`, e.g.:
@@ -105,11 +125,9 @@ Note: Like the `g:easytags_always_enabled` option, if you change this option it
### The `g:easytags_updatetime_min` option
-Vim has a setting which influences how often the plug-in is automatically executed. When this setting is too low, the plug-in can break. For this reason the plug-in warns you when ['updatetime'][updatetime] is lower than 4000 milliseconds. If you really want the plug-in to be executed more than once every 4 seconds (without a warning) you can lower the minimum acceptable updatetime by setting this option (number of milliseconds).
-
-### The `g:easytags_updatetime_autodisable` option
+Vim has a setting which influences how often the plug-in is automatically executed. When this setting is too low, the plug-in can break. For this reason the plug-in compensates by keeping track of when it was last executed. You'll get one warning when the plug-in first notices the low value, after that it will shut up. The default value of this option is 4000 milliseconds (4 seconds).
-Other plug-ins may lower the ['updatetime'][updatetime] value in certain contexts, e.g. insert mode in the case of the [neocomplcache][neocomplcache] plug-in. By setting this option to 1 (true) you can configure the easytags plug-in so that it doesn't give warnings about the updatetime option but instead skip updating and highlighting while the updatetime is set too low. When the updatetime is restored to a reasonable value the plug-in resumes.
+If you really want the plug-in to be executed more than once every 4 seconds you can lower the minimum acceptable updatetime by setting this option (as the number of milliseconds) however note that subsecond granularity is not supported.
### The `g:easytags_auto_update` option
@@ -260,7 +278,7 @@ If you have questions, bug reports, suggestions, etc. the author can be contacte
## License
This software is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License).
-© 2011 Peter Odding &lt;<peter@peterodding.com>&gt;.
+© 2013 Peter Odding &lt;<peter@peterodding.com>&gt;.
[canon]: http://en.wikipedia.org/wiki/Canonicalization
@@ -278,6 +296,7 @@ This software is licensed under the [MIT license](http://en.wikipedia.org/wiki/M
[exctags]: http://ctags.sourceforge.net/
[hlinks]: http://en.wikipedia.org/wiki/Hard_link
[ide]: http://en.wikipedia.org/wiki/Integrated_development_environment
+[jsctags]: https://npmjs.org/package/jsctags
[messages]: http://vimdoc.sourceforge.net/htmldoc/message.html#:messages
[neocomplcache]: http://www.vim.org/scripts/script.php?script_id=2620
[shell]: http://peterodding.com/code/vim/shell/
diff --git a/autoload/xolox/easytags.vim b/autoload/xolox/easytags.vim
index d937eff..8113942 100644
--- a/autoload/xolox/easytags.vim
+++ b/autoload/xolox/easytags.vim
@@ -1,9 +1,11 @@
" Vim script
" Author: Peter Odding <peter@peterodding.com>
-" Last Change: January 15, 2012
+" Last Change: April 21, 2013
" URL: http://peterodding.com/code/vim/easytags/
-let g:xolox#easytags#version = '2.8.1'
+let g:xolox#easytags#version = '3.1.3'
+
+call xolox#misc#compat#check('easytags', 1)
" Public interface through (automatic) commands. {{{1
@@ -34,24 +36,31 @@ function! xolox#easytags#register(global) " {{{2
endif
endfunction
+" The localtime() when the CursorHold event last fired.
+let s:last_automatic_run = 0
+
function! xolox#easytags#autoload(event) " {{{2
try
if a:event =~? 'cursorhold'
" Only for the CursorHold automatic command: check for unreasonable
" &updatetime values. The minimum value 4000 is kind of arbitrary
- " (apart from being Vim's default) so I made it configurable:
+ " (apart from being Vim's default) so I made it configurable.
let updatetime_min = xolox#misc#option#get('easytags_updatetime_min', 4000)
if &updatetime < updatetime_min
- " Other plug-ins may lower &updatetime in certain contexts, e.g.
- " insert mode in the case of the neocomplcache plug-in. The following
- " option (disabled by default unless neocomplcache is loaded) silences
- " the warning and makes the easytags plug-in skip the update and
- " highlight. When the &updatetime is restored to a reasonable value
- " the plug-in resumes.
- if xolox#misc#option#get('easytags_updatetime_autodisable', exists('g:loaded_neocomplcache'))
- return
+ if s:last_automatic_run == 0
+ " Warn once about the low &updatetime value.
+ call xolox#misc#msg#warn("easytags.vim %s: The 'updatetime' option has an unreasonably low value, so I'll start compensating (see the easytags_updatetime_min option).", g:xolox#easytags#version)
+ let s:last_automatic_run = localtime()
else
- call xolox#misc#msg#warn("easytags.vim %s: I'm being executed every %i milliseconds! Please :set updatetime=%i. To find where 'updatetime' was changed execute ':verb set ut?'", g:xolox#easytags#version, &updatetime, updatetime_min)
+ let next_scheduled_run = s:last_automatic_run + max([1, updatetime_min / 1000])
+ if localtime() < next_scheduled_run
+ " It's not our time yet; wait for the next event.
+ call xolox#misc#msg#debug("easytags.vim %s: Skipping this beat of 'updatetime' to compensate for low value.", g:xolox#easytags#version)
+ return
+ else
+ call xolox#misc#msg#debug("easytags.vim %s: This is our beat of 'updatetime'!", g:xolox#easytags#version)
+ let s:last_automatic_run = localtime()
+ endif
endif
endif
endif
@@ -99,8 +108,11 @@ function! xolox#easytags#update(silent, filter_tags, filenames) " {{{2
let tagsfile = xolox#easytags#get_tagsfile()
let firstrun = !filereadable(tagsfile)
let cmdline = s:prep_cmdline(cfile, tagsfile, firstrun, a:filenames, context)
- let output = s:run_ctags(starttime, cfile, tagsfile, firstrun, cmdline)
+ let [output, has_updates] = s:run_ctags(starttime, cfile, tagsfile, firstrun, cmdline)
if !firstrun
+ if !has_updates
+ return 1
+ endif
if have_args && !empty(g:easytags_by_filetype)
" TODO Get the headers from somewhere?!
call s:save_by_filetype(a:filter_tags, [], output, context)
@@ -157,28 +169,47 @@ function! s:check_cfile(silent, filter_tags, have_args) " {{{3
endfunction
function! s:prep_cmdline(cfile, tagsfile, firstrun, arguments, context) " {{{3
- let program = xolox#misc#option#get('easytags_cmd')
- let cmdline = [program, '--fields=+l', '--c-kinds=+p', '--c++-kinds=+p']
- if a:firstrun
- call add(cmdline, xolox#misc#escape#shell('-f' . a:tagsfile))
- call add(cmdline, '--sort=' . (&ic ? 'foldcase' : 'yes'))
+ let languages = xolox#misc#option#get('easytags_languages', {})
+ let ctags_language_name = xolox#easytags#to_ctags_ft(&filetype)
+ let language = get(languages, ctags_language_name, {})
+ if empty(language)
+ let program = xolox#misc#option#get('easytags_cmd')
+ let cmdline = [program, '--fields=+l', '--c-kinds=+p', '--c++-kinds=+p']
+ if a:firstrun
+ call add(cmdline, xolox#misc#escape#shell('-f' . a:tagsfile))
+ call add(cmdline, '--sort=' . (&ic ? 'foldcase' : 'yes'))
+ else
+ call add(cmdline, '--sort=no')
+ call add(cmdline, '-f-')
+ endif
+ if xolox#misc#option#get('easytags_include_members', 0)
+ call add(cmdline, '--extra=+q')
+ endif
else
- call add(cmdline, '--sort=no')
- call add(cmdline, '-f-')
- endif
- if xolox#misc#option#get('easytags_include_members', 0)
- call add(cmdline, '--extra=+q')
+ let program = get(language, 'cmd', xolox#misc#option#get('easytags_cmd'))
+ if empty(program)
+ call xolox#misc#msg#warn("easytags.vim %s: No 'cmd' defined for language '%s', and also no global default!", g:xolox#easytags#version, ctags_language_name)
+ return
+ endif
+ let cmdline = [program] + get(language, 'args', [])
+ if a:firstrun
+ call add(cmdline, xolox#misc#escape#shell(get(language, 'fileoutput_opt', '-f') . a:tagsfile))
+ else
+ call add(cmdline, xolox#misc#escape#shell(get(language, 'stdout_opt', '-f-')))
+ endif
endif
let have_args = 0
if a:cfile != ''
if xolox#misc#option#get('easytags_autorecurse', 0)
- call add(cmdline, '-R')
+ call add(cmdline, empty(language) ? '-R' : xolox#misc#escape#shell(get(language, 'recurse_flag', '-R')))
call add(cmdline, xolox#misc#escape#shell(a:cfile))
else
- " TODO Should --language-force distinguish between C and C++?
- " TODO --language-force doesn't make sense for JavaScript tags in HTML files?
- let filetype = xolox#easytags#to_ctags_ft(&filetype)
- call add(cmdline, xolox#misc#escape#shell('--language-force=' . filetype))
+ if empty(language)
+ " TODO Should --language-force distinguish between C and C++?
+ " TODO --language-force doesn't make sense for JavaScript tags in HTML files?
+ let filetype = xolox#easytags#to_ctags_ft(&filetype)
+ call add(cmdline, xolox#misc#escape#shell('--language-force=' . filetype))
+ endif
call add(cmdline, xolox#misc#escape#shell(a:cfile))
endif
let have_args = 1
@@ -203,10 +234,12 @@ endfunction
function! s:run_ctags(starttime, cfile, tagsfile, firstrun, cmdline) " {{{3
let lines = []
+ let has_updates = 1
if a:cmdline != ''
call xolox#misc#msg#debug("easytags.vim %s: Executing %s.", g:xolox#easytags#version, a:cmdline)
try
let lines = xolox#shell#execute(a:cmdline, 1)
+ let has_updates = a:firstrun || s:has_updates(a:cfile, join(lines, "\n"))
catch /^Vim\%((\a\+)\)\=:E117/
" Ignore missing shell.vim plug-in.
let output = system(a:cmdline)
@@ -215,6 +248,7 @@ function! s:run_ctags(starttime, cfile, tagsfile, firstrun, cmdline) " {{{3
throw printf(msg, fnamemodify(a:tagsfile, ':~'), strtrans(output))
endif
let lines = split(output, "\n")
+ let has_updates = a:firstrun || s:has_updates(a:cfile, output)
endtry
if a:firstrun
if a:cfile != ''
@@ -225,9 +259,47 @@ function! s:run_ctags(starttime, cfile, tagsfile, firstrun, cmdline) " {{{3
return []
endif
endif
- return xolox#easytags#parse_entries(lines)
+ return [xolox#easytags#parse_entries(lines), has_updates]
endfunction
+" Vim 7.3 now has the sha256() function. We use it below to recognize when the
+" tags haven't changed from the last time we ran Exuberant Ctags on a file; in
+" this case the tags file doesn't have to be written to disk which makes the
+" plug-in much faster for a very common case.
+
+let s:fingerprints = {}
+
+function! s:has_updates(cfile, output)
+ if empty(a:cfile)
+ " The cache doesn't work when tags aren't created for the current file.
+ return 1
+ endif
+ let fingerprint = s:get_fingerprint(a:cfile, a:output)
+ call xolox#misc#msg#debug("easytags.vim %s: Fingerprint of tags in %s is %s.", g:xolox#easytags#version, a:cfile, string(fingerprint))
+ if !empty(fingerprint) && get(s:fingerprints, a:cfile, '') ==# fingerprint
+ call xolox#misc#msg#debug("easytags.vim %s: The fingerprint didn't change! We can take a shortcut :-)", g:xolox#easytags#version)
+ return 0
+ endif
+ let s:fingerprints[a:cfile] = fingerprint
+ return 1
+endfunction
+
+if exists('*sha256')
+ function! s:get_fingerprint(cfile, output)
+ return sha256(a:output)
+ endfunction
+else
+ function! s:get_fingerprint(cfile, output)
+ " Don't want to re-implement a costly hashing function in Vimscript. Just
+ " handle files that never had any tags.
+ if empty(a:output)
+ return get(s:fingerprints, a:cfile, 1)
+ else
+ return ''
+ endif
+ endfunction
+endif
+
function! s:filter_merge_tags(filter_tags, tagsfile, output, context) " {{{3
let [headers, entries] = xolox#easytags#read_tagsfile(a:tagsfile)
let filters = []
@@ -414,18 +486,21 @@ endfunction
function! xolox#easytags#supported_filetypes() " {{{2
if !exists('s:supported_filetypes')
let starttime = xolox#misc#timer#start()
- let command = g:easytags_cmd . ' --list-languages'
- try
- let listing = xolox#shell#execute(command, 1)
- catch /^Vim\%((\a\+)\)\=:E117/
- " Ignore missing shell.vim plug-in.
- let listing = split(system(command), "\n")
- if v:shell_error
- let msg = "Failed to get supported languages! (output: %s)"
- throw printf(msg, strtrans(join(listing, "\n")))
- endif
- endtry
- let s:supported_filetypes = map(copy(listing), 's:check_filetype(listing, v:val)')
+ let listing = []
+ if !empty(g:easytags_cmd)
+ let command = g:easytags_cmd . ' --list-languages'
+ try
+ let listing = xolox#shell#execute(command, 1)
+ catch /^Vim\%((\a\+)\)\=:E117/
+ " Ignore missing shell.vim plug-in.
+ let listing = split(system(command), "\n")
+ if v:shell_error
+ let msg = "Failed to get supported languages! (output: %s)"
+ throw printf(msg, strtrans(join(listing, "\n")))
+ endif
+ endtry
+ endif
+ let s:supported_filetypes = map(copy(listing) + keys(xolox#misc#option#get('easytags_languages', {})), 's:check_filetype(listing, v:val)')
let msg = "easytags.vim %s: Retrieved %i supported languages in %s."
call xolox#misc#timer#stop(msg, g:xolox#easytags#version, len(s:supported_filetypes), starttime)
endif
@@ -923,7 +998,7 @@ call xolox#easytags#define_tagkind({
\ 'filetype': 'sh',
\ 'hlgroup': 'shFunctionTag',
\ 'tagkinds': 'f',
- \ 'pattern_suffix': '\(\s*()\)\@!'})
+ \ 'pattern_suffix': '\(\w\|\s*()\)\@!'})
highlight def link shFunctionTag Operator
diff --git a/autoload/xolox/misc/README.md b/autoload/xolox/misc/README.md
index 9111126..f375fe6 100644
--- a/autoload/xolox/misc/README.md
+++ b/autoload/xolox/misc/README.md
@@ -1,24 +1,49 @@
# Miscellaneous auto-load Vim scripts
-The git repository at <http://github.com/xolox/vim-misc> contains Vim scripts that are used by most of the [Vim plug-ins I've written] [plugins] yet don't really belong with any single one. I include this repository as a subdirectory of my plug-in repositories using the following commands:
+The git repository at [github.com/xolox/vim-misc] [repository] contains Vim scripts that are used by most of the [Vim plug-ins I've written] [plugins] yet don't really belong with any single one. I include this repository as a subdirectory of my plug-in repositories using the following commands:
$ git remote add -f vim-misc https://github.com/xolox/vim-misc.git
$ git merge -s ours --no-commit vim-misc/master
$ git read-tree --prefix=autoload/xolox/misc/ -u vim-misc/master
$ git commit -m "Merge vim-misc repository as subdirectory"
-To update a plug-in repository to the latest versions of the miscellaneous auto-load scripts I execute the following command:
+The above trick is called the [subtree merge strategy] [merge-strategy]. To update a plug-in repository to the latest version of the miscellaneous auto-load scripts I execute the following command:
$ git pull -s subtree vim-misc master
+## Why make things so complex?
+
+I came up with this solution after multiple years of back and forth between Vim Online users, the GitHub crowd and my own sanity:
+
+1. When I started publishing my first Vim plug-ins I would prepare ZIP archives for Vim Online using makefiles. The makefiles would make sure the miscellaneous scripts were included in the uploaded distributions. This had two disadvantages: It lost git history and the repositories on GitHub were not usable out of the box, so [I got complaints from GitHub (Pathogen) users] [github-complaints].
+
+2. My second attempt to solve the problem used git submodules which seemed like the ideal solution until I actually started doing it. Submodules are not initialized during a normal `git clone`, you need to use `git clone --recursive` instead but Vim plug-in managers like [Pathogen] [pathogen] and [Vundle] [vundle] don't do this (at least [they didn't when I tried] [vundle-discussion]) so people would end up with broken checkouts.
+
+3. After finding out that git submodules were not going to solve my problems I searched for other inclusion strategies supported by git. After a while I came upon the [subtree merge strategy] [merge-strategy] which I have been using for more than two years now.
+
+## Compatibility issues
+
+Regardless of the inclusion strategies discussed above, my current scheme has a flaw: If more than one of my plug-ins are installed in a Vim profile using [Pathogen] [pathogen] or [Vundle] [vundle], the miscellaneous autoload scripts will all be loaded from the subdirectory of one single plug-in.
+
+This means that when I break compatibility in the miscellaneous scripts, I have to make sure to merge the changes into all of my plug-ins. Even then, if a user has more than one of my plug-ins installed but updates only one of them, the other plug-ins (that are not yet up to date) can break (because of the backwards incompatible change).
+
+The `xolox#misc#compat#check()` function makes sure that incompatibilities are detected early so that the user knows which plug-in to update if incompatibilities arise.
+
## Contact
If you have questions, bug reports, suggestions, etc. the author can be contacted at <peter@peterodding.com>. The latest version is available at <http://peterodding.com/code/vim/misc> and <http://github.com/xolox/vim-misc>.
## License
-This software is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License).
-© 2011 Peter Odding &lt;<peter@peterodding.com>&gt;.
+This software is licensed under the [MIT license] [mit].
+© 2013 Peter Odding &lt;<peter@peterodding.com>&gt;.
+[github-complaints]: https://github.com/xolox/vim-easytags/issues/1
+[merge-strategy]: http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html
+[mit]: http://en.wikipedia.org/wiki/MIT_License
+[pathogen]: http://www.vim.org/scripts/script.php?script_id=2332
[plugins]: http://peterodding.com/code/vim/
+[repository]: https://github.com/xolox/vim-misc
+[vundle-discussion]: https://github.com/gmarik/vundle/pull/41
+[vundle]: https://github.com/gmarik/vundle
diff --git a/autoload/xolox/misc/buffer.vim b/autoload/xolox/misc/buffer.vim
index e4472e6..3597cc2 100644
--- a/autoload/xolox/misc/buffer.vim
+++ b/autoload/xolox/misc/buffer.vim
@@ -1,37 +1,51 @@
" Vim auto-load script
" Author: Peter Odding <peter@peterodding.com>
-" Last Change: September 4, 2011
+" Last Change: April 18, 2013
" URL: http://peterodding.com/code/vim/misc/
-function! xolox#misc#buffer#is_empty()
+function! xolox#misc#buffer#is_empty() " {{{1
" Check if the current buffer is an empty, unchanged buffer which can be reused.
return !&modified && expand('%') == '' && line('$') <= 1 && getline(1) == ''
endfunction
-function! xolox#misc#buffer#prepare(bufname)
- let bufname = '[' . a:bufname . ']'
- let buffers = tabpagebuflist()
- call map(buffers, 'fnamemodify(bufname(v:val), ":t:r")')
- let idx = index(buffers, bufname)
- if idx >= 0
- execute (idx + 1) . 'wincmd w'
- elseif !(xolox#misc#buffer#is_empty() || expand('%:t') == bufname)
+function! xolox#misc#buffer#prepare(...) " {{{1
+ " Open a special buffer (with generated contents, not directly edited by the user).
+ if a:0 == 1 && type(a:1) == type('')
+ " Backwards compatibility with old interface.
+ let options = {'name': a:1, 'path': a:1}
+ elseif type(a:1) == type({})
+ let options = a:1
+ else
+ throw "Invalid arguments"
+ endif
+ let winnr = 1
+ let found = 0
+ for bufnr in tabpagebuflist()
+ if xolox#misc#path#equals(options['path'], bufname(bufnr))
+ execute winnr . 'wincmd w'
+ let found = 1
+ break
+ else
+ let winnr += 1
+ endif
+ endfor
+ if !(found || xolox#misc#buffer#is_empty())
vsplit
endif
- silent execute 'edit' fnameescape(bufname)
+ silent execute 'edit' fnameescape(options['path'])
lcd " clear working directory
setlocal buftype=nofile bufhidden=hide noswapfile
- let &l:statusline = bufname
+ let &l:statusline = '[' . options['name'] . ']'
call xolox#misc#buffer#unlock()
silent %delete
endfunction
-function! xolox#misc#buffer#lock()
+function! xolox#misc#buffer#lock() " {{{1
" Lock a special buffer so it can no longer be edited.
setlocal readonly nomodifiable nomodified
endfunction
-function! xolox#misc#buffer#unlock()
+function! xolox#misc#buffer#unlock() " {{{1
" Unlock a special buffer so that its content can be updated.
setlocal noreadonly modifiable
endfunction
diff --git a/autoload/xolox/misc/compat.vim b/autoload/xolox/misc/compat.vim
new file mode 100644
index 0000000..83d00a0
--- /dev/null
+++ b/autoload/xolox/misc/compat.vim
@@ -0,0 +1,23 @@
+" Vim auto-load script
+" Author: Peter Odding <peter@peterodding.com>
+" Last Change: April 20, 2013
+" URL: http://peterodding.com/code/vim/misc/
+
+" The following integer will be bumped whenever a change in the miscellaneous
+" scripts breaks backwards compatibility. This enables my Vim plug-ins to fail
+" early when they detect an incompatible version, instead of breaking at the
+" worst possible moments :-).
+let g:xolox#misc#compat#version = 1
+
+" Remember the directory where the miscellaneous scripts are loaded from
+" so the user knows which plug-in to update if incompatibilities arise.
+let s:misc_directory = fnamemodify(expand('<sfile>'), ':p:h')
+
+function! xolox#misc#compat#check(plugin_name, required_version)
+ if a:required_version != g:xolox#misc#compat#version
+ let msg = "The %s plug-in requires version %i of the miscellaneous scripts, however version %i was loaded from %s!"
+ throw printf(msg, a:plugin_name, a:required_version, g:xolox#misc#compat#version, s:misc_directory)
+ endif
+endfunction
+
+" vim: ts=2 sw=2 et
diff --git a/autoload/xolox/misc/path.vim b/autoload/xolox/misc/path.vim
index efb6340..6f8fe44 100644
--- a/autoload/xolox/misc/path.vim
+++ b/autoload/xolox/misc/path.vim
@@ -1,9 +1,10 @@
" Vim auto-load script
" Author: Peter Odding <peter@peterodding.com>
-" Last Change: September 26, 2011
+" Last Change: April 18, 2013
" URL: http://peterodding.com/code/vim/misc/
let s:windows_compatible = has('win32') || has('win64')
+let s:mac_os_x_compatible = has('macunix')
function! xolox#misc#path#which(...)
let extensions = s:windows_compatible ? split($PATHEXT, ';') : ['']
@@ -129,7 +130,13 @@ endfunction
" Encode a pathname so it can be used as a filename.
function! xolox#misc#path#encode(path)
- let mask = s:windows_compatible ? '[*|\\/:"<>?%]' : '[\\/%]'
+ if s:windows_compatible
+ let mask = '[*|\\/:"<>?%]'
+ elseif s:mac_os_x_compatible
+ let mask = '[\\/%:]'
+ else
+ let mask = '[\\/%]'
+ endif
return substitute(a:path, mask, '\=printf("%%%x", char2nr(submatch(0)))', 'g')
endfunction
diff --git a/doc/easytags.txt b/doc/easytags.txt
index 372c541..a5ca306 100644
--- a/doc/easytags.txt
+++ b/doc/easytags.txt
@@ -1,5 +1,49 @@
*easytags.txt* Automated tag generation and syntax highlighting in Vim
+===============================================================================
+ *easytags-contents*
+Contents ~
+
+ 1. Introduction |easytags-introduction|
+ 2. Installation |easytags-installation|
+ 1. A note about Windows |easytags-a-note-about-windows|
+ 3. Commands |easytags-commands|
+ 1. The |:UpdateTags| command
+ 2. The |:HighlightTags| command
+ 4. Options |easytags-options|
+ 1. The |g:easytags_cmd| option
+ 2. The |g:easytags_languages| option
+ 3. The |g:easytags_file| option
+ 4. The |g:easytags_dynamic_files| option
+ 5. The |g:easytags_by_filetype| option
+ 6. The |g:easytags_always_enabled| option
+ 7. The |g:easytags_on_cursorhold| option
+ 8. The |g:easytags_updatetime_min| option
+ 9. The |g:easytags_auto_update| option
+ 10. The |g:easytags_auto_highlight| option
+ 11. The |g:easytags_autorecurse| option
+ 12. The |g:easytags_include_members| option
+ 13. The |g:easytags_resolve_links| option
+ 14. The |g:easytags_suppress_ctags_warning| option
+ 15. The |g:easytags_ignored_syntax_groups| option
+ 5. Faster syntax highlighting using Python |easytags-faster-syntax-highlighting-using-python|
+ 1. The |g:easytags_python_enabled| option
+ 2. The |g:easytags_python_script| option
+ 6. How to customize the highlighting colors?
+ 7. Passing custom command line arguments to Exuberant Ctags
+ 8. Troubleshooting |easytags-troubleshooting|
+ 1. |:HighlightTags| only works for the tags file created by |:UpdateTags|
+ 2. The plug-in complains that Exuberant Ctags isn't installed
+ 3. Vim locks up while the plug-in is running
+ 4. Failed to highlight tags because pattern is too big!
+ 5. The plug-in doesn't seem to work in Cygwin
+ 9. Contact |easytags-contact|
+ 10. License |easytags-license|
+
+===============================================================================
+ *easytags-introduction*
+Introduction ~
+
Vim has long been my favorite text editor and combined with Exuberant Ctags
[1] it has the potential to provide most of what I expect from an integrated
development environment [2]. Exuberant Ctags is the latest incarnation of a
@@ -125,6 +169,34 @@ where you've installed Exuberant Ctags, e.g.:
>
:let g:easytags_cmd = '/usr/local/bin/ctags'
+If you rely entirely on language-specific configuration and don't have a
+general ctags program, set this to the empty string.
+
+-------------------------------------------------------------------------------
+The *g:easytags_languages* option
+
+Exuberant Ctags supports many languages and can be extended via regular
+expression patterns, but for some languages separate tools with
+ctags-compatible output exist (e.g. jsctags [9] for Javascript). To use these,
+the executable and its arguments must be configured:
+>
+ let g:easytags_languages = {
+ \ 'language': {
+ \ 'cmd': g:easytags_cmd,
+ \ 'args': [],
+ \ 'fileoutput_opt': '-f',
+ \ 'stdout_opt': '-f-',
+ \ 'recurse_flag': '-R'
+ \ }
+ \}
+
+Each key is a special language definition. The key is in the notation of ctags
+in lowercase; you still need to use 'xolox#easytags#map_filetypes()' to map
+this to Vim's filetypes, if necessary.
+
+Above snippets shows the defaults; you only need to specify options that
+differ.
+
-------------------------------------------------------------------------------
The *g:easytags_file* option
@@ -220,20 +292,15 @@ The *g:easytags_updatetime_min* option
Vim has a setting which influences how often the plug-in is automatically
executed. When this setting is too low, the plug-in can break. For this reason
-the plug-in warns you when |'updatetime'| is lower than 4000 milliseconds. If
-you really want the plug-in to be executed more than once every 4 seconds
-(without a warning) you can lower the minimum acceptable updatetime by setting
-this option (number of milliseconds).
-
--------------------------------------------------------------------------------
-The *g:easytags_updatetime_autodisable* option
+the plug-in compensates by keeping track of when it was last executed. You'll
+get one warning when the plug-in first notices the low value, after that it
+will shut up. The default value of this option is 4000 milliseconds (4
+seconds).
-Other plug-ins may lower the |'updatetime'| value in certain contexts, e.g.
-insert mode in the case of the neocomplcache [9] plug-in. By setting this
-option to 1 (true) you can configure the easytags plug-in so that it doesn't
-give warnings about the updatetime option but instead skip updating and
-highlighting while the updatetime is set too low. When the updatetime is
-restored to a reasonable value the plug-in resumes.
+If you really want the plug-in to be executed more than once every 4 seconds
+you can lower the minimum acceptable updatetime by setting this option (as the
+number of milliseconds) however note that subsecond granularity is not
+supported.
-------------------------------------------------------------------------------
The *g:easytags_auto_update* option
@@ -513,7 +580,7 @@ If you like this plug-in please vote for it on Vim Online [16].
*easytags-license*
License ~
-This software is licensed under the MIT license [17]. Copyright 2011 Peter
+This software is licensed under the MIT license [17]. Copyright 2013 Peter
Odding <peter@peterodding.com>.
===============================================================================
@@ -528,7 +595,7 @@ References ~
[6] http://peterodding.com/code/vim/downloads/easytags.zip
[7] http://peterodding.com/code/vim/shell/
[8] http://en.wikipedia.org/wiki/Dynamic-link_library
-[9] http://www.vim.org/scripts/script.php?script_id=2620
+[9] https://npmjs.org/package/jsctags
[10] http://en.wikipedia.org/wiki/Symbolic_link
[11] http://en.wikipedia.org/wiki/Hard_link
[12] http://en.wikipedia.org/wiki/Canonicalization
diff --git a/plugin/easytags.vim b/plugin/easytags.vim
index 344413e..935ef40 100644
--- a/plugin/easytags.vim
+++ b/plugin/easytags.vim
@@ -1,6 +1,6 @@
" Vim plug-in
" Author: Peter Odding <peter@peterodding.com>
-" Last Change: October 29, 2011
+" Last Change: April 19, 2013
" URL: http://peterodding.com/code/vim/easytags/
" Requires: Exuberant Ctags (http://ctags.sf.net)
@@ -70,7 +70,8 @@ function! s:InitEasyTags(version)
endif
else
" Exuberant Ctags can be installed under multiple names:
- " - On Ubuntu Linux, Exuberant Ctags is installed as `ctags'.
+ " - On Ubuntu Linux, Exuberant Ctags is installed as `ctags-exuberant'
+ " (and possibly `ctags' but that one can't be trusted :-)
" - On Debian Linux, Exuberant Ctags is installed as `exuberant-ctags'.
" - On Free-BSD, Exuberant Ctags is installed as `exctags'.
" IIUC on Mac OS X the program /usr/bin/ctags is installed by default but
@@ -80,7 +81,7 @@ function! s:InitEasyTags(version)
" some frustration the plug-in will search the path and consider every
" possible location, meaning that as long as Exuberant Ctags is installed
" in the $PATH the plug-in should find it automatically.
- for program in xolox#misc#path#which('ctags', 'exuberant-ctags', 'exctags')
+ for program in xolox#misc#path#which('exuberant-ctags', 'ctags-exuberant', 'ctags', 'exctags')
if s:CheckCtags(program, a:version)
let g:easytags_cmd = program
return 1