From d6a611f70aebfb30974e4c3d8c16de5d8b3c46a2 Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Thu, 22 Feb 2007 00:00:00 +0000 Subject: [PATCH] Version 4.3 1. Added support for jumping to a tag/file in a new or existing tab from the taglist window (works only with Vim7 and above). 2. Added support for opening a tag in the previous window. 3. With the Tlist_File_Fold_Auto_Close variable set, when opening a file from the file explorer window, the folds in the taglist window are not closed correctly. Fixed this problem. --- doc/taglist.txt | 263 +++++++++++++++++++++++++++++---------------- plugin/taglist.vim | 158 ++++++++++++++++++++------- 2 files changed, 289 insertions(+), 132 deletions(-) diff --git a/doc/taglist.txt b/doc/taglist.txt index de38aac..c220f02 100644 --- a/doc/taglist.txt +++ b/doc/taglist.txt @@ -2,7 +2,7 @@ Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) For Vim version 6.0 and above -Last change: 2006 November 14 +Last change: 2007 February 18 1. Overview |taglist-intro| 2. Taglist on the internet |taglist-internet| @@ -14,7 +14,8 @@ Last change: 2006 November 14 8. Global functions |taglist-functions| 9. Extending |taglist-extend| 10. FAQ |taglist-faq| -11. Todo |taglist-todo| +11. License |taglist-license| +12. Todo |taglist-todo| ============================================================================== *taglist-intro* @@ -75,17 +76,20 @@ for subscribing to the mailing list: *taglist-requirements* 3. Requirements~ +The taglist plugin requires the following: + + * Vim version 6.0 and above + * Exuberant ctags 5.0 and above + The taglist plugin will work on all the platforms where the exuberant ctags utility and Vim are supported (this includes MS-Windows and Unix based systems). -The taglist plugin will work with Vim version 6.0 and above. - The taglist plugin relies on the exuberant ctags utility to dynamically generate the tag listing. The exuberant ctags utility must be installed in -your system to use this plugin. You should use exuberant ctags version 5.0 and -above. The exuberant ctags utility is shipped with most of the Linux -distributions. You can download the exuberant ctags utility from +your system to use this plugin. The exuberant ctags utility is shipped with +most of the Linux distributions. You can download the exuberant ctags utility +from > http://ctags.sourceforge.net < @@ -118,8 +122,8 @@ Vim without the system() function for security reasons. plugin/taglist.vim - main taglist plugin file doc/taglist.txt - documentation (help) file - Refer to the |add-plugin|, |add-global-plugin| and |'runtimepath'| Vim - help pages for more details about installing Vim plugins. + Refer to the |add-plugin|and |'runtimepath'| Vim help pages for more + details about installing Vim plugins. 2. Change to the $HOME/.vim/doc or $HOME/vimfiles/doc or $VIM/vimfiles/doc directory, start Vim and run the ":helptags ." command to process the taglist help file. Without this step, you cannot jump to the taglist help @@ -137,7 +141,7 @@ Vim without the system() function for security reasons. about using the taglist plugin. To uninstall the taglist plugin, remove the plugin/taglist.vim and -doc/taglist.txt files. +doc/taglist.txt files from the $HOME/.vim or $HOME/vimfiles directory. ============================================================================== *taglist-using* @@ -145,13 +149,13 @@ doc/taglist.txt files. The taglist plugin can be used in several different ways. -1. You can open the taglist window and keep it open. On opening the taglist - window, the tags defined in all the files in the Vim buffer list will be - displayed in the taglist window. As you edit files, the tags defined in - them will be added to the taglist window. You can select a tag from the - taglist window and jump to it. The current tag will be highlighted in the - taglist window. You can close the taglist window when you no longer need - the window. +1. You can keep the taglist window open during the entire editing session. On + opening the taglist window, the tags defined in all the files in the Vim + buffer list will be displayed in the taglist window. As you edit files, the + tags defined in them will be added to the taglist window. You can select a + tag from the taglist window and jump to it. The current tag will be + highlighted in the taglist window. You can close the taglist window when + you no longer need the window. 2. You can configure the taglist plugin to process the tags defined in all the edited files always. In this configuration, even if the taglist window is closed and the taglist menu is not displayed, the taglist plugin will @@ -161,12 +165,12 @@ The taglist plugin can be used in several different ways. 3. You can configure the taglist plugin to display only the tags defined in the current file in the taglist window. By default, the taglist plugin displays the tags defined in all the files in the Vim buffer list. As you - switch between files, the taglist window will be refreshed to display the - tags defined only in the current file. -4. You can use the Tags pull-down and popup menu created by the taglist plugin - to display the tags defined in the current file and select a tag to jump to - it. You can use the menu without opening the taglist window. By default, - the Tags menu is disabled. + switch between files, the taglist window will be refreshed to display only + the tags defined in the current file. +4. In GUI Vim, you can use the Tags pull-down and popup menu created by the + taglist plugin to display the tags defined in the current file and select a + tag to jump to it. You can use the menu without opening the taglist window. + By default, the Tags menu is disabled. 5. You can configure the taglist plugin to display the name of the current tag in the Vim window status line or in the Vim window title bar. For this to work without the taglist window or menu, you need to configure the taglist @@ -189,11 +193,13 @@ creates a normal mode mapping for the key to toggle the taglist window. > nnoremap :TlistToggle < -Add the above mapping to your ~/.vimrc file. +Add the above mapping to your ~/.vimrc or $HOME/_vimrc file. To automatically open the taglist window on Vim startup, set the -'Tlist_Auto_Open' variable to 1. You can also open the taglist window on -startup using the following command line: +'Tlist_Auto_Open' variable to 1. + +You can also open the taglist window on startup using the following command +line: > $ vim +TlistOpen < @@ -211,12 +217,27 @@ taglist window is present, set the 'Tlist_Exit_OnlyWindow' variable to 1. Jumping to a tag or a file~ You can select a tag in the taglist window either by pressing the key or by double clicking the tag name using the mouse. To jump to a tag on a -single mouse click set the 'Tlist_Use_SingleClick' variable to 1. To jump to -the tag in a new window, press the 'o' key. You can press the 'p' key to jump -to the tag but still keep the cursor in the taglist window itself (preview). +single mouse click set the 'Tlist_Use_SingleClick' variable to 1. -You can open a file by pressing the key or by double clicking the file -name using the mouse. +If the selected file is already opened in a window, then the cursor is moved +to that window. If the file is not currently opened in a window then the file +is opened in the window used by the taglist plugin to show the previously +selected file. If there are no usable windows, then the file is opened in a +new window. The file is not opened in special windows like the quickfix +window, preview window and windows containing buffer with the 'buftype' option +set. + +To jump to the tag in a new window, press the 'o' key. To open the file in the +previous window (Ctrl-W_p) use the 'P' key. You can press the 'p' key to jump +to the tag but still keep the cursor in the taglist window (preview). + +To open the selected file in a tab, use the 't' key. If the file is already +present in a tab then the cursor is moved to that tab otherwise the file is +opened in a new tab. To jump to a tag in a new tab press Ctrl-t. The taglist +window is automatically opened in the newly created tab. + +Instead of jumping to a tag, you can open a file by pressing the key +or by double clicking the file 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 @@ -289,8 +310,8 @@ Vim session. To again display the tags for the file, open the file in a Vim window and then use the ":TlistUpdate" command or use ":TlistAddFiles" command to add the file to the taglist. -When a buffer is removed from the Vim buffer list using the ":bdelete" or -the ":bwipe" command, the taglist is updated to remove the stored information +When a buffer is removed from the Vim buffer list using the ":bdelete" or the +":bwipeout" command, the taglist is updated to remove the stored information for this buffer. Updating the tags displayed for a file~ @@ -337,8 +358,9 @@ option is 4 seconds. You can get the name and prototype of a tag without opening the taglist window and the taglist menu using the ":TlistShowTag" and the ":TlistShowPrototype" -commands. To use these commands without the taglist window, set the -'Tlist_Process_File_Always' variable to 1. +commands. These commands will work only if the current file is already present +in the taglist. To use these commands without opening the taglist window, set +the 'Tlist_Process_File_Always' variable to 1. You can use the ":TlistShowTag" command to display the name of the tag at or before the specified line number in the specified file. If the file name and @@ -361,10 +383,11 @@ prototype is displayed in a balloon. This works only in GUI versions where balloon evaluation is supported. Taglist window contents~ -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 taglist window contains the tags defined in various files in the taglist +grouped by the filename and by the tag 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 |'filetype'| for the taglist buffer is set to 'taglist'. The Vim @@ -465,11 +488,13 @@ various entities in the taglist window: TagListFileName - Used for filenames By default, these highlight groups are linked to the standard Vim highlight -groups. If you want to change the colors used for these highlight groups, you -can define them in your .vimrc or .gvimrc files. For example, to change the -highlighting used for tag names, you can use: +groups. If you want to change the colors used for these highlight groups, +prefix the highlight group name with 'My' and define it in your .vimrc or +.gvimrc file: MyTagListTagName, MyTagListTagScope, MyTagListTitle, +MyTagListComment and MyTagListFileName. For example, to change the colors +used for tag names, you can use the following command: > - :highlight TagListTagName guifg=DarkGreen ctermfg=DarkGreen + :highlight MyTagListTagName guifg=blue ctermfg=blue < Controlling the taglist window~ To use a horizontally split taglist window, instead of a vertically split @@ -510,8 +535,12 @@ in the taglist window. defined. o Jump to the location where the tag under cursor is defined in a new window. + P Jump to the tag in the previous (Ctrl-W_p) window. p Display the tag definition in the file window and keep the cursor in the taglist window itself. + t Jump to the tag in a new tab. If the file is already + opened in a tab, move to that tab. + Ctrl-t Jump to the tag in a new tab. Display the prototype of the tag under the cursor. For file names, display the full path to the file, file type and the number of tags. For tag types, display the @@ -548,7 +577,9 @@ When you switch between files/buffers, the taglist menu is automatically updated to display the tags defined in the current file/buffer. The tags are grouped by their type (variables, functions, classes, methods, -etc.) and displayed as a separate sub-menu for each type. +etc.) and displayed as a separate sub-menu for each type. If all the tags +defined in a file are of the same type (e.g. functions), then the sub-menu is +not used. If the number of items in a tag type submenu exceeds the value specified by the 'Tlist_Max_Submenu_Items' variable, then the submenu will be split into @@ -655,14 +686,14 @@ description of these variables refer to the text below this table. Tlist_Auto_Highlight_Tag~ The taglist plugin will automatically highlight the current tag in the taglist window. If you want to disable this, then you can set the -Tlist_Auto_Highlight_Tag variable to zero. Note that even though the current +'Tlist_Auto_Highlight_Tag' variable to zero. Note that even though the current tag highlighting is disabled, the tags for a new file will still be added to the taglist window. > let Tlist_Auto_Highlight_Tag = 0 < -You can still use the ":TlistHighlightTag" command to highlight the current -tag. +With the above variable set to 1, you can use the ":TlistHighlightTag" command +to highlight the current tag. *'Tlist_Auto_Open'* Tlist_Auto_Open~ @@ -685,12 +716,15 @@ to 1. > let Tlist_Auto_Update = 0 < +With the above variable set to 1, you can use the ":TlistUpdate" command to +add the tags defined in the current file to the taglist. + *'Tlist_Close_On_Select'* Tlist_Close_On_Select~ If you want to close the taglist window when a file or tag is selected, then set the 'Tlist_Close_On_Select' variable to 1. By default, this variable is set zero and when you select a tag or file from the taglist window, the window -will not be closed. +is not closed. > let Tlist_Close_On_Select = 1 < @@ -721,7 +755,7 @@ the ctags utility in your system. Note that this variable should point to the fully qualified exuberant ctags location and NOT to the directory in which exuberant ctags is installed. If the exuberant ctags tool is not found in either PATH or in the specified location, then the taglist plugin will not be -loaded. +loaded. Examples: > let Tlist_Ctags_Cmd = 'd:\tools\ctags.exe' let Tlist_Ctags_Cmd = '/usr/local/bin/ctags' @@ -767,9 +801,9 @@ Tlist_File_Fold_Auto_Close~ By default, the tags tree displayed in the taglist window for all the files is opened. You can close/fold the tags tree for the files manually. To automatically close the tags tree for inactive files, you can set the -Tlist_File_Fold_Auto_Close variable to 1. When this variable is set to 1, the -tags tree for the current buffer is automatically opened and for all the -buffers is closed. +'Tlist_File_Fold_Auto_Close' variable to 1. When this variable is set to 1, +the tags tree for the current buffer is automatically opened and for all the +other buffers is closed. > let Tlist_File_Fold_Auto_Close = 1 < @@ -798,10 +832,10 @@ this variable is 1. *'Tlist_Inc_Winwidth'* Tlist_Inc_Winwidth~ By default, when the width of the window is less than 100 and a new taglist -window is opened vertically, then the window width will be increased by the -value set in the 'Tlist_WinWidth' variable to accommodate the new window. The -value of this variable is used only if you are using a vertically split -taglist window. +window is opened vertically, then the window width is increased by the value +set in the 'Tlist_WinWidth' variable to accommodate the new window. The value +of this variable is used only if you are using a vertically split taglist +window. If your terminal doesn't support changing the window width from Vim (older version of xterm running in a Unix system) or if you see any weird problems in @@ -1166,52 +1200,64 @@ C++, C#, Cobol, Eiffel, Erlang, Fortran, HTML, Java, Javascript, Lisp, Lua, Make, Pascal, Perl, PHP, Python, Rexx, Ruby, Scheme, Shell, Slang, SML, Sql, TCL, Verilog, Vim and Yacc. -You can modify the taglist plugin support for the above listed languages. You -can also extend the taglist plugin to add support for new languages. +You can extend the taglist plugin to add support for new languages and also +modify the support for the above listed languages. -If you want to add support for a new language to the taglist plugin, you need -to first extend the exuberant ctags tool. For more information about extending -exuberant ctags, visit http://ctags.sourceforge.net/EXTENDING.html +You should NOT make modifications to the taglist plugin script file to add +support for new languages. You will lose these changes when you upgrade to the +next version of the taglist plugin. Instead you should follow the below +described instructions to extend the taglist plugin. -You can extend the taglist plugin to add support for new languages or modify -the support for an already supported language by setting the following -variables in the .vimrc file. +You can extend the taglist plugin by setting variables in the .vimrc or _vimrc +file. The name of these variables depends on the language name and is +described below. +Modifying support for an existing language~ To modify the support for an already supported language, you have to set the -tlist_xxx_settings variable. Replace xxx with the Vim filetype name. To -determine the filetype name used by Vim for a file, use the following command -in the buffer containing the file: > +tlist_xxx_settings variable in the ~/.vimrc or $HOME/_vimrc file. Replace xxx +with the Vim filetype name for the language file. For example, to modify the +support for the perl language files, you have to set the tlist_perl_settings +variable. To modify the support for java files, you have to set the +tlist_java_settings variable. + +To determine the filetype name used by Vim for a file, use the following +command in the buffer containing the file: :set filetype -< -For example, to modify the support for the perl language files, you have to -set the tlist_perl_settings variable. + +The above command will display the Vim filetype for the current buffer. The format of the value set in the tlist_xxx_settings variable is -> - ;flag1:name1;flag2:name2;flag3:name3 -< + + ;flag1:name1;flag2:name2;flag3:name3 + The different fields in the value are separated by the ';' character. The first field 'language_name' is the name used by exuberant ctags to refer -to this language files. This name can be different from the file type name -used by Vim. For example, for C++, the language name used by ctags is 'c++' -but the filetype name used by Vim is 'cpp'. +to this language file. This name can be different from the file type name used +by Vim. For example, for C++, the language name used by ctags is 'c++' but the +filetype name used by Vim is 'cpp'. To get the list of language names +supported by exuberant ctags, use the following command: + + $ ctags --list-maps=all The remaining fields follow the format "flag:name". The sub-field 'flag' is the language specific flag used by exuberant ctags to generate the corresponding tags. For example, for the C language, to list only the -functions, the 'f' flag is used. For more information about the flags -supported by exuberant ctags for a particular language, read the help text -from the 'ctags --help' command. The sub-field 'name' specifies the title text -to use for displaying the tags of a particular type. For example, 'name' can -be set to 'functions'. This field can be set to any text string name. +functions, the 'f' flag is used. To get the list of flags supported by +exuberant ctags for the various languages use the following command: + + $ ctags --list-kinds=all + +The sub-field 'name' specifies the title text to use for displaying the tags +of a particular type. For example, 'name' can be set to 'functions'. This +field can be set to any text string name. + +For example, to list only the classes and functions defined in a C++ language +file, add the following line to your .vimrc file: -For example, to list only the classes and functions defined in a C++ -language file, add the following lines to your .vimrc file -> let tlist_cpp_settings = 'c++;c:class;f:function' -< + In the above setting, 'cpp' is the Vim filetype name and 'c++' is the name used by the exuberant ctags tool. 'c' and 'f' are the flags passed to exuberant ctags to list C++ classes and functions and 'class' is the title @@ -1220,23 +1266,32 @@ in the taglist window. For example, to display only functions defined in a C file and to use "My Functions" as the title for the function tags, use -> + let tlist_c_settings = 'c;f:My Functions' -< + When you set the tlist_xxx_settings variable, you will override the default setting used by the taglist plugin for the 'xxx' language. You cannot add to -the default options used by the taglist plugin for a particular file type. +the default options used by the taglist plugin for a particular file type. To +add to the options used by the taglist plugin for a language, copy the option +values from the taglist plugin file to your .vimrc file and modify it. -To add support for a new language, set the tlist_xxx_settings variable -appropriately as described above. Replace 'xxx' in the variable name with the -Vim filetype name for the new language. +Adding support for a new language~ +If you want to add support for a new language to the taglist plugin, you need +to first extend the exuberant ctags tool. For more information about extending +exuberant ctags, visit the following page: + + http://ctags.sourceforge.net/EXTENDING.html + +To add support for a new language, set the tlist_xxx_settings variable in the +~/.vimrc file appropriately as described above. Replace 'xxx' in the variable +name with the Vim filetype name for the new language. For example, to extend the taglist plugin to support the latex language, you can use the following line (assuming, you have already extended exuberant -ctags to support the latex language): > +ctags to support the latex language): let tlist_tex_settings='latex;b:bibitem;c:command;l:label' -< + With the above line, when you edit files of filetype "tex" in Vim, the taglist plugin will invoke the exuberant ctags tool passing the "latex" filetype and the flags b, c and l to generate the tags. The text heading 'bibitem', @@ -1262,6 +1317,16 @@ A. Are you using Vim version 6.0 and above? The taglist plugin relies on the > $ ctags --version < + Is exuberant ctags present in one of the directories in your PATH? If not, + you need to set the Tlist_Ctags_Cmd variable to point to the location of + exuberant ctags. Use the following Vim command to verify that this is setup + correctly: +> + :echo system(Tlist_Ctags_Cmd . ' --version') +< + The above command should display the version information for exuberant + ctags. + Did you turn on the Vim filetype detection? The taglist plugin relies on the filetype detected by Vim and passes the filetype to the exuberant ctags utility to parse the tags. Check the output of the following Vim command: @@ -1399,9 +1464,19 @@ A. The taglist plugin uses the |CursorHold| autocmd to highlight the current the current buffer. The workaround for this problem is to not set the |'updatetime'| option to a low value. +============================================================================== + *taglist-license* +11. License~ +Permission is hereby granted to use and distribute the taglist plugin, with or +without modifications, provided that this copyright notice is copied with it. +Like anything else that's free, taglist.vim is provided *as is* and comes with +no warranty of any kind, either expressed or implied. In no event will the +copyright holder be liable for any damamges resulting from the use of this +software. + ============================================================================== *taglist-todo* -11. Todo~ +12. Todo~ 1. Group tags according to the scope and display them. For example, group all the tags belonging to a C++/Java class diff --git a/plugin/taglist.vim b/plugin/taglist.vim index 5a80a1c..eae10dc 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.2 -" Last Modified: November 14, 2006 +" Version: 4.3 +" Last Modified: February 18, 2007 " Copyright: Copyright (C) 2002-2006 Yegappan Lakshmanan " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright @@ -41,7 +41,7 @@ " Refer to the 'add-plugin', 'add-global-plugin' and 'runtimepath' " Vim help pages for more details about installing Vim plugins. " 2. Change to the $HOME/.vim/doc or $HOME/vimfiles/doc or -" $VIM/doc/vimfiles directory, start Vim and run the ":helptags ." +" $VIM/vimfiles/doc directory, start Vim and run the ":helptags ." " command to process the taglist help file. " 3. If the exuberant ctags utility is not present in your PATH, then set the " Tlist_Ctags_Cmd variable to point to the location of the exuberant ctags @@ -638,13 +638,8 @@ function! s:Tlist_Debug_Disable(...) endfunction " Tlist_Debug_Show -" Display the taglist debug message in a new window +" Display the taglist debug messages in a new window function! s:Tlist_Debug_Show() - if s:tlist_debug == 0 - call s:Tlist_Warning_Msg('Taglist: Debug is disabled') - return - endif - if s:tlist_msg == '' call s:Tlist_Warning_Msg('Taglist: No debug messages') return @@ -1551,10 +1546,22 @@ function! s:Tlist_Window_Init() set cpoptions&vim " Create buffer local mappings for jumping to the tags and sorting the list - 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 + \ :call Tlist_Window_Jump_To_Tag('useopen') + nnoremap o + \ :call Tlist_Window_Jump_To_Tag('newwin') + nnoremap p + \ :call Tlist_Window_Jump_To_Tag('preview') + nnoremap P + \ :call Tlist_Window_Jump_To_Tag('prevwin') + if v:version >= 700 + nnoremap t + \ :call Tlist_Window_Jump_To_Tag('checktab') + nnoremap + \ :call Tlist_Window_Jump_To_Tag('newtab') + endif + nnoremap <2-LeftMouse> + \ :call Tlist_Window_Jump_To_Tag('useopen') nnoremap s \ :call Tlist_Change_Sort('cmd', 'toggle', '') nnoremap + :silent! foldopen @@ -1576,13 +1583,25 @@ function! s:Tlist_Window_Init() nnoremap q :close " Insert mode mappings - inoremap :call Tlist_Window_Jump_To_Tag(0) + inoremap + \ :call Tlist_Window_Jump_To_Tag('useopen') " Windows needs return - 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_Window_Jump_To_Tag(0) + inoremap + \ :call Tlist_Window_Jump_To_Tag('useopen') + inoremap o + \ :call Tlist_Window_Jump_To_Tag('newwin') + inoremap p + \ :call Tlist_Window_Jump_To_Tag('preview') + inoremap P + \ :call Tlist_Window_Jump_To_Tag('prevwin') + if v:version >= 700 + inoremap t + \ :call Tlist_Window_Jump_To_Tag('checktab') + inoremap + \ :call Tlist_Window_Jump_To_Tag('newtab') + endif + inoremap <2-LeftMouse> + \ :call Tlist_Window_Jump_To_Tag('useopen') inoremap s \ :call Tlist_Change_Sort('cmd', 'toggle', '') inoremap + :silent! foldopen @@ -1613,7 +1632,8 @@ 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_Window_Jump_To_Tag(0) endif ' + \ 'call Tlist_Window_Jump_To_Tag("useopen") ' . + \ ' endif ' if maparg('', 'n') == '' " no mapping for leftmouse exe ':nnoremap ' . clickmap @@ -1642,7 +1662,7 @@ function! s:Tlist_Window_Init() " Close the fold for this buffer when leaving the buffer if g:Tlist_File_Fold_Auto_Close autocmd BufEnter * silent - \ call s:Tlist_Window_Open_File_Fold(expand(':p')) + \ call s:Tlist_Window_Open_File_Fold(expand('')) endif " Exit Vim itself if only the taglist window is present (optional) if g:Tlist_Exit_OnlyWindow @@ -3075,18 +3095,75 @@ endfunction " 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_Window_Open_File(win_ctrl, filename, tagpat) - call s:Tlist_Log_Msg('Tlist_Window_Open_File (' . a:filename . ')') + call s:Tlist_Log_Msg('Tlist_Window_Open_File (' . a:filename . ',' . + \ a:win_ctrl . ')') let prev_Tlist_Skip_Refresh = s:Tlist_Skip_Refresh let s:Tlist_Skip_Refresh = 1 if s:tlist_app_name == "winmanager" " Let the winmanager edit the file - call WinManagerFileEdit(a:filename, a:win_ctrl) + call WinManagerFileEdit(a:filename, a:win_ctrl == 'newwin') else + if a:win_ctrl == 'newtab' + " Create a new tab + exe 'tabnew ' . escape(a:filename, ' ') + " Open the taglist window in the new tab + call s:Tlist_Window_Open() + endif + + if a:win_ctrl == 'checktab' + " Check whether the file is present in any of the tabs. + " If the file is present in the current tab, then use the + " current tab. + if bufwinnr(a:filename) != -1 + let file_present_in_tab = 1 + let i = tabpagenr() + else + let i = 1 + let bnum = bufnr(a:filename) + let file_present_in_tab = 0 + while i <= tabpagenr('$') + if index(tabpagebuflist(i), bnum) != -1 + let file_present_in_tab = 1 + break + endif + let i += 1 + endwhile + endif + + if file_present_in_tab + " Goto the tab containing the file + exe 'tabnext ' . i + else + " Open a new tab + exe 'tabnew ' . escape(a:filename, ' ') + + " Open the taglist window + call s:Tlist_Window_Open() + endif + endif + + let winnum = -1 + if a:win_ctrl == 'prevwin' + " Open the file in the previous window, if it is usable + let cur_win = winnr() + wincmd p + if &buftype == '' && !&previewwindow + exe "edit " . escape(a:filename, ' ') + let winnum = winnr() + else + " Previous window is not usable + exe cur_win . 'wincmd w' + endif + endif + " Goto the window containing the file. If the window is not there, open a " new window - let winnum = bufwinnr(a:filename) + if winnum == -1 + let winnum = bufwinnr(a:filename) + endif + if winnum == -1 " Locate the previously used window for opening a file let fwin_num = 0 @@ -3121,7 +3198,7 @@ function! s:Tlist_Window_Open_File(win_ctrl, filename, tagpat) " If the user asked to jump to the tag in a new window, then split " the existing window into two. - if a:win_ctrl == 1 + if a:win_ctrl == 'newwin' split endif exe "edit " . escape(a:filename, ' ') @@ -3173,7 +3250,7 @@ function! s:Tlist_Window_Open_File(win_ctrl, filename, tagpat) " If the user asked to jump to the tag in a new window, then split the " existing window into two. - if a:win_ctrl == 1 + if a:win_ctrl == 'newwin' split endif endif @@ -3197,7 +3274,7 @@ function! s:Tlist_Window_Open_File(win_ctrl, filename, tagpat) " If the user selects to preview the tag then jump back to the " taglist window - if a:win_ctrl == 2 + if a:win_ctrl == 'preview' " Go back to the taglist window let winnum = bufwinnr(g:TagList_title) exe winnum . 'wincmd w' @@ -3221,11 +3298,13 @@ endfunction " 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 +" win_ctrl == useopen - Reuse the existing file window +" win_ctrl == newwin - Open a new window +" win_ctrl == preview - Preview the tag +" win_ctrl == prevwin - Open in previous window +" win_ctrl == newtab - Open in new tab function! s:Tlist_Window_Jump_To_Tag(win_ctrl) - call s:Tlist_Log_Msg('Tlist_Window_Jump_To_Tag()') + call s:Tlist_Log_Msg('Tlist_Window_Jump_To_Tag(' . a:win_ctrl . ')') " Do not process comment lines and empty lines let curline = getline('.') if curline =~ '^\s*$' || curline[0] == '"' @@ -3933,8 +4012,8 @@ autocmd BufDelete * silent call s:Tlist_Buffer_Removed(expand(':p')) " Tlist_Window_Open_File_Fold " Open the fold for the specified file and close the fold for all the " other files -function! s:Tlist_Window_Open_File_Fold(filename) - call s:Tlist_Log_Msg('Tlist_Window_Open_File_Fold (' . a:filename . ')') +function! s:Tlist_Window_Open_File_Fold(acmd_file) + call s:Tlist_Log_Msg('Tlist_Window_Open_File_Fold (' . a:acmd_file . ')') " Make sure the taglist window is present let winnum = bufwinnr(g:TagList_title) @@ -3965,11 +4044,14 @@ function! s:Tlist_Window_Open_File_Fold(filename) silent! %foldclose " Get tag list index of the specified file - let fidx = s:Tlist_Get_File_Index(a:filename) - if fidx != -1 - " Open the fold for the file - exe "silent! " . s:tlist_{fidx}_start . "," . - \ s:tlist_{fidx}_end . "foldopen" + let fname = fnamemodify(a:acmd_file, ":p") + if filereadable(fname) + let fidx = s:Tlist_Get_File_Index(fname) + if fidx != -1 + " Open the fold for the file + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen" + endif endif " Go back to the original window