diff --git a/plugin/taglist.vim b/plugin/taglist.vim index aaaeeb5..018facc 100644 --- a/plugin/taglist.vim +++ b/plugin/taglist.vim @@ -1,7 +1,7 @@ " File: taglist.vim " Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) -" Version: 2.6 -" Last Modified: June 9, 2003 +" Version: 2.7 +" Last Modified: August 10, 2003 " " Overview " -------- @@ -38,10 +38,9 @@ " 15. Can be easily extended to support new languages. Support for existing " languages can be modified easily. " -" To see the screenshots of the taglist plugin in different environments, -" visit the following page: +" You can visit the taglist plugin home page for more information: " -" http://www.geocities.com/yegappan/taglist/screenshots.html +" http://www.geocities.com/yegappan/taglist " " This plugin relies on the exuberant ctags utility to dynamically generate " the tag listing. You can download the exuberant ctags utility from @@ -119,10 +118,11 @@ " " This plugin will automatically highlight the name of the current tag. The " tag name will be highlighted after 'updatetime' milliseconds. The default -" value for this Vim option is 4 seconds. You can also use the ":TlistSync" -" command to force the highlighting of the current tag. You can map a key to -" invoke this command. For example, the following command creates a normal -" mapping for the key to highlight the current tag name. +" value for this Vim option is 4 seconds. You should not set the 'updatetime' +" option to very low values to avoid unexpected problems. You can also use the +" ":TlistSync" command to force the highlighting of the current tag. You can +" map a key to invoke this command. For example, the following command creates +" a normal mapping for the key to highlight the current tag name. " " nnoremap :TlistSync " @@ -169,6 +169,16 @@ " ? Display help " " +" You can use the ":TlistUpdate" command to update the tags for the current +" buffer after you made some changes to it. This is equivalent to pressing 'u' +" in the taglist window. You should save the modified buffer before you update +" the tag list for it. Otherwise the listed tags will not include the new tags +" created in the buffer. You can map a key to invoke this command. For +" example, the following command creates a normal mode mapping for the +" key to update the taglist window. +" +" nnoremap :TlistUpdate +" " You can use the ":TlistShowPrototype" command to display the prototype of " a function in the specified line number. For example, " @@ -186,6 +196,34 @@ " " let winManagerWindowLayout = 'FileExplorer|TagList' " +" If you have more than one tag with the same name and prototype in a file, +" then when you jump to one tag, the cursor may be positioned at the location +" of the other tag. For example, in a C++ file if you have functions with the +" same name and prototype in a file, then you will see this problem. This is +" due to the fact that the taglist plugin uses the search pattern generated by +" the exuberant ctags tool to position the cursor for a selected tag. The +" exuberant ctags generates the same search pattern for tags with the same +" prototype. +" +" The following highlight groups are defined and used to highlight the various +" entities in the taglist window: +" +" TagListTagName - Used for tag names +" TagListTagScope - Used for tag scope +" TagListTitle - Used for tag titles +" TagListComment - Used for comments in the taglist window +" TagListSortBy - Used for "sort by" text +" TagListCurDir - Used for current directory name +" +" By default, these highlight groups are linked to the standard Vim highlight +" groups. If you want to change these highlight groups, you can prepend 'My' +" to the above highlight group names and define them in your .vimrc file. The +" taglist plugin will use the defined highlight groups instead of the default +" groups. For example, to change the highlighting used for tag names, you can +" use: +" +" highlight MyTagListTagName guifg=cyan +" " Configuration " ------------- " By changing the following variables you can configure the behavior of this @@ -922,32 +960,57 @@ function! s:Tlist_Init_Window(bufnum) " Mark the buffer as not modifiable setlocal nomodifiable - " Highlight the comments + " Define taglist window element highlighting if has('syntax') syntax match TagListComment '^" .*' syntax match TagListSortBy '^" Sorted by .*' syntax match TagListCurDir '^"= .*' - syntax match TagScope '\s\[.\{-\}\]$' + syntax match TagListTagScope '\s\[.\{-\}\]$' - " Colors used to highlight the selected tag name - highlight clear TagName + " Define the highlighting only if the colors are supported if has('gui_running') || &t_Co > 2 - highlight link TagName Search + " Colors to highlight various taglist window elements + " If user defined highlighting group exists, then use them. + " Otherwise, use default highlight groups. + if hlexists('MyTagListTagName') + highlight link TagListTagName MyTagListTagName + else + highlight link TagListTagName Search + endif + " Colors to highlight comments and titles + if hlexists('MyTagListComment') + highlight link TagListComment MyTagListComment + else + highlight clear TagListComment + highlight link TagListComment Comment + endif + if hlexists('MyTagListTitle') + highlight link TagListTitle MyTagListTitle + else + highlight clear TagListTitle + highlight link TagListTitle Title + endif + if hlexists('MyTagListSortBy') + highlight link TagListSortBy MyTagListSortBy + else + highlight clear TagListSortBy + highlight link TagListSortBy String + endif + if hlexists('MyTagListCurDir') + highlight link TagListCurDir MyTagListCurDir + else + highlight clear TagListCurDir + highlight link TagListCurDir Statement + endif + if hlexists('MyTagListTagScope') + highlight link TagListTagScope MyTagListTagScope + else + highlight clear TagListTagScope + highlight link TagListTagScope Identifier + endif else - highlight TagName term=reverse cterm=reverse + highlight TagListTagName term=reverse cterm=reverse endif - - " Colors to highlight comments and titles - highlight clear TagListComment - highlight link TagListComment Comment - highlight clear TagListTitle - highlight link TagListTitle Title - highlight clear TagListSortBy - highlight link TagListSortBy String - highlight clear TagListCurDir - highlight link TagListCurDir Statement - highlight clear TagScope - highlight link TagScope Identifier endif " Folding related settings @@ -1052,7 +1115,7 @@ function! s:Tlist_Post_Close_Cleanup() match none if has('syntax') - silent! syntax clear TagListTitle + silent! syntax clear endif " Remove the left mouse click mapping if it was setup initially @@ -1374,13 +1437,15 @@ endfunction function! s:Tlist_Close_Window() " Make sure the taglist window exists let winnum = bufwinnr(g:TagList_title) - if winnum != -1 - " Jump to the window if not already there - if winnr() != winnum - exe winnum . 'wincmd w' - endif - close + if winnum == -1 + call s:Tlist_Warning_Msg('Error: Taglist window is not open') + return endif + " Jump to the window if not already there + if winnr() != winnum + exe winnum . 'wincmd w' + endif + close endfunction " Tlist_Toggle_Window() @@ -1548,6 +1613,45 @@ function! s:Tlist_Change_Sort() call search(curline, 'w') endfunction +" Tlist_Update_Tags() +" Update taglist for the current buffer by regenerating the tag list +" Contributed by WEN Guopeng. +function! s:Tlist_Update_Tags() + " If taglist window is not open, show an error message: + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + call s:Tlist_Warning_Msg('Error: Taglist window is not open') + return 0 + endif + + " Update the tag list window only if it's open + if winnr() == winnum + " Already in the taglist window, simply update the window content + call s:Tlist_Update_Window() + else + " First check the current buffer is modified or not: + if &modified + let msg = "No write since last change, tag list may be inaccurate" + call s:Tlist_Warning_Msg(msg) + endif + + " Goto the taglist window, update it and get back to the original + " window: + let curbufnr = bufnr('%') + exe winnum . 'wincmd w' + call s:Tlist_Update_Window() + + " 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 + + return 1 +endfunction + " Tlist_Update_Window() " Update the window by regenerating the tag list function! s:Tlist_Update_Window() @@ -1615,9 +1719,9 @@ function! s:Tlist_Highlight_Tagline() " Highlight the current selected name if g:Tlist_Display_Prototype == 0 - exe 'match TagName /\%' . line('.') . 'l\s\+\zs.*/' + exe 'match TagListTagName /\%' . line('.') . 'l\s\+\zs.*/' else - exe 'match TagName /\%' . line('.') . 'l.*/' + exe 'match TagListTagName /\%' . line('.') . 'l.*/' endif endfunction @@ -1629,7 +1733,7 @@ endfunction function! s:Tlist_Jump_To_Tag(win_ctrl) " Do not process comment lines and empty lines let curline = getline('.') - if curline == '' || curline[0] == '"' + if curline =~ '^\s*$' || curline[0] == '"' return endif @@ -1732,7 +1836,7 @@ function! s:Tlist_Show_Tag_Prototype() " Do not process comment lines and empty lines let curline = getline('.') - if curline == '' || curline[0] == '"' + if curline =~ '^\s*$' || curline[0] == '"' return endif @@ -1851,6 +1955,7 @@ function! s:Tlist_Highlight_Tag(bufnum, curline) " Make sure the taglist window is present let winnum = bufwinnr(g:TagList_title) if winnum == -1 + call s:Tlist_Warning_Msg('Error: Taglist window is not open') return endif @@ -1979,6 +2084,7 @@ endif " Define the user commands to manage the taglist window command! -nargs=0 Tlist call s:Tlist_Toggle_Window(bufnr('%')) command! -nargs=0 TlistClose call s:Tlist_Close_Window() +command! -nargs=0 TlistUpdate call s:Tlist_Update_Tags() command! -nargs=0 TlistSync call s:Tlist_Highlight_Tag(bufnr('%'), line('.')) command! -nargs=? TlistShowPrototype echo s:Tlist_Get_Tag_Prototype_By_Line()