diff --git a/doc/taglist.txt b/doc/taglist.txt index 98195fe..17b8bdf 100644 --- a/doc/taglist.txt +++ b/doc/taglist.txt @@ -2,14 +2,14 @@ Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) For Vim version 6.0 and above -Last change: 2005 December 28 +Last change: 2006 April 12 1. Overview |taglist-intro| 2. Taglist on the internet |taglist-internet| 3. Requirements |taglist-requirements| 4. Installation |taglist-install| 5. Usage |taglist-using| -6. Configuration |taglist-configure| +6. Options |taglist-options| 7. Commands |taglist-commands| 8. Global functions |taglist-functions| 9. Extending |taglist-extend| @@ -143,7 +143,9 @@ Opening the taglist window~ You can open the taglist window using the ":TlistOpen" or the ":TlistToggle" commands. The ":TlistOpen" command opens the taglist window and jumps to it. The ":TlistToggle" command opens or closes (toggle) the taglist window and the -cursor remains in the current window. +cursor remains in the current window. If the 'Tlist_GainFocus_On_ToggleOpen' +variable is set to 1, then the ":TlistToggle" command opens the taglist window +and moves the cursor to the taglist window. You can map a key to invoke these commands. For example, the following command creates a normal mode mapping for the key to toggle the taglist window. @@ -181,7 +183,8 @@ name using the mouse. In the taglist window, you can use the [[ or key to jump to the beginning of the previous file. You can use the ]] or key to jump to the -beginning of the next file. +beginning of the next file. When you reach the first or last file, the search +wraps around and the jumps to the next/previous file. Highlighting the current tag~ The taglist plugin automatically highlights the name of the current tag in the @@ -236,6 +239,11 @@ from which to recursively add the files. The second optional argument specifies the wildcard matching pattern for selecting the files to add. The default pattern is * and all the files are added. +Displaying tags for only one file~ +The taglist window displays the tags for all the files in the Vim buffer list +and all the manually added files. To display the tags for only the current +active buffer, set the 'Tlist_Show_One_File' variable to 1. + Removing files from the taglist~ You can remove a file from the taglist window, by pressing the 'd' key when the cursor is on one of the tags listed for the file in the taglist window. The @@ -312,22 +320,19 @@ prototype of the current tag. For example, :TlistShowPrototype myfile.c 50 < Taglist window contents~ -The taglist window displays the tags for all the files in the Vim buffer list -and all the manually added files. To display the tags for only the current -active buffer, set the 'Tlist_Show_One_File' variable to 1. - The tag names are grouped by their type (variable, function, class, etc.). For tags with scope information (like class members, structures inside structures, etc.), the scope information is displayed in square brackets "[]" after the tag name. The contents of the taglist buffer/window are managed by the taglist plugin. -The Vim |'modifiable'| option is turned off for the taglist buffer. You should -not manually edit the taglist buffer, by setting the |'modifiable'| flag. If -you manually edit the taglist buffer contents, then the taglist plugin will be -out of sync with the taglist buffer contents and the plugin will no longer -work correctly. To redisplay the taglist buffer contents again, close the -taglist window and reopen it. +The |'filetype'| for the taglist buffer is set to 'taglist'. The Vim +|'modifiable'| option is turned off for the taglist buffer. You should not +manually edit the taglist buffer, by setting the |'modifiable'| flag. If you +manually edit the taglist buffer contents, then the taglist plugin will be out +of sync with the taglist buffer contents and the plugin will no longer work +correctly. To redisplay the taglist buffer contents again, close the taglist +window and reopen it. Opening and closing the tag and file tree~ In the taglist window, the tag names are displayed as a foldable tree using @@ -483,7 +488,7 @@ in the taglist window. ]] Jump to the beginning of the next file Jump to the beginning of the next file q Close the taglist window - ? Display help + Display help The above keys will work in both the normal mode and the insert mode. @@ -537,8 +542,8 @@ If you have installed the taglist help file (this file), then you can use the Vim ":help taglist-" command to get help on the various taglist topics. -You can press the "?" key in the taglist window to display the help -information about using the taglist window. If you again press the '?' key, +You can press the key in the taglist window to display the help +information about using the taglist window. If you again press the key, the help information is removed from the taglist window. *taglist-debug* @@ -554,8 +559,8 @@ variable. In the later case, to minimize memory usage, only the last 3000 characters from the debug messages are stored. ============================================================================== - *taglist-configure* -6. Configuration~ + *taglist-options* +6. Options~ A number of Vim variables control the behavior of the taglist plugin. These variables are initialized to a default value. By changing these variables you @@ -584,6 +589,8 @@ description of these variables refer to the text below this table. window. |'Tlist_Exit_OnlyWindow'| Close Vim if the taglist is the only window. |'Tlist_File_Fold_Auto_Close'| Close tag folds for inactive buffers. +|'Tlist_GainFocus_On_ToggleOpen'| + Jump to taglist window on open. |'Tlist_Highlight_Tag_On_BufEnter'| On entering a buffer, automatically highlight the current tag. @@ -725,6 +732,16 @@ in the taglist window will be collapsed/folded. When a buffer is loaded in a Vim window, the corresponding tags tree will be opened. > let Tlist_File_Fold_Auto_Close = 1 +< + *'Tlist_GainFocus_On_ToggleOpen'* +Tlist_GainFocus_On_ToggleOpen~ +When the taglist window is opened using the ':TlistToggle' command, this +option controls whether the cursor is moved to the taglist window or remains +in the current window. By default, this option is set to 0 and the cursor +remains in the current window. When this variable is set to 1, the cursor +moves to the taglist window after opening the taglist window. +> + let Tlist_GainFocus_On_ToggleOpen = 1 < *'Tlist_Highlight_Tag_On_BufEnter'* Tlist_Highlight_Tag_On_BufEnter~ diff --git a/plugin/taglist.vim b/plugin/taglist.vim index d58420c..2188519 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: 4.0 Beta 3 -" Last Modified: Dec 28, 2005 +" Version: 4.0 Beta 4 +" Last Modified: April 12, 2006 " " The "Tag List" plugin is a source code browser plugin for Vim and provides " an overview of the structure of the programming language files and allows @@ -96,6 +96,12 @@ if !exists('loaded_taglist') let Tlist_Auto_Open = 0 endif + " When the taglist window is toggle opened, move the cursor to the + " taglist window + if !exists('Tlist_GainFocus_On_ToggleOpen') + let Tlist_GainFocus_On_ToggleOpen = 0 + endif + " Process files even when the taglist window is not open if !exists('Tlist_Process_File_Always') let Tlist_Process_File_Always = 0 @@ -228,7 +234,7 @@ if !exists('loaded_taglist') " Define the taglist autocommand to automatically open the taglist window " on Vim startup if g:Tlist_Auto_Open - autocmd VimEnter * nested call s:Tlist_Check_Auto_Open() + autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open() endif " Refresh the taglist @@ -256,7 +262,7 @@ if !exists('loaded_taglist') \ call s:Tlist_Add_Files_Recursive() command! -nargs=0 TlistClose call s:Tlist_Window_Close() command! -nargs=0 TlistUpdate call s:Tlist_Update_Current_File() - command! -nargs=0 TlistHighlightTag call s:Tlist_Highlight_Tag( + command! -nargs=0 TlistHighlightTag call s:Tlist_Window_Highlight_Tag( \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1) " For backwards compatiblity define the TlistSync command command! -nargs=0 TlistSync TlistHighlightTag @@ -285,9 +291,15 @@ if !exists('loaded_taglist') unmap xx exe 'autocmd FuncUndefined *' . s:sid . 'Tlist_* source ' . - \ expand('') - exe 'autocmd FuncUndefined Tlist_* source ' . expand('') - exe 'autocmd FuncUndefined TagList_* source ' . expand('') + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined *' . s:sid . 'Tlist_Window_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined *' . s:sid . 'Tlist_Menu_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined Tlist_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined TagList_* source ' . + \ escape(expand(''), ' ') unlet! s:sid @@ -483,8 +495,8 @@ let s:tlist_menu_empty = 1 " and cleared appropriately. let s:Tlist_Skip_Refresh = 0 -" Tlist_Display_Help() -function! s:Tlist_Display_Help() +" Tlist_Window_Display_Help() +function! s:Tlist_Window_Display_Help() if s:tlist_app_name == "winmanager" " To handle a bug in the winmanager plugin, add a space at the " last line @@ -493,7 +505,7 @@ function! s:Tlist_Display_Help() if s:tlist_brief_help " Add the brief help - call append(0, '" Press ? to display help text') + call append(0, '" Press to display help text') else " Add the extensive help call append(0, '" : Jump to tag definition') @@ -511,14 +523,14 @@ function! s:Tlist_Display_Help() call append(12, '" [[ : Move to the start of previous file') call append(13, '" ]] : Move to the start of next file') call append(14, '" q : Close the taglist window') - call append(15, '" ? : Remove help text') + call append(15, '" : Remove help text') endif endfunction -" Tlist_Toggle_Help_Text() +" Tlist_Window_Toggle_Help_Text() " Toggle taglist plugin help text between the full version and the brief " version -function! s:Tlist_Toggle_Help_Text() +function! s:Tlist_Window_Toggle_Help_Text() if g:Tlist_Compact_Format " In compact display mode, do not display help return @@ -547,7 +559,7 @@ function! s:Tlist_Toggle_Help_Text() exe '1,' . brief_help_size . ' delete _' " Adjust the start/end line numbers for the files - call s:Tlist_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) + call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) else let s:tlist_brief_help = 1 @@ -555,10 +567,10 @@ function! s:Tlist_Toggle_Help_Text() exe '1,' . full_help_size . ' delete _' " Adjust the start/end line numbers for the files - call s:Tlist_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) + call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) endif - call s:Tlist_Display_Help() + call s:Tlist_Window_Display_Help() " Restore the report option let &report = old_report @@ -669,11 +681,11 @@ endfunction " Used to speed up file lookup let s:tlist_file_lnum_idx_cache = -1 -" Tlist_Get_File_Index_By_Linenum() +" Tlist_Window_Get_File_Index_By_Linenum() " Return the index of the filename present in the specified line number " Line number refers to the line number in the taglist window -function! s:Tlist_Get_File_Index_By_Linenum(lnum) - call s:Tlist_Log_Msg('Tlist_Get_File_Index_By_Linenum (' . a:lnum . ')') +function! s:Tlist_Window_Get_File_Index_By_Linenum(lnum) + call s:Tlist_Log_Msg('Tlist_Window_Get_File_Index_By_Linenum (' . a:lnum . ')') " First try to see whether the new line number is within the range " of the last returned file @@ -685,30 +697,43 @@ function! s:Tlist_Get_File_Index_By_Linenum(lnum) endif endif - " Do a binary search in the taglist - let left = 0 - let right = s:tlist_file_count - 1 + let fidx = -1 - while left < right - let mid = (left + right) / 2 + if g:Tlist_Show_One_File + " Displaying only one file in the taglist window. Check whether + " the line is within the tags displayed for that file + if s:tlist_cur_file_idx != -1 + if a:lnum >= s:tlist_{s:tlist_cur_file_idx}_start + \ && a:lnum <= s:tlist_{s:tlist_cur_file_idx}_end + let fidx = s:tlist_cur_file_idx + endif - if a:lnum >= s:tlist_{mid}_start && a:lnum <= s:tlist_{mid}_end - let s:tlist_file_lnum_idx_cache = mid - return mid endif - - if a:lnum < s:tlist_{mid}_start - let right = mid - 1 - else - let left = mid + 1 - endif - endwhile - - if left < 0 || left >= s:tlist_file_count || - \ a:lnum < s:tlist_{left}_start || a:lnum > s:tlist_{left}_end - let fidx = -1 else - let fidx = left + " Do a binary search in the taglist + let left = 0 + let right = s:tlist_file_count - 1 + + while left < right + let mid = (left + right) / 2 + + if a:lnum >= s:tlist_{mid}_start && a:lnum <= s:tlist_{mid}_end + let s:tlist_file_lnum_idx_cache = mid + return mid + endif + + if a:lnum < s:tlist_{mid}_start + let right = mid - 1 + else + let left = mid + 1 + endif + endwhile + + if left >= 0 && left < s:tlist_file_count + \ && a:lnum >= s:tlist_{left}_start + \ && a:lnum <= s:tlist_{left}_end + let fidx = left + endif endif let s:tlist_file_lnum_idx_cache = fidx @@ -982,10 +1007,10 @@ function! s:Tlist_Discard_TagInfo(fidx) let s:tlist_{a:fidx}_menu_cmd = '' endfunction -" Tlist_Update_Line_Offsets +" Tlist_Window_Update_Line_Offsets " Update the line offsets for tags for files starting from start_idx " and displayed in the taglist window by the specified offset -function! s:Tlist_Update_Line_Offsets(start_idx, increment, offset) +function! s:Tlist_Window_Update_Line_Offsets(start_idx, increment, offset) let i = a:start_idx while i < s:tlist_file_count @@ -1033,10 +1058,10 @@ function! s:Tlist_Discard_FileInfo(fidx) unlet! s:tlist_{a:fidx}_menu_cmd endfunction -" Tlist_Remove_File_From_Display +" Tlist_Window_Remove_File_From_Display " Remove the specified file from display -function! s:Tlist_Remove_File_From_Display(fidx) - call s:Tlist_Log_Msg('Tlist_Remove_File_From_Display (' . +function! s:Tlist_Window_Remove_File_From_Display(fidx) + call s:Tlist_Log_Msg('Tlist_Window_Remove_File_From_Display (' . \ s:tlist_{a:fidx}_filename . ')') " If the file is not visible then no need to remove it if !s:tlist_{a:fidx}_visible @@ -1058,7 +1083,7 @@ function! s:Tlist_Remove_File_From_Display(fidx) " Correct the start and end line offsets for all the files following " this file, as the tags for this file are removed - call s:Tlist_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) + call s:Tlist_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) endfunction " Tlist_Remove_File @@ -1068,7 +1093,7 @@ function! s:Tlist_Remove_File(file_idx, user_request) let fidx = a:file_idx if fidx == -1 - let fidx = s:Tlist_Get_File_Index_By_Linenum(line('.')) + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) if fidx == -1 return endif @@ -1087,7 +1112,7 @@ function! s:Tlist_Remove_File(file_idx, user_request) exe winnum . 'wincmd w' endif - call s:Tlist_Remove_File_From_Display(fidx) + call s:Tlist_Window_Remove_File_From_Display(fidx) if save_winnr != winnum exe save_winnr . 'wincmd w' @@ -1179,9 +1204,9 @@ function! s:Tlist_Remove_File(file_idx, user_request) endif endfunction -" Tlist_Goto_Window +" Tlist_Window_Goto_Window " Goto the taglist window -function! s:Tlist_Goto_Window() +function! s:Tlist_Window_Goto_Window() let winnum = bufwinnr(g:TagList_title) if winnum != -1 if winnr() != winnum @@ -1320,6 +1345,10 @@ endfunction " Set the default options for the taglist window function! s:Tlist_Window_Init() call s:Tlist_Log_Msg('Tlist_Window_Init()') + + " Set the taglist buffer filetype to taglist + setlocal filetype=taglist + " Define taglist window element highlighting syntax match TagListComment '^" .*' syntax match TagListFileName '^[^" ].*$' @@ -1353,7 +1382,7 @@ function! s:Tlist_Window_Init() highlight link TagListFileName MyTagListFileName else highlight clear TagListFileName - highlight default TagListFileName guibg=darkgray ctermbg=darkgray + highlight default TagListFileName guibg=Grey ctermbg=darkgray \ guifg=white ctermfg=white endif if hlexists('MyTagListTagScope') @@ -1406,16 +1435,19 @@ function! s:Tlist_Window_Init() set winfixheight endif endif + if !g:Tlist_Use_Horiz_Window && v:version >= 700 + set winfixwidth + endif " Setup the cpoptions properly for the maps to work let old_cpoptions = &cpoptions set cpoptions&vim " Create buffer local mappings for jumping to the tags and sorting the list - nnoremap :call Tlist_Jump_To_Tag(0) - nnoremap o :call Tlist_Jump_To_Tag(1) - nnoremap p :call Tlist_Jump_To_Tag(2) - nnoremap <2-LeftMouse> :call Tlist_Jump_To_Tag(0) + nnoremap :call Tlist_Window_Jump_To_Tag(0) + nnoremap o :call Tlist_Window_Jump_To_Tag(1) + nnoremap p :call Tlist_Window_Jump_To_Tag(2) + nnoremap <2-LeftMouse> :call Tlist_Window_Jump_To_Tag(0) nnoremap s :call Tlist_Change_Sort(1, 1, '') nnoremap + :silent! foldopen nnoremap - :silent! foldclose @@ -1424,25 +1456,25 @@ function! s:Tlist_Window_Init() nnoremap :silent! foldopen nnoremap :silent! foldclose nnoremap :silent! %foldopen! - nnoremap :call Tlist_Show_Info() + nnoremap :call Tlist_Window_Show_Info() nnoremap u :call Tlist_Window_Update_File() nnoremap d :call Tlist_Remove_File(-1, 1) nnoremap x :call Tlist_Window_Zoom() - nnoremap [[ :call Tlist_Move_To_File(-1) - nnoremap :call Tlist_Move_To_File(-1) - nnoremap ]] :call Tlist_Move_To_File(1) - nnoremap :call Tlist_Move_To_File(1) - nnoremap ? :call Tlist_Toggle_Help_Text() + nnoremap [[ :call Tlist_Window_Move_To_File(-1) + nnoremap :call Tlist_Window_Move_To_File(-1) + nnoremap ]] :call Tlist_Window_Move_To_File(1) + nnoremap :call Tlist_Window_Move_To_File(1) + nnoremap :call Tlist_Window_Toggle_Help_Text() nnoremap q :close " Insert mode mappings - inoremap :call Tlist_Jump_To_Tag(0) + inoremap :call Tlist_Window_Jump_To_Tag(0) " Windows needs return - inoremap :call Tlist_Jump_To_Tag(0) - inoremap o :call Tlist_Jump_To_Tag(1) - inoremap p :call Tlist_Jump_To_Tag(2) + inoremap :call Tlist_Window_Jump_To_Tag(0) + inoremap o :call Tlist_Window_Jump_To_Tag(1) + inoremap p :call Tlist_Window_Jump_To_Tag(2) inoremap <2-LeftMouse> :call - \ Tlist_Jump_To_Tag(0) + \ Tlist_Window_Jump_To_Tag(0) inoremap s \ :call Tlist_Change_Sort(1, 1, '') inoremap + :silent! foldopen @@ -1453,16 +1485,16 @@ function! s:Tlist_Window_Init() inoremap :silent! foldclose inoremap :silent! %foldopen! inoremap :call - \ Tlist_Show_Info() + \ Tlist_Window_Show_Info() inoremap u \ :call Tlist_Window_Update_File() inoremap d :call Tlist_Remove_File(-1, 1) inoremap x :call Tlist_Window_Zoom() - inoremap [[ :call Tlist_Move_To_File(-1) - inoremap :call Tlist_Move_To_File(-1) - inoremap ]] :call Tlist_Move_To_File(1) - inoremap :call Tlist_Move_To_File(1) - inoremap ? :call Tlist_Toggle_Help_Text() + inoremap [[ :call Tlist_Window_Move_To_File(-1) + inoremap :call Tlist_Window_Move_To_File(-1) + inoremap ]] :call Tlist_Window_Move_To_File(1) + inoremap :call Tlist_Window_Move_To_File(1) + inoremap :call Tlist_Window_Toggle_Help_Text() inoremap q :close " Map single left mouse click if the user wants this functionality @@ -1473,7 +1505,7 @@ function! s:Tlist_Window_Init() " not fire the when you use the mouse " to enter a buffer. let clickmap = ':if bufname("%") =~ "__Tag_List__" ' . - \ 'call Tlist_Jump_To_Tag(0) endif ' + \ 'call Tlist_Window_Jump_To_Tag(0) endif ' if maparg('', 'n') == '' " no mapping for leftmouse exe ':nnoremap ' . clickmap @@ -1492,9 +1524,9 @@ function! s:Tlist_Window_Init() augroup TagListAutoCmds autocmd! " Display the tag prototype for the tag under the cursor. - autocmd CursorHold __Tag_List__ call s:Tlist_Show_Info() + autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info() " Highlight the current tag periodically - autocmd CursorHold * silent call s:Tlist_Highlight_Tag( + autocmd CursorHold * silent call s:Tlist_Window_Highlight_Tag( \ fnamemodify(bufname('%'), ':p'), line('.'), 1, 0) " Adjust the Vim window width when taglist window is closed @@ -1502,7 +1534,7 @@ function! s:Tlist_Window_Init() " Close the fold for this buffer when it's not visible in any window if g:Tlist_File_Fold_Auto_Close autocmd BufWinLeave * silent - \ call s:Tlist_Close_File_Fold(expand(':p')) + \ call s:Tlist_Window_Close_File_Fold(expand(':p')) endif " Exit Vim itself if only the taglist window is present (optional) if g:Tlist_Exit_OnlyWindow @@ -1519,7 +1551,9 @@ function! s:Tlist_Window_Init() endif if !g:Tlist_Use_Horiz_Window - autocmd WinEnter * call s:Tlist_Window_Check_Width() + if v:version < 700 + autocmd WinEnter * call s:Tlist_Window_Check_Width() + endif endif augroup end @@ -1552,7 +1586,7 @@ function! s:Tlist_Window_Refresh() if g:Tlist_Compact_Format == 0 " Display help in non-compact mode - call s:Tlist_Display_Help() + call s:Tlist_Window_Display_Help() endif " Mark the buffer as not modifiable @@ -1698,7 +1732,7 @@ function! s:Tlist_Window_Refresh_File(filename, ftype) " Discard and remove the tags for this file from display call s:Tlist_Discard_TagInfo(fidx) - call s:Tlist_Remove_File_From_Display(fidx) + call s:Tlist_Window_Remove_File_From_Display(fidx) endif " Process and generate a list of tags defined in the file @@ -1718,7 +1752,7 @@ function! s:Tlist_Window_Refresh_File(filename, ftype) if g:Tlist_Show_One_File " Remove the previous file if s:tlist_cur_file_idx != -1 - call s:Tlist_Remove_File_From_Display(s:tlist_cur_file_idx) + call s:Tlist_Window_Remove_File_From_Display(s:tlist_cur_file_idx) let s:tlist_{s:tlist_cur_file_idx}_visible = 0 let s:tlist_{s:tlist_cur_file_idx}_start = 0 let s:tlist_{s:tlist_cur_file_idx}_end = 0 @@ -1838,7 +1872,7 @@ function! s:Tlist_Window_Refresh_File(filename, ftype) else let end = s:tlist_{fidx}_end + 1 endif - call s:Tlist_Update_Line_Offsets(fidx + 1, 1, end - start + 1) + call s:Tlist_Window_Update_Line_Offsets(fidx + 1, 1, end - start + 1) " Now that we have updated the taglist window, update the tags " menu (if present) @@ -1981,14 +2015,9 @@ function! s:Tlist_Parse_Tagline(tag_line) " Extract the tag type let ttype = s:Tlist_Extract_Tagtype(a:tag_line) - if ttype == '' - " Line is not in proper tags format - return - endif - - " make sure the tag type is supported - if stridx(s:ctags_flags, ttype) == -1 - " Tag type is not supported + " Make sure the tag type is a valid and supported one + if ttype == '' || stridx(s:ctags_flags, ttype) == -1 + " Line is not in proper tags format or Tag type is not supported return endif @@ -2117,7 +2146,7 @@ function! s:Tlist_Process_File(filename, ftype) " No tags for current file if cmd_output == '' - call s:Tlist_Warning_Msg('Taglist: No tags defined in ' . a:filename) + call s:Tlist_Log_Msg('No tags defined in ' . a:filename) return fidx endif @@ -2168,14 +2197,10 @@ function! s:Tlist_Process_File(filename, ftype) " Extract the tag type let ttype = s:Tlist_Extract_Tagtype(one_line) - if ttype == '' - " Line is not in proper tags format - continue - endif - - " make sure the tag type is supported - if stridx(ctags_flags, ttype) == -1 - " Tag type is not supported + " Make sure the tag type is a valid and supported one + if ttype == '' || stridx(s:ctags_flags, ttype) == -1 + " Line is not in proper tags format or Tag type is not + " supported continue endif @@ -2287,7 +2312,7 @@ function! Tlist_Update_File(filename, ftype) let save_winnr = winnr() " Goto the taglist window - call s:Tlist_Goto_Window() + call s:Tlist_Window_Goto_Window() " Save the cursor position let save_line = line('.') @@ -2402,7 +2427,7 @@ function! s:Tlist_Window_Open() endif " Highlight the current tag - call s:Tlist_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) + call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) endfunction " Tlist_Window_Toggle() @@ -2418,8 +2443,11 @@ function! s:Tlist_Window_Toggle() call s:Tlist_Window_Open() - " Go back to the original window - call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + " Go back to the original window, if Tlist_GainFocus_On_ToggleOpen is not + " set + if !g:Tlist_GainFocus_On_ToggleOpen + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + endif " Update the taglist menu if g:Tlist_Show_Menu @@ -2427,33 +2455,70 @@ function! s:Tlist_Window_Toggle() endif endfunction -" Tlist_Process_Dir -" Process the files in a directory matching the specified pattern -function! s:Tlist_Process_Dir(dir_name, pat) - let flist = glob(a:dir_name . '/' . a:pat) . "\n" +" Tlist_Process_Filelist +" Process multiple files. Each filename is separated by "\n" +" Returns the number of processed files +function! s:Tlist_Process_Filelist(file_names) + let flist = a:file_names + + " Enable lazy screen updates + let old_lazyredraw = &lazyredraw + set lazyredraw + + " Keep track of the number of processed files + let fcnt = 0 " Process one file at a time while flist != '' let nl_idx = stridx(flist, "\n") let one_file = strpart(flist, 0, nl_idx) + " Remove the filename from the list let flist = strpart(flist, nl_idx + 1) if one_file == '' continue endif - if !isdirectory(one_file) - let ftype = s:Tlist_Get_Filetype(one_file) - - echon "\r " - echon "\rProcessing tags for " . fnamemodify(one_file, ':p:t') - - silent call Tlist_Update_File(one_file, ftype) + " Skip directories + if isdirectory(one_file) + continue endif + + let ftype = s:Tlist_Get_Filetype(one_file) + + echon "\r " + echon "\rProcessing tags for " . fnamemodify(one_file, ':p:t') + + let fcnt = fcnt + 1 + + call Tlist_Update_File(one_file, ftype) endwhile - let all_files = glob(a:dir_name . '/*') . "\n" + " Clear the displayed informational messages + echon "\r " + + " Restore the previous state + let &lazyredraw = old_lazyredraw + + return fcnt +endfunction + +" Tlist_Process_Dir +" Process the files in a directory matching the specified pattern +function! s:Tlist_Process_Dir(dir_name, pat) + let flist = glob(a:dir_name . '/' . a:pat) . "\n" + + let fcnt = s:Tlist_Process_Filelist(flist) + + let len = strlen(a:dir_name) + if a:dir_name[len - 1] == '\' || a:dir_name[len - 1] == '/' + let glob_expr = a:dir_name . '*' + else + let glob_expr = a:dir_name . '/*' + endif + let all_files = glob(glob_expr) . "\n" + while all_files != '' let nl_idx = stridx(all_files, "\n") let one_file = strpart(all_files, 0, nl_idx) @@ -2463,12 +2528,17 @@ function! s:Tlist_Process_Dir(dir_name, pat) continue endif + " Skip non-directory names if !isdirectory(one_file) continue endif - call s:Tlist_Process_Dir(one_file, a:pat) + echon "\r " + echon "\rProcessing files in directory " . fnamemodify(one_file, ':t') + let fcnt = fcnt + s:Tlist_Process_Dir(one_file, a:pat) endwhile + + return fcnt endfunction " Tlist_Add_Files_Recursive @@ -2489,12 +2559,10 @@ function! s:Tlist_Add_Files_Recursive(dir, ...) endif echon "\r " - echon "\rProcessing files in directory " . fnamemodify(dir_name, ':p') + echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t') + let fcnt = s:Tlist_Process_Dir(dir_name, pat) - call s:Tlist_Process_Dir(dir_name, pat) - - " Clear the displayed informational messages - echon "\r " + echon "\rAdded " . fcnt . " files to the taglist" endfunction " Tlist_Add_Files @@ -2514,33 +2582,8 @@ function! s:Tlist_Add_Files(...) return endif - " Enable lazy screen updates - let old_lazyredraw = &lazyredraw - set lazyredraw - - " Process one file at a time - while flist != '' - let one_file = strpart(flist, 0, stridx(flist, "\n")) - - let flist = strpart(flist, stridx(flist, "\n") + 1) - - if one_file == '' - continue - endif - - let ftype = s:Tlist_Get_Filetype(one_file) - - echon "\r " - echon "\rProcessing tags for " . fnamemodify(one_file, ':p:t') - - silent call Tlist_Update_File(one_file, ftype) - endwhile - - " Clear the displayed informational messages - echon "\r " - - " Restore the previous state - let &lazyredraw = old_lazyredraw + let fcnt = s:Tlist_Process_Filelist(flist) + echon "\rAdded " . fcnt . " files to the taglist" endfunction " Tlist_Extract_Tagtype @@ -2657,7 +2700,7 @@ function! s:Tlist_Refresh() let save_winnr = winnr() " Goto the taglist window - call s:Tlist_Goto_Window() + call s:Tlist_Window_Goto_Window() if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter " Save the cursor position @@ -2683,7 +2726,7 @@ function! s:Tlist_Refresh() endif " Highlight the current tag - call s:Tlist_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) + call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) else " Restore the cursor position if v:version >= 601 @@ -2719,7 +2762,7 @@ function! s:Tlist_Change_Sort(caller, action, sort_type) call s:Tlist_Log_Msg('Tlist_Change_Sort (caller = ' . a:caller . \ ', action = ' . a:action . ', sort_type = ' . a:sort_type . ')') if a:caller == 1 - let fidx = s:Tlist_Get_File_Index_By_Linenum(line('.')) + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) if fidx == -1 return endif @@ -2790,7 +2833,7 @@ endfunction " Update the tags displayed in the taglist window function! s:Tlist_Window_Update_File() call s:Tlist_Log_Msg('Tlist_Window_Update_File()') - let fidx = s:Tlist_Get_File_Index_By_Linenum(line('.')) + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) if fidx == -1 return endif @@ -2811,9 +2854,9 @@ function! s:Tlist_Window_Update_File() call search(curline, 'w') endfunction -" Tlist_Get_Tag_Type_By_Linenum() +" Tlist_Window_Get_Tag_Type_By_Linenum() " Return the tag type index for the specified line in the taglist window -function! s:Tlist_Get_Tag_Type_By_Linenum(fidx, lnum) +function! s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) let ftype = s:tlist_{a:fidx}_filetype " Determine to which tag type the current line number belongs to using the @@ -2838,10 +2881,10 @@ function! s:Tlist_Get_Tag_Type_By_Linenum(fidx, lnum) return ttype endfunction -" Tlist_Get_Tag_Index() -" Return the tag index for the specified line -function! s:Tlist_Get_Tag_Index(fidx, lnum) - let ttype = s:Tlist_Get_Tag_Type_By_Linenum(a:fidx, a:lnum) +" Tlist_Window_Get_Tag_Index() +" Return the tag index for the specified line in the taglist window +function! s:Tlist_Window_Get_Tag_Index(fidx, lnum) + let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(a:fidx, a:lnum) " Current line doesn't belong to any of the displayed tag types if ttype == '' @@ -2875,11 +2918,11 @@ function! s:Tlist_Window_Highlight_Line() exe 'match TagListTagName ' . pat endfunction -" Tlist_Open_File +" Tlist_Window_Open_File " Open the specified file in either a new window or an existing window " and place the cursor at the specified tag pattern -function! s:Tlist_Open_File(win_ctrl, filename, tagpat) - call s:Tlist_Log_Msg('Tlist_Open_File (' . a:filename . ')') +function! s:Tlist_Window_Open_File(win_ctrl, filename, tagpat) + call s:Tlist_Log_Msg('Tlist_Window_Open_File (' . a:filename . ')') let prev_Tlist_Skip_Refresh = s:Tlist_Skip_Refresh let s:Tlist_Skip_Refresh = 1 @@ -2999,7 +3042,7 @@ function! s:Tlist_Open_File(win_ctrl, filename, tagpat) " If the user has selected to close the taglist window, when a " tag is selected, close the taglist window if g:Tlist_Close_On_Select - call s:Tlist_Goto_Window() + call s:Tlist_Window_Goto_Window() close " Go back to the window displaying the selected file @@ -3013,13 +3056,13 @@ function! s:Tlist_Open_File(win_ctrl, filename, tagpat) let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh endfunction -" Tlist_Jump_To_Tag() +" Tlist_Window_Jump_To_Tag() " Jump to the location of the current tag " win_ctrl == 0 - Reuse the existing file window " win_ctrl == 1 - Open a new window " win_ctrl == 2 - Preview the tag -function! s:Tlist_Jump_To_Tag(win_ctrl) - call s:Tlist_Log_Msg('Tlist_Jump_To_Tag()') +function! s:Tlist_Window_Jump_To_Tag(win_ctrl) + call s:Tlist_Log_Msg('Tlist_Window_Jump_To_Tag()') " Do not process comment lines and empty lines let curline = getline('.') if curline =~ '^\s*$' || curline[0] == '"' @@ -3037,13 +3080,13 @@ function! s:Tlist_Jump_To_Tag(win_ctrl) .foldopen! endif - let fidx = s:Tlist_Get_File_Index_By_Linenum(lnum) + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) if fidx == -1 return endif " Get the tag output for the current tag - let tidx = s:Tlist_Get_Tag_Index(fidx, lnum) + let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) if tidx != 0 let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx) @@ -3054,13 +3097,13 @@ function! s:Tlist_Jump_To_Tag(win_ctrl) let tagpat = '' endif - call s:Tlist_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) + call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) endfunction -" Tlist_Show_Info() +" Tlist_Window_Show_Info() " Display information about the entry under the cursor -function! s:Tlist_Show_Info() - call s:Tlist_Log_Msg('Tlist_Show_Info()') +function! s:Tlist_Window_Show_Info() + call s:Tlist_Log_Msg('Tlist_Window_Show_Info()') " Clear the previously displayed line echo @@ -3079,7 +3122,7 @@ function! s:Tlist_Show_Info() let lnum = line('.') " Get the file index - let fidx = s:Tlist_Get_File_Index_By_Linenum(lnum) + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) if fidx == -1 return endif @@ -3096,10 +3139,10 @@ function! s:Tlist_Show_Info() endif " Get the tag output line for the current tag - let tidx = s:Tlist_Get_Tag_Index(fidx, lnum) + let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) if tidx == 0 " Cursor is on a tag type - let ttype = s:Tlist_Get_Tag_Type_By_Linenum(fidx, lnum) + let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) if ttype == '' return endif @@ -3193,12 +3236,12 @@ function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum) return left endfunction -" Tlist_Highlight_Tag() +" Tlist_Window_Highlight_Tag() " Highlight the current tag " cntx == 1, Called by the taglist plugin itself " cntx == 2, Forced by the user through the TlistHighlightTag command " center = 1, move the tag line to the center of the taglist window -function! s:Tlist_Highlight_Tag(filename, cur_lnum, cntx, center) +function! s:Tlist_Window_Highlight_Tag(filename, cur_lnum, cntx, center) " Highlight the current tag only if the user configured the " taglist plugin to do so or if the user explictly invoked the " command to highlight the current tag. @@ -3418,12 +3461,12 @@ function! Tlist_Get_Tagname_By_Line(...) return s:tlist_{fidx}_{tidx}_tag_name endfunction -" Tlist_Move_To_File +" Tlist_Window_Move_To_File " Move the cursor to the beginning of the current file or the next file " or the previous file in the taglist window " dir == -1, move to start of current or previous function " dir == 1, move to start of next function -function! s:Tlist_Move_To_File(dir) +function! s:Tlist_Window_Move_To_File(dir) if foldlevel('.') == 0 " Cursor is on a non-folded line (it is not in any of the files) " Move it to a folded line @@ -3437,7 +3480,7 @@ function! s:Tlist_Move_To_File(dir) endif endif - let fidx = s:Tlist_Get_File_Index_By_Linenum(line('.')) + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) if fidx == -1 return endif @@ -3451,24 +3494,25 @@ function! s:Tlist_Move_To_File(dir) return endif - if fidx == 0 - " At the first file, can't move to previous file - return + if fidx != 0 + " Move to the beginning of the previous file + let fidx = fidx - 1 + else + " Cursor is at the first file, wrap around to the last file + let fidx = s:tlist_file_count - 1 endif - " Otherwise, move to the beginning of the previous file - let fidx = fidx - 1 exe s:tlist_{fidx}_start return else + " Move to the beginning of the next file let fidx = fidx + 1 - if fidx == s:tlist_file_count - " At the last file, can't move to the next file - return + if fidx >= s:tlist_file_count + " Cursor is at the last file, wrap around to the first file + let fidx = 0 endif - " Otherwise, move to the beginning of the next file if s:tlist_{fidx}_start != 0 exe s:tlist_{fidx}_start endif @@ -3595,7 +3639,7 @@ function! s:Tlist_Session_Load(...) let save_winnr = winnr() " Goto the taglist window - call s:Tlist_Goto_Window() + call s:Tlist_Window_Goto_Window() " Refresh the taglist window call s:Tlist_Window_Refresh() @@ -3698,7 +3742,7 @@ function! s:Tlist_Session_Save(...) endfunction " Tlist_Buffer_Removed -" A buffer is wiped out from the Vim buffer list. Remove the tags defined +" A buffer is removed from the Vim buffer list. Remove the tags defined " for that file function! s:Tlist_Buffer_Removed(filename) call s:Tlist_Log_Msg('Tlist_Buffer_Removed (' . a:filename . ')') @@ -3722,10 +3766,10 @@ endfunction " When a buffer is deleted, remove the file from the taglist autocmd BufDelete * silent call s:Tlist_Buffer_Removed(expand(':p')) -" Tlist_Close_File_Fold +" Tlist_Window_Close_File_Fold " Close the fold for the specified file -function! s:Tlist_Close_File_Fold(filename) - call s:Tlist_Log_Msg('Tlist_Close_File_Fold (' . a:filename . ')') +function! s:Tlist_Window_Close_File_Fold(filename) + call s:Tlist_Log_Msg('Tlist_Window_Close_File_Fold (' . a:filename . ')') " Make sure a valid filename is supplied if a:filename == '' return @@ -3775,11 +3819,11 @@ function! s:Tlist_Close_File_Fold(filename) endif endfunction -" Tlist_Auto_Open_Check +" Tlist_Window_Check_Auto_Open " Open the taglist window automatically on Vim startup. " Open the window only when files present in any of the Vim windows support " tags. -function! s:Tlist_Check_Auto_Open() +function! s:Tlist_Window_Check_Auto_Open() let open = 0 let i = 1 @@ -3799,7 +3843,7 @@ function! s:Tlist_Check_Auto_Open() endif endfunction -function! s:Tlist_Add_Base_Menu() +function! s:Tlist_Menu_Add_Base_Menu() call s:Tlist_Log_Msg('Adding the base menu') " Add the menu @@ -3826,14 +3870,20 @@ let s:menu_char_prefix = " Tlist_Menu_Get_Tag_Type_Cmd " Get the menu command for the specified tag type -function! s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, ttype_idx) +" fidx - File type index +" ftype - File Type +" add_ttype_name - To add or not to add the tag type name to the menu entries +" ttype_idx - Tag type index +function! s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, ttype_idx) " Curly brace variable name optimization let ftype_ttype_idx = a:ftype . '_' . a:ttype_idx let ttype = s:tlist_{ftype_ttype_idx}_name - " If the tag type name contains space characters, escape it. This - " will be used to create the menu entries. - let ttype_fullname = escape(s:tlist_{ftype_ttype_idx}_fullname, ' ') + if a:add_ttype_name + " If the tag type name contains space characters, escape it. This + " will be used to create the menu entries. + let ttype_fullname = escape(s:tlist_{ftype_ttype_idx}_fullname, ' ') + endif " Curly brace variable name optimization let fidx_ttype = a:fidx . '_' . ttype @@ -3871,9 +3921,11 @@ function! s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, ttype_idx) let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length) " Form the menu command prefix - let m_prefix = 'anoremenu T\&ags.' . - \ ttype_fullname . '.' . - \ first_tag . '\.\.\.' . last_tag . '.' + let m_prefix = 'anoremenu T\&ags.' + if a:add_ttype_name + let m_prefix = m_prefix . ttype_fullname . '.' + endif + let m_prefix = m_prefix . first_tag . '\.\.\.' . last_tag . '.' " Character prefix used to number the menu items (hotkey) let m_prefix_idx = 0 @@ -3896,7 +3948,10 @@ function! s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, ttype_idx) " Character prefix used to number the menu items (hotkey) let m_prefix_idx = 0 - let m_prefix = 'anoremenu T\&ags.' . ttype_fullname . '.' + let m_prefix = 'anoremenu T\&ags.' + if a:add_ttype_name + let m_prefix = m_prefix . ttype_fullname . '.' + endif let j = 1 while j <= tcnt let tidx = s:tlist_{fidx_ttype}_{j} @@ -3999,10 +4054,23 @@ function! s:Tlist_Menu_Update_File(clear_menu) let cmd = '' + " Determine whether the tag type name needs to be added to the menu + " If more than one tag type is present in the taglisting for a file, + " then the tag type name needs to be present + let add_ttype_name = -1 + let i = 1 + while i <= s:tlist_{ftype}_count && add_ttype_name < 1 + let ttype = s:tlist_{ftype}_{i}_name + if s:tlist_{fidx}_{ttype}_count + let add_ttype_name = add_ttype_name + 1 + endif + let i = i + 1 + endwhile + " Process the tags by the tag type and get the menu command let i = 1 while i <= s:tlist_{ftype}_count - let mcmd = s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, i) + let mcmd = s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, i) if mcmd != '' let cmd = cmd . mcmd endif @@ -4040,7 +4108,7 @@ function! s:Tlist_Menu_Remove_File() silent! unmenu! PopUp.T&ags endif - call s:Tlist_Add_Base_Menu() + call s:Tlist_Menu_Add_Base_Menu() " Remove the dummy menu item unmenu T&ags.Dummy @@ -4093,7 +4161,7 @@ endfunction " Tlist_Menu_Init " Initialize the taglist menu function! s:Tlist_Menu_Init() - call s:Tlist_Add_Base_Menu() + call s:Tlist_Menu_Add_Base_Menu() " Automatically add the tags defined in the current file to the menu augroup TagListMenuCmds