Permalink
Browse files

tagbar updated to 2.3

  • Loading branch information...
1 parent ca2daf3 commit d04dfcc510e10f274ca665312d22db651d041143 @lilydjwg committed Feb 28, 2012
Showing with 3,361 additions and 2,846 deletions.
  1. +1 −1 .VimballRecord
  2. +3,099 −0 autoload/tagbar.vim
  3. +176 −55 doc/tagbar.txt
  4. +6 −2 doc/tags
  5. +39 −2,751 plugin/tagbar.vim
  6. +40 −37 syntax/tagbar.vim
View
2 .VimballRecord
@@ -8,8 +8,8 @@ math.vba: call delete('/home/lilydjwg/.vim/keymap/math.vim')|call delete('/home/
manpageview.vba: call delete('/home/lilydjwg/.vim/plugin/manpageviewPlugin.vim')|call delete('/home/lilydjwg/.vim/autoload/manpageview.vim')|call delete('/home/lilydjwg/.vim/syntax/man.vim')|call delete('/home/lilydjwg/.vim/syntax/mankey.vim')|call delete('/home/lilydjwg/.vim/syntax/info.vim')|call delete('/home/lilydjwg/.vim/syntax/manphp.vim')|call delete('/home/lilydjwg/.vim/doc/manpageview.txt')
visincr.vba: call delete('/home/lilydjwg/.vim/plugin/visincrPlugin.vim')|call delete('/home/lilydjwg/.vim/autoload/visincr.vim')|call delete('/home/lilydjwg/.vim/doc/visincr.txt')|call delete('/home/lilydjwg/.vim/autoload/calutil.vim')
diff_movement.vba: call delete('/home/lilydjwg/.vim/ftplugin/diff_movement.vim')
-tagbar.vba: call delete('/home/lilydjwg/.vim/plugin/tagbar.vim')|call delete('/home/lilydjwg/.vim/syntax/tagbar.vim')|call delete('/home/lilydjwg/.vim/doc/tagbar.txt')
mail_movement.vba: call delete('/home/lilydjwg/.vim/ftplugin/mail_movement.vim')
CountJump.vba: call delete('/home/lilydjwg/.vim/autoload/CountJump.vim')|call delete('/home/lilydjwg/.vim/autoload/CountJump/Motion.vim')|call delete('/home/lilydjwg/.vim/autoload/CountJump/Region.vim')|call delete('/home/lilydjwg/.vim/autoload/CountJump/Region/Motion.vim')|call delete('/home/lilydjwg/.vim/autoload/CountJump/Region/TextObject.vim')|call delete('/home/lilydjwg/.vim/autoload/CountJump/TextObject.vim')|call delete('/home/lilydjwg/.vim/doc/CountJump.txt')
autofmt.vmb: call delete('/home/lilydjwg/.vim/doc/autofmt.txt')|call delete('/home/lilydjwg/.vim/autoload/autofmt/japanese.vim')|call delete('/home/lilydjwg/.vim/autoload/autofmt/compat.vim')|call delete('/home/lilydjwg/.vim/autoload/autofmt/uax14.vim')|call delete('/home/lilydjwg/.vim/autoload/unicode.vim')|call delete('/home/lilydjwg/.vim/tools/unicode.vim')
mark.vba: call delete('/home/lilydjwg/.vim/autoload/mark.vim')|call delete('/home/lilydjwg/.vim/plugin/mark.vim')|call delete('/home/lilydjwg/.vim/doc/mark.txt')
+tagbar.vmb: call delete('/home/lilydjwg/.vim/autoload/tagbar.vim')|call delete('/home/lilydjwg/.vim/doc/tagbar.txt')|call delete('/home/lilydjwg/.vim/plugin/tagbar.vim')|call delete('/home/lilydjwg/.vim/syntax/tagbar.vim')
View
3,099 autoload/tagbar.vim
3,099 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
View
231 doc/tagbar.txt
@@ -3,7 +3,7 @@
Author: Jan Larres <jan@majutsushi.net>
Licence: Vim licence, see |license|
Homepage: http://majutsushi.github.com/tagbar/
-Version: 2.1
+Version: 2.3
==============================================================================
Contents *tagbar* *tagbar-contents*
@@ -21,7 +21,7 @@ Contents *tagbar* *tagbar-contents*
Highlight colours ............. |tagbar-highlight|
Automatically opening Tagbar .. |tagbar-autoopen|
6. Extending Tagbar ................ |tagbar-extend|
- 7. Bugs and limitations ............ |tagbar-bugs|
+ 7. Troubleshooting & Known issues .. |tagbar-issues|
8. History ......................... |tagbar-history|
9. Todo ............................ |tagbar-todo|
10. Credits ......................... |tagbar-credits|
@@ -113,11 +113,7 @@ with doctorjs/jsctags and will use that if present, other programs require
some configuration (see |tagbar-extend|). If a program does not work even with
correct configuration please contact me.
-Note: jsctags has to be newer than 2011-01-06 since it needs the "-f" option
-to work. Also, the output of jsctags seems to be a bit unreliable at the
-moment (especially regarding line numbers), so if you notice some strange
-behaviour with it please run it manually in a terminal to check whether the
-bug is in jsctags or Tagbar.
+Note: Please check |tagbar-issues| for some possible issues with jsctags.
==============================================================================
2. Requirements *tagbar-requirements*
@@ -229,40 +225,62 @@ displayed when the cursor stays on a tag for 'updatetime' milliseconds.
------------------------------------------------------------------------------
COMMANDS *tagbar-commands*
-:TagbarOpen
- Open the Tagbar if it is closed. In case it is already open jump to it.
-
+:TagbarOpen [{flags}]
+ Open the Tagbar window if it is closed.
+
+ Additional behaviour can be specified with the optional {flags} argument.
+ It is a string which can contain these character flags:
+ 'f' Jump to Tagbar window when opening (just as if |g:tagbar_autofocus|
+ were set to 1)
+ 'j' Jump to Tagbar window if already open
+ 'c' Close Tagbar on tag selection (just as if |g:tagbar_autoclose| were
+ set to 1, but doesn't imply 'f')
+
+ For example, the following command would always jump to the Tagbar window,
+ opening it first if necessary, but keep it open after selecting a tag
+ (unless |g:tagbar_autoclose| is set): >
+ :TagbarOpen fj
+<
:TagbarClose
Close the Tagbar window if it is open.
:TagbarToggle
Open the Tagbar window if it is closed or close it if it is open.
:TagbarOpenAutoClose
- Open the Tagbar window and close it on tag selection, regardless of the
- setting of |g:tagbar_autoclose|. If it was already open jump to it.
+ Open the Tagbar window, jump to it and close it on tag selection. This is
+ an alias for ":TagbarOpen fc".
-:TagbarSetFoldlevel [number]
- Set the foldlevel of the tags of the current file to [number]. The
+:TagbarSetFoldlevel {number}
+ Set the foldlevel of the tags of the current file to {number}. The
foldlevel of tags in other files remains unaffected. Works in the same way
as 'foldlevel'.
:TagbarShowTag
Open the parent folds of the current tag in the file window as much as
needed for the tag to be visible in the Tagbar window.
+:TagbarDebug [logfile]
+ Start debug mode. This will write debug messages to file [logfile] while
+ using Tagbar. If no argument is given "tagbardebug.log" in the current
+ directory is used. Note: an existing file will be overwritten!
+
+:TagbarDebugEnd
+ End debug mode, debug messages will no longer be written to the logfile.
+
------------------------------------------------------------------------------
KEY MAPPINGS *tagbar-keys*
-These mappings are valid in the Tagbar window:
+The following mappings are valid in the Tagbar window:
<F1> Display key mapping help.
<CR>/<Enter> Jump to the tag under the cursor. Doesn't work for pseudo-tags
or generic headers.
p Jump to the tag under the cursor, but stay in the Tagbar window.
<LeftMouse> When on a fold icon, open or close the fold depending on the
current state.
-<2-LeftMouse> Same as <CR>.
+<2-LeftMouse> Same as <CR>. See |g:tagbar_singleclick| if you want to use a
+ single- instead of a double-click.
<Space> Display the prototype of the current tag (i.e. the line defining
it) in the command line.
+/zo Open the fold under the cursor.
@@ -321,7 +339,7 @@ g:tagbar_autoclose~
Default: 0
If you set this option the Tagbar window will automatically close when you
-jump to a tag.
+jump to a tag. This implies |g:tagbar_autofocus|.
Example:
>
@@ -379,6 +397,18 @@ Example:
let g:tagbar_expand = 1
<
+ *g:tagbar_singleclick*
+g:tagbar_singleclick~
+Default: 0
+
+If this option is set then a single- instead of a double-click is used to jump
+to the tag definition.
+
+Example:
+>
+ let g:tagbar_singleclick = 1
+<
+
*g:tagbar_foldlevel*
g:tagbar_foldlevel~
Default: 99
@@ -391,21 +421,22 @@ Example:
let g:tagbar_foldlevel = 2
<
- *g:tagbar_usearrows*
-g:tagbar_usearrows~
-{Windows only}
-Default: 0
+ *g:tagbar_iconchars*
+g:tagbar_iconchars~
-Tagbar can display nice Unicode arrows instead of +/- characters as fold icons.
-However, Windows doesn't seem to be able to substitute in characters from
-other fonts if the current font doesn't support them. This means that you have
-to use a font that supports those arrows. Unfortunately there is no way to
-detect whether specific characters are supported in the current font. So if
-your font supports those arrows you have to set this option to make it work.
+Since the display of the icons used to indicate open or closed folds depends
+on the actual font used, different characters may be optimal for different
+fonts. With this variable you can set the icons to characters of your liking.
+The first character in the list specifies the icon to use for a closed fold,
+and the second one for an open fold.
-Example:
+Examples (don't worry if some the characters aren't displayed correctly, just
+choose other characters in that case):
>
- let g:tagbar_usearrows = 1
+ let g:tagbar_iconchars = ['▶', '▼'] (default on Linux and Mac OS X)
+ let g:tagbar_iconchars = ['▾', '▸']
+ let g:tagbar_iconchars = ['▷', '◢']
+ let g:tagbar_iconchars = ['+', '-'] (default on Windows)
<
*g:tagbar_autoshowtag*
@@ -423,6 +454,22 @@ Example:
let g:tagbar_autoshowtag = 1
<
+ *g:tagbar_updateonsave_maxlines*
+g:tagbar_updateonsave_maxlines~
+Default: 5000
+
+If the current file has fewer lines than the value of this variable, Tagbar
+will update immediately after saving the file. If it is longer then the update
+will only happen on the |CursorHold| event and when switching buffers (or
+windows). This is to prevent the time it takes to save a large file from
+becoming annoying in case you have a slow computer. If you have a fast
+computer you can set it to a higher value.
+
+Example:
+>
+ let g:tagbar_updateonsave_maxlines = 10000
+<
+
*g:tagbar_systemenc*
g:tagbar_systemenc~
Default: value of 'encoding'
@@ -450,6 +497,9 @@ TagbarComment
TagbarKind
The header of generic "kinds" like "functions" and "variables".
+TagbarNestedKind
+ The "kind" headers in square brackets inside of scopes.
+
TagbarScope
Tags that define a scope like classes, structs etc.
@@ -487,19 +537,32 @@ See |:highlight| for more information.
------------------------------------------------------------------------------
AUTOMATICALLY OPENING TAGBAR *tagbar-autoopen*
-If you want Tagbar to open automatically, for example on Vim startup or for
-specific filetypes, there are various ways to do it. For example, to always
-open Tagbar on Vim startup you can put this into your vimrc file:
+Since there are several different situations in which you might want to open
+Tagbar automatically there is no single option to enable automatic opening.
+Instead, autocommands can be used together with a convenience function that
+opens Tagbar only if a supported file is open(ed).
+
+If you want to open Tagbar automatically on Vim startup no matter what put
+this into your vimrc:
>
- autocmd VimEnter * nested TagbarOpen
+ autocmd VimEnter * nested :TagbarOpen
<
-If you want to have it start for specific filetypes put
+If you want to open it only if you're opening Vim with a supported file/files
+use this instead:
>
- TagbarOpen
+ autocmd VimEnter * nested :call tagbar#autoopen()
<
-into a corresponding filetype plugin (see |filetype-plugin|).
-
-Check out |autocmd.txt| if you want it to automatically open in more
+For opening Tagbar also if you open a supported file in an already running
+Vim:
+>
+ autocmd FileType * nested :call tagbar#autoopen()
+<
+And if you only want to open Tagbar only for specific filetypes, not for all
+of the supported ones:
+>
+ autocmd FileType c,cpp nested :TagbarOpen
+<
+Check out |autocmd.txt| if you want it to open automatically in more
complicated cases.
==============================================================================
@@ -511,6 +574,12 @@ existing types and to add completely new types. A complete configuration
consists of a type definition for Tagbar in your |vimrc| and optionally a
language definition for ctags in case you want to add a new language.
+Before writing your own extension have a look at the wiki
+(https://github.com/majutsushi/tagbar/wiki/Support-for-additional-filetypes)
+or try googling for existing ones. If you do end up creating your own
+extension please consider adding it to the wiki so that others will be able to
+use it, too.
+
Every type definition in Tagbar is a dictionary with the following keys:
ctagstype: The name of the language as recognized by ctags. Use the command >
@@ -535,7 +604,7 @@ kinds: A list of the "language kinds" that should be listed in Tagbar,
< would list all the function definitions in a file under the header
"functions" and fold them.
sro: The scope resolution operator. For example, in C++ it is "::" and
- in Java it is ".". If in doubt run ctags as shown above and check
+ in Java it is ".". If in doubt run ctags as shown below and check
the output.
kind2scope: A dictionary describing the mapping of tag kinds (in their
one-character representation) to the scopes their children will
@@ -552,8 +621,8 @@ kind2scope: A dictionary describing the mapping of tag kinds (in their
private:
int var;
};
-< We then run ctags in the followin way: >
- ctags -f - --format=2 --excmd=pattern --fields=nksazSmt --extra= test.cpp
+< We then run ctags in the following way: >
+ ctags -f - --format=2 --excmd=pattern --extra= --fields=nksaSmt test.cpp
< Then the output for the variable "var" would look like this: >
var tmp.cpp /^ int var;$/;" kind:m line:11 class:Foo access:private
< This shows that the scope name for an entry in a C++ class is
@@ -591,9 +660,9 @@ deffile: The path to a file with additional ctags definitions (see the
ctagsbin: The path to a filetype-specific ctags-compatible program like
{optional} jsctags. Set it in the same way as |g:tagbar_ctags_bin|. jsctags is
used automatically if found in your $PATH and does not have to be
- set in that case. If it is not in your path you have to provide the
- complete configuration and use the "replace" key (see the
- Tagbar source code for the suggested configuration).
+ set in that case. If it is not in your path you have to set this
+ key, the rest of the configuration should not be necessary (unless
+ you want to change something, of course).
ctagsargs: The arguments to be passed to the filetype-specific ctags program
{optional} (without the filename). Make sure you set an option that makes the
program output its data on stdout. Not used for the normal ctags
@@ -614,7 +683,8 @@ and vim will display the file type of the current buffer.
Example: C++~
Here is a complete example that shows the default configuration for C++ as
-used in Tagbar.
+used in Tagbar. This is just for illustration purposes since user
+configurations will usually be less complicated.
>
let g:tagbar_type_cpp = {
\ 'ctagstype' : 'c++',
@@ -676,7 +746,7 @@ the order of enums and typedefs, you would do it like this:
\ ]
\ }
<
-Compare with the complete example above to see the exact change.
+Compare with the complete example above to see the difference.
Adding a definition for a new language/file type~
In order to be able to add a new language to Tagbar you first have to create a
@@ -756,14 +826,38 @@ Tagbar should now be able to show the sections and other tags from LaTeX
files.
==============================================================================
-7. Bugs and limitations *tagbar-bugs*
+7. Troubleshooting & Known issues *tagbar-issues*
+
+As a general rule, if the tag information displayed by Tagbar is wrong (for
+example, a method doesn't show up or is in the wrong place) you should first
+try running ctags manually to see whether ctags reports the wrong information
+or whether that information is correct and Tagbar does something wrong. To run
+ctags manually execute the following command in a terminal:
+>
+ ctags -f - --format=2 --excmd=pattern --extra= --fields=nksaSmt myfile
+<
+If you set the |g:tagbar_ctags_bin| variable you probably have to use the same
+value here instead of simply "ctags".
+
+If Tagbar doesn't seem to work at all, but you don't get any error messages,
+you can use Tagbar's debug mode to try to find the source of the problem (see
+|tagbar-commands| on how to invoke it). In that case you should especially pay
+attention to the reported file type and the ctags command line in the log
+file.
+
+
+ - jsctags has to be newer than 2011-01-06 since it needs the "-f" option to
+ work. Also, the output of jsctags seems to be a bit unreliable at the
+ moment (especially regarding line numbers), so if you notice some strange
+ behaviour with it please run it manually in a terminal to check whether
+ the bug is in jsctags or Tagbar.
- Nested pseudo-tags cannot be properly parsed since only the direct parent
scope of a tag gets assigned a type, the type of the grandparents is not
reported by ctags (assuming the grandparents don't have direct, real
children).
- For example, if we have a C++ with the following content:
+ For example, if we have a C++ file with the following content:
>
foo::Bar::init()
{
@@ -804,6 +898,33 @@ files.
==============================================================================
8. History *tagbar-history*
+2.3 (2011-12-24)
+ - Add a convenience function that allows more flexible ways to
+ automatically open Tagbar.
+ - Replace option tagbar_usearrows with tagbar_iconchars to allow custom
+ characters to be specified. This helps with fonts that don't display the
+ default characters properly.
+ - Remove the need to provide the complete jsctags configuration if jsctags
+ is not found in $PATH, now only the concrete path has to be specified.
+ - Add debugging functionality.
+
+2.2 (2011-11-26)
+ - Small incompatible change: TagbarOpen now doesn't jump to the Tagbar
+ window anymore if it is already open. Use "TagbarOpen j" instead or see
+ its documentation for more options.
+ - Tags inside of scopes now have a header displaying their "kind".
+ - The Tagbar contents are now immediately updated on save for files
+ smaller than a configurable size.
+ - Tagbar can now be configured to jump to a tag with only a single-click
+ instead of a double-click.
+ - Most of the script has been moved to the |autoload| directory, so Vim
+ startup should be faster (thanks to Kien N).
+ - Jumping to tags should work most of the time even if the file has been
+ modified and not saved.
+ - If Ctags has been installed into the default location using Homebrew or
+ MacPorts it should now be found automatically.
+ - Several bugfixes.
+
2.1 (2011-05-29)
- Make Tagbar work in (hopefully) all cases under Windows
- Handle cases where 'encoding' is different from system encoding, for
@@ -883,13 +1004,13 @@ software.
The folding technique was inspired by NERDTree by Martin Grenfell.
-Taybin Rutkin:
- - Contributed tagbar_autofocus option
-Seth Milliken:
- - Contributed folding keybindings that resemble the built-in ones
-
-Thanks to the following people for feature suggestions etc: Jan Christoph
-Ebersbach, pielgrzym
+Thanks to the following people for code contributions, feature suggestions etc:
+Jan Christoph Ebersbach
+Leandro Freitas
+Seth Milliken
+Kien N
+pielgrzym
+Taybin Rutkin
==============================================================================
vim: tw=78 ts=8 sw=8 sts=8 noet ft=help
View
8 doc/tags
@@ -754,10 +754,12 @@ g:tagbar_compact tagbar.txt /*g:tagbar_compact*
g:tagbar_ctags_bin tagbar.txt /*g:tagbar_ctags_bin*
g:tagbar_expand tagbar.txt /*g:tagbar_expand*
g:tagbar_foldlevel tagbar.txt /*g:tagbar_foldlevel*
+g:tagbar_iconchars tagbar.txt /*g:tagbar_iconchars*
g:tagbar_left tagbar.txt /*g:tagbar_left*
+g:tagbar_singleclick tagbar.txt /*g:tagbar_singleclick*
g:tagbar_sort tagbar.txt /*g:tagbar_sort*
g:tagbar_systemenc tagbar.txt /*g:tagbar_systemenc*
-g:tagbar_usearrows tagbar.txt /*g:tagbar_usearrows*
+g:tagbar_updateonsave_maxlines tagbar.txt /*g:tagbar_updateonsave_maxlines*
g:tagbar_width tagbar.txt /*g:tagbar_width*
g:vimwiki_CJK_length vimwiki.txt /*g:vimwiki_CJK_length*
g:vimwiki_auto_checkbox vimwiki.txt /*g:vimwiki_auto_checkbox*
@@ -797,7 +799,9 @@ gundo_map_move_newer gundo.txt /*gundo_map_move_newer*
gundo_map_move_older gundo.txt /*gundo_map_move_older*
gundo_preview_bottom gundo.txt /*gundo_preview_bottom*
gundo_preview_height gundo.txt /*gundo_preview_height*
+gundo_preview_statusline gundo.txt /*gundo_preview_statusline*
gundo_right gundo.txt /*gundo_right*
+gundo_tree_statusline gundo.txt /*gundo_tree_statusline*
gundo_width gundo.txt /*gundo_width*
http pi_netrw.txt /*http*
i_CTRL-G_S surround.txt /*i_CTRL-G_S*
@@ -1204,7 +1208,6 @@ surround.txt surround.txt /*surround.txt*
syntax_complete neocomplcache.txt /*syntax_complete*
tagbar tagbar.txt /*tagbar*
tagbar-autoopen tagbar.txt /*tagbar-autoopen*
-tagbar-bugs tagbar.txt /*tagbar-bugs*
tagbar-commands tagbar.txt /*tagbar-commands*
tagbar-configuration tagbar.txt /*tagbar-configuration*
tagbar-contents tagbar.txt /*tagbar-contents*
@@ -1215,6 +1218,7 @@ tagbar-highlight tagbar.txt /*tagbar-highlight*
tagbar-history tagbar.txt /*tagbar-history*
tagbar-installation tagbar.txt /*tagbar-installation*
tagbar-intro tagbar.txt /*tagbar-intro*
+tagbar-issues tagbar.txt /*tagbar-issues*
tagbar-keys tagbar.txt /*tagbar-keys*
tagbar-other tagbar.txt /*tagbar-other*
tagbar-pseudotags tagbar.txt /*tagbar-pseudotags*
View
2,790 plugin/tagbar.vim
@@ -4,7 +4,7 @@
" Author: Jan Larres <jan@majutsushi.net>
" Licence: Vim licence
" Website: http://majutsushi.github.com/tagbar/
-" Version: 2.1
+" Version: 2.3
" Note: This plugin was heavily inspired by the 'Taglist' plugin by
" Yegappan Lakshmanan and uses a small amount of code from it.
"
@@ -18,56 +18,29 @@
" use of this software.
" ============================================================================
+scriptencoding utf-8
+
if &cp || exists('g:loaded_tagbar')
finish
endif
-" Initialization {{{1
-
-" Basic init {{{2
+" Basic init {{{1
if v:version < 700
+ echohl WarningMsg
echomsg 'Tagbar: Vim version is too old, Tagbar requires at least 7.0'
+ echohl None
finish
endif
-if !exists('g:tagbar_ctags_bin')
- if executable('ctags-exuberant')
- let g:tagbar_ctags_bin = 'ctags-exuberant'
- elseif executable('exuberant-ctags')
- let g:tagbar_ctags_bin = 'exuberant-ctags'
- elseif executable('exctags')
- let g:tagbar_ctags_bin = 'exctags'
- elseif executable('ctags')
- let g:tagbar_ctags_bin = 'ctags'
- elseif executable('ctags.exe')
- let g:tagbar_ctags_bin = 'ctags.exe'
- elseif executable('tags')
- let g:tagbar_ctags_bin = 'tags'
- else
- echomsg 'Tagbar: Exuberant ctags not found, skipping plugin'
- finish
- endif
-else
- let g:tagbar_ctags_bin = expand(g:tagbar_ctags_bin)
- if !executable(g:tagbar_ctags_bin)
- echomsg 'Tagbar: Exuberant ctags not found in specified place,'
- \ 'skipping plugin'
- finish
- endif
-endif
-
-redir => s:ftype_out
-silent filetype
-redir END
-if s:ftype_out !~# 'detection:ON'
- echomsg 'Tagbar: Filetype detection is turned off, skipping plugin'
- unlet s:ftype_out
+if v:version == 700 && !has('patch167')
+ echohl WarningMsg
+ echomsg 'Tagbar: Vim versions lower than 7.0.167 have a bug'
+ \ 'that prevents this version of Tagbar from working.'
+ \ 'Please use the alternate version posted on the website.'
+ echohl None
finish
endif
-unlet s:ftype_out
-
-let g:loaded_tagbar = 1
if !exists('g:tagbar_left')
let g:tagbar_left = 0
@@ -97,2734 +70,49 @@ if !exists('g:tagbar_expand')
let g:tagbar_expand = 0
endif
+if !exists('g:tagbar_singleclick')
+ let g:tagbar_singleclick = 0
+endif
+
if !exists('g:tagbar_foldlevel')
let g:tagbar_foldlevel = 99
endif
-if !exists('g:tagbar_usearrows')
- let g:tagbar_usearrows = 0
+if !exists('g:tagbar_iconchars')
+ if has('multi_byte') && has('unix') && &encoding == 'utf-8' &&
+ \ (empty(&termencoding) || &termencoding == 'utf-8')
+ let g:tagbar_iconchars = ['', '']
+ else
+ let g:tagbar_iconchars = ['+', '-']
+ endif
endif
if !exists('g:tagbar_autoshowtag')
let g:tagbar_autoshowtag = 0
endif
-if !exists('g:tagbar_systemenc')
- let g:tagbar_systemenc = &encoding
+if !exists('g:tagbar_updateonsave_maxlines')
+ let g:tagbar_updateonsave_maxlines = 5000
endif
-if has('multi_byte') && has('unix') && &encoding == 'utf-8' &&
- \ (empty(&termencoding) || &termencoding == 'utf-8')
- let s:icon_closed = ''
- let s:icon_open = ''
-elseif has('multi_byte') && (has('win32') || has('win64')) && g:tagbar_usearrows
- let s:icon_closed = ''
- let s:icon_open = ''
-else
- let s:icon_closed = '+'
- let s:icon_open = '-'
+if !exists('g:tagbar_systemenc')
+ let g:tagbar_systemenc = &encoding
endif
-let s:type_init_done = 0
-let s:autocommands_done = 0
-let s:checked_ctags = 0
-let s:window_expanded = 0
-
-let s:access_symbols = {
- \ 'public' : '+',
- \ 'protected' : '#',
- \ 'private' : '-'
-\ }
-
-autocmd SessionLoadPost * nested call s:RestoreSession()
-
-" s:InitTypes() {{{2
-function! s:InitTypes()
- let s:known_types = {}
-
- " Ant {{{3
- let type_ant = {}
- let type_ant.ctagstype = 'ant'
- let type_ant.kinds = [
- \ {'short' : 'p', 'long' : 'projects', 'fold' : 0},
- \ {'short' : 't', 'long' : 'targets', 'fold' : 0}
- \ ]
- let s:known_types.ant = type_ant
- " Asm {{{3
- let type_asm = {}
- let type_asm.ctagstype = 'asm'
- let type_asm.kinds = [
- \ {'short' : 'm', 'long' : 'macros', 'fold' : 0},
- \ {'short' : 't', 'long' : 'types', 'fold' : 0},
- \ {'short' : 'd', 'long' : 'defines', 'fold' : 0},
- \ {'short' : 'l', 'long' : 'labels', 'fold' : 0}
- \ ]
- let s:known_types.asm = type_asm
- " ASP {{{3
- let type_aspvbs = {}
- let type_aspvbs.ctagstype = 'asp'
- let type_aspvbs.kinds = [
- \ {'short' : 'd', 'long' : 'constants', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 's', 'long' : 'subroutines', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 0}
- \ ]
- let s:known_types.aspvbs = type_aspvbs
- " Awk {{{3
- let type_awk = {}
- let type_awk.ctagstype = 'awk'
- let type_awk.kinds = [
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
- \ ]
- let s:known_types.awk = type_awk
- " Basic {{{3
- let type_basic = {}
- let type_basic.ctagstype = 'basic'
- let type_basic.kinds = [
- \ {'short' : 'c', 'long' : 'constants', 'fold' : 0},
- \ {'short' : 'g', 'long' : 'enumerations', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'l', 'long' : 'labels', 'fold' : 0},
- \ {'short' : 't', 'long' : 'types', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 0}
- \ ]
- let s:known_types.basic = type_basic
- " BETA {{{3
- let type_beta = {}
- let type_beta.ctagstype = 'beta'
- let type_beta.kinds = [
- \ {'short' : 'f', 'long' : 'fragments', 'fold' : 0},
- \ {'short' : 's', 'long' : 'slots', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'patterns', 'fold' : 0}
- \ ]
- let s:known_types.beta = type_beta
- " C {{{3
- let type_c = {}
- let type_c.ctagstype = 'c'
- let type_c.kinds = [
- \ {'short' : 'd', 'long' : 'macros', 'fold' : 1},
- \ {'short' : 'p', 'long' : 'prototypes', 'fold' : 1},
- \ {'short' : 'g', 'long' : 'enums', 'fold' : 0},
- \ {'short' : 'e', 'long' : 'enumerators', 'fold' : 0},
- \ {'short' : 't', 'long' : 'typedefs', 'fold' : 0},
- \ {'short' : 's', 'long' : 'structs', 'fold' : 0},
- \ {'short' : 'u', 'long' : 'unions', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'members', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
- \ ]
- let type_c.sro = '::'
- let type_c.kind2scope = {
- \ 'g' : 'enum',
- \ 's' : 'struct',
- \ 'u' : 'union'
- \ }
- let type_c.scope2kind = {
- \ 'enum' : 'g',
- \ 'struct' : 's',
- \ 'union' : 'u'
- \ }
- let s:known_types.c = type_c
- " C++ {{{3
- let type_cpp = {}
- let type_cpp.ctagstype = 'c++'
- let type_cpp.kinds = [
- \ {'short' : 'd', 'long' : 'macros', 'fold' : 1},
- \ {'short' : 'p', 'long' : 'prototypes', 'fold' : 1},
- \ {'short' : 'g', 'long' : 'enums', 'fold' : 0},
- \ {'short' : 'e', 'long' : 'enumerators', 'fold' : 0},
- \ {'short' : 't', 'long' : 'typedefs', 'fold' : 0},
- \ {'short' : 'n', 'long' : 'namespaces', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 's', 'long' : 'structs', 'fold' : 0},
- \ {'short' : 'u', 'long' : 'unions', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'members', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 0}
- \ ]
- let type_cpp.sro = '::'
- let type_cpp.kind2scope = {
- \ 'g' : 'enum',
- \ 'n' : 'namespace',
- \ 'c' : 'class',
- \ 's' : 'struct',
- \ 'u' : 'union'
- \ }
- let type_cpp.scope2kind = {
- \ 'enum' : 'g',
- \ 'namespace' : 'n',
- \ 'class' : 'c',
- \ 'struct' : 's',
- \ 'union' : 'u'
- \ }
- let s:known_types.cpp = type_cpp
- " C# {{{3
- let type_cs = {}
- let type_cs.ctagstype = 'c#'
- let type_cs.kinds = [
- \ {'short' : 'd', 'long' : 'macros', 'fold' : 1},
- \ {'short' : 'f', 'long' : 'fields', 'fold' : 0},
- \ {'short' : 'g', 'long' : 'enums', 'fold' : 0},
- \ {'short' : 'e', 'long' : 'enumerators', 'fold' : 0},
- \ {'short' : 't', 'long' : 'typedefs', 'fold' : 0},
- \ {'short' : 'n', 'long' : 'namespaces', 'fold' : 0},
- \ {'short' : 'i', 'long' : 'interfaces', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 's', 'long' : 'structs', 'fold' : 0},
- \ {'short' : 'E', 'long' : 'events', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'methods', 'fold' : 0},
- \ {'short' : 'p', 'long' : 'properties', 'fold' : 0}
- \ ]
- let type_cs.sro = '.'
- let type_cs.kind2scope = {
- \ 'n' : 'namespace',
- \ 'i' : 'interface',
- \ 'c' : 'class',
- \ 's' : 'struct',
- \ 'g' : 'enum'
- \ }
- let type_cs.scope2kind = {
- \ 'namespace' : 'n',
- \ 'interface' : 'i',
- \ 'class' : 'c',
- \ 'struct' : 's',
- \ 'enum' : 'g'
- \ }
- let s:known_types.cs = type_cs
- " COBOL {{{3
- let type_cobol = {}
- let type_cobol.ctagstype = 'cobol'
- let type_cobol.kinds = [
- \ {'short' : 'd', 'long' : 'data items', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'file descriptions', 'fold' : 0},
- \ {'short' : 'g', 'long' : 'group items', 'fold' : 0},
- \ {'short' : 'p', 'long' : 'paragraphs', 'fold' : 0},
- \ {'short' : 'P', 'long' : 'program ids', 'fold' : 0},
- \ {'short' : 's', 'long' : 'sections', 'fold' : 0}
- \ ]
- let s:known_types.cobol = type_cobol
- " DOS Batch {{{3
- let type_dosbatch = {}
- let type_dosbatch.ctagstype = 'dosbatch'
- let type_dosbatch.kinds = [
- \ {'short' : 'l', 'long' : 'labels', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 0}
- \ ]
- let s:known_types.dosbatch = type_dosbatch
- " Eiffel {{{3
- let type_eiffel = {}
- let type_eiffel.ctagstype = 'eiffel'
- let type_eiffel.kinds = [
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'features', 'fold' : 0}
- \ ]
- let type_eiffel.sro = '.' " Not sure, is nesting even possible?
- let type_eiffel.kind2scope = {
- \ 'c' : 'class',
- \ 'f' : 'feature'
- \ }
- let type_eiffel.scope2kind = {
- \ 'class' : 'c',
- \ 'feature' : 'f'
- \ }
- let s:known_types.eiffel = type_eiffel
- " Erlang {{{3
- let type_erlang = {}
- let type_erlang.ctagstype = 'erlang'
- let type_erlang.kinds = [
- \ {'short' : 'm', 'long' : 'modules', 'fold' : 0},
- \ {'short' : 'd', 'long' : 'macro definitions', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'r', 'long' : 'record definitions', 'fold' : 0}
- \ ]
- let type_erlang.sro = '.' " Not sure, is nesting even possible?
- let type_erlang.kind2scope = {
- \ 'm' : 'module'
- \ }
- let type_erlang.scope2kind = {
- \ 'module' : 'm'
- \ }
- let s:known_types.erlang = type_erlang
- " Flex {{{3
- " Vim doesn't support Flex out of the box, this is based on rough
- " guesses and probably requires
- " http://www.vim.org/scripts/script.php?script_id=2909
- " Improvements welcome!
- let type_mxml = {}
- let type_mxml.ctagstype = 'flex'
- let type_mxml.kinds = [
- \ {'short' : 'v', 'long' : 'global variables', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'methods', 'fold' : 0},
- \ {'short' : 'p', 'long' : 'properties', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'x', 'long' : 'mxtags', 'fold' : 0}
- \ ]
- let type_mxml.sro = '.'
- let type_mxml.kind2scope = {
- \ 'c' : 'class'
- \ }
- let type_mxml.scope2kind = {
- \ 'class' : 'c'
- \ }
- let s:known_types.mxml = type_mxml
- " Fortran {{{3
- let type_fortran = {}
- let type_fortran.ctagstype = 'fortran'
- let type_fortran.kinds = [
- \ {'short' : 'm', 'long' : 'modules', 'fold' : 0},
- \ {'short' : 'p', 'long' : 'programs', 'fold' : 0},
- \ {'short' : 'k', 'long' : 'components', 'fold' : 0},
- \ {'short' : 't', 'long' : 'derived types and structures', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'common blocks', 'fold' : 0},
- \ {'short' : 'b', 'long' : 'block data', 'fold' : 0},
- \ {'short' : 'e', 'long' : 'entry points', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 's', 'long' : 'subroutines', 'fold' : 0},
- \ {'short' : 'l', 'long' : 'labels', 'fold' : 0},
- \ {'short' : 'n', 'long' : 'namelists', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 0}
- \ ]
- let type_fortran.sro = '.' " Not sure, is nesting even possible?
- let type_fortran.kind2scope = {
- \ 'm' : 'module',
- \ 'p' : 'program',
- \ 'f' : 'function',
- \ 's' : 'subroutine'
- \ }
- let type_fortran.scope2kind = {
- \ 'module' : 'm',
- \ 'program' : 'p',
- \ 'function' : 'f',
- \ 'subroutine' : 's'
- \ }
- let s:known_types.fortran = type_fortran
- " HTML {{{3
- let type_html = {}
- let type_html.ctagstype = 'html'
- let type_html.kinds = [
- \ {'short' : 'f', 'long' : 'JavaScript funtions', 'fold' : 0},
- \ {'short' : 'a', 'long' : 'named anchors', 'fold' : 0}
- \ ]
- let s:known_types.html = type_html
- " Java {{{3
- let type_java = {}
- let type_java.ctagstype = 'java'
- let type_java.kinds = [
- \ {'short' : 'p', 'long' : 'packages', 'fold' : 1},
- \ {'short' : 'f', 'long' : 'fields', 'fold' : 0},
- \ {'short' : 'g', 'long' : 'enum types', 'fold' : 0},
- \ {'short' : 'e', 'long' : 'enum constants', 'fold' : 0},
- \ {'short' : 'i', 'long' : 'interfaces', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'methods', 'fold' : 0}
- \ ]
- let type_java.sro = '.'
- let type_java.kind2scope = {
- \ 'g' : 'enum',
- \ 'i' : 'interface',
- \ 'c' : 'class'
- \ }
- let type_java.scope2kind = {
- \ 'enum' : 'g',
- \ 'interface' : 'i',
- \ 'class' : 'c'
- \ }
- let s:known_types.java = type_java
- " JavaScript {{{3
- " JavaScript is weird -- it does have scopes, but ctags doesn't seem to
- " properly generate the information for them, instead it simply uses the
- " complete name. So ctags has to be fixed before I can do anything here.
- " Alternatively jsctags/doctorjs will be used if available.
- let type_javascript = {}
- let type_javascript.ctagstype = 'javascript'
- if executable('jsctags')
- let type_javascript.kinds = [
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
- \ ]
- let type_javascript.sro = '.'
- let type_javascript.kind2scope = {
- \ 'v' : 'namespace',
- \ 'f' : 'namespace'
- \ }
- let type_javascript.scope2kind = {
- \ 'namespace' : 'v'
- \ }
- let type_javascript.ctagsbin = 'jsctags'
- let type_javascript.ctagsargs = '-f -'
- else
- let type_javascript.kinds = [
- \ {'short' : 'v', 'long' : 'global variables', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 'p', 'long' : 'properties', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'methods', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
- \ ]
- endif
- let s:known_types.javascript = type_javascript
- " Lisp {{{3
- let type_lisp = {}
- let type_lisp.ctagstype = 'lisp'
- let type_lisp.kinds = [
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
- \ ]
- let s:known_types.lisp = type_lisp
- " Lua {{{3
- let type_lua = {}
- let type_lua.ctagstype = 'lua'
- let type_lua.kinds = [
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
- \ ]
- let s:known_types.lua = type_lua
- " Make {{{3
- let type_make = {}
- let type_make.ctagstype = 'make'
- let type_make.kinds = [
- \ {'short' : 'm', 'long' : 'macros', 'fold' : 0}
- \ ]
- let s:known_types.make = type_make
- " Matlab {{{3
- let type_matlab = {}
- let type_matlab.ctagstype = 'matlab'
- let type_matlab.kinds = [
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
- \ ]
- let s:known_types.matlab = type_matlab
- " Ocaml {{{3
- let type_ocaml = {}
- let type_ocaml.ctagstype = 'ocaml'
- let type_ocaml.kinds = [
- \ {'short' : 'M', 'long' : 'modules or functors', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'global variables', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 'C', 'long' : 'constructors', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'methods', 'fold' : 0},
- \ {'short' : 'e', 'long' : 'exceptions', 'fold' : 0},
- \ {'short' : 't', 'long' : 'type names', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'r', 'long' : 'structure fields', 'fold' : 0}
- \ ]
- let type_ocaml.sro = '.' " Not sure, is nesting even possible?
- let type_ocaml.kind2scope = {
- \ 'M' : 'Module',
- \ 'c' : 'class',
- \ 't' : 'type'
- \ }
- let type_ocaml.scope2kind = {
- \ 'Module' : 'M',
- \ 'class' : 'c',
- \ 'type' : 't'
- \ }
- let s:known_types.ocaml = type_ocaml
- " Pascal {{{3
- let type_pascal = {}
- let type_pascal.ctagstype = 'pascal'
- let type_pascal.kinds = [
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'p', 'long' : 'procedures', 'fold' : 0}
- \ ]
- let s:known_types.pascal = type_pascal
- " Perl {{{3
- let type_perl = {}
- let type_perl.ctagstype = 'perl'
- let type_perl.kinds = [
- \ {'short' : 'p', 'long' : 'packages', 'fold' : 1},
- \ {'short' : 'c', 'long' : 'constants', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'formats', 'fold' : 0},
- \ {'short' : 'l', 'long' : 'labels', 'fold' : 0},
- \ {'short' : 's', 'long' : 'subroutines', 'fold' : 0}
- \ ]
- let s:known_types.perl = type_perl
- " PHP {{{3
- let type_php = {}
- let type_php.ctagstype = 'php'
- let type_php.kinds = [
- \ {'short' : 'i', 'long' : 'interfaces', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 'd', 'long' : 'constant definitions', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 0},
- \ {'short' : 'j', 'long' : 'javascript functions', 'fold' : 0}
- \ ]
- let s:known_types.php = type_php
- " Python {{{3
- let type_python = {}
- let type_python.ctagstype = 'python'
- let type_python.kinds = [
- \ {'short' : 'i', 'long' : 'imports', 'fold' : 1},
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'members', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 0}
- \ ]
- let type_python.sro = '.'
- let type_python.kind2scope = {
- \ 'c' : 'class',
- \ 'f' : 'function',
- \ 'm' : 'function'
- \ }
- let type_python.scope2kind = {
- \ 'class' : 'c',
- \ 'function' : 'f'
- \ }
- let s:known_types.python = type_python
- " REXX {{{3
- let type_rexx = {}
- let type_rexx.ctagstype = 'rexx'
- let type_rexx.kinds = [
- \ {'short' : 's', 'long' : 'subroutines', 'fold' : 0}
- \ ]
- let s:known_types.rexx = type_rexx
- " Ruby {{{3
- let type_ruby = {}
- let type_ruby.ctagstype = 'ruby'
- let type_ruby.kinds = [
- \ {'short' : 'm', 'long' : 'modules', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'methods', 'fold' : 0},
- \ {'short' : 'F', 'long' : 'singleton methods', 'fold' : 0}
- \ ]
- let type_ruby.sro = '.'
- let type_ruby.kind2scope = {
- \ 'c' : 'class',
- \ 'm' : 'class'
- \ }
- let type_ruby.scope2kind = {
- \ 'class' : 'c'
- \ }
- let s:known_types.ruby = type_ruby
- " Scheme {{{3
- let type_scheme = {}
- let type_scheme.ctagstype = 'scheme'
- let type_scheme.kinds = [
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 's', 'long' : 'sets', 'fold' : 0}
- \ ]
- let s:known_types.scheme = type_scheme
- " Shell script {{{3
- let type_sh = {}
- let type_sh.ctagstype = 'sh'
- let type_sh.kinds = [
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
- \ ]
- let s:known_types.sh = type_sh
- let s:known_types.csh = type_sh
- let s:known_types.zsh = type_sh
- " SLang {{{3
- let type_slang = {}
- let type_slang.ctagstype = 'slang'
- let type_slang.kinds = [
- \ {'short' : 'n', 'long' : 'namespaces', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
- \ ]
- let s:known_types.slang = type_slang
- " SML {{{3
- let type_sml = {}
- let type_sml.ctagstype = 'sml'
- let type_sml.kinds = [
- \ {'short' : 'e', 'long' : 'exception declarations', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'function definitions', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'functor definitions', 'fold' : 0},
- \ {'short' : 's', 'long' : 'signature declarations', 'fold' : 0},
- \ {'short' : 'r', 'long' : 'structure declarations', 'fold' : 0},
- \ {'short' : 't', 'long' : 'type definitions', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'value bindings', 'fold' : 0}
- \ ]
- let s:known_types.sml = type_sml
- " SQL {{{3
- " The SQL ctags parser seems to be buggy for me, so this just uses the
- " normal kinds even though scopes should be available. Improvements
- " welcome!
- let type_sql = {}
- let type_sql.ctagstype = 'sql'
- let type_sql.kinds = [
- \ {'short' : 'P', 'long' : 'packages', 'fold' : 1},
- \ {'short' : 'c', 'long' : 'cursors', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'F', 'long' : 'record fields', 'fold' : 0},
- \ {'short' : 'L', 'long' : 'block label', 'fold' : 0},
- \ {'short' : 'p', 'long' : 'procedures', 'fold' : 0},
- \ {'short' : 's', 'long' : 'subtypes', 'fold' : 0},
- \ {'short' : 't', 'long' : 'tables', 'fold' : 0},
- \ {'short' : 'T', 'long' : 'triggers', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 0},
- \ {'short' : 'i', 'long' : 'indexes', 'fold' : 0},
- \ {'short' : 'e', 'long' : 'events', 'fold' : 0},
- \ {'short' : 'U', 'long' : 'publications', 'fold' : 0},
- \ {'short' : 'R', 'long' : 'services', 'fold' : 0},
- \ {'short' : 'D', 'long' : 'domains', 'fold' : 0},
- \ {'short' : 'V', 'long' : 'views', 'fold' : 0},
- \ {'short' : 'n', 'long' : 'synonyms', 'fold' : 0},
- \ {'short' : 'x', 'long' : 'MobiLink Table Scripts', 'fold' : 0},
- \ {'short' : 'y', 'long' : 'MobiLink Conn Scripts', 'fold' : 0}
- \ ]
- let s:known_types.sql = type_sql
- " Tcl {{{3
- let type_tcl = {}
- let type_tcl.ctagstype = 'tcl'
- let type_tcl.kinds = [
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'methods', 'fold' : 0},
- \ {'short' : 'p', 'long' : 'procedures', 'fold' : 0}
- \ ]
- let s:known_types.tcl = type_tcl
- " LaTeX {{{3
- let type_tex = {}
- let type_tex.ctagstype = 'tex'
- let type_tex.kinds = [
- \ {'short' : 'p', 'long' : 'parts', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'chapters', 'fold' : 0},
- \ {'short' : 's', 'long' : 'sections', 'fold' : 0},
- \ {'short' : 'u', 'long' : 'subsections', 'fold' : 0},
- \ {'short' : 'b', 'long' : 'subsubsections', 'fold' : 0},
- \ {'short' : 'P', 'long' : 'paragraphs', 'fold' : 0},
- \ {'short' : 'G', 'long' : 'subparagraphs', 'fold' : 0}
- \ ]
- let s:known_types.tex = type_tex
- " Vera {{{3
- " Why are variables 'virtual'?
- let type_vera = {}
- let type_vera.ctagstype = 'vera'
- let type_vera.kinds = [
- \ {'short' : 'd', 'long' : 'macros', 'fold' : 1},
- \ {'short' : 'g', 'long' : 'enums', 'fold' : 0},
- \ {'short' : 'T', 'long' : 'typedefs', 'fold' : 0},
- \ {'short' : 'c', 'long' : 'classes', 'fold' : 0},
- \ {'short' : 'e', 'long' : 'enumerators', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'members', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 't', 'long' : 'tasks', 'fold' : 0},
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 0},
- \ {'short' : 'p', 'long' : 'programs', 'fold' : 0}
- \ ]
- let type_vera.sro = '.' " Nesting doesn't seem to be possible
- let type_vera.kind2scope = {
- \ 'g' : 'enum',
- \ 'c' : 'class',
- \ 'v' : 'virtual'
- \ }
- let type_vera.scope2kind = {
- \ 'enum' : 'g',
- \ 'class' : 'c',
- \ 'virtual' : 'v'
- \ }
- let s:known_types.vera = type_vera
- " Verilog {{{3
- let type_verilog = {}
- let type_verilog.ctagstype = 'verilog'
- let type_verilog.kinds = [
- \ {'short' : 'c', 'long' : 'constants', 'fold' : 0},
- \ {'short' : 'e', 'long' : 'events', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'modules', 'fold' : 0},
- \ {'short' : 'n', 'long' : 'net data types', 'fold' : 0},
- \ {'short' : 'p', 'long' : 'ports', 'fold' : 0},
- \ {'short' : 'r', 'long' : 'register data types', 'fold' : 0},
- \ {'short' : 't', 'long' : 'tasks', 'fold' : 0}
- \ ]
- let s:known_types.verilog = type_verilog
- " VHDL {{{3
- " The VHDL ctags parser unfortunately doesn't generate proper scopes
- let type_vhdl = {}
- let type_vhdl.ctagstype = 'vhdl'
- let type_vhdl.kinds = [
- \ {'short' : 'P', 'long' : 'packages', 'fold' : 1},
- \ {'short' : 'c', 'long' : 'constants', 'fold' : 0},
- \ {'short' : 't', 'long' : 'types', 'fold' : 0},
- \ {'short' : 'T', 'long' : 'subtypes', 'fold' : 0},
- \ {'short' : 'r', 'long' : 'records', 'fold' : 0},
- \ {'short' : 'e', 'long' : 'entities', 'fold' : 0},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'p', 'long' : 'procedures', 'fold' : 0}
- \ ]
- let s:known_types.vhdl = type_vhdl
- " Vim {{{3
- let type_vim = {}
- let type_vim.ctagstype = 'vim'
- let type_vim.kinds = [
- \ {'short' : 'v', 'long' : 'variables', 'fold' : 1},
- \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
- \ {'short' : 'a', 'long' : 'autocommand groups', 'fold' : 1},
- \ {'short' : 'c', 'long' : 'commands', 'fold' : 0},
- \ {'short' : 'm', 'long' : 'maps', 'fold' : 1}
- \ ]
- let s:known_types.vim = type_vim
- " YACC {{{3
- let type_yacc = {}
- let type_yacc.ctagstype = 'yacc'
- let type_yacc.kinds = [
- \ {'short' : 'l', 'long' : 'labels', 'fold' : 0}
- \ ]
- let s:known_types.yacc = type_yacc
- " }}}3
-
- let user_defs = s:GetUserTypeDefs()
- for [key, value] in items(user_defs)
- if !has_key(s:known_types, key) ||
- \ (has_key(value, 'replace') && value.replace)
- let s:known_types[key] = value
- else
- call extend(s:known_types[key], value)
- endif
- endfor
-
- " Create a dictionary of the kind order for fast
- " access in sorting functions
- for type in values(s:known_types)
- let i = 0
- let type.kinddict = {}
- for kind in type.kinds
- let type.kinddict[kind.short] = i
- let i += 1
- endfor
- endfor
-
- let s:type_init_done = 1
-endfunction
-
-" s:GetUserTypeDefs() {{{2
-function! s:GetUserTypeDefs()
- redir => defs
- silent execute 'let g:'
- redir END
-
- let deflist = split(defs, '\n')
- call map(deflist, 'substitute(v:val, ''^\S\+\zs.*'', "", "")')
- call filter(deflist, 'v:val =~ "^tagbar_type_"')
-
- let defdict = {}
- for defstr in deflist
- let type = substitute(defstr, '^tagbar_type_', '', '')
- execute 'let defdict["' . type . '"] = g:' . defstr
- endfor
-
- " If the user only specified one of kind2scope and scope2kind use it to
- " generate the other one
- " Also, transform the 'kind' definitions into dictionary format
- for def in values(defdict)
- let kinds = def.kinds
- let def.kinds = []
- for kind in kinds
- let kindlist = split(kind, ':')
- let kinddict = {'short' : kindlist[0], 'long' : kindlist[1]}
- if len(kindlist) == 3
- let kinddict.fold = kindlist[2]
- else
- let kinddict.fold = 0
- endif
- call add(def.kinds, kinddict)
- endfor
-
- if has_key(def, 'kind2scope') && !has_key(def, 'scope2kind')
- let def.scope2kind = {}
- for [key, value] in items(def.kind2scope)
- let def.scope2kind[value] = key
- endfor
- elseif has_key(def, 'scope2kind') && !has_key(def, 'kind2scope')
- let def.kind2scope = {}
- for [key, value] in items(def.scope2kind)
- let def.kind2scope[value] = key
- endfor
- endif
- endfor
-
- return defdict
-endfunction
-
-" s:RestoreSession() {{{2
-" Properly restore Tagbar after a session got loaded
-function! s:RestoreSession()
- let tagbarwinnr = bufwinnr('__Tagbar__')
- if tagbarwinnr == -1
- " Tagbar wasn't open in the saved session, nothing to do
- return
- else
- let in_tagbar = 1
- if winnr() != tagbarwinnr
- execute tagbarwinnr . 'wincmd w'
- let in_tagbar = 0
- endif
- endif
-
- if !s:type_init_done
- call s:InitTypes()
- endif
-
- if !s:checked_ctags
- if !s:CheckForExCtags()
- return
- endif
- endif
-
- call s:InitWindow(g:tagbar_autoclose)
-
- " Leave the Tagbar window and come back so the update event gets triggered
- execute 'wincmd p'
- execute tagbarwinnr . 'wincmd w'
-
- if !in_tagbar
- execute 'wincmd p'
- endif
-endfunction
-
-" s:MapKeys() {{{2
-function! s:MapKeys()
- nnoremap <script> <silent> <buffer> <CR> :call <SID>JumpToTag(0)<CR>
- nnoremap <script> <silent> <buffer> <2-LeftMouse>
- \ :call <SID>JumpToTag(0)<CR>
- nnoremap <script> <silent> <buffer> p :call <SID>JumpToTag(1)<CR>
- nnoremap <script> <silent> <buffer> <LeftRelease>
- \ <LeftRelease>:call <SID>CheckMouseClick()<CR>
- nnoremap <script> <silent> <buffer> <Space> :call <SID>ShowPrototype()<CR>
-
- nnoremap <script> <silent> <buffer> + :call <SID>OpenFold()<CR>
- nnoremap <script> <silent> <buffer> <kPlus> :call <SID>OpenFold()<CR>
- nnoremap <script> <silent> <buffer> zo :call <SID>OpenFold()<CR>
- nnoremap <script> <silent> <buffer> - :call <SID>CloseFold()<CR>
- nnoremap <script> <silent> <buffer> <kMinus> :call <SID>CloseFold()<CR>
- nnoremap <script> <silent> <buffer> zc :call <SID>CloseFold()<CR>
- nnoremap <script> <silent> <buffer> o :call <SID>ToggleFold()<CR>
- nnoremap <script> <silent> <buffer> za :call <SID>ToggleFold()<CR>
-
- nnoremap <script> <silent> <buffer> * :call <SID>SetFoldLevel(99)<CR>
- nnoremap <script> <silent> <buffer> <kMultiply>
- \ :call <SID>SetFoldLevel(99)<CR>
- nnoremap <script> <silent> <buffer> zR :call <SID>SetFoldLevel(99)<CR>
- nnoremap <script> <silent> <buffer> = :call <SID>SetFoldLevel(0)<CR>
- nnoremap <script> <silent> <buffer> zM :call <SID>SetFoldLevel(0)<CR>
-
- nnoremap <script> <silent> <buffer> <C-N>
- \ :call <SID>GotoNextToplevelTag(1)<CR>
- nnoremap <script> <silent> <buffer> <C-P>
- \ :call <SID>GotoNextToplevelTag(-1)<CR>
-
- nnoremap <script> <silent> <buffer> s :call <SID>ToggleSort()<CR>
- nnoremap <script> <silent> <buffer> x :call <SID>ZoomWindow()<CR>
- nnoremap <script> <silent> <buffer> q :call <SID>CloseWindow()<CR>
- nnoremap <script> <silent> <buffer> <F1> :call <SID>ToggleHelp()<CR>
-endfunction
-
-" s:CreateAutocommands() {{{2
-function! s:CreateAutocommands()
- augroup TagbarAutoCmds
- autocmd!
- autocmd BufEnter __Tagbar__ nested call s:QuitIfOnlyWindow()
- autocmd BufUnload __Tagbar__ call s:CleanUp()
- autocmd CursorHold __Tagbar__ call s:ShowPrototype()
-
- autocmd BufEnter,CursorHold * call
- \ s:AutoUpdate(fnamemodify(expand('<afile>'), ':p'))
- autocmd BufDelete * call
- \ s:CleanupFileinfo(fnamemodify(expand('<afile>'), ':p'))
- augroup END
-
- let s:autocommands_done = 1
-endfunction
-
-" s:CheckForExCtags() {{{2
-" Test whether the ctags binary is actually Exuberant Ctags and not GNU ctags
-" (or something else)
-function! s:CheckForExCtags()
- let ctags_cmd = s:EscapeCtagsCmd(g:tagbar_ctags_bin, '--version')
- if ctags_cmd == ''
- return
- endif
-
- let ctags_output = s:ExecuteCtags(ctags_cmd)
-
- if v:shell_error || ctags_output !~# 'Exuberant Ctags'
- echoerr 'Tagbar: Ctags doesn''t seem to be Exuberant Ctags!'
- echomsg 'GNU ctags will NOT WORK.'
- \ 'Please download Exuberant Ctags from ctags.sourceforge.net'
- \ 'and install it in a directory in your $PATH'
- \ 'or set g:tagbar_ctags_bin.'
- echomsg 'Executed command: "' . ctags_cmd . '"'
- if !empty(ctags_output)
- echomsg 'Command output:'
- for line in split(ctags_output, '\n')
- echomsg line
- endfor
- endif
- return 0
- elseif !s:CheckExCtagsVersion(ctags_output)
- echoerr 'Tagbar: Exuberant Ctags is too old!'
- echomsg 'You need at least version 5.5 for Tagbar to work.'
- \ 'Please download a newer version from ctags.sourceforge.net.'
- echomsg 'Executed command: "' . ctags_cmd . '"'
- if !empty(ctags_output)
- echomsg 'Command output:'
- for line in split(ctags_output, '\n')
- echomsg line
- endfor
- endif
- return 0
- else
- let s:checked_ctags = 1
- return 1
- endif
-endfunction
-
-" s:CheckExCtagsVersion() {{{2
-function! s:CheckExCtagsVersion(output)
- let matchlist = matchlist(a:output, '\vExuberant Ctags (\d+)\.(\d+)')
- let major = matchlist[1]
- let minor = matchlist[2]
-
- return major >= 6 || (major == 5 && minor >= 5)
-endfunction
-
-" Prototypes {{{1
-" Base tag {{{2
-let s:BaseTag = {}
-
-" s:BaseTag._init() {{{3
-function! s:BaseTag._init(name) dict
- let self.name = a:name
- let self.fields = {}
- let self.fields.line = 0
- let self.path = ''
- let self.fullpath = a:name
- let self.depth = 0
- let self.parent = {}
- let self.tline = -1
- let self.fileinfo = {}
-endfunction
-
-" s:BaseTag.isNormalTag() {{{3
-function! s:BaseTag.isNormalTag() dict
- return 0
-endfunction
-
-" s:BaseTag.isPseudoTag() {{{3
-function! s:BaseTag.isPseudoTag() dict
- return 0
-endfunction
-
-" s:BaseTag.isKindheader() {{{3
-function! s:BaseTag.isKindheader() dict
- return 0
-endfunction
-
-" s:BaseTag.getPrototype() {{{3
-function! s:BaseTag.getPrototype() dict
- return ''
-endfunction
-
-" s:BaseTag._getPrefix() {{{3
-function! s:BaseTag._getPrefix() dict
- let fileinfo = self.fileinfo
-
- if has_key(self, 'children') && !empty(self.children)
- if fileinfo.tagfolds[self.fields.kind][self.fullpath]
- let prefix = s:icon_closed
- else
- let prefix = s:icon_open
- endif
- else
- let prefix = ' '
- endif
- if has_key(self.fields, 'access')
- let prefix .= get(s:access_symbols, self.fields.access, ' ')
- else
- let prefix .= ' '
- endif
-
- return prefix
-endfunction
-
-" s:BaseTag.initFoldState() {{{3
-function! s:BaseTag.initFoldState() dict
- let fileinfo = self.fileinfo
-
- if s:known_files.has(fileinfo.fpath) &&
- \ has_key(fileinfo._tagfolds_old[self.fields.kind], self.fullpath)
- " The file has been updated and the tag was there before, so copy its
- " old fold state
- let fileinfo.tagfolds[self.fields.kind][self.fullpath] =
- \ fileinfo._tagfolds_old[self.fields.kind][self.fullpath]
- elseif self.depth >= fileinfo.foldlevel
- let fileinfo.tagfolds[self.fields.kind][self.fullpath] = 1
- else
- let fileinfo.tagfolds[self.fields.kind][self.fullpath] =
- \ fileinfo.kindfolds[self.fields.kind]
- endif
-endfunction
-
-" s:BaseTag.getClosedParentTline() {{{3
-function! s:BaseTag.getClosedParentTline() dict
- let tagline = self.tline
- let fileinfo = self.fileinfo
-
- let parent = self.parent
- while !empty(parent)
- if parent.isFolded()
- let tagline = parent.tline
- break
- endif
- let parent = parent.parent
- endwhile
-
- return tagline
-endfunction
-
-" s:BaseTag.isFoldable() {{{3
-function! s:BaseTag.isFoldable() dict
- return has_key(self, 'children') && !empty(self.children)
-endfunction
-
-" s:BaseTag.isFolded() {{{3
-function! s:BaseTag.isFolded() dict
- return self.fileinfo.tagfolds[self.fields.kind][self.fullpath]
-endfunction
-
-" s:BaseTag.openFold() {{{3
-function! s:BaseTag.openFold() dict
- if self.isFoldable()
- let self.fileinfo.tagfolds[self.fields.kind][self.fullpath] = 0
- endif
-endfunction
-
-" s:BaseTag.closeFold() {{{3
-function! s:BaseTag.closeFold() dict
- let newline = line('.')
-
- if !empty(self.parent) && self.parent.isKindheader()
- " Tag is child of generic 'kind'
- call self.parent.closeFold()
- let newline = self.parent.tline
- elseif self.isFoldable() && !self.isFolded()
- " Tag is parent of a scope and is not folded
- let self.fileinfo.tagfolds[self.fields.kind][self.fullpath] = 1
- elseif !empty(self.parent)
- " Tag is normal child, so close parent
- let parent = self.parent
- let self.fileinfo.tagfolds[parent.fields.kind][parent.fullpath] = 1
- let newline = parent.tline
- endif
-
- return newline
-endfunction
-
-" s:BaseTag.setFolded() {{{3
-function! s:BaseTag.setFolded(folded) dict
- let self.fileinfo.tagfolds[self.fields.kind][self.fullpath] = a:folded
-endfunction
-
-" s:BaseTag.openParents() {{{3
-function! s:BaseTag.openParents() dict
- let parent = self.parent
-
- while !empty(parent)
- call parent.openFold()
- let parent = parent.parent
- endwhile
-endfunction
-
-" Normal tag {{{2
-let s:NormalTag = copy(s:BaseTag)
-
-" s:NormalTag.New() {{{3
-function! s:NormalTag.New(name) dict
- let newobj = copy(self)
-
- call newobj._init(a:name)
-
- return newobj
-endfunction
-
-" s:NormalTag.isNormalTag() {{{3
-function! s:NormalTag.isNormalTag() dict
- return 1
-endfunction
-
-" s:NormalTag.str() {{{3
-function! s:NormalTag.str() dict
- let fileinfo = self.fileinfo
- let typeinfo = s:known_types[fileinfo.ftype]
-
- let suffix = get(self.fields, 'signature', '')
- if has_key(self.fields, 'type')
- let suffix .= ' : ' . self.fields.type
- elseif has_key(typeinfo, 'kind2scope') &&
- \ has_key(typeinfo.kind2scope, self.fields.kind)
- let suffix .= ' : ' . typeinfo.kind2scope[self.fields.kind]
- endif
-
- return self._getPrefix() . self.name . suffix . "\n"
-endfunction
-
-" s:NormalTag.getPrototype() {{{3
-function! s:NormalTag.getPrototype() dict
- return self.prototype
-endfunction
-
-" Pseudo tag {{{2
-let s:PseudoTag = copy(s:BaseTag)
-
-" s:PseudoTag.New() {{{3
-function! s:PseudoTag.New(name) dict
- let newobj = copy(self)
-
- call newobj._init(a:name)
-
- return newobj
-endfunction
-
-" s:PseudoTag.isPseudoTag() {{{3
-function! s:PseudoTag.isPseudoTag() dict
- return 1
-endfunction
-
-" s:PseudoTag.str() {{{3
-function! s:PseudoTag.str() dict
- let fileinfo = self.fileinfo
- let typeinfo = s:known_types[fileinfo.ftype]
-
- let suffix = get(self.fields, 'signature', '')
- if has_key(typeinfo.kind2scope, self.fields.kind)
- let suffix .= ' : ' . typeinfo.kind2scope[self.fields.kind]
- endif
-
- return self._getPrefix() . self.name . '*' . suffix
-endfunction
-
-" Kind header {{{2
-let s:KindheaderTag = copy(s:BaseTag)
-
-" s:KindheaderTag.New() {{{3
-function! s:KindheaderTag.New(name) dict
- let newobj = copy(self)
-
- call newobj._init(a:name)
-
- return newobj
-endfunction
-
-" s:KindheaderTag.isKindheader() {{{3
-function! s:KindheaderTag.isKindheader() dict
- return 1
-endfunction
-
-" s:KindheaderTag.getPrototype() {{{3
-function! s:KindheaderTag.getPrototype() dict
- return self.name . ': ' .
- \ self.numtags . ' ' . (self.numtags > 1 ? 'tags' : 'tag')
-endfunction
-
-" s:KindheaderTag.isFoldable() {{{3
-function! s:KindheaderTag.isFoldable() dict
- return 1
-endfunction
-
-" s:KindheaderTag.isFolded() {{{3
-function! s:KindheaderTag.isFolded() dict
- return self.fileinfo.kindfolds[self.short]
-endfunction
-
-" s:KindheaderTag.openFold() {{{3
-function! s:KindheaderTag.openFold() dict
- let self.fileinfo.kindfolds[self.short] = 0
-endfunction
-
-" s:KindheaderTag.closeFold() {{{3
-function! s:KindheaderTag.closeFold() dict
- let self.fileinfo.kindfolds[self.short] = 1
- return line('.')
-endfunction
-
-" s:KindheaderTag.toggleFold() {{{3
-function! s:KindheaderTag.toggleFold() dict
- let fileinfo = s:known_files.getCurrent()
-
- let fileinfo.kindfolds[self.short] = !fileinfo.kindfolds[self.short]
-endfunction
-
-" File info {{{2
-let s:FileInfo = {}
-
-" s:FileInfo.New() {{{3
-function! s:FileInfo.New(fname, ftype) dict
- let newobj = copy(self)
-
- " The complete file path
- let newobj.fpath = a:fname
-
- " File modification time
- let newobj.mtime = getftime(a:fname)
-
- " The vim file type
- let newobj.ftype = a:ftype
-
- " List of the tags that are present in the file, sorted according to the
- " value of 'g:tagbar_sort'
- let newobj.tags = []
-
- " Dictionary of the tags, indexed by line number in the file
- let newobj.fline = {}
-
- " Dictionary of the tags, indexed by line number in the tagbar
- let newobj.tline = {}
-
- " Dictionary of the folding state of 'kind's, indexed by short name
- let newobj.kindfolds = {}
- let typeinfo = s:known_types[a:ftype]
- " copy the default fold state from the type info
- for kind in typeinfo.kinds
- let newobj.kindfolds[kind.short] =
- \ g:tagbar_foldlevel == 0 ? 1 : kind.fold
- endfor
-
- " Dictionary of dictionaries of the folding state of individual tags,
- " indexed by kind and full path
- let newobj.tagfolds = {}
- for kind in typeinfo.kinds
- let newobj.tagfolds[kind.short] = {}
- endfor
-
- " The current foldlevel of the file
- let newobj.foldlevel = g:tagbar_foldlevel
-
- return newobj
-endfunction
-
-" s:FileInfo.reset() {{{3
-" Reset stuff that gets regenerated while processing a file and save the old
-" tag folds
-function! s:FileInfo.reset() dict
- let self.mtime = getftime(self.fpath)
- let self.tags = []
- let self.fline = {}
- let self.tline = {}
-
- let self._tagfolds_old = self.tagfolds
- let self.tagfolds = {}
-
- let typeinfo = s:known_types[self.ftype]
- for kind in typeinfo.kinds
- let self.tagfolds[kind.short] = {}
- endfor
-endfunction
-
-" s:FileInfo.clearOldFolds() {{{3
-function! s:FileInfo.clearOldFolds() dict
- if exists('self._tagfolds_old')
- unlet self._tagfolds_old
- endif
-endfunction
-
-" s:FileInfo.sortTags() {{{3
-function! s:FileInfo.sortTags() dict
- if has_key(s:compare_typeinfo, 'sort')
- if s:compare_typeinfo.sort
- call s:SortTags(self.tags, 's:CompareByKind')
- else
- call s:SortTags(self.tags, 's:CompareByLine')
- endif
- elseif g:tagbar_sort
- call s:SortTags(self.tags, 's:CompareByKind')
- else
- call s:SortTags(self.tags, 's:CompareByLine')
- endif
-endfunction
-
-" s:FileInfo.openKindFold() {{{3
-function! s:FileInfo.openKindFold(kind) dict
- let self.kindfolds[a:kind.short] = 0
-endfunction
-
-" s:FileInfo.closeKindFold() {{{3
-function! s:FileInfo.closeKindFold(kind) dict
- let self.kindfolds[a:kind.short] = 1
-endfunction
-
-" Known files {{{2
-let s:known_files = {
- \ '_current' : {},
- \ '_files' : {}
-\ }
-
-" s:known_files.getCurrent() {{{3
-function! s:known_files.getCurrent() dict
- return self._current
-endfunction
-
-" s:known_files.setCurrent() {{{3
-function! s:known_files.setCurrent(fileinfo) dict
- let self._current = a:fileinfo
-endfunction
-
-" s:known_files.get() {{{3
-function! s:known_files.get(fname) dict
- return get(self._files, a:fname, {})
-endfunction
-
-" s:known_files.put() {{{3
-" Optional second argument is the filename
-function! s:known_files.put(fileinfo, ...) dict
- if a:0 == 1
- let self._files[a:1] = a:fileinfo
- else
- let fname = a:fileinfo.fpath
- let self._files[fname] = a:fileinfo
- endif
-endfunction
-
-" s:known_files.has() {{{3
-function! s:known_files.has(fname) dict
- return has_key(self._files, a:fname)
-endfunction
-
-" s:known_files.rm() {{{3
-function! s:known_files.rm(fname) dict
- if s:known_files.has(a:fname)
- call remove(self._files, a:fname)
- endif
-endfunction
-
-" Window management {{{1
-" s:ToggleWindow() {{{2
-function! s:ToggleWindow()
- let tagbarwinnr = bufwinnr("__Tagbar__")
- if tagbarwinnr != -1
- call s:CloseWindow()
- return
- endif
-
- call s:OpenWindow(0)
-endfunction
-
-" s:OpenWindow() {{{2
-function! s:OpenWindow(autoclose)
- " If the tagbar window is already open jump to it
- let tagbarwinnr = bufwinnr('__Tagbar__')
- if tagbarwinnr != -1
- if winnr() != tagbarwinnr
- execute tagbarwinnr . 'wincmd w'
- endif
- return
- endif
-
- if !s:type_init_done
- call s:InitTypes()
- endif
-
- if !s:checked_ctags
- if !s:CheckForExCtags()
- return
- endif
- endif
-
- " Expand the Vim window to accomodate for the Tagbar window if requested
- if g:tagbar_expand && !s:window_expanded && has('gui_running')
- let &columns += g:tagbar_width + 1
- let s:window_expanded = 1
- endif
-
- let openpos = g:tagbar_left ? 'topleft vertical ' : 'botright vertical '
- exe 'silent keepalt ' . openpos . g:tagbar_width . 'split ' . '__Tagbar__'
-
- call s:InitWindow(a:autoclose)
-
- execute 'wincmd p'
-
- " Jump back to the tagbar window if autoclose or autofocus is set. Can't
- " just stay in it since it wouldn't trigger the update event
- if g:tagbar_autoclose || a:autoclose || g:tagbar_autofocus
- let tagbarwinnr = bufwinnr('__Tagbar__')
- execute tagbarwinnr . 'wincmd w'
- endif
-endfunction
-
-" s:InitWindow() {{{2
-function! s:InitWindow(autoclose)
- setlocal noreadonly " in case the "view" mode is used
- setlocal buftype=nofile
- setlocal bufhidden=hide
- setlocal noswapfile
- setlocal nobuflisted
- setlocal nomodifiable
- setlocal filetype=tagbar
- setlocal nolist
- setlocal nonumber
- setlocal nowrap
- setlocal winfixwidth
- setlocal textwidth=0
-
- if exists('+relativenumber')
- setlocal norelativenumber
- endif
-
- setlocal nofoldenable
- " Reset fold settings in case a plugin set them globally to something
- " expensive. Apparently 'foldexpr' gets executed even if 'foldenable' is
- " off, and then for every appended line (like with :put).
- setlocal foldmethod&
- setlocal foldexpr&
-
- setlocal statusline=%!TagbarGenerateStatusline()
-
- " Script-local variable needed since compare functions can't
- " take extra arguments
- let s:compare_typeinfo = {}
-
- let s:is_maximized = 0
- let s:short_help = 1
-
- let w:autoclose = a:autoclose
-
- if has('balloon_eval')
- setlocal balloonexpr=TagbarBalloonExpr()
- set ballooneval
- endif
-
- let cpoptions_save = &cpoptions
- set cpoptions&vim
-
- if !hasmapto('JumpToTag', 'n')
- call s:MapKeys()
- endif
-
- if !s:autocommands_done
- call s:CreateAutocommands()
- endif
-
- let &cpoptions = cpoptions_save
-endfunction
-
-" s:CloseWindow() {{{2
-function! s:CloseWindow()
- let tagbarwinnr = bufwinnr('__Tagbar__')
- if tagbarwinnr == -1
- return
- endif
-
- let tagbarbufnr = winbufnr(tagbarwinnr)
-
- if winnr() == tagbarwinnr
- if winbufnr(2) != -1
- " Other windows are open, only close the tagbar one
- close
- endif
- else
- " Go to the tagbar window, close it and then come back to the
- " original window
- let curbufnr = bufnr('%')
- execute tagbarwinnr . 'wincmd w'
- close
- " Need to jump back to the original window only if we are not
- " already in that window
- let winnum = bufwinnr(curbufnr)
- if winnr() != winnum
- exe winnum . 'wincmd w'
- endif
- endif
-
- " If the Vim window has been expanded, and Tagbar is not open in any other
- " tabpages, shrink the window again
- if s:window_expanded
- let tablist = []
- for i in range(tabpagenr('$'))
- call extend(tablist, tabpagebuflist(i + 1))
- endfor
-
- if index(tablist, tagbarbufnr) == -1
- let &columns -= g:tagbar_width + 1
- let s:window_expanded = 0
- endif
- endif
-endfunction
-
-" s:ZoomWindow() {{{2
-function! s:ZoomWindow()
- if s:is_maximized
- execute 'vert resize ' . g:tagbar_width
- let s:is_maximized = 0
- else
- vert resize
- let s:is_maximized = 1
- endif
-endfunction
-
-" Tag processing {{{1
-" s:ProcessFile() {{{2
-" Execute ctags and put the information into a 'FileInfo' object
-function! s:ProcessFile(fname, ftype)
- if !s:IsValidFile(a:fname, a:ftype)
- return
- endif
-
- let ctags_output = s:ExecuteCtagsOnFile(a:fname, a:ftype)
-
- if ctags_output == -1
- " put an empty entry into known_files so the error message is only
- " shown once
- call s:known_files.put({}, a:fname)
- return
- elseif ctags_output == ''
- return
- endif
-
- " If the file has only been updated preserve the fold states, otherwise
- " create a new entry
- if s:known_files.has(a:fname)
- let fileinfo = s:known_files.get(a:fname)
- call fileinfo.reset()
- else
- let fileinfo = s:FileInfo.New(a:fname, a:ftype)
- endif
-
- let typeinfo = s:known_types[a:ftype]
-
- " Parse the ctags output lines
- let rawtaglist = split(ctags_output, '\n\+')
- for line in rawtaglist
- let parts = split(line, ';"')
- if len(parts) == 2 " Is a valid tag line
- let taginfo = s:ParseTagline(parts[0], parts[1], typeinfo, fileinfo)
- let fileinfo.fline[taginfo.fields.line] = taginfo
- call add(fileinfo.tags, taginfo)
- endif
- endfor
-
- " Process scoped tags
- let processedtags = []
- if has_key(typeinfo, 'kind2scope')
- let scopedtags = []
- let is_scoped = 'has_key(typeinfo.kind2scope, v:val.fields.kind) ||
- \ has_key(v:val, "scope"