From 214c19bb0045d7f749d4795834d85cb5794fc99b Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 16 Jan 2008 15:58:14 +0000 Subject: [PATCH 01/71] - add newer ada runtime files to fix bugzilla #246378 --- vim-7.1-ada.patch | 47357 ++++++++++++++++++++++++++++++++++++++++++++ vim.spec | 8 +- 2 files changed, 47364 insertions(+), 1 deletion(-) create mode 100644 vim-7.1-ada.patch diff --git a/vim-7.1-ada.patch b/vim-7.1-ada.patch new file mode 100644 index 00000000..c8c29324 --- /dev/null +++ b/vim-7.1-ada.patch @@ -0,0 +1,47357 @@ +diff -urN vim71/1/ada_options.vim vim71_ada/1/ada_options.vim +--- vim71/1/ada_options.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ada_options.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,105 @@ ++"------------------------------------------------------------------------------ ++" Description: Options setable by the Ada plugin ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ada_options.vim $ ++" History: 24.05.2006 MK Unified Headers ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 02.10.2006 MK Folding for "gnat pretty" ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested to save on spaces ++" Usage: copy content into your .vimrc and change options to your ++" likeing. ++" Help Page: ft-ada-options ++"------------------------------------------------------------------------------ ++ ++echoerr 'It is suggested to copy the content of ada_options into .vimrc!' ++finish " 1}}} ++ ++" Section: Ada options {{{1 ++ ++ let g:ada_abbrev = 1 ++ let g:ada_default_compiler = 'gnat' ++ let g:ada_extended_tagging = 'list' ++ let g:ada_folding = 'i' ++" let g:ada_folding = 'gibxp' ++" let g:ada_folding = 'spftc' ++ let g:ada_rainbow_color = 1 ++ let g:ada_space_errors = 1 ++ let g:ada_standard_types = 1 ++ let g:ada_with_gnat_project_files = 1 ++" let g:ada_extended_completion = 1 ++" let g:ada_line_errors = 1 ++" let g:ada_omni_with_keywords = 1 ++ ++ let g:Tlist_Exit_OnlyWindow = 1 ++ let g:Tlist_File_Fold_Auto_Close = 1 ++ let g:Tlist_Sort_Type = "name" ++ ++ let g:NERD_use_ada_with_spaces = 1 ++ ++ let g:backup_directory = '.backups' ++ let g:backup_purge = 10 ++ ++ let g:mapleader = "" ++ ++ if &diff ++ let g:Tlist_Auto_Open = 0 ++ else ++ let g:Tlist_Auto_Open = 1 ++ endif ++ ++ filetype plugin indent on ++ syntax enable ++ ++" }}}1 ++ ++" Section: Vimball options {{{1 ++:set expandtab fileformat=unix encoding=utf-8 ++:.+2,.+13 MkVimball ada-4.5.0 ++ ++ada_options.vim ++autoload/ada.vim ++autoload/adacomplete.vim ++autoload/decada.vim ++autoload/gnat.vim ++compiler/decada.vim ++compiler/gnat.vim ++doc/ft_ada.txt ++ftdetect/ada.vim ++ftplugin/ada.vim ++indent/ada.vim ++syntax/ada.vim ++ ++" }}}1 ++ ++" Section: Tar options {{{1 ++ ++tar --create --bzip2 \ ++ --file="ada-4.5.0.tar.bz2" \ ++ autoload/ada.vim \ ++ autoload/adacomplete.vim \ ++ autoload/decada.vim \ ++ autoload/gnat.vim \ ++ compiler/decada.vim \ ++ compiler/gnat.vim \ ++ doc/ft_ada.txt \ ++ ftdetect/ada.vim \ ++ ftplugin/ada.vim \ ++ indent/ada.vim \ ++ syntax/ada.vim ; ++ ++" }}}1 ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: textwidth=0 foldmethod=marker foldmethod=marker +diff -urN vim71/1/autoload/adacomplete.vim vim71_ada/1/autoload/adacomplete.vim +--- vim71/1/autoload/adacomplete.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/adacomplete.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,109 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada omnicompletion file ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ ++" History: 24.05.2006 MK Unified Headers ++" 26.05.2006 MK improved search for begin of word. ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested not to use include protection for ++" autoload ++" 05.11.2006 MK Bram suggested agaist using setlocal omnifunc ++" 05.11.2006 MK Bram suggested to save on spaces ++" Help Page: ft-ada-omni ++"------------------------------------------------------------------------------ ++ ++if version < 700 ++ finish ++endif ++ ++" Section: adacomplete#Complete () {{{1 ++" ++" This function is used for the 'omnifunc' option. ++" ++function! adacomplete#Complete (findstart, base) ++ if a:findstart == 1 ++ return ada#User_Complete (a:findstart, a:base) ++ else ++ " ++ " look up matches ++ " ++ if exists ("g:ada_omni_with_keywords") ++ call ada#User_Complete (a:findstart, a:base) ++ endif ++ " ++ " search tag file for matches ++ " ++ let l:Pattern = '^' . a:base . '.*$' ++ let l:Tag_List = taglist (l:Pattern) ++ " ++ " add symbols ++ " ++ for Tag_Item in l:Tag_List ++ if l:Tag_Item['kind'] == '' ++ " ++ " Tag created by gnat xref ++ " ++ let l:Match_Item = { ++ \ 'word': l:Tag_Item['name'], ++ \ 'menu': l:Tag_Item['filename'], ++ \ 'info': "Symbol from file " . l:Tag_Item['filename'] . " line " . l:Tag_Item['cmd'], ++ \ 'kind': 's', ++ \ 'icase': 1} ++ else ++ " ++ " Tag created by ctags ++ " ++ let l:Info = 'Symbol : ' . l:Tag_Item['name'] . "\n" ++ let l:Info .= 'Of type : ' . g:ada#Ctags_Kinds[l:Tag_Item['kind']][1] . "\n" ++ let l:Info .= 'Defined in File : ' . l:Tag_Item['filename'] . "\n" ++ ++ if has_key( l:Tag_Item, 'package') ++ let l:Info .= 'Package : ' . l:Tag_Item['package'] . "\n" ++ let l:Menu = l:Tag_Item['package'] ++ elseif has_key( l:Tag_Item, 'separate') ++ let l:Info .= 'Separate from Package : ' . l:Tag_Item['separate'] . "\n" ++ let l:Menu = l:Tag_Item['separate'] ++ elseif has_key( l:Tag_Item, 'packspec') ++ let l:Info .= 'Package Specification : ' . l:Tag_Item['packspec'] . "\n" ++ let l:Menu = l:Tag_Item['packspec'] ++ elseif has_key( l:Tag_Item, 'type') ++ let l:Info .= 'Datetype : ' . l:Tag_Item['type'] . "\n" ++ let l:Menu = l:Tag_Item['type'] ++ else ++ let l:Menu = l:Tag_Item['filename'] ++ endif ++ ++ let l:Match_Item = { ++ \ 'word': l:Tag_Item['name'], ++ \ 'menu': l:Menu, ++ \ 'info': l:Info, ++ \ 'kind': l:Tag_Item['kind'], ++ \ 'icase': 1} ++ endif ++ if complete_add (l:Match_Item) == 0 ++ return [] ++ endif ++ if complete_check () ++ return [] ++ endif ++ endfor ++ return [] ++ endif ++endfunction adacomplete#Complete ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/autoload/ada.vim vim71_ada/1/autoload/ada.vim +--- vim71/1/autoload/ada.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/ada.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,624 @@ ++"------------------------------------------------------------------------------ ++" Description: Perform Ada specific completion & tagging. ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Maintainer: Martin Krischik ++" Taylor Venable ++" Neil Bird ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ ++" History: 24.05.2006 MK Unified Headers ++" 26.05.2006 MK ' should not be in iskeyword. ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 02.10.2006 MK Better folding. ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested not to use include protection for ++" autoload ++" 05.11.2006 MK Bram suggested to save on spaces ++" 08.07.2007 TV fix mapleader problems. ++" 09.05.2007 MK Session just won't work no matter how much ++" tweaking is done ++" 19.09.2007 NO still some mapleader problems ++" Help Page: ft-ada-functions ++"------------------------------------------------------------------------------ ++ ++if version < 700 ++ finish ++endif ++ ++" Section: Constants {{{1 ++" ++let g:ada#DotWordRegex = '\a\w*\(\_s*\.\_s*\a\w*\)*' ++let g:ada#WordRegex = '\a\w*' ++let g:ada#Comment = "\\v^(\"[^\"]*\"|'.'|[^\"']){-}\\zs\\s*--.*" ++let g:ada#Keywords = [] ++ ++" Section: g:ada#Keywords {{{1 ++" ++" Section: add Ada keywords {{{2 ++" ++for Item in ['abort', 'else', 'new', 'return', 'abs', 'elsif', 'not', 'reverse', 'abstract', 'end', 'null', 'accept', 'entry', 'select', 'access', 'exception', 'of', 'separate', 'aliased', 'exit', 'or', 'subtype', 'all', 'others', 'synchronized', 'and', 'for', 'out', 'array', 'function', 'overriding', 'tagged', 'at', 'task', 'generic', 'package', 'terminate', 'begin', 'goto', 'pragma', 'then', 'body', 'private', 'type', 'if', 'procedure', 'case', 'in', 'protected', 'until', 'constant', 'interface', 'use', 'is', 'raise', 'declare', 'range', 'when', 'delay', 'limited', 'record', 'while', 'delta', 'loop', 'rem', 'with', 'digits', 'renames', 'do', 'mod', 'requeue', 'xor'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'keyword', ++ \ 'info': 'Ada keyword.', ++ \ 'kind': 'k', ++ \ 'icase': 1}] ++endfor ++ ++" Section: GNAT Project Files {{{3 ++" ++if exists ('g:ada_with_gnat_project_files') ++ for Item in ['project'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'keyword', ++ \ 'info': 'GNAT projectfile keyword.', ++ \ 'kind': 'k', ++ \ 'icase': 1}] ++ endfor ++endif ++ ++" Section: add standart exception {{{2 ++" ++for Item in ['Constraint_Error', 'Program_Error', 'Storage_Error', 'Tasking_Error', 'Status_Error', 'Mode_Error', 'Name_Error', 'Use_Error', 'Device_Error', 'End_Error', 'Data_Error', 'Layout_Error', 'Length_Error', 'Pattern_Error', 'Index_Error', 'Translation_Error', 'Time_Error', 'Argument_Error', 'Tag_Error', 'Picture_Error', 'Terminator_Error', 'Conversion_Error', 'Pointer_Error', 'Dereference_Error', 'Update_Error'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'exception', ++ \ 'info': 'Ada standart exception.', ++ \ 'kind': 'x', ++ \ 'icase': 1}] ++endfor ++ ++" Section: add GNAT exception {{{3 ++" ++if exists ('g:ada_gnat_extensions') ++ for Item in ['Assert_Failure'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'exception', ++ \ 'info': 'GNAT exception.', ++ \ 'kind': 'x', ++ \ 'icase': 1}] ++ endfor ++endif ++ ++" Section: add Ada buildin types {{{2 ++" ++for Item in ['Boolean', 'Integer', 'Natural', 'Positive', 'Float', 'Character', 'Wide_Character', 'Wide_Wide_Character', 'String', 'Wide_String', 'Wide_Wide_String', 'Duration'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'type', ++ \ 'info': 'Ada buildin type.', ++ \ 'kind': 't', ++ \ 'icase': 1}] ++endfor ++ ++" Section: add GNAT buildin types {{{3 ++" ++if exists ('g:ada_gnat_extensions') ++ for Item in ['Short_Integer', 'Short_Short_Integer', 'Long_Integer', 'Long_Long_Integer', 'Short_Float', 'Short_Short_Float', 'Long_Float', 'Long_Long_Float'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'type', ++ \ 'info': 'GNAT buildin type.', ++ \ 'kind': 't', ++ \ 'icase': 1}] ++ endfor ++endif ++ ++" Section: add Ada Attributes {{{2 ++" ++for Item in ['''Access', '''Address', '''Adjacent', '''Aft', '''Alignment', '''Base', '''Bit_Order', '''Body_Version', '''Callable', '''Caller', '''Ceiling', '''Class', '''Component_Size', '''Compose', '''Constrained', '''Copy_Sign', '''Count', '''Definite', '''Delta', '''Denorm', '''Digits', '''Emax', '''Exponent', '''External_Tag', '''Epsilon', '''First', '''First_Bit', '''Floor', '''Fore', '''Fraction', '''Identity', '''Image', '''Input', '''Large', '''Last', '''Last_Bit', '''Leading_Part', '''Length', '''Machine', '''Machine_Emax', '''Machine_Emin', '''Machine_Mantissa', '''Machine_Overflows', '''Machine_Radix', '''Machine_Rounding', '''Machine_Rounds', '''Mantissa', '''Max', '''Max_Size_In_Storage_Elements', '''Min', '''Mod', '''Model', '''Model_Emin', '''Model_Epsilon', '''Model_Mantissa', '''Model_Small', '''Modulus', '''Output', '''Partition_ID', '''Pos', '''Position', '''Pred', '''Priority', '''Range', '''Read', '''Remainder', '''Round', '''Rounding', '''Safe_Emax', '''Safe_First', '''Safe_Large', '''Safe_Last', '''Safe_Small', '''Scale', '''Scaling', '''Signed_Zeros', '''Size', '''Small', '''Storage_Pool', '''Storage_Size', '''Stream_Size', '''Succ', '''Tag', '''Terminated', '''Truncation', '''Unbiased_Rounding', '''Unchecked_Access', '''Val', '''Valid', '''Value', '''Version', '''Wide_Image', '''Wide_Value', '''Wide_Wide_Image', '''Wide_Wide_Value', '''Wide_Wide_Width', '''Wide_Width', '''Width', '''Write'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'attribute', ++ \ 'info': 'Ada attribute.', ++ \ 'kind': 'a', ++ \ 'icase': 1}] ++endfor ++ ++" Section: add GNAT Attributes {{{3 ++" ++if exists ('g:ada_gnat_extensions') ++ for Item in ['''Abort_Signal', '''Address_Size', '''Asm_Input', '''Asm_Output', '''AST_Entry', '''Bit', '''Bit_Position', '''Code_Address', '''Default_Bit_Order', '''Elaborated', '''Elab_Body', '''Elab_Spec', '''Emax', '''Enum_Rep', '''Epsilon', '''Fixed_Value', '''Has_Access_Values', '''Has_Discriminants', '''Img', '''Integer_Value', '''Machine_Size', '''Max_Interrupt_Priority', '''Max_Priority', '''Maximum_Alignment', '''Mechanism_Code', '''Null_Parameter', '''Object_Size', '''Passed_By_Reference', '''Range_Length', '''Storage_Unit', '''Target_Name', '''Tick', '''To_Address', '''Type_Class', '''UET_Address', '''Unconstrained_Array', '''Universal_Literal_String', '''Unrestricted_Access', '''VADS_Size', '''Value_Size', '''Wchar_T_Size', '''Word_Size'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'attribute', ++ \ 'info': 'GNAT attribute.', ++ \ 'kind': 'a', ++ \ 'icase': 1}] ++ endfor ++endif ++ ++" Section: add Ada Pragmas {{{2 ++" ++for Item in ['All_Calls_Remote', 'Assert', 'Assertion_Policy', 'Asynchronous', 'Atomic', 'Atomic_Components', 'Attach_Handler', 'Controlled', 'Convention', 'Detect_Blocking', 'Discard_Names', 'Elaborate', 'Elaborate_All', 'Elaborate_Body', 'Export', 'Import', 'Inline', 'Inspection_Point', 'Interface (Obsolescent)', 'Interrupt_Handler', 'Interrupt_Priority', 'Linker_Options', 'List', 'Locking_Policy', 'Memory_Size (Obsolescent)', 'No_Return', 'Normalize_Scalars', 'Optimize', 'Pack', 'Page', 'Partition_Elaboration_Policy', 'Preelaborable_Initialization', 'Preelaborate', 'Priority', 'Priority_Specific_Dispatching', 'Profile', 'Pure', 'Queueing_Policy', 'Relative_Deadline', 'Remote_Call_Interface', 'Remote_Types', 'Restrictions', 'Reviewable', 'Shared (Obsolescent)', 'Shared_Passive', 'Storage_Size', 'Storage_Unit (Obsolescent)', 'Suppress', 'System_Name (Obsolescent)', 'Task_Dispatching_Policy', 'Unchecked_Union', 'Unsuppress', 'Volatile', 'Volatile_Components'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'pragma', ++ \ 'info': 'Ada pragma.', ++ \ 'kind': 'p', ++ \ 'icase': 1}] ++endfor ++ ++" Section: add GNAT Pragmas {{{3 ++" ++if exists ('g:ada_gnat_extensions') ++ for Item in ['Abort_Defer', 'Ada_83', 'Ada_95', 'Ada_05', 'Annotate', 'Ast_Entry', 'C_Pass_By_Copy', 'Comment', 'Common_Object', 'Compile_Time_Warning', 'Complex_Representation', 'Component_Alignment', 'Convention_Identifier', 'CPP_Class', 'CPP_Constructor', 'CPP_Virtual', 'CPP_Vtable', 'Debug', 'Elaboration_Checks', 'Eliminate', 'Export_Exception', 'Export_Function', 'Export_Object', 'Export_Procedure', 'Export_Value', 'Export_Valued_Procedure', 'Extend_System', 'External', 'External_Name_Casing', 'Finalize_Storage_Only', 'Float_Representation', 'Ident', 'Import_Exception', 'Import_Function', 'Import_Object', 'Import_Procedure', 'Import_Valued_Procedure', 'Initialize_Scalars', 'Inline_Always', 'Inline_Generic', 'Interface_Name', 'Interrupt_State', 'Keep_Names', 'License', 'Link_With', 'Linker_Alias', 'Linker_Section', 'Long_Float', 'Machine_Attribute', 'Main_Storage', 'Obsolescent', 'Passive', 'Polling', 'Profile_Warnings', 'Propagate_Exceptions', 'Psect_Object', 'Pure_Function', 'Restriction_Warnings', 'Source_File_Name', 'Source_File_Name_Project', 'Source_Reference', 'Stream_Convert', 'Style_Checks', 'Subtitle', 'Suppress_All', 'Suppress_Exception_Locations', 'Suppress_Initialization', 'Task_Info', 'Task_Name', 'Task_Storage', 'Thread_Body', 'Time_Slice', 'Title', 'Unimplemented_Unit', 'Universal_Data', 'Unreferenced', 'Unreserve_All_Interrupts', 'Use_VADS_Size', 'Validity_Checks', 'Warnings', 'Weak_External'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'pragma', ++ \ 'info': 'GNAT pragma.', ++ \ 'kind': 'p', ++ \ 'icase': 1}] ++ endfor ++endif ++" 1}}} ++ ++" Section: g:ada#Ctags_Kinds {{{1 ++" ++let g:ada#Ctags_Kinds = { ++ \ 'P': ["packspec", "package specifications"], ++ \ 'p': ["package", "packages"], ++ \ 'T': ["typespec", "type specifications"], ++ \ 't': ["type", "types"], ++ \ 'U': ["subspec", "subtype specifications"], ++ \ 'u': ["subtype", "subtypes"], ++ \ 'c': ["component", "record type components"], ++ \ 'l': ["literal", "enum type literals"], ++ \ 'V': ["varspec", "variable specifications"], ++ \ 'v': ["variable", "variables"], ++ \ 'f': ["formal", "generic formal parameters"], ++ \ 'n': ["constant", "constants"], ++ \ 'x': ["exception", "user defined exceptions"], ++ \ 'R': ["subprogspec", "subprogram specifications"], ++ \ 'r': ["subprogram", "subprograms"], ++ \ 'K': ["taskspec", "task specifications"], ++ \ 'k': ["task", "tasks"], ++ \ 'O': ["protectspec", "protected data specifications"], ++ \ 'o': ["protected", "protected data"], ++ \ 'E': ["entryspec", "task/protected data entry specifications"], ++ \ 'e': ["entry", "task/protected data entries"], ++ \ 'b': ["label", "labels"], ++ \ 'i': ["identifier", "loop/declare identifiers"], ++ \ 'a': ["autovar", "automatic variables"], ++ \ 'y': ["annon", "loops and blocks with no identifier"]} ++ ++" Section: ada#Word (...) {{{1 ++" ++" Extract current Ada word across multiple lines ++" AdaWord ([line, column])\ ++" ++function ada#Word (...) ++ if a:0 > 1 ++ let l:Line_Nr = a:1 ++ let l:Column_Nr = a:2 - 1 ++ else ++ let l:Line_Nr = line('.') ++ let l:Column_Nr = col('.') - 1 ++ endif ++ ++ let l:Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' ) ++ ++ " Cope with tag searching for items in comments; if we are, don't loop ++ " backards looking for previous lines ++ if l:Column_Nr > strlen(l:Line) ++ " We were in a comment ++ let l:Line = getline(l:Line_Nr) ++ let l:Search_Prev_Lines = 0 ++ else ++ let l:Search_Prev_Lines = 1 ++ endif ++ ++ " Go backwards until we find a match (Ada ID) that *doesn't* include our ++ " location - i.e., the previous ID. This is because the current 'correct' ++ " match will toggle matching/not matching as we traverse characters ++ " backwards. Thus, we have to find the previous unrelated match, exclude ++ " it, then use the next full match (ours). ++ " Remember to convert vim column 'l:Column_Nr' [1..n] to string offset [0..(n-1)] ++ " ... but start, here, one after the required char. ++ let l:New_Column = l:Column_Nr + 1 ++ while 1 ++ let l:New_Column = l:New_Column - 1 ++ if l:New_Column < 0 ++ " Have to include previous l:Line from file ++ let l:Line_Nr = l:Line_Nr - 1 ++ if l:Line_Nr < 1 || !l:Search_Prev_Lines ++ " Start of file or matching in a comment ++ let l:Line_Nr = 1 ++ let l:New_Column = 0 ++ let l:Our_Match = match (l:Line, g:ada#WordRegex ) ++ break ++ endif ++ " Get previous l:Line, and prepend it to our search string ++ let l:New_Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' ) ++ let l:New_Column = strlen (l:New_Line) - 1 ++ let l:Column_Nr = l:Column_Nr + l:New_Column ++ let l:Line = l:New_Line . l:Line ++ endif ++ " Check to see if this is a match excluding 'us' ++ let l:Match_End = l:New_Column + ++ \ matchend (strpart (l:Line,l:New_Column), g:ada#WordRegex ) - 1 ++ if l:Match_End >= l:New_Column && ++ \ l:Match_End < l:Column_Nr ++ " Yes ++ let l:Our_Match = l:Match_End+1 + ++ \ match (strpart (l:Line,l:Match_End+1), g:ada#WordRegex ) ++ break ++ endif ++ endwhile ++ ++ " Got anything? ++ if l:Our_Match < 0 ++ return '' ++ else ++ let l:Line = strpart (l:Line, l:Our_Match) ++ endif ++ ++ " Now simply add further lines until the match gets no bigger ++ let l:Match_String = matchstr (l:Line, g:ada#WordRegex) ++ let l:Last_Line = line ('$') ++ let l:Line_Nr = line ('.') + 1 ++ while l:Line_Nr <= l:Last_Line ++ let l:Last_Match = l:Match_String ++ let l:Line = l:Line . ++ \ substitute (getline (l:Line_Nr), g:ada#Comment, '', '') ++ let l:Match_String = matchstr (l:Line, g:ada#WordRegex) ++ if l:Match_String == l:Last_Match ++ break ++ endif ++ endwhile ++ ++ " Strip whitespace & return ++ return substitute (l:Match_String, '\s\+', '', 'g') ++endfunction ada#Word ++ ++" Section: ada#List_Tag (...) {{{1 ++" ++" List tags in quickfix window ++" ++function ada#List_Tag (...) ++ if a:0 > 1 ++ let l:Tag_Word = ada#Word (a:1, a:2) ++ elseif a:0 > 0 ++ let l:Tag_Word = a:1 ++ else ++ let l:Tag_Word = ada#Word () ++ endif ++ ++ echo "Searching for" l:Tag_Word ++ ++ let l:Pattern = '^' . l:Tag_Word . '$' ++ let l:Tag_List = taglist (l:Pattern) ++ let l:Error_List = [] ++ " ++ " add symbols ++ " ++ for Tag_Item in l:Tag_List ++ if l:Tag_Item['kind'] == '' ++ let l:Tag_Item['kind'] = 's' ++ endif ++ ++ let l:Error_List += [ ++ \ l:Tag_Item['filename'] . '|' . ++ \ l:Tag_Item['cmd'] . '|' . ++ \ l:Tag_Item['kind'] . "\t" . ++ \ l:Tag_Item['name'] ] ++ endfor ++ set errorformat=%f\|%l\|%m ++ cexpr l:Error_List ++ cwindow ++endfunction ada#List_Tag ++ ++" Section: ada#Jump_Tag (Word, Mode) {{{1 ++" ++" Word tag - include '.' and if Ada make uppercase ++" ++function ada#Jump_Tag (Word, Mode) ++ if a:Word == '' ++ " Get current word ++ let l:Word = ada#Word() ++ if l:Word == '' ++ throw "NOT_FOUND: no identifier found." ++ endif ++ else ++ let l:Word = a:Word ++ endif ++ ++ echo "Searching for " . l:Word ++ ++ try ++ execute a:Mode l:Word ++ catch /.*:E426:.*/ ++ let ignorecase = &ignorecase ++ set ignorecase ++ execute a:Mode l:Word ++ let &ignorecase = ignorecase ++ endtry ++ ++ return ++endfunction ada#Jump_Tag ++ ++" Section: ada#Insert_Backspace () {{{1 ++" ++" Backspace at end of line after auto-inserted commentstring '-- ' wipes it ++" ++function ada#Insert_Backspace () ++ let l:Line = getline ('.') ++ if col ('.') > strlen (l:Line) && ++ \ match (l:Line, '-- $') != -1 && ++ \ match (&comments,'--') != -1 ++ return "\\\" ++ else ++ return "\" ++ endif ++ ++ return ++endfunction ada#InsertBackspace ++ ++" Section: Insert Completions {{{1 ++" ++" Section: ada#User_Complete(findstart, base) {{{2 ++" ++" This function is used for the 'complete' option. ++" ++function! ada#User_Complete(findstart, base) ++ if a:findstart == 1 ++ " ++ " locate the start of the word ++ " ++ let line = getline ('.') ++ let start = col ('.') - 1 ++ while start > 0 && line[start - 1] =~ '\i\|''' ++ let start -= 1 ++ endwhile ++ return start ++ else ++ " ++ " look up matches ++ " ++ let l:Pattern = '^' . a:base . '.*$' ++ " ++ " add keywords ++ " ++ for Tag_Item in g:ada#Keywords ++ if l:Tag_Item['word'] =~? l:Pattern ++ if complete_add (l:Tag_Item) == 0 ++ return [] ++ endif ++ if complete_check () ++ return [] ++ endif ++ endif ++ endfor ++ return [] ++ endif ++endfunction ada#User_Complete ++ ++" Section: ada#Completion (cmd) {{{2 ++" ++" Word completion (^N/^R/^X^]) - force '.' inclusion ++function ada#Completion (cmd) ++ set iskeyword+=46 ++ return a:cmd . "\=ada#Completion_End ()\" ++endfunction ada#Completion ++ ++" Section: ada#Completion_End () {{{2 ++" ++function ada#Completion_End () ++ set iskeyword-=46 ++ return '' ++endfunction ada#Completion_End ++ ++" Section: ada#Create_Tags {{{1 ++" ++function ada#Create_Tags (option) ++ if a:option == 'file' ++ let l:Filename = fnamemodify (bufname ('%'), ':p') ++ elseif a:option == 'dir' ++ let l:Filename = ++ \ fnamemodify (bufname ('%'), ':p:h') . "*.ada " . ++ \ fnamemodify (bufname ('%'), ':p:h') . "*.adb " . ++ \ fnamemodify (bufname ('%'), ':p:h') . "*.ads" ++ else ++ let l:Filename = a:option ++ endif ++ execute '!ctags --excmd=number ' . l:Filename ++endfunction ada#Create_Tags ++ ++" Section: ada#Switch_Session {{{1 ++" ++function ada#Switch_Session (New_Session) ++ " ++ " you should not save to much date into the seession since they will ++ " be sourced ++ " ++ set sessionoptions=buffers,curdir,folds,globals,resize,slash,tabpages,tabpages,unix,winpos,winsize ++ ++ if a:New_Session != v:this_session ++ " ++ " We actualy got a new session - otherwise there ++ " is nothing to do. ++ " ++ if strlen (v:this_session) > 0 ++ execute 'mksession! ' . v:this_session ++ endif ++ ++ let v:this_session = a:New_Session ++ ++ "if filereadable (v:this_session) ++ "execute 'source ' . v:this_session ++ "endif ++ ++ augroup ada_session ++ autocmd! ++ autocmd VimLeavePre * execute 'mksession! ' . v:this_session ++ augroup END ++ " ++ "if exists ("g:Tlist_Auto_Open") && g:Tlist_Auto_Open ++ "TlistOpen ++ "endif ++ ++ endif ++ ++ return ++endfunction ada#Switch_Session ++ ++" Section: GNAT Pretty Printer folding {{{1 ++" ++if exists('g:ada_folding') && g:ada_folding[0] == 'g' ++ " ++ " Lines consisting only of ')' ';' are due to a gnat pretty bug and ++ " have the same level as the line above (can't happen in the first ++ " line). ++ " ++ let s:Fold_Collate = '^\([;)]*$\|' ++ ++ " ++ " some lone statements are folded with the line above ++ " ++ if stridx (g:ada_folding, 'i') >= 0 ++ let s:Fold_Collate .= '\s\+\$\|' ++ endif ++ if stridx (g:ada_folding, 'b') >= 0 ++ let s:Fold_Collate .= '\s\+\$\|' ++ endif ++ if stridx (g:ada_folding, 'p') >= 0 ++ let s:Fold_Collate .= '\s\+\$\|' ++ endif ++ if stridx (g:ada_folding, 'x') >= 0 ++ let s:Fold_Collate .= '\s\+\$\|' ++ endif ++ ++ " We also handle empty lines and ++ " comments here. ++ let s:Fold_Collate .= '--\)' ++ ++ function ada#Pretty_Print_Folding (Line) " {{{2 ++ let l:Text = getline (a:Line) ++ ++ if l:Text =~ s:Fold_Collate ++ " ++ " fold with line above ++ " ++ let l:Level = "=" ++ elseif l:Text =~ '^\s\+(' ++ " ++ " gnat outdents a line which stards with a ( by one characters so ++ " that parameters which follow are aligned. ++ " ++ let l:Level = (indent (a:Line) + 1) / &shiftwidth ++ else ++ let l:Level = indent (a:Line) / &shiftwidth ++ endif ++ ++ return l:Level ++ endfunction ada#Pretty_Print_Folding " }}}2 ++endif ++ ++" Section: Options and Menus {{{1 ++" ++" Section: ada#Switch_Syntax_Options {{{2 ++" ++function ada#Switch_Syntax_Option (option) ++ syntax off ++ if exists ('g:ada_' . a:option) ++ unlet g:ada_{a:option} ++ echo a:option . 'now off' ++ else ++ let g:ada_{a:option}=1 ++ echo a:option . 'now on' ++ endif ++ syntax on ++endfunction ada#Switch_Syntax_Option ++ ++" Section: ada#Map_Menu {{{2 ++" ++function ada#Map_Menu (Text, Keys, Command) ++ if a:Keys[0] == ':' ++ execute ++ \ "50amenu " . ++ \ "Ada." . escape(a:Text, ' ') . ++ \ "" . a:Keys . ++ \ " :" . a:Command . "" ++ execute ++ \ "command -buffer " . ++ \ a:Keys[1:] . ++ \" :" . a:Command . "" ++ elseif a:Keys[0] == '<' ++ execute ++ \ "50amenu " . ++ \ "Ada." . escape(a:Text, ' ') . ++ \ "" . a:Keys . ++ \ " :" . a:Command . "" ++ execute ++ \ "nnoremap " . ++ \ a:Keys . ++ \" :" . a:Command . "" ++ execute ++ \ "inoremap " . ++ \ a:Keys . ++ \" :" . a:Command . "" ++ else ++ if exists("g:mapleader") ++ let l:leader = g:mapleader ++ else ++ let l:leader = '\' ++ endif ++ execute ++ \ "50amenu " . ++ \ "Ada." . escape(a:Text, ' ') . ++ \ "" . escape(l:leader . "a" . a:Keys , '\') . ++ \ " :" . a:Command . "" ++ execute ++ \ "nnoremap " . ++ \ escape(l:leader . "a" . a:Keys , '\') . ++ \" :" . a:Command ++ execute ++ \ "inoremap " . ++ \ escape(l:leader . "a" . a:Keys , '\') . ++ \" :" . a:Command ++ endif ++ return ++endfunction ++ ++" Section: ada#Map_Popup {{{2 ++" ++function ada#Map_Popup (Text, Keys, Command) ++ if exists("g:mapleader") ++ let l:leader = g:mapleader ++ else ++ let l:leader = '\' ++ endif ++ execute ++ \ "50amenu " . ++ \ "PopUp." . escape(a:Text, ' ') . ++ \ "" . escape(l:leader . "a" . a:Keys , '\') . ++ \ " :" . a:Command . "" ++ ++ call ada#Map_Menu (a:Text, a:Keys, a:Command) ++ return ++endfunction ada#Map_Popup ++ ++" }}}1 ++ ++lockvar g:ada#WordRegex ++lockvar g:ada#DotWordRegex ++lockvar g:ada#Comment ++lockvar! g:ada#Keywords ++lockvar! g:ada#Ctags_Kinds ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/autoload/decada.vim vim71_ada/1/autoload/decada.vim +--- vim71/1/autoload/decada.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/decada.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,75 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada/Dec Ada compiler file ++" Language: Ada (Dec Ada) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ ++" History: 21.07.2006 MK New Dec Ada ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested not to use include protection for ++" autoload ++" 05.11.2006 MK Bram suggested to save on spaces ++" Help Page: compiler-decada ++"------------------------------------------------------------------------------ ++ ++if version < 700 ++ finish ++endif ++ ++function decada#Unit_Name () dict " {{{1 ++ " Convert filename into acs unit: ++ " 1: remove the file extenstion. ++ " 2: replace all double '_' or '-' with an dot (which denotes a separate) ++ " 3: remove a trailing '_' (wich denotes a specification) ++ return substitute (substitute (expand ("%:t:r"), '__\|-', ".", "g"), '_$', "", '') ++endfunction decada#Unit_Name " }}}1 ++ ++function decada#Make () dict " {{{1 ++ let l:make_prg = substitute (g:self.Make_Command, '%<', self.Unit_Name(), '') ++ let &errorformat = g:self.Error_Format ++ let &makeprg = l:make_prg ++ wall ++ make ++ copen ++ set wrap ++ wincmd W ++endfunction decada#Build " }}}1 ++ ++function decada#Set_Session (...) dict " {{{1 ++ if a:0 > 0 ++ call ada#Switch_Session (a:1) ++ elseif argc() == 0 && strlen (v:servername) > 0 ++ call ada#Switch_Session ( ++ \ expand('~')[0:-2] . ".vimfiles.session]decada_" . ++ \ v:servername . ".vim") ++ endif ++ return ++endfunction decada#Set_Session " }}}1 ++ ++function decada#New () " }}}1 ++ let Retval = { ++ \ 'Make' : function ('decada#Make'), ++ \ 'Unit_Name' : function ('decada#Unit_Name'), ++ \ 'Set_Session' : function ('decada#Set_Session'), ++ \ 'Project_Dir' : '', ++ \ 'Make_Command' : 'ACS COMPILE /Wait /Log /NoPreLoad /Optimize=Development /Debug %<', ++ \ 'Error_Format' : '%+A%%ADAC-%t-%m,%C %#%m,%Zat line number %l in file %f,' . ++ \ '%+I%%ada-I-%m,%C %#%m,%Zat line number %l in file %f'} ++ ++ return Retval ++endfunction decada#New " }}}1 ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/autoload/gnat.vim vim71_ada/1/autoload/gnat.vim +--- vim71/1/autoload/gnat.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/gnat.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,147 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada/GNAT compiler file ++" Language: Ada (GNAT) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischi k ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ ++" History: 24.05.2006 MK Unified Headers ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 05.08.2006 MK Add session support ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested not to use include protection for ++" autoload ++" 05.11.2006 MK Bram suggested to save on spaces ++" 19.09.2007 NO use project file only when there is a project ++" Help Page: compiler-gnat ++"------------------------------------------------------------------------------ ++ ++if version < 700 ++ finish ++endif ++ ++function gnat#Make () dict " {{{1 ++ let &l:makeprg = self.Get_Command('Make') ++ let &l:errorformat = self.Error_Format ++ wall ++ make ++ copen ++ set wrap ++ wincmd W ++endfunction gnat#Make " }}}1 ++ ++function gnat#Pretty () dict " {{{1 ++ execute "!" . self.Get_Command('Pretty') ++endfunction gnat#Make " }}}1 ++ ++function gnat#Find () dict " {{{1 ++ execute "!" . self.Get_Command('Find') ++endfunction gnat#Find " }}}1 ++ ++function gnat#Tags () dict " {{{1 ++ execute "!" . self.Get_Command('Tags') ++ edit tags ++ call gnat#Insert_Tags_Header () ++ update ++ quit ++endfunction gnat#Tags " }}}1 ++ ++function gnat#Set_Project_File (...) dict " {{{1 ++ if a:0 > 0 ++ let self.Project_File = a:1 ++ ++ if ! filereadable (self.Project_File) ++ let self.Project_File = findfile ( ++ \ fnamemodify (self.Project_File, ':r'), ++ \ $ADA_PROJECT_PATH, ++ \ 1) ++ endif ++ elseif strlen (self.Project_File) > 0 ++ let self.Project_File = browse (0, 'GNAT Project File?', '', self.Project_File) ++ elseif expand ("%:e") == 'gpr' ++ let self.Project_File = browse (0, 'GNAT Project File?', '', expand ("%:e")) ++ else ++ let self.Project_File = browse (0, 'GNAT Project File?', '', 'default.gpr') ++ endif ++ ++ if strlen (v:this_session) > 0 ++ execute 'mksession! ' . v:this_session ++ endif ++ ++ "if strlen (self.Project_File) > 0 ++ "if has("vms") ++ "call ada#Switch_Session ( ++ "\ expand('~')[0:-2] . ".vimfiles.session]gnat_" . ++ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") ++ "else ++ "call ada#Switch_Session ( ++ "\ expand('~') . "/vimfiles/session/gnat_" . ++ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") ++ "endif ++ "else ++ "call ada#Switch_Session ('') ++ "endif ++ ++ return ++endfunction gnat#Set_Project_File " }}}1 ++ ++function gnat#Get_Command (Command) dict " {{{1 ++ let l:Command = eval ('self.' . a:Command . '_Command') ++ return eval (l:Command) ++endfunction gnat#Get_Command " }}}1 ++ ++function gnat#Set_Session (...) dict " {{{1 ++ if argc() == 1 && fnamemodify (argv(0), ':e') == 'gpr' ++ call self.Set_Project_File (argv(0)) ++ elseif strlen (v:servername) > 0 ++ call self.Set_Project_File (v:servername . '.gpr') ++ endif ++endfunction gnat#Set_Session " }}}1 ++ ++function gnat#New () " {{{1 ++ let l:Retval = { ++ \ 'Make' : function ('gnat#Make'), ++ \ 'Pretty' : function ('gnat#Pretty'), ++ \ 'Find' : function ('gnat#Find'), ++ \ 'Tags' : function ('gnat#Tags'), ++ \ 'Set_Project_File' : function ('gnat#Set_Project_File'), ++ \ 'Set_Session' : function ('gnat#Set_Session'), ++ \ 'Get_Command' : function ('gnat#Get_Command'), ++ \ 'Project_File' : '', ++ \ 'Make_Command' : '"gnat make -P " . self.Project_File . " -F -gnatef "', ++ \ 'Pretty_Command' : '"gnat pretty -P " . self.Project_File . " "', ++ \ 'Find_Program' : '"gnat find -P " . self.Project_File . " -F "', ++ \ 'Tags_Command' : '"gnat xref -P " . self.Project_File . " -v *.AD*"', ++ \ 'Error_Format' : '%f:%l:%c: %trror: %m,' . ++ \ '%f:%l:%c: %tarning: %m,' . ++ \ '%f:%l:%c: (%ttyle) %m'} ++ ++ return l:Retval ++endfunction gnat#New " }}}1 ++ ++function gnat#Insert_Tags_Header () " {{{1 ++ 1insert ++!_TAG_FILE_FORMAT 1 /extended format; --format=1 will not append ;" to lines/ ++!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ ++!_TAG_PROGRAM_AUTHOR AdaCore /info@adacore.com/ ++!_TAG_PROGRAM_NAME gnatxref // ++!_TAG_PROGRAM_URL http://www.adacore.com /official site/ ++!_TAG_PROGRAM_VERSION 5.05w // ++. ++ return ++endfunction gnat#Insert_Tags_Header " }}}1 ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=0 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/autoload/.svn/all-wcprops vim71_ada/1/autoload/.svn/all-wcprops +--- vim71/1/autoload/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,29 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 53 ++/svnroot/gnuada/!svn/ver/825/trunk/tools/vim/autoload ++END ++ada.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 61 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/autoload/ada.vim ++END ++gnat.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 62 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/autoload/gnat.vim ++END ++adacomplete.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 69 ++/svnroot/gnuada/!svn/ver/825/trunk/tools/vim/autoload/adacomplete.vim ++END ++decada.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 64 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/autoload/decada.vim ++END +diff -urN vim71/1/autoload/.svn/dir-prop-base vim71_ada/1/autoload/.svn/dir-prop-base +--- vim71/1/autoload/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,6 @@ ++K 10 ++svn:ignore ++V 9 ++.backups ++ ++END +diff -urN vim71/1/autoload/.svn/entries vim71_ada/1/autoload/.svn/entries +--- vim71/1/autoload/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/entries 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,80 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-12-09T13:34:03.484664Z ++825 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ ++ada.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++d052f84bf31bdcf8b2f2e3ad61717ad6 ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ ++gnat.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++e159890b42c4a6d597df518684074471 ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ ++adacomplete.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++93cc71b15159672b98a58fafd628840f ++2007-12-09T13:34:03.484664Z ++825 ++krischik ++has-props ++ ++decada.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++4547173c4d23fb524fa6763408c928cf ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ +diff -urN vim71/1/autoload/.svn/format vim71_ada/1/autoload/.svn/format +--- vim71/1/autoload/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/format 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/autoload/.svn/prop-base/adacomplete.vim.svn-base vim71_ada/1/autoload/.svn/prop-base/adacomplete.vim.svn-base +--- vim71/1/autoload/.svn/prop-base/adacomplete.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/prop-base/adacomplete.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/autoload/.svn/prop-base/ada.vim.svn-base vim71_ada/1/autoload/.svn/prop-base/ada.vim.svn-base +--- vim71/1/autoload/.svn/prop-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/prop-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/autoload/.svn/prop-base/decada.vim.svn-base vim71_ada/1/autoload/.svn/prop-base/decada.vim.svn-base +--- vim71/1/autoload/.svn/prop-base/decada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/prop-base/decada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/autoload/.svn/prop-base/gnat.vim.svn-base vim71_ada/1/autoload/.svn/prop-base/gnat.vim.svn-base +--- vim71/1/autoload/.svn/prop-base/gnat.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/prop-base/gnat.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/autoload/.svn/text-base/adacomplete.vim.svn-base vim71_ada/1/autoload/.svn/text-base/adacomplete.vim.svn-base +--- vim71/1/autoload/.svn/text-base/adacomplete.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/text-base/adacomplete.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,109 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada omnicompletion file ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL$ ++" History: 24.05.2006 MK Unified Headers ++" 26.05.2006 MK improved search for begin of word. ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested not to use include protection for ++" autoload ++" 05.11.2006 MK Bram suggested agaist using setlocal omnifunc ++" 05.11.2006 MK Bram suggested to save on spaces ++" Help Page: ft-ada-omni ++"------------------------------------------------------------------------------ ++ ++if version < 700 ++ finish ++endif ++ ++" Section: adacomplete#Complete () {{{1 ++" ++" This function is used for the 'omnifunc' option. ++" ++function! adacomplete#Complete (findstart, base) ++ if a:findstart == 1 ++ return ada#User_Complete (a:findstart, a:base) ++ else ++ " ++ " look up matches ++ " ++ if exists ("g:ada_omni_with_keywords") ++ call ada#User_Complete (a:findstart, a:base) ++ endif ++ " ++ " search tag file for matches ++ " ++ let l:Pattern = '^' . a:base . '.*$' ++ let l:Tag_List = taglist (l:Pattern) ++ " ++ " add symbols ++ " ++ for Tag_Item in l:Tag_List ++ if l:Tag_Item['kind'] == '' ++ " ++ " Tag created by gnat xref ++ " ++ let l:Match_Item = { ++ \ 'word': l:Tag_Item['name'], ++ \ 'menu': l:Tag_Item['filename'], ++ \ 'info': "Symbol from file " . l:Tag_Item['filename'] . " line " . l:Tag_Item['cmd'], ++ \ 'kind': 's', ++ \ 'icase': 1} ++ else ++ " ++ " Tag created by ctags ++ " ++ let l:Info = 'Symbol : ' . l:Tag_Item['name'] . "\n" ++ let l:Info .= 'Of type : ' . g:ada#Ctags_Kinds[l:Tag_Item['kind']][1] . "\n" ++ let l:Info .= 'Defined in File : ' . l:Tag_Item['filename'] . "\n" ++ ++ if has_key( l:Tag_Item, 'package') ++ let l:Info .= 'Package : ' . l:Tag_Item['package'] . "\n" ++ let l:Menu = l:Tag_Item['package'] ++ elseif has_key( l:Tag_Item, 'separate') ++ let l:Info .= 'Separate from Package : ' . l:Tag_Item['separate'] . "\n" ++ let l:Menu = l:Tag_Item['separate'] ++ elseif has_key( l:Tag_Item, 'packspec') ++ let l:Info .= 'Package Specification : ' . l:Tag_Item['packspec'] . "\n" ++ let l:Menu = l:Tag_Item['packspec'] ++ elseif has_key( l:Tag_Item, 'type') ++ let l:Info .= 'Datetype : ' . l:Tag_Item['type'] . "\n" ++ let l:Menu = l:Tag_Item['type'] ++ else ++ let l:Menu = l:Tag_Item['filename'] ++ endif ++ ++ let l:Match_Item = { ++ \ 'word': l:Tag_Item['name'], ++ \ 'menu': l:Menu, ++ \ 'info': l:Info, ++ \ 'kind': l:Tag_Item['kind'], ++ \ 'icase': 1} ++ endif ++ if complete_add (l:Match_Item) == 0 ++ return [] ++ endif ++ if complete_check () ++ return [] ++ endif ++ endfor ++ return [] ++ endif ++endfunction adacomplete#Complete ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/autoload/.svn/text-base/ada.vim.svn-base vim71_ada/1/autoload/.svn/text-base/ada.vim.svn-base +--- vim71/1/autoload/.svn/text-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/text-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,624 @@ ++"------------------------------------------------------------------------------ ++" Description: Perform Ada specific completion & tagging. ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Maintainer: Martin Krischik ++" Taylor Venable ++" Neil Bird ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL$ ++" History: 24.05.2006 MK Unified Headers ++" 26.05.2006 MK ' should not be in iskeyword. ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 02.10.2006 MK Better folding. ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested not to use include protection for ++" autoload ++" 05.11.2006 MK Bram suggested to save on spaces ++" 08.07.2007 TV fix mapleader problems. ++" 09.05.2007 MK Session just won't work no matter how much ++" tweaking is done ++" 19.09.2007 NO still some mapleader problems ++" Help Page: ft-ada-functions ++"------------------------------------------------------------------------------ ++ ++if version < 700 ++ finish ++endif ++ ++" Section: Constants {{{1 ++" ++let g:ada#DotWordRegex = '\a\w*\(\_s*\.\_s*\a\w*\)*' ++let g:ada#WordRegex = '\a\w*' ++let g:ada#Comment = "\\v^(\"[^\"]*\"|'.'|[^\"']){-}\\zs\\s*--.*" ++let g:ada#Keywords = [] ++ ++" Section: g:ada#Keywords {{{1 ++" ++" Section: add Ada keywords {{{2 ++" ++for Item in ['abort', 'else', 'new', 'return', 'abs', 'elsif', 'not', 'reverse', 'abstract', 'end', 'null', 'accept', 'entry', 'select', 'access', 'exception', 'of', 'separate', 'aliased', 'exit', 'or', 'subtype', 'all', 'others', 'synchronized', 'and', 'for', 'out', 'array', 'function', 'overriding', 'tagged', 'at', 'task', 'generic', 'package', 'terminate', 'begin', 'goto', 'pragma', 'then', 'body', 'private', 'type', 'if', 'procedure', 'case', 'in', 'protected', 'until', 'constant', 'interface', 'use', 'is', 'raise', 'declare', 'range', 'when', 'delay', 'limited', 'record', 'while', 'delta', 'loop', 'rem', 'with', 'digits', 'renames', 'do', 'mod', 'requeue', 'xor'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'keyword', ++ \ 'info': 'Ada keyword.', ++ \ 'kind': 'k', ++ \ 'icase': 1}] ++endfor ++ ++" Section: GNAT Project Files {{{3 ++" ++if exists ('g:ada_with_gnat_project_files') ++ for Item in ['project'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'keyword', ++ \ 'info': 'GNAT projectfile keyword.', ++ \ 'kind': 'k', ++ \ 'icase': 1}] ++ endfor ++endif ++ ++" Section: add standart exception {{{2 ++" ++for Item in ['Constraint_Error', 'Program_Error', 'Storage_Error', 'Tasking_Error', 'Status_Error', 'Mode_Error', 'Name_Error', 'Use_Error', 'Device_Error', 'End_Error', 'Data_Error', 'Layout_Error', 'Length_Error', 'Pattern_Error', 'Index_Error', 'Translation_Error', 'Time_Error', 'Argument_Error', 'Tag_Error', 'Picture_Error', 'Terminator_Error', 'Conversion_Error', 'Pointer_Error', 'Dereference_Error', 'Update_Error'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'exception', ++ \ 'info': 'Ada standart exception.', ++ \ 'kind': 'x', ++ \ 'icase': 1}] ++endfor ++ ++" Section: add GNAT exception {{{3 ++" ++if exists ('g:ada_gnat_extensions') ++ for Item in ['Assert_Failure'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'exception', ++ \ 'info': 'GNAT exception.', ++ \ 'kind': 'x', ++ \ 'icase': 1}] ++ endfor ++endif ++ ++" Section: add Ada buildin types {{{2 ++" ++for Item in ['Boolean', 'Integer', 'Natural', 'Positive', 'Float', 'Character', 'Wide_Character', 'Wide_Wide_Character', 'String', 'Wide_String', 'Wide_Wide_String', 'Duration'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'type', ++ \ 'info': 'Ada buildin type.', ++ \ 'kind': 't', ++ \ 'icase': 1}] ++endfor ++ ++" Section: add GNAT buildin types {{{3 ++" ++if exists ('g:ada_gnat_extensions') ++ for Item in ['Short_Integer', 'Short_Short_Integer', 'Long_Integer', 'Long_Long_Integer', 'Short_Float', 'Short_Short_Float', 'Long_Float', 'Long_Long_Float'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'type', ++ \ 'info': 'GNAT buildin type.', ++ \ 'kind': 't', ++ \ 'icase': 1}] ++ endfor ++endif ++ ++" Section: add Ada Attributes {{{2 ++" ++for Item in ['''Access', '''Address', '''Adjacent', '''Aft', '''Alignment', '''Base', '''Bit_Order', '''Body_Version', '''Callable', '''Caller', '''Ceiling', '''Class', '''Component_Size', '''Compose', '''Constrained', '''Copy_Sign', '''Count', '''Definite', '''Delta', '''Denorm', '''Digits', '''Emax', '''Exponent', '''External_Tag', '''Epsilon', '''First', '''First_Bit', '''Floor', '''Fore', '''Fraction', '''Identity', '''Image', '''Input', '''Large', '''Last', '''Last_Bit', '''Leading_Part', '''Length', '''Machine', '''Machine_Emax', '''Machine_Emin', '''Machine_Mantissa', '''Machine_Overflows', '''Machine_Radix', '''Machine_Rounding', '''Machine_Rounds', '''Mantissa', '''Max', '''Max_Size_In_Storage_Elements', '''Min', '''Mod', '''Model', '''Model_Emin', '''Model_Epsilon', '''Model_Mantissa', '''Model_Small', '''Modulus', '''Output', '''Partition_ID', '''Pos', '''Position', '''Pred', '''Priority', '''Range', '''Read', '''Remainder', '''Round', '''Rounding', '''Safe_Emax', '''Safe_First', '''Safe_Large', '''Safe_Last', '''Safe_Small', '''Scale', '''Scaling', '''Signed_Zeros', '''Size', '''Small', '''Storage_Pool', '''Storage_Size', '''Stream_Size', '''Succ', '''Tag', '''Terminated', '''Truncation', '''Unbiased_Rounding', '''Unchecked_Access', '''Val', '''Valid', '''Value', '''Version', '''Wide_Image', '''Wide_Value', '''Wide_Wide_Image', '''Wide_Wide_Value', '''Wide_Wide_Width', '''Wide_Width', '''Width', '''Write'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'attribute', ++ \ 'info': 'Ada attribute.', ++ \ 'kind': 'a', ++ \ 'icase': 1}] ++endfor ++ ++" Section: add GNAT Attributes {{{3 ++" ++if exists ('g:ada_gnat_extensions') ++ for Item in ['''Abort_Signal', '''Address_Size', '''Asm_Input', '''Asm_Output', '''AST_Entry', '''Bit', '''Bit_Position', '''Code_Address', '''Default_Bit_Order', '''Elaborated', '''Elab_Body', '''Elab_Spec', '''Emax', '''Enum_Rep', '''Epsilon', '''Fixed_Value', '''Has_Access_Values', '''Has_Discriminants', '''Img', '''Integer_Value', '''Machine_Size', '''Max_Interrupt_Priority', '''Max_Priority', '''Maximum_Alignment', '''Mechanism_Code', '''Null_Parameter', '''Object_Size', '''Passed_By_Reference', '''Range_Length', '''Storage_Unit', '''Target_Name', '''Tick', '''To_Address', '''Type_Class', '''UET_Address', '''Unconstrained_Array', '''Universal_Literal_String', '''Unrestricted_Access', '''VADS_Size', '''Value_Size', '''Wchar_T_Size', '''Word_Size'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'attribute', ++ \ 'info': 'GNAT attribute.', ++ \ 'kind': 'a', ++ \ 'icase': 1}] ++ endfor ++endif ++ ++" Section: add Ada Pragmas {{{2 ++" ++for Item in ['All_Calls_Remote', 'Assert', 'Assertion_Policy', 'Asynchronous', 'Atomic', 'Atomic_Components', 'Attach_Handler', 'Controlled', 'Convention', 'Detect_Blocking', 'Discard_Names', 'Elaborate', 'Elaborate_All', 'Elaborate_Body', 'Export', 'Import', 'Inline', 'Inspection_Point', 'Interface (Obsolescent)', 'Interrupt_Handler', 'Interrupt_Priority', 'Linker_Options', 'List', 'Locking_Policy', 'Memory_Size (Obsolescent)', 'No_Return', 'Normalize_Scalars', 'Optimize', 'Pack', 'Page', 'Partition_Elaboration_Policy', 'Preelaborable_Initialization', 'Preelaborate', 'Priority', 'Priority_Specific_Dispatching', 'Profile', 'Pure', 'Queueing_Policy', 'Relative_Deadline', 'Remote_Call_Interface', 'Remote_Types', 'Restrictions', 'Reviewable', 'Shared (Obsolescent)', 'Shared_Passive', 'Storage_Size', 'Storage_Unit (Obsolescent)', 'Suppress', 'System_Name (Obsolescent)', 'Task_Dispatching_Policy', 'Unchecked_Union', 'Unsuppress', 'Volatile', 'Volatile_Components'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'pragma', ++ \ 'info': 'Ada pragma.', ++ \ 'kind': 'p', ++ \ 'icase': 1}] ++endfor ++ ++" Section: add GNAT Pragmas {{{3 ++" ++if exists ('g:ada_gnat_extensions') ++ for Item in ['Abort_Defer', 'Ada_83', 'Ada_95', 'Ada_05', 'Annotate', 'Ast_Entry', 'C_Pass_By_Copy', 'Comment', 'Common_Object', 'Compile_Time_Warning', 'Complex_Representation', 'Component_Alignment', 'Convention_Identifier', 'CPP_Class', 'CPP_Constructor', 'CPP_Virtual', 'CPP_Vtable', 'Debug', 'Elaboration_Checks', 'Eliminate', 'Export_Exception', 'Export_Function', 'Export_Object', 'Export_Procedure', 'Export_Value', 'Export_Valued_Procedure', 'Extend_System', 'External', 'External_Name_Casing', 'Finalize_Storage_Only', 'Float_Representation', 'Ident', 'Import_Exception', 'Import_Function', 'Import_Object', 'Import_Procedure', 'Import_Valued_Procedure', 'Initialize_Scalars', 'Inline_Always', 'Inline_Generic', 'Interface_Name', 'Interrupt_State', 'Keep_Names', 'License', 'Link_With', 'Linker_Alias', 'Linker_Section', 'Long_Float', 'Machine_Attribute', 'Main_Storage', 'Obsolescent', 'Passive', 'Polling', 'Profile_Warnings', 'Propagate_Exceptions', 'Psect_Object', 'Pure_Function', 'Restriction_Warnings', 'Source_File_Name', 'Source_File_Name_Project', 'Source_Reference', 'Stream_Convert', 'Style_Checks', 'Subtitle', 'Suppress_All', 'Suppress_Exception_Locations', 'Suppress_Initialization', 'Task_Info', 'Task_Name', 'Task_Storage', 'Thread_Body', 'Time_Slice', 'Title', 'Unimplemented_Unit', 'Universal_Data', 'Unreferenced', 'Unreserve_All_Interrupts', 'Use_VADS_Size', 'Validity_Checks', 'Warnings', 'Weak_External'] ++ let g:ada#Keywords += [{ ++ \ 'word': Item, ++ \ 'menu': 'pragma', ++ \ 'info': 'GNAT pragma.', ++ \ 'kind': 'p', ++ \ 'icase': 1}] ++ endfor ++endif ++" 1}}} ++ ++" Section: g:ada#Ctags_Kinds {{{1 ++" ++let g:ada#Ctags_Kinds = { ++ \ 'P': ["packspec", "package specifications"], ++ \ 'p': ["package", "packages"], ++ \ 'T': ["typespec", "type specifications"], ++ \ 't': ["type", "types"], ++ \ 'U': ["subspec", "subtype specifications"], ++ \ 'u': ["subtype", "subtypes"], ++ \ 'c': ["component", "record type components"], ++ \ 'l': ["literal", "enum type literals"], ++ \ 'V': ["varspec", "variable specifications"], ++ \ 'v': ["variable", "variables"], ++ \ 'f': ["formal", "generic formal parameters"], ++ \ 'n': ["constant", "constants"], ++ \ 'x': ["exception", "user defined exceptions"], ++ \ 'R': ["subprogspec", "subprogram specifications"], ++ \ 'r': ["subprogram", "subprograms"], ++ \ 'K': ["taskspec", "task specifications"], ++ \ 'k': ["task", "tasks"], ++ \ 'O': ["protectspec", "protected data specifications"], ++ \ 'o': ["protected", "protected data"], ++ \ 'E': ["entryspec", "task/protected data entry specifications"], ++ \ 'e': ["entry", "task/protected data entries"], ++ \ 'b': ["label", "labels"], ++ \ 'i': ["identifier", "loop/declare identifiers"], ++ \ 'a': ["autovar", "automatic variables"], ++ \ 'y': ["annon", "loops and blocks with no identifier"]} ++ ++" Section: ada#Word (...) {{{1 ++" ++" Extract current Ada word across multiple lines ++" AdaWord ([line, column])\ ++" ++function ada#Word (...) ++ if a:0 > 1 ++ let l:Line_Nr = a:1 ++ let l:Column_Nr = a:2 - 1 ++ else ++ let l:Line_Nr = line('.') ++ let l:Column_Nr = col('.') - 1 ++ endif ++ ++ let l:Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' ) ++ ++ " Cope with tag searching for items in comments; if we are, don't loop ++ " backards looking for previous lines ++ if l:Column_Nr > strlen(l:Line) ++ " We were in a comment ++ let l:Line = getline(l:Line_Nr) ++ let l:Search_Prev_Lines = 0 ++ else ++ let l:Search_Prev_Lines = 1 ++ endif ++ ++ " Go backwards until we find a match (Ada ID) that *doesn't* include our ++ " location - i.e., the previous ID. This is because the current 'correct' ++ " match will toggle matching/not matching as we traverse characters ++ " backwards. Thus, we have to find the previous unrelated match, exclude ++ " it, then use the next full match (ours). ++ " Remember to convert vim column 'l:Column_Nr' [1..n] to string offset [0..(n-1)] ++ " ... but start, here, one after the required char. ++ let l:New_Column = l:Column_Nr + 1 ++ while 1 ++ let l:New_Column = l:New_Column - 1 ++ if l:New_Column < 0 ++ " Have to include previous l:Line from file ++ let l:Line_Nr = l:Line_Nr - 1 ++ if l:Line_Nr < 1 || !l:Search_Prev_Lines ++ " Start of file or matching in a comment ++ let l:Line_Nr = 1 ++ let l:New_Column = 0 ++ let l:Our_Match = match (l:Line, g:ada#WordRegex ) ++ break ++ endif ++ " Get previous l:Line, and prepend it to our search string ++ let l:New_Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' ) ++ let l:New_Column = strlen (l:New_Line) - 1 ++ let l:Column_Nr = l:Column_Nr + l:New_Column ++ let l:Line = l:New_Line . l:Line ++ endif ++ " Check to see if this is a match excluding 'us' ++ let l:Match_End = l:New_Column + ++ \ matchend (strpart (l:Line,l:New_Column), g:ada#WordRegex ) - 1 ++ if l:Match_End >= l:New_Column && ++ \ l:Match_End < l:Column_Nr ++ " Yes ++ let l:Our_Match = l:Match_End+1 + ++ \ match (strpart (l:Line,l:Match_End+1), g:ada#WordRegex ) ++ break ++ endif ++ endwhile ++ ++ " Got anything? ++ if l:Our_Match < 0 ++ return '' ++ else ++ let l:Line = strpart (l:Line, l:Our_Match) ++ endif ++ ++ " Now simply add further lines until the match gets no bigger ++ let l:Match_String = matchstr (l:Line, g:ada#WordRegex) ++ let l:Last_Line = line ('$') ++ let l:Line_Nr = line ('.') + 1 ++ while l:Line_Nr <= l:Last_Line ++ let l:Last_Match = l:Match_String ++ let l:Line = l:Line . ++ \ substitute (getline (l:Line_Nr), g:ada#Comment, '', '') ++ let l:Match_String = matchstr (l:Line, g:ada#WordRegex) ++ if l:Match_String == l:Last_Match ++ break ++ endif ++ endwhile ++ ++ " Strip whitespace & return ++ return substitute (l:Match_String, '\s\+', '', 'g') ++endfunction ada#Word ++ ++" Section: ada#List_Tag (...) {{{1 ++" ++" List tags in quickfix window ++" ++function ada#List_Tag (...) ++ if a:0 > 1 ++ let l:Tag_Word = ada#Word (a:1, a:2) ++ elseif a:0 > 0 ++ let l:Tag_Word = a:1 ++ else ++ let l:Tag_Word = ada#Word () ++ endif ++ ++ echo "Searching for" l:Tag_Word ++ ++ let l:Pattern = '^' . l:Tag_Word . '$' ++ let l:Tag_List = taglist (l:Pattern) ++ let l:Error_List = [] ++ " ++ " add symbols ++ " ++ for Tag_Item in l:Tag_List ++ if l:Tag_Item['kind'] == '' ++ let l:Tag_Item['kind'] = 's' ++ endif ++ ++ let l:Error_List += [ ++ \ l:Tag_Item['filename'] . '|' . ++ \ l:Tag_Item['cmd'] . '|' . ++ \ l:Tag_Item['kind'] . "\t" . ++ \ l:Tag_Item['name'] ] ++ endfor ++ set errorformat=%f\|%l\|%m ++ cexpr l:Error_List ++ cwindow ++endfunction ada#List_Tag ++ ++" Section: ada#Jump_Tag (Word, Mode) {{{1 ++" ++" Word tag - include '.' and if Ada make uppercase ++" ++function ada#Jump_Tag (Word, Mode) ++ if a:Word == '' ++ " Get current word ++ let l:Word = ada#Word() ++ if l:Word == '' ++ throw "NOT_FOUND: no identifier found." ++ endif ++ else ++ let l:Word = a:Word ++ endif ++ ++ echo "Searching for " . l:Word ++ ++ try ++ execute a:Mode l:Word ++ catch /.*:E426:.*/ ++ let ignorecase = &ignorecase ++ set ignorecase ++ execute a:Mode l:Word ++ let &ignorecase = ignorecase ++ endtry ++ ++ return ++endfunction ada#Jump_Tag ++ ++" Section: ada#Insert_Backspace () {{{1 ++" ++" Backspace at end of line after auto-inserted commentstring '-- ' wipes it ++" ++function ada#Insert_Backspace () ++ let l:Line = getline ('.') ++ if col ('.') > strlen (l:Line) && ++ \ match (l:Line, '-- $') != -1 && ++ \ match (&comments,'--') != -1 ++ return "\\\" ++ else ++ return "\" ++ endif ++ ++ return ++endfunction ada#InsertBackspace ++ ++" Section: Insert Completions {{{1 ++" ++" Section: ada#User_Complete(findstart, base) {{{2 ++" ++" This function is used for the 'complete' option. ++" ++function! ada#User_Complete(findstart, base) ++ if a:findstart == 1 ++ " ++ " locate the start of the word ++ " ++ let line = getline ('.') ++ let start = col ('.') - 1 ++ while start > 0 && line[start - 1] =~ '\i\|''' ++ let start -= 1 ++ endwhile ++ return start ++ else ++ " ++ " look up matches ++ " ++ let l:Pattern = '^' . a:base . '.*$' ++ " ++ " add keywords ++ " ++ for Tag_Item in g:ada#Keywords ++ if l:Tag_Item['word'] =~? l:Pattern ++ if complete_add (l:Tag_Item) == 0 ++ return [] ++ endif ++ if complete_check () ++ return [] ++ endif ++ endif ++ endfor ++ return [] ++ endif ++endfunction ada#User_Complete ++ ++" Section: ada#Completion (cmd) {{{2 ++" ++" Word completion (^N/^R/^X^]) - force '.' inclusion ++function ada#Completion (cmd) ++ set iskeyword+=46 ++ return a:cmd . "\=ada#Completion_End ()\" ++endfunction ada#Completion ++ ++" Section: ada#Completion_End () {{{2 ++" ++function ada#Completion_End () ++ set iskeyword-=46 ++ return '' ++endfunction ada#Completion_End ++ ++" Section: ada#Create_Tags {{{1 ++" ++function ada#Create_Tags (option) ++ if a:option == 'file' ++ let l:Filename = fnamemodify (bufname ('%'), ':p') ++ elseif a:option == 'dir' ++ let l:Filename = ++ \ fnamemodify (bufname ('%'), ':p:h') . "*.ada " . ++ \ fnamemodify (bufname ('%'), ':p:h') . "*.adb " . ++ \ fnamemodify (bufname ('%'), ':p:h') . "*.ads" ++ else ++ let l:Filename = a:option ++ endif ++ execute '!ctags --excmd=number ' . l:Filename ++endfunction ada#Create_Tags ++ ++" Section: ada#Switch_Session {{{1 ++" ++function ada#Switch_Session (New_Session) ++ " ++ " you should not save to much date into the seession since they will ++ " be sourced ++ " ++ set sessionoptions=buffers,curdir,folds,globals,resize,slash,tabpages,tabpages,unix,winpos,winsize ++ ++ if a:New_Session != v:this_session ++ " ++ " We actualy got a new session - otherwise there ++ " is nothing to do. ++ " ++ if strlen (v:this_session) > 0 ++ execute 'mksession! ' . v:this_session ++ endif ++ ++ let v:this_session = a:New_Session ++ ++ "if filereadable (v:this_session) ++ "execute 'source ' . v:this_session ++ "endif ++ ++ augroup ada_session ++ autocmd! ++ autocmd VimLeavePre * execute 'mksession! ' . v:this_session ++ augroup END ++ " ++ "if exists ("g:Tlist_Auto_Open") && g:Tlist_Auto_Open ++ "TlistOpen ++ "endif ++ ++ endif ++ ++ return ++endfunction ada#Switch_Session ++ ++" Section: GNAT Pretty Printer folding {{{1 ++" ++if exists('g:ada_folding') && g:ada_folding[0] == 'g' ++ " ++ " Lines consisting only of ')' ';' are due to a gnat pretty bug and ++ " have the same level as the line above (can't happen in the first ++ " line). ++ " ++ let s:Fold_Collate = '^\([;)]*$\|' ++ ++ " ++ " some lone statements are folded with the line above ++ " ++ if stridx (g:ada_folding, 'i') >= 0 ++ let s:Fold_Collate .= '\s\+\$\|' ++ endif ++ if stridx (g:ada_folding, 'b') >= 0 ++ let s:Fold_Collate .= '\s\+\$\|' ++ endif ++ if stridx (g:ada_folding, 'p') >= 0 ++ let s:Fold_Collate .= '\s\+\$\|' ++ endif ++ if stridx (g:ada_folding, 'x') >= 0 ++ let s:Fold_Collate .= '\s\+\$\|' ++ endif ++ ++ " We also handle empty lines and ++ " comments here. ++ let s:Fold_Collate .= '--\)' ++ ++ function ada#Pretty_Print_Folding (Line) " {{{2 ++ let l:Text = getline (a:Line) ++ ++ if l:Text =~ s:Fold_Collate ++ " ++ " fold with line above ++ " ++ let l:Level = "=" ++ elseif l:Text =~ '^\s\+(' ++ " ++ " gnat outdents a line which stards with a ( by one characters so ++ " that parameters which follow are aligned. ++ " ++ let l:Level = (indent (a:Line) + 1) / &shiftwidth ++ else ++ let l:Level = indent (a:Line) / &shiftwidth ++ endif ++ ++ return l:Level ++ endfunction ada#Pretty_Print_Folding " }}}2 ++endif ++ ++" Section: Options and Menus {{{1 ++" ++" Section: ada#Switch_Syntax_Options {{{2 ++" ++function ada#Switch_Syntax_Option (option) ++ syntax off ++ if exists ('g:ada_' . a:option) ++ unlet g:ada_{a:option} ++ echo a:option . 'now off' ++ else ++ let g:ada_{a:option}=1 ++ echo a:option . 'now on' ++ endif ++ syntax on ++endfunction ada#Switch_Syntax_Option ++ ++" Section: ada#Map_Menu {{{2 ++" ++function ada#Map_Menu (Text, Keys, Command) ++ if a:Keys[0] == ':' ++ execute ++ \ "50amenu " . ++ \ "Ada." . escape(a:Text, ' ') . ++ \ "" . a:Keys . ++ \ " :" . a:Command . "" ++ execute ++ \ "command -buffer " . ++ \ a:Keys[1:] . ++ \" :" . a:Command . "" ++ elseif a:Keys[0] == '<' ++ execute ++ \ "50amenu " . ++ \ "Ada." . escape(a:Text, ' ') . ++ \ "" . a:Keys . ++ \ " :" . a:Command . "" ++ execute ++ \ "nnoremap " . ++ \ a:Keys . ++ \" :" . a:Command . "" ++ execute ++ \ "inoremap " . ++ \ a:Keys . ++ \" :" . a:Command . "" ++ else ++ if exists("g:mapleader") ++ let l:leader = g:mapleader ++ else ++ let l:leader = '\' ++ endif ++ execute ++ \ "50amenu " . ++ \ "Ada." . escape(a:Text, ' ') . ++ \ "" . escape(l:leader . "a" . a:Keys , '\') . ++ \ " :" . a:Command . "" ++ execute ++ \ "nnoremap " . ++ \ escape(l:leader . "a" . a:Keys , '\') . ++ \" :" . a:Command ++ execute ++ \ "inoremap " . ++ \ escape(l:leader . "a" . a:Keys , '\') . ++ \" :" . a:Command ++ endif ++ return ++endfunction ++ ++" Section: ada#Map_Popup {{{2 ++" ++function ada#Map_Popup (Text, Keys, Command) ++ if exists("g:mapleader") ++ let l:leader = g:mapleader ++ else ++ let l:leader = '\' ++ endif ++ execute ++ \ "50amenu " . ++ \ "PopUp." . escape(a:Text, ' ') . ++ \ "" . escape(l:leader . "a" . a:Keys , '\') . ++ \ " :" . a:Command . "" ++ ++ call ada#Map_Menu (a:Text, a:Keys, a:Command) ++ return ++endfunction ada#Map_Popup ++ ++" }}}1 ++ ++lockvar g:ada#WordRegex ++lockvar g:ada#DotWordRegex ++lockvar g:ada#Comment ++lockvar! g:ada#Keywords ++lockvar! g:ada#Ctags_Kinds ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/autoload/.svn/text-base/decada.vim.svn-base vim71_ada/1/autoload/.svn/text-base/decada.vim.svn-base +--- vim71/1/autoload/.svn/text-base/decada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/text-base/decada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,75 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada/Dec Ada compiler file ++" Language: Ada (Dec Ada) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL$ ++" History: 21.07.2006 MK New Dec Ada ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested not to use include protection for ++" autoload ++" 05.11.2006 MK Bram suggested to save on spaces ++" Help Page: compiler-decada ++"------------------------------------------------------------------------------ ++ ++if version < 700 ++ finish ++endif ++ ++function decada#Unit_Name () dict " {{{1 ++ " Convert filename into acs unit: ++ " 1: remove the file extenstion. ++ " 2: replace all double '_' or '-' with an dot (which denotes a separate) ++ " 3: remove a trailing '_' (wich denotes a specification) ++ return substitute (substitute (expand ("%:t:r"), '__\|-', ".", "g"), '_$', "", '') ++endfunction decada#Unit_Name " }}}1 ++ ++function decada#Make () dict " {{{1 ++ let l:make_prg = substitute (g:self.Make_Command, '%<', self.Unit_Name(), '') ++ let &errorformat = g:self.Error_Format ++ let &makeprg = l:make_prg ++ wall ++ make ++ copen ++ set wrap ++ wincmd W ++endfunction decada#Build " }}}1 ++ ++function decada#Set_Session (...) dict " {{{1 ++ if a:0 > 0 ++ call ada#Switch_Session (a:1) ++ elseif argc() == 0 && strlen (v:servername) > 0 ++ call ada#Switch_Session ( ++ \ expand('~')[0:-2] . ".vimfiles.session]decada_" . ++ \ v:servername . ".vim") ++ endif ++ return ++endfunction decada#Set_Session " }}}1 ++ ++function decada#New () " }}}1 ++ let Retval = { ++ \ 'Make' : function ('decada#Make'), ++ \ 'Unit_Name' : function ('decada#Unit_Name'), ++ \ 'Set_Session' : function ('decada#Set_Session'), ++ \ 'Project_Dir' : '', ++ \ 'Make_Command' : 'ACS COMPILE /Wait /Log /NoPreLoad /Optimize=Development /Debug %<', ++ \ 'Error_Format' : '%+A%%ADAC-%t-%m,%C %#%m,%Zat line number %l in file %f,' . ++ \ '%+I%%ada-I-%m,%C %#%m,%Zat line number %l in file %f'} ++ ++ return Retval ++endfunction decada#New " }}}1 ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/autoload/.svn/text-base/gnat.vim.svn-base vim71_ada/1/autoload/.svn/text-base/gnat.vim.svn-base +--- vim71/1/autoload/.svn/text-base/gnat.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/autoload/.svn/text-base/gnat.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,147 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada/GNAT compiler file ++" Language: Ada (GNAT) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischi k ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL$ ++" History: 24.05.2006 MK Unified Headers ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 05.08.2006 MK Add session support ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested not to use include protection for ++" autoload ++" 05.11.2006 MK Bram suggested to save on spaces ++" 19.09.2007 NO use project file only when there is a project ++" Help Page: compiler-gnat ++"------------------------------------------------------------------------------ ++ ++if version < 700 ++ finish ++endif ++ ++function gnat#Make () dict " {{{1 ++ let &l:makeprg = self.Get_Command('Make') ++ let &l:errorformat = self.Error_Format ++ wall ++ make ++ copen ++ set wrap ++ wincmd W ++endfunction gnat#Make " }}}1 ++ ++function gnat#Pretty () dict " {{{1 ++ execute "!" . self.Get_Command('Pretty') ++endfunction gnat#Make " }}}1 ++ ++function gnat#Find () dict " {{{1 ++ execute "!" . self.Get_Command('Find') ++endfunction gnat#Find " }}}1 ++ ++function gnat#Tags () dict " {{{1 ++ execute "!" . self.Get_Command('Tags') ++ edit tags ++ call gnat#Insert_Tags_Header () ++ update ++ quit ++endfunction gnat#Tags " }}}1 ++ ++function gnat#Set_Project_File (...) dict " {{{1 ++ if a:0 > 0 ++ let self.Project_File = a:1 ++ ++ if ! filereadable (self.Project_File) ++ let self.Project_File = findfile ( ++ \ fnamemodify (self.Project_File, ':r'), ++ \ $ADA_PROJECT_PATH, ++ \ 1) ++ endif ++ elseif strlen (self.Project_File) > 0 ++ let self.Project_File = browse (0, 'GNAT Project File?', '', self.Project_File) ++ elseif expand ("%:e") == 'gpr' ++ let self.Project_File = browse (0, 'GNAT Project File?', '', expand ("%:e")) ++ else ++ let self.Project_File = browse (0, 'GNAT Project File?', '', 'default.gpr') ++ endif ++ ++ if strlen (v:this_session) > 0 ++ execute 'mksession! ' . v:this_session ++ endif ++ ++ "if strlen (self.Project_File) > 0 ++ "if has("vms") ++ "call ada#Switch_Session ( ++ "\ expand('~')[0:-2] . ".vimfiles.session]gnat_" . ++ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") ++ "else ++ "call ada#Switch_Session ( ++ "\ expand('~') . "/vimfiles/session/gnat_" . ++ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") ++ "endif ++ "else ++ "call ada#Switch_Session ('') ++ "endif ++ ++ return ++endfunction gnat#Set_Project_File " }}}1 ++ ++function gnat#Get_Command (Command) dict " {{{1 ++ let l:Command = eval ('self.' . a:Command . '_Command') ++ return eval (l:Command) ++endfunction gnat#Get_Command " }}}1 ++ ++function gnat#Set_Session (...) dict " {{{1 ++ if argc() == 1 && fnamemodify (argv(0), ':e') == 'gpr' ++ call self.Set_Project_File (argv(0)) ++ elseif strlen (v:servername) > 0 ++ call self.Set_Project_File (v:servername . '.gpr') ++ endif ++endfunction gnat#Set_Session " }}}1 ++ ++function gnat#New () " {{{1 ++ let l:Retval = { ++ \ 'Make' : function ('gnat#Make'), ++ \ 'Pretty' : function ('gnat#Pretty'), ++ \ 'Find' : function ('gnat#Find'), ++ \ 'Tags' : function ('gnat#Tags'), ++ \ 'Set_Project_File' : function ('gnat#Set_Project_File'), ++ \ 'Set_Session' : function ('gnat#Set_Session'), ++ \ 'Get_Command' : function ('gnat#Get_Command'), ++ \ 'Project_File' : '', ++ \ 'Make_Command' : '"gnat make -P " . self.Project_File . " -F -gnatef "', ++ \ 'Pretty_Command' : '"gnat pretty -P " . self.Project_File . " "', ++ \ 'Find_Program' : '"gnat find -P " . self.Project_File . " -F "', ++ \ 'Tags_Command' : '"gnat xref -P " . self.Project_File . " -v *.AD*"', ++ \ 'Error_Format' : '%f:%l:%c: %trror: %m,' . ++ \ '%f:%l:%c: %tarning: %m,' . ++ \ '%f:%l:%c: (%ttyle) %m'} ++ ++ return l:Retval ++endfunction gnat#New " }}}1 ++ ++function gnat#Insert_Tags_Header () " {{{1 ++ 1insert ++!_TAG_FILE_FORMAT 1 /extended format; --format=1 will not append ;" to lines/ ++!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ ++!_TAG_PROGRAM_AUTHOR AdaCore /info@adacore.com/ ++!_TAG_PROGRAM_NAME gnatxref // ++!_TAG_PROGRAM_URL http://www.adacore.com /official site/ ++!_TAG_PROGRAM_VERSION 5.05w // ++. ++ return ++endfunction gnat#Insert_Tags_Header " }}}1 ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=0 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/colors/.svn/all-wcprops vim71_ada/1/colors/.svn/all-wcprops +--- vim71/1/colors/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/colors/.svn/all-wcprops 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,5 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 51 ++/svnroot/gnuada/!svn/ver/818/trunk/tools/vim/colors ++END +diff -urN vim71/1/colors/.svn/dir-prop-base vim71_ada/1/colors/.svn/dir-prop-base +--- vim71/1/colors/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/colors/.svn/dir-prop-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,6 @@ ++K 10 ++svn:ignore ++V 9 ++.backups ++ ++END +diff -urN vim71/1/colors/.svn/entries vim71_ada/1/colors/.svn/entries +--- vim71/1/colors/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/colors/.svn/entries 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,28 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/colors ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-12-03T21:21:48.223203Z ++818 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ +diff -urN vim71/1/colors/.svn/format vim71_ada/1/colors/.svn/format +--- vim71/1/colors/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/colors/.svn/format 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/compiler/decada.vim vim71_ada/1/compiler/decada.vim +--- vim71/1/compiler/decada.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/compiler/decada.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,55 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada/Dec Ada compiler file ++" Language: Ada (Dec Ada) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ ++" History: 21.07.2006 MK New Dec Ada ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 08.09.2006 MK Correct double load protection. ++" Help Page: compiler-decada ++"------------------------------------------------------------------------------ ++ ++if (exists("current_compiler") && ++ \ current_compiler == "decada") || ++ \ version < 700 ++ finish ++endif ++ ++let current_compiler = "decada" ++ ++if !exists("g:decada") ++ let g:decada = decada#New () ++ ++ call ada#Map_Menu ( ++ \'Dec Ada.Build', ++ \'', ++ \'call decada.Make ()') ++ ++ call g:decada.Set_Session () ++endif ++ ++if exists(":CompilerSet") != 2 ++ " ++ " plugin loaded by other means then the "compiler" command ++ " ++ command -nargs=* CompilerSet setlocal ++endif ++ ++execute "CompilerSet makeprg=" . escape (g:decada.Make_Command, ' ') ++execute "CompilerSet errorformat=" . escape (g:decada.Error_Format, ' ') ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/compiler/gnat.vim vim71_ada/1/compiler/gnat.vim +--- vim71/1/compiler/gnat.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/compiler/gnat.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,73 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada/GNAT compiler file ++" Language: Ada (GNAT) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischi k ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ ++" History: 24.05.2006 MK Unified Headers ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 19.09.2007 NO use project file only when there is a project ++" Help Page: compiler-gnat ++"------------------------------------------------------------------------------ ++ ++if (exists("current_compiler") && ++ \ current_compiler == "gnat") || ++ \ version < 700 ++ finish ++endif ++ ++let current_compiler = "gnat" ++ ++if !exists("g:gnat") ++ let g:gnat = gnat#New () ++ ++ call ada#Map_Menu ( ++ \ 'GNAT.Build', ++ \ '', ++ \ 'call gnat.Make ()') ++ call ada#Map_Menu ( ++ \ 'GNAT.Pretty Print', ++ \ ':GnatPretty', ++ \ 'call gnat.Pretty ()') ++ call ada#Map_Menu ( ++ \ 'GNAT.Tags', ++ \ ':GnatTags', ++ \ 'call gnat.Tags ()') ++ call ada#Map_Menu ( ++ \ 'GNAT.Find', ++ \ ':GnatFind', ++ \ 'call gnat.Find ()') ++ call ada#Map_Menu ( ++ \ 'GNAT.Set Projectfile\.\.\.', ++ \ ':SetProject', ++ \ 'call gnat.Set_Project_File ()') ++ ++ call g:gnat.Set_Session () ++endif ++ ++if exists(":CompilerSet") != 2 ++ " ++ " plugin loaded by other means then the "compiler" command ++ " ++ command -nargs=* CompilerSet setlocal ++endif ++ ++execute "CompilerSet makeprg=" . escape (g:gnat.Get_Command('Make'), ' ') ++execute "CompilerSet errorformat=" . escape (g:gnat.Error_Format, ' ') ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=0 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/compiler/.svn/all-wcprops vim71_ada/1/compiler/.svn/all-wcprops +--- vim71/1/compiler/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/compiler/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 53 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/compiler ++END ++gnat.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 62 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/compiler/gnat.vim ++END ++decada.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 64 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/compiler/decada.vim ++END +diff -urN vim71/1/compiler/.svn/dir-prop-base vim71_ada/1/compiler/.svn/dir-prop-base +--- vim71/1/compiler/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/compiler/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,6 @@ ++K 10 ++svn:ignore ++V 9 ++.backups ++ ++END +diff -urN vim71/1/compiler/.svn/entries vim71_ada/1/compiler/.svn/entries +--- vim71/1/compiler/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/compiler/.svn/entries 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,54 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ ++gnat.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++1429fc395240f10289ac4836746ac1ba ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ ++decada.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++5c01783740adbd6492b7197377e85d74 ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ +diff -urN vim71/1/compiler/.svn/format vim71_ada/1/compiler/.svn/format +--- vim71/1/compiler/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/compiler/.svn/format 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/compiler/.svn/prop-base/decada.vim.svn-base vim71_ada/1/compiler/.svn/prop-base/decada.vim.svn-base +--- vim71/1/compiler/.svn/prop-base/decada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/compiler/.svn/prop-base/decada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/compiler/.svn/prop-base/gnat.vim.svn-base vim71_ada/1/compiler/.svn/prop-base/gnat.vim.svn-base +--- vim71/1/compiler/.svn/prop-base/gnat.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/compiler/.svn/prop-base/gnat.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/compiler/.svn/text-base/decada.vim.svn-base vim71_ada/1/compiler/.svn/text-base/decada.vim.svn-base +--- vim71/1/compiler/.svn/text-base/decada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/compiler/.svn/text-base/decada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,55 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada/Dec Ada compiler file ++" Language: Ada (Dec Ada) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL$ ++" History: 21.07.2006 MK New Dec Ada ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 08.09.2006 MK Correct double load protection. ++" Help Page: compiler-decada ++"------------------------------------------------------------------------------ ++ ++if (exists("current_compiler") && ++ \ current_compiler == "decada") || ++ \ version < 700 ++ finish ++endif ++ ++let current_compiler = "decada" ++ ++if !exists("g:decada") ++ let g:decada = decada#New () ++ ++ call ada#Map_Menu ( ++ \'Dec Ada.Build', ++ \'', ++ \'call decada.Make ()') ++ ++ call g:decada.Set_Session () ++endif ++ ++if exists(":CompilerSet") != 2 ++ " ++ " plugin loaded by other means then the "compiler" command ++ " ++ command -nargs=* CompilerSet setlocal ++endif ++ ++execute "CompilerSet makeprg=" . escape (g:decada.Make_Command, ' ') ++execute "CompilerSet errorformat=" . escape (g:decada.Error_Format, ' ') ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/compiler/.svn/text-base/gnat.vim.svn-base vim71_ada/1/compiler/.svn/text-base/gnat.vim.svn-base +--- vim71/1/compiler/.svn/text-base/gnat.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/compiler/.svn/text-base/gnat.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,73 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada/GNAT compiler file ++" Language: Ada (GNAT) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischi k ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL$ ++" History: 24.05.2006 MK Unified Headers ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 19.09.2007 NO use project file only when there is a project ++" Help Page: compiler-gnat ++"------------------------------------------------------------------------------ ++ ++if (exists("current_compiler") && ++ \ current_compiler == "gnat") || ++ \ version < 700 ++ finish ++endif ++ ++let current_compiler = "gnat" ++ ++if !exists("g:gnat") ++ let g:gnat = gnat#New () ++ ++ call ada#Map_Menu ( ++ \ 'GNAT.Build', ++ \ '', ++ \ 'call gnat.Make ()') ++ call ada#Map_Menu ( ++ \ 'GNAT.Pretty Print', ++ \ ':GnatPretty', ++ \ 'call gnat.Pretty ()') ++ call ada#Map_Menu ( ++ \ 'GNAT.Tags', ++ \ ':GnatTags', ++ \ 'call gnat.Tags ()') ++ call ada#Map_Menu ( ++ \ 'GNAT.Find', ++ \ ':GnatFind', ++ \ 'call gnat.Find ()') ++ call ada#Map_Menu ( ++ \ 'GNAT.Set Projectfile\.\.\.', ++ \ ':SetProject', ++ \ 'call gnat.Set_Project_File ()') ++ ++ call g:gnat.Set_Session () ++endif ++ ++if exists(":CompilerSet") != 2 ++ " ++ " plugin loaded by other means then the "compiler" command ++ " ++ command -nargs=* CompilerSet setlocal ++endif ++ ++execute "CompilerSet makeprg=" . escape (g:gnat.Get_Command('Make'), ' ') ++execute "CompilerSet errorformat=" . escape (g:gnat.Error_Format, ' ') ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=0 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/doc/ft_ada.txt vim71_ada/1/doc/ft_ada.txt +--- vim71/1/doc/ft_ada.txt 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/ft_ada.txt 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,516 @@ ++*ft_ada.txt* Ada File type Plug-ins Last change: 2007 Seb 17 ++ ++ ++ ADA FILE TYPE PLUG-INS REFERENCE MANUAL~ ++ ++ADA *ada.vim* ++ ++1. Syntax Highlighting |ft-ada-syntax| ++2. Plug-in |ft-ada-plugin| ++3. Omni Completion |ft-ada-omni| ++ 3.1 Omni Completion with "gnat xref" |gnat-xref| ++ 3.2 Omni Completion with "ctags" |ada-ctags| ++4. Compiler Support |ada-compiler| ++ 4.1 GNAT |compiler-gnat| ++ 4.1 Dec Ada |compiler-decada| ++5. References |ada-reference| ++ 5.1 Options |ft-ada-options| ++ 5.2 Functions |ft-ada-functions| ++ 5.3 Commands |ft-ada-commands| ++ 5.4 Variables |ft-ada-variables| ++ 5.5 Constants |ft-ada-contstants| ++8. Extra Plug-ins |ada-extra-plugins| ++ ++============================================================================== ++1. Syntax Highlighting ~ ++ *ft-ada-syntax* ++ ++This mode is designed for the 2005 edition of Ada ("Ada 2005"), which includes ++support for objected-programming, protected types, and so on. It handles code ++written for the original Ada language ("Ada83", "Ada87", "Ada95") as well, ++though code which uses Ada 2005-only keywords will be wrongly colored (such ++code should be fixed anyway). For more information about Ada, see ++http://www.adapower.com. ++ ++The Ada mode handles a number of situations cleanly. ++ ++For example, it knows that the "-" in "-5" is a number, but the same character ++in "A-5" is an operator. Normally, a "with" or "use" clause referencing ++another compilation unit is coloured the same way as C's "#include" is coloured. ++If you have "Conditional" or "Repeat" groups coloured differently, then "end ++if" and "end loop" will be coloured as part of those respective groups. ++ ++You can set these to different colours using vim's "highlight" command (e.g., ++to change how loops are displayed, enter the command ":hi Repeat" followed by ++the colour specification; on simple terminals the colour specification ++ctermfg=White often shows well). ++ ++There are several options you can select in this Ada mode. See|ft-ada-options| ++for a complete list. ++ ++To enable them, assign a value to the option. For example, to turn one on: ++ > ++ > let g:ada_standard_types = 1 ++> ++To disable them use ":unlet". Example: ++> ++ > unlet g:ada_standard_types ++ ++You can just use ":" and type these into the command line to set these ++temporarily before loading an Ada file. You can make these option settings ++permanent by adding the "let" command(s), without a colon, to your "~/.vimrc" ++file. ++ ++Even on a slow (90Mhz) PC this mode works quickly, but if you find the ++performance unacceptable, turn on |g:ada_withuse_ordinary|. ++ ++Syntax folding instructions (|fold-syntax|) are added when |g:ada_folding| is ++set. ++ ++============================================================================== ++2. File type Plug-in ~ ++ *ft-ada-indent* *ft-ada-plugin* ++ ++The Ada plug-in provides support for: ++ ++ - auto indenting (|indent.txt|) ++ - insert completion (|i_CTRL-N|) ++ - user completion (|i_CTRL-X_CTRL-U|) ++ - tag searches (|tagsrch.txt|) ++ - Quick Fix (|quickfix.txt|) ++ - backspace handling (|'backspace'|) ++ - comment handling (|'comments'|, |'commentstring'|) ++ ++The plug-in only activates the features of the Ada mode whenever an Ada ++files is opened and add adds Ada related entries to the main and pop-up menu. ++ ++============================================================================== ++3. Omni Completion ~ ++ *ft-ada-omni* ++ ++The Ada omni-completions (|i_CTRL-X_CTRL-O|) uses tags database created either ++by "gnat xref -v" or the "exuberant Ctags (http://ctags.sourceforge.net). The ++complete function will automatically detect which tool was used to create the ++tags file. ++ ++------------------------------------------------------------------------------ ++3.1 Omni Completion with "gnat xref" ~ ++ *gnat-xref* ++ ++GNAT XREF uses the compiler internal information (ali-files) to produce the ++tags file. This has the advantage to be 100% correct and the option of deep ++nested analysis. However the code must compile, the generator is quite ++slow and the created tags file contains only the basic Ctags information for ++each entry - not enough for some of the more advanced Vim code browser ++plug-ins. ++ ++NOTE: "gnat xref -v" is very tricky to use as it has almost no diagnostic ++ output - If nothing is printed then usually the parameters are wrong. ++ Here some important tips: ++ ++1) You need to compile your code first and use the "-aO" option to point to ++ your .ali files. ++2) "gnat xref -v ../Include/adacl.ads" won't work - use the "gnat xref -v ++ -aI../Include adacl.ads" instead. ++3) "gnat xref -v -aI../Include *.ad?" won't work - use "cd ../Include" and ++ then "gnat xref -v *.ad?" ++4) Project manager support is completely broken - don't even try "gnat xref ++ -Padacl.gpr". ++5) VIM is faster when the tags file is sorted - use "sort --unique ++ --ignore-case --output=tags tags" . ++6) Remember to insert "!_TAG_FILE_SORTED 2 %sort ui" as first line to mark ++ the file assorted. ++ ++------------------------------------------------------------------------------ ++3.2 Omni Completion with "ctags"~ ++ *ada-ctags* ++ ++Exuberant Ctags uses it's own multi-language code parser. The parser is quite ++fast, produces a lot of extra informations (hence the name "Exuberant Ctags") ++and can run on files which currently do not compile. ++ ++There are also lots of other Vim-tools which use exuberant Ctags. ++ ++You will need to install a version of the Exuberant Ctags which has Ada ++support patched in. Such a version is available from the GNU Ada Project ++(http://gnuada.sourceforge.net). ++ ++The Ada parser for Exuberant Ctags is fairly new - don't expect complete ++support yet. ++ ++============================================================================== ++4. Compiler Support ~ ++ *ada-compiler* ++ ++The Ada mode supports more then one Ada compiler and will automatically load the ++compiler set in|g:ada_default_compiler|whenever an Ada source is opened. The ++provided compiler plug-ins are split into the actual compiler plug-in and a ++collection of support functions and variables. This allows the easy ++development of specialized compiler plug-ins fine tuned to your development ++environment. ++ ++------------------------------------------------------------------------------ ++4.1 GNAT ~ ++ *compiler-gnat* ++ ++GNAT is the only free (beer and speech) Ada compiler available. There are ++several version available which differentiate in the licence terms used. ++ ++The GNAT compiler plug-in will perform a compile on pressing and then ++immediately shows the result. You can set the project file to be used by ++setting: ++ > ++ > call g:gnat.Set_Project_File ('my_project.gpr') ++ ++Setting a project file will also create a Vim session (|views-sessions|) so - ++like with the GPS - opened files, window positions etc. will remembered ++separately for all projects. ++ ++ *gnat_members* ++GNAT OBJECT ~ ++ ++ *g:gnat.Make()* ++g:gnat.Make() ++ Calls|g:gnat.Make_Command|and displays the result inside a ++ |quickfix| window. ++ ++ *g:gnat.Pretty()* ++g:gnat.Pretty() ++ Calls|g:gnat.Pretty_Command| ++ ++ *g:gnat.Find()* ++g:gnat.Find() ++ Calls|g:gnat.Find_Command| ++ ++ *g:gnat.Tags()* ++g:gnat.Tags() ++ Calls|g:gnat.Tags_Command| ++ ++ *g:gnat.Set_Project_File()* ++g:gnat.Set_Project_File([{file}]) ++ Set gnat project file and load associated session. An open ++ project will be closed and the session written. If called ++ without file name the file selector opens for selection of a ++ project file. If called with an empty string then the project ++ and associated session are closed. ++ ++ *g:gnat.Project_File* ++g:gnat.Project_File string ++ Current project file. ++ ++ *g:gnat.Make_Command* ++g:gnat.Make_Command string ++ External command used for|g:gnat.Make()| (|'makeprg'|). ++ ++ *g:gnat.Pretty_Program* ++g:gnat.Pretty_Program string ++ External command used for|g:gnat.Pretty()| ++ ++ *g:gnat.Find_Program* ++g:gnat.Find_Program string ++ External command used for|g:gnat.Find()| ++ ++ *g:gnat.Tags_Command* ++g:gnat.Tags_Command string ++ External command used for|g:gnat.Tags()| ++ ++ *g:gnat.Error_Format* ++g:gnat.Error_Format string ++ Error format (|'errorformat'|) ++ ++------------------------------------------------------------------------------ ++4.2 Dec Ada ~ ++ *compiler-hpada* *compiler-decada* ++ *compiler-vaxada* *compiler-compaqada* ++ ++Dec Ada (also known by - in chronological order - VAX Ada, Dec Ada, Compaq Ada ++and HP Ada) is a fairly dated Ada 83 compiler. Support is basic: will ++compile the current unit. ++ ++The Dec Ada compiler expects the package name and not the file name to be ++passed a parameter. The compiler plug-in supports the usual file name ++convention to convert the file into a unit name. For separates both '-' and ++'__' are allowed. ++ ++ *decada_members* ++DEC ADA OBJECT ~ ++ ++ *g:decada.Make()* ++g:decada.Make() function ++ Calls|g:decada.Make_Command|and displays the result inside a ++ |quickfix| window. ++ ++ *g:decada.Unit_Name()* ++g:decada.Unit_Name() function ++ Get the Unit name for the current file. ++ ++ *g:decada.Make_Command* ++g:decada.Make_Command string ++ External command used for|g:decadat.Make()| (|'makeprg'|). ++ ++ *g:decada.Error_Format* ++g:decada.Error_Format| string ++ Error format (|'errorformat'|). ++ ++============================================================================== ++5. References ~ ++ *ada-reference* ++ ++------------------------------------------------------------------------------ ++5.1 Options ~ ++ *ft-ada-options* ++ ++ *g:ada_standard_types* ++g:ada_standard_types bool (true when exists) ++ Highlight types in package Standard (e.g., "Float") ++ ++ *g:ada_space_errors* ++ *g:ada_no_trail_space_error* ++ *g:ada_no_tab_space_error* ++ *g:ada_all_tab_usage* ++g:ada_space_errors bool (true when exists) ++ Highlight extraneous errors in spaces ... ++ g:ada_no_trail_space_error ++ - but ignore trailing spaces at the end of a line ++ g:ada_no_tab_space_error ++ - but ignore tabs after spaces ++ g:ada_all_tab_usage ++ - highlight all tab use ++ ++ *g:ada_line_errors* ++g:ada_line_errors bool (true when exists) ++ Highlight lines which are to long. Note: This highlighting ++ option is quite CPU intensive. ++ ++ *g:ada_rainbow_color* ++g:ada_rainbow_color bool (true when exists) ++ Use rainbow colours for '(' and ')'. You need the ++ rainbow_parenthesis for this to work ++ ++ *g:ada_folding* ++g:ada_folding set ('sigpft') ++ Use folding for Ada sources. ++ 's': activate syntax folding on load ++ 'p': fold packages ++ 'f': fold functions and procedures ++ 't': fold types ++ 'c': fold conditionals ++ 'g': activate gnat pretty print folding on load ++ 'i': lone 'is' folded with line above ++ 'b': lone 'begin' folded with line above ++ 'p': lone 'private' folded with line above ++ 'x': lone 'exception' folded with line above ++ 'i': activate indent folding on load ++ ++ Note: Syntax folding is in an early (unuseable) stage and ++ indent or gnat pretty folding is suggested. ++ ++ For gnat pretty folding to work the following settings are ++ suggested: -cl3 -M79 -c2 -c3 -c4 -A1 -A2 -A3 -A4 -A5 ++ ++ For indent folding to work the following settings are ++ suggested: shiftwidth=3 softtabstop=3 ++ ++ *g:ada_abbrev* ++g:ada_abbrev bool (true when exists) ++ Add some abbreviations. This feature more or less superseded ++ by the various completion methods. ++ ++ *g:ada_withuse_ordinary* ++g:ada_withuse_ordinary bool (true when exists) ++ Show "with" and "use" as ordinary keywords (when used to ++ reference other compilation units they're normally highlighted ++ specially). ++ ++ *g:ada_begin_preproc* ++g:ada_begin_preproc bool (true when exists) ++ Show all begin-like keywords using the colouring of C ++ preprocessor commands. ++ ++ *g:ada_omni_with_keywords* ++g:ada_omni_with_keywords ++ Add Keywords, Pragmas, Attributes to omni-completions ++ (|compl-omni|). Note: You can always complete then with user ++ completion (|i_CTRL-X_CTRL-U|). ++ ++ *g:ada_extended_tagging* ++g:ada_extended_tagging enum ('jump', 'list') ++ use extended tagging, two options are available ++ 'jump': use tjump to jump. ++ 'list': add tags quick fix list. ++ Normal tagging does not support function or operator ++ overloading as these features are not available in C and ++ tagging was originally developed for C. ++ ++ *g:ada_extended_completion* ++g:ada_extended_completion ++ Uses extended completion for and completions ++ (|i_CTRL-N|). In this mode the '.' is used as part of the ++ identifier so that 'Object.Method' or 'Package.Procedure' are ++ completed together. ++ ++ *g:ada_gnat_extensions* ++g:ada_gnat_extensions bool (true when exists) ++ Support GNAT extensions. ++ ++ *g:ada_with_gnat_project_files* ++g:ada_with_gnat_project_files bool (true when exists) ++ Add gnat project file keywords and Attributes. ++ ++ *g:ada_default_compiler* ++g:ada_default_compiler string ++ set default compiler. Currently supported is 'gnat' and ++ 'decada'. ++ ++An "exists" type is a boolean is considered true when the variable is defined ++and false when the variable is undefined. The value which the variable is ++set makes no difference. ++ ++------------------------------------------------------------------------------ ++5.3 Commands ~ ++ *ft-ada-commands* ++ ++:AdaRainbow *:AdaRainbow* ++ Toggles rainbow colour (|g:ada_rainbow_color|) mode for ++ '(' and ')' ++ ++:AdaLines *:AdaLines* ++ Toggles line error (|g:ada_line_errors|) display ++ ++:AdaSpaces *:AdaSpaces* ++ Toggles space error (|g:ada_space_errors|) display. ++ ++:AdaTagDir *:AdaTagDir* ++ Creates tags file for the directory of the current file. ++ ++:AdaTagFile *:AdaTagFile* ++ Creates tags file for the current file. ++ ++:AdaTypes *:AdaTypes* ++ Toggles standard types (|g:ada_standard_types|) colour. ++ ++:GnatFind *:GnatFind* ++ Calls |g:gnat.Find()| ++ ++:GnatPretty *:GnatPretty* ++ Calls |g:gnat.Pretty()| ++ ++:GnatTags *:GnatTags* ++ Calls |g:gnat.Tags()| ++ ++------------------------------------------------------------------------------ ++5.3 Variables ~ ++ *ft-ada-variables* ++ ++ *g:gnat* ++g:gnat object ++ Control object which manages GNAT compiles. The object ++ is created when the first Ada source code is loaded provided ++ that |g:ada_default_compiler|is set to 'gnat'. See|gnat_members| ++ for details. ++ ++ *g:decada* ++g:decada object ++ Control object which manages Dec Ada compiles. The object ++ is created when the first Ada source code is loaded provided ++ that |g:ada_default_compiler|is set to 'decada'. See ++ |decada_members|for details. ++ ++------------------------------------------------------------------------------ ++5.4 Constants ~ ++ *ft-ada-constants* ++ ft-ada-constants ++ ++All constants are locked. See |:lockvar| for details. ++ ++ *g:ada#WordRegex* ++g:ada#WordRegex string ++ Regular expression to search for Ada words ++ ++ *g:ada#DotWordRegex* ++g:ada#DotWordRegex string ++ Regular expression to search for Ada words separated by dots. ++ ++ *g:ada#Comment* ++g:ada#Comment string ++ Regular expression to search for Ada comments ++ ++ *g:ada#Keywords* ++g:ada#Keywords list of dictionaries ++ List of keywords, attributes etc. pp. in the format used by ++ omni completion. See |complete-items| for details. ++ ++ *g:ada#Ctags_Kinds* ++g:ada#Ctags_Kinds dictionary of lists ++ Dictionary of the various kinds of items which the Ada support ++ for Ctags generates. ++ ++------------------------------------------------------------------------------ ++5.2 Functions ~ ++ *ft-ada-functions* ++ ++ada#Word([{line}, {col}]) *ada#Word()* ++ Return full name of Ada entity under the cursor (or at given ++ line/column), stripping white space/newlines as necessary. ++ ++ada#List_Tag([{line}, {col}]) *ada#Listtags()* ++ List all occurrences of the Ada entity under the cursor (or at ++ given line/column) inside the quick-fix window ++ ++ada#Jump_Tag ({ident}, {mode}) *ada#Jump_Tag()* ++ List all occurrences of the Ada entity under the cursor (or at ++ given line/column) in the tag jump list. Mode can either be ++ 'tjump' or 'stjump'. ++ ++ada#Create_Tags ({option}) *ada#Create_Tags()* ++ Creates tag file using Ctags. The option can either be 'file' ++ for the current file, 'dir' for the directory of the current ++ file or a file name. ++ ++gnat#Insert_Tags_Header() *gnat#Insert_Tags_Header()* ++ Adds the tag file header (!_TAG_) information to the current ++ file which are missing from the GNAT XREF output. ++ ++ada#Switch_Syntax_Option ({option}) *ada#Switch_Syntax_Option()* ++ Toggles highlighting options on or off. Used for the Ada menu. ++ ++ *gnat#New()* ++gnat#New () ++ Create a new gnat object. See |g:gnat| for details. ++ ++ ++============================================================================== ++8. Extra Plugins ~ ++ *ada-extra-plugins* ++ ++You can optionally install the following extra plug-in. They work well with Ada ++and enhance the ability of the Ada mode.: ++ ++backup.vim ++ http://www.vim.org/scripts/script.php?script_id=1537 ++ Keeps as many backups as you like so you don't have to. ++ ++rainbow_parenthsis.vim ++ http://www.vim.org/scripts/script.php?script_id=1561 ++ Very helpful since Ada uses only '(' and ')'. ++ ++nerd_comments.vim ++ http://www.vim.org/scripts/script.php?script_id=1218 ++ Excellent commenting and uncommenting support for almost any ++ programming language. ++ ++matchit.vim ++ http://www.vim.org/scripts/script.php?script_id=39 ++ '%' jumping for any language. The normal '%' jump only works for '{}' ++ style languages. The Ada mode will set the needed search patters. ++ ++taglist.vim ++ http://www.vim.org/scripts/script.php?script_id=273 ++ Source code explorer sidebar. There is a patch for Ada available. ++ ++The GNU Ada Project distribution (http://gnuada.sourceforge.net) of Vim ++contains all of the above. ++ ++============================================================================== ++vim: textwidth=78 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++vim: filetype=help +diff -urN vim71/1/doc/matchit.txt vim71_ada/1/doc/matchit.txt +--- vim71/1/doc/matchit.txt 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/matchit.txt 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,405 @@ ++*matchit.txt* Extended "%" matching ++ ++For instructions on installing this file, type ++ :help matchit-install ++inside Vim. ++ ++For Vim version 6.3. Last change: 2006 Feb 23 ++ ++ ++ VIM REFERENCE MANUAL by Benji Fisher ++ ++*matchit* *matchit.vim* ++ ++1. Extended matching with "%" |matchit-intro| ++2. Activation |matchit-activate| ++3. Configuration |matchit-configure| ++4. Supporting a New Language |matchit-newlang| ++5. Known Bugs and Limitations |matchit-bugs| ++ ++The functionality mentioned here is a plugin, see |add-plugin|. ++This plugin is only available if 'compatible' is not set. ++You can avoid loading this plugin by setting the "loaded_matchit" variable ++in your |vimrc| file: > ++ :let loaded_matchit = 1 ++ ++{Vi does not have any of this} ++ ++============================================================================== ++1. Extended matching with "%" *matchit-intro* ++ ++ *matchit-%* ++% Cycle forward through matching groups, such as "if", "else", "endif", ++ as specified by |b:match_words|. ++ ++ *g%* *v_g%* *o_g%* ++g% Cycle backwards through matching groups, as specified by ++ |b:match_words|. For example, go from "endif" to "else" to "if". ++ ++ *[%* *v_[%* *o_[%* ++[% Go to [count] previous unmatched group, as specified by ++ |b:match_words|. Similar to |[{|. ++ ++ *]%* *v_]%* *o_]%* ++]% Go to [count] next unmatched group, as specified by ++ |b:match_words|. Similar to |]}|. ++ ++ *v_a%* ++a% In Visual mode, select the matching group, as specified by ++ |b:match_words|, containing the cursor. Similar to |v_a[|. ++ A [count] is ignored, and only the first character of the closing ++ pattern is selected. ++ ++In Vim, as in plain vi, the percent key, |%|, jumps the cursor from a brace, ++bracket, or paren to its match. This can be configured with the 'matchpairs' ++option. The matchit plugin extends this in several ways: ++ ++ You can match whole words, such as "if" and "endif", not just ++ single characters. You can also specify a |regular-expression|. ++ You can define groups with more than two words, such as "if", ++ "else", "endif". Banging on the "%" key will cycle from the "if" to ++ the first "else", the next "else", ..., the closing "endif", and back ++ to the opening "if". Nested structures are skipped. Using |g%| goes ++ in the reverse direction. ++ By default, words inside comments and strings are ignored, unless ++ the cursor is inside a comment or string when you type "%". If the ++ only thing you want to do is modify the behavior of "%" so that it ++ behaves this way, you can > ++ :let b:match_words = &matchpairs ++< ++See |matchit-details| for details on what the script does, and |b:match_words| ++for how to specify matching patterns. ++ ++MODES: *matchit-modes* *matchit-v_%* *matchit-o_%* ++ ++Mostly, % and related motions (|g%| and |[%| and |]%|) work just like built-in ++|motion| commands in |Operator-pending| and |Visual| modes. However, you ++cannot make these motions |linewise| or |characterwise|, since the |:omap|s ++that define them start with "v" in order to make the default behavior ++inclusive. (See |o_v|.) In other words, "dV%" will not work. The ++work-around is to go through Visual mode: "V%d" will work. ++ ++LANGUAGES: *matchit-languages* ++ ++Currently, the following languages are supported: Ada, ASP with VBS, Csh, ++DTD, Entity, Essbase, Fortran, HTML, JSP (same as HTML), LaTeX, Lua, Pascal, ++SGML, Shell, Tcsh, Vim, XML. Other languages may already have support via ++|filetype-plugin|s. ++ ++To support a new language, see |matchit-newlang| below. ++ ++DETAILS: *matchit-details* *matchit-parse* ++ ++Here is an outline of what matchit.vim does each time you hit the "%" key. If ++there are |backref|s in |b:match_words| then the first step is to produce a ++version in which these back references have been eliminated; if there are no ++|backref|s then this step is skipped. This step is called parsing. For ++example, "\(foo\|bar\):end\1" is parsed to yield ++"\(foo\|bar\):end\(foo\|bar\)". This can get tricky, especially if there are ++nested groups. If debugging is turned on, the parsed version is saved as ++|b:match_pat|. ++ ++ *matchit-choose* ++Next, the script looks for a word on the current line that matches the pattern ++just constructed. It includes the patterns from the 'matchpairs' option. ++The goal is to do what you expect, which turns out to be a little complicated. ++The script follows these rules: ++ ++ Insist on a match that ends on or after the cursor. ++ Prefer a match that includes the cursor position (that is, one that ++ starts on or before the cursor). ++ Prefer a match that starts as close to the cursor as possible. ++ Prefer a match in |b:match_words| to a match in 'matchpairs'. ++ If more than one pattern in |b:match_words| matches, choose the one ++ that is listed first. ++ ++Examples: ++ ++ Suppose you > ++ :let b:match_words = '<:>,:' ++< and hit "%" with the cursor on or before the "<" in "a is born". ++ The pattern '<' comes first, so it is preferred over '', which ++ also matches. If the cursor is on the "t", however, then '' is ++ preferred, because this matches a bit of text containing the cursor. ++ If the two groups of patterns were reversed then '<' would never be ++ preferred. ++ ++ Suppose you > ++ :let b:match_words = 'if:end if' ++< (Note the space!) and hit "%" with the cursor at the end of "end if". ++ Then "if" matches, which is probably not what you want, but if the ++ cursor starts on the "end " then "end if" is chosen. (You can avoid ++ this problem by using a more complicated pattern.) ++ ++If there is no match, the script falls back on the usual behavior of |%|. If ++debugging is turned on, the matched bit of text is saved as |b:match_match| ++and the cursor column of the start of the match is saved as |b:match_col|. ++ ++Next, the script looks through |b:match_words| (original and parsed versions) ++for the group and pattern that match. If debugging is turned on, the group is ++saved as |b:match_ini| (the first pattern) and |b:match_tail| (the rest). If ++there are |backref|s then, in addition, the matching pattern is saved as ++|b:match_word| and a table of translations is saved as |b:match_table|. If ++there are |backref|s, these are determined from the matching pattern and ++|b:match_match| and substituted into each pattern in the matching group. ++ ++The script decides whether to search forwards or backwards and chooses ++arguments for the |searchpair()| function. Then, the cursor is moved to the ++start of the match, and |searchpair()| is called. By default, matching ++structures inside strings and comments are ignored. This can be changed by ++setting |b:match_skip|. ++ ++============================================================================== ++2. Activation *matchit-activate* ++ ++You can use this script as a plugin, by copying it to your plugin directory. ++See |add-global-plugin| for instructions. You can also add a line to your ++|vimrc| file, such as > ++ :source $VIMRUNTIME/macros/matchit.vim ++or > ++ :runtime macros/matchit.vim ++Either way, the script should start working the next time you start up Vim. ++ ++The script does nothing unless it finds a |buffer-variable| named ++|b:match_words|. The script contains autocommands that set this variable for ++various file types: see |matchit-languages| above. For a new language, you ++can add autocommands to the script or to your vimrc file, but the recommended ++method is to add a line such as > ++ let b:match_words = '\:\' ++to the |filetype-plugin| for your language. See |b:match_words| below for how ++this variable is interpreted. ++ ++TROUBLESHOOTING *matchit-troubleshoot* ++ ++The script should work in most installations of Vim. It may not work if Vim ++was compiled with a minimal feature set, for example if the |+syntax| option ++was not enabled. If your Vim has support for syntax compiled in, but you do ++not have |syntax| highlighting turned on, matchit.vim should work, but it may ++fail to skip matching groups in comments and strings. If the |filetype| ++mechanism is turned off, the |b:match_words| variable will probably not be ++defined automatically. ++ ++============================================================================== ++3. Configuration *matchit-configure* ++ ++There are several variables that govern the behavior of matchit.vim. Note ++that these are variables local to the buffer, not options, so use |:let| to ++define them, not |:set|. Some of these variables have values that matter; for ++others, it only matters whether the variable has been defined. All of these ++can be defined in the |filetype-plugin| or autocommand that defines ++|b:match_words| or "on the fly." ++ ++The main variable is |b:match_words|. It is described in the section below on ++supporting a new language. ++ ++ *MatchError* *matchit-hl* *matchit-highlight* ++MatchError is the highlight group for error messages from the script. By ++default, it is linked to WarningMsg. If you do not want to be bothered by ++error messages, you can define this to be something invisible. For example, ++if you use the GUI version of Vim and your command line is normally white, you ++can do > ++ :hi MatchError guifg=white guibg=white ++< ++ *b:match_ignorecase* ++If you > ++ :let b:match_ignorecase = 1 ++then matchit.vim acts as if 'ignorecase' is set: for example, "end" and "END" ++are equivalent. If you > ++ :let b:match_ignorecase = 0 ++then matchit.vim treats "end" and "END" differently. (There will be no ++b:match_infercase option unless someone requests it.) ++ ++ *b:match_debug* ++Define b:match_debug if you want debugging information to be saved. See ++|matchit-debug|, below. ++ ++ *b:match_skip* ++If b:match_skip is defined, it is passed as the skip argument to ++|searchpair()|. This controls when matching structures are skipped, or ++ignored. By default, they are ignored inside comments and strings, as ++determined by the |syntax| mechanism. (If syntax highlighting is turned off, ++nothing is skipped.) You can set b:match_skip to a string, which evaluates to ++a non-zero, numerical value if the match is to be skipped or zero if the match ++should not be skipped. In addition, the following special values are ++supported by matchit.vim: ++ s:foo becomes (current syntax item) =~ foo ++ S:foo becomes (current syntax item) !~ foo ++ r:foo becomes (line before cursor) =~ foo ++ R:foo becomes (line before cursor) !~ foo ++(The "s" is meant to suggest "syntax", and the "r" is meant to suggest ++"regular expression".) ++ ++Examples: ++ ++ You can get the default behavior with > ++ :let b:match_skip = 's:comment\|string' ++< ++ If you want to skip matching structures unless they are at the start ++ of the line (ignoring whitespace) then you can > ++ :let b:match_skip = 'R:^\s*' ++< Do not do this if strings or comments can span several lines, since ++ the normal syntax checking will not be done if you set b:match_skip. ++ ++ In LaTeX, since "%" is used as the comment character, you can > ++ :let b:match_skip = 'r:%' ++< Unfortunately, this will skip anything after "\%", an escaped "%". To ++ allow for this, and also "\\%" (an excaped backslash followed by the ++ comment character) you can > ++ :let b:match_skip = 'r:\(^\|[^\\]\)\(\\\\\)*%' ++< ++ See the $VIMRUNTIME/ftplugin/vim.vim for an example that uses both ++ syntax and a regular expression. ++ ++============================================================================== ++4. Supporting a New Language *matchit-newlang* ++ *b:match_words* ++In order for matchit.vim to support a new language, you must define a suitable ++pattern for |b:match_words|. You may also want to set some of the ++|matchit-configure| variables, as described above. If your language has a ++complicated syntax, or many keywords, you will need to know something about ++Vim's |regular-expression|s. ++ ++The format for |b:match_words| is similar to that of the 'matchpairs' option: ++it is a comma (,)-separated list of groups; each group is a colon(:)-separated ++list of patterns (regular expressions). Commas and backslashes that are part ++of a pattern should be escaped with backslashes ('\:' and '\,'). It is OK to ++have only one group; the effect is undefined if a group has only one pattern. ++A simple example is > ++ :let b:match_words = '\:\,' ++ \ . '\:\:\:\' ++(In Vim regular expressions, |\<| and |\>| denote word boundaries. Thus "if" ++matches the end of "endif" but "\" does not.) Then banging on the "%" ++key will bounce the cursor between "if" and the matching "endif"; and from ++"while" to any matching "continue" or "break", then to the matching "endwhile" ++and back to the "while". It is almost always easier to use |literal-string|s ++(single quotes) as above: '\' rather than "\\" and so on. ++ ++Exception: If the ":" character does not appear in b:match_words, then it is ++treated as an expression to be evaluated. For example, > ++ :let b:match_words = 'GetMatchWords()' ++allows you to define a function. This can return a different string depending ++on the current syntax, for example. ++ ++Once you have defined the appropriate value of |b:match_words|, you will ++probably want to have this set automatically each time you edit the ++appropriate file type. The recommended way to do this is by adding the ++definition to a |filetype-plugin| file. ++ ++Tips: Be careful that your initial pattern does not match your final pattern. ++See the example above for the use of word-boundary expressions. It is usually ++better to use ".\{-}" (as many as necessary) instead of ".*" (as many as ++possible). See |\{-|. For example, in the string "label", "<.*>" ++matches the whole string whereas "<.\{-}>" and "<[^>]*>" match "" and ++"". ++ ++ *matchit-spaces* *matchit-s:notend* ++If "if" is to be paired with "end if" (Note the space!) then word boundaries ++are not enough. Instead, define a regular expression s:notend that will match ++anything but "end" and use it as follows: > ++ :let s:notend = '\%(\:\' ++< *matchit-s:sol* ++This is a simplified version of what is done for Ada. The s:notend is a ++|script-variable|. Similarly, you may want to define a start-of-line regular ++expression > ++ :let s:sol = '\%(^\|;\)\s*' ++if keywords are only recognized after the start of a line or after a ++semicolon (;), with optional white space. ++ ++ *matchit-backref* *matchit-\1* ++In any group, the expressions |\1|, |\2|, ..., |\9| refer to parts of the ++INITIAL pattern enclosed in |\(|escaped parentheses|\)|. These are referred ++to as back references, or backrefs. For example, > ++ :let b:match_words = '\:\(h\)\1\>' ++means that "bo" pairs with "ho" and "boo" pairs with "hoo" and so on. Note ++that "\1" does not refer to the "\(h\)" in this example. If you have ++"\(nested \(parentheses\)\) then "\d" refers to the d-th "\(" and everything ++up to and including the matching "\)": in "\(nested\(parentheses\)\)", "\1" ++refers to everything and "\2" refers to "\(parentheses\)". If you use a ++variable such as |s:notend| or |s:sol| in the previous paragraph then remember ++to count any "\(" patterns in this variable. You do not have to count groups ++defined by |\%(\)|. ++ ++It should be possible to resolve back references from any pattern in the ++group. For example, > ++ :let b:match_words = '\(foo\)\(bar\):more\1:and\2:end\1\2' ++would not work because "\2" cannot be determined from "morefoo" and "\1" ++cannot be determined from "andbar". On the other hand, > ++ :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1' ++should work (and have the same effect as "foobar:barfoo:endfoobar"), although ++this has not been thoroughly tested. ++ ++You can use |zero-width| patterns such as |\@<=| and |\zs|. (The latter has ++not been thouroughly tested in matchit.vim.) For example, if the keyword "if" ++must occur at the start of the line, with optional white space, you might use ++the pattern "\(^\s*\)\@<=if" so that the cursor will end on the "i" instead of ++at the start of the line. For another example, if HTML had only one tag then ++one could > ++ :let b:match_words = '<:>,<\@<=tag>:<\@<=/tag>' ++so that "%" can bounce between matching "<" and ">" pairs or (starting on ++"tag" or "/tag") between matching tags. Without the |\@<=|, the script would ++bounce from "tag" to the "<" in "", and another "%" would not take you ++back to where you started. ++ ++DEBUGGING *matchit-debug* *:MatchDebug* ++ ++If you are having trouble figuring out the appropriate definition of ++|b:match_words| then you can take advantage of the same information I use when ++debugging the script. This is especially true if you are not sure whether ++your patterns or my script are at fault! To make this more convenient, I have ++made the command :MatchDebug, which defines the variable |b:match_debug| and ++creates a Matchit menu. This menu makes it convenient to check the values of ++the variables described below. You will probably also want to read ++|matchit-details| above. ++ ++Defining the variable |b:match_debug| causes the script to set the following ++variables, each time you hit the "%" key. Several of these are only defined ++if |b:match_words| includes |backref|s. ++ ++ *b:match_pat* ++The b:match_pat variable is set to |b:match_words| with |backref|s parsed. ++ *b:match_match* ++The b:match_match variable is set to the bit of text that is recognized as a ++match. ++ *b:match_col* ++The b:match_col variable is set to the cursor column of the start of the ++matching text. ++ *b:match_wholeBR* ++The b:match_wholeBR variable is set to the comma-separated group of patterns ++that matches, with |backref|s unparsed. ++ *b:match_iniBR* ++The b:match_iniBR variable is set to the first pattern in |b:match_wholeBR|. ++ *b:match_ini* ++The b:match_ini variable is set to the first pattern in |b:match_wholeBR|, ++with |backref|s resolved from |b:match_match|. ++ *b:match_tail* ++The b:match_tail variable is set to the remaining patterns in ++|b:match_wholeBR|, with |backref|s resolved from |b:match_match|. ++ *b:match_word* ++The b:match_word variable is set to the pattern from |b:match_wholeBR| that ++matches |b:match_match|. ++ *b:match_table* ++The back reference '\'.d refers to the same thing as '\'.b:match_table[d] in ++|b:match_word|. ++ ++============================================================================== ++5. Known Bugs and Limitations *matchit-bugs* ++ ++Just because I know about a bug does not mean that it is on my todo list. I ++try to respond to reports of bugs that cause real problems. If it does not ++cause serious problems, or if there is a work-around, a bug may sit there for ++a while. Moral: if a bug (known or not) bothers you, let me know. ++ ++The various |:vmap|s defined in the script (%, |g%|, |[%|, |]%|, |a%|) may ++have undesired effects in Select mode |Select-mode-mapping|. At least, if you ++want to replace the selection with any character in "ag%[]" there will be a ++pause of |'updatetime'| first. ++ ++It would be nice if "\0" were recognized as the entire pattern. That is, it ++would be nice if "foo:\end\0" had the same effect as "\(foo\):\end\1". I may ++try to implement this in a future version. (This is not so easy to arrange as ++you might think!) ++ ++============================================================================== ++vim: filetype=help ++vim:tw=78:fo=tcq2: +diff -urN vim71/1/doc/NERD_commenter.txt vim71_ada/1/doc/NERD_commenter.txt +--- vim71/1/doc/NERD_commenter.txt 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/NERD_commenter.txt 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,1155 @@ ++*NERD_comments.txt* Plugin for commenting code v169 ++ ++ ++ NERD_COMMENTS REFERENCE MANUAL~ ++ ++ ++ ++ ++ ++============================================================================== ++CONTENTS {{{2 *NERD_comments-contents* ++ ++ 1.Intro...................................|NERD_comments| ++ 2.Functionality provided..................|NERD_com-functionality| ++ 2.1 Functionality Summary.............|NERD_com-functionality-summary| ++ 2.2 Functionality Details.............|NERD_com-functionality-details| ++ 2.2.1 Comment map.................|NERD_com-comment| ++ 2.2.2 Nested comment map..........|NERD_com-nested-comment| ++ 2.2.3 Toggle comment map..........|NERD_com-toggle-comment| ++ 2.2.4 Minimal comment map.........|NERD_com-minimal-comment| ++ 2.2.5 Invert comment map..........|NERD_com-invert-comment| ++ 2.2.6 Sexy comment map............|NERD_com-sexy-comment| ++ 2.2.7 Yank comment map............|NERD_com-yank-comment| ++ 2.2.8 Comment to EOL map..........|NERD_com-EOL-comment| ++ 2.2.9 Append com to line map......|NERD_com-append-comment| ++ 2.2.10 Prepend com to line map....|NERD_com-prepend-comment| ++ 2.2.11 Insert comment map.........|NERD_com-insert-comment| ++ 2.2.12 Use alternate delims map...|NERD_com-alt-delim| ++ 2.2.13 Comment aligned maps.......|NERD_com-aligned-comment| ++ 2.2.14 Uncomment line map.........|NERD_com-uncomment-line| ++ 2.3 Supported filetypes...............|NERD_com-filetypes| ++ 2.4 Sexy Comments.....................|NERD_com_sexy_comments| ++ 3.Customisation...........................|NERD_com-customisation| ++ 3.1 Customisation summary.............|NERD_com-cust-summary| ++ 3.2 Customisation details.............|NERD_com-cust-details| ++ 3.3 Default delimiter customisation...|NERD_com-cust-delims| ++ 3.4 Key mapping customisation.........|NERD_com-cust-keys| ++ 3.5 Sample regular expressions........|NERD_com-reg-exps| ++ 4.Issues with the script..................|NERD_com-issues| ++ 4.1 Delimiter detection heuristics....|NERD_com-heuristics| ++ 4.2 Nesting issues....................|NERD_com-nesting| ++ 4.3 Nesting issues....................|NERD_com-nesting| ++ 4.3 Mark clobbering...................|NERD_com-mark-clobbering| ++ 5.TODO list...............................|NERD_com-todo| ++ 6.Credits.................................|NERD_com-credits| ++ ++============================================================================== ++1. Intro {{{2 *NERD_comments* ++ ++NERD_comments provides a set of handy key mappings for commenting code. These ++mappings are consistent across all supported filetypes. ++ ++When writing NERD_comments I have tried to give it as many features/options as ++possible while keeping it so that the plugin can still be used with little or ++no knowledge of these. The average user need only know about a few key ++mappings to use NERD_comments while there are plenty of other features for the ++l33t nerd take advantage of. ++ ++Enjoy :D ++ ++============================================================================== ++2. Functionality provided {{{2 *NERD_com-functionality* ++ ++------------------------------------------------------------------------------ ++2.1 Functionality summary {{{3 *NERD_com-functionality-summary* ++ ++The following key mappings are provided by default (there is also a menu ++provided that contains menu items corresponding to all the below mappings): ++ ++Note: is a user defined key that is used to start keymappings and ++defaults to \. Check out || for details. ++ ++Most of the following mappings are for normal/visual mode only. The ++|NERD_com-insert-comment| mapping is for insert mode only. ++ ++cc |NERD_com-comment-map| ++Comments out the current line or text selected in visual mode. ++ ++ ++cn |NERD_com-nested-comment| ++Same as |NERD_com-comment-map| but enforces nesting. ++ ++ ++c |NERD_com-toggle-comment| ++Toggles the comment state of the selected line(s). If the topmost selected ++line is commented, all selected lines are uncommented and vice versa. ++ ++ ++cm |NERD_com-minimal-comment| ++Comments the given lines using only one set of multipart delimiters if ++possible. ++ ++ ++ci |NERD_com-invert-comment| ++Toggles the comment state of the selected line(s) individually. Each selected ++line that is commented is uncommented and vice versa. ++ ++ ++cs |NERD_com-sexy-comment| ++Comments out the selected lines ``sexually'' ++ ++ ++cy |NERD_com-yank-comment| ++Same as |NERD_com-comment-map| except that the commented line(s) are yanked ++before commenting. ++ ++ ++c$ |NERD_com-EOL-comment| ++Comments the current line from the cursor to the end of line. ++ ++ ++cA |NERD_com-append-comment| ++Adds comment delimiters to the end of line and goes into insert mode between ++them. ++ ++ ++cI |NERD_com-prepend-comment| ++Adds comment delimiters to the start of line and goes into insert mode between ++them. ++ ++ ++ |NERD_com-insert-comment| ++Adds comment delimiters at the current cursor position and inserts between. ++ ++ ++ca |NERD_com-alt-delim| ++Switches to the alternative set of delimiters. ++ ++ ++cl OR cr OR cb |NERD_com-aligned-comment| ++Same as |NERD_com-comment| except that the delimiters are aligned down the ++left side (cl), the right side (cr) or both sides ++(cb). ++ ++ ++cu |NERD_com-uncomment-line| ++Uncomments the selected line(s). ++ ++------------------------------------------------------------------------------ ++2.2 Functionality details {{{3 *NERD_com-functionality-details* ++ ++------------------------------------------------------------------------------ ++2.2.1 Comment map *NERD_com-comment* ++cc ++Comments out the current line. If multiple lines are selected in visual-line ++mode, they are all commented out. If some text is selected in visual or ++visual-block mode then NERD_comments will try to comment out the exact text ++that is selected using multi-part delimiters if they are available. ++ ++Works in normal, visual, visual-line and visual-block mode. ++ ++Change the mapping with: |NERD_com_line_map|. ++ ++Relevant options: ++|NERD_allow_any_visual_delims_regexp| ++|NERD_comment_whole_lines_in_v_mode| ++|NERD_block_com_after_right| ++|NERD_left_align_regexp| ++|NERD_place_holder_regexp| ++|NERD_right_align_regexp| ++|NERD_space_delim_filetype_regexp| ++|NERD_use_nested_comments_default| ++ ++------------------------------------------------------------------------------ ++2.2.2 Nested comment map *NERD_com-nested-comment* ++cn ++Performs nested commenting. Works the same as cc except that if a ++line is already commented then it will be commented again. ++ ++If the filetype is covered by the |NERD_place_holder_regexp| option ++then the previous comment delimiters will be replaced by place-holder ++delimiters if needed. Otherwise the nested comment will only be added if the ++current commenting delimiters have no right delimiter (to avoid compiler ++errors) ++ ++Works in normal, visual, visual-line, visual-block modes. ++ ++Change the mapping with: |NERD_com_line_nest_map|. ++ ++Relevant options: ++|NERD_allow_any_visual_delims_regexp| ++|NERD_comment_whole_lines_in_v_mode| ++|NERD_block_com_after_right| ++|NERD_left_align_regexp| ++|NERD_place_holder_regexp| ++|NERD_right_align_regexp| ++|NERD_space_delim_filetype_regexp| ++|NERD_use_nested_comments_default| ++ ++ ++------------------------------------------------------------------------------ ++2.2.3 Toggle comment map *NERD_com-toggle-comment* ++c ++Toggles commenting of the lines selected. The behaviour of this mapping ++depends on whether the first line selected is commented or not. If so, all ++selected lines are uncommented and vice versa. ++ ++With this mapping, lines are only considered to be commented if a left comment ++delimiter is the first non-space/tab char on the line. ++ ++Works in normal, visual-line, modes. ++Using this mapping in visual or visual-block modes will cause it to work like ++|NERD_com-comment| ++ ++Change the mapping with: |NERD_com_line_toggle_map|. ++ ++Relevant options: ++|NERD_left_align_regexp| ++|NERD_right_align_regexp| ++|NERD_space_delim_filetype_regexp| ++|NERD_use_nested_comments_default| ++ ++------------------------------------------------------------------------------ ++2.2.4 Minimal comment map *NERD_com-minimal-comment* ++cm ++Comments the selected lines using one set of multipart delimiters if possible. ++ ++For example: if you are programming in c and you select 5 lines and press ++cm then a '/*' will be placed at the start of the top line and a '*/' ++will be placed at the end of the last line. ++ ++Sets of multipart comment delimiters that are between the top and bottom ++selected lines are replaced with place holders (see |NERD_lPlace|) if ++NERD_place_holder_regexp is set for the current filetype. If it is not, then ++the comment will be aborted if place holders are required to prevent illegal ++syntax. ++ ++------------------------------------------------------------------------------ ++2.2.5 Invert comment map *NERD_com-invert-comment* ++ci ++Inverts the commented state of each selected line. If the a selected line is ++commented then it is uncommented and vice versa. Each line is examined and ++commented/uncommented individually. ++ ++With this mapping, lines are only considered to be commented if a left comment ++delimiter is the first non-space/tab char on the line. ++ ++Works in normal, visual-line, modes. ++ ++Change the mapping with: |NERD_com_line_invert_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.6 Sexy comment map *NERD_com-sexy-comment* ++cs ++Comments the selected line(s) ``sexily''... see |NERD_com_sexy_commenting| for ++a description of what sexy comments are. Can only be done on filetypes for ++which there is at least one set of multipart comment delimiters specified. ++ ++Sexy comments cannot be nested and lines inside a sexy comment cannot be ++commented again. ++ ++Works in normal, visual-line. ++ ++Change the mapping with: |NERD_com_line_sexy_map| ++ ++Relevant options: ++|NERD_use_compact_sexy_com_regexp| ++ ++------------------------------------------------------------------------------ ++2.2.7 Yank comment map *NERD_com-yank-comment* ++cy ++Same as cc except that it yanks the line(s) that are commented first. ++ ++Works in normal, visual, visual-line, visual-block modes. ++ ++Change the mapping with: |NERD_com_line_yank_map| ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.8 Comment to EOL map *NERD_com-EOL-comment* ++c$ ++Comments the current line from the current cursor position up to the end of ++the line. ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_com_to_end_of_line_map| ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.9 Append com to line map *NERD_com-append-comment* ++cA ++Appends comment delimiters to the end of the current line and goes ++to insert mode between the new delimiters. ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_append_com_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.10 Prepend com to line map *NERD_com-prepend-comment* ++cI ++Prepends comment delimiters to the start of the current line and goes to ++insert mode between the new delimiters. ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_prepend_com_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.11 Insert comment map *NERD_com-insert-comment* ++ ++Adds comment delimiters at the current cursor position and inserts ++between them. ++ ++Works in insert mode. ++ ++Change the mapping with: |NERD_com_in_insert_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.12 Use alternate delims map *NERD_com-alt-delim* ++ca ++Changes to the alternative commenting style if one is available. For example, ++if the user is editing a c++ file using // comments and they hit ca ++then they will be switched over to /**/ comments. ++keys for this mappings can be overridden with the ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_alt_com_map| ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.13 Comment aligned maps *NERD_com-aligned-comment* ++cl cr cb ++Same as cc except that the comment delimiters are aligned on the left ++side, right side or both sides respectively. These comments are always nested ++if the line(s) are already commented. ++ ++Works in normal, visual-line. ++ ++Change the mappings with: |NERD_com_align_left_map|, |NERD_com_align_right_map| ++and |NERD_com_align_both_map|. ++ ++Relevant options: ++|NERD_left_align_regexp| ++|NERD_right_align_regexp| ++ ++ ++------------------------------------------------------------------------------ ++2.2.14 Uncomment line map *NERD_com-uncomment-line* ++cu ++Uncomments the current line. If multiple lines are selected in ++visual mode then they are all uncommented. ++ ++When uncommenting, if the line contains multiple sets of delimiters then the ++``outtermost'' pair of delimiters will be removed. ++ ++The script uses a set of heurisics to distinguish ``real'' delimiters from ++``fake'' ones when uncommenting. See |NERD_com-issues| for details. ++ ++Works in normal, visual, visual-line, visual-block. ++ ++Change the mapping with: |NERD_uncom_line_map|. ++ ++Relevant options: ++|NERD_dont_remove_alt_coms| ++|NERD_dont_remove_spaces_regexp| ++ ++ ++------------------------------------------------------------------------------ ++2.3 Supported filetypes *NERD_com-filetypes* ++ ++Files that can be commented by this plugin: ++abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asm ++asn aspvbs atlas automake ave awk basic b bc bdf bib bindzone btm caos catalog ++c cfg cg ch cl clean clipper conf config cpp crontab cs csc csp css cterm cupl ++cvs dcl def diff dns dosbatch dosini dot dracula dsl dtd dtml dylan ecd eiffel ++elf elmfilt erlang eruby eterm expect exports fgl focexec form fortran foxpro ++fvwm fx gdb gdmo gnuplot gtkrc haskell hb h help hercules hog html htmlos ia64 ++icon idlang idl indent inform inittab ishd iss ist jam java javascript jess ++jgraph jproperties jproperties jsp kix kscript lace lex lftp lifelines lilo ++lisp lite lotos lout lprolog lscript lss lua lynx m4 make maple masm master ++matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc named ++nasm nastran natural ncf netrw nqc nsis ocaml omnimark openroad opl ora ox ++pascal pcap pccts perl pfmain php phtml pic pike pilrc pine plm plsql po ++postscr pov povini ppd ppwiz procmail progress prolog psf ptcap python python ++radiance ratpoison r rc readline rebol registry remind rexx robots rpl ruby sa ++samba sas sather scheme scilab screen scsh sdl sed sgml sgmldecl sgmllnx sicad ++simula sinda skill slang sl slrnrc sm smil smith sml snnsnet snnspat snnsres ++snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp strace svn tads ++taglist tags tak tasm tcl terminfo tex texinfo texmf tf tidy tli trasys tsalt ++tsscl tssgm uc uil vb verilog vgrindefs vhdl vim virata vrml vsejcl webmacro ++wget winbatch wml sh wvdial xdefaults xf86conf xhtml xkb xmath xml xmodmap ++xpm2 xpm xslt yacc yaml z8a ++ ++If a language is not in the list of hardcoded supported filetypes then the ++&commentstring vim option is used. ++ ++ ++------------------------------------------------------------------------------ ++2.4 Sexy Comments *NERD_com_sexy_comments* ++These are comments that use one set of multipart comment delimiters as well as ++one other marker symbol. For example: > ++ /* ++ * This is a c style sexy comment ++ * So there! ++ */ ++ ++ /* This is a c style sexy comment ++ * So there! ++ * But this one is ``compact'' style */ ++< ++Here the multipart delimiters are /* and */ and the marker is *. NERD_comments ++is capable of adding and removing comments of this type. ++ ++ ++============================================================================== ++3. Customisation {{{2 *NERD_com-customisation* ++ ++------------------------------------------------------------------------------ ++3.1 Customisation summary *NERD_com-cust-summary* ++ ++|loaded_nerd_comments| Turns off the script. ++|NERD_allow_any_visual_delims_regexp| Allows multipart alternative delims to ++ be used when commenting in ++ visual/visual-block mode. ++|NERD_block_com_after_right| Forces right delims to be placed when ++ doing visual-block comments. ++|NERD_comment_whole_lines_in_v_mode| Changes behaviour of visual comments. ++|NERD_menu_mode| Determines if a NERD comment menu will ++ be made and whether the menu will have a ++ keyboard shortcut. ++|NERD_dont_remove_alt_coms| Causes alternative comments not to be ++ removed when uncommenting. ++|NERD_dont_remove_spaces_regexp| Causes spaces not to be removed when ++ uncommenting if the filetype doesnt ++ match |NERD_space_delim_filetype_regexp| ++|NERD_create_h_filetype| Creates a new filetype for .h files. ++|NERD_lPlace| Specifies what to use as the left ++ delimiter placeholder when nesting ++ comments. ++|NERD_left_align_regexp| Specifies which filetypes to align left ++ delimiters for. ++|NERD_mapleader| Specifies what all the commenting key ++ mappings will begin with. ++|NERD_place_holder_regexp| Specifies which filetypes may use ++ placeholders when nesting comments. ++|NERD_right_align_regexp| Specifies which filetypes to align right ++ delimiters for. ++|NERD_rPlace| Specifies what to use as the right ++ delimiter placeholder when nesting ++ comments. ++|NERD_shut_up| Stops all output from the script. ++|NERD_space_delim_filetype_regexp| Specifies which filetypes to add spaces ++ around the delimiters for. ++|NERD_use_compact_sexy_com_regexp| Specifies which filetypes to use compact ++ sexy comments for. ++|NERD_use_nested_comments_default| Tells the script to use nested comments ++ by default. ++ ++----------------------------------------------------------------------------- ++3.3 Customisation details *NERD_com-cust-details* ++ ++To enable any of the below options you should put the given line in your ++~/.vimrc ++ ++ *loaded_nerd_comments* ++If this script is driving you insane you can turn it off by setting this ++option > ++ let loaded_nerd_comments=1 ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_allow_any_visual_delims_regexp* ++This option is set to a regular expression that is used to specify which ++filetypes this option should be turned on for. If this covers the current ++filetype then, when NERD_comments is doing a visual or visual-block comment ++(but not a visual-line comment) it will choose the right delimiters to use for ++the comment. This normally means using the current delimiters if they are ++multipart or using the alternative delimiters if THEY are multipart and the ++current delims are not. For example if we are editing the following java ++code: > ++ float foo = 1221; ++ float bar = 324; ++ System.out.println(foo * bar); ++< ++If we are using // comments and select the "foo" and "bar" in visual-block ++mode, as shown left below (where '|'s are used to represent the visual-block ++boundary), and comment it then it will use the alternative delims as shown on ++the right: > ++ float |foo| = 1221; float /*foo*/ = 1221; ++ float |bar| = 324; float /*bar*/ = 324; ++ System.out.println(foo * bar); System.out.println(foo * bar); ++< ++By default this option is set to '.*' i.e is turned on for all filetypes. ++ ++----------------------------------------------------------------------------- ++ *NERD_block_com_after_right* ++This option affects commenting when it is done in visual-block mode. If this ++option is turned on, lines that begin outside the right boundary of the ++selection block will be commented. Enable this option with: > ++ let NERD_block_com_after_right=1 ++< ++For example, if you are commenting this chunk of c code in visual-block mode ++(where the '|'s are used to represent the visual-block boundary) > ++ #include ++ #include ++ #include ++ |int| main(){ ++ | | printf("SUCK THIS\n"); ++ | | while(1){ ++ | | fork(); ++ | | } ++ |} | ++< ++If NERD_block_com_after_right=1 then this code will become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ /* */ printf("SUCK THIS\n"); ++ /* */ while(1){ ++ /* */ fork(); ++ /* */ } ++ /*} */ ++< ++Otherwise, the code block would become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ printf("SUCK THIS\n"); ++ while(1){ ++ fork(); ++ } ++ /*} */ ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_comment_whole_lines_in_v_mode* ++This option can take 2 values. By default NERD_comments tries to comment out ++exactly what is selected in visual mode (v). For example if you select and ++comment the following c code (using | to represent the visual boundary): > ++ in|t foo = 3; ++ int bar =| 9; ++ int baz = foo + bar; ++< ++This will result in: > ++ in/*t foo = 3;*/ ++ /*int bar =*/ 9; ++ int baz = foo + bar; ++< ++But some people prefer it if the whole lines are commented like: > ++ /*int foo = 3;*/ ++ /*int bar = 9;*/ ++ int baz = foo + bar; ++< ++If you prefer the second option then stick this line in your .vimrc: > ++ let NERD_comment_whole_lines_in_v_mode=1 ++< ++ ++If the filetype you are editing only has no multipart delimiters (for example ++a shell script) and you hadnt set this option then the above would become > ++ in#t foo = 3; ++ #int bar = 9; ++< ++(where # is the comment delimiter) as this is the closest NERD_comments can ++come to commenting out exactly what was selected. If you prefer for whole ++lines to be commented out when there is no multipart delimiters but the EXACT ++text that was selected to be commented out if there IS multipart delimiters ++then stick the following line in your .vimrc: > ++ let NERD_comment_whole_lines_in_v_mode=2 ++< ++ ++Note that this option does not affect the behaviour of visual-block mode (). ++ ++----------------------------------------------------------------------------- ++ *NERD_dont_remove_alt_coms* ++When uncommenting a line when there is an alternative commenting style for the ++current filetype, this option tells the script not to look for, and remove, ++comments delimiters of the alternative style. > ++ let NERD_dont_remove_alt_coms=1 ++< ++For example, if you are editing a c++ file using // style comments and you go ++cu on this line: > ++ /* This is a c++ comment baby! */ ++< ++It will not be uncommented if the NERD_dont_remove_alt_coms is set to 1. ++ ++----------------------------------------------------------------------------- ++ *NERD_dont_remove_spaces_regexp* ++By default, the NERD commenter will remove spaces around comment delimiters if ++either: ++1. The current filetype matches the |NERD_space_delim_filetype_regexp| option ++ (which is a regular expression). ++2. The current filtype doesnt match NERD_dont_remove_spaces_regexp option ++ (which is also a reg exp) ++ ++This means that if we have the following lines in a c code file: > ++ /* int foo = 5; */ ++ /* int bar = 10; */ ++ int baz = foo + bar ++< ++If either of the above conditions hold then if these lines are uncommented ++they will become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++Otherwise they would become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++If you want the spaces to be removed only if the current filetype matches ++|NERD_space_delim_filetype_regexp| then set the ++NERD_dont_remove_spaces_regexp option in your vimrc so that it matches the ++desired filetypes. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++Defaults to "^python$" ++ ++----------------------------------------------------------------------------- ++ *NERD_create_h_filetype* ++If this option is set then NERD_comments will create a seperate filetype for h ++files. This could be needed because some versions of vim treat h files as cpp ++files which can be dodgy for commenting because if you are using // to comment ++cpp files then this is invalid when you are commenting h files for a c ++project (unless you arent adhering to the ANSI standard... naughty naughty). ++To enable this option, stick the following line in your .vimrc: > ++ let NERD_create_h_filetype = 1 ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_lPlace* ++ *NERD_rPlace* ++These options are used to control the strings used as place-holder delimiters. ++Place holder delimiters are used when performing nested commenting when the ++filetype supports commenting styles with both left and right delimiters. ++To set these options use lines like: > ++ let NERD_lPlace="FOO" ++ let NERD_rPlace="BAR" ++< ++Following the above example, if we have line of c code: > ++ /* int horse */ ++< ++and we comment it with cn it will be changed to: > ++ /*FOO int horse BAR*/ ++< ++When we uncomment this line it will go back to what it was. ++NERD_lPlace defaults to '[>', NERD_rPlace defaults to '<]'. ++ ++----------------------------------------------------------------------------- ++ *NERD_left_align_regexp* ++This option is a regular expression which is used to specify which filetypes ++should have their left delimiters aligned when commenting multiple lines. ++ ++For example, consider this chunk of c code: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 while(foo < 50){ ++ 4 foo = foo + bar; ++ 5 printf("i am just making up this code\n"); ++ 6 printf("i have no idea what im writing\n"); ++ 7 } ++< ++If the NERD_left_align_regexp regexp covers c files then if we select lines ++3-7 in visual mode and hit cc the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /*while(foo < 50){*/ ++ 4 /* foo = foo + bar;*/ ++ 5 /* printf("i am just making up this code\n");*/ ++ 6 /* printf("i have no idea what im writing\n");*/ ++ 7 /*}*/ ++< ++If NERD_left_align_regexp doesnt cover c files then the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /* while(foo < 50){ */ ++ 4 /* foo = foo + bar; */ ++ 5 /* printf("i am just making up this code\n"); */ ++ 6 /* printf("i have no idea what im writing\n"); */ ++ 7 /* } */ ++< ++NERD_left_align_regexp defaults to '^$' meaning no filetypes have their left ++delims aligned. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_mapleader* ++NERD_mapleader is used to specify what all the NERD commenter key mappings ++begin with. ++ ++Assuming that == '\', the default key mappings will look like this: > ++ \cc ++ \cu ++ \ca ++ \ci ++ \cs ++ ... ++< ++However, if this line: > ++ let NERD_mapleader = ',x' ++< ++were present in your vimrc then the default mappings would look like this: > ++ ,xc ++ ,xu ++ ,xa ++ ,xi ++ ,xs ++ ... ++< ++This option only affects the mappings that have not been explicitly set ++manually (see |NERD_com-cust-keys|). ++ ++Default is c. ++ ++----------------------------------------------------------------------------- ++ *NERD_menu_mode* ++This option can take 3 values: ++ "0": Turns the NERD commenter menu off completely. ++ "1": Turns the NERD commenter menu on with no menu shortcut. ++ "2": Turns the NERD commenter menu on with -c as the menu shortcut. ++ ++Default is "2". ++ ++----------------------------------------------------------------------------- ++ *NERD_place_holder_regexp* ++This option is a regular expression which is used to specify which filetypes ++place-holder delimiters should be used for when adding nested comments. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_right_align_regexp* ++This option is a regular expression which is used to specify which filetypes ++should have their right delimiters aligned when commenting multiple lines. ++ ++For example, consider this chunk of c code: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 while(foo < 50){ ++ 4 foo = foo + bar; ++ 5 printf("i am just making up this code\n"); ++ 6 printf("i have no idea what im writing\n"); ++ 7 } ++< ++If the NERD_right_align_regexp regexp covers c files then if we select lines ++3-7 in visual mode and hit cc the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /*while(foo < 50){ */ ++ 4 /*foo = foo + bar; */ ++ 5 /*printf("i am just making up this code\n"); */ ++ 6 /*printf("i have no idea what im writing\n");*/ ++ 7 /*} */ ++< ++If NERD_right_align_regexp doesnt cover c files then the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /* while(foo < 50){ */ ++ 4 /* foo = foo + bar; */ ++ 5 /* printf("i am just making up this code\n"); */ ++ 6 /* printf("i have no idea what im writing\n"); */ ++ 7 /* } */ ++< ++NERD_right_align_regexp defaults to '^$' meaning no filetypes have their right ++delims aligned. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_shut_up* ++This option is used to prevent NERD_comments from echoing anything. ++Stick this line in your .vimrc: > ++ let NERD_shut_up=1 ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_space_delim_filetype_regexp* ++Some people prefer a space after the left delimiter and before the right ++delimiter like this: > ++ /* int foo=2; */ ++< ++as opposed to this: > ++ /*int foo=2;*/ ++< ++This option is a regular expression that is used to specify which filetypes ++NERD_comments should use spaces for (as in the first eg above). ++NERD_space_delim_filetype_regexp defaults to '^$'. ++ ++See also |NERD_dont_remove_spaces_regexp|. ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_use_compact_sexy_com_regexp* ++Some people may want their sexy comments to be like this: > ++ /* Hi There! ++ * This is a sexy comment ++ * in c */ ++< ++As opposed to like this: > ++ /* ++ * Hi There! ++ * This is a sexy comment ++ * in c ++ */ ++< ++The option NERD_use_compact_sexy_com_regexp is a regular expression. If the ++filetype that the user is commenting matches this regular expression then when ++they do sexy comments they will look like the first comment above. ++ ++----------------------------------------------------------------------------- ++ *NERD_use_nested_comments_default* ++When this option is turned on comments are nested automatically. That is, if ++you hit cc on a line that is already commented, or contains comments, ++it will be commented again. > ++ let NERD_use_nested_comments_default=1 ++< ++ ++----------------------------------------------------------------------------- ++3.3 Default delimiter customisation *NERD_com-cust-delims* ++These options are used to tell NERD_comments which delimiters to use for a ++given filetype when it first loads up. To set one of these options just stick ++the corresponding line in your .vimrc. For example: if i want to use /* */ to ++delimit comments in java files instead of // (which is the default) then I ++would stick this line in my .vimrc: > ++ let NERD_use_c_style_java_comments=1 ++< ++ ++Note that if filetype has two commenting styles, which are both supported, you ++can switch between them with ca. See |NERD_com-alt-delim|. These ++options only change which style is used when the script is initialsed. ++ ++NERD_use_ada_with_spaces: use -- instead of -- for ada files. ++NERD_use_c_style_acedb_comments: use /**/ instead of // for acedb files. ++NERD_use_c_style_ch_comments: use /**/ instead of // for ch files. ++NERD_use_c_style_clean_comments: use /**/ instead of // for clean files. ++NERD_use_c_style_clipper_comments: use /**/ instead of // for clipper files. ++NERD_use_c_style_cpp_comments: use /**/ instead of // for c++ files. ++NERD_use_c_style_cs_comments: use /**/ instead of // for c# files. ++NERD_use_c_style_dot_comments: use /**/ instead of // for dot files. ++NERD_use_c_style_dylan_comments: use /**/ instead of // for dylan files. ++NERD_use_c_style_h_comments: use /**/ instead of // for h files. ++NERD_use_c_style_hercules_comments: use /**/ instead of // for hercules files. ++NERD_use_c_style_idl_comments: use /**/ instead of // for idl files. ++NERD_use_c_style_ishd_comments: use /**/ instead of // for ishd files. ++NERD_use_c_style_java_comments: use /**/ instead of // for java files. ++NERD_use_c_style_javascript_comments: use /**/ instead of // for javascript files. ++NERD_use_c_style_kscript_comments: use /**/ instead of // for kscript files. ++NERD_use_c_style_mel_comments: use /**/ instead of // for mel files. ++NERD_use_c_style_named_comments: use /**/ instead of // for named files. ++NERD_use_c_style_pccts_comments: use /**/ instead of // for pccts files. ++NERD_use_c_style_php_comments: use /* */ instead of // for php files. ++NERD_use_c_style_pike_comments: use /**/ instead of // for pike files. ++NERD_use_c_style_pilrc_comments: use /**/ instead of // for pilrc files. ++NERD_use_c_style_plm_comments: use /**/ instead of // for plm files. ++NERD_use_c_style_pov_comments: use /**/ instead of // for pov files. ++NERD_use_c_style_prolog_comments: use /**/ instead of % for prolog files. ++NERD_use_c_style_rc_comments: use /**/ instead of // for rc files. ++NERD_use_c_style_tads_comments: use /**/ instead of // for tads files. ++NERD_use_c_style_tsalt_comments: use /**/ instead of // for tsalt files. ++NERD_use_c_style_uc_comments: use /**/ instead of // for uc files. ++NERD_use_c_style_verilog_comments: use /**/ instead of // for verilog files. ++NERD_use_dash_dash_simula_comments: use -- instead of % for simula files. ++NERD_use_dnl_style_automake_comments: use dnl instead of # for automake files. ++NERD_use_hash_samba_comments: use # instead of ; for samba files. ++NERD_use_long_haskell_comments: use {--} instead of -- for haskell files. ++NERD_use_long_lisp_comments: use #||# instead of ; for lisp files. ++NERD_use_long_lua_comments: use --[[]] instead of -- for lua files. ++NERD_use_paren_star_pascal_comments: use (**) instead of {} for pascal files. ++NERD_use_REM_basic_comments: use REM instead of ' for basic files. ++NERD_use_single_part_c_comments: use // instead of /* */ for c files. ++ ++ ++----------------------------------------------------------------------------- ++3.4 Key mapping customisation *NERD_com-cust-keys* ++ ++These options are used to override the default keys that are used for the ++commenting mappings. Their values must be set to strings. As an example: if ++you wanted to use the mapping foo to uncomment lines of code then ++you would place this line in your vimrc > ++ let NERD_uncom_line_map="foo" ++< ++ ++Check out |NERD_com-functionality| for details about what the following ++mappings do. ++ ++ *NERD_alt_com_map* ++To override the ca mapping, set this option > ++ let NERD_alt_com_map="" ++< ++ *NERD_append_com_map* ++To override the ce mapping, set this option > ++ let NERD_append_com_map="" ++< ++ *NERD_com_align_left_map* ++To override the cl mapping, set this option > ++ let NERD_com_align_left_map="" ++< ++ *NERD_com_align_both_map* ++To override the cb mapping, set this option > ++ let NERD_com_align_both_map="" ++< ++ *NERD_com_align_right_map* ++To override the cr mapping, set this option > ++ let NERD_com_align_right_map="" ++< ++ *NERD_com_in_insert_map* ++To override the mapping, set this option > ++ let NERD_com_in_insert_map="" ++< ++ *NERD_com_line_invert_map* ++To override the ci mapping, set this option > ++ let NERD_com_line_invert_map="" ++< ++ *NERD_com_line_map* ++To override the cc mapping, set this option > ++ let NERD_com_line_map="" ++< ++ *NERD_com_line_nest_map* ++To override the cn mapping, set this option > ++ let NERD_com_line_nest_map="" ++< ++ *NERD_com_line_sexy_map* ++To override the cs mapping, set this option > ++ let NERD_com_line_sexy_map="" ++< ++ *NERD_com_line_toggle_map* ++To override the c mapping, set this option > ++ let NERD_com_line_toggle_map="" ++< ++ *NERD_com_line_minimal_map* ++To override the cm mapping, set this option > ++ let NERD_com_line_minimal_map="" ++< ++ *NERD_com_to_end_of_line_map* ++To override the c$ mapping, set this option > ++ let NERD_com_to_end_of_line_map="" ++< ++ *NERD_com_line_yank_map* ++To override the cy mapping, set this option > ++ let NERD_com_line_yank_map="" ++< ++ *NERD_uncom_line_map* ++To override the cu mapping, set this option > ++ let NERD_uncom_line_map="" ++< ++ ++------------------------------------------------------------------------------ ++3.5 Sample regular expressions *NERD_com-reg-exps* ++ ++Many of the options in the NERD commenter must be set to regular ++expressions... regular expressions can be a bit confusing so i have provided ++some template ones here that you can start from: ++ ++Regexp1: '.*' ++Matches any filetype. This is useful for turning an option on for all files. ++ ++Regexp2: '^$' ++Matches no filetypes. This is useful for turning an option off for all files. ++ ++Regexp3: '^\(java\)$' ++Matches only the java filetype. ++ ++Regexp4: '^\(c\|vim\)$' ++Matches only c and vim filetypes. ++ ++Regexp5: '^\(c.*\|vim\)$' ++Matches filetypes beginning with c (eg c, cpp, cs, etc) as well ++as vim files. ++ ++Regexp6: '^\(c.*\|java\|tex\)$' ++Matches filetypes beginning with c (eg c, cpp, cs, etc) as well as java and ++tex filetypes. ++ ++Regexp7: '^\(python\)\@!' ++Matches anything other than 'python'. ++ ++Regexp8: '^c\(s\)\@!' ++Matches 'c' followed by anything accept an 's'. ++ ++Regexp9: '^\(foo$\|bar$\|baz$\)\@!' ++Matches any strings except 'foo', 'bar' and 'baz'. ++ ++============================================================================== ++4. Issues with the script{{{2 *NERD_com-issues* ++ ++ ++------------------------------------------------------------------------------ ++4.1 Delimiter detection heuristics *NERD_com-heuristics* ++ ++Heuristics are used to distinguish the real comment delimiters ++ ++Because we have comment mappings that place delimiters in the middle of lines, ++removing comment delimiters is a bit tricky. This is because if comment ++delimiters appear in a line doesnt mean they really ARE delimiters. For ++example, Java uses // comments but the line > ++ System.out.println("//"); ++< ++clearly contains no real comment delimiters. ++ ++To distinguish between ``real'' comment delimiters and ``fake'' ones we use a ++set of heuristics. For example, one such heuristic states that any comment ++delimiter that has an odd number of non-escaped " characters both preceding ++and following it on the line is not a comment because it is probably part of a ++string. These heuristics, while usually pretty accurate, will not work for all ++cases. ++ ++------------------------------------------------------------------------------ ++4.2 Nesting issues *NERD_com-nesting* ++ ++If we have some line of code like this: > ++ /*int foo */ = /*5 + 9;*/ ++< ++This will not be uncommented legally. The NERD commenter will remove the ++"outter most" delimiters so the line will become: > ++ int foo */ = /*5 + 9; ++< ++which almost certainly will not be what you want. Nested sets of comments will ++uncomment fine though. Eg: > ++ /*int/* foo =*/ 5 + 9;*/ ++< ++will become: > ++ int/* foo =*/ 5 + 9; ++< ++(Note that in the above examples I have deliberately not used place holders ++for simplicity) ++ ++------------------------------------------------------------------------------ ++4.3 Mark clobbering *NERD_com-mark-clobbering* ++ ++The script clobbers the s and t marks when doing most comments. Im not sure ++how to save and restore the marks yet. ++ ++ ++ ++============================================================================== ++5. TODO list {{{2 *NERD_com-todo* ++ ++Uncommenting of minimal comments needs to be more robust. Currently it is easy ++to get illegal syntax when uncommenting them. ++ ++ ++ ++============================================================================== ++6. Credits {{{2 *NERD_com-credits* ++ ++Thanks and respect to the following people: ++ ++Thanks to Nick Brettell for his many ideas and criticisms. A bloody good ++bastard. ++:normal :.-2s/good// ++ ++Thanks to Matthew Hawkins for his awesome refactoring! ++ ++Thanks to the authors of the vimspell whose documentation ++installation function I stole :) ++ ++Thanks to Greg Searle for the idea of using place-holders for nested comments. ++ ++Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! ++Also, thanks for the idea of doing sexy comments as well as his suggestions ++relating to it :P ++Thanks again to Nguyen for complaining about the NERD_comments menu mapping ++(-c) interfering with another mapping of his... and thus the ++NERD_dont_create_menu_shortcut option was born :P ++(it was then replaced with NERD_menu_mode in version 1.67 :) ++ ++Thanks to Sam R for pointing out some filetypes that NERD_comments could support! ++ ++Cheers to Litchi for the idea of having a mapping that appends a comment to ++the current line :) ++ ++Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some ++problems with commenting in visual mode. Thanks again to Jorge for his ++continued suggestions on this matter :) ++ ++Thanks to Martin Stubenschrott for pointing out a bug with the mapping ++:) Ive gotta stop breaking this mapping! ++ ++Thanks to Markus Erlmann for pointing out a conflict that this script was ++having with the taglist plugin. ++ ++Thanks to Brent Rice for alerting me about, and helping me track down, a bug ++in the script when the "ignorecase" option in vim was set. ++ ++Thanks to Richard Willis for telling me about how line continuation was ++causing problems on cygwin. Also, thanks pointing out a bug in the help file ++and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI ++have mercy on your soul :) ++ ++Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". ++Also, thanks for his suggested improvements about toggle comments after i ++implemented them. ++ ++Thanks to harry for telling me that i broke the cn mapping in 1.53 :), ++and thanks again for telling me about a bug that occurred when editing a file ++in a new tab. ++ ++Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc ++install function and added support for ada comments with spaces as well as ++making a couple of other small changes. ++ ++Thanks to David Bourgeois for pointing out a bug with when commenting c files ++:)... [a few days later] ok i completely misunderstood what David was talking ++about and ended up fixing a completely different bug to what he was talking ++about :P ++ ++Thanks to David Bourgeois for pointing out a bug when changing buffers. ++ ++Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that ++was causing spaces to be added to the end of lines with single-part ++delimiters. It's nice when people do my work for me :D ++ ++Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting ++sexy comments. Sexy comments dont look so sexy when they are only half removed ++:P ++ ++Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping ++the NERD_space_delim_filetype_regexp option from working with left aligned ++toggle comments. And for pointing out a bug when initialising VB comments. ++ ++Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". ++And for suggested improvements to minimal comments. ++ ++Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. ++In 1.65 ++ ++Thanks to Jonathan Derque for alerting me to some filetypes that could be ++supported (Namely: context, plaintext and mail). ++ ++Thanks to Joseph Barker for the sugesting that the menu be an optional ++feature. ++ ++Thanks to Gary Church and Tim Carey-Smith for complaining about the ++keymappings and causing me to introduce the NERD_mapleader option :) ++ ++ ++Cheers to myself for being the best looking man on Earth! ++ ++ ++ vim:tw=78:ts=8:ft=help:norl: +diff -urN vim71/1/doc/.svn/all-wcprops vim71_ada/1/doc/.svn/all-wcprops +--- vim71/1/doc/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,29 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 48 ++/svnroot/gnuada/!svn/ver/788/trunk/tools/vim/doc ++END ++NERD_commenter.txt ++K 25 ++svn:wc:ra_dav:version-url ++V 67 ++/svnroot/gnuada/!svn/ver/695/trunk/tools/vim/doc/NERD_commenter.txt ++END ++taglist.txt ++K 25 ++svn:wc:ra_dav:version-url ++V 60 ++/svnroot/gnuada/!svn/ver/695/trunk/tools/vim/doc/taglist.txt ++END ++matchit.txt ++K 25 ++svn:wc:ra_dav:version-url ++V 60 ++/svnroot/gnuada/!svn/ver/637/trunk/tools/vim/doc/matchit.txt ++END ++ft_ada.txt ++K 25 ++svn:wc:ra_dav:version-url ++V 59 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/doc/ft_ada.txt ++END +diff -urN vim71/1/doc/.svn/dir-prop-base vim71_ada/1/doc/.svn/dir-prop-base +--- vim71/1/doc/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,6 @@ ++K 10 ++svn:ignore ++V 9 ++.backups ++ ++END +diff -urN vim71/1/doc/.svn/entries vim71_ada/1/doc/.svn/entries +--- vim71/1/doc/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/entries 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,80 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/doc ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-10-20T15:07:17.667304Z ++788 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ ++NERD_commenter.txt ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++67487d5a77170782f3bad494085dedfb ++2007-04-27T17:57:11.151403Z ++695 ++krischik ++has-props ++ ++taglist.txt ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++33a058766478d752e8d1dfe9071a08f3 ++2007-04-27T17:57:11.151403Z ++695 ++krischik ++has-props ++ ++matchit.txt ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++7ee1544d0c37d7a8d699cf0baf0b70f7 ++2007-03-12T16:56:27.566705Z ++637 ++krischik ++has-props ++ ++ft_ada.txt ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++0e59f93e383b93e67cd824c362123989 ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ +diff -urN vim71/1/doc/.svn/format vim71_ada/1/doc/.svn/format +--- vim71/1/doc/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/format 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/doc/.svn/prop-base/ft_ada.txt.svn-base vim71_ada/1/doc/.svn/prop-base/ft_ada.txt.svn-base +--- vim71/1/doc/.svn/prop-base/ft_ada.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/prop-base/ft_ada.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,5 @@ ++K 13 ++svn:mime-type ++V 10 ++text/plain ++END +diff -urN vim71/1/doc/.svn/prop-base/matchit.txt.svn-base vim71_ada/1/doc/.svn/prop-base/matchit.txt.svn-base +--- vim71/1/doc/.svn/prop-base/matchit.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/prop-base/matchit.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,5 @@ ++K 13 ++svn:mime-type ++V 10 ++text/plain ++END +diff -urN vim71/1/doc/.svn/prop-base/NERD_commenter.txt.svn-base vim71_ada/1/doc/.svn/prop-base/NERD_commenter.txt.svn-base +--- vim71/1/doc/.svn/prop-base/NERD_commenter.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/prop-base/NERD_commenter.txt.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,5 @@ ++K 13 ++svn:mime-type ++V 10 ++text/plain ++END +diff -urN vim71/1/doc/.svn/prop-base/taglist.txt.svn-base vim71_ada/1/doc/.svn/prop-base/taglist.txt.svn-base +--- vim71/1/doc/.svn/prop-base/taglist.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/prop-base/taglist.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,5 @@ ++K 13 ++svn:mime-type ++V 10 ++text/plain ++END +diff -urN vim71/1/doc/.svn/text-base/ft_ada.txt.svn-base vim71_ada/1/doc/.svn/text-base/ft_ada.txt.svn-base +--- vim71/1/doc/.svn/text-base/ft_ada.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/text-base/ft_ada.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,516 @@ ++*ft_ada.txt* Ada File type Plug-ins Last change: 2007 Seb 17 ++ ++ ++ ADA FILE TYPE PLUG-INS REFERENCE MANUAL~ ++ ++ADA *ada.vim* ++ ++1. Syntax Highlighting |ft-ada-syntax| ++2. Plug-in |ft-ada-plugin| ++3. Omni Completion |ft-ada-omni| ++ 3.1 Omni Completion with "gnat xref" |gnat-xref| ++ 3.2 Omni Completion with "ctags" |ada-ctags| ++4. Compiler Support |ada-compiler| ++ 4.1 GNAT |compiler-gnat| ++ 4.1 Dec Ada |compiler-decada| ++5. References |ada-reference| ++ 5.1 Options |ft-ada-options| ++ 5.2 Functions |ft-ada-functions| ++ 5.3 Commands |ft-ada-commands| ++ 5.4 Variables |ft-ada-variables| ++ 5.5 Constants |ft-ada-contstants| ++8. Extra Plug-ins |ada-extra-plugins| ++ ++============================================================================== ++1. Syntax Highlighting ~ ++ *ft-ada-syntax* ++ ++This mode is designed for the 2005 edition of Ada ("Ada 2005"), which includes ++support for objected-programming, protected types, and so on. It handles code ++written for the original Ada language ("Ada83", "Ada87", "Ada95") as well, ++though code which uses Ada 2005-only keywords will be wrongly colored (such ++code should be fixed anyway). For more information about Ada, see ++http://www.adapower.com. ++ ++The Ada mode handles a number of situations cleanly. ++ ++For example, it knows that the "-" in "-5" is a number, but the same character ++in "A-5" is an operator. Normally, a "with" or "use" clause referencing ++another compilation unit is coloured the same way as C's "#include" is coloured. ++If you have "Conditional" or "Repeat" groups coloured differently, then "end ++if" and "end loop" will be coloured as part of those respective groups. ++ ++You can set these to different colours using vim's "highlight" command (e.g., ++to change how loops are displayed, enter the command ":hi Repeat" followed by ++the colour specification; on simple terminals the colour specification ++ctermfg=White often shows well). ++ ++There are several options you can select in this Ada mode. See|ft-ada-options| ++for a complete list. ++ ++To enable them, assign a value to the option. For example, to turn one on: ++ > ++ > let g:ada_standard_types = 1 ++> ++To disable them use ":unlet". Example: ++> ++ > unlet g:ada_standard_types ++ ++You can just use ":" and type these into the command line to set these ++temporarily before loading an Ada file. You can make these option settings ++permanent by adding the "let" command(s), without a colon, to your "~/.vimrc" ++file. ++ ++Even on a slow (90Mhz) PC this mode works quickly, but if you find the ++performance unacceptable, turn on |g:ada_withuse_ordinary|. ++ ++Syntax folding instructions (|fold-syntax|) are added when |g:ada_folding| is ++set. ++ ++============================================================================== ++2. File type Plug-in ~ ++ *ft-ada-indent* *ft-ada-plugin* ++ ++The Ada plug-in provides support for: ++ ++ - auto indenting (|indent.txt|) ++ - insert completion (|i_CTRL-N|) ++ - user completion (|i_CTRL-X_CTRL-U|) ++ - tag searches (|tagsrch.txt|) ++ - Quick Fix (|quickfix.txt|) ++ - backspace handling (|'backspace'|) ++ - comment handling (|'comments'|, |'commentstring'|) ++ ++The plug-in only activates the features of the Ada mode whenever an Ada ++files is opened and add adds Ada related entries to the main and pop-up menu. ++ ++============================================================================== ++3. Omni Completion ~ ++ *ft-ada-omni* ++ ++The Ada omni-completions (|i_CTRL-X_CTRL-O|) uses tags database created either ++by "gnat xref -v" or the "exuberant Ctags (http://ctags.sourceforge.net). The ++complete function will automatically detect which tool was used to create the ++tags file. ++ ++------------------------------------------------------------------------------ ++3.1 Omni Completion with "gnat xref" ~ ++ *gnat-xref* ++ ++GNAT XREF uses the compiler internal information (ali-files) to produce the ++tags file. This has the advantage to be 100% correct and the option of deep ++nested analysis. However the code must compile, the generator is quite ++slow and the created tags file contains only the basic Ctags information for ++each entry - not enough for some of the more advanced Vim code browser ++plug-ins. ++ ++NOTE: "gnat xref -v" is very tricky to use as it has almost no diagnostic ++ output - If nothing is printed then usually the parameters are wrong. ++ Here some important tips: ++ ++1) You need to compile your code first and use the "-aO" option to point to ++ your .ali files. ++2) "gnat xref -v ../Include/adacl.ads" won't work - use the "gnat xref -v ++ -aI../Include adacl.ads" instead. ++3) "gnat xref -v -aI../Include *.ad?" won't work - use "cd ../Include" and ++ then "gnat xref -v *.ad?" ++4) Project manager support is completely broken - don't even try "gnat xref ++ -Padacl.gpr". ++5) VIM is faster when the tags file is sorted - use "sort --unique ++ --ignore-case --output=tags tags" . ++6) Remember to insert "!_TAG_FILE_SORTED 2 %sort ui" as first line to mark ++ the file assorted. ++ ++------------------------------------------------------------------------------ ++3.2 Omni Completion with "ctags"~ ++ *ada-ctags* ++ ++Exuberant Ctags uses it's own multi-language code parser. The parser is quite ++fast, produces a lot of extra informations (hence the name "Exuberant Ctags") ++and can run on files which currently do not compile. ++ ++There are also lots of other Vim-tools which use exuberant Ctags. ++ ++You will need to install a version of the Exuberant Ctags which has Ada ++support patched in. Such a version is available from the GNU Ada Project ++(http://gnuada.sourceforge.net). ++ ++The Ada parser for Exuberant Ctags is fairly new - don't expect complete ++support yet. ++ ++============================================================================== ++4. Compiler Support ~ ++ *ada-compiler* ++ ++The Ada mode supports more then one Ada compiler and will automatically load the ++compiler set in|g:ada_default_compiler|whenever an Ada source is opened. The ++provided compiler plug-ins are split into the actual compiler plug-in and a ++collection of support functions and variables. This allows the easy ++development of specialized compiler plug-ins fine tuned to your development ++environment. ++ ++------------------------------------------------------------------------------ ++4.1 GNAT ~ ++ *compiler-gnat* ++ ++GNAT is the only free (beer and speech) Ada compiler available. There are ++several version available which differentiate in the licence terms used. ++ ++The GNAT compiler plug-in will perform a compile on pressing and then ++immediately shows the result. You can set the project file to be used by ++setting: ++ > ++ > call g:gnat.Set_Project_File ('my_project.gpr') ++ ++Setting a project file will also create a Vim session (|views-sessions|) so - ++like with the GPS - opened files, window positions etc. will remembered ++separately for all projects. ++ ++ *gnat_members* ++GNAT OBJECT ~ ++ ++ *g:gnat.Make()* ++g:gnat.Make() ++ Calls|g:gnat.Make_Command|and displays the result inside a ++ |quickfix| window. ++ ++ *g:gnat.Pretty()* ++g:gnat.Pretty() ++ Calls|g:gnat.Pretty_Command| ++ ++ *g:gnat.Find()* ++g:gnat.Find() ++ Calls|g:gnat.Find_Command| ++ ++ *g:gnat.Tags()* ++g:gnat.Tags() ++ Calls|g:gnat.Tags_Command| ++ ++ *g:gnat.Set_Project_File()* ++g:gnat.Set_Project_File([{file}]) ++ Set gnat project file and load associated session. An open ++ project will be closed and the session written. If called ++ without file name the file selector opens for selection of a ++ project file. If called with an empty string then the project ++ and associated session are closed. ++ ++ *g:gnat.Project_File* ++g:gnat.Project_File string ++ Current project file. ++ ++ *g:gnat.Make_Command* ++g:gnat.Make_Command string ++ External command used for|g:gnat.Make()| (|'makeprg'|). ++ ++ *g:gnat.Pretty_Program* ++g:gnat.Pretty_Program string ++ External command used for|g:gnat.Pretty()| ++ ++ *g:gnat.Find_Program* ++g:gnat.Find_Program string ++ External command used for|g:gnat.Find()| ++ ++ *g:gnat.Tags_Command* ++g:gnat.Tags_Command string ++ External command used for|g:gnat.Tags()| ++ ++ *g:gnat.Error_Format* ++g:gnat.Error_Format string ++ Error format (|'errorformat'|) ++ ++------------------------------------------------------------------------------ ++4.2 Dec Ada ~ ++ *compiler-hpada* *compiler-decada* ++ *compiler-vaxada* *compiler-compaqada* ++ ++Dec Ada (also known by - in chronological order - VAX Ada, Dec Ada, Compaq Ada ++and HP Ada) is a fairly dated Ada 83 compiler. Support is basic: will ++compile the current unit. ++ ++The Dec Ada compiler expects the package name and not the file name to be ++passed a parameter. The compiler plug-in supports the usual file name ++convention to convert the file into a unit name. For separates both '-' and ++'__' are allowed. ++ ++ *decada_members* ++DEC ADA OBJECT ~ ++ ++ *g:decada.Make()* ++g:decada.Make() function ++ Calls|g:decada.Make_Command|and displays the result inside a ++ |quickfix| window. ++ ++ *g:decada.Unit_Name()* ++g:decada.Unit_Name() function ++ Get the Unit name for the current file. ++ ++ *g:decada.Make_Command* ++g:decada.Make_Command string ++ External command used for|g:decadat.Make()| (|'makeprg'|). ++ ++ *g:decada.Error_Format* ++g:decada.Error_Format| string ++ Error format (|'errorformat'|). ++ ++============================================================================== ++5. References ~ ++ *ada-reference* ++ ++------------------------------------------------------------------------------ ++5.1 Options ~ ++ *ft-ada-options* ++ ++ *g:ada_standard_types* ++g:ada_standard_types bool (true when exists) ++ Highlight types in package Standard (e.g., "Float") ++ ++ *g:ada_space_errors* ++ *g:ada_no_trail_space_error* ++ *g:ada_no_tab_space_error* ++ *g:ada_all_tab_usage* ++g:ada_space_errors bool (true when exists) ++ Highlight extraneous errors in spaces ... ++ g:ada_no_trail_space_error ++ - but ignore trailing spaces at the end of a line ++ g:ada_no_tab_space_error ++ - but ignore tabs after spaces ++ g:ada_all_tab_usage ++ - highlight all tab use ++ ++ *g:ada_line_errors* ++g:ada_line_errors bool (true when exists) ++ Highlight lines which are to long. Note: This highlighting ++ option is quite CPU intensive. ++ ++ *g:ada_rainbow_color* ++g:ada_rainbow_color bool (true when exists) ++ Use rainbow colours for '(' and ')'. You need the ++ rainbow_parenthesis for this to work ++ ++ *g:ada_folding* ++g:ada_folding set ('sigpft') ++ Use folding for Ada sources. ++ 's': activate syntax folding on load ++ 'p': fold packages ++ 'f': fold functions and procedures ++ 't': fold types ++ 'c': fold conditionals ++ 'g': activate gnat pretty print folding on load ++ 'i': lone 'is' folded with line above ++ 'b': lone 'begin' folded with line above ++ 'p': lone 'private' folded with line above ++ 'x': lone 'exception' folded with line above ++ 'i': activate indent folding on load ++ ++ Note: Syntax folding is in an early (unuseable) stage and ++ indent or gnat pretty folding is suggested. ++ ++ For gnat pretty folding to work the following settings are ++ suggested: -cl3 -M79 -c2 -c3 -c4 -A1 -A2 -A3 -A4 -A5 ++ ++ For indent folding to work the following settings are ++ suggested: shiftwidth=3 softtabstop=3 ++ ++ *g:ada_abbrev* ++g:ada_abbrev bool (true when exists) ++ Add some abbreviations. This feature more or less superseded ++ by the various completion methods. ++ ++ *g:ada_withuse_ordinary* ++g:ada_withuse_ordinary bool (true when exists) ++ Show "with" and "use" as ordinary keywords (when used to ++ reference other compilation units they're normally highlighted ++ specially). ++ ++ *g:ada_begin_preproc* ++g:ada_begin_preproc bool (true when exists) ++ Show all begin-like keywords using the colouring of C ++ preprocessor commands. ++ ++ *g:ada_omni_with_keywords* ++g:ada_omni_with_keywords ++ Add Keywords, Pragmas, Attributes to omni-completions ++ (|compl-omni|). Note: You can always complete then with user ++ completion (|i_CTRL-X_CTRL-U|). ++ ++ *g:ada_extended_tagging* ++g:ada_extended_tagging enum ('jump', 'list') ++ use extended tagging, two options are available ++ 'jump': use tjump to jump. ++ 'list': add tags quick fix list. ++ Normal tagging does not support function or operator ++ overloading as these features are not available in C and ++ tagging was originally developed for C. ++ ++ *g:ada_extended_completion* ++g:ada_extended_completion ++ Uses extended completion for and completions ++ (|i_CTRL-N|). In this mode the '.' is used as part of the ++ identifier so that 'Object.Method' or 'Package.Procedure' are ++ completed together. ++ ++ *g:ada_gnat_extensions* ++g:ada_gnat_extensions bool (true when exists) ++ Support GNAT extensions. ++ ++ *g:ada_with_gnat_project_files* ++g:ada_with_gnat_project_files bool (true when exists) ++ Add gnat project file keywords and Attributes. ++ ++ *g:ada_default_compiler* ++g:ada_default_compiler string ++ set default compiler. Currently supported is 'gnat' and ++ 'decada'. ++ ++An "exists" type is a boolean is considered true when the variable is defined ++and false when the variable is undefined. The value which the variable is ++set makes no difference. ++ ++------------------------------------------------------------------------------ ++5.3 Commands ~ ++ *ft-ada-commands* ++ ++:AdaRainbow *:AdaRainbow* ++ Toggles rainbow colour (|g:ada_rainbow_color|) mode for ++ '(' and ')' ++ ++:AdaLines *:AdaLines* ++ Toggles line error (|g:ada_line_errors|) display ++ ++:AdaSpaces *:AdaSpaces* ++ Toggles space error (|g:ada_space_errors|) display. ++ ++:AdaTagDir *:AdaTagDir* ++ Creates tags file for the directory of the current file. ++ ++:AdaTagFile *:AdaTagFile* ++ Creates tags file for the current file. ++ ++:AdaTypes *:AdaTypes* ++ Toggles standard types (|g:ada_standard_types|) colour. ++ ++:GnatFind *:GnatFind* ++ Calls |g:gnat.Find()| ++ ++:GnatPretty *:GnatPretty* ++ Calls |g:gnat.Pretty()| ++ ++:GnatTags *:GnatTags* ++ Calls |g:gnat.Tags()| ++ ++------------------------------------------------------------------------------ ++5.3 Variables ~ ++ *ft-ada-variables* ++ ++ *g:gnat* ++g:gnat object ++ Control object which manages GNAT compiles. The object ++ is created when the first Ada source code is loaded provided ++ that |g:ada_default_compiler|is set to 'gnat'. See|gnat_members| ++ for details. ++ ++ *g:decada* ++g:decada object ++ Control object which manages Dec Ada compiles. The object ++ is created when the first Ada source code is loaded provided ++ that |g:ada_default_compiler|is set to 'decada'. See ++ |decada_members|for details. ++ ++------------------------------------------------------------------------------ ++5.4 Constants ~ ++ *ft-ada-constants* ++ ft-ada-constants ++ ++All constants are locked. See |:lockvar| for details. ++ ++ *g:ada#WordRegex* ++g:ada#WordRegex string ++ Regular expression to search for Ada words ++ ++ *g:ada#DotWordRegex* ++g:ada#DotWordRegex string ++ Regular expression to search for Ada words separated by dots. ++ ++ *g:ada#Comment* ++g:ada#Comment string ++ Regular expression to search for Ada comments ++ ++ *g:ada#Keywords* ++g:ada#Keywords list of dictionaries ++ List of keywords, attributes etc. pp. in the format used by ++ omni completion. See |complete-items| for details. ++ ++ *g:ada#Ctags_Kinds* ++g:ada#Ctags_Kinds dictionary of lists ++ Dictionary of the various kinds of items which the Ada support ++ for Ctags generates. ++ ++------------------------------------------------------------------------------ ++5.2 Functions ~ ++ *ft-ada-functions* ++ ++ada#Word([{line}, {col}]) *ada#Word()* ++ Return full name of Ada entity under the cursor (or at given ++ line/column), stripping white space/newlines as necessary. ++ ++ada#List_Tag([{line}, {col}]) *ada#Listtags()* ++ List all occurrences of the Ada entity under the cursor (or at ++ given line/column) inside the quick-fix window ++ ++ada#Jump_Tag ({ident}, {mode}) *ada#Jump_Tag()* ++ List all occurrences of the Ada entity under the cursor (or at ++ given line/column) in the tag jump list. Mode can either be ++ 'tjump' or 'stjump'. ++ ++ada#Create_Tags ({option}) *ada#Create_Tags()* ++ Creates tag file using Ctags. The option can either be 'file' ++ for the current file, 'dir' for the directory of the current ++ file or a file name. ++ ++gnat#Insert_Tags_Header() *gnat#Insert_Tags_Header()* ++ Adds the tag file header (!_TAG_) information to the current ++ file which are missing from the GNAT XREF output. ++ ++ada#Switch_Syntax_Option ({option}) *ada#Switch_Syntax_Option()* ++ Toggles highlighting options on or off. Used for the Ada menu. ++ ++ *gnat#New()* ++gnat#New () ++ Create a new gnat object. See |g:gnat| for details. ++ ++ ++============================================================================== ++8. Extra Plugins ~ ++ *ada-extra-plugins* ++ ++You can optionally install the following extra plug-in. They work well with Ada ++and enhance the ability of the Ada mode.: ++ ++backup.vim ++ http://www.vim.org/scripts/script.php?script_id=1537 ++ Keeps as many backups as you like so you don't have to. ++ ++rainbow_parenthsis.vim ++ http://www.vim.org/scripts/script.php?script_id=1561 ++ Very helpful since Ada uses only '(' and ')'. ++ ++nerd_comments.vim ++ http://www.vim.org/scripts/script.php?script_id=1218 ++ Excellent commenting and uncommenting support for almost any ++ programming language. ++ ++matchit.vim ++ http://www.vim.org/scripts/script.php?script_id=39 ++ '%' jumping for any language. The normal '%' jump only works for '{}' ++ style languages. The Ada mode will set the needed search patters. ++ ++taglist.vim ++ http://www.vim.org/scripts/script.php?script_id=273 ++ Source code explorer sidebar. There is a patch for Ada available. ++ ++The GNU Ada Project distribution (http://gnuada.sourceforge.net) of Vim ++contains all of the above. ++ ++============================================================================== ++vim: textwidth=78 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++vim: filetype=help +diff -urN vim71/1/doc/.svn/text-base/matchit.txt.svn-base vim71_ada/1/doc/.svn/text-base/matchit.txt.svn-base +--- vim71/1/doc/.svn/text-base/matchit.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/text-base/matchit.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,405 @@ ++*matchit.txt* Extended "%" matching ++ ++For instructions on installing this file, type ++ :help matchit-install ++inside Vim. ++ ++For Vim version 6.3. Last change: 2006 Feb 23 ++ ++ ++ VIM REFERENCE MANUAL by Benji Fisher ++ ++*matchit* *matchit.vim* ++ ++1. Extended matching with "%" |matchit-intro| ++2. Activation |matchit-activate| ++3. Configuration |matchit-configure| ++4. Supporting a New Language |matchit-newlang| ++5. Known Bugs and Limitations |matchit-bugs| ++ ++The functionality mentioned here is a plugin, see |add-plugin|. ++This plugin is only available if 'compatible' is not set. ++You can avoid loading this plugin by setting the "loaded_matchit" variable ++in your |vimrc| file: > ++ :let loaded_matchit = 1 ++ ++{Vi does not have any of this} ++ ++============================================================================== ++1. Extended matching with "%" *matchit-intro* ++ ++ *matchit-%* ++% Cycle forward through matching groups, such as "if", "else", "endif", ++ as specified by |b:match_words|. ++ ++ *g%* *v_g%* *o_g%* ++g% Cycle backwards through matching groups, as specified by ++ |b:match_words|. For example, go from "endif" to "else" to "if". ++ ++ *[%* *v_[%* *o_[%* ++[% Go to [count] previous unmatched group, as specified by ++ |b:match_words|. Similar to |[{|. ++ ++ *]%* *v_]%* *o_]%* ++]% Go to [count] next unmatched group, as specified by ++ |b:match_words|. Similar to |]}|. ++ ++ *v_a%* ++a% In Visual mode, select the matching group, as specified by ++ |b:match_words|, containing the cursor. Similar to |v_a[|. ++ A [count] is ignored, and only the first character of the closing ++ pattern is selected. ++ ++In Vim, as in plain vi, the percent key, |%|, jumps the cursor from a brace, ++bracket, or paren to its match. This can be configured with the 'matchpairs' ++option. The matchit plugin extends this in several ways: ++ ++ You can match whole words, such as "if" and "endif", not just ++ single characters. You can also specify a |regular-expression|. ++ You can define groups with more than two words, such as "if", ++ "else", "endif". Banging on the "%" key will cycle from the "if" to ++ the first "else", the next "else", ..., the closing "endif", and back ++ to the opening "if". Nested structures are skipped. Using |g%| goes ++ in the reverse direction. ++ By default, words inside comments and strings are ignored, unless ++ the cursor is inside a comment or string when you type "%". If the ++ only thing you want to do is modify the behavior of "%" so that it ++ behaves this way, you can > ++ :let b:match_words = &matchpairs ++< ++See |matchit-details| for details on what the script does, and |b:match_words| ++for how to specify matching patterns. ++ ++MODES: *matchit-modes* *matchit-v_%* *matchit-o_%* ++ ++Mostly, % and related motions (|g%| and |[%| and |]%|) work just like built-in ++|motion| commands in |Operator-pending| and |Visual| modes. However, you ++cannot make these motions |linewise| or |characterwise|, since the |:omap|s ++that define them start with "v" in order to make the default behavior ++inclusive. (See |o_v|.) In other words, "dV%" will not work. The ++work-around is to go through Visual mode: "V%d" will work. ++ ++LANGUAGES: *matchit-languages* ++ ++Currently, the following languages are supported: Ada, ASP with VBS, Csh, ++DTD, Entity, Essbase, Fortran, HTML, JSP (same as HTML), LaTeX, Lua, Pascal, ++SGML, Shell, Tcsh, Vim, XML. Other languages may already have support via ++|filetype-plugin|s. ++ ++To support a new language, see |matchit-newlang| below. ++ ++DETAILS: *matchit-details* *matchit-parse* ++ ++Here is an outline of what matchit.vim does each time you hit the "%" key. If ++there are |backref|s in |b:match_words| then the first step is to produce a ++version in which these back references have been eliminated; if there are no ++|backref|s then this step is skipped. This step is called parsing. For ++example, "\(foo\|bar\):end\1" is parsed to yield ++"\(foo\|bar\):end\(foo\|bar\)". This can get tricky, especially if there are ++nested groups. If debugging is turned on, the parsed version is saved as ++|b:match_pat|. ++ ++ *matchit-choose* ++Next, the script looks for a word on the current line that matches the pattern ++just constructed. It includes the patterns from the 'matchpairs' option. ++The goal is to do what you expect, which turns out to be a little complicated. ++The script follows these rules: ++ ++ Insist on a match that ends on or after the cursor. ++ Prefer a match that includes the cursor position (that is, one that ++ starts on or before the cursor). ++ Prefer a match that starts as close to the cursor as possible. ++ Prefer a match in |b:match_words| to a match in 'matchpairs'. ++ If more than one pattern in |b:match_words| matches, choose the one ++ that is listed first. ++ ++Examples: ++ ++ Suppose you > ++ :let b:match_words = '<:>,:' ++< and hit "%" with the cursor on or before the "<" in "a is born". ++ The pattern '<' comes first, so it is preferred over '', which ++ also matches. If the cursor is on the "t", however, then '' is ++ preferred, because this matches a bit of text containing the cursor. ++ If the two groups of patterns were reversed then '<' would never be ++ preferred. ++ ++ Suppose you > ++ :let b:match_words = 'if:end if' ++< (Note the space!) and hit "%" with the cursor at the end of "end if". ++ Then "if" matches, which is probably not what you want, but if the ++ cursor starts on the "end " then "end if" is chosen. (You can avoid ++ this problem by using a more complicated pattern.) ++ ++If there is no match, the script falls back on the usual behavior of |%|. If ++debugging is turned on, the matched bit of text is saved as |b:match_match| ++and the cursor column of the start of the match is saved as |b:match_col|. ++ ++Next, the script looks through |b:match_words| (original and parsed versions) ++for the group and pattern that match. If debugging is turned on, the group is ++saved as |b:match_ini| (the first pattern) and |b:match_tail| (the rest). If ++there are |backref|s then, in addition, the matching pattern is saved as ++|b:match_word| and a table of translations is saved as |b:match_table|. If ++there are |backref|s, these are determined from the matching pattern and ++|b:match_match| and substituted into each pattern in the matching group. ++ ++The script decides whether to search forwards or backwards and chooses ++arguments for the |searchpair()| function. Then, the cursor is moved to the ++start of the match, and |searchpair()| is called. By default, matching ++structures inside strings and comments are ignored. This can be changed by ++setting |b:match_skip|. ++ ++============================================================================== ++2. Activation *matchit-activate* ++ ++You can use this script as a plugin, by copying it to your plugin directory. ++See |add-global-plugin| for instructions. You can also add a line to your ++|vimrc| file, such as > ++ :source $VIMRUNTIME/macros/matchit.vim ++or > ++ :runtime macros/matchit.vim ++Either way, the script should start working the next time you start up Vim. ++ ++The script does nothing unless it finds a |buffer-variable| named ++|b:match_words|. The script contains autocommands that set this variable for ++various file types: see |matchit-languages| above. For a new language, you ++can add autocommands to the script or to your vimrc file, but the recommended ++method is to add a line such as > ++ let b:match_words = '\:\' ++to the |filetype-plugin| for your language. See |b:match_words| below for how ++this variable is interpreted. ++ ++TROUBLESHOOTING *matchit-troubleshoot* ++ ++The script should work in most installations of Vim. It may not work if Vim ++was compiled with a minimal feature set, for example if the |+syntax| option ++was not enabled. If your Vim has support for syntax compiled in, but you do ++not have |syntax| highlighting turned on, matchit.vim should work, but it may ++fail to skip matching groups in comments and strings. If the |filetype| ++mechanism is turned off, the |b:match_words| variable will probably not be ++defined automatically. ++ ++============================================================================== ++3. Configuration *matchit-configure* ++ ++There are several variables that govern the behavior of matchit.vim. Note ++that these are variables local to the buffer, not options, so use |:let| to ++define them, not |:set|. Some of these variables have values that matter; for ++others, it only matters whether the variable has been defined. All of these ++can be defined in the |filetype-plugin| or autocommand that defines ++|b:match_words| or "on the fly." ++ ++The main variable is |b:match_words|. It is described in the section below on ++supporting a new language. ++ ++ *MatchError* *matchit-hl* *matchit-highlight* ++MatchError is the highlight group for error messages from the script. By ++default, it is linked to WarningMsg. If you do not want to be bothered by ++error messages, you can define this to be something invisible. For example, ++if you use the GUI version of Vim and your command line is normally white, you ++can do > ++ :hi MatchError guifg=white guibg=white ++< ++ *b:match_ignorecase* ++If you > ++ :let b:match_ignorecase = 1 ++then matchit.vim acts as if 'ignorecase' is set: for example, "end" and "END" ++are equivalent. If you > ++ :let b:match_ignorecase = 0 ++then matchit.vim treats "end" and "END" differently. (There will be no ++b:match_infercase option unless someone requests it.) ++ ++ *b:match_debug* ++Define b:match_debug if you want debugging information to be saved. See ++|matchit-debug|, below. ++ ++ *b:match_skip* ++If b:match_skip is defined, it is passed as the skip argument to ++|searchpair()|. This controls when matching structures are skipped, or ++ignored. By default, they are ignored inside comments and strings, as ++determined by the |syntax| mechanism. (If syntax highlighting is turned off, ++nothing is skipped.) You can set b:match_skip to a string, which evaluates to ++a non-zero, numerical value if the match is to be skipped or zero if the match ++should not be skipped. In addition, the following special values are ++supported by matchit.vim: ++ s:foo becomes (current syntax item) =~ foo ++ S:foo becomes (current syntax item) !~ foo ++ r:foo becomes (line before cursor) =~ foo ++ R:foo becomes (line before cursor) !~ foo ++(The "s" is meant to suggest "syntax", and the "r" is meant to suggest ++"regular expression".) ++ ++Examples: ++ ++ You can get the default behavior with > ++ :let b:match_skip = 's:comment\|string' ++< ++ If you want to skip matching structures unless they are at the start ++ of the line (ignoring whitespace) then you can > ++ :let b:match_skip = 'R:^\s*' ++< Do not do this if strings or comments can span several lines, since ++ the normal syntax checking will not be done if you set b:match_skip. ++ ++ In LaTeX, since "%" is used as the comment character, you can > ++ :let b:match_skip = 'r:%' ++< Unfortunately, this will skip anything after "\%", an escaped "%". To ++ allow for this, and also "\\%" (an excaped backslash followed by the ++ comment character) you can > ++ :let b:match_skip = 'r:\(^\|[^\\]\)\(\\\\\)*%' ++< ++ See the $VIMRUNTIME/ftplugin/vim.vim for an example that uses both ++ syntax and a regular expression. ++ ++============================================================================== ++4. Supporting a New Language *matchit-newlang* ++ *b:match_words* ++In order for matchit.vim to support a new language, you must define a suitable ++pattern for |b:match_words|. You may also want to set some of the ++|matchit-configure| variables, as described above. If your language has a ++complicated syntax, or many keywords, you will need to know something about ++Vim's |regular-expression|s. ++ ++The format for |b:match_words| is similar to that of the 'matchpairs' option: ++it is a comma (,)-separated list of groups; each group is a colon(:)-separated ++list of patterns (regular expressions). Commas and backslashes that are part ++of a pattern should be escaped with backslashes ('\:' and '\,'). It is OK to ++have only one group; the effect is undefined if a group has only one pattern. ++A simple example is > ++ :let b:match_words = '\:\,' ++ \ . '\:\:\:\' ++(In Vim regular expressions, |\<| and |\>| denote word boundaries. Thus "if" ++matches the end of "endif" but "\" does not.) Then banging on the "%" ++key will bounce the cursor between "if" and the matching "endif"; and from ++"while" to any matching "continue" or "break", then to the matching "endwhile" ++and back to the "while". It is almost always easier to use |literal-string|s ++(single quotes) as above: '\' rather than "\\" and so on. ++ ++Exception: If the ":" character does not appear in b:match_words, then it is ++treated as an expression to be evaluated. For example, > ++ :let b:match_words = 'GetMatchWords()' ++allows you to define a function. This can return a different string depending ++on the current syntax, for example. ++ ++Once you have defined the appropriate value of |b:match_words|, you will ++probably want to have this set automatically each time you edit the ++appropriate file type. The recommended way to do this is by adding the ++definition to a |filetype-plugin| file. ++ ++Tips: Be careful that your initial pattern does not match your final pattern. ++See the example above for the use of word-boundary expressions. It is usually ++better to use ".\{-}" (as many as necessary) instead of ".*" (as many as ++possible). See |\{-|. For example, in the string "label", "<.*>" ++matches the whole string whereas "<.\{-}>" and "<[^>]*>" match "" and ++"". ++ ++ *matchit-spaces* *matchit-s:notend* ++If "if" is to be paired with "end if" (Note the space!) then word boundaries ++are not enough. Instead, define a regular expression s:notend that will match ++anything but "end" and use it as follows: > ++ :let s:notend = '\%(\:\' ++< *matchit-s:sol* ++This is a simplified version of what is done for Ada. The s:notend is a ++|script-variable|. Similarly, you may want to define a start-of-line regular ++expression > ++ :let s:sol = '\%(^\|;\)\s*' ++if keywords are only recognized after the start of a line or after a ++semicolon (;), with optional white space. ++ ++ *matchit-backref* *matchit-\1* ++In any group, the expressions |\1|, |\2|, ..., |\9| refer to parts of the ++INITIAL pattern enclosed in |\(|escaped parentheses|\)|. These are referred ++to as back references, or backrefs. For example, > ++ :let b:match_words = '\:\(h\)\1\>' ++means that "bo" pairs with "ho" and "boo" pairs with "hoo" and so on. Note ++that "\1" does not refer to the "\(h\)" in this example. If you have ++"\(nested \(parentheses\)\) then "\d" refers to the d-th "\(" and everything ++up to and including the matching "\)": in "\(nested\(parentheses\)\)", "\1" ++refers to everything and "\2" refers to "\(parentheses\)". If you use a ++variable such as |s:notend| or |s:sol| in the previous paragraph then remember ++to count any "\(" patterns in this variable. You do not have to count groups ++defined by |\%(\)|. ++ ++It should be possible to resolve back references from any pattern in the ++group. For example, > ++ :let b:match_words = '\(foo\)\(bar\):more\1:and\2:end\1\2' ++would not work because "\2" cannot be determined from "morefoo" and "\1" ++cannot be determined from "andbar". On the other hand, > ++ :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1' ++should work (and have the same effect as "foobar:barfoo:endfoobar"), although ++this has not been thoroughly tested. ++ ++You can use |zero-width| patterns such as |\@<=| and |\zs|. (The latter has ++not been thouroughly tested in matchit.vim.) For example, if the keyword "if" ++must occur at the start of the line, with optional white space, you might use ++the pattern "\(^\s*\)\@<=if" so that the cursor will end on the "i" instead of ++at the start of the line. For another example, if HTML had only one tag then ++one could > ++ :let b:match_words = '<:>,<\@<=tag>:<\@<=/tag>' ++so that "%" can bounce between matching "<" and ">" pairs or (starting on ++"tag" or "/tag") between matching tags. Without the |\@<=|, the script would ++bounce from "tag" to the "<" in "", and another "%" would not take you ++back to where you started. ++ ++DEBUGGING *matchit-debug* *:MatchDebug* ++ ++If you are having trouble figuring out the appropriate definition of ++|b:match_words| then you can take advantage of the same information I use when ++debugging the script. This is especially true if you are not sure whether ++your patterns or my script are at fault! To make this more convenient, I have ++made the command :MatchDebug, which defines the variable |b:match_debug| and ++creates a Matchit menu. This menu makes it convenient to check the values of ++the variables described below. You will probably also want to read ++|matchit-details| above. ++ ++Defining the variable |b:match_debug| causes the script to set the following ++variables, each time you hit the "%" key. Several of these are only defined ++if |b:match_words| includes |backref|s. ++ ++ *b:match_pat* ++The b:match_pat variable is set to |b:match_words| with |backref|s parsed. ++ *b:match_match* ++The b:match_match variable is set to the bit of text that is recognized as a ++match. ++ *b:match_col* ++The b:match_col variable is set to the cursor column of the start of the ++matching text. ++ *b:match_wholeBR* ++The b:match_wholeBR variable is set to the comma-separated group of patterns ++that matches, with |backref|s unparsed. ++ *b:match_iniBR* ++The b:match_iniBR variable is set to the first pattern in |b:match_wholeBR|. ++ *b:match_ini* ++The b:match_ini variable is set to the first pattern in |b:match_wholeBR|, ++with |backref|s resolved from |b:match_match|. ++ *b:match_tail* ++The b:match_tail variable is set to the remaining patterns in ++|b:match_wholeBR|, with |backref|s resolved from |b:match_match|. ++ *b:match_word* ++The b:match_word variable is set to the pattern from |b:match_wholeBR| that ++matches |b:match_match|. ++ *b:match_table* ++The back reference '\'.d refers to the same thing as '\'.b:match_table[d] in ++|b:match_word|. ++ ++============================================================================== ++5. Known Bugs and Limitations *matchit-bugs* ++ ++Just because I know about a bug does not mean that it is on my todo list. I ++try to respond to reports of bugs that cause real problems. If it does not ++cause serious problems, or if there is a work-around, a bug may sit there for ++a while. Moral: if a bug (known or not) bothers you, let me know. ++ ++The various |:vmap|s defined in the script (%, |g%|, |[%|, |]%|, |a%|) may ++have undesired effects in Select mode |Select-mode-mapping|. At least, if you ++want to replace the selection with any character in "ag%[]" there will be a ++pause of |'updatetime'| first. ++ ++It would be nice if "\0" were recognized as the entire pattern. That is, it ++would be nice if "foo:\end\0" had the same effect as "\(foo\):\end\1". I may ++try to implement this in a future version. (This is not so easy to arrange as ++you might think!) ++ ++============================================================================== ++vim: filetype=help ++vim:tw=78:fo=tcq2: +diff -urN vim71/1/doc/.svn/text-base/NERD_commenter.txt.svn-base vim71_ada/1/doc/.svn/text-base/NERD_commenter.txt.svn-base +--- vim71/1/doc/.svn/text-base/NERD_commenter.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/text-base/NERD_commenter.txt.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,1155 @@ ++*NERD_comments.txt* Plugin for commenting code v169 ++ ++ ++ NERD_COMMENTS REFERENCE MANUAL~ ++ ++ ++ ++ ++ ++============================================================================== ++CONTENTS {{{2 *NERD_comments-contents* ++ ++ 1.Intro...................................|NERD_comments| ++ 2.Functionality provided..................|NERD_com-functionality| ++ 2.1 Functionality Summary.............|NERD_com-functionality-summary| ++ 2.2 Functionality Details.............|NERD_com-functionality-details| ++ 2.2.1 Comment map.................|NERD_com-comment| ++ 2.2.2 Nested comment map..........|NERD_com-nested-comment| ++ 2.2.3 Toggle comment map..........|NERD_com-toggle-comment| ++ 2.2.4 Minimal comment map.........|NERD_com-minimal-comment| ++ 2.2.5 Invert comment map..........|NERD_com-invert-comment| ++ 2.2.6 Sexy comment map............|NERD_com-sexy-comment| ++ 2.2.7 Yank comment map............|NERD_com-yank-comment| ++ 2.2.8 Comment to EOL map..........|NERD_com-EOL-comment| ++ 2.2.9 Append com to line map......|NERD_com-append-comment| ++ 2.2.10 Prepend com to line map....|NERD_com-prepend-comment| ++ 2.2.11 Insert comment map.........|NERD_com-insert-comment| ++ 2.2.12 Use alternate delims map...|NERD_com-alt-delim| ++ 2.2.13 Comment aligned maps.......|NERD_com-aligned-comment| ++ 2.2.14 Uncomment line map.........|NERD_com-uncomment-line| ++ 2.3 Supported filetypes...............|NERD_com-filetypes| ++ 2.4 Sexy Comments.....................|NERD_com_sexy_comments| ++ 3.Customisation...........................|NERD_com-customisation| ++ 3.1 Customisation summary.............|NERD_com-cust-summary| ++ 3.2 Customisation details.............|NERD_com-cust-details| ++ 3.3 Default delimiter customisation...|NERD_com-cust-delims| ++ 3.4 Key mapping customisation.........|NERD_com-cust-keys| ++ 3.5 Sample regular expressions........|NERD_com-reg-exps| ++ 4.Issues with the script..................|NERD_com-issues| ++ 4.1 Delimiter detection heuristics....|NERD_com-heuristics| ++ 4.2 Nesting issues....................|NERD_com-nesting| ++ 4.3 Nesting issues....................|NERD_com-nesting| ++ 4.3 Mark clobbering...................|NERD_com-mark-clobbering| ++ 5.TODO list...............................|NERD_com-todo| ++ 6.Credits.................................|NERD_com-credits| ++ ++============================================================================== ++1. Intro {{{2 *NERD_comments* ++ ++NERD_comments provides a set of handy key mappings for commenting code. These ++mappings are consistent across all supported filetypes. ++ ++When writing NERD_comments I have tried to give it as many features/options as ++possible while keeping it so that the plugin can still be used with little or ++no knowledge of these. The average user need only know about a few key ++mappings to use NERD_comments while there are plenty of other features for the ++l33t nerd take advantage of. ++ ++Enjoy :D ++ ++============================================================================== ++2. Functionality provided {{{2 *NERD_com-functionality* ++ ++------------------------------------------------------------------------------ ++2.1 Functionality summary {{{3 *NERD_com-functionality-summary* ++ ++The following key mappings are provided by default (there is also a menu ++provided that contains menu items corresponding to all the below mappings): ++ ++Note: is a user defined key that is used to start keymappings and ++defaults to \. Check out || for details. ++ ++Most of the following mappings are for normal/visual mode only. The ++|NERD_com-insert-comment| mapping is for insert mode only. ++ ++cc |NERD_com-comment-map| ++Comments out the current line or text selected in visual mode. ++ ++ ++cn |NERD_com-nested-comment| ++Same as |NERD_com-comment-map| but enforces nesting. ++ ++ ++c |NERD_com-toggle-comment| ++Toggles the comment state of the selected line(s). If the topmost selected ++line is commented, all selected lines are uncommented and vice versa. ++ ++ ++cm |NERD_com-minimal-comment| ++Comments the given lines using only one set of multipart delimiters if ++possible. ++ ++ ++ci |NERD_com-invert-comment| ++Toggles the comment state of the selected line(s) individually. Each selected ++line that is commented is uncommented and vice versa. ++ ++ ++cs |NERD_com-sexy-comment| ++Comments out the selected lines ``sexually'' ++ ++ ++cy |NERD_com-yank-comment| ++Same as |NERD_com-comment-map| except that the commented line(s) are yanked ++before commenting. ++ ++ ++c$ |NERD_com-EOL-comment| ++Comments the current line from the cursor to the end of line. ++ ++ ++cA |NERD_com-append-comment| ++Adds comment delimiters to the end of line and goes into insert mode between ++them. ++ ++ ++cI |NERD_com-prepend-comment| ++Adds comment delimiters to the start of line and goes into insert mode between ++them. ++ ++ ++ |NERD_com-insert-comment| ++Adds comment delimiters at the current cursor position and inserts between. ++ ++ ++ca |NERD_com-alt-delim| ++Switches to the alternative set of delimiters. ++ ++ ++cl OR cr OR cb |NERD_com-aligned-comment| ++Same as |NERD_com-comment| except that the delimiters are aligned down the ++left side (cl), the right side (cr) or both sides ++(cb). ++ ++ ++cu |NERD_com-uncomment-line| ++Uncomments the selected line(s). ++ ++------------------------------------------------------------------------------ ++2.2 Functionality details {{{3 *NERD_com-functionality-details* ++ ++------------------------------------------------------------------------------ ++2.2.1 Comment map *NERD_com-comment* ++cc ++Comments out the current line. If multiple lines are selected in visual-line ++mode, they are all commented out. If some text is selected in visual or ++visual-block mode then NERD_comments will try to comment out the exact text ++that is selected using multi-part delimiters if they are available. ++ ++Works in normal, visual, visual-line and visual-block mode. ++ ++Change the mapping with: |NERD_com_line_map|. ++ ++Relevant options: ++|NERD_allow_any_visual_delims_regexp| ++|NERD_comment_whole_lines_in_v_mode| ++|NERD_block_com_after_right| ++|NERD_left_align_regexp| ++|NERD_place_holder_regexp| ++|NERD_right_align_regexp| ++|NERD_space_delim_filetype_regexp| ++|NERD_use_nested_comments_default| ++ ++------------------------------------------------------------------------------ ++2.2.2 Nested comment map *NERD_com-nested-comment* ++cn ++Performs nested commenting. Works the same as cc except that if a ++line is already commented then it will be commented again. ++ ++If the filetype is covered by the |NERD_place_holder_regexp| option ++then the previous comment delimiters will be replaced by place-holder ++delimiters if needed. Otherwise the nested comment will only be added if the ++current commenting delimiters have no right delimiter (to avoid compiler ++errors) ++ ++Works in normal, visual, visual-line, visual-block modes. ++ ++Change the mapping with: |NERD_com_line_nest_map|. ++ ++Relevant options: ++|NERD_allow_any_visual_delims_regexp| ++|NERD_comment_whole_lines_in_v_mode| ++|NERD_block_com_after_right| ++|NERD_left_align_regexp| ++|NERD_place_holder_regexp| ++|NERD_right_align_regexp| ++|NERD_space_delim_filetype_regexp| ++|NERD_use_nested_comments_default| ++ ++ ++------------------------------------------------------------------------------ ++2.2.3 Toggle comment map *NERD_com-toggle-comment* ++c ++Toggles commenting of the lines selected. The behaviour of this mapping ++depends on whether the first line selected is commented or not. If so, all ++selected lines are uncommented and vice versa. ++ ++With this mapping, lines are only considered to be commented if a left comment ++delimiter is the first non-space/tab char on the line. ++ ++Works in normal, visual-line, modes. ++Using this mapping in visual or visual-block modes will cause it to work like ++|NERD_com-comment| ++ ++Change the mapping with: |NERD_com_line_toggle_map|. ++ ++Relevant options: ++|NERD_left_align_regexp| ++|NERD_right_align_regexp| ++|NERD_space_delim_filetype_regexp| ++|NERD_use_nested_comments_default| ++ ++------------------------------------------------------------------------------ ++2.2.4 Minimal comment map *NERD_com-minimal-comment* ++cm ++Comments the selected lines using one set of multipart delimiters if possible. ++ ++For example: if you are programming in c and you select 5 lines and press ++cm then a '/*' will be placed at the start of the top line and a '*/' ++will be placed at the end of the last line. ++ ++Sets of multipart comment delimiters that are between the top and bottom ++selected lines are replaced with place holders (see |NERD_lPlace|) if ++NERD_place_holder_regexp is set for the current filetype. If it is not, then ++the comment will be aborted if place holders are required to prevent illegal ++syntax. ++ ++------------------------------------------------------------------------------ ++2.2.5 Invert comment map *NERD_com-invert-comment* ++ci ++Inverts the commented state of each selected line. If the a selected line is ++commented then it is uncommented and vice versa. Each line is examined and ++commented/uncommented individually. ++ ++With this mapping, lines are only considered to be commented if a left comment ++delimiter is the first non-space/tab char on the line. ++ ++Works in normal, visual-line, modes. ++ ++Change the mapping with: |NERD_com_line_invert_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.6 Sexy comment map *NERD_com-sexy-comment* ++cs ++Comments the selected line(s) ``sexily''... see |NERD_com_sexy_commenting| for ++a description of what sexy comments are. Can only be done on filetypes for ++which there is at least one set of multipart comment delimiters specified. ++ ++Sexy comments cannot be nested and lines inside a sexy comment cannot be ++commented again. ++ ++Works in normal, visual-line. ++ ++Change the mapping with: |NERD_com_line_sexy_map| ++ ++Relevant options: ++|NERD_use_compact_sexy_com_regexp| ++ ++------------------------------------------------------------------------------ ++2.2.7 Yank comment map *NERD_com-yank-comment* ++cy ++Same as cc except that it yanks the line(s) that are commented first. ++ ++Works in normal, visual, visual-line, visual-block modes. ++ ++Change the mapping with: |NERD_com_line_yank_map| ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.8 Comment to EOL map *NERD_com-EOL-comment* ++c$ ++Comments the current line from the current cursor position up to the end of ++the line. ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_com_to_end_of_line_map| ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.9 Append com to line map *NERD_com-append-comment* ++cA ++Appends comment delimiters to the end of the current line and goes ++to insert mode between the new delimiters. ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_append_com_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.10 Prepend com to line map *NERD_com-prepend-comment* ++cI ++Prepends comment delimiters to the start of the current line and goes to ++insert mode between the new delimiters. ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_prepend_com_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.11 Insert comment map *NERD_com-insert-comment* ++ ++Adds comment delimiters at the current cursor position and inserts ++between them. ++ ++Works in insert mode. ++ ++Change the mapping with: |NERD_com_in_insert_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.12 Use alternate delims map *NERD_com-alt-delim* ++ca ++Changes to the alternative commenting style if one is available. For example, ++if the user is editing a c++ file using // comments and they hit ca ++then they will be switched over to /**/ comments. ++keys for this mappings can be overridden with the ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_alt_com_map| ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.13 Comment aligned maps *NERD_com-aligned-comment* ++cl cr cb ++Same as cc except that the comment delimiters are aligned on the left ++side, right side or both sides respectively. These comments are always nested ++if the line(s) are already commented. ++ ++Works in normal, visual-line. ++ ++Change the mappings with: |NERD_com_align_left_map|, |NERD_com_align_right_map| ++and |NERD_com_align_both_map|. ++ ++Relevant options: ++|NERD_left_align_regexp| ++|NERD_right_align_regexp| ++ ++ ++------------------------------------------------------------------------------ ++2.2.14 Uncomment line map *NERD_com-uncomment-line* ++cu ++Uncomments the current line. If multiple lines are selected in ++visual mode then they are all uncommented. ++ ++When uncommenting, if the line contains multiple sets of delimiters then the ++``outtermost'' pair of delimiters will be removed. ++ ++The script uses a set of heurisics to distinguish ``real'' delimiters from ++``fake'' ones when uncommenting. See |NERD_com-issues| for details. ++ ++Works in normal, visual, visual-line, visual-block. ++ ++Change the mapping with: |NERD_uncom_line_map|. ++ ++Relevant options: ++|NERD_dont_remove_alt_coms| ++|NERD_dont_remove_spaces_regexp| ++ ++ ++------------------------------------------------------------------------------ ++2.3 Supported filetypes *NERD_com-filetypes* ++ ++Files that can be commented by this plugin: ++abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asm ++asn aspvbs atlas automake ave awk basic b bc bdf bib bindzone btm caos catalog ++c cfg cg ch cl clean clipper conf config cpp crontab cs csc csp css cterm cupl ++cvs dcl def diff dns dosbatch dosini dot dracula dsl dtd dtml dylan ecd eiffel ++elf elmfilt erlang eruby eterm expect exports fgl focexec form fortran foxpro ++fvwm fx gdb gdmo gnuplot gtkrc haskell hb h help hercules hog html htmlos ia64 ++icon idlang idl indent inform inittab ishd iss ist jam java javascript jess ++jgraph jproperties jproperties jsp kix kscript lace lex lftp lifelines lilo ++lisp lite lotos lout lprolog lscript lss lua lynx m4 make maple masm master ++matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc named ++nasm nastran natural ncf netrw nqc nsis ocaml omnimark openroad opl ora ox ++pascal pcap pccts perl pfmain php phtml pic pike pilrc pine plm plsql po ++postscr pov povini ppd ppwiz procmail progress prolog psf ptcap python python ++radiance ratpoison r rc readline rebol registry remind rexx robots rpl ruby sa ++samba sas sather scheme scilab screen scsh sdl sed sgml sgmldecl sgmllnx sicad ++simula sinda skill slang sl slrnrc sm smil smith sml snnsnet snnspat snnsres ++snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp strace svn tads ++taglist tags tak tasm tcl terminfo tex texinfo texmf tf tidy tli trasys tsalt ++tsscl tssgm uc uil vb verilog vgrindefs vhdl vim virata vrml vsejcl webmacro ++wget winbatch wml sh wvdial xdefaults xf86conf xhtml xkb xmath xml xmodmap ++xpm2 xpm xslt yacc yaml z8a ++ ++If a language is not in the list of hardcoded supported filetypes then the ++&commentstring vim option is used. ++ ++ ++------------------------------------------------------------------------------ ++2.4 Sexy Comments *NERD_com_sexy_comments* ++These are comments that use one set of multipart comment delimiters as well as ++one other marker symbol. For example: > ++ /* ++ * This is a c style sexy comment ++ * So there! ++ */ ++ ++ /* This is a c style sexy comment ++ * So there! ++ * But this one is ``compact'' style */ ++< ++Here the multipart delimiters are /* and */ and the marker is *. NERD_comments ++is capable of adding and removing comments of this type. ++ ++ ++============================================================================== ++3. Customisation {{{2 *NERD_com-customisation* ++ ++------------------------------------------------------------------------------ ++3.1 Customisation summary *NERD_com-cust-summary* ++ ++|loaded_nerd_comments| Turns off the script. ++|NERD_allow_any_visual_delims_regexp| Allows multipart alternative delims to ++ be used when commenting in ++ visual/visual-block mode. ++|NERD_block_com_after_right| Forces right delims to be placed when ++ doing visual-block comments. ++|NERD_comment_whole_lines_in_v_mode| Changes behaviour of visual comments. ++|NERD_menu_mode| Determines if a NERD comment menu will ++ be made and whether the menu will have a ++ keyboard shortcut. ++|NERD_dont_remove_alt_coms| Causes alternative comments not to be ++ removed when uncommenting. ++|NERD_dont_remove_spaces_regexp| Causes spaces not to be removed when ++ uncommenting if the filetype doesnt ++ match |NERD_space_delim_filetype_regexp| ++|NERD_create_h_filetype| Creates a new filetype for .h files. ++|NERD_lPlace| Specifies what to use as the left ++ delimiter placeholder when nesting ++ comments. ++|NERD_left_align_regexp| Specifies which filetypes to align left ++ delimiters for. ++|NERD_mapleader| Specifies what all the commenting key ++ mappings will begin with. ++|NERD_place_holder_regexp| Specifies which filetypes may use ++ placeholders when nesting comments. ++|NERD_right_align_regexp| Specifies which filetypes to align right ++ delimiters for. ++|NERD_rPlace| Specifies what to use as the right ++ delimiter placeholder when nesting ++ comments. ++|NERD_shut_up| Stops all output from the script. ++|NERD_space_delim_filetype_regexp| Specifies which filetypes to add spaces ++ around the delimiters for. ++|NERD_use_compact_sexy_com_regexp| Specifies which filetypes to use compact ++ sexy comments for. ++|NERD_use_nested_comments_default| Tells the script to use nested comments ++ by default. ++ ++----------------------------------------------------------------------------- ++3.3 Customisation details *NERD_com-cust-details* ++ ++To enable any of the below options you should put the given line in your ++~/.vimrc ++ ++ *loaded_nerd_comments* ++If this script is driving you insane you can turn it off by setting this ++option > ++ let loaded_nerd_comments=1 ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_allow_any_visual_delims_regexp* ++This option is set to a regular expression that is used to specify which ++filetypes this option should be turned on for. If this covers the current ++filetype then, when NERD_comments is doing a visual or visual-block comment ++(but not a visual-line comment) it will choose the right delimiters to use for ++the comment. This normally means using the current delimiters if they are ++multipart or using the alternative delimiters if THEY are multipart and the ++current delims are not. For example if we are editing the following java ++code: > ++ float foo = 1221; ++ float bar = 324; ++ System.out.println(foo * bar); ++< ++If we are using // comments and select the "foo" and "bar" in visual-block ++mode, as shown left below (where '|'s are used to represent the visual-block ++boundary), and comment it then it will use the alternative delims as shown on ++the right: > ++ float |foo| = 1221; float /*foo*/ = 1221; ++ float |bar| = 324; float /*bar*/ = 324; ++ System.out.println(foo * bar); System.out.println(foo * bar); ++< ++By default this option is set to '.*' i.e is turned on for all filetypes. ++ ++----------------------------------------------------------------------------- ++ *NERD_block_com_after_right* ++This option affects commenting when it is done in visual-block mode. If this ++option is turned on, lines that begin outside the right boundary of the ++selection block will be commented. Enable this option with: > ++ let NERD_block_com_after_right=1 ++< ++For example, if you are commenting this chunk of c code in visual-block mode ++(where the '|'s are used to represent the visual-block boundary) > ++ #include ++ #include ++ #include ++ |int| main(){ ++ | | printf("SUCK THIS\n"); ++ | | while(1){ ++ | | fork(); ++ | | } ++ |} | ++< ++If NERD_block_com_after_right=1 then this code will become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ /* */ printf("SUCK THIS\n"); ++ /* */ while(1){ ++ /* */ fork(); ++ /* */ } ++ /*} */ ++< ++Otherwise, the code block would become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ printf("SUCK THIS\n"); ++ while(1){ ++ fork(); ++ } ++ /*} */ ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_comment_whole_lines_in_v_mode* ++This option can take 2 values. By default NERD_comments tries to comment out ++exactly what is selected in visual mode (v). For example if you select and ++comment the following c code (using | to represent the visual boundary): > ++ in|t foo = 3; ++ int bar =| 9; ++ int baz = foo + bar; ++< ++This will result in: > ++ in/*t foo = 3;*/ ++ /*int bar =*/ 9; ++ int baz = foo + bar; ++< ++But some people prefer it if the whole lines are commented like: > ++ /*int foo = 3;*/ ++ /*int bar = 9;*/ ++ int baz = foo + bar; ++< ++If you prefer the second option then stick this line in your .vimrc: > ++ let NERD_comment_whole_lines_in_v_mode=1 ++< ++ ++If the filetype you are editing only has no multipart delimiters (for example ++a shell script) and you hadnt set this option then the above would become > ++ in#t foo = 3; ++ #int bar = 9; ++< ++(where # is the comment delimiter) as this is the closest NERD_comments can ++come to commenting out exactly what was selected. If you prefer for whole ++lines to be commented out when there is no multipart delimiters but the EXACT ++text that was selected to be commented out if there IS multipart delimiters ++then stick the following line in your .vimrc: > ++ let NERD_comment_whole_lines_in_v_mode=2 ++< ++ ++Note that this option does not affect the behaviour of visual-block mode (). ++ ++----------------------------------------------------------------------------- ++ *NERD_dont_remove_alt_coms* ++When uncommenting a line when there is an alternative commenting style for the ++current filetype, this option tells the script not to look for, and remove, ++comments delimiters of the alternative style. > ++ let NERD_dont_remove_alt_coms=1 ++< ++For example, if you are editing a c++ file using // style comments and you go ++cu on this line: > ++ /* This is a c++ comment baby! */ ++< ++It will not be uncommented if the NERD_dont_remove_alt_coms is set to 1. ++ ++----------------------------------------------------------------------------- ++ *NERD_dont_remove_spaces_regexp* ++By default, the NERD commenter will remove spaces around comment delimiters if ++either: ++1. The current filetype matches the |NERD_space_delim_filetype_regexp| option ++ (which is a regular expression). ++2. The current filtype doesnt match NERD_dont_remove_spaces_regexp option ++ (which is also a reg exp) ++ ++This means that if we have the following lines in a c code file: > ++ /* int foo = 5; */ ++ /* int bar = 10; */ ++ int baz = foo + bar ++< ++If either of the above conditions hold then if these lines are uncommented ++they will become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++Otherwise they would become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++If you want the spaces to be removed only if the current filetype matches ++|NERD_space_delim_filetype_regexp| then set the ++NERD_dont_remove_spaces_regexp option in your vimrc so that it matches the ++desired filetypes. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++Defaults to "^python$" ++ ++----------------------------------------------------------------------------- ++ *NERD_create_h_filetype* ++If this option is set then NERD_comments will create a seperate filetype for h ++files. This could be needed because some versions of vim treat h files as cpp ++files which can be dodgy for commenting because if you are using // to comment ++cpp files then this is invalid when you are commenting h files for a c ++project (unless you arent adhering to the ANSI standard... naughty naughty). ++To enable this option, stick the following line in your .vimrc: > ++ let NERD_create_h_filetype = 1 ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_lPlace* ++ *NERD_rPlace* ++These options are used to control the strings used as place-holder delimiters. ++Place holder delimiters are used when performing nested commenting when the ++filetype supports commenting styles with both left and right delimiters. ++To set these options use lines like: > ++ let NERD_lPlace="FOO" ++ let NERD_rPlace="BAR" ++< ++Following the above example, if we have line of c code: > ++ /* int horse */ ++< ++and we comment it with cn it will be changed to: > ++ /*FOO int horse BAR*/ ++< ++When we uncomment this line it will go back to what it was. ++NERD_lPlace defaults to '[>', NERD_rPlace defaults to '<]'. ++ ++----------------------------------------------------------------------------- ++ *NERD_left_align_regexp* ++This option is a regular expression which is used to specify which filetypes ++should have their left delimiters aligned when commenting multiple lines. ++ ++For example, consider this chunk of c code: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 while(foo < 50){ ++ 4 foo = foo + bar; ++ 5 printf("i am just making up this code\n"); ++ 6 printf("i have no idea what im writing\n"); ++ 7 } ++< ++If the NERD_left_align_regexp regexp covers c files then if we select lines ++3-7 in visual mode and hit cc the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /*while(foo < 50){*/ ++ 4 /* foo = foo + bar;*/ ++ 5 /* printf("i am just making up this code\n");*/ ++ 6 /* printf("i have no idea what im writing\n");*/ ++ 7 /*}*/ ++< ++If NERD_left_align_regexp doesnt cover c files then the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /* while(foo < 50){ */ ++ 4 /* foo = foo + bar; */ ++ 5 /* printf("i am just making up this code\n"); */ ++ 6 /* printf("i have no idea what im writing\n"); */ ++ 7 /* } */ ++< ++NERD_left_align_regexp defaults to '^$' meaning no filetypes have their left ++delims aligned. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_mapleader* ++NERD_mapleader is used to specify what all the NERD commenter key mappings ++begin with. ++ ++Assuming that == '\', the default key mappings will look like this: > ++ \cc ++ \cu ++ \ca ++ \ci ++ \cs ++ ... ++< ++However, if this line: > ++ let NERD_mapleader = ',x' ++< ++were present in your vimrc then the default mappings would look like this: > ++ ,xc ++ ,xu ++ ,xa ++ ,xi ++ ,xs ++ ... ++< ++This option only affects the mappings that have not been explicitly set ++manually (see |NERD_com-cust-keys|). ++ ++Default is c. ++ ++----------------------------------------------------------------------------- ++ *NERD_menu_mode* ++This option can take 3 values: ++ "0": Turns the NERD commenter menu off completely. ++ "1": Turns the NERD commenter menu on with no menu shortcut. ++ "2": Turns the NERD commenter menu on with -c as the menu shortcut. ++ ++Default is "2". ++ ++----------------------------------------------------------------------------- ++ *NERD_place_holder_regexp* ++This option is a regular expression which is used to specify which filetypes ++place-holder delimiters should be used for when adding nested comments. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_right_align_regexp* ++This option is a regular expression which is used to specify which filetypes ++should have their right delimiters aligned when commenting multiple lines. ++ ++For example, consider this chunk of c code: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 while(foo < 50){ ++ 4 foo = foo + bar; ++ 5 printf("i am just making up this code\n"); ++ 6 printf("i have no idea what im writing\n"); ++ 7 } ++< ++If the NERD_right_align_regexp regexp covers c files then if we select lines ++3-7 in visual mode and hit cc the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /*while(foo < 50){ */ ++ 4 /*foo = foo + bar; */ ++ 5 /*printf("i am just making up this code\n"); */ ++ 6 /*printf("i have no idea what im writing\n");*/ ++ 7 /*} */ ++< ++If NERD_right_align_regexp doesnt cover c files then the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /* while(foo < 50){ */ ++ 4 /* foo = foo + bar; */ ++ 5 /* printf("i am just making up this code\n"); */ ++ 6 /* printf("i have no idea what im writing\n"); */ ++ 7 /* } */ ++< ++NERD_right_align_regexp defaults to '^$' meaning no filetypes have their right ++delims aligned. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_shut_up* ++This option is used to prevent NERD_comments from echoing anything. ++Stick this line in your .vimrc: > ++ let NERD_shut_up=1 ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_space_delim_filetype_regexp* ++Some people prefer a space after the left delimiter and before the right ++delimiter like this: > ++ /* int foo=2; */ ++< ++as opposed to this: > ++ /*int foo=2;*/ ++< ++This option is a regular expression that is used to specify which filetypes ++NERD_comments should use spaces for (as in the first eg above). ++NERD_space_delim_filetype_regexp defaults to '^$'. ++ ++See also |NERD_dont_remove_spaces_regexp|. ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_use_compact_sexy_com_regexp* ++Some people may want their sexy comments to be like this: > ++ /* Hi There! ++ * This is a sexy comment ++ * in c */ ++< ++As opposed to like this: > ++ /* ++ * Hi There! ++ * This is a sexy comment ++ * in c ++ */ ++< ++The option NERD_use_compact_sexy_com_regexp is a regular expression. If the ++filetype that the user is commenting matches this regular expression then when ++they do sexy comments they will look like the first comment above. ++ ++----------------------------------------------------------------------------- ++ *NERD_use_nested_comments_default* ++When this option is turned on comments are nested automatically. That is, if ++you hit cc on a line that is already commented, or contains comments, ++it will be commented again. > ++ let NERD_use_nested_comments_default=1 ++< ++ ++----------------------------------------------------------------------------- ++3.3 Default delimiter customisation *NERD_com-cust-delims* ++These options are used to tell NERD_comments which delimiters to use for a ++given filetype when it first loads up. To set one of these options just stick ++the corresponding line in your .vimrc. For example: if i want to use /* */ to ++delimit comments in java files instead of // (which is the default) then I ++would stick this line in my .vimrc: > ++ let NERD_use_c_style_java_comments=1 ++< ++ ++Note that if filetype has two commenting styles, which are both supported, you ++can switch between them with ca. See |NERD_com-alt-delim|. These ++options only change which style is used when the script is initialsed. ++ ++NERD_use_ada_with_spaces: use -- instead of -- for ada files. ++NERD_use_c_style_acedb_comments: use /**/ instead of // for acedb files. ++NERD_use_c_style_ch_comments: use /**/ instead of // for ch files. ++NERD_use_c_style_clean_comments: use /**/ instead of // for clean files. ++NERD_use_c_style_clipper_comments: use /**/ instead of // for clipper files. ++NERD_use_c_style_cpp_comments: use /**/ instead of // for c++ files. ++NERD_use_c_style_cs_comments: use /**/ instead of // for c# files. ++NERD_use_c_style_dot_comments: use /**/ instead of // for dot files. ++NERD_use_c_style_dylan_comments: use /**/ instead of // for dylan files. ++NERD_use_c_style_h_comments: use /**/ instead of // for h files. ++NERD_use_c_style_hercules_comments: use /**/ instead of // for hercules files. ++NERD_use_c_style_idl_comments: use /**/ instead of // for idl files. ++NERD_use_c_style_ishd_comments: use /**/ instead of // for ishd files. ++NERD_use_c_style_java_comments: use /**/ instead of // for java files. ++NERD_use_c_style_javascript_comments: use /**/ instead of // for javascript files. ++NERD_use_c_style_kscript_comments: use /**/ instead of // for kscript files. ++NERD_use_c_style_mel_comments: use /**/ instead of // for mel files. ++NERD_use_c_style_named_comments: use /**/ instead of // for named files. ++NERD_use_c_style_pccts_comments: use /**/ instead of // for pccts files. ++NERD_use_c_style_php_comments: use /* */ instead of // for php files. ++NERD_use_c_style_pike_comments: use /**/ instead of // for pike files. ++NERD_use_c_style_pilrc_comments: use /**/ instead of // for pilrc files. ++NERD_use_c_style_plm_comments: use /**/ instead of // for plm files. ++NERD_use_c_style_pov_comments: use /**/ instead of // for pov files. ++NERD_use_c_style_prolog_comments: use /**/ instead of % for prolog files. ++NERD_use_c_style_rc_comments: use /**/ instead of // for rc files. ++NERD_use_c_style_tads_comments: use /**/ instead of // for tads files. ++NERD_use_c_style_tsalt_comments: use /**/ instead of // for tsalt files. ++NERD_use_c_style_uc_comments: use /**/ instead of // for uc files. ++NERD_use_c_style_verilog_comments: use /**/ instead of // for verilog files. ++NERD_use_dash_dash_simula_comments: use -- instead of % for simula files. ++NERD_use_dnl_style_automake_comments: use dnl instead of # for automake files. ++NERD_use_hash_samba_comments: use # instead of ; for samba files. ++NERD_use_long_haskell_comments: use {--} instead of -- for haskell files. ++NERD_use_long_lisp_comments: use #||# instead of ; for lisp files. ++NERD_use_long_lua_comments: use --[[]] instead of -- for lua files. ++NERD_use_paren_star_pascal_comments: use (**) instead of {} for pascal files. ++NERD_use_REM_basic_comments: use REM instead of ' for basic files. ++NERD_use_single_part_c_comments: use // instead of /* */ for c files. ++ ++ ++----------------------------------------------------------------------------- ++3.4 Key mapping customisation *NERD_com-cust-keys* ++ ++These options are used to override the default keys that are used for the ++commenting mappings. Their values must be set to strings. As an example: if ++you wanted to use the mapping foo to uncomment lines of code then ++you would place this line in your vimrc > ++ let NERD_uncom_line_map="foo" ++< ++ ++Check out |NERD_com-functionality| for details about what the following ++mappings do. ++ ++ *NERD_alt_com_map* ++To override the ca mapping, set this option > ++ let NERD_alt_com_map="" ++< ++ *NERD_append_com_map* ++To override the ce mapping, set this option > ++ let NERD_append_com_map="" ++< ++ *NERD_com_align_left_map* ++To override the cl mapping, set this option > ++ let NERD_com_align_left_map="" ++< ++ *NERD_com_align_both_map* ++To override the cb mapping, set this option > ++ let NERD_com_align_both_map="" ++< ++ *NERD_com_align_right_map* ++To override the cr mapping, set this option > ++ let NERD_com_align_right_map="" ++< ++ *NERD_com_in_insert_map* ++To override the mapping, set this option > ++ let NERD_com_in_insert_map="" ++< ++ *NERD_com_line_invert_map* ++To override the ci mapping, set this option > ++ let NERD_com_line_invert_map="" ++< ++ *NERD_com_line_map* ++To override the cc mapping, set this option > ++ let NERD_com_line_map="" ++< ++ *NERD_com_line_nest_map* ++To override the cn mapping, set this option > ++ let NERD_com_line_nest_map="" ++< ++ *NERD_com_line_sexy_map* ++To override the cs mapping, set this option > ++ let NERD_com_line_sexy_map="" ++< ++ *NERD_com_line_toggle_map* ++To override the c mapping, set this option > ++ let NERD_com_line_toggle_map="" ++< ++ *NERD_com_line_minimal_map* ++To override the cm mapping, set this option > ++ let NERD_com_line_minimal_map="" ++< ++ *NERD_com_to_end_of_line_map* ++To override the c$ mapping, set this option > ++ let NERD_com_to_end_of_line_map="" ++< ++ *NERD_com_line_yank_map* ++To override the cy mapping, set this option > ++ let NERD_com_line_yank_map="" ++< ++ *NERD_uncom_line_map* ++To override the cu mapping, set this option > ++ let NERD_uncom_line_map="" ++< ++ ++------------------------------------------------------------------------------ ++3.5 Sample regular expressions *NERD_com-reg-exps* ++ ++Many of the options in the NERD commenter must be set to regular ++expressions... regular expressions can be a bit confusing so i have provided ++some template ones here that you can start from: ++ ++Regexp1: '.*' ++Matches any filetype. This is useful for turning an option on for all files. ++ ++Regexp2: '^$' ++Matches no filetypes. This is useful for turning an option off for all files. ++ ++Regexp3: '^\(java\)$' ++Matches only the java filetype. ++ ++Regexp4: '^\(c\|vim\)$' ++Matches only c and vim filetypes. ++ ++Regexp5: '^\(c.*\|vim\)$' ++Matches filetypes beginning with c (eg c, cpp, cs, etc) as well ++as vim files. ++ ++Regexp6: '^\(c.*\|java\|tex\)$' ++Matches filetypes beginning with c (eg c, cpp, cs, etc) as well as java and ++tex filetypes. ++ ++Regexp7: '^\(python\)\@!' ++Matches anything other than 'python'. ++ ++Regexp8: '^c\(s\)\@!' ++Matches 'c' followed by anything accept an 's'. ++ ++Regexp9: '^\(foo$\|bar$\|baz$\)\@!' ++Matches any strings except 'foo', 'bar' and 'baz'. ++ ++============================================================================== ++4. Issues with the script{{{2 *NERD_com-issues* ++ ++ ++------------------------------------------------------------------------------ ++4.1 Delimiter detection heuristics *NERD_com-heuristics* ++ ++Heuristics are used to distinguish the real comment delimiters ++ ++Because we have comment mappings that place delimiters in the middle of lines, ++removing comment delimiters is a bit tricky. This is because if comment ++delimiters appear in a line doesnt mean they really ARE delimiters. For ++example, Java uses // comments but the line > ++ System.out.println("//"); ++< ++clearly contains no real comment delimiters. ++ ++To distinguish between ``real'' comment delimiters and ``fake'' ones we use a ++set of heuristics. For example, one such heuristic states that any comment ++delimiter that has an odd number of non-escaped " characters both preceding ++and following it on the line is not a comment because it is probably part of a ++string. These heuristics, while usually pretty accurate, will not work for all ++cases. ++ ++------------------------------------------------------------------------------ ++4.2 Nesting issues *NERD_com-nesting* ++ ++If we have some line of code like this: > ++ /*int foo */ = /*5 + 9;*/ ++< ++This will not be uncommented legally. The NERD commenter will remove the ++"outter most" delimiters so the line will become: > ++ int foo */ = /*5 + 9; ++< ++which almost certainly will not be what you want. Nested sets of comments will ++uncomment fine though. Eg: > ++ /*int/* foo =*/ 5 + 9;*/ ++< ++will become: > ++ int/* foo =*/ 5 + 9; ++< ++(Note that in the above examples I have deliberately not used place holders ++for simplicity) ++ ++------------------------------------------------------------------------------ ++4.3 Mark clobbering *NERD_com-mark-clobbering* ++ ++The script clobbers the s and t marks when doing most comments. Im not sure ++how to save and restore the marks yet. ++ ++ ++ ++============================================================================== ++5. TODO list {{{2 *NERD_com-todo* ++ ++Uncommenting of minimal comments needs to be more robust. Currently it is easy ++to get illegal syntax when uncommenting them. ++ ++ ++ ++============================================================================== ++6. Credits {{{2 *NERD_com-credits* ++ ++Thanks and respect to the following people: ++ ++Thanks to Nick Brettell for his many ideas and criticisms. A bloody good ++bastard. ++:normal :.-2s/good// ++ ++Thanks to Matthew Hawkins for his awesome refactoring! ++ ++Thanks to the authors of the vimspell whose documentation ++installation function I stole :) ++ ++Thanks to Greg Searle for the idea of using place-holders for nested comments. ++ ++Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! ++Also, thanks for the idea of doing sexy comments as well as his suggestions ++relating to it :P ++Thanks again to Nguyen for complaining about the NERD_comments menu mapping ++(-c) interfering with another mapping of his... and thus the ++NERD_dont_create_menu_shortcut option was born :P ++(it was then replaced with NERD_menu_mode in version 1.67 :) ++ ++Thanks to Sam R for pointing out some filetypes that NERD_comments could support! ++ ++Cheers to Litchi for the idea of having a mapping that appends a comment to ++the current line :) ++ ++Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some ++problems with commenting in visual mode. Thanks again to Jorge for his ++continued suggestions on this matter :) ++ ++Thanks to Martin Stubenschrott for pointing out a bug with the mapping ++:) Ive gotta stop breaking this mapping! ++ ++Thanks to Markus Erlmann for pointing out a conflict that this script was ++having with the taglist plugin. ++ ++Thanks to Brent Rice for alerting me about, and helping me track down, a bug ++in the script when the "ignorecase" option in vim was set. ++ ++Thanks to Richard Willis for telling me about how line continuation was ++causing problems on cygwin. Also, thanks pointing out a bug in the help file ++and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI ++have mercy on your soul :) ++ ++Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". ++Also, thanks for his suggested improvements about toggle comments after i ++implemented them. ++ ++Thanks to harry for telling me that i broke the cn mapping in 1.53 :), ++and thanks again for telling me about a bug that occurred when editing a file ++in a new tab. ++ ++Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc ++install function and added support for ada comments with spaces as well as ++making a couple of other small changes. ++ ++Thanks to David Bourgeois for pointing out a bug with when commenting c files ++:)... [a few days later] ok i completely misunderstood what David was talking ++about and ended up fixing a completely different bug to what he was talking ++about :P ++ ++Thanks to David Bourgeois for pointing out a bug when changing buffers. ++ ++Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that ++was causing spaces to be added to the end of lines with single-part ++delimiters. It's nice when people do my work for me :D ++ ++Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting ++sexy comments. Sexy comments dont look so sexy when they are only half removed ++:P ++ ++Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping ++the NERD_space_delim_filetype_regexp option from working with left aligned ++toggle comments. And for pointing out a bug when initialising VB comments. ++ ++Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". ++And for suggested improvements to minimal comments. ++ ++Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. ++In 1.65 ++ ++Thanks to Jonathan Derque for alerting me to some filetypes that could be ++supported (Namely: context, plaintext and mail). ++ ++Thanks to Joseph Barker for the sugesting that the menu be an optional ++feature. ++ ++Thanks to Gary Church and Tim Carey-Smith for complaining about the ++keymappings and causing me to introduce the NERD_mapleader option :) ++ ++ ++Cheers to myself for being the best looking man on Earth! ++ ++ ++ vim:tw=78:ts=8:ft=help:norl: +diff -urN vim71/1/doc/.svn/text-base/taglist.txt.svn-base vim71_ada/1/doc/.svn/text-base/taglist.txt.svn-base +--- vim71/1/doc/.svn/text-base/taglist.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/.svn/text-base/taglist.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,1494 @@ ++*taglist.txt* Plugin for browsing source code ++ ++Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) ++For Vim version 6.0 and above ++Last change: 2007 February 18 ++ ++1. Overview |taglist-intro| ++2. Taglist on the internet |taglist-internet| ++3. Requirements |taglist-requirements| ++4. Installation |taglist-install| ++5. Usage |taglist-using| ++6. Options |taglist-options| ++7. Commands |taglist-commands| ++8. Global functions |taglist-functions| ++9. Extending |taglist-extend| ++10. FAQ |taglist-faq| ++11. License |taglist-license| ++12. Todo |taglist-todo| ++ ++============================================================================== ++ *taglist-intro* ++1. Overview~ ++ ++The "Tag List" plugin is a source code browser plugin for Vim. This plugin ++allows you to efficiently browse through source code files for different ++programming languages. The "Tag List" plugin provides the following features: ++ ++ * Displays the tags (functions, classes, structures, variables, etc.) ++ defined in a file in a vertically or horizontally split Vim window. ++ * In GUI Vim, optionally displays the tags in the Tags drop-down menu and ++ in the popup menu. ++ * Automatically updates the taglist window as you switch between ++ files/buffers. As you open new files, the tags defined in the new files ++ are added to the existing file list and the tags defined in all the ++ files are displayed grouped by the filename. ++ * When a tag name is selected from the taglist window, positions the ++ cursor at the definition of the tag in the source file. ++ * Automatically highlights the current tag name. ++ * Groups the tags by their type and displays them in a foldable tree. ++ * Can display the prototype and scope of a tag. ++ * Can optionally display the tag prototype instead of the tag name in the ++ taglist window. ++ * The tag list can be sorted either by name or by chronological order. ++ * Supports the following language files: Assembly, ASP, Awk, Beta, C, ++ 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. ++ * Can be easily extended to support new languages. Support for ++ existing languages can be modified easily. ++ * Provides functions to display the current tag name in the Vim status ++ line or the window title bar. ++ * The list of tags and files in the taglist can be saved and ++ restored across Vim sessions. ++ * Provides commands to get the name and prototype of the current tag. ++ * Runs in both console/terminal and GUI versions of Vim. ++ * Works with the winmanager plugin. Using the winmanager plugin, you ++ can use Vim plugins like the file explorer, buffer explorer and the ++ taglist plugin at the same time like an IDE. ++ * Can be used in both Unix and MS-Windows systems. ++ ++============================================================================== ++ *taglist-internet* ++2. Taglist on the internet~ ++ ++The home page of the taglist plugin is at: ++> ++ http://vim-taglist.sourceforge.net/ ++< ++You can subscribe to the taglist mailing list to post your questions or ++suggestions for improvement or to send bug reports. Visit the following page ++for subscribing to the mailing list: ++> ++ http://groups.yahoo.com/group/taglist ++< ++============================================================================== ++ *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 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. The exuberant ctags utility is shipped with ++most of the Linux distributions. You can download the exuberant ctags utility ++from ++> ++ http://ctags.sourceforge.net ++< ++The taglist plugin doesn't use or create a tags file and there is no need to ++create a tags file to use this plugin. The taglist plugin will not work with ++the GNU ctags or the Unix ctags utility. ++ ++This plugin relies on the Vim "filetype" detection mechanism to determine the ++type of the current file. You have to turn on the Vim filetype detection by ++adding the following line to your .vimrc file: ++> ++ filetype on ++< ++The taglist plugin will not work if you run Vim in the restricted mode (using ++the -Z command-line argument). ++ ++The taglist plugin uses the Vim system() function to invoke the exuberant ++ctags utility. If Vim is compiled without the system() function then you ++cannot use the taglist plugin. Some of the Linux distributions (Suse) compile ++Vim without the system() function for security reasons. ++ ++============================================================================== ++ *taglist-install* ++4. Installation~ ++ ++1. Download the taglist.zip file and unzip the files to the $HOME/.vim or the ++ $HOME/vimfiles or the $VIM/vimfiles directory. After this step, you should ++ have the following two files (the directory structure should be preserved): ++ ++ plugin/taglist.vim - main taglist plugin file ++ doc/taglist.txt - documentation (help) file ++ ++ 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 ++ topics. ++3. If the exuberant ctags utility is not present in one of the directories in ++ the PATH environment variable, then set the 'Tlist_Ctags_Cmd' variable to ++ point to the location of the exuberant ctags utility (not to the directory) ++ in the .vimrc file. ++4. If you are running a terminal/console version of Vim and the terminal ++ doesn't support changing the window width then set the ++ 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. ++5. Restart Vim. ++6. You can now use the ":TlistToggle" command to open/close the taglist ++ window. You can use the ":help taglist" command to get more information ++ about using the taglist plugin. ++ ++To uninstall the taglist plugin, remove the plugin/taglist.vim and ++doc/taglist.txt files from the $HOME/.vim or $HOME/vimfiles directory. ++ ++============================================================================== ++ *taglist-using* ++5. Usage~ ++ ++The taglist plugin can be used in several different ways. ++ ++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 ++ processes the tags defined in newly edited files. You can then open the ++ taglist window only when you need to select a tag and then automatically ++ close the taglist window after selecting the tag. ++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 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 ++ plugin to process the tags defined in a file always. ++6. You can save the tags defined in multiple files to a taglist session file ++ and load it when needed. You can also configure the taglist plugin to not ++ update the taglist window when editing new files. You can then manually add ++ files to the taglist window. ++ ++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. 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. ++> ++ nnoremap :TlistToggle ++< ++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: ++> ++ $ vim +TlistOpen ++< ++Closing the taglist window~ ++You can close the taglist window from the taglist window by pressing 'q' or ++using the Vim ":q" command. You can also use any of the Vim window commands to ++close the taglist window. Invoking the ":TlistToggle" command when the taglist ++window is opened, closes the taglist window. You can also use the ++":TlistClose" command to close the taglist window. ++ ++To automatically close the taglist window when a tag or file is selected, you ++can set the 'Tlist_Close_On_Select' variable to 1. To exit Vim when only the ++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. ++ ++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 ++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 ++taglist window. The Vim |CursorHold| autocmd event is used for this. If the ++current tag name is not visible in the taglist window, then the taglist window ++contents are scrolled to make that tag name visible. You can also use the ++":TlistHighlightTag" command to force the highlighting of the current tag. ++ ++The tag name is highlighted if no activity is performed for |'updatetime'| ++milliseconds. The default value for this Vim option is 4 seconds. To avoid ++unexpected problems, you should not set the |'updatetime'| option to a very ++low value. ++ ++To disable the automatic highlighting of the current tag name in the taglist ++window, set the 'Tlist_Auto_Highlight_Tag' variable to zero. ++ ++When entering a Vim buffer/window, the taglist plugin automatically highlights ++the current tag in that buffer/window. If you like to disable the automatic ++highlighting of the current tag when entering a buffer, set the ++'Tlist_Highlight_Tag_On_BufEnter' variable to zero. ++ ++Adding files to the taglist~ ++When the taglist window is opened, all the files in the Vim buffer list are ++processed and the supported files are added to the taglist. When you edit a ++file in Vim, the taglist plugin automatically processes this file and adds it ++to the taglist. If you close the taglist window, the tag information in the ++taglist is retained. ++ ++To process files even when the taglist window is not open, set the ++'Tlist_Process_File_Always' variable to 1. ++ ++You can manually add multiple files to the taglist without opening them using ++the ":TlistAddFiles" and the ":TlistAddFilesRecursive" commands. ++ ++For example, to add all the C files in the /my/project/dir directory to the ++taglist, you can use the following command: ++> ++ :TlistAddFiles /my/project/dir/*.c ++< ++Note that when adding several files with a large number of tags or a large ++number of files, it will take several seconds to several minutes for the ++taglist plugin to process all the files. You should not interrupt the taglist ++plugin by pressing . ++ ++You can recursively add multiple files from a directory tree using the ++":TlistAddFilesRecursive" command: ++> ++ :TlistAddFilesRecursive /my/project/dir *.c ++< ++This command takes two arguments. The first argument specifies the directory ++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 ++removed file will no longer be displayed in the taglist window in the current ++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 ++":bwipeout" command, the taglist is updated to remove the stored information ++for this buffer. ++ ++Updating the tags displayed for a file~ ++The taglist plugin keeps track of the modification time of a file. When the ++modification time changes (the file is modified), the taglist plugin ++automatically updates the tags listed for that file. The modification time of ++a file is checked when you enter a window containing that file or when you ++load that file. ++ ++You can also update or refresh the tags displayed for a file by pressing the ++"u" key in the taglist window. If an existing file is modified, after the file ++is saved, the taglist plugin automatically updates the tags displayed for the ++file. ++ ++You can also use the ":TlistUpdate" command to update the tags for the current ++buffer after you made some changes to it. You should save the modified buffer ++before you update the taglist window. Otherwise the listed tags will not ++include the new tags created in the buffer. ++ ++If you have deleted the tags displayed for a file in the taglist window using ++the 'd' key, you can again display the tags for that file using the ++":TlistUpdate" command. ++ ++Controlling the taglist updates~ ++To disable the automatic processing of new files or modified files, you can ++set the 'Tlist_Auto_Update' variable to zero. When this variable is set to ++zero, the taglist is updated only when you use the ":TlistUpdate" command or ++the ":TlistAddFiles" or the ":TlistAddFilesRecursive" commands. You can use ++this option to control which files are added to the taglist. ++ ++You can use the ":TlistLock" command to lock the taglist contents. After this ++command is executed, new files are not automatically added to the taglist. ++When the taglist is locked, you can use the ":TlistUpdate" command to add the ++current file or the ":TlistAddFiles" or ":TlistAddFilesRecursive" commands to ++add new files to the taglist. To unlock the taglist, use the ":TlistUnlock" ++command. ++ ++Displaying the tag prototype~ ++To display the prototype of the tag under the cursor in the taglist window, ++press the space bar. If you place the cursor on a tag name in the taglist ++window, then the tag prototype is displayed at the Vim status line after ++|'updatetime'| milliseconds. The default value for the |'updatetime'| Vim ++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. 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 ++line number are not supplied, then this command will display the name of the ++current tag. For example, ++> ++ :TlistShowTag ++ :TlistShowTag myfile.java 100 ++< ++You can use the ":TlistShowPrototype" command to display the prototype of the ++tag at or before the specified line number in the specified file. If the file ++name and the line number are not supplied, then this command will display the ++prototype of the current tag. For example, ++> ++ :TlistShowPrototype ++ :TlistShowPrototype myfile.c 50 ++< ++In the taglist window, when the mouse is moved over a tag name, the tag ++prototype is displayed in a balloon. This works only in GUI versions where ++balloon evaluation is supported. ++ ++Taglist window contents~ ++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 ++|'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 ++the Vim folding support. You can collapse the tree using the '-' key or using ++the Vim |zc| fold command. You can open the tree using the '+' key or using ++the Vim |zo| fold command. You can open all the folds using the '*' key or ++using the Vim |zR| fold command. You can also use the mouse to open/close the ++folds. You can close all the folds using the '=' key. You should not manually ++create or delete the folds in the taglist window. ++ ++To automatically close the fold for the inactive files/buffers and open only ++the fold for the current buffer in the taglist window, set the ++'Tlist_File_Fold_Auto_Close' variable to 1. ++ ++Sorting the tags for a file~ ++The tags displayed in the taglist window can be sorted either by their name or ++by their chronological order. The default sorting method is by the order in ++which the tags appear in a file. You can change the default sort method by ++setting the 'Tlist_Sort_Type' variable to either "name" or "order". You can ++sort the tags by their name by pressing the "s" key in the taglist window. You ++can again sort the tags by their chronological order using the "s" key. Each ++file in the taglist window can be sorted using different order. ++ ++Zooming in and out of the taglist window~ ++You can press the 'x' key in the taglist window to maximize the taglist ++window width/height. The window will be maximized to the maximum possible ++width/height without closing the other existing windows. You can again press ++'x' to restore the taglist window to the default width/height. ++ ++ *taglist-session* ++Taglist Session~ ++A taglist session refers to the group of files and their tags stored in the ++taglist in a Vim session. ++ ++You can save and restore a taglist session (and all the displayed tags) using ++the ":TlistSessionSave" and ":TlistSessionLoad" commands. ++ ++To save the information about the tags and files in the taglist to a file, use ++the ":TlistSessionSave" command and specify the filename: ++> ++ :TlistSessionSave ++< ++To load a saved taglist session, use the ":TlistSessionLoad" command: > ++ ++ :TlistSessionLoad ++< ++When you load a taglist session file, the tags stored in the file will be ++added to the tags already stored in the taglist. ++ ++The taglist session feature can be used to save the tags for large files or a ++group of frequently used files (like a project). By using the taglist session ++file, you can minimize the amount to time it takes to load/refresh the taglist ++for multiple files. ++ ++You can create more than one taglist session file for multiple groups of ++files. ++ ++Displaying the tag name in the Vim status line or the window title bar~ ++You can use the Tlist_Get_Tagname_By_Line() function provided by the taglist ++plugin to display the current tag name in the Vim status line or the window ++title bar. Similarly, you can use the Tlist_Get_Tag_Prototype_By_Line() ++function to display the current tag prototype in the Vim status line or the ++window title bar. ++ ++For example, the following command can be used to display the current tag name ++in the status line: ++> ++ :set statusline=%<%f%=%([%{Tlist_Get_Tagname_By_Line()}]%) ++< ++The following command can be used to display the current tag name in the ++window title bar: ++> ++ :set title titlestring=%<%f\ %([%{Tlist_Get_Tagname_By_Line()}]%) ++< ++Note that the current tag name can be displayed only after the file is ++processed by the taglist plugin. For this, you have to either set the ++'Tlist_Process_File_Always' variable to 1 or open the taglist window or use ++the taglist menu. For more information about configuring the Vim status line, ++refer to the documentation for the Vim |'statusline'| option. ++ ++Changing the taglist window highlighting~ ++The following Vim 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 ++ 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, ++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 MyTagListTagName guifg=blue ctermfg=blue ++< ++Controlling the taglist window~ ++To use a horizontally split taglist window, instead of a vertically split ++window, set the 'Tlist_Use_Horiz_Window' variable to 1. ++ ++To use a vertically split taglist window on the rightmost side of the Vim ++window, set the 'Tlist_Use_Right_Window' variable to 1. ++ ++You can specify the width of the vertically split taglist window, by setting ++the 'Tlist_WinWidth' variable. You can specify the height of the horizontally ++split taglist window, by setting the 'Tlist_WinHeight' variable. ++ ++When opening a vertically split taglist window, the Vim window width is ++increased to accommodate the new taglist window. When the taglist window is ++closed, the Vim window is reduced. To disable this, set the ++'Tlist_Inc_Winwidth' variable to zero. ++ ++To reduce the number of empty lines in the taglist window, set the ++'Tlist_Compact_Format' variable to 1. ++ ++To not display the Vim fold column in the taglist window, set the ++'Tlist_Enable_Fold_Column' variable to zero. ++ ++To display the tag prototypes instead of the tag names in the taglist window, ++set the 'Tlist_Display_Prototype' variable to 1. ++ ++To not display the scope of the tags next to the tag names, set the ++'Tlist_Display_Tag_Scope' variable to zero. ++ ++ *taglist-keys* ++Taglist window key list~ ++The following table lists the description of the keys that can be used ++in the taglist window. ++ ++ Key Description~ ++ ++ Jump to the location where the tag under cursor is ++ 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 ++ tag type and the number of tags. ++ u Update the tags listed in the taglist window ++ s Change the sort order of the tags (by name or by order) ++ d Remove the tags for the file under the cursor ++ x Zoom-in or Zoom-out the taglist window ++ + Open a fold ++ - Close a fold ++ * Open all folds ++ = Close all folds ++ [[ Jump to the beginning of the previous file ++ Jump to the beginning of the previous file ++ ]] Jump to the beginning of the next file ++ Jump to the beginning of the next file ++ q Close the taglist window ++ Display help ++ ++The above keys will work in both the normal mode and the insert mode. ++ ++ *taglist-menu* ++Taglist menu~ ++When using GUI Vim, the taglist plugin can display the tags defined in the ++current file in the drop-down menu and the popup menu. By default, this ++feature is turned off. To turn on this feature, set the 'Tlist_Show_Menu' ++variable to 1. ++ ++You can jump to a tag by selecting the tag name from the menu. You can use the ++taglist menu independent of the taglist window i.e. you don't need to open the ++taglist window to get the taglist menu. ++ ++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. 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 ++multiple submenus. The default setting for 'Tlist_Max_Submenu_Items' is 25. ++The first and last tag names in the submenu are used to form the submenu name. ++The menu items are prefixed by alpha-numeric characters for easy selection by ++keyboard. ++ ++If the popup menu support is enabled (the |'mousemodel'| option contains ++"popup"), then the tags menu is added to the popup menu. You can access ++the popup menu by right clicking on the GUI window. ++ ++You can regenerate the tags menu by selecting the 'Tags->Refresh menu' entry. ++You can sort the tags listed in the menu either by name or by order by ++selecting the 'Tags->Sort menu by->Name/Order' menu entry. ++ ++You can tear-off the Tags menu and keep it on the side of the Vim window ++for quickly locating the tags. ++ ++Using the taglist plugin with the winmanager plugin~ ++You can use the taglist plugin with the winmanager plugin. This will allow you ++to use the file explorer, buffer explorer and the taglist plugin at the same ++time in different windows. To use the taglist plugin with the winmanager ++plugin, set 'TagList' in the 'winManagerWindowLayout' variable. For example, ++to use the file explorer plugin and the taglist plugin at the same time, use ++the following setting: > ++ ++ let winManagerWindowLayout = 'FileExplorer|TagList' ++< ++Getting help~ ++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, ++the help information is removed from the taglist window. ++ ++ *taglist-debug* ++Debugging the taglist plugin~ ++You can use the ":TlistDebug" command to enable logging of the debug messages ++from the taglist plugin. To display the logged debug messages, you can use the ++":TlistMessages" command. To disable the logging of the debug messages, use ++the ":TlistUndebug" command. ++ ++You can specify a file name to the ":TlistDebug" command to log the debug ++messages to a file. Otherwise, the debug messages are stored in a script-local ++variable. In the later case, to minimize memory usage, only the last 3000 ++characters from the debug messages are stored. ++ ++============================================================================== ++ *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 ++can change the behavior of the taglist plugin. You need to change these ++settings only if you want to change the behavior of the taglist plugin. You ++should use the |:let| command in your .vimrc file to change the setting of any ++of these variables. ++ ++The configurable taglist variables are listed below. For a detailed ++description of these variables refer to the text below this table. ++ ++|'Tlist_Auto_Highlight_Tag'| Automatically highlight the current tag in the ++ taglist. ++|'Tlist_Auto_Open'| Open the taglist window when Vim starts. ++|'Tlist_Auto_Update'| Automatically update the taglist to include ++ newly edited files. ++|'Tlist_Close_On_Select'| Close the taglist window when a file or tag is ++ selected. ++|'Tlist_Compact_Format'| Remove extra information and blank lines from ++ the taglist window. ++|'Tlist_Ctags_Cmd'| Specifies the path to the ctags utility. ++|'Tlist_Display_Prototype'| Show prototypes and not tags in the taglist ++ window. ++|'Tlist_Display_Tag_Scope'| Show tag scope next to the tag name. ++|'Tlist_Enable_Fold_Column'| Show the fold indicator column in the taglist ++ 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. ++|'Tlist_Inc_Winwidth'| Increase the Vim window width to accommodate ++ the taglist window. ++|'Tlist_Max_Submenu_Items'| Maximum number of items in a tags sub-menu. ++|'Tlist_Max_Tag_Length'| Maximum tag length used in a tag menu entry. ++|'Tlist_Process_File_Always'| Process files even when the taglist window is ++ closed. ++|'Tlist_Show_Menu'| Display the tags menu. ++|'Tlist_Show_One_File'| Show tags for the current buffer only. ++|'Tlist_Sort_Type'| Sort method used for arranging the tags. ++|'Tlist_Use_Horiz_Window'| Use a horizontally split window for the ++ taglist window. ++|'Tlist_Use_Right_Window'| Place the taglist window on the right side. ++|'Tlist_Use_SingleClick'| Single click on a tag jumps to it. ++|'Tlist_WinHeight'| Horizontally split taglist window height. ++|'Tlist_WinWidth'| Vertically split taglist window width. ++ ++ *'Tlist_Auto_Highlight_Tag'* ++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 ++tag highlighting is disabled, the tags for a new file will still be added to ++the taglist window. ++> ++ let Tlist_Auto_Highlight_Tag = 0 ++< ++With the above variable set to 1, you can use the ":TlistHighlightTag" command ++to highlight the current tag. ++ ++ *'Tlist_Auto_Open'* ++Tlist_Auto_Open~ ++To automatically open the taglist window, when you start Vim, you can set the ++'Tlist_Auto_Open' variable to 1. By default, this variable is set to zero and ++the taglist window will not be opened automatically on Vim startup. ++> ++ let Tlist_Auto_Open = 1 ++< ++The taglist window is opened only when a supported type of file is opened on ++Vim startup. For example, if you open text files, then the taglist window will ++not be opened. ++ ++ *'Tlist_Auto_Update'* ++Tlist_Auto_Update~ ++When a new file is edited, the tags defined in the file are automatically ++processed and added to the taglist. To stop adding new files to the taglist, ++set the 'Tlist_Auto_Update' variable to zero. By default, this variable is set ++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 ++is not closed. ++> ++ let Tlist_Close_On_Select = 1 ++< ++ *'Tlist_Compact_Format'* ++Tlist_Compact_Format~ ++By default, empty lines are used to separate different tag types displayed for ++a file and the tags displayed for different files in the taglist window. If ++you want to display as many tags as possible in the taglist window, you can ++set the 'Tlist_Compact_Format' variable to 1 to get a compact display. ++> ++ let Tlist_Compact_Format = 1 ++< ++ *'Tlist_Ctags_Cmd'* ++Tlist_Ctags_Cmd~ ++The 'Tlist_Ctags_Cmd' variable specifies the location (path) of the exuberant ++ctags utility. If exuberant ctags is present in any one of the directories in ++the PATH environment variable, then there is no need to set this variable. ++ ++The exuberant ctags tool can be installed under different names. When the ++taglist plugin starts up, if the 'Tlist_Ctags_Cmd' variable is not set, it ++checks for the names exuberant-ctags, exctags, ctags, ctags.exe and tags in ++the PATH environment variable. If any one of the named executable is found, ++then the Tlist_Ctags_Cmd variable is set to that name. ++ ++If exuberant ctags is not present in one of the directories specified in the ++PATH environment variable, then set this variable to point to the location of ++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. Examples: ++> ++ let Tlist_Ctags_Cmd = 'd:\tools\ctags.exe' ++ let Tlist_Ctags_Cmd = '/usr/local/bin/ctags' ++< ++ *'Tlist_Display_Prototype'* ++Tlist_Display_Prototype~ ++By default, only the tag name will be displayed in the taglist window. If you ++like to see tag prototypes instead of names, set the 'Tlist_Display_Prototype' ++variable to 1. By default, this variable is set to zero and only tag names ++will be displayed. ++> ++ let Tlist_Display_Prototype = 1 ++< ++ *'Tlist_Display_Tag_Scope'* ++Tlist_Display_Tag_Scope~ ++By default, the scope of a tag (like a C++ class) will be displayed in ++square brackets next to the tag name. If you don't want the tag scopes ++to be displayed, then set the 'Tlist_Display_Tag_Scope' to zero. By default, ++this variable is set to 1 and the tag scopes will be displayed. ++> ++ let Tlist_Display_Tag_Scope = 0 ++< ++ *'Tlist_Enable_Fold_Column'* ++Tlist_Enable_Fold_Column~ ++By default, the Vim fold column is enabled and displayed in the taglist ++window. If you wish to disable this (for example, when you are working with a ++narrow Vim window or terminal), you can set the 'Tlist_Enable_Fold_Column' ++variable to zero. ++> ++ let Tlist_Enable_Fold_Column = 1 ++< ++ *'Tlist_Exit_OnlyWindow'* ++Tlist_Exit_OnlyWindow~ ++If you want to exit Vim if only the taglist window is currently opened, then ++set the 'Tlist_Exit_OnlyWindow' variable to 1. By default, this variable is ++set to zero and the Vim instance will not be closed if only the taglist window ++is present. ++> ++ let Tlist_Exit_OnlyWindow = 1 ++< ++ *'Tlist_File_Fold_Auto_Close'* ++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 ++other buffers is closed. ++> ++ 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~ ++When you enter a Vim buffer/window, the current tag in that buffer/window is ++automatically highlighted in the taglist window. If the current tag name is ++not visible in the taglist window, then the taglist window contents are ++scrolled to make that tag name visible. If you like to disable the automatic ++highlighting of the current tag when entering a buffer, you can set the ++'Tlist_Highlight_Tag_On_BufEnter' variable to zero. The default setting for ++this variable is 1. ++> ++ let Tlist_Highlight_Tag_On_BufEnter = 0 ++< ++ *'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 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 ++the screen due to the change in the window width or if you prefer not to ++adjust the window width then set the 'Tlist_Inc_Winwidth' variable to zero. ++CAUTION: If you are using the MS-Windows version of Vim in a MS-DOS command ++window then you must set this variable to zero, otherwise the system may hang ++due to a Vim limitation (explained in :help win32-problems) ++> ++ let Tlist_Inc_Winwidth = 0 ++< ++ *'Tlist_Max_Submenu_Items'* ++Tlist_Max_Submenu_Items~ ++If a file contains too many tags of a particular type (function, variable, ++class, etc.), greater than that specified by the 'Tlist_Max_Submenu_Items' ++variable, then the menu for that tag type will be split into multiple ++sub-menus. The default setting for the 'Tlist_Max_Submenu_Items' variable is ++25. This can be changed by setting the 'Tlist_Max_Submenu_Items' variable: ++> ++ let Tlist_Max_Submenu_Items = 20 ++< ++The name of the submenu is formed using the names of the first and the last ++tag entries in that submenu. ++ ++ *'Tlist_Max_Tag_Length'* ++Tlist_Max_Tag_Length~ ++Only the first 'Tlist_Max_Tag_Length' characters from the tag names will be ++used to form the tag type submenu name. The default value for this variable is ++10. Change the 'Tlist_Max_Tag_Length' setting if you want to include more or ++less characters: ++> ++ let Tlist_Max_Tag_Length = 10 ++< ++ *'Tlist_Process_File_Always'* ++Tlist_Process_File_Always~ ++By default, the taglist plugin will generate and process the tags defined in ++the newly opened files only when the taglist window is opened or when the ++taglist menu is enabled. When the taglist window is closed, the taglist plugin ++will stop processing the tags for newly opened files. ++ ++You can set the 'Tlist_Process_File_Always' variable to 1 to generate the list ++of tags for new files even when the taglist window is closed and the taglist ++menu is disabled. ++> ++ let Tlist_Process_File_Always = 1 ++< ++To use the ":TlistShowTag" and the ":TlistShowPrototype" commands without the ++taglist window and the taglist menu, you should set this variable to 1. ++ ++ *'Tlist_Show_Menu'* ++Tlist_Show_Menu~ ++When using GUI Vim, you can display the tags defined in the current file in a ++menu named "Tags". By default, this feature is turned off. To turn on this ++feature, set the 'Tlist_Show_Menu' variable to 1: ++> ++ let Tlist_Show_Menu = 1 ++< ++ *'Tlist_Show_One_File'* ++Tlist_Show_One_File~ ++By default, the taglist plugin will display the tags defined in all the loaded ++buffers in the taglist window. If you prefer to display the tags defined only ++in the current buffer, then you can set the 'Tlist_Show_One_File' to 1. When ++this variable is set to 1, as you switch between buffers, the taglist window ++will be refreshed to display the tags for the current buffer and the tags for ++the previous buffer will be removed. ++> ++ let Tlist_Show_One_File = 1 ++< ++ *'Tlist_Sort_Type'* ++Tlist_Sort_Type~ ++The 'Tlist_Sort_Type' variable specifies the sort order for the tags in the ++taglist window. The tags can be sorted either alphabetically by their name or ++by the order of their appearance in the file (chronological order). By ++default, the tag names will be listed by the order in which they are defined ++in the file. You can change the sort type (from name to order or from order to ++name) by pressing the "s" key in the taglist window. You can also change the ++default sort order by setting 'Tlist_Sort_Type' to "name" or "order": ++> ++ let Tlist_Sort_Type = "name" ++< ++ *'Tlist_Use_Horiz_Window'* ++Tlist_Use_Horiz_Window~ ++Be default, the tag names are displayed in a vertically split window. If you ++prefer a horizontally split window, then set the 'Tlist_Use_Horiz_Window' ++variable to 1. If you are running MS-Windows version of Vim in a MS-DOS ++command window, then you should use a horizontally split window instead of a ++vertically split window. Also, if you are using an older version of xterm in a ++Unix system that doesn't support changing the xterm window width, you should ++use a horizontally split window. ++> ++ let Tlist_Use_Horiz_Window = 1 ++< ++ *'Tlist_Use_Right_Window'* ++Tlist_Use_Right_Window~ ++By default, the vertically split taglist window will appear on the left hand ++side. If you prefer to open the window on the right hand side, you can set the ++'Tlist_Use_Right_Window' variable to 1: ++> ++ let Tlist_Use_Right_Window = 1 ++< ++ *'Tlist_Use_SingleClick'* ++Tlist_Use_SingleClick~ ++By default, when you double click on the tag name using the left mouse ++button, the cursor will be positioned at the definition of the tag. You ++can set the 'Tlist_Use_SingleClick' variable to 1 to jump to a tag when ++you single click on the tag name using the mouse. By default this variable ++is set to zero. ++> ++ let Tlist_Use_SingleClick = 1 ++< ++Due to a bug in Vim, if you set 'Tlist_Use_SingleClick' to 1 and try to resize ++the taglist window using the mouse, then Vim will crash. This problem is fixed ++in Vim 6.3 and above. In the meantime, instead of resizing the taglist window ++using the mouse, you can use normal Vim window resizing commands to resize the ++taglist window. ++ ++ *'Tlist_WinHeight'* ++Tlist_WinHeight~ ++The default height of the horizontally split taglist window is 10. This can be ++changed by modifying the 'Tlist_WinHeight' variable: ++> ++ let Tlist_WinHeight = 20 ++< ++The |'winfixheight'| option is set for the taglist window, to maintain the ++height of the taglist window, when new Vim windows are opened and existing ++windows are closed. ++ ++ *'Tlist_WinWidth'* ++Tlist_WinWidth~ ++The default width of the vertically split taglist window is 30. This can be ++changed by modifying the 'Tlist_WinWidth' variable: ++> ++ let Tlist_WinWidth = 20 ++< ++Note that the value of the |'winwidth'| option setting determines the minimum ++width of the current window. If you set the 'Tlist_WinWidth' variable to a ++value less than that of the |'winwidth'| option setting, then Vim will use the ++value of the |'winwidth'| option. ++ ++When new Vim windows are opened and existing windows are closed, the taglist ++plugin will try to maintain the width of the taglist window to the size ++specified by the 'Tlist_WinWidth' variable. ++ ++============================================================================== ++ *taglist-commands* ++7. Commands~ ++ ++The taglist plugin provides the following ex-mode commands: ++ ++|:TlistAddFiles| Add multiple files to the taglist. ++|:TlistAddFilesRecursive| ++ Add files recursively to the taglist. ++|:TlistClose| Close the taglist window. ++|:TlistDebug| Start logging of taglist debug messages. ++|:TlistLock| Stop adding new files to the taglist. ++|:TlistMessages| Display the logged taglist plugin debug messages. ++|:TlistOpen| Open and jump to the taglist window. ++|:TlistSessionSave| Save the information about files and tags in the ++ taglist to a session file. ++|:TlistSessionLoad| Load the information about files and tags stored ++ in a session file to taglist. ++|:TlistShowPrototype| Display the prototype of the tag at or before the ++ specified line number. ++|:TlistShowTag| Display the name of the tag defined at or before the ++ specified line number. ++|:TlistHighlightTag| Highlight the current tag in the taglist window. ++|:TlistToggle| Open or close (toggle) the taglist window. ++|:TlistUndebug| Stop logging of taglist debug messages. ++|:TlistUnlock| Start adding new files to the taglist. ++|:TlistUpdate| Update the tags for the current buffer. ++ ++ *:TlistAddFiles* ++:TlistAddFiles {file(s)} [file(s) ...] ++ Add one or more specified files to the taglist. You can ++ specify multiple filenames using wildcards. To specify a ++ file name with space character, you should escape the space ++ character with a backslash. ++ Examples: ++> ++ :TlistAddFiles *.c *.cpp ++ :TlistAddFiles file1.html file2.html ++< ++ If you specify a large number of files, then it will take some ++ time for the taglist plugin to process all of them. The ++ specified files will not be edited in a Vim window and will ++ not be added to the Vim buffer list. ++ ++ *:TlistAddFilesRecursive* ++:TlistAddFilesRecursive {directory} [ {pattern} ] ++ Add files matching {pattern} recursively from the specified ++ {directory} to the taglist. If {pattern} is not specified, ++ then '*' is assumed. To specify the current directory, use "." ++ for {directory}. To specify a directory name with space ++ character, you should escape the space character with a ++ backslash. ++ Examples: ++> ++ :TlistAddFilesRecursive myproject *.java ++ :TlistAddFilesRecursive smallproject ++< ++ If large number of files are present in the specified ++ directory tree, then it will take some time for the taglist ++ plugin to process all of them. ++ ++ *:TlistClose* ++:TlistClose Close the taglist window. This command can be used from any ++ one of the Vim windows. ++ ++ *:TlistDebug* ++:TlistDebug [filename] ++ Start logging of debug messages from the taglist plugin. ++ If {filename} is specified, then the debug messages are stored ++ in the specified file. Otherwise, the debug messages are ++ stored in a script local variable. If the file {filename} is ++ already present, then it is overwritten. ++ ++ *:TlistLock* ++:TlistLock ++ Lock the taglist and don't process new files. After this ++ command is executed, newly edited files will not be added to ++ the taglist. ++ ++ *:TlistMessages* ++:TlistMessages ++ Display the logged debug messages from the taglist plugin ++ in a window. This command works only when logging to a ++ script-local variable. ++ ++ *:TlistOpen* ++:TlistOpen Open and jump to the taglist window. Creates the taglist ++ window, if the window is not opened currently. After executing ++ this command, the cursor is moved to the taglist window. When ++ the taglist window is opened for the first time, all the files ++ in the buffer list are processed and the tags defined in them ++ are displayed in the taglist window. ++ ++ *:TlistSessionSave* ++:TlistSessionSave {filename} ++ Saves the information about files and tags in the taglist to ++ the specified file. This command can be used to save and ++ restore the taglist contents across Vim sessions. ++ ++ *:TlistSessionLoad* ++:TlistSessionLoad {filename} ++ Load the information about files and tags stored in the ++ specified session file to the taglist. ++ ++ *:TlistShowPrototype* ++:TlistShowPrototype [filename] [linenumber] ++ Display the prototype of the tag at or before the specified ++ line number. If the file name and the line number are not ++ specified, then the current file name and line number are ++ used. A tag spans multiple lines starting from the line where ++ it is defined to the line before the next tag. This command ++ displays the prototype for the tag for any line number in this ++ range. ++ ++ *:TlistShowTag* ++:TlistShowTag [filename] [linenumber] ++ Display the name of the tag defined at or before the specified ++ line number. If the file name and the line number are not ++ specified, then the current file name and line number are ++ used. A tag spans multiple lines starting from the line where ++ it is defined to the line before the next tag. This command ++ displays the tag name for any line number in this range. ++ ++ *:TlistHighlightTag* ++:TlistHighlightTag ++ Highlight the current tag in the taglist window. By default, ++ the taglist plugin periodically updates the taglist window to ++ highlight the current tag. This command can be used to force ++ the taglist plugin to highlight the current tag. ++ ++ *:TlistToggle* ++:TlistToggle Open or close (toggle) the taglist window. Opens the taglist ++ window, if the window is not opened currently. Closes the ++ taglist window, if the taglist window is already opened. When ++ the taglist window is opened for the first time, all the files ++ in the buffer list are processed and the tags are displayed in ++ the taglist window. After executing this command, the cursor ++ is not moved from the current window to the taglist window. ++ ++ *:TlistUndebug* ++:TlistUndebug ++ Stop logging of debug messages from the taglist plugin. ++ ++ *:TlistUnlock* ++:TlistUnlock ++ Unlock the taglist and start processing newly edited files. ++ ++ *:TlistUpdate* ++:TlistUpdate Update the tags information for the current buffer. This ++ command can be used to re-process the current file/buffer and ++ get the tags information. As the taglist plugin uses the file ++ saved in the disk (instead of the file displayed in a Vim ++ buffer), you should save a modified buffer before you update ++ the taglist. Otherwise the listed tags will not include the ++ new tags created in the buffer. You can use this command even ++ when the taglist window is not opened. ++ ++============================================================================== ++ *taglist-functions* ++8. Global functions~ ++ ++The taglist plugin provides several global functions that can be used from ++other Vim plugins to interact with the taglist plugin. These functions are ++described below. ++ ++|Tlist_Update_File_Tags()| Update the tags for the specified file ++|Tlist_Get_Tag_Prototype_By_Line()| Return the prototype of the tag at or ++ before the specified line number in the ++ specified file. ++|Tlist_Get_Tagname_By_Line()| Return the name of the tag at or ++ before the specified line number in ++ the specified file. ++|Tlist_Set_App()| Set the name of the application ++ controlling the taglist window. ++ ++ *Tlist_Update_File_Tags()* ++Tlist_Update_File_Tags({filename}, {filetype}) ++ Update the tags for the file {filename}. The second argument ++ specifies the Vim filetype for the file. If the taglist plugin ++ has not processed the file previously, then the exuberant ++ ctags tool is invoked to generate the tags for the file. ++ ++ *Tlist_Get_Tag_Prototype_By_Line()* ++Tlist_Get_Tag_Prototype_By_Line([{filename}, {linenumber}]) ++ Return the prototype of the tag at or before the specified ++ line number in the specified file. If the filename and line ++ number are not specified, then the current buffer name and the ++ current line number are used. ++ ++ *Tlist_Get_Tagname_By_Line()* ++Tlist_Get_Tagname_By_Line([{filename}, {linenumber}]) ++ Return the name of the tag at or before the specified line ++ number in the specified file. If the filename and line number ++ are not specified, then the current buffer name and the ++ current line number are used. ++ ++ *Tlist_Set_App()* ++Tlist_Set_App({appname}) ++ Set the name of the plugin that controls the taglist plugin ++ window and buffer. This can be used to integrate the taglist ++ plugin with other Vim plugins. ++ ++ For example, the winmanager plugin and the Cream package use ++ this function and specify the appname as "winmanager" and ++ "cream" respectively. ++ ++ By default, the taglist plugin is a stand-alone plugin and ++ controls the taglist window and buffer. If the taglist window ++ is controlled by an external plugin, then the appname should ++ be set appropriately. ++ ++============================================================================== ++ *taglist-extend* ++9. Extending~ ++ ++The taglist plugin supports all the languages supported by the exuberant ctags ++tool, which includes the following languages: Assembly, ASP, Awk, Beta, C, ++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 extend the taglist plugin to add support for new languages and also ++modify the support for the above listed languages. ++ ++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 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 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 ++ ++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 ++ ++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 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. 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: ++ ++ 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 ++used for the class tags and 'function' is the title used for the function tags ++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. 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. ++ ++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): ++ ++ 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', ++'command' and 'label' will be used in the taglist window for the tags which ++are generated for the flags b, c and l respectively. ++ ++============================================================================== ++ *taglist-faq* ++10. Frequently Asked Questions~ ++ ++Q. The taglist plugin doesn't work. The taglist window is empty and the tags ++ defined in a file are not displayed. ++A. Are you using Vim version 6.0 and above? The taglist plugin relies on the ++ features supported by Vim version 6.0 and above. You can use the following ++ command to get the Vim version: ++> ++ $ vim --version ++< ++ Are you using exuberant ctags version 5.0 and above? The taglist plugin ++ relies on the features supported by exuberant ctags and will not work with ++ GNU ctags or the Unix ctags utility. You can use the following command to ++ determine whether the ctags installed in your system is exuberant ctags: ++> ++ $ 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: ++> ++ :filetype ++< ++ The output of the above command should contain "filetype detection:ON". ++ To turn on the filetype detection, add the following line to the .vimrc or ++ _vimrc file: ++> ++ filetype on ++< ++ Is your version of Vim compiled with the support for the system() function? ++ The following Vim command should display 1: ++> ++ :echo exists('*system') ++< ++ In some Linux distributions (particularly Suse Linux), the default Vim ++ installation is built without the support for the system() function. The ++ taglist plugin uses the system() function to invoke the exuberant ctags ++ utility. You need to rebuild Vim after enabling the support for the ++ system() function. If you use the default build options, the system() ++ function will be supported. ++ ++ Do you have the |'shellslash'| option set? You can try disabling the ++ |'shellslash'| option. When the taglist plugin invokes the exuberant ctags ++ utility with the path to the file, if the incorrect slashes are used, then ++ you will see errors. ++ ++ Check the shell related Vim options values using the following command: ++> ++ :set shell? shellcmdflag? shellpipe? ++ :set shellquote? shellredir? shellxquote? ++< ++ If these options are set in your .vimrc or _vimrc file, try removing those ++ lines. ++ ++ Are you using a Unix shell in a MS-Windows environment? For example, ++ the Unix shell from the MKS-toolkit. Do you have the SHELL environment ++ set to point to this shell? You can try resetting the SHELL environment ++ variable. ++ ++ If you are using a Unix shell on MS-Windows, you should try to use ++ exuberant ctags that is compiled for Unix-like environments so that ++ exuberant ctags will understand path names with forward slash characters. ++ ++ Is your filetype supported by the exuberant ctags utility? The file types ++ supported by the exuberant ctags utility are listed in the ctags help. If a ++ file type is not supported, you have to extend exuberant ctags. You can use ++ the following command to list the filetypes supported by exuberant ctags: ++> ++ ctags --list-languages ++< ++ Run the following command from the shell prompt and check whether the tags ++ defined in your file are listed in the output from exuberant ctags: ++> ++ ctags -f - --format=2 --excmd=pattern --fields=nks ++< ++ If you see your tags in the output from the above command, then the ++ exuberant ctags utility is properly parsing your file. ++ ++ Do you have the .ctags or _ctags or the ctags.cnf file in your home ++ directory for specifying default options or for extending exuberant ctags? ++ If you do have this file, check the options in this file and make sure ++ these options are not interfering with the operation of the taglist plugin. ++ ++ If you are using MS-Windows, check the value of the TEMP and TMP ++ environment variables. If these environment variables are set to a path ++ with space characters in the name, then try using the DOS 8.3 short name ++ for the path or set them to a path without the space characters in the ++ name. For example, if the temporary directory name is "C:\Documents and ++ Settings\xyz\Local Settings\Temp", then try setting the TEMP variable to ++ the following: ++> ++ set TEMP=C:\DOCUMEN~1\xyz\LOCALS~1\Temp ++< ++ If exuberant ctags is installed in a directory with space characters in the ++ name, then try adding the directory to the PATH environment variable or try ++ setting the 'Tlist_Ctags_Cmd' variable to the shortest path name to ctags ++ or try copying the exuberant ctags to a path without space characters in ++ the name. For example, if exuberant ctags is installed in the directory ++ "C:\Program Files\Ctags", then try setting the 'Tlist_Ctags_Cmd' variable ++ as below: ++> ++ let Tlist_Ctags_Cmd='C:\Progra~1\Ctags\ctags.exe' ++< ++Q. When I try to open the taglist window, I am seeing the following error ++ message. How do I fix this problem? ++ ++ Taglist: Failed to generate tags for /my/path/to/file ++ ctags: illegal option -- -^@usage: ctags [-BFadtuwvx] [-f tagsfile] file ... ++ ++A. The taglist plugin will work only with the exuberant ctags tool. You ++ cannot use the GNU ctags or the Unix ctags program with the taglist plugin. ++ You will see an error message similar to the one shown above, if you try ++ use a non-exuberant ctags program with Vim. To fix this problem, either add ++ the exuberant ctags tool location to the PATH environment variable or set ++ the 'Tlist_Ctags_Cmd' variable. ++ ++Q. A file has more than one tag with the same name. When I select a tag name ++ from the taglist window, the cursor is positioned at the incorrect tag ++ location. ++A. The taglist plugin uses the search pattern generated by the exuberant ctags ++ utility to position the cursor at the location of a tag definition. If a ++ file has more than one tag with the same name and same prototype, then the ++ search pattern will be the same. In this case, when searching for the tag ++ pattern, the cursor may be positioned at the incorrect location. ++ ++Q. I have made some modifications to my file and introduced new ++ functions/classes/variables. I have not yet saved my file. The taglist ++ plugin is not displaying the new tags when I update the taglist window. ++A. The exuberant ctags utility will process only files that are present in the ++ disk. To list the tags defined in a file, you have to save the file and ++ then update the taglist window. ++ ++Q. I have created a ctags file using the exuberant ctags utility for my source ++ tree. How do I configure the taglist plugin to use this tags file? ++A. The taglist plugin doesn't use a tags file stored in disk. For every opened ++ file, the taglist plugin invokes the exuberant ctags utility to get the ++ list of tags dynamically. The Vim system() function is used to invoke ++ exuberant ctags and get the ctags output. This function internally uses a ++ temporary file to store the output. This file is deleted after the output ++ from the command is read. So you will never see the file that contains the ++ output of exuberant ctags. ++ ++Q. When I set the |'updatetime'| option to a low value (less than 1000) and if ++ I keep pressing a key with the taglist window open, the current buffer ++ contents are changed. Why is this? ++A. The taglist plugin uses the |CursorHold| autocmd to highlight the current ++ tag. The CursorHold autocmd triggers for every |'updatetime'| milliseconds. ++ If the |'updatetime'| option is set to a low value, then the CursorHold ++ autocmd will be triggered frequently. As the taglist plugin changes ++ the focus to the taglist window to highlight the current tag, this could ++ interfere with the key movement resulting in changing the contents of ++ 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* ++12. Todo~ ++ ++1. Group tags according to the scope and display them. For example, ++ group all the tags belonging to a C++/Java class ++2. Support for displaying tags in a modified (not-yet-saved) file. ++3. Automatically open the taglist window only for selected filetypes. ++ For other filetypes, close the taglist window. ++4. When using the shell from the MKS toolkit, the taglist plugin ++ doesn't work. ++5. The taglist plugin doesn't work with files edited remotely using the ++ netrw plugin. The exuberant ctags utility cannot process files over ++ scp/rcp/ftp, etc. ++ ++============================================================================== ++ ++vim:tw=78:ts=8:noet:ft=help: +diff -urN vim71/1/doc/taglist.txt vim71_ada/1/doc/taglist.txt +--- vim71/1/doc/taglist.txt 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/doc/taglist.txt 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,1494 @@ ++*taglist.txt* Plugin for browsing source code ++ ++Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) ++For Vim version 6.0 and above ++Last change: 2007 February 18 ++ ++1. Overview |taglist-intro| ++2. Taglist on the internet |taglist-internet| ++3. Requirements |taglist-requirements| ++4. Installation |taglist-install| ++5. Usage |taglist-using| ++6. Options |taglist-options| ++7. Commands |taglist-commands| ++8. Global functions |taglist-functions| ++9. Extending |taglist-extend| ++10. FAQ |taglist-faq| ++11. License |taglist-license| ++12. Todo |taglist-todo| ++ ++============================================================================== ++ *taglist-intro* ++1. Overview~ ++ ++The "Tag List" plugin is a source code browser plugin for Vim. This plugin ++allows you to efficiently browse through source code files for different ++programming languages. The "Tag List" plugin provides the following features: ++ ++ * Displays the tags (functions, classes, structures, variables, etc.) ++ defined in a file in a vertically or horizontally split Vim window. ++ * In GUI Vim, optionally displays the tags in the Tags drop-down menu and ++ in the popup menu. ++ * Automatically updates the taglist window as you switch between ++ files/buffers. As you open new files, the tags defined in the new files ++ are added to the existing file list and the tags defined in all the ++ files are displayed grouped by the filename. ++ * When a tag name is selected from the taglist window, positions the ++ cursor at the definition of the tag in the source file. ++ * Automatically highlights the current tag name. ++ * Groups the tags by their type and displays them in a foldable tree. ++ * Can display the prototype and scope of a tag. ++ * Can optionally display the tag prototype instead of the tag name in the ++ taglist window. ++ * The tag list can be sorted either by name or by chronological order. ++ * Supports the following language files: Assembly, ASP, Awk, Beta, C, ++ 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. ++ * Can be easily extended to support new languages. Support for ++ existing languages can be modified easily. ++ * Provides functions to display the current tag name in the Vim status ++ line or the window title bar. ++ * The list of tags and files in the taglist can be saved and ++ restored across Vim sessions. ++ * Provides commands to get the name and prototype of the current tag. ++ * Runs in both console/terminal and GUI versions of Vim. ++ * Works with the winmanager plugin. Using the winmanager plugin, you ++ can use Vim plugins like the file explorer, buffer explorer and the ++ taglist plugin at the same time like an IDE. ++ * Can be used in both Unix and MS-Windows systems. ++ ++============================================================================== ++ *taglist-internet* ++2. Taglist on the internet~ ++ ++The home page of the taglist plugin is at: ++> ++ http://vim-taglist.sourceforge.net/ ++< ++You can subscribe to the taglist mailing list to post your questions or ++suggestions for improvement or to send bug reports. Visit the following page ++for subscribing to the mailing list: ++> ++ http://groups.yahoo.com/group/taglist ++< ++============================================================================== ++ *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 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. The exuberant ctags utility is shipped with ++most of the Linux distributions. You can download the exuberant ctags utility ++from ++> ++ http://ctags.sourceforge.net ++< ++The taglist plugin doesn't use or create a tags file and there is no need to ++create a tags file to use this plugin. The taglist plugin will not work with ++the GNU ctags or the Unix ctags utility. ++ ++This plugin relies on the Vim "filetype" detection mechanism to determine the ++type of the current file. You have to turn on the Vim filetype detection by ++adding the following line to your .vimrc file: ++> ++ filetype on ++< ++The taglist plugin will not work if you run Vim in the restricted mode (using ++the -Z command-line argument). ++ ++The taglist plugin uses the Vim system() function to invoke the exuberant ++ctags utility. If Vim is compiled without the system() function then you ++cannot use the taglist plugin. Some of the Linux distributions (Suse) compile ++Vim without the system() function for security reasons. ++ ++============================================================================== ++ *taglist-install* ++4. Installation~ ++ ++1. Download the taglist.zip file and unzip the files to the $HOME/.vim or the ++ $HOME/vimfiles or the $VIM/vimfiles directory. After this step, you should ++ have the following two files (the directory structure should be preserved): ++ ++ plugin/taglist.vim - main taglist plugin file ++ doc/taglist.txt - documentation (help) file ++ ++ 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 ++ topics. ++3. If the exuberant ctags utility is not present in one of the directories in ++ the PATH environment variable, then set the 'Tlist_Ctags_Cmd' variable to ++ point to the location of the exuberant ctags utility (not to the directory) ++ in the .vimrc file. ++4. If you are running a terminal/console version of Vim and the terminal ++ doesn't support changing the window width then set the ++ 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. ++5. Restart Vim. ++6. You can now use the ":TlistToggle" command to open/close the taglist ++ window. You can use the ":help taglist" command to get more information ++ about using the taglist plugin. ++ ++To uninstall the taglist plugin, remove the plugin/taglist.vim and ++doc/taglist.txt files from the $HOME/.vim or $HOME/vimfiles directory. ++ ++============================================================================== ++ *taglist-using* ++5. Usage~ ++ ++The taglist plugin can be used in several different ways. ++ ++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 ++ processes the tags defined in newly edited files. You can then open the ++ taglist window only when you need to select a tag and then automatically ++ close the taglist window after selecting the tag. ++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 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 ++ plugin to process the tags defined in a file always. ++6. You can save the tags defined in multiple files to a taglist session file ++ and load it when needed. You can also configure the taglist plugin to not ++ update the taglist window when editing new files. You can then manually add ++ files to the taglist window. ++ ++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. 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. ++> ++ nnoremap :TlistToggle ++< ++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: ++> ++ $ vim +TlistOpen ++< ++Closing the taglist window~ ++You can close the taglist window from the taglist window by pressing 'q' or ++using the Vim ":q" command. You can also use any of the Vim window commands to ++close the taglist window. Invoking the ":TlistToggle" command when the taglist ++window is opened, closes the taglist window. You can also use the ++":TlistClose" command to close the taglist window. ++ ++To automatically close the taglist window when a tag or file is selected, you ++can set the 'Tlist_Close_On_Select' variable to 1. To exit Vim when only the ++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. ++ ++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 ++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 ++taglist window. The Vim |CursorHold| autocmd event is used for this. If the ++current tag name is not visible in the taglist window, then the taglist window ++contents are scrolled to make that tag name visible. You can also use the ++":TlistHighlightTag" command to force the highlighting of the current tag. ++ ++The tag name is highlighted if no activity is performed for |'updatetime'| ++milliseconds. The default value for this Vim option is 4 seconds. To avoid ++unexpected problems, you should not set the |'updatetime'| option to a very ++low value. ++ ++To disable the automatic highlighting of the current tag name in the taglist ++window, set the 'Tlist_Auto_Highlight_Tag' variable to zero. ++ ++When entering a Vim buffer/window, the taglist plugin automatically highlights ++the current tag in that buffer/window. If you like to disable the automatic ++highlighting of the current tag when entering a buffer, set the ++'Tlist_Highlight_Tag_On_BufEnter' variable to zero. ++ ++Adding files to the taglist~ ++When the taglist window is opened, all the files in the Vim buffer list are ++processed and the supported files are added to the taglist. When you edit a ++file in Vim, the taglist plugin automatically processes this file and adds it ++to the taglist. If you close the taglist window, the tag information in the ++taglist is retained. ++ ++To process files even when the taglist window is not open, set the ++'Tlist_Process_File_Always' variable to 1. ++ ++You can manually add multiple files to the taglist without opening them using ++the ":TlistAddFiles" and the ":TlistAddFilesRecursive" commands. ++ ++For example, to add all the C files in the /my/project/dir directory to the ++taglist, you can use the following command: ++> ++ :TlistAddFiles /my/project/dir/*.c ++< ++Note that when adding several files with a large number of tags or a large ++number of files, it will take several seconds to several minutes for the ++taglist plugin to process all the files. You should not interrupt the taglist ++plugin by pressing . ++ ++You can recursively add multiple files from a directory tree using the ++":TlistAddFilesRecursive" command: ++> ++ :TlistAddFilesRecursive /my/project/dir *.c ++< ++This command takes two arguments. The first argument specifies the directory ++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 ++removed file will no longer be displayed in the taglist window in the current ++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 ++":bwipeout" command, the taglist is updated to remove the stored information ++for this buffer. ++ ++Updating the tags displayed for a file~ ++The taglist plugin keeps track of the modification time of a file. When the ++modification time changes (the file is modified), the taglist plugin ++automatically updates the tags listed for that file. The modification time of ++a file is checked when you enter a window containing that file or when you ++load that file. ++ ++You can also update or refresh the tags displayed for a file by pressing the ++"u" key in the taglist window. If an existing file is modified, after the file ++is saved, the taglist plugin automatically updates the tags displayed for the ++file. ++ ++You can also use the ":TlistUpdate" command to update the tags for the current ++buffer after you made some changes to it. You should save the modified buffer ++before you update the taglist window. Otherwise the listed tags will not ++include the new tags created in the buffer. ++ ++If you have deleted the tags displayed for a file in the taglist window using ++the 'd' key, you can again display the tags for that file using the ++":TlistUpdate" command. ++ ++Controlling the taglist updates~ ++To disable the automatic processing of new files or modified files, you can ++set the 'Tlist_Auto_Update' variable to zero. When this variable is set to ++zero, the taglist is updated only when you use the ":TlistUpdate" command or ++the ":TlistAddFiles" or the ":TlistAddFilesRecursive" commands. You can use ++this option to control which files are added to the taglist. ++ ++You can use the ":TlistLock" command to lock the taglist contents. After this ++command is executed, new files are not automatically added to the taglist. ++When the taglist is locked, you can use the ":TlistUpdate" command to add the ++current file or the ":TlistAddFiles" or ":TlistAddFilesRecursive" commands to ++add new files to the taglist. To unlock the taglist, use the ":TlistUnlock" ++command. ++ ++Displaying the tag prototype~ ++To display the prototype of the tag under the cursor in the taglist window, ++press the space bar. If you place the cursor on a tag name in the taglist ++window, then the tag prototype is displayed at the Vim status line after ++|'updatetime'| milliseconds. The default value for the |'updatetime'| Vim ++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. 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 ++line number are not supplied, then this command will display the name of the ++current tag. For example, ++> ++ :TlistShowTag ++ :TlistShowTag myfile.java 100 ++< ++You can use the ":TlistShowPrototype" command to display the prototype of the ++tag at or before the specified line number in the specified file. If the file ++name and the line number are not supplied, then this command will display the ++prototype of the current tag. For example, ++> ++ :TlistShowPrototype ++ :TlistShowPrototype myfile.c 50 ++< ++In the taglist window, when the mouse is moved over a tag name, the tag ++prototype is displayed in a balloon. This works only in GUI versions where ++balloon evaluation is supported. ++ ++Taglist window contents~ ++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 ++|'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 ++the Vim folding support. You can collapse the tree using the '-' key or using ++the Vim |zc| fold command. You can open the tree using the '+' key or using ++the Vim |zo| fold command. You can open all the folds using the '*' key or ++using the Vim |zR| fold command. You can also use the mouse to open/close the ++folds. You can close all the folds using the '=' key. You should not manually ++create or delete the folds in the taglist window. ++ ++To automatically close the fold for the inactive files/buffers and open only ++the fold for the current buffer in the taglist window, set the ++'Tlist_File_Fold_Auto_Close' variable to 1. ++ ++Sorting the tags for a file~ ++The tags displayed in the taglist window can be sorted either by their name or ++by their chronological order. The default sorting method is by the order in ++which the tags appear in a file. You can change the default sort method by ++setting the 'Tlist_Sort_Type' variable to either "name" or "order". You can ++sort the tags by their name by pressing the "s" key in the taglist window. You ++can again sort the tags by their chronological order using the "s" key. Each ++file in the taglist window can be sorted using different order. ++ ++Zooming in and out of the taglist window~ ++You can press the 'x' key in the taglist window to maximize the taglist ++window width/height. The window will be maximized to the maximum possible ++width/height without closing the other existing windows. You can again press ++'x' to restore the taglist window to the default width/height. ++ ++ *taglist-session* ++Taglist Session~ ++A taglist session refers to the group of files and their tags stored in the ++taglist in a Vim session. ++ ++You can save and restore a taglist session (and all the displayed tags) using ++the ":TlistSessionSave" and ":TlistSessionLoad" commands. ++ ++To save the information about the tags and files in the taglist to a file, use ++the ":TlistSessionSave" command and specify the filename: ++> ++ :TlistSessionSave ++< ++To load a saved taglist session, use the ":TlistSessionLoad" command: > ++ ++ :TlistSessionLoad ++< ++When you load a taglist session file, the tags stored in the file will be ++added to the tags already stored in the taglist. ++ ++The taglist session feature can be used to save the tags for large files or a ++group of frequently used files (like a project). By using the taglist session ++file, you can minimize the amount to time it takes to load/refresh the taglist ++for multiple files. ++ ++You can create more than one taglist session file for multiple groups of ++files. ++ ++Displaying the tag name in the Vim status line or the window title bar~ ++You can use the Tlist_Get_Tagname_By_Line() function provided by the taglist ++plugin to display the current tag name in the Vim status line or the window ++title bar. Similarly, you can use the Tlist_Get_Tag_Prototype_By_Line() ++function to display the current tag prototype in the Vim status line or the ++window title bar. ++ ++For example, the following command can be used to display the current tag name ++in the status line: ++> ++ :set statusline=%<%f%=%([%{Tlist_Get_Tagname_By_Line()}]%) ++< ++The following command can be used to display the current tag name in the ++window title bar: ++> ++ :set title titlestring=%<%f\ %([%{Tlist_Get_Tagname_By_Line()}]%) ++< ++Note that the current tag name can be displayed only after the file is ++processed by the taglist plugin. For this, you have to either set the ++'Tlist_Process_File_Always' variable to 1 or open the taglist window or use ++the taglist menu. For more information about configuring the Vim status line, ++refer to the documentation for the Vim |'statusline'| option. ++ ++Changing the taglist window highlighting~ ++The following Vim 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 ++ 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, ++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 MyTagListTagName guifg=blue ctermfg=blue ++< ++Controlling the taglist window~ ++To use a horizontally split taglist window, instead of a vertically split ++window, set the 'Tlist_Use_Horiz_Window' variable to 1. ++ ++To use a vertically split taglist window on the rightmost side of the Vim ++window, set the 'Tlist_Use_Right_Window' variable to 1. ++ ++You can specify the width of the vertically split taglist window, by setting ++the 'Tlist_WinWidth' variable. You can specify the height of the horizontally ++split taglist window, by setting the 'Tlist_WinHeight' variable. ++ ++When opening a vertically split taglist window, the Vim window width is ++increased to accommodate the new taglist window. When the taglist window is ++closed, the Vim window is reduced. To disable this, set the ++'Tlist_Inc_Winwidth' variable to zero. ++ ++To reduce the number of empty lines in the taglist window, set the ++'Tlist_Compact_Format' variable to 1. ++ ++To not display the Vim fold column in the taglist window, set the ++'Tlist_Enable_Fold_Column' variable to zero. ++ ++To display the tag prototypes instead of the tag names in the taglist window, ++set the 'Tlist_Display_Prototype' variable to 1. ++ ++To not display the scope of the tags next to the tag names, set the ++'Tlist_Display_Tag_Scope' variable to zero. ++ ++ *taglist-keys* ++Taglist window key list~ ++The following table lists the description of the keys that can be used ++in the taglist window. ++ ++ Key Description~ ++ ++ Jump to the location where the tag under cursor is ++ 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 ++ tag type and the number of tags. ++ u Update the tags listed in the taglist window ++ s Change the sort order of the tags (by name or by order) ++ d Remove the tags for the file under the cursor ++ x Zoom-in or Zoom-out the taglist window ++ + Open a fold ++ - Close a fold ++ * Open all folds ++ = Close all folds ++ [[ Jump to the beginning of the previous file ++ Jump to the beginning of the previous file ++ ]] Jump to the beginning of the next file ++ Jump to the beginning of the next file ++ q Close the taglist window ++ Display help ++ ++The above keys will work in both the normal mode and the insert mode. ++ ++ *taglist-menu* ++Taglist menu~ ++When using GUI Vim, the taglist plugin can display the tags defined in the ++current file in the drop-down menu and the popup menu. By default, this ++feature is turned off. To turn on this feature, set the 'Tlist_Show_Menu' ++variable to 1. ++ ++You can jump to a tag by selecting the tag name from the menu. You can use the ++taglist menu independent of the taglist window i.e. you don't need to open the ++taglist window to get the taglist menu. ++ ++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. 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 ++multiple submenus. The default setting for 'Tlist_Max_Submenu_Items' is 25. ++The first and last tag names in the submenu are used to form the submenu name. ++The menu items are prefixed by alpha-numeric characters for easy selection by ++keyboard. ++ ++If the popup menu support is enabled (the |'mousemodel'| option contains ++"popup"), then the tags menu is added to the popup menu. You can access ++the popup menu by right clicking on the GUI window. ++ ++You can regenerate the tags menu by selecting the 'Tags->Refresh menu' entry. ++You can sort the tags listed in the menu either by name or by order by ++selecting the 'Tags->Sort menu by->Name/Order' menu entry. ++ ++You can tear-off the Tags menu and keep it on the side of the Vim window ++for quickly locating the tags. ++ ++Using the taglist plugin with the winmanager plugin~ ++You can use the taglist plugin with the winmanager plugin. This will allow you ++to use the file explorer, buffer explorer and the taglist plugin at the same ++time in different windows. To use the taglist plugin with the winmanager ++plugin, set 'TagList' in the 'winManagerWindowLayout' variable. For example, ++to use the file explorer plugin and the taglist plugin at the same time, use ++the following setting: > ++ ++ let winManagerWindowLayout = 'FileExplorer|TagList' ++< ++Getting help~ ++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, ++the help information is removed from the taglist window. ++ ++ *taglist-debug* ++Debugging the taglist plugin~ ++You can use the ":TlistDebug" command to enable logging of the debug messages ++from the taglist plugin. To display the logged debug messages, you can use the ++":TlistMessages" command. To disable the logging of the debug messages, use ++the ":TlistUndebug" command. ++ ++You can specify a file name to the ":TlistDebug" command to log the debug ++messages to a file. Otherwise, the debug messages are stored in a script-local ++variable. In the later case, to minimize memory usage, only the last 3000 ++characters from the debug messages are stored. ++ ++============================================================================== ++ *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 ++can change the behavior of the taglist plugin. You need to change these ++settings only if you want to change the behavior of the taglist plugin. You ++should use the |:let| command in your .vimrc file to change the setting of any ++of these variables. ++ ++The configurable taglist variables are listed below. For a detailed ++description of these variables refer to the text below this table. ++ ++|'Tlist_Auto_Highlight_Tag'| Automatically highlight the current tag in the ++ taglist. ++|'Tlist_Auto_Open'| Open the taglist window when Vim starts. ++|'Tlist_Auto_Update'| Automatically update the taglist to include ++ newly edited files. ++|'Tlist_Close_On_Select'| Close the taglist window when a file or tag is ++ selected. ++|'Tlist_Compact_Format'| Remove extra information and blank lines from ++ the taglist window. ++|'Tlist_Ctags_Cmd'| Specifies the path to the ctags utility. ++|'Tlist_Display_Prototype'| Show prototypes and not tags in the taglist ++ window. ++|'Tlist_Display_Tag_Scope'| Show tag scope next to the tag name. ++|'Tlist_Enable_Fold_Column'| Show the fold indicator column in the taglist ++ 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. ++|'Tlist_Inc_Winwidth'| Increase the Vim window width to accommodate ++ the taglist window. ++|'Tlist_Max_Submenu_Items'| Maximum number of items in a tags sub-menu. ++|'Tlist_Max_Tag_Length'| Maximum tag length used in a tag menu entry. ++|'Tlist_Process_File_Always'| Process files even when the taglist window is ++ closed. ++|'Tlist_Show_Menu'| Display the tags menu. ++|'Tlist_Show_One_File'| Show tags for the current buffer only. ++|'Tlist_Sort_Type'| Sort method used for arranging the tags. ++|'Tlist_Use_Horiz_Window'| Use a horizontally split window for the ++ taglist window. ++|'Tlist_Use_Right_Window'| Place the taglist window on the right side. ++|'Tlist_Use_SingleClick'| Single click on a tag jumps to it. ++|'Tlist_WinHeight'| Horizontally split taglist window height. ++|'Tlist_WinWidth'| Vertically split taglist window width. ++ ++ *'Tlist_Auto_Highlight_Tag'* ++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 ++tag highlighting is disabled, the tags for a new file will still be added to ++the taglist window. ++> ++ let Tlist_Auto_Highlight_Tag = 0 ++< ++With the above variable set to 1, you can use the ":TlistHighlightTag" command ++to highlight the current tag. ++ ++ *'Tlist_Auto_Open'* ++Tlist_Auto_Open~ ++To automatically open the taglist window, when you start Vim, you can set the ++'Tlist_Auto_Open' variable to 1. By default, this variable is set to zero and ++the taglist window will not be opened automatically on Vim startup. ++> ++ let Tlist_Auto_Open = 1 ++< ++The taglist window is opened only when a supported type of file is opened on ++Vim startup. For example, if you open text files, then the taglist window will ++not be opened. ++ ++ *'Tlist_Auto_Update'* ++Tlist_Auto_Update~ ++When a new file is edited, the tags defined in the file are automatically ++processed and added to the taglist. To stop adding new files to the taglist, ++set the 'Tlist_Auto_Update' variable to zero. By default, this variable is set ++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 ++is not closed. ++> ++ let Tlist_Close_On_Select = 1 ++< ++ *'Tlist_Compact_Format'* ++Tlist_Compact_Format~ ++By default, empty lines are used to separate different tag types displayed for ++a file and the tags displayed for different files in the taglist window. If ++you want to display as many tags as possible in the taglist window, you can ++set the 'Tlist_Compact_Format' variable to 1 to get a compact display. ++> ++ let Tlist_Compact_Format = 1 ++< ++ *'Tlist_Ctags_Cmd'* ++Tlist_Ctags_Cmd~ ++The 'Tlist_Ctags_Cmd' variable specifies the location (path) of the exuberant ++ctags utility. If exuberant ctags is present in any one of the directories in ++the PATH environment variable, then there is no need to set this variable. ++ ++The exuberant ctags tool can be installed under different names. When the ++taglist plugin starts up, if the 'Tlist_Ctags_Cmd' variable is not set, it ++checks for the names exuberant-ctags, exctags, ctags, ctags.exe and tags in ++the PATH environment variable. If any one of the named executable is found, ++then the Tlist_Ctags_Cmd variable is set to that name. ++ ++If exuberant ctags is not present in one of the directories specified in the ++PATH environment variable, then set this variable to point to the location of ++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. Examples: ++> ++ let Tlist_Ctags_Cmd = 'd:\tools\ctags.exe' ++ let Tlist_Ctags_Cmd = '/usr/local/bin/ctags' ++< ++ *'Tlist_Display_Prototype'* ++Tlist_Display_Prototype~ ++By default, only the tag name will be displayed in the taglist window. If you ++like to see tag prototypes instead of names, set the 'Tlist_Display_Prototype' ++variable to 1. By default, this variable is set to zero and only tag names ++will be displayed. ++> ++ let Tlist_Display_Prototype = 1 ++< ++ *'Tlist_Display_Tag_Scope'* ++Tlist_Display_Tag_Scope~ ++By default, the scope of a tag (like a C++ class) will be displayed in ++square brackets next to the tag name. If you don't want the tag scopes ++to be displayed, then set the 'Tlist_Display_Tag_Scope' to zero. By default, ++this variable is set to 1 and the tag scopes will be displayed. ++> ++ let Tlist_Display_Tag_Scope = 0 ++< ++ *'Tlist_Enable_Fold_Column'* ++Tlist_Enable_Fold_Column~ ++By default, the Vim fold column is enabled and displayed in the taglist ++window. If you wish to disable this (for example, when you are working with a ++narrow Vim window or terminal), you can set the 'Tlist_Enable_Fold_Column' ++variable to zero. ++> ++ let Tlist_Enable_Fold_Column = 1 ++< ++ *'Tlist_Exit_OnlyWindow'* ++Tlist_Exit_OnlyWindow~ ++If you want to exit Vim if only the taglist window is currently opened, then ++set the 'Tlist_Exit_OnlyWindow' variable to 1. By default, this variable is ++set to zero and the Vim instance will not be closed if only the taglist window ++is present. ++> ++ let Tlist_Exit_OnlyWindow = 1 ++< ++ *'Tlist_File_Fold_Auto_Close'* ++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 ++other buffers is closed. ++> ++ 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~ ++When you enter a Vim buffer/window, the current tag in that buffer/window is ++automatically highlighted in the taglist window. If the current tag name is ++not visible in the taglist window, then the taglist window contents are ++scrolled to make that tag name visible. If you like to disable the automatic ++highlighting of the current tag when entering a buffer, you can set the ++'Tlist_Highlight_Tag_On_BufEnter' variable to zero. The default setting for ++this variable is 1. ++> ++ let Tlist_Highlight_Tag_On_BufEnter = 0 ++< ++ *'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 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 ++the screen due to the change in the window width or if you prefer not to ++adjust the window width then set the 'Tlist_Inc_Winwidth' variable to zero. ++CAUTION: If you are using the MS-Windows version of Vim in a MS-DOS command ++window then you must set this variable to zero, otherwise the system may hang ++due to a Vim limitation (explained in :help win32-problems) ++> ++ let Tlist_Inc_Winwidth = 0 ++< ++ *'Tlist_Max_Submenu_Items'* ++Tlist_Max_Submenu_Items~ ++If a file contains too many tags of a particular type (function, variable, ++class, etc.), greater than that specified by the 'Tlist_Max_Submenu_Items' ++variable, then the menu for that tag type will be split into multiple ++sub-menus. The default setting for the 'Tlist_Max_Submenu_Items' variable is ++25. This can be changed by setting the 'Tlist_Max_Submenu_Items' variable: ++> ++ let Tlist_Max_Submenu_Items = 20 ++< ++The name of the submenu is formed using the names of the first and the last ++tag entries in that submenu. ++ ++ *'Tlist_Max_Tag_Length'* ++Tlist_Max_Tag_Length~ ++Only the first 'Tlist_Max_Tag_Length' characters from the tag names will be ++used to form the tag type submenu name. The default value for this variable is ++10. Change the 'Tlist_Max_Tag_Length' setting if you want to include more or ++less characters: ++> ++ let Tlist_Max_Tag_Length = 10 ++< ++ *'Tlist_Process_File_Always'* ++Tlist_Process_File_Always~ ++By default, the taglist plugin will generate and process the tags defined in ++the newly opened files only when the taglist window is opened or when the ++taglist menu is enabled. When the taglist window is closed, the taglist plugin ++will stop processing the tags for newly opened files. ++ ++You can set the 'Tlist_Process_File_Always' variable to 1 to generate the list ++of tags for new files even when the taglist window is closed and the taglist ++menu is disabled. ++> ++ let Tlist_Process_File_Always = 1 ++< ++To use the ":TlistShowTag" and the ":TlistShowPrototype" commands without the ++taglist window and the taglist menu, you should set this variable to 1. ++ ++ *'Tlist_Show_Menu'* ++Tlist_Show_Menu~ ++When using GUI Vim, you can display the tags defined in the current file in a ++menu named "Tags". By default, this feature is turned off. To turn on this ++feature, set the 'Tlist_Show_Menu' variable to 1: ++> ++ let Tlist_Show_Menu = 1 ++< ++ *'Tlist_Show_One_File'* ++Tlist_Show_One_File~ ++By default, the taglist plugin will display the tags defined in all the loaded ++buffers in the taglist window. If you prefer to display the tags defined only ++in the current buffer, then you can set the 'Tlist_Show_One_File' to 1. When ++this variable is set to 1, as you switch between buffers, the taglist window ++will be refreshed to display the tags for the current buffer and the tags for ++the previous buffer will be removed. ++> ++ let Tlist_Show_One_File = 1 ++< ++ *'Tlist_Sort_Type'* ++Tlist_Sort_Type~ ++The 'Tlist_Sort_Type' variable specifies the sort order for the tags in the ++taglist window. The tags can be sorted either alphabetically by their name or ++by the order of their appearance in the file (chronological order). By ++default, the tag names will be listed by the order in which they are defined ++in the file. You can change the sort type (from name to order or from order to ++name) by pressing the "s" key in the taglist window. You can also change the ++default sort order by setting 'Tlist_Sort_Type' to "name" or "order": ++> ++ let Tlist_Sort_Type = "name" ++< ++ *'Tlist_Use_Horiz_Window'* ++Tlist_Use_Horiz_Window~ ++Be default, the tag names are displayed in a vertically split window. If you ++prefer a horizontally split window, then set the 'Tlist_Use_Horiz_Window' ++variable to 1. If you are running MS-Windows version of Vim in a MS-DOS ++command window, then you should use a horizontally split window instead of a ++vertically split window. Also, if you are using an older version of xterm in a ++Unix system that doesn't support changing the xterm window width, you should ++use a horizontally split window. ++> ++ let Tlist_Use_Horiz_Window = 1 ++< ++ *'Tlist_Use_Right_Window'* ++Tlist_Use_Right_Window~ ++By default, the vertically split taglist window will appear on the left hand ++side. If you prefer to open the window on the right hand side, you can set the ++'Tlist_Use_Right_Window' variable to 1: ++> ++ let Tlist_Use_Right_Window = 1 ++< ++ *'Tlist_Use_SingleClick'* ++Tlist_Use_SingleClick~ ++By default, when you double click on the tag name using the left mouse ++button, the cursor will be positioned at the definition of the tag. You ++can set the 'Tlist_Use_SingleClick' variable to 1 to jump to a tag when ++you single click on the tag name using the mouse. By default this variable ++is set to zero. ++> ++ let Tlist_Use_SingleClick = 1 ++< ++Due to a bug in Vim, if you set 'Tlist_Use_SingleClick' to 1 and try to resize ++the taglist window using the mouse, then Vim will crash. This problem is fixed ++in Vim 6.3 and above. In the meantime, instead of resizing the taglist window ++using the mouse, you can use normal Vim window resizing commands to resize the ++taglist window. ++ ++ *'Tlist_WinHeight'* ++Tlist_WinHeight~ ++The default height of the horizontally split taglist window is 10. This can be ++changed by modifying the 'Tlist_WinHeight' variable: ++> ++ let Tlist_WinHeight = 20 ++< ++The |'winfixheight'| option is set for the taglist window, to maintain the ++height of the taglist window, when new Vim windows are opened and existing ++windows are closed. ++ ++ *'Tlist_WinWidth'* ++Tlist_WinWidth~ ++The default width of the vertically split taglist window is 30. This can be ++changed by modifying the 'Tlist_WinWidth' variable: ++> ++ let Tlist_WinWidth = 20 ++< ++Note that the value of the |'winwidth'| option setting determines the minimum ++width of the current window. If you set the 'Tlist_WinWidth' variable to a ++value less than that of the |'winwidth'| option setting, then Vim will use the ++value of the |'winwidth'| option. ++ ++When new Vim windows are opened and existing windows are closed, the taglist ++plugin will try to maintain the width of the taglist window to the size ++specified by the 'Tlist_WinWidth' variable. ++ ++============================================================================== ++ *taglist-commands* ++7. Commands~ ++ ++The taglist plugin provides the following ex-mode commands: ++ ++|:TlistAddFiles| Add multiple files to the taglist. ++|:TlistAddFilesRecursive| ++ Add files recursively to the taglist. ++|:TlistClose| Close the taglist window. ++|:TlistDebug| Start logging of taglist debug messages. ++|:TlistLock| Stop adding new files to the taglist. ++|:TlistMessages| Display the logged taglist plugin debug messages. ++|:TlistOpen| Open and jump to the taglist window. ++|:TlistSessionSave| Save the information about files and tags in the ++ taglist to a session file. ++|:TlistSessionLoad| Load the information about files and tags stored ++ in a session file to taglist. ++|:TlistShowPrototype| Display the prototype of the tag at or before the ++ specified line number. ++|:TlistShowTag| Display the name of the tag defined at or before the ++ specified line number. ++|:TlistHighlightTag| Highlight the current tag in the taglist window. ++|:TlistToggle| Open or close (toggle) the taglist window. ++|:TlistUndebug| Stop logging of taglist debug messages. ++|:TlistUnlock| Start adding new files to the taglist. ++|:TlistUpdate| Update the tags for the current buffer. ++ ++ *:TlistAddFiles* ++:TlistAddFiles {file(s)} [file(s) ...] ++ Add one or more specified files to the taglist. You can ++ specify multiple filenames using wildcards. To specify a ++ file name with space character, you should escape the space ++ character with a backslash. ++ Examples: ++> ++ :TlistAddFiles *.c *.cpp ++ :TlistAddFiles file1.html file2.html ++< ++ If you specify a large number of files, then it will take some ++ time for the taglist plugin to process all of them. The ++ specified files will not be edited in a Vim window and will ++ not be added to the Vim buffer list. ++ ++ *:TlistAddFilesRecursive* ++:TlistAddFilesRecursive {directory} [ {pattern} ] ++ Add files matching {pattern} recursively from the specified ++ {directory} to the taglist. If {pattern} is not specified, ++ then '*' is assumed. To specify the current directory, use "." ++ for {directory}. To specify a directory name with space ++ character, you should escape the space character with a ++ backslash. ++ Examples: ++> ++ :TlistAddFilesRecursive myproject *.java ++ :TlistAddFilesRecursive smallproject ++< ++ If large number of files are present in the specified ++ directory tree, then it will take some time for the taglist ++ plugin to process all of them. ++ ++ *:TlistClose* ++:TlistClose Close the taglist window. This command can be used from any ++ one of the Vim windows. ++ ++ *:TlistDebug* ++:TlistDebug [filename] ++ Start logging of debug messages from the taglist plugin. ++ If {filename} is specified, then the debug messages are stored ++ in the specified file. Otherwise, the debug messages are ++ stored in a script local variable. If the file {filename} is ++ already present, then it is overwritten. ++ ++ *:TlistLock* ++:TlistLock ++ Lock the taglist and don't process new files. After this ++ command is executed, newly edited files will not be added to ++ the taglist. ++ ++ *:TlistMessages* ++:TlistMessages ++ Display the logged debug messages from the taglist plugin ++ in a window. This command works only when logging to a ++ script-local variable. ++ ++ *:TlistOpen* ++:TlistOpen Open and jump to the taglist window. Creates the taglist ++ window, if the window is not opened currently. After executing ++ this command, the cursor is moved to the taglist window. When ++ the taglist window is opened for the first time, all the files ++ in the buffer list are processed and the tags defined in them ++ are displayed in the taglist window. ++ ++ *:TlistSessionSave* ++:TlistSessionSave {filename} ++ Saves the information about files and tags in the taglist to ++ the specified file. This command can be used to save and ++ restore the taglist contents across Vim sessions. ++ ++ *:TlistSessionLoad* ++:TlistSessionLoad {filename} ++ Load the information about files and tags stored in the ++ specified session file to the taglist. ++ ++ *:TlistShowPrototype* ++:TlistShowPrototype [filename] [linenumber] ++ Display the prototype of the tag at or before the specified ++ line number. If the file name and the line number are not ++ specified, then the current file name and line number are ++ used. A tag spans multiple lines starting from the line where ++ it is defined to the line before the next tag. This command ++ displays the prototype for the tag for any line number in this ++ range. ++ ++ *:TlistShowTag* ++:TlistShowTag [filename] [linenumber] ++ Display the name of the tag defined at or before the specified ++ line number. If the file name and the line number are not ++ specified, then the current file name and line number are ++ used. A tag spans multiple lines starting from the line where ++ it is defined to the line before the next tag. This command ++ displays the tag name for any line number in this range. ++ ++ *:TlistHighlightTag* ++:TlistHighlightTag ++ Highlight the current tag in the taglist window. By default, ++ the taglist plugin periodically updates the taglist window to ++ highlight the current tag. This command can be used to force ++ the taglist plugin to highlight the current tag. ++ ++ *:TlistToggle* ++:TlistToggle Open or close (toggle) the taglist window. Opens the taglist ++ window, if the window is not opened currently. Closes the ++ taglist window, if the taglist window is already opened. When ++ the taglist window is opened for the first time, all the files ++ in the buffer list are processed and the tags are displayed in ++ the taglist window. After executing this command, the cursor ++ is not moved from the current window to the taglist window. ++ ++ *:TlistUndebug* ++:TlistUndebug ++ Stop logging of debug messages from the taglist plugin. ++ ++ *:TlistUnlock* ++:TlistUnlock ++ Unlock the taglist and start processing newly edited files. ++ ++ *:TlistUpdate* ++:TlistUpdate Update the tags information for the current buffer. This ++ command can be used to re-process the current file/buffer and ++ get the tags information. As the taglist plugin uses the file ++ saved in the disk (instead of the file displayed in a Vim ++ buffer), you should save a modified buffer before you update ++ the taglist. Otherwise the listed tags will not include the ++ new tags created in the buffer. You can use this command even ++ when the taglist window is not opened. ++ ++============================================================================== ++ *taglist-functions* ++8. Global functions~ ++ ++The taglist plugin provides several global functions that can be used from ++other Vim plugins to interact with the taglist plugin. These functions are ++described below. ++ ++|Tlist_Update_File_Tags()| Update the tags for the specified file ++|Tlist_Get_Tag_Prototype_By_Line()| Return the prototype of the tag at or ++ before the specified line number in the ++ specified file. ++|Tlist_Get_Tagname_By_Line()| Return the name of the tag at or ++ before the specified line number in ++ the specified file. ++|Tlist_Set_App()| Set the name of the application ++ controlling the taglist window. ++ ++ *Tlist_Update_File_Tags()* ++Tlist_Update_File_Tags({filename}, {filetype}) ++ Update the tags for the file {filename}. The second argument ++ specifies the Vim filetype for the file. If the taglist plugin ++ has not processed the file previously, then the exuberant ++ ctags tool is invoked to generate the tags for the file. ++ ++ *Tlist_Get_Tag_Prototype_By_Line()* ++Tlist_Get_Tag_Prototype_By_Line([{filename}, {linenumber}]) ++ Return the prototype of the tag at or before the specified ++ line number in the specified file. If the filename and line ++ number are not specified, then the current buffer name and the ++ current line number are used. ++ ++ *Tlist_Get_Tagname_By_Line()* ++Tlist_Get_Tagname_By_Line([{filename}, {linenumber}]) ++ Return the name of the tag at or before the specified line ++ number in the specified file. If the filename and line number ++ are not specified, then the current buffer name and the ++ current line number are used. ++ ++ *Tlist_Set_App()* ++Tlist_Set_App({appname}) ++ Set the name of the plugin that controls the taglist plugin ++ window and buffer. This can be used to integrate the taglist ++ plugin with other Vim plugins. ++ ++ For example, the winmanager plugin and the Cream package use ++ this function and specify the appname as "winmanager" and ++ "cream" respectively. ++ ++ By default, the taglist plugin is a stand-alone plugin and ++ controls the taglist window and buffer. If the taglist window ++ is controlled by an external plugin, then the appname should ++ be set appropriately. ++ ++============================================================================== ++ *taglist-extend* ++9. Extending~ ++ ++The taglist plugin supports all the languages supported by the exuberant ctags ++tool, which includes the following languages: Assembly, ASP, Awk, Beta, C, ++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 extend the taglist plugin to add support for new languages and also ++modify the support for the above listed languages. ++ ++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 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 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 ++ ++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 ++ ++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 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. 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: ++ ++ 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 ++used for the class tags and 'function' is the title used for the function tags ++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. 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. ++ ++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): ++ ++ 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', ++'command' and 'label' will be used in the taglist window for the tags which ++are generated for the flags b, c and l respectively. ++ ++============================================================================== ++ *taglist-faq* ++10. Frequently Asked Questions~ ++ ++Q. The taglist plugin doesn't work. The taglist window is empty and the tags ++ defined in a file are not displayed. ++A. Are you using Vim version 6.0 and above? The taglist plugin relies on the ++ features supported by Vim version 6.0 and above. You can use the following ++ command to get the Vim version: ++> ++ $ vim --version ++< ++ Are you using exuberant ctags version 5.0 and above? The taglist plugin ++ relies on the features supported by exuberant ctags and will not work with ++ GNU ctags or the Unix ctags utility. You can use the following command to ++ determine whether the ctags installed in your system is exuberant ctags: ++> ++ $ 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: ++> ++ :filetype ++< ++ The output of the above command should contain "filetype detection:ON". ++ To turn on the filetype detection, add the following line to the .vimrc or ++ _vimrc file: ++> ++ filetype on ++< ++ Is your version of Vim compiled with the support for the system() function? ++ The following Vim command should display 1: ++> ++ :echo exists('*system') ++< ++ In some Linux distributions (particularly Suse Linux), the default Vim ++ installation is built without the support for the system() function. The ++ taglist plugin uses the system() function to invoke the exuberant ctags ++ utility. You need to rebuild Vim after enabling the support for the ++ system() function. If you use the default build options, the system() ++ function will be supported. ++ ++ Do you have the |'shellslash'| option set? You can try disabling the ++ |'shellslash'| option. When the taglist plugin invokes the exuberant ctags ++ utility with the path to the file, if the incorrect slashes are used, then ++ you will see errors. ++ ++ Check the shell related Vim options values using the following command: ++> ++ :set shell? shellcmdflag? shellpipe? ++ :set shellquote? shellredir? shellxquote? ++< ++ If these options are set in your .vimrc or _vimrc file, try removing those ++ lines. ++ ++ Are you using a Unix shell in a MS-Windows environment? For example, ++ the Unix shell from the MKS-toolkit. Do you have the SHELL environment ++ set to point to this shell? You can try resetting the SHELL environment ++ variable. ++ ++ If you are using a Unix shell on MS-Windows, you should try to use ++ exuberant ctags that is compiled for Unix-like environments so that ++ exuberant ctags will understand path names with forward slash characters. ++ ++ Is your filetype supported by the exuberant ctags utility? The file types ++ supported by the exuberant ctags utility are listed in the ctags help. If a ++ file type is not supported, you have to extend exuberant ctags. You can use ++ the following command to list the filetypes supported by exuberant ctags: ++> ++ ctags --list-languages ++< ++ Run the following command from the shell prompt and check whether the tags ++ defined in your file are listed in the output from exuberant ctags: ++> ++ ctags -f - --format=2 --excmd=pattern --fields=nks ++< ++ If you see your tags in the output from the above command, then the ++ exuberant ctags utility is properly parsing your file. ++ ++ Do you have the .ctags or _ctags or the ctags.cnf file in your home ++ directory for specifying default options or for extending exuberant ctags? ++ If you do have this file, check the options in this file and make sure ++ these options are not interfering with the operation of the taglist plugin. ++ ++ If you are using MS-Windows, check the value of the TEMP and TMP ++ environment variables. If these environment variables are set to a path ++ with space characters in the name, then try using the DOS 8.3 short name ++ for the path or set them to a path without the space characters in the ++ name. For example, if the temporary directory name is "C:\Documents and ++ Settings\xyz\Local Settings\Temp", then try setting the TEMP variable to ++ the following: ++> ++ set TEMP=C:\DOCUMEN~1\xyz\LOCALS~1\Temp ++< ++ If exuberant ctags is installed in a directory with space characters in the ++ name, then try adding the directory to the PATH environment variable or try ++ setting the 'Tlist_Ctags_Cmd' variable to the shortest path name to ctags ++ or try copying the exuberant ctags to a path without space characters in ++ the name. For example, if exuberant ctags is installed in the directory ++ "C:\Program Files\Ctags", then try setting the 'Tlist_Ctags_Cmd' variable ++ as below: ++> ++ let Tlist_Ctags_Cmd='C:\Progra~1\Ctags\ctags.exe' ++< ++Q. When I try to open the taglist window, I am seeing the following error ++ message. How do I fix this problem? ++ ++ Taglist: Failed to generate tags for /my/path/to/file ++ ctags: illegal option -- -^@usage: ctags [-BFadtuwvx] [-f tagsfile] file ... ++ ++A. The taglist plugin will work only with the exuberant ctags tool. You ++ cannot use the GNU ctags or the Unix ctags program with the taglist plugin. ++ You will see an error message similar to the one shown above, if you try ++ use a non-exuberant ctags program with Vim. To fix this problem, either add ++ the exuberant ctags tool location to the PATH environment variable or set ++ the 'Tlist_Ctags_Cmd' variable. ++ ++Q. A file has more than one tag with the same name. When I select a tag name ++ from the taglist window, the cursor is positioned at the incorrect tag ++ location. ++A. The taglist plugin uses the search pattern generated by the exuberant ctags ++ utility to position the cursor at the location of a tag definition. If a ++ file has more than one tag with the same name and same prototype, then the ++ search pattern will be the same. In this case, when searching for the tag ++ pattern, the cursor may be positioned at the incorrect location. ++ ++Q. I have made some modifications to my file and introduced new ++ functions/classes/variables. I have not yet saved my file. The taglist ++ plugin is not displaying the new tags when I update the taglist window. ++A. The exuberant ctags utility will process only files that are present in the ++ disk. To list the tags defined in a file, you have to save the file and ++ then update the taglist window. ++ ++Q. I have created a ctags file using the exuberant ctags utility for my source ++ tree. How do I configure the taglist plugin to use this tags file? ++A. The taglist plugin doesn't use a tags file stored in disk. For every opened ++ file, the taglist plugin invokes the exuberant ctags utility to get the ++ list of tags dynamically. The Vim system() function is used to invoke ++ exuberant ctags and get the ctags output. This function internally uses a ++ temporary file to store the output. This file is deleted after the output ++ from the command is read. So you will never see the file that contains the ++ output of exuberant ctags. ++ ++Q. When I set the |'updatetime'| option to a low value (less than 1000) and if ++ I keep pressing a key with the taglist window open, the current buffer ++ contents are changed. Why is this? ++A. The taglist plugin uses the |CursorHold| autocmd to highlight the current ++ tag. The CursorHold autocmd triggers for every |'updatetime'| milliseconds. ++ If the |'updatetime'| option is set to a low value, then the CursorHold ++ autocmd will be triggered frequently. As the taglist plugin changes ++ the focus to the taglist window to highlight the current tag, this could ++ interfere with the key movement resulting in changing the contents of ++ 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* ++12. Todo~ ++ ++1. Group tags according to the scope and display them. For example, ++ group all the tags belonging to a C++/Java class ++2. Support for displaying tags in a modified (not-yet-saved) file. ++3. Automatically open the taglist window only for selected filetypes. ++ For other filetypes, close the taglist window. ++4. When using the shell from the MKS toolkit, the taglist plugin ++ doesn't work. ++5. The taglist plugin doesn't work with files edited remotely using the ++ netrw plugin. The exuberant ctags utility cannot process files over ++ scp/rcp/ftp, etc. ++ ++============================================================================== ++ ++vim:tw=78:ts=8:noet:ft=help: +diff -urN vim71/1/ftdetect/ada.vim vim71_ada/1/ftdetect/ada.vim +--- vim71/1/ftdetect/ada.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftdetect/ada.vim 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,39 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada detection file ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftdetect/ada.vim $ ++" History: 24.05.2006 MK Unified Headers ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested to save on spaces ++" Help Page: ft-ada-plugin ++"------------------------------------------------------------------------------ ++ ++if exists("s:loaded_ftdetect_ada") ++ finish ++endif ++ ++let s:loaded_ftdetect_ada=45 ++ ++if has("vms") ++ autocmd BufNewFile,BufRead *.gpr,*.ada_m,*.adc setfiletype ada ++else ++ autocmd BufNewFile,BufRead *.gpr setfiletype ada ++endif ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/ftdetect/.svn/all-wcprops vim71_ada/1/ftdetect/.svn/all-wcprops +--- vim71/1/ftdetect/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftdetect/.svn/all-wcprops 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,11 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 53 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/ftdetect ++END ++ada.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 61 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/ftdetect/ada.vim ++END +diff -urN vim71/1/ftdetect/.svn/dir-prop-base vim71_ada/1/ftdetect/.svn/dir-prop-base +--- vim71/1/ftdetect/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftdetect/.svn/dir-prop-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,12 @@ ++K 10 ++svn:ignore ++V 52 ++*.Backup ++*.tgz ++*.tar.bz2 ++*.rpm ++*.swp ++*.log ++.backups ++ ++END +diff -urN vim71/1/ftdetect/.svn/entries vim71_ada/1/ftdetect/.svn/entries +--- vim71/1/ftdetect/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftdetect/.svn/entries 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,41 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftdetect ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ ++ada.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:02.000000Z ++3cc0764c406db398377e8d9214445c63 ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ +diff -urN vim71/1/ftdetect/.svn/format vim71_ada/1/ftdetect/.svn/format +--- vim71/1/ftdetect/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftdetect/.svn/format 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/ftdetect/.svn/prop-base/ada.vim.svn-base vim71_ada/1/ftdetect/.svn/prop-base/ada.vim.svn-base +--- vim71/1/ftdetect/.svn/prop-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftdetect/.svn/prop-base/ada.vim.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/ftdetect/.svn/text-base/ada.vim.svn-base vim71_ada/1/ftdetect/.svn/text-base/ada.vim.svn-base +--- vim71/1/ftdetect/.svn/text-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftdetect/.svn/text-base/ada.vim.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,39 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada detection file ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL$ ++" History: 24.05.2006 MK Unified Headers ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested to save on spaces ++" Help Page: ft-ada-plugin ++"------------------------------------------------------------------------------ ++ ++if exists("s:loaded_ftdetect_ada") ++ finish ++endif ++ ++let s:loaded_ftdetect_ada=45 ++ ++if has("vms") ++ autocmd BufNewFile,BufRead *.gpr,*.ada_m,*.adc setfiletype ada ++else ++ autocmd BufNewFile,BufRead *.gpr setfiletype ada ++endif ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/ftplugin/ada.vim vim71_ada/1/ftplugin/ada.vim +--- vim71/1/ftplugin/ada.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftplugin/ada.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,201 @@ ++"------------------------------------------------------------------------------ ++" Description: Perform Ada specific completion & tagging. ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Maintainer: Martin Krischik ++" Taylor Venable ++" Neil Bird ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ ++" History: 24.05.2006 MK Unified Headers ++" 26.05.2006 MK ' should not be in iskeyword. ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 02.10.2006 MK Better folding. ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested not to use include protection for ++" autoload ++" 05.11.2006 MK Bram suggested to save on spaces ++" 08.07.2007 TV fix default compiler problems. ++" Help Page: ft-ada-plugin ++"------------------------------------------------------------------------------ ++" Provides mapping overrides for tag jumping that figure out the current ++" Ada object and tag jump to that, not the 'simple' vim word. ++" Similarly allows matching of full-length ada entities from tags. ++"------------------------------------------------------------------------------ ++ ++" Only do this when not done yet for this buffer ++if exists ("b:did_ftplugin") || version < 700 ++ finish ++endif ++ ++" Don't load another plugin for this buffer ++let b:did_ftplugin = 45 ++ ++" ++" Temporarily set cpoptions to ensure the script loads OK ++" ++let s:cpoptions = &cpoptions ++set cpoptions-=C ++ ++" Section: Comments {{{1 ++" ++setlocal comments=O:--,:--\ \ ++setlocal commentstring=--\ \ %s ++setlocal complete=.,w,b,u,t,i ++ ++" Section: Tagging {{{1 ++" ++if exists ("g:ada_extended_tagging") ++ " Make local tag mappings for this buffer (if not already set) ++ if g:ada_extended_tagging == 'jump' ++ if mapcheck('','n') == '' ++ nnoremap :call ada#Jump_Tag ('', 'tjump') ++ endif ++ if mapcheck('g','n') == '' ++ nnoremap g :call ada#Jump_Tag ('','stjump') ++ endif ++ elseif g:ada_extended_tagging == 'list' ++ if mapcheck('','n') == '' ++ nnoremap :call ada#List_Tag () ++ endif ++ if mapcheck('g','n') == '' ++ nnoremap g :call ada#List_Tag () ++ endif ++ endif ++endif ++ ++" Section: Completion {{{1 ++" ++setlocal completefunc=ada#User_Complete ++setlocal omnifunc=adacomplete#Complete ++ ++if exists ("g:ada_extended_completion") ++ if mapcheck ('','i') == '' ++ inoremap =ada#Completion("\C-N>") ++ endif ++ if mapcheck ('','i') == '' ++ inoremap =ada#Completion("\C-P>") ++ endif ++ if mapcheck ('','i') == '' ++ inoremap =ada#Completion("\C-X>\C-]>") ++ endif ++ if mapcheck ('','i') == '' ++ inoremap =ada#Insert_Backspace () ++ endif ++endif ++ ++" Section: Matchit {{{1 ++" ++" Only do this when not done yet for this buffer & matchit is used ++" ++if !exists ("b:match_words") && ++ \ exists ("loaded_matchit") ++ " ++ " The following lines enable the macros/matchit.vim plugin for ++ " Ada-specific extended matching with the % key. ++ " ++ let s:notend = '\%(\:\:\:\\s\+\,' . ++ \ s:notend . '\:\:\\s\+\,' . ++ \ '\%(\.*\|\.*\|'.s:notend.'\)\:\\s\+\,' . ++ \ '\%(\\|\\):\:\\s*\%($\|[;A-Z]\),' . ++ \ s:notend . '\:\\s\+\' ++endif ++ ++ ++" Section: Compiler {{{1 ++" ++if ! exists("g:ada_default_compiler") ++ if has("vms") ++ let g:ada_default_compiler = 'decada' ++ else ++ let g:ada_default_compiler = 'gnat' ++ endif ++endif ++ ++if ! exists("current_compiler") || ++ \ current_compiler != g:ada_default_compiler ++ execute "compiler " . g:ada_default_compiler ++endif ++ ++" Section: Folding {{{1 ++" ++if exists("g:ada_folding") ++ if g:ada_folding[0] == 'i' ++ setlocal foldmethod=indent ++ setlocal foldignore=-- ++ setlocal foldnestmax=5 ++ elseif g:ada_folding[0] == 'g' ++ setlocal foldmethod=expr ++ setlocal foldexpr=ada#Pretty_Print_Folding(v:lnum) ++ elseif g:ada_folding[0] == 's' ++ setlocal foldmethod=syntax ++ endif ++ setlocal tabstop=8 ++ setlocal softtabstop=3 ++ setlocal shiftwidth=3 ++endif ++ ++" Section: Abbrev {{{1 ++" ++if exists("g:ada_abbrev") ++ iabbrev ret return ++ iabbrev proc procedure ++ iabbrev pack package ++ iabbrev func function ++endif ++ ++" Section: Commands, Mapping, Menus {{{1 ++" ++call ada#Map_Popup ( ++ \ 'Tag.List', ++ \ 'l', ++ \ 'call ada#List_Tag ()') ++call ada#Map_Popup ( ++ \'Tag.Jump', ++ \'j', ++ \'call ada#Jump_Tag ()') ++call ada#Map_Menu ( ++ \'Tag.Create File', ++ \':AdaTagFile', ++ \'call ada#Create_Tags (''file'')') ++call ada#Map_Menu ( ++ \'Tag.Create Dir', ++ \':AdaTagDir', ++ \'call ada#Create_Tags (''dir'')') ++ ++call ada#Map_Menu ( ++ \'Highlight.Toggle Space Errors', ++ \ ':AdaSpaces', ++ \'call ada#Switch_Syntax_Option (''space_errors'')') ++call ada#Map_Menu ( ++ \'Highlight.Toggle Lines Errors', ++ \ ':AdaLines', ++ \'call ada#Switch_Syntax_Option (''line_errors'')') ++call ada#Map_Menu ( ++ \'Highlight.Toggle Rainbow Color', ++ \ ':AdaRainbow', ++ \'call ada#Switch_Syntax_Option (''rainbow_color'')') ++call ada#Map_Menu ( ++ \'Highlight.Toggle Standard Types', ++ \ ':AdaTypes', ++ \'call ada#Switch_Syntax_Option (''standard_types'')') ++ ++" 1}}} ++" Reset cpoptions ++let &cpoptions = s:cpoptions ++unlet s:cpoptions ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/ftplugin/.svn/all-wcprops vim71_ada/1/ftplugin/.svn/all-wcprops +--- vim71/1/ftplugin/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftplugin/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,11 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 53 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/ftplugin ++END ++ada.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 61 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/ftplugin/ada.vim ++END +diff -urN vim71/1/ftplugin/.svn/dir-prop-base vim71_ada/1/ftplugin/.svn/dir-prop-base +--- vim71/1/ftplugin/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftplugin/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,6 @@ ++K 10 ++svn:ignore ++V 9 ++.backups ++ ++END +diff -urN vim71/1/ftplugin/.svn/entries vim71_ada/1/ftplugin/.svn/entries +--- vim71/1/ftplugin/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftplugin/.svn/entries 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,41 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ ++ada.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++271552b843be34dd99efdb2e180aa4ec ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ +diff -urN vim71/1/ftplugin/.svn/format vim71_ada/1/ftplugin/.svn/format +--- vim71/1/ftplugin/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftplugin/.svn/format 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/ftplugin/.svn/prop-base/ada.vim.svn-base vim71_ada/1/ftplugin/.svn/prop-base/ada.vim.svn-base +--- vim71/1/ftplugin/.svn/prop-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftplugin/.svn/prop-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/ftplugin/.svn/text-base/ada.vim.svn-base vim71_ada/1/ftplugin/.svn/text-base/ada.vim.svn-base +--- vim71/1/ftplugin/.svn/text-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/ftplugin/.svn/text-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,201 @@ ++"------------------------------------------------------------------------------ ++" Description: Perform Ada specific completion & tagging. ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Maintainer: Martin Krischik ++" Taylor Venable ++" Neil Bird ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL$ ++" History: 24.05.2006 MK Unified Headers ++" 26.05.2006 MK ' should not be in iskeyword. ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 02.10.2006 MK Better folding. ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested not to use include protection for ++" autoload ++" 05.11.2006 MK Bram suggested to save on spaces ++" 08.07.2007 TV fix default compiler problems. ++" Help Page: ft-ada-plugin ++"------------------------------------------------------------------------------ ++" Provides mapping overrides for tag jumping that figure out the current ++" Ada object and tag jump to that, not the 'simple' vim word. ++" Similarly allows matching of full-length ada entities from tags. ++"------------------------------------------------------------------------------ ++ ++" Only do this when not done yet for this buffer ++if exists ("b:did_ftplugin") || version < 700 ++ finish ++endif ++ ++" Don't load another plugin for this buffer ++let b:did_ftplugin = 45 ++ ++" ++" Temporarily set cpoptions to ensure the script loads OK ++" ++let s:cpoptions = &cpoptions ++set cpoptions-=C ++ ++" Section: Comments {{{1 ++" ++setlocal comments=O:--,:--\ \ ++setlocal commentstring=--\ \ %s ++setlocal complete=.,w,b,u,t,i ++ ++" Section: Tagging {{{1 ++" ++if exists ("g:ada_extended_tagging") ++ " Make local tag mappings for this buffer (if not already set) ++ if g:ada_extended_tagging == 'jump' ++ if mapcheck('','n') == '' ++ nnoremap :call ada#Jump_Tag ('', 'tjump') ++ endif ++ if mapcheck('g','n') == '' ++ nnoremap g :call ada#Jump_Tag ('','stjump') ++ endif ++ elseif g:ada_extended_tagging == 'list' ++ if mapcheck('','n') == '' ++ nnoremap :call ada#List_Tag () ++ endif ++ if mapcheck('g','n') == '' ++ nnoremap g :call ada#List_Tag () ++ endif ++ endif ++endif ++ ++" Section: Completion {{{1 ++" ++setlocal completefunc=ada#User_Complete ++setlocal omnifunc=adacomplete#Complete ++ ++if exists ("g:ada_extended_completion") ++ if mapcheck ('','i') == '' ++ inoremap =ada#Completion("\C-N>") ++ endif ++ if mapcheck ('','i') == '' ++ inoremap =ada#Completion("\C-P>") ++ endif ++ if mapcheck ('','i') == '' ++ inoremap =ada#Completion("\C-X>\C-]>") ++ endif ++ if mapcheck ('','i') == '' ++ inoremap =ada#Insert_Backspace () ++ endif ++endif ++ ++" Section: Matchit {{{1 ++" ++" Only do this when not done yet for this buffer & matchit is used ++" ++if !exists ("b:match_words") && ++ \ exists ("loaded_matchit") ++ " ++ " The following lines enable the macros/matchit.vim plugin for ++ " Ada-specific extended matching with the % key. ++ " ++ let s:notend = '\%(\:\:\:\\s\+\,' . ++ \ s:notend . '\:\:\\s\+\,' . ++ \ '\%(\.*\|\.*\|'.s:notend.'\)\:\\s\+\,' . ++ \ '\%(\\|\\):\:\\s*\%($\|[;A-Z]\),' . ++ \ s:notend . '\:\\s\+\' ++endif ++ ++ ++" Section: Compiler {{{1 ++" ++if ! exists("g:ada_default_compiler") ++ if has("vms") ++ let g:ada_default_compiler = 'decada' ++ else ++ let g:ada_default_compiler = 'gnat' ++ endif ++endif ++ ++if ! exists("current_compiler") || ++ \ current_compiler != g:ada_default_compiler ++ execute "compiler " . g:ada_default_compiler ++endif ++ ++" Section: Folding {{{1 ++" ++if exists("g:ada_folding") ++ if g:ada_folding[0] == 'i' ++ setlocal foldmethod=indent ++ setlocal foldignore=-- ++ setlocal foldnestmax=5 ++ elseif g:ada_folding[0] == 'g' ++ setlocal foldmethod=expr ++ setlocal foldexpr=ada#Pretty_Print_Folding(v:lnum) ++ elseif g:ada_folding[0] == 's' ++ setlocal foldmethod=syntax ++ endif ++ setlocal tabstop=8 ++ setlocal softtabstop=3 ++ setlocal shiftwidth=3 ++endif ++ ++" Section: Abbrev {{{1 ++" ++if exists("g:ada_abbrev") ++ iabbrev ret return ++ iabbrev proc procedure ++ iabbrev pack package ++ iabbrev func function ++endif ++ ++" Section: Commands, Mapping, Menus {{{1 ++" ++call ada#Map_Popup ( ++ \ 'Tag.List', ++ \ 'l', ++ \ 'call ada#List_Tag ()') ++call ada#Map_Popup ( ++ \'Tag.Jump', ++ \'j', ++ \'call ada#Jump_Tag ()') ++call ada#Map_Menu ( ++ \'Tag.Create File', ++ \':AdaTagFile', ++ \'call ada#Create_Tags (''file'')') ++call ada#Map_Menu ( ++ \'Tag.Create Dir', ++ \':AdaTagDir', ++ \'call ada#Create_Tags (''dir'')') ++ ++call ada#Map_Menu ( ++ \'Highlight.Toggle Space Errors', ++ \ ':AdaSpaces', ++ \'call ada#Switch_Syntax_Option (''space_errors'')') ++call ada#Map_Menu ( ++ \'Highlight.Toggle Lines Errors', ++ \ ':AdaLines', ++ \'call ada#Switch_Syntax_Option (''line_errors'')') ++call ada#Map_Menu ( ++ \'Highlight.Toggle Rainbow Color', ++ \ ':AdaRainbow', ++ \'call ada#Switch_Syntax_Option (''rainbow_color'')') ++call ada#Map_Menu ( ++ \'Highlight.Toggle Standard Types', ++ \ ':AdaTypes', ++ \'call ada#Switch_Syntax_Option (''standard_types'')') ++ ++" 1}}} ++" Reset cpoptions ++let &cpoptions = s:cpoptions ++unlet s:cpoptions ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/indent/ada.vim vim71_ada/1/indent/ada.vim +--- vim71/1/indent/ada.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/indent/ada.vim 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,303 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada indent file ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" Neil Bird ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ ++" History: 24.05.2006 MK Unified Headers ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested to save on spaces ++" 19.09.2007 NO g: missing before ada#Comment ++" Help Page: ft-vim-indent ++"------------------------------------------------------------------------------ ++" ToDo: ++" Verify handling of multi-line exprs. and recovery upon the final ';'. ++" Correctly find comments given '"' and "" ==> " syntax. ++" Combine the two large block-indent functions into one? ++"------------------------------------------------------------------------------ ++ ++" Only load this indent file when no other was loaded. ++if exists("b:did_indent") || version < 700 ++ finish ++endif ++ ++let b:did_indent = 45 ++ ++setlocal indentexpr=GetAdaIndent() ++setlocal indentkeys-=0{,0} ++setlocal indentkeys+=0=~then,0=~end,0=~elsif,0=~when,0=~exception,0=~begin,0=~is,0=~record ++ ++" Only define the functions once. ++if exists("*GetAdaIndent") ++ finish ++endif ++ ++if exists("g:ada_with_gnat_project_files") ++ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\[^;]*$\|\(type\>.*\)\=\\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|project\>\|then\>\|when\>\|is\>\)' ++else ++ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\[^;]*$\|\(type\>.*\)\=\\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|then\>\|when\>\|is\>\)' ++endif ++ ++" Section: s:MainBlockIndent {{{1 ++" ++" Try to find indent of the block we're in ++" prev_indent = the previous line's indent ++" prev_lnum = previous line (to start looking on) ++" blockstart = expr. that indicates a possible start of this block ++" stop_at = if non-null, if a matching line is found, gives up! ++" No recursive previous block analysis: simply look for a valid line ++" with a lesser or equal indent than we currently (on prev_lnum) have. ++" This shouldn't work as well as it appears to with lines that are currently ++" nowhere near the correct indent (e.g., start of line)! ++" Seems to work OK as it 'starts' with the indent of the /previous/ line. ++function s:MainBlockIndent (prev_indent, prev_lnum, blockstart, stop_at) ++ let lnum = a:prev_lnum ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) ++ while lnum > 1 ++ if a:stop_at != '' && line =~ '^\s*' . a:stop_at && indent(lnum) < a:prev_indent ++ return a:prev_indent ++ elseif line =~ '^\s*' . a:blockstart ++ let ind = indent(lnum) ++ if ind < a:prev_indent ++ return ind ++ endif ++ endif ++ ++ let lnum = prevnonblank(lnum - 1) ++ " Get previous non-blank/non-comment-only line ++ while 1 ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) ++ if line !~ '^\s*$' && line !~ '^\s*#' ++ break ++ endif ++ let lnum = prevnonblank(lnum - 1) ++ if lnum <= 0 ++ return a:prev_indent ++ endif ++ endwhile ++ endwhile ++ " Fallback - just move back one ++ return a:prev_indent - &sw ++endfunction MainBlockIndent ++ ++" Section: s:EndBlockIndent {{{1 ++" ++" Try to find indent of the block we're in (and about to complete), ++" including handling of nested blocks. Works on the 'end' of a block. ++" prev_indent = the previous line's indent ++" prev_lnum = previous line (to start looking on) ++" blockstart = expr. that indicates a possible start of this block ++" blockend = expr. that indicates a possible end of this block ++function s:EndBlockIndent( prev_indent, prev_lnum, blockstart, blockend ) ++ let lnum = a:prev_lnum ++ let line = getline(lnum) ++ let ends = 0 ++ while lnum > 1 ++ if getline(lnum) =~ '^\s*' . a:blockstart ++ let ind = indent(lnum) ++ if ends <= 0 ++ if ind < a:prev_indent ++ return ind ++ endif ++ else ++ let ends = ends - 1 ++ endif ++ elseif getline(lnum) =~ '^\s*' . a:blockend ++ let ends = ends + 1 ++ endif ++ ++ let lnum = prevnonblank(lnum - 1) ++ " Get previous non-blank/non-comment-only line ++ while 1 ++ let line = getline(lnum) ++ let line = substitute( line, g:ada#Comment, '', '' ) ++ if line !~ '^\s*$' ++ break ++ endif ++ let lnum = prevnonblank(lnum - 1) ++ if lnum <= 0 ++ return a:prev_indent ++ endif ++ endwhile ++ endwhile ++ " Fallback - just move back one ++ return a:prev_indent - &sw ++endfunction EndBlockIndent ++ ++" Section: s:StatementIndent {{{1 ++" ++" Return indent of previous statement-start ++" (after we've indented due to multi-line statements). ++" This time, we start searching on the line *before* the one given (which is ++" the end of a statement - we want the previous beginning). ++function s:StatementIndent( current_indent, prev_lnum ) ++ let lnum = a:prev_lnum ++ while lnum > 0 ++ let prev_lnum = lnum ++ let lnum = prevnonblank(lnum - 1) ++ " Get previous non-blank/non-comment-only line ++ while 1 ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) ++ ++ if line !~ '^\s*$' && line !~ '^\s*#' ++ break ++ endif ++ let lnum = prevnonblank(lnum - 1) ++ if lnum <= 0 ++ return a:current_indent ++ endif ++ endwhile ++ " Leave indent alone if our ';' line is part of a ';'-delineated ++ " aggregate (e.g., procedure args.) or first line after a block start. ++ if line =~ s:AdaBlockStart || line =~ '(\s*$' ++ return a:current_indent ++ endif ++ if line !~ '[.=(]\s*$' ++ let ind = indent(prev_lnum) ++ if ind < a:current_indent ++ return ind ++ endif ++ endif ++ endwhile ++ " Fallback - just use current one ++ return a:current_indent ++endfunction StatementIndent ++ ++ ++" Section: GetAdaIndent {{{1 ++" ++" Find correct indent of a new line based upon what went before ++" ++function GetAdaIndent() ++ " Find a non-blank line above the current line. ++ let lnum = prevnonblank(v:lnum - 1) ++ let ind = indent(lnum) ++ let package_line = 0 ++ ++ " Get previous non-blank/non-comment-only/non-cpp line ++ while 1 ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) ++ if line !~ '^\s*$' && line !~ '^\s*#' ++ break ++ endif ++ let lnum = prevnonblank(lnum - 1) ++ if lnum <= 0 ++ return ind ++ endif ++ endwhile ++ ++ " Get default indent (from prev. line) ++ let ind = indent(lnum) ++ let initind = ind ++ ++ " Now check what's on the previous line ++ if line =~ s:AdaBlockStart || line =~ '(\s*$' ++ " Check for false matches to AdaBlockStart ++ let false_match = 0 ++ if line =~ '^\s*\(procedure\|function\|package\)\>.*\' ++ " Generic instantiation ++ let false_match = 1 ++ elseif line =~ ')\s*;\s*$' || line =~ '^\([^(]*([^)]*)\)*[^(]*;\s*$' ++ " forward declaration ++ let false_match = 1 ++ endif ++ " Move indent in ++ if ! false_match ++ let ind = ind + &sw ++ endif ++ elseif line =~ '^\s*\(case\|exception\)\>' ++ " Move indent in twice (next 'when' will move back) ++ let ind = ind + 2 * &sw ++ elseif line =~ '^\s*end\s*record\>' ++ " Move indent back to tallying 'type' preceeding the 'record'. ++ " Allow indent to be equal to 'end record's. ++ let ind = s:MainBlockIndent( ind+&sw, lnum, 'type\>', '' ) ++ elseif line =~ '\(^\s*new\>.*\)\@' ++ " Multiple line generic instantiation ('package blah is\nnew thingy') ++ let ind = s:StatementIndent( ind - &sw, lnum ) ++ elseif line =~ ';\s*$' ++ " Statement end (but not 'end' ) - try to find current statement-start indent ++ let ind = s:StatementIndent( ind, lnum ) ++ endif ++ ++ " Check for potential argument list on next line ++ let continuation = (line =~ '[A-Za-z0-9_]\s*$') ++ ++ ++ " Check current line; search for simplistic matching start-of-block ++ let line = getline(v:lnum) ++ if line =~ '^\s*#' ++ " Start of line for ada-pp ++ let ind = 0 ++ elseif continuation && line =~ '^\s*(' ++ " Don't do this if we've already indented due to the previous line ++ if ind == initind ++ let ind = ind + &sw ++ endif ++ elseif line =~ '^\s*\(begin\|is\)\>' ++ let ind = s:MainBlockIndent( ind, lnum, '\(procedure\|function\|declare\|package\|task\)\>', 'begin\>' ) ++ elseif line =~ '^\s*record\>' ++ let ind = s:MainBlockIndent( ind, lnum, 'type\>\|for\>.*\', '' ) + &sw ++ elseif line =~ '^\s*\(else\|elsif\)\>' ++ let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' ) ++ elseif line =~ '^\s*when\>' ++ " Align 'when' one /in/ from matching block start ++ let ind = s:MainBlockIndent( ind, lnum, '\(case\|exception\)\>', '' ) + &sw ++ elseif line =~ '^\s*end\>\s*\' ++ " End of if statements ++ let ind = s:EndBlockIndent( ind, lnum, 'if\>', 'end\>\s*\' ) ++ elseif line =~ '^\s*end\>\s*\' ++ " End of loops ++ let ind = s:EndBlockIndent( ind, lnum, '\(\(while\|for\)\>.*\)\?\', 'end\>\s*\' ) ++ elseif line =~ '^\s*end\>\s*\' ++ " End of records ++ let ind = s:EndBlockIndent( ind, lnum, '\(type\>.*\)\=\', 'end\>\s*\' ) ++ elseif line =~ '^\s*end\>\s*\' ++ " End of procedures ++ let ind = s:EndBlockIndent( ind, lnum, 'procedure\>.*\', 'end\>\s*\' ) ++ elseif line =~ '^\s*end\>\s*\' ++ " End of case statement ++ let ind = s:EndBlockIndent( ind, lnum, 'case\>.*\', 'end\>\s*\' ) ++ elseif line =~ '^\s*end\>' ++ " General case for end ++ let ind = s:MainBlockIndent( ind, lnum, '\(if\|while\|for\|loop\|accept\|begin\|record\|case\|exception\|package\)\>', '' ) ++ elseif line =~ '^\s*exception\>' ++ let ind = s:MainBlockIndent( ind, lnum, 'begin\>', '' ) ++ elseif line =~ '^\s*then\>' ++ let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' ) ++ endif ++ ++ return ind ++endfunction GetAdaIndent ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/indent/.svn/all-wcprops vim71_ada/1/indent/.svn/all-wcprops +--- vim71/1/indent/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/indent/.svn/all-wcprops 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,11 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 51 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/indent ++END ++ada.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 59 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/indent/ada.vim ++END +diff -urN vim71/1/indent/.svn/dir-prop-base vim71_ada/1/indent/.svn/dir-prop-base +--- vim71/1/indent/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/indent/.svn/dir-prop-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,6 @@ ++K 10 ++svn:ignore ++V 9 ++.backups ++ ++END +diff -urN vim71/1/indent/.svn/entries vim71_ada/1/indent/.svn/entries +--- vim71/1/indent/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/indent/.svn/entries 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,41 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ ++ada.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:02.000000Z ++0c3e48d95515e29fbb4a8bef5d6d97dc ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ +diff -urN vim71/1/indent/.svn/format vim71_ada/1/indent/.svn/format +--- vim71/1/indent/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/indent/.svn/format 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/indent/.svn/prop-base/ada.vim.svn-base vim71_ada/1/indent/.svn/prop-base/ada.vim.svn-base +--- vim71/1/indent/.svn/prop-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/indent/.svn/prop-base/ada.vim.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/indent/.svn/text-base/ada.vim.svn-base vim71_ada/1/indent/.svn/text-base/ada.vim.svn-base +--- vim71/1/indent/.svn/text-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/indent/.svn/text-base/ada.vim.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,303 @@ ++"------------------------------------------------------------------------------ ++" Description: Vim Ada indent file ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" Neil Bird ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL$ ++" History: 24.05.2006 MK Unified Headers ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested to save on spaces ++" 19.09.2007 NO g: missing before ada#Comment ++" Help Page: ft-vim-indent ++"------------------------------------------------------------------------------ ++" ToDo: ++" Verify handling of multi-line exprs. and recovery upon the final ';'. ++" Correctly find comments given '"' and "" ==> " syntax. ++" Combine the two large block-indent functions into one? ++"------------------------------------------------------------------------------ ++ ++" Only load this indent file when no other was loaded. ++if exists("b:did_indent") || version < 700 ++ finish ++endif ++ ++let b:did_indent = 45 ++ ++setlocal indentexpr=GetAdaIndent() ++setlocal indentkeys-=0{,0} ++setlocal indentkeys+=0=~then,0=~end,0=~elsif,0=~when,0=~exception,0=~begin,0=~is,0=~record ++ ++" Only define the functions once. ++if exists("*GetAdaIndent") ++ finish ++endif ++ ++if exists("g:ada_with_gnat_project_files") ++ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\[^;]*$\|\(type\>.*\)\=\\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|project\>\|then\>\|when\>\|is\>\)' ++else ++ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\[^;]*$\|\(type\>.*\)\=\\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|then\>\|when\>\|is\>\)' ++endif ++ ++" Section: s:MainBlockIndent {{{1 ++" ++" Try to find indent of the block we're in ++" prev_indent = the previous line's indent ++" prev_lnum = previous line (to start looking on) ++" blockstart = expr. that indicates a possible start of this block ++" stop_at = if non-null, if a matching line is found, gives up! ++" No recursive previous block analysis: simply look for a valid line ++" with a lesser or equal indent than we currently (on prev_lnum) have. ++" This shouldn't work as well as it appears to with lines that are currently ++" nowhere near the correct indent (e.g., start of line)! ++" Seems to work OK as it 'starts' with the indent of the /previous/ line. ++function s:MainBlockIndent (prev_indent, prev_lnum, blockstart, stop_at) ++ let lnum = a:prev_lnum ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) ++ while lnum > 1 ++ if a:stop_at != '' && line =~ '^\s*' . a:stop_at && indent(lnum) < a:prev_indent ++ return a:prev_indent ++ elseif line =~ '^\s*' . a:blockstart ++ let ind = indent(lnum) ++ if ind < a:prev_indent ++ return ind ++ endif ++ endif ++ ++ let lnum = prevnonblank(lnum - 1) ++ " Get previous non-blank/non-comment-only line ++ while 1 ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) ++ if line !~ '^\s*$' && line !~ '^\s*#' ++ break ++ endif ++ let lnum = prevnonblank(lnum - 1) ++ if lnum <= 0 ++ return a:prev_indent ++ endif ++ endwhile ++ endwhile ++ " Fallback - just move back one ++ return a:prev_indent - &sw ++endfunction MainBlockIndent ++ ++" Section: s:EndBlockIndent {{{1 ++" ++" Try to find indent of the block we're in (and about to complete), ++" including handling of nested blocks. Works on the 'end' of a block. ++" prev_indent = the previous line's indent ++" prev_lnum = previous line (to start looking on) ++" blockstart = expr. that indicates a possible start of this block ++" blockend = expr. that indicates a possible end of this block ++function s:EndBlockIndent( prev_indent, prev_lnum, blockstart, blockend ) ++ let lnum = a:prev_lnum ++ let line = getline(lnum) ++ let ends = 0 ++ while lnum > 1 ++ if getline(lnum) =~ '^\s*' . a:blockstart ++ let ind = indent(lnum) ++ if ends <= 0 ++ if ind < a:prev_indent ++ return ind ++ endif ++ else ++ let ends = ends - 1 ++ endif ++ elseif getline(lnum) =~ '^\s*' . a:blockend ++ let ends = ends + 1 ++ endif ++ ++ let lnum = prevnonblank(lnum - 1) ++ " Get previous non-blank/non-comment-only line ++ while 1 ++ let line = getline(lnum) ++ let line = substitute( line, g:ada#Comment, '', '' ) ++ if line !~ '^\s*$' ++ break ++ endif ++ let lnum = prevnonblank(lnum - 1) ++ if lnum <= 0 ++ return a:prev_indent ++ endif ++ endwhile ++ endwhile ++ " Fallback - just move back one ++ return a:prev_indent - &sw ++endfunction EndBlockIndent ++ ++" Section: s:StatementIndent {{{1 ++" ++" Return indent of previous statement-start ++" (after we've indented due to multi-line statements). ++" This time, we start searching on the line *before* the one given (which is ++" the end of a statement - we want the previous beginning). ++function s:StatementIndent( current_indent, prev_lnum ) ++ let lnum = a:prev_lnum ++ while lnum > 0 ++ let prev_lnum = lnum ++ let lnum = prevnonblank(lnum - 1) ++ " Get previous non-blank/non-comment-only line ++ while 1 ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) ++ ++ if line !~ '^\s*$' && line !~ '^\s*#' ++ break ++ endif ++ let lnum = prevnonblank(lnum - 1) ++ if lnum <= 0 ++ return a:current_indent ++ endif ++ endwhile ++ " Leave indent alone if our ';' line is part of a ';'-delineated ++ " aggregate (e.g., procedure args.) or first line after a block start. ++ if line =~ s:AdaBlockStart || line =~ '(\s*$' ++ return a:current_indent ++ endif ++ if line !~ '[.=(]\s*$' ++ let ind = indent(prev_lnum) ++ if ind < a:current_indent ++ return ind ++ endif ++ endif ++ endwhile ++ " Fallback - just use current one ++ return a:current_indent ++endfunction StatementIndent ++ ++ ++" Section: GetAdaIndent {{{1 ++" ++" Find correct indent of a new line based upon what went before ++" ++function GetAdaIndent() ++ " Find a non-blank line above the current line. ++ let lnum = prevnonblank(v:lnum - 1) ++ let ind = indent(lnum) ++ let package_line = 0 ++ ++ " Get previous non-blank/non-comment-only/non-cpp line ++ while 1 ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) ++ if line !~ '^\s*$' && line !~ '^\s*#' ++ break ++ endif ++ let lnum = prevnonblank(lnum - 1) ++ if lnum <= 0 ++ return ind ++ endif ++ endwhile ++ ++ " Get default indent (from prev. line) ++ let ind = indent(lnum) ++ let initind = ind ++ ++ " Now check what's on the previous line ++ if line =~ s:AdaBlockStart || line =~ '(\s*$' ++ " Check for false matches to AdaBlockStart ++ let false_match = 0 ++ if line =~ '^\s*\(procedure\|function\|package\)\>.*\' ++ " Generic instantiation ++ let false_match = 1 ++ elseif line =~ ')\s*;\s*$' || line =~ '^\([^(]*([^)]*)\)*[^(]*;\s*$' ++ " forward declaration ++ let false_match = 1 ++ endif ++ " Move indent in ++ if ! false_match ++ let ind = ind + &sw ++ endif ++ elseif line =~ '^\s*\(case\|exception\)\>' ++ " Move indent in twice (next 'when' will move back) ++ let ind = ind + 2 * &sw ++ elseif line =~ '^\s*end\s*record\>' ++ " Move indent back to tallying 'type' preceeding the 'record'. ++ " Allow indent to be equal to 'end record's. ++ let ind = s:MainBlockIndent( ind+&sw, lnum, 'type\>', '' ) ++ elseif line =~ '\(^\s*new\>.*\)\@' ++ " Multiple line generic instantiation ('package blah is\nnew thingy') ++ let ind = s:StatementIndent( ind - &sw, lnum ) ++ elseif line =~ ';\s*$' ++ " Statement end (but not 'end' ) - try to find current statement-start indent ++ let ind = s:StatementIndent( ind, lnum ) ++ endif ++ ++ " Check for potential argument list on next line ++ let continuation = (line =~ '[A-Za-z0-9_]\s*$') ++ ++ ++ " Check current line; search for simplistic matching start-of-block ++ let line = getline(v:lnum) ++ if line =~ '^\s*#' ++ " Start of line for ada-pp ++ let ind = 0 ++ elseif continuation && line =~ '^\s*(' ++ " Don't do this if we've already indented due to the previous line ++ if ind == initind ++ let ind = ind + &sw ++ endif ++ elseif line =~ '^\s*\(begin\|is\)\>' ++ let ind = s:MainBlockIndent( ind, lnum, '\(procedure\|function\|declare\|package\|task\)\>', 'begin\>' ) ++ elseif line =~ '^\s*record\>' ++ let ind = s:MainBlockIndent( ind, lnum, 'type\>\|for\>.*\', '' ) + &sw ++ elseif line =~ '^\s*\(else\|elsif\)\>' ++ let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' ) ++ elseif line =~ '^\s*when\>' ++ " Align 'when' one /in/ from matching block start ++ let ind = s:MainBlockIndent( ind, lnum, '\(case\|exception\)\>', '' ) + &sw ++ elseif line =~ '^\s*end\>\s*\' ++ " End of if statements ++ let ind = s:EndBlockIndent( ind, lnum, 'if\>', 'end\>\s*\' ) ++ elseif line =~ '^\s*end\>\s*\' ++ " End of loops ++ let ind = s:EndBlockIndent( ind, lnum, '\(\(while\|for\)\>.*\)\?\', 'end\>\s*\' ) ++ elseif line =~ '^\s*end\>\s*\' ++ " End of records ++ let ind = s:EndBlockIndent( ind, lnum, '\(type\>.*\)\=\', 'end\>\s*\' ) ++ elseif line =~ '^\s*end\>\s*\' ++ " End of procedures ++ let ind = s:EndBlockIndent( ind, lnum, 'procedure\>.*\', 'end\>\s*\' ) ++ elseif line =~ '^\s*end\>\s*\' ++ " End of case statement ++ let ind = s:EndBlockIndent( ind, lnum, 'case\>.*\', 'end\>\s*\' ) ++ elseif line =~ '^\s*end\>' ++ " General case for end ++ let ind = s:MainBlockIndent( ind, lnum, '\(if\|while\|for\|loop\|accept\|begin\|record\|case\|exception\|package\)\>', '' ) ++ elseif line =~ '^\s*exception\>' ++ let ind = s:MainBlockIndent( ind, lnum, 'begin\>', '' ) ++ elseif line =~ '^\s*then\>' ++ let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' ) ++ endif ++ ++ return ind ++endfunction GetAdaIndent ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: foldmethod=marker +diff -urN vim71/1/macros/.svn/all-wcprops vim71_ada/1/macros/.svn/all-wcprops +--- vim71/1/macros/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/all-wcprops 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,35 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 51 ++/svnroot/gnuada/!svn/ver/820/trunk/tools/vim/macros ++END ++svnignore.bash ++K 25 ++svn:wc:ra_dav:version-url ++V 66 ++/svnroot/gnuada/!svn/ver/467/trunk/tools/vim/macros/svnignore.bash ++END ++vim.bash ++K 25 ++svn:wc:ra_dav:version-url ++V 60 ++/svnroot/gnuada/!svn/ver/820/trunk/tools/vim/macros/vim.bash ++END ++svnignore.btm ++K 25 ++svn:wc:ra_dav:version-url ++V 65 ++/svnroot/gnuada/!svn/ver/806/trunk/tools/vim/macros/svnignore.btm ++END ++svnignore.zsh ++K 25 ++svn:wc:ra_dav:version-url ++V 65 ++/svnroot/gnuada/!svn/ver/818/trunk/tools/vim/macros/svnignore.zsh ++END ++vim.zsh ++K 25 ++svn:wc:ra_dav:version-url ++V 59 ++/svnroot/gnuada/!svn/ver/820/trunk/tools/vim/macros/vim.zsh ++END +diff -urN vim71/1/macros/.svn/dir-prop-base vim71_ada/1/macros/.svn/dir-prop-base +--- vim71/1/macros/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/dir-prop-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,6 @@ ++K 10 ++svn:ignore ++V 9 ++.backups ++ ++END +diff -urN vim71/1/macros/.svn/entries vim71_ada/1/macros/.svn/entries +--- vim71/1/macros/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/entries 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,93 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-12-08T11:05:30.504500Z ++820 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ ++svnignore.bash ++file ++ ++ ++ ++ ++2008-01-16T15:37:02.000000Z ++c642481322f646fd974e97b84ada8dd1 ++2006-11-23T19:22:39.181709Z ++467 ++krischik ++has-props ++ ++vim.bash ++file ++ ++ ++ ++ ++2008-01-16T15:37:02.000000Z ++b727d059d581444336f20c5a98cb38f4 ++2007-12-08T11:05:30.504500Z ++820 ++krischik ++has-props ++ ++svnignore.btm ++file ++ ++ ++ ++ ++2008-01-16T15:37:02.000000Z ++d80c852daa65bf28d8e6f77aa176dcf5 ++2007-11-21T09:35:26.131421Z ++806 ++krischik ++has-props ++ ++svnignore.zsh ++file ++ ++ ++ ++ ++2008-01-16T15:37:02.000000Z ++6eea8120eb524add32e145b4ae2fcd78 ++2007-12-03T21:21:48.223203Z ++818 ++krischik ++has-props ++ ++vim.zsh ++file ++ ++ ++ ++ ++2008-01-16T15:37:02.000000Z ++07a5ffc95ea930774810e3d04144cbff ++2007-12-08T11:05:30.504500Z ++820 ++krischik ++has-props ++ +diff -urN vim71/1/macros/.svn/format vim71_ada/1/macros/.svn/format +--- vim71/1/macros/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/format 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/macros/.svn/prop-base/svnignore.bash.svn-base vim71_ada/1/macros/.svn/prop-base/svnignore.bash.svn-base +--- vim71/1/macros/.svn/prop-base/svnignore.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/prop-base/svnignore.bash.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 14 ++svn:executable ++V 1 ++* ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 9 ++text/x-sh ++END +diff -urN vim71/1/macros/.svn/prop-base/svnignore.btm.svn-base vim71_ada/1/macros/.svn/prop-base/svnignore.btm.svn-base +--- vim71/1/macros/.svn/prop-base/svnignore.btm.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/prop-base/svnignore.btm.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 14 ++svn:executable ++V 1 ++* ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 15 ++text/x-dosbatch ++END +diff -urN vim71/1/macros/.svn/prop-base/svnignore.zsh.svn-base vim71_ada/1/macros/.svn/prop-base/svnignore.zsh.svn-base +--- vim71/1/macros/.svn/prop-base/svnignore.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/prop-base/svnignore.zsh.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 14 ++svn:executable ++V 1 ++* ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 9 ++text/x-sh ++END +diff -urN vim71/1/macros/.svn/prop-base/vim.bash.svn-base vim71_ada/1/macros/.svn/prop-base/vim.bash.svn-base +--- vim71/1/macros/.svn/prop-base/vim.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/prop-base/vim.bash.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 14 ++svn:executable ++V 1 ++* ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 9 ++text/x-sh ++END +diff -urN vim71/1/macros/.svn/prop-base/vim.zsh.svn-base vim71_ada/1/macros/.svn/prop-base/vim.zsh.svn-base +--- vim71/1/macros/.svn/prop-base/vim.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/prop-base/vim.zsh.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 14 ++svn:executable ++V 1 ++* ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 9 ++text/x-sh ++END +diff -urN vim71/1/macros/.svn/text-base/svnignore.bash.svn-base vim71_ada/1/macros/.svn/text-base/svnignore.bash.svn-base +--- vim71/1/macros/.svn/text-base/svnignore.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/text-base/svnignore.bash.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,9 @@ ++#!/bin/bash ++ ++svn propedit \ ++ --editor-cmd="gvim -f" \ ++ svn:ignore \ ++ "${@}" ; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/1/macros/.svn/text-base/svnignore.btm.svn-base vim71_ada/1/macros/.svn/text-base/svnignore.btm.svn-base +--- vim71/1/macros/.svn/text-base/svnignore.btm.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/text-base/svnignore.btm.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,27 @@ ++::!C:\Bin\4Portable\App\4\4nt.EXE ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: Description: Works like "tail -f" . ++:: $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++:: Maintainer: Martin Krischik ++:: Jason Heddings (vim at heddway dot com) ++:: $Author: karsten $ ++:: $Date: 2008/01/16 15:58:14 $ ++:: Version: 3.0 ++:: $Revision: 1.1 $ ++:: $HeadURL$ ++:: History: 17.11.2007 Edit svn:ignore data ++:: Help Page: tail.txt ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++ ++svn propedit ^ ++ --editor-cmd="gvim -f" ^ ++ svn:ignore ^ ++ "%[$]" ++ ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: Copyright (C) 2006 Martin Krischik ++:: ++:: Vim is Charityware - see ":help license" or uganda.txt for licence details. ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++:: vim: filetype=btm encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/1/macros/.svn/text-base/svnignore.zsh.svn-base vim71_ada/1/macros/.svn/text-base/svnignore.zsh.svn-base +--- vim71/1/macros/.svn/text-base/svnignore.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/text-base/svnignore.zsh.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,29 @@ ++#!/bin/zsh ++#------------------------------------------------------------------------------ ++# Description: Works like "tail -f" . ++# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++# Maintainer: Martin Krischik ++# Jason Heddings (vim at heddway dot com) ++# $Author: karsten $ ++# $Date: 2008/01/16 15:58:14 $ ++# Version: 3.0 ++# $Revision: 1.1 $ ++# $HeadURL$ ++# History: 17.11.2007 Edit svn:ignore data ++# Help Page: tail.txt ++#------------------------------------------------------------------------------ ++ ++setopt No_X_Trace; ++ ++svn propedit \ ++ --editor-cmd="gvim -f" \ ++ svn:ignore \ ++ "${=@}" ; ++ ++#------------------------------------------------------------------------------ ++# Copyright (C) 2006 Martin Krischik ++# ++# Vim is Charityware - see ":help license" or uganda.txt for licence details. ++#------------------------------------------------------------------------------ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/1/macros/.svn/text-base/vim.bash.svn-base vim71_ada/1/macros/.svn/text-base/vim.bash.svn-base +--- vim71/1/macros/.svn/text-base/vim.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/text-base/vim.bash.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,191 @@ ++#!/bin/echo usage: source ++########################################################### {{{1 ########### ++# Description: Set alias names for a custom installed vim/ctags. ++# Language: Bash Shell Script ++# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++# Maintainer: Martin Krischik ++# $Author: karsten $ ++# $Date: 2008/01/16 15:58:14 $ ++# Version: 3.6 ++# $Revision: 1.1 $ ++# $HeadURL$ ++# History: 26.07.2006 MK pretty new ++# Usage: copy to /etc/profile.d and make world executable ++########################################################### }}}1 ########### ++ ++ ++if ! type lxpm 2>/dev/null 1>/dev/null; then ++ ++ # Variablen ++ UName=$(uname) ++ ++ case "${UName}" in # {{{1 ++ (Linux*) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}2 ++ (CYGWIN*) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}2 ++ (SunOS) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; ++ elif test -x "${HOME}/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="${HOME}/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" ++ PATH="${VIM}/bin:${PATH}" ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi ++ ;; # }}}2 ++ (*) # {{{2 ++ ;; # }}}2 ++ esac; # }}}1 ++ ++ # Simple Functions ++ ++ for i in ctags etags eview evim ex gview gvim gvimdiff rgview rgvim rview rvim view vim vimdiff vimtutor xxd; do # {{{1 ++ ++ case "${UName}" in # {{{2 ++ (MINGW*) # {{{3 ++ if test -n "${VIM}"; then ++ declare -x -f ${i}; ++ ++ eval "function ${i} () ++ { ++ ${VIM}/vim71/gvim.exe \"\${@}\" ++ return; ++ }" ++ else ++ unset -f ${i} 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}3 ++ (Linux|CYGWIN*) # {{{3 ++ if test -n "${VIM}"; then ++ declare -x -f ${i}; ++ ++ eval "function ${i} () ++ { ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/${i}\" \"\${@}\" ; ++ return; ++ }" ++ else ++ unset -f ${i} 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}3 ++ (*) # {{{3 ++ ;; # }}}3 ++ esac; # }}}2 ++ done; # }}}1 ++ ++ # Server Functions ++ ++ for i in lxpm med epm; do # {{{1 ++ declare -x -f ${i} ++ ++ case "${UName}" in # {{{2 ++ (MINGW*) # {{{3 ++ if test -n "${VIM}"; then ++ eval "function ${i} () ++ { ++ if test -z "\${1}"; then ++ ${VIM}/vim71/gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & ++ else ++ ${VIM}/vim71/gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & ++ fi; ++ return; ++ }" ++ else ++ eval "function ${i} () ++ { ++ if test -z "\${1}"; then ++ gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & ++ else ++ gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & ++ fi; ++ return; ++ }" ++ fi; ++ ;; # }}}3 ++ (Linux|CYGWIN*|SunOS) # {{{3 ++ if test -n "${VIM}"; then ++ eval "function ${i} () ++ { ++ if test -z \"\${1}\"; then ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" \"\${@}\" \ ++ >/dev/null 2>/dev/null & ++ else ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" \ ++ >/dev/null 2>/dev/null & ++ fi ++ return; ++ }" ++ else ++ eval "function ${i} () ++ { ++ if test -z \"\${1}\"; then ++ gvim --servername \"${i} ${HOSTNAME}\" >/dev/null 2>/dev/null & ++ else ++ gvim --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" >/dev/null 2>/dev/null & ++ fi ++ return; ++ }" ++ fi; ++ ;; # }}}3 ++ (*) # {{{3 ++ ;; # }}}3 ++ esac; # }}}2 ++ done; # }}}1 ++ ++ # Some applications read the EDITOR variable to determine your favourite text ++ # editor. So uncomment the line below and enter the editor of your choice :-) ++ if test -n "${VIM}"; then ++ declare -x EDITOR="${VIM}/bin/gvim -f"; ++ declare -x VISUAL="${VIM}/bin/gvim -f"; ++ else ++ declare -x EDITOR="$(which gvim) -f"; ++ declare -x VISUAL="$(which gvim) -f"; ++ fi; ++ # Unset local Variablen ++ ++ unset UName ++ ++ printf "\e[42m%-30.30s : \e[43m %-40.40s \e[m\n" "$(basename ${BASH_SOURCE:-${0}})" "VIM 7.0 symbols set." ++ ++fi; ++ ++########################################################### {{{1 ########### ++# Copyright (C) 2006 Martin Krischik ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License ++# as published by the Free Software Foundation; either version 2 ++# of the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ++########################################################### }}}1 ########### ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker +diff -urN vim71/1/macros/.svn/text-base/vim.zsh.svn-base vim71_ada/1/macros/.svn/text-base/vim.zsh.svn-base +--- vim71/1/macros/.svn/text-base/vim.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/.svn/text-base/vim.zsh.svn-base 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,17 @@ ++#!/bin/echo usage: source ++ ++setopt No_Verbose ++setopt No_X_Trace ++setopt Typeset_Silent; ++ ++# ++# Bash script is zsh compatible ++# ++HOSTNAME="${HOSTNAME:-${HOST}}" ++BASH_SOURCE="$(basename ${0} .zsh).bash" ++source "$(dirname ${0})/${BASH_SOURCE}" ++unset BASH_SOURCE; ++ ++############################################################# {{{1 ########### ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab ++# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/1/macros/svnignore.bash vim71_ada/1/macros/svnignore.bash +--- vim71/1/macros/svnignore.bash 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/svnignore.bash 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,9 @@ ++#!/bin/bash ++ ++svn propedit \ ++ --editor-cmd="gvim -f" \ ++ svn:ignore \ ++ "${@}" ; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/1/macros/svnignore.btm vim71_ada/1/macros/svnignore.btm +--- vim71/1/macros/svnignore.btm 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/svnignore.btm 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,27 @@ ++::!C:\Bin\4Portable\App\4\4nt.EXE ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: Description: Works like "tail -f" . ++:: $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++:: Maintainer: Martin Krischik ++:: Jason Heddings (vim at heddway dot com) ++:: $Author: karsten $ ++:: $Date: 2008/01/16 15:58:14 $ ++:: Version: 3.0 ++:: $Revision: 1.1 $ ++:: $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.btm $ ++:: History: 17.11.2007 Edit svn:ignore data ++:: Help Page: tail.txt ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++ ++svn propedit ^ ++ --editor-cmd="gvim -f" ^ ++ svn:ignore ^ ++ "%[$]" ++ ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: Copyright (C) 2006 Martin Krischik ++:: ++:: Vim is Charityware - see ":help license" or uganda.txt for licence details. ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++:: vim: filetype=btm encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/1/macros/svnignore.zsh vim71_ada/1/macros/svnignore.zsh +--- vim71/1/macros/svnignore.zsh 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/svnignore.zsh 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,29 @@ ++#!/bin/zsh ++#------------------------------------------------------------------------------ ++# Description: Works like "tail -f" . ++# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++# Maintainer: Martin Krischik ++# Jason Heddings (vim at heddway dot com) ++# $Author: karsten $ ++# $Date: 2008/01/16 15:58:14 $ ++# Version: 3.0 ++# $Revision: 1.1 $ ++# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.zsh $ ++# History: 17.11.2007 Edit svn:ignore data ++# Help Page: tail.txt ++#------------------------------------------------------------------------------ ++ ++setopt No_X_Trace; ++ ++svn propedit \ ++ --editor-cmd="gvim -f" \ ++ svn:ignore \ ++ "${=@}" ; ++ ++#------------------------------------------------------------------------------ ++# Copyright (C) 2006 Martin Krischik ++# ++# Vim is Charityware - see ":help license" or uganda.txt for licence details. ++#------------------------------------------------------------------------------ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/1/macros/vim.bash vim71_ada/1/macros/vim.bash +--- vim71/1/macros/vim.bash 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/vim.bash 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,191 @@ ++#!/bin/echo usage: source ++########################################################### {{{1 ########### ++# Description: Set alias names for a custom installed vim/ctags. ++# Language: Bash Shell Script ++# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++# Maintainer: Martin Krischik ++# $Author: karsten $ ++# $Date: 2008/01/16 15:58:14 $ ++# Version: 3.6 ++# $Revision: 1.1 $ ++# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/vim.bash $ ++# History: 26.07.2006 MK pretty new ++# Usage: copy to /etc/profile.d and make world executable ++########################################################### }}}1 ########### ++ ++ ++if ! type lxpm 2>/dev/null 1>/dev/null; then ++ ++ # Variablen ++ UName=$(uname) ++ ++ case "${UName}" in # {{{1 ++ (Linux*) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}2 ++ (CYGWIN*) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}2 ++ (SunOS) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; ++ elif test -x "${HOME}/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="${HOME}/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" ++ PATH="${VIM}/bin:${PATH}" ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi ++ ;; # }}}2 ++ (*) # {{{2 ++ ;; # }}}2 ++ esac; # }}}1 ++ ++ # Simple Functions ++ ++ for i in ctags etags eview evim ex gview gvim gvimdiff rgview rgvim rview rvim view vim vimdiff vimtutor xxd; do # {{{1 ++ ++ case "${UName}" in # {{{2 ++ (MINGW*) # {{{3 ++ if test -n "${VIM}"; then ++ declare -x -f ${i}; ++ ++ eval "function ${i} () ++ { ++ ${VIM}/vim71/gvim.exe \"\${@}\" ++ return; ++ }" ++ else ++ unset -f ${i} 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}3 ++ (Linux|CYGWIN*) # {{{3 ++ if test -n "${VIM}"; then ++ declare -x -f ${i}; ++ ++ eval "function ${i} () ++ { ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/${i}\" \"\${@}\" ; ++ return; ++ }" ++ else ++ unset -f ${i} 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}3 ++ (*) # {{{3 ++ ;; # }}}3 ++ esac; # }}}2 ++ done; # }}}1 ++ ++ # Server Functions ++ ++ for i in lxpm med epm; do # {{{1 ++ declare -x -f ${i} ++ ++ case "${UName}" in # {{{2 ++ (MINGW*) # {{{3 ++ if test -n "${VIM}"; then ++ eval "function ${i} () ++ { ++ if test -z "\${1}"; then ++ ${VIM}/vim71/gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & ++ else ++ ${VIM}/vim71/gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & ++ fi; ++ return; ++ }" ++ else ++ eval "function ${i} () ++ { ++ if test -z "\${1}"; then ++ gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & ++ else ++ gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & ++ fi; ++ return; ++ }" ++ fi; ++ ;; # }}}3 ++ (Linux|CYGWIN*|SunOS) # {{{3 ++ if test -n "${VIM}"; then ++ eval "function ${i} () ++ { ++ if test -z \"\${1}\"; then ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" \"\${@}\" \ ++ >/dev/null 2>/dev/null & ++ else ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" \ ++ >/dev/null 2>/dev/null & ++ fi ++ return; ++ }" ++ else ++ eval "function ${i} () ++ { ++ if test -z \"\${1}\"; then ++ gvim --servername \"${i} ${HOSTNAME}\" >/dev/null 2>/dev/null & ++ else ++ gvim --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" >/dev/null 2>/dev/null & ++ fi ++ return; ++ }" ++ fi; ++ ;; # }}}3 ++ (*) # {{{3 ++ ;; # }}}3 ++ esac; # }}}2 ++ done; # }}}1 ++ ++ # Some applications read the EDITOR variable to determine your favourite text ++ # editor. So uncomment the line below and enter the editor of your choice :-) ++ if test -n "${VIM}"; then ++ declare -x EDITOR="${VIM}/bin/gvim -f"; ++ declare -x VISUAL="${VIM}/bin/gvim -f"; ++ else ++ declare -x EDITOR="$(which gvim) -f"; ++ declare -x VISUAL="$(which gvim) -f"; ++ fi; ++ # Unset local Variablen ++ ++ unset UName ++ ++ printf "\e[42m%-30.30s : \e[43m %-40.40s \e[m\n" "$(basename ${BASH_SOURCE:-${0}})" "VIM 7.0 symbols set." ++ ++fi; ++ ++########################################################### {{{1 ########### ++# Copyright (C) 2006 Martin Krischik ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License ++# as published by the Free Software Foundation; either version 2 ++# of the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ++########################################################### }}}1 ########### ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker +diff -urN vim71/1/macros/vim.zsh vim71_ada/1/macros/vim.zsh +--- vim71/1/macros/vim.zsh 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/macros/vim.zsh 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,17 @@ ++#!/bin/echo usage: source ++ ++setopt No_Verbose ++setopt No_X_Trace ++setopt Typeset_Silent; ++ ++# ++# Bash script is zsh compatible ++# ++HOSTNAME="${HOSTNAME:-${HOST}}" ++BASH_SOURCE="$(basename ${0} .zsh).bash" ++source "$(dirname ${0})/${BASH_SOURCE}" ++unset BASH_SOURCE; ++ ++############################################################# {{{1 ########### ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab ++# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/1/plugin/matchit.vim vim71_ada/1/plugin/matchit.vim +--- vim71/1/plugin/matchit.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/matchit.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,814 @@ ++" matchit.vim: (global plugin) Extended "%" matching ++" Last Change: Tue Oct 24 11:00 AM 2006 EDT ++" Maintainer: Benji Fisher PhD ++" Version: 1.12, for Vim 6.3+ ++" URL: http://www.vim.org/script.php?script_id=39 ++ ++" Documentation: ++" The documentation is in a separate file, matchit.txt . ++ ++" Credits: ++" Vim editor by Bram Moolenaar (Thanks, Bram!) ++" Original script and design by Raul Segura Acevedo ++" Support for comments by Douglas Potts ++" Support for back references and other improvements by Benji Fisher ++" Support for many languages by Johannes Zellner ++" Suggestions for improvement, bug reports, and support for additional ++" languages by Jordi-Albert Batalla, Neil Bird, Servatius Brandt, Mark ++" Collett, Stephen Wall, Dany St-Amant, Yuheng Xie, and Johannes Zellner. ++ ++" Debugging: ++" If you'd like to try the built-in debugging commands... ++" :MatchDebug to activate debugging for the current buffer ++" This saves the values of several key script variables as buffer-local ++" variables. See the MatchDebug() function, below, for details. ++ ++" TODO: I should think about multi-line patterns for b:match_words. ++" This would require an option: how many lines to scan (default 1). ++" This would be useful for Python, maybe also for *ML. ++" TODO: Maybe I should add a menu so that people will actually use some of ++" the features that I have implemented. ++" TODO: Eliminate the MultiMatch function. Add yet another argument to ++" Match_wrapper() instead. ++" TODO: Allow :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1' ++" TODO: Make backrefs safer by using '\V' (very no-magic). ++" TODO: Add a level of indirection, so that custom % scripts can use my ++" work but extend it. ++ ++" allow user to prevent loading ++" and prevent duplicate loading ++if exists("loaded_matchit") || &cp ++ finish ++endif ++let loaded_matchit = 1 ++let s:last_mps = "" ++let s:last_words = "" ++ ++let s:save_cpo = &cpo ++set cpo&vim ++ ++nnoremap % :call Match_wrapper('',1,'n') ++nnoremap g% :call Match_wrapper('',0,'n') ++vnoremap % :call Match_wrapper('',1,'v') m'gv`` ++vnoremap g% :call Match_wrapper('',0,'v') m'gv`` ++onoremap % v:call Match_wrapper('',1,'o') ++onoremap g% v:call Match_wrapper('',0,'o') ++ ++" Analogues of [{ and ]} using matching patterns: ++nnoremap [% :call MultiMatch("bW", "n") ++nnoremap ]% :call MultiMatch("W", "n") ++vmap [% [%m'gv`` ++vmap ]% ]%m'gv`` ++" vnoremap [% :call MultiMatch("bW", "v") m'gv`` ++" vnoremap ]% :call MultiMatch("W", "v") m'gv`` ++onoremap [% v:call MultiMatch("bW", "o") ++onoremap ]% v:call MultiMatch("W", "o") ++ ++" text object: ++vmap a% [%v]% ++ ++" Auto-complete mappings: (not yet "ready for prime time") ++" TODO Read :help write-plugin for the "right" way to let the user ++" specify a key binding. ++" let g:match_auto = '' ++" let g:match_autoCR = '' ++" if exists("g:match_auto") ++" execute "inoremap " . g:match_auto . ' x"=Autocomplete()Pls' ++" endif ++" if exists("g:match_autoCR") ++" execute "inoremap " . g:match_autoCR . ' =Autocomplete()' ++" endif ++" if exists("g:match_gthhoh") ++" execute "inoremap " . g:match_gthhoh . ' :call Gthhoh()' ++" endif " gthhoh = "Get the heck out of here!" ++ ++let s:notslash = '\\\@" ++ endif ++ " In s:CleanUp(), we may need to check whether the cursor moved forward. ++ let startline = line(".") ++ let startcol = col(".") ++ " Use default behavior if called with a count or if no patterns are defined. ++ if v:count ++ exe "normal! " . v:count . "%" ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ elseif !exists("b:match_words") || b:match_words == "" ++ silent! normal! % ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ end ++ ++ " First step: if not already done, set the script variables ++ " s:do_BR flag for whether there are backrefs ++ " s:pat parsed version of b:match_words ++ " s:all regexp based on s:pat and the default groups ++ " ++ " Allow b:match_words = "GetVimMatchWords()" . ++ if b:match_words =~ ":" ++ let match_words = b:match_words ++ else ++ execute "let match_words =" b:match_words ++ endif ++" Thanks to Preben "Peppe" Guldberg and Bram Moolenaar for this suggestion! ++ if (match_words != s:last_words) || (&mps != s:last_mps) || ++ \ exists("b:match_debug") ++ let s:last_words = match_words ++ let s:last_mps = &mps ++ if match_words !~ s:notslash . '\\\d' ++ let s:do_BR = 0 ++ let s:pat = match_words ++ else ++ let s:do_BR = 1 ++ let s:pat = s:ParseWords(match_words) ++ endif ++ " The next several lines were here before ++ " BF started messing with this script. ++ " quote the special chars in 'matchpairs', replace [,:] with \| and then ++ " append the builtin pairs (/*, */, #if, #ifdef, #else, #elif, #endif) ++ " let default = substitute(escape(&mps, '[$^.*~\\/?]'), '[,:]\+', ++ " \ '\\|', 'g').'\|\/\*\|\*\/\|#if\>\|#ifdef\>\|#else\>\|#elif\>\|#endif\>' ++ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . ++ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' ++ " s:all = pattern with all the keywords ++ let s:all = s:pat . (strlen(s:pat) ? "," : "") . default ++ let s:all = substitute(s:all, s:notslash . '\zs[,:]\+', '\\|', 'g') ++ let s:all = '\%(' . s:all . '\)' ++ " let s:all = '\%(' . substitute(s:all, '\\\ze[,:]', '', 'g') . '\)' ++ if exists("b:match_debug") ++ let b:match_pat = s:pat ++ endif ++ endif ++ ++ " Second step: set the following local variables: ++ " matchline = line on which the cursor started ++ " curcol = number of characters before match ++ " prefix = regexp for start of line to start of match ++ " suffix = regexp for end of match to end of line ++ " Require match to end on or after the cursor and prefer it to ++ " start on or before the cursor. ++ let matchline = getline(startline) ++ if a:word != '' ++ " word given ++ if a:word !~ s:all ++ echohl WarningMsg|echo 'Missing rule for word:"'.a:word.'"'|echohl NONE ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ endif ++ let matchline = a:word ++ let curcol = 0 ++ let prefix = '^\%(' ++ let suffix = '\)$' ++ " Now the case when "word" is not given ++ else " Find the match that ends on or after the cursor and set curcol. ++ let regexp = s:Wholematch(matchline, s:all, startcol-1) ++ let curcol = match(matchline, regexp) ++ let endcol = matchend(matchline, regexp) ++ let suf = strlen(matchline) - endcol ++ let prefix = (curcol ? '^.*\%' . (curcol + 1) . 'c\%(' : '^\%(') ++ let suffix = (suf ? '\)\%' . (endcol + 1) . 'c.*$' : '\)$') ++ " If the match comes from the defaults, bail out. ++ if matchline !~ prefix . ++ \ substitute(s:pat, s:notslash.'\zs[,:]\+', '\\|', 'g') . suffix ++ silent! norm! % ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ endif ++ endif ++ if exists("b:match_debug") ++ let b:match_match = matchstr(matchline, regexp) ++ let b:match_col = curcol+1 ++ endif ++ ++ " Third step: Find the group and single word that match, and the original ++ " (backref) versions of these. Then, resolve the backrefs. ++ " Set the following local variable: ++ " group = colon-separated list of patterns, one of which matches ++ " = ini:mid:fin or ini:fin ++ " ++ " Reconstruct the version with unresolved backrefs. ++ let patBR = substitute(match_words.',', ++ \ s:notslash.'\zs[,:]*,[,:]*', ',', 'g') ++ let patBR = substitute(patBR, s:notslash.'\zs:\{2,}', ':', 'g') ++ " Now, set group and groupBR to the matching group: 'if:endif' or ++ " 'while:endwhile' or whatever. A bit of a kluge: s:Choose() returns ++ " group . "," . groupBR, and we pick it apart. ++ let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) ++ let i = matchend(group, s:notslash . ",") ++ let groupBR = strpart(group, i) ++ let group = strpart(group, 0, i-1) ++ " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix ++ if s:do_BR " Do the hard part: resolve those backrefs! ++ let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++ endif ++ if exists("b:match_debug") ++ let b:match_wholeBR = groupBR ++ let i = matchend(groupBR, s:notslash . ":") ++ let b:match_iniBR = strpart(groupBR, 0, i-1) ++ endif ++ ++ " Fourth step: Set the arguments for searchpair(). ++ let i = matchend(group, s:notslash . ":") ++ let j = matchend(group, '.*' . s:notslash . ":") ++ let ini = strpart(group, 0, i-1) ++ let mid = substitute(strpart(group, i,j-i-1), s:notslash.'\zs:', '\\|', 'g') ++ let fin = strpart(group, j) ++ "Un-escape the remaining , and : characters. ++ let ini = substitute(ini, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ let mid = substitute(mid, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ let fin = substitute(fin, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ " searchpair() requires that these patterns avoid \(\) groups. ++ let ini = substitute(ini, s:notslash . '\zs\\(', '\\%(', 'g') ++ let mid = substitute(mid, s:notslash . '\zs\\(', '\\%(', 'g') ++ let fin = substitute(fin, s:notslash . '\zs\\(', '\\%(', 'g') ++ " Set mid. This is optimized for readability, not micro-efficiency! ++ if a:forward && matchline =~ prefix . fin . suffix ++ \ || !a:forward && matchline =~ prefix . ini . suffix ++ let mid = "" ++ endif ++ " Set flag. This is optimized for readability, not micro-efficiency! ++ if a:forward && matchline =~ prefix . fin . suffix ++ \ || !a:forward && matchline !~ prefix . ini . suffix ++ let flag = "bW" ++ else ++ let flag = "W" ++ endif ++ " Set skip. ++ if exists("b:match_skip") ++ let skip = b:match_skip ++ elseif exists("b:match_comment") " backwards compatibility and testing! ++ let skip = "r:" . b:match_comment ++ else ++ let skip = 's:comment\|string' ++ endif ++ let skip = s:ParseSkip(skip) ++ if exists("b:match_debug") ++ let b:match_ini = ini ++ let b:match_tail = (strlen(mid) ? mid.'\|' : '') . fin ++ endif ++ ++ " Fifth step: actually start moving the cursor and call searchpair(). ++ " Later, :execute restore_cursor to get to the original screen. ++ let restore_cursor = virtcol(".") . "|" ++ normal! g0 ++ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor ++ normal! H ++ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ execute restore_cursor ++ call cursor(0, curcol + 1) ++ " normal! 0 ++ " if curcol ++ " execute "normal!" . curcol . "l" ++ " endif ++ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on")) ++ let skip = "0" ++ else ++ execute "if " . skip . "| let skip = '0' | endif" ++ endif ++ let sp_return = searchpair(ini, mid, fin, flag, skip) ++ let final_position = "call cursor(" . line(".") . "," . col(".") . ")" ++ " Restore cursor position and original screen. ++ execute restore_cursor ++ normal! m' ++ if sp_return > 0 ++ execute final_position ++ endif ++ return s:CleanUp(restore_options, a:mode, startline, startcol, mid.'\|'.fin) ++endfun ++ ++" Restore options and do some special handling for Operator-pending mode. ++" The optional argument is the tail of the matching group. ++fun! s:CleanUp(options, mode, startline, startcol, ...) ++ execute "set" a:options ++ " Open folds, if appropriate. ++ if a:mode != "o" ++ if &foldopen =~ "percent" ++ normal! zv ++ endif ++ " In Operator-pending mode, we want to include the whole match ++ " (for example, d%). ++ " This is only a problem if we end up moving in the forward direction. ++ elseif (a:startline < line(".")) || ++ \ (a:startline == line(".") && a:startcol < col(".")) ++ if a:0 ++ " Check whether the match is a single character. If not, move to the ++ " end of the match. ++ let matchline = getline(".") ++ let currcol = col(".") ++ let regexp = s:Wholematch(matchline, a:1, currcol-1) ++ let endcol = matchend(matchline, regexp) ++ if endcol > currcol " This is NOT off by one! ++ execute "normal!" . (endcol - currcol) . "l" ++ endif ++ endif " a:0 ++ endif " a:mode != "o" && etc. ++ return 0 ++endfun ++ ++" Example (simplified HTML patterns): if ++" a:groupBR = '<\(\k\+\)>:' ++" a:prefix = '^.\{3}\(' ++" a:group = '<\(\k\+\)>:' ++" a:suffix = '\).\{2}$' ++" a:matchline = "12312" or "12312" ++" then extract "tag" from a:matchline and return ":" . ++fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++ if a:matchline !~ a:prefix . ++ \ substitute(a:group, s:notslash . '\zs:', '\\|', 'g') . a:suffix ++ return a:group ++ endif ++ let i = matchend(a:groupBR, s:notslash . ':') ++ let ini = strpart(a:groupBR, 0, i-1) ++ let tailBR = strpart(a:groupBR, i) ++ let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix, ++ \ a:groupBR) ++ let i = matchend(word, s:notslash . ":") ++ let wordBR = strpart(word, i) ++ let word = strpart(word, 0, i-1) ++ " Now, a:matchline =~ a:prefix . word . a:suffix ++ if wordBR != ini ++ let table = s:Resolve(ini, wordBR, "table") ++ else ++ " let table = "----------" ++ let table = "" ++ let d = 0 ++ while d < 10 ++ if tailBR =~ s:notslash . '\\' . d ++ " let table[d] = d ++ let table = table . d ++ else ++ let table = table . "-" ++ endif ++ let d = d + 1 ++ endwhile ++ endif ++ let d = 9 ++ while d ++ if table[d] != "-" ++ let backref = substitute(a:matchline, a:prefix.word.a:suffix, ++ \ '\'.table[d], "") ++ " Are there any other characters that should be escaped? ++ let backref = escape(backref, '*,:') ++ execute s:Ref(ini, d, "start", "len") ++ let ini = strpart(ini, 0, start) . backref . strpart(ini, start+len) ++ let tailBR = substitute(tailBR, s:notslash . '\zs\\' . d, ++ \ escape(backref, '\\'), 'g') ++ endif ++ let d = d-1 ++ endwhile ++ if exists("b:match_debug") ++ if s:do_BR ++ let b:match_table = table ++ let b:match_word = word ++ else ++ let b:match_table = "" ++ let b:match_word = "" ++ endif ++ endif ++ return ini . ":" . tailBR ++endfun ++ ++" Input a comma-separated list of groups with backrefs, such as ++" a:groups = '\(foo\):end\1,\(bar\):end\1' ++" and return a comma-separated list of groups with backrefs replaced: ++" return '\(foo\):end\(foo\),\(bar\):end\(bar\)' ++fun! s:ParseWords(groups) ++ let groups = substitute(a:groups.",", s:notslash.'\zs[,:]*,[,:]*', ',', 'g') ++ let groups = substitute(groups, s:notslash . '\zs:\{2,}', ':', 'g') ++ let parsed = "" ++ while groups =~ '[^,:]' ++ let i = matchend(groups, s:notslash . ':') ++ let j = matchend(groups, s:notslash . ',') ++ let ini = strpart(groups, 0, i-1) ++ let tail = strpart(groups, i, j-i-1) . ":" ++ let groups = strpart(groups, j) ++ let parsed = parsed . ini ++ let i = matchend(tail, s:notslash . ':') ++ while i != -1 ++ " In 'if:else:endif', ini='if' and word='else' and then word='endif'. ++ let word = strpart(tail, 0, i-1) ++ let tail = strpart(tail, i) ++ let i = matchend(tail, s:notslash . ':') ++ let parsed = parsed . ":" . s:Resolve(ini, word, "word") ++ endwhile " Now, tail has been used up. ++ let parsed = parsed . "," ++ endwhile " groups =~ '[^,:]' ++ return parsed ++endfun ++ ++" TODO I think this can be simplified and/or made more efficient. ++" TODO What should I do if a:start is out of range? ++" Return a regexp that matches all of a:string, such that ++" matchstr(a:string, regexp) represents the match for a:pat that starts ++" as close to a:start as possible, before being preferred to after, and ++" ends after a:start . ++" Usage: ++" let regexp = s:Wholematch(getline("."), 'foo\|bar', col(".")-1) ++" let i = match(getline("."), regexp) ++" let j = matchend(getline("."), regexp) ++" let match = matchstr(getline("."), regexp) ++fun! s:Wholematch(string, pat, start) ++ let group = '\%(' . a:pat . '\)' ++ let prefix = (a:start ? '\(^.*\%<' . (a:start + 2) . 'c\)\zs' : '^') ++ let len = strlen(a:string) ++ let suffix = (a:start+1 < len ? '\(\%>'.(a:start+1).'c.*$\)\@=' : '$') ++ if a:string !~ prefix . group . suffix ++ let prefix = '' ++ endif ++ return prefix . group . suffix ++endfun ++ ++" No extra arguments: s:Ref(string, d) will ++" find the d'th occurrence of '\(' and return it, along with everything up ++" to and including the matching '\)'. ++" One argument: s:Ref(string, d, "start") returns the index of the start ++" of the d'th '\(' and any other argument returns the length of the group. ++" Two arguments: s:Ref(string, d, "foo", "bar") returns a string to be ++" executed, having the effect of ++" :let foo = s:Ref(string, d, "start") ++" :let bar = s:Ref(string, d, "len") ++fun! s:Ref(string, d, ...) ++ let len = strlen(a:string) ++ if a:d == 0 ++ let start = 0 ++ else ++ let cnt = a:d ++ let match = a:string ++ while cnt ++ let cnt = cnt - 1 ++ let index = matchend(match, s:notslash . '\\(') ++ if index == -1 ++ return "" ++ endif ++ let match = strpart(match, index) ++ endwhile ++ let start = len - strlen(match) ++ if a:0 == 1 && a:1 == "start" ++ return start - 2 ++ endif ++ let cnt = 1 ++ while cnt ++ let index = matchend(match, s:notslash . '\\(\|\\)') - 1 ++ if index == -2 ++ return "" ++ endif ++ " Increment if an open, decrement if a ')': ++ let cnt = cnt + (match[index]=="(" ? 1 : -1) " ')' ++ " let cnt = stridx('0(', match[index]) + cnt ++ let match = strpart(match, index+1) ++ endwhile ++ let start = start - 2 ++ let len = len - start - strlen(match) ++ endif ++ if a:0 == 1 ++ return len ++ elseif a:0 == 2 ++ return "let " . a:1 . "=" . start . "| let " . a:2 . "=" . len ++ else ++ return strpart(a:string, start, len) ++ endif ++endfun ++ ++" Count the number of disjoint copies of pattern in string. ++" If the pattern is a literal string and contains no '0' or '1' characters ++" then s:Count(string, pattern, '0', '1') should be faster than ++" s:Count(string, pattern). ++fun! s:Count(string, pattern, ...) ++ let pat = escape(a:pattern, '\\') ++ if a:0 > 1 ++ let foo = substitute(a:string, '[^'.a:pattern.']', "a:1", "g") ++ let foo = substitute(a:string, pat, a:2, "g") ++ let foo = substitute(foo, '[^' . a:2 . ']', "", "g") ++ return strlen(foo) ++ endif ++ let result = 0 ++ let foo = a:string ++ let index = matchend(foo, pat) ++ while index != -1 ++ let result = result + 1 ++ let foo = strpart(foo, index) ++ let index = matchend(foo, pat) ++ endwhile ++ return result ++endfun ++ ++" s:Resolve('\(a\)\(b\)', '\(c\)\2\1\1\2') should return table.word, where ++" word = '\(c\)\(b\)\(a\)\3\2' and table = '-32-------'. That is, the first ++" '\1' in target is replaced by '\(a\)' in word, table[1] = 3, and this ++" indicates that all other instances of '\1' in target are to be replaced ++" by '\3'. The hard part is dealing with nesting... ++" Note that ":" is an illegal character for source and target, ++" unless it is preceded by "\". ++fun! s:Resolve(source, target, output) ++ let word = a:target ++ let i = matchend(word, s:notslash . '\\\d') - 1 ++ let table = "----------" ++ while i != -2 " There are back references to be replaced. ++ let d = word[i] ++ let backref = s:Ref(a:source, d) ++ " The idea is to replace '\d' with backref. Before we do this, ++ " replace any \(\) groups in backref with :1, :2, ... if they ++ " correspond to the first, second, ... group already inserted ++ " into backref. Later, replace :1 with \1 and so on. The group ++ " number w+b within backref corresponds to the group number ++ " s within a:source. ++ " w = number of '\(' in word before the current one ++ let w = s:Count( ++ \ substitute(strpart(word, 0, i-1), '\\\\', '', 'g'), '\(', '1') ++ let b = 1 " number of the current '\(' in backref ++ let s = d " number of the current '\(' in a:source ++ while b <= s:Count(substitute(backref, '\\\\', '', 'g'), '\(', '1') ++ \ && s < 10 ++ if table[s] == "-" ++ if w + b < 10 ++ " let table[s] = w + b ++ let table = strpart(table, 0, s) . (w+b) . strpart(table, s+1) ++ endif ++ let b = b + 1 ++ let s = s + 1 ++ else ++ execute s:Ref(backref, b, "start", "len") ++ let ref = strpart(backref, start, len) ++ let backref = strpart(backref, 0, start) . ":". table[s] ++ \ . strpart(backref, start+len) ++ let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1') ++ endif ++ endwhile ++ let word = strpart(word, 0, i-1) . backref . strpart(word, i+1) ++ let i = matchend(word, s:notslash . '\\\d') - 1 ++ endwhile ++ let word = substitute(word, s:notslash . '\zs:', '\\', 'g') ++ if a:output == "table" ++ return table ++ elseif a:output == "word" ++ return word ++ else ++ return table . word ++ endif ++endfun ++ ++" Assume a:comma = ",". Then the format for a:patterns and a:1 is ++" a:patterns = ",,..." ++" a:1 = ",,..." ++" If is the first pattern that matches a:string then return ++" if no optional arguments are given; return , if a:1 is given. ++fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...) ++ let tail = (a:patterns =~ a:comma."$" ? a:patterns : a:patterns . a:comma) ++ let i = matchend(tail, s:notslash . a:comma) ++ if a:0 ++ let alttail = (a:1 =~ a:comma."$" ? a:1 : a:1 . a:comma) ++ let j = matchend(alttail, s:notslash . a:comma) ++ endif ++ let current = strpart(tail, 0, i-1) ++ if a:branch == "" ++ let currpat = current ++ else ++ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') ++ endif ++ while a:string !~ a:prefix . currpat . a:suffix ++ let tail = strpart(tail, i) ++ let i = matchend(tail, s:notslash . a:comma) ++ if i == -1 ++ return -1 ++ endif ++ let current = strpart(tail, 0, i-1) ++ if a:branch == "" ++ let currpat = current ++ else ++ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') ++ endif ++ if a:0 ++ let alttail = strpart(alttail, j) ++ let j = matchend(alttail, s:notslash . a:comma) ++ endif ++ endwhile ++ if a:0 ++ let current = current . a:comma . strpart(alttail, 0, j-1) ++ endif ++ return current ++endfun ++ ++" Call this function to turn on debugging information. Every time the main ++" script is run, buffer variables will be saved. These can be used directly ++" or viewed using the menu items below. ++if !exists(":MatchDebug") ++ command! -nargs=0 MatchDebug call s:Match_debug() ++endif ++ ++fun! s:Match_debug() ++ let b:match_debug = 1 " Save debugging information. ++ " pat = all of b:match_words with backrefs parsed ++ amenu &Matchit.&pat :echo b:match_pat ++ " match = bit of text that is recognized as a match ++ amenu &Matchit.&match :echo b:match_match ++ " curcol = cursor column of the start of the matching text ++ amenu &Matchit.&curcol :echo b:match_col ++ " wholeBR = matching group, original version ++ amenu &Matchit.wh&oleBR :echo b:match_wholeBR ++ " iniBR = 'if' piece, original version ++ amenu &Matchit.ini&BR :echo b:match_iniBR ++ " ini = 'if' piece, with all backrefs resolved from match ++ amenu &Matchit.&ini :echo b:match_ini ++ " tail = 'else\|endif' piece, with all backrefs resolved from match ++ amenu &Matchit.&tail :echo b:match_tail ++ " fin = 'endif' piece, with all backrefs resolved from match ++ amenu &Matchit.&word :echo b:match_word ++ " '\'.d in ini refers to the same thing as '\'.table[d] in word. ++ amenu &Matchit.t&able :echo '0:' . b:match_table . ':9' ++endfun ++ ++" Jump to the nearest unmatched "(" or "if" or "" if a:spflag == "bW" ++" or the nearest unmatched "" or "endif" or ")" if a:spflag == "W". ++" Return a "mark" for the original position, so that ++" let m = MultiMatch("bW", "n") ... execute m ++" will return to the original position. If there is a problem, do not ++" move the cursor and return "", unless a count is given, in which case ++" go up or down as many levels as possible and again return "". ++" TODO This relies on the same patterns as % matching. It might be a good ++" idea to give it its own matching patterns. ++fun! s:MultiMatch(spflag, mode) ++ if !exists("b:match_words") || b:match_words == "" ++ return "" ++ end ++ let restore_options = (&ic ? "" : "no") . "ignorecase" ++ if exists("b:match_ignorecase") ++ let &ignorecase = b:match_ignorecase ++ endif ++ let startline = line(".") ++ let startcol = col(".") ++ ++ " First step: if not already done, set the script variables ++ " s:do_BR flag for whether there are backrefs ++ " s:pat parsed version of b:match_words ++ " s:all regexp based on s:pat and the default groups ++ " This part is copied and slightly modified from s:Match_wrapper(). ++ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . ++ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' ++ " Allow b:match_words = "GetVimMatchWords()" . ++ if b:match_words =~ ":" ++ let match_words = b:match_words ++ else ++ execute "let match_words =" b:match_words ++ endif ++ if (match_words != s:last_words) || (&mps != s:last_mps) || ++ \ exists("b:match_debug") ++ let s:last_words = match_words ++ let s:last_mps = &mps ++ if match_words !~ s:notslash . '\\\d' ++ let s:do_BR = 0 ++ let s:pat = match_words ++ else ++ let s:do_BR = 1 ++ let s:pat = s:ParseWords(match_words) ++ endif ++ let s:all = '\%(' . substitute(s:pat . (strlen(s:pat)?",":"") . default, ++ \ '[,:]\+','\\|','g') . '\)' ++ if exists("b:match_debug") ++ let b:match_pat = s:pat ++ endif ++ endif ++ ++ " Second step: figure out the patterns for searchpair() ++ " and save the screen, cursor position, and 'ignorecase'. ++ " - TODO: A lot of this is copied from s:Match_wrapper(). ++ " - maybe even more functionality should be split off ++ " - into separate functions! ++ let cdefault = (s:pat =~ '[^,]$' ? "," : "") . default ++ let open = substitute(s:pat . cdefault, ++ \ s:notslash . '\zs:.\{-}' . s:notslash . ',', '\\),\\(', 'g') ++ let open = '\(' . substitute(open, s:notslash . '\zs:.*$', '\\)', '') ++ let close = substitute(s:pat . cdefault, ++ \ s:notslash . '\zs,.\{-}' . s:notslash . ':', '\\),\\(', 'g') ++ let close = substitute(close, '^.\{-}' . s:notslash . ':', '\\(', '') . '\)' ++ if exists("b:match_skip") ++ let skip = b:match_skip ++ elseif exists("b:match_comment") " backwards compatibility and testing! ++ let skip = "r:" . b:match_comment ++ else ++ let skip = 's:comment\|string' ++ endif ++ let skip = s:ParseSkip(skip) ++ " let restore_cursor = line(".") . "G" . virtcol(".") . "|" ++ " normal! H ++ " let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ let restore_cursor = virtcol(".") . "|" ++ normal! g0 ++ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor ++ normal! H ++ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ execute restore_cursor ++ ++ " Third step: call searchpair(). ++ " Replace '\('--but not '\\('--with '\%(' and ',' with '\|'. ++ let openpat = substitute(open, '\(\\\@" or ... ++" and return "endif" or "endwhile" or "" or ... . ++" For now, this uses b:match_words and the same script variables ++" as s:Match_wrapper() . Later, it may get its own patterns, ++" either from a buffer variable or passed as arguments. ++" fun! s:Autocomplete() ++" echo "autocomplete not yet implemented :-(" ++" if !exists("b:match_words") || b:match_words == "" ++" return "" ++" end ++" let startpos = s:MultiMatch("bW") ++" ++" if startpos == "" ++" return "" ++" endif ++" " - TODO: figure out whether 'if' or '' matched, and construct ++" " - the appropriate closing. ++" let matchline = getline(".") ++" let curcol = col(".") - 1 ++" " - TODO: Change the s:all argument if there is a new set of match pats. ++" let regexp = s:Wholematch(matchline, s:all, curcol) ++" let suf = strlen(matchline) - matchend(matchline, regexp) ++" let prefix = (curcol ? '^.\{' . curcol . '}\%(' : '^\%(') ++" let suffix = (suf ? '\).\{' . suf . '}$' : '\)$') ++" " Reconstruct the version with unresolved backrefs. ++" let patBR = substitute(b:match_words.',', '[,:]*,[,:]*', ',', 'g') ++" let patBR = substitute(patBR, ':\{2,}', ':', "g") ++" " Now, set group and groupBR to the matching group: 'if:endif' or ++" " 'while:endwhile' or whatever. ++" let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) ++" let i = matchend(group, s:notslash . ",") ++" let groupBR = strpart(group, i) ++" let group = strpart(group, 0, i-1) ++" " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix ++" if s:do_BR ++" let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++" endif ++" " let g:group = group ++" ++" " - TODO: Construct the closing from group. ++" let fake = "end" . expand("") ++" execute startpos ++" return fake ++" endfun ++ ++" Close all open structures. "Get the heck out of here!" ++" fun! s:Gthhoh() ++" let close = s:Autocomplete() ++" while strlen(close) ++" put=close ++" let close = s:Autocomplete() ++" endwhile ++" endfun ++ ++" Parse special strings as typical skip arguments for searchpair(): ++" s:foo becomes (current syntax item) =~ foo ++" S:foo becomes (current syntax item) !~ foo ++" r:foo becomes (line before cursor) =~ foo ++" R:foo becomes (line before cursor) !~ foo ++fun! s:ParseSkip(str) ++ let skip = a:str ++ if skip[1] == ":" ++ if skip[0] == "s" ++ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" . ++ \ strpart(skip,2) . "'" ++ elseif skip[0] == "S" ++ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" . ++ \ strpart(skip,2) . "'" ++ elseif skip[0] == "r" ++ let skip = "strpart(getline('.'),0,col('.'))=~'" . strpart(skip,2). "'" ++ elseif skip[0] == "R" ++ let skip = "strpart(getline('.'),0,col('.'))!~'" . strpart(skip,2). "'" ++ endif ++ endif ++ return skip ++endfun ++ ++let &cpo = s:save_cpo ++ ++" vim:sts=2:sw=2: +diff -urN vim71/1/plugin/NERD_commenter.vim vim71_ada/1/plugin/NERD_commenter.vim +--- vim71/1/plugin/NERD_commenter.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/NERD_commenter.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,4553 @@ ++" vim global plugin that provides easy code commenting for various file types ++" Last Change: 29 sep 2007 ++" Maintainer: Martin Grenfell ++let s:NERD_commenter_version = 2.1.4 ++ ++" For help documentation type :help NERDCommenter. If this fails, Restart vim ++" and try again. If it sill doesnt work... the help page is at the bottom ++" of this file. ++ ++" Section: script init stuff {{{1 ++if exists("loaded_nerd_comments") ++ finish ++endif ++if v:version < 700 ++ echoerr "NERDCommenter: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!" ++ finish ++endif ++let loaded_nerd_comments = 1 ++ ++" Section: spaces init {{{2 ++" Occasionally we need to grab a string of spaces so just make one here ++let s:spaces = "" ++while strlen(s:spaces) < 100 ++ let s:spaces = s:spaces . " " ++endwhile ++ ++" Function: s:InitVariable() function {{{2 ++" This function is used to initialise a given variable to a given value. The ++" variable is only initialised if it does not exist prior ++" ++" Args: ++" -var: the name of the var to be initialised ++" -value: the value to initialise var to ++" ++" Returns: ++" 1 if the var is set, 0 otherwise ++function s:InitVariable(var, value) ++ if !exists(a:var) ++ exec 'let ' . a:var . ' = ' . "'" . a:value . "'" ++ return 1 ++ endif ++ return 0 ++endfunction ++ ++" Section: space string init{{{2 ++" When putting spaces after the left delim and before the right we use ++" s:spaceStr for the space char. This way we can make it add anything after ++" the left and before the right by modifying this variable ++let s:spaceStr = ' ' ++let s:lenSpaceStr = strlen(s:spaceStr) ++ ++" Section: variable init calls {{{2 ++call s:InitVariable("g:NERDAllowAnyVisualDelims", 1) ++call s:InitVariable("g:NERDBlockComIgnoreEmpty", 0) ++call s:InitVariable("g:NERDCommentWholeLinesInVMode", 0) ++call s:InitVariable("g:NERDCompactSexyComs", 0) ++call s:InitVariable("g:NERDDefaultNesting", 0) ++call s:InitVariable("g:NERDMenuMode", 3) ++call s:InitVariable("g:NERDLPlace", "[>") ++call s:InitVariable("g:NERDUsePlaceHolders", 1) ++call s:InitVariable("g:NERDRemoveAltComs", 1) ++call s:InitVariable("g:NERDRemoveExtraSpaces", 0) ++call s:InitVariable("g:NERDRPlace", "<]") ++call s:InitVariable("g:NERDShutUp", '0') ++call s:InitVariable("g:NERDSpaceDelims", 0) ++call s:InitVariable("g:NERDDelimiterRequests", 1) ++ ++call s:InitVariable("g:NERDMapleader", ',c') ++ ++call s:InitVariable("g:NERDAltComMap", g:NERDMapleader . 'a') ++call s:InitVariable("g:NERDAppendComMap", g:NERDMapleader . 'A') ++call s:InitVariable("g:NERDComAlignBothMap", g:NERDMapleader . 'b') ++call s:InitVariable("g:NERDComAlignLeftMap", g:NERDMapleader . 'l') ++call s:InitVariable("g:NERDComAlignRightMap", g:NERDMapleader . 'r') ++call s:InitVariable("g:NERDComInInsertMap", '') ++call s:InitVariable("g:NERDComLineInvertMap", g:NERDMapleader . 'i') ++call s:InitVariable("g:NERDComLineMap", g:NERDMapleader . 'c') ++call s:InitVariable("g:NERDComLineNestMap", g:NERDMapleader . 'n') ++call s:InitVariable("g:NERDComLineSexyMap", g:NERDMapleader . 's') ++call s:InitVariable("g:NERDComLineToggleMap", g:NERDMapleader . '') ++call s:InitVariable("g:NERDComLineMinimalMap", g:NERDMapleader . 'm') ++call s:InitVariable("g:NERDComLineYankMap", g:NERDMapleader . 'y') ++call s:InitVariable("g:NERDComToEOLMap", g:NERDMapleader . '$') ++call s:InitVariable("g:NERDPrependComMap", g:NERDMapleader . 'I') ++call s:InitVariable("g:NERDUncomLineMap", g:NERDMapleader . 'u') ++let s:NERDFileNameEscape="[]#*$%'\" ?`!&();<>\\" ++ ++" Section: Comment mapping functions, autocommands and commands {{{1 ++" ============================================================================ ++" Section: Comment enabler autocommands {{{2 ++" ============================================================================ ++ ++if !exists("nerd_autocmds_loaded") ++ let nerd_autocmds_loaded=1 ++ ++ augroup commentEnablers ++ ++ "if the user enters a buffer or reads a buffer then we gotta set up ++ "the comment delimiters for that new filetype ++ autocmd BufEnter,BufRead * :call s:SetUpForNewFiletype(&filetype, 0) ++ ++ "if the filetype of a buffer changes, force the script to reset the ++ "delims for the buffer ++ autocmd Filetype * :call s:SetUpForNewFiletype(&filetype, 1) ++ augroup END ++ ++endif ++ ++ ++" Function: s:SetUpForNewFiletype(filetype) function {{{2 ++" This function is responsible for setting up buffer scoped variables for the ++" given filetype. ++" ++" These variables include the comment delimiters for the given filetype and calls ++" MapDelimiters or MapDelimitersWithAlternative passing in these delimiters. ++" ++" Args: ++" -filetype: the filetype to set delimiters for ++" -forceReset: 1 if the delimiters should be reset if they have already be ++" set for this buffer. ++" ++function s:SetUpForNewFiletype(filetype, forceReset) ++ "if we have already set the delimiters for this buffer then dont go thru ++ "it again ++ if !a:forceReset && exists("b:left") && b:left != '' ++ return ++ endif ++ ++ let b:sexyComMarker = '' ++ ++ "check the filetype against all known filetypes to see if we have ++ "hardcoded the comment delimiters to use ++ if a:filetype == "" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "abaqus" ++ call s:MapDelimiters('**', '') ++ elseif a:filetype == "abc" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "acedb" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "ada" ++ call s:MapDelimitersWithAlternative('--','', '-- ', '') ++ elseif a:filetype == "ahdl" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "ahk" ++ call s:MapDelimitersWithAlternative(';', '', '/*', '*/') ++ elseif a:filetype == "amiga" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "aml" ++ call s:MapDelimiters('/*', '') ++ elseif a:filetype == "ampl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ant" ++ call s:MapDelimiters('') ++ elseif a:filetype == "apache" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "apachestyle" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "asm68k" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "asm" ++ call s:MapDelimitersWithAlternative(';', '', '#', '') ++ elseif a:filetype == "asn" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "aspvbs" ++ call s:MapDelimiters('''', '') ++ elseif a:filetype == "atlas" ++ call s:MapDelimiters('C','$') ++ elseif a:filetype == "autohotkey" ++ call s:MapDelimiters(';','') ++ elseif a:filetype == "autoit" ++ call s:MapDelimiters(';','') ++ elseif a:filetype == "automake" ++ call s:MapDelimitersWithAlternative('#','', 'dnl ', '') ++ elseif a:filetype == "ave" ++ call s:MapDelimiters("'",'') ++ elseif a:filetype == "awk" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "basic" ++ call s:MapDelimitersWithAlternative("'",'', 'REM ', '') ++ elseif a:filetype == "b" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "bc" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "bdf" ++ call s:MapDelimiters('COMMENT ', '') ++ elseif a:filetype == "bib" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "bindzone" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "bst" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "btm" ++ call s:MapDelimiters('::', '') ++ elseif a:filetype == "caos" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "catalog" ++ call s:MapDelimiters('--','--') ++ elseif a:filetype == "c" ++ call s:MapDelimitersWithAlternative('/*','*/', '//', '') ++ elseif a:filetype == "cfg" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "cg" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "ch" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "changelog" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "cl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "clean" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "clipper" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "cmake" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "conf" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "config" ++ call s:MapDelimiters('dnl ', '') ++ elseif a:filetype == "context" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "cpp" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "crontab" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "cs" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "csc" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "csp" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "css" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "cterm" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "cupl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "csv" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "cvs" ++ call s:MapDelimiters('CVS:','') ++ elseif a:filetype == "dcl" ++ call s:MapDelimiters('$!', '') ++ elseif a:filetype == "debchangelog" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "debcontrol" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "debsources" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "def" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "desktop" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "diff" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "django" ++ call s:MapDelimitersWithAlternative('', '{#', '#}') ++ elseif a:filetype == "docbk" ++ call s:MapDelimiters('') ++ elseif a:filetype == "dns" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dosbatch" ++ call s:MapDelimiters('REM ','') ++ elseif a:filetype == "dosini" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dot" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "dracula" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dsl" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dtd" ++ call s:MapDelimiters('') ++ elseif a:filetype == "dtml" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "dylan" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == 'ebuild' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ecd" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == 'eclass' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "eiffel" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "elf" ++ call s:MapDelimiters("'", '') ++ elseif a:filetype == "elmfilt" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "erlang" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "eruby" ++ call s:MapDelimitersWithAlternative('', '<%#', '%>') ++ elseif a:filetype == "eterm" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "expect" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "exports" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fetchmail" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fgl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "focexec" ++ call s:MapDelimiters('-*', '') ++ elseif a:filetype == "form" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "fortran" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "foxpro" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "fstab" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fvwm" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fx" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "gams" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "gdb" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "gdmo" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "geek" ++ call s:MapDelimiters('GEEK_COMMENT:', '') ++ elseif a:filetype == 'gentoo-package-keywords' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == 'gentoo-package-mask' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == 'gentoo-package-use' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "gnuplot" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "groovy" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "gtkrc" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "haskell" ++ call s:MapDelimitersWithAlternative('--','', '{-', '-}') ++ elseif a:filetype == "hb" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "h" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "help" ++ call s:MapDelimiters('"','') ++ elseif a:filetype == "hercules" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "hog" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "html" ++ call s:MapDelimitersWithAlternative('', '//', '') ++ elseif a:filetype == "htmldjango" ++ call s:MapDelimitersWithAlternative('', '{#', '#}') ++ elseif a:filetype == "htmlos" ++ call s:MapDelimiters('#','/#') ++ elseif a:filetype == "ia64" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "icon" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "idlang" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "idl" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "indent" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "inform" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "inittab" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ishd" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "iss" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "ist" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "jam" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "java" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "javascript" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "jess" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "jgraph" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "jproperties" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "jsp" ++ call s:MapDelimiters('<%--', '--%>') ++ elseif a:filetype == "kconfig" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "kix" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "kscript" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "lace" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "ldif" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lex" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "lftp" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lifelines" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "lilo" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lisp" ++ call s:MapDelimitersWithAlternative(';','', '#|', '|#') ++ elseif a:filetype == "lite" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "lookupfile" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "lotos" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "lout" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lprolog" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "lscript" ++ call s:MapDelimiters("'", '') ++ elseif a:filetype == "lss" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lua" ++ call s:MapDelimitersWithAlternative('--','', '--[[', ']]') ++ elseif a:filetype == "lynx" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "m4" ++ call s:MapDelimiters('dnl ', '') ++ elseif a:filetype == "mail" ++ call s:MapDelimiters('> ','') ++ elseif a:filetype == "make" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "maple" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "masm" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "master" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "matlab" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "mel" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "mf" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "mib" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "mma" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "model" ++ call s:MapDelimiters('$','$') ++ elseif a:filetype =~ "moduala." ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "modula2" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "modula3" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "monk" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "mush" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "muttrc" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "named" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "nasm" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "nastran" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "natural" ++ call s:MapDelimiters('/*', '') ++ elseif a:filetype == "ncf" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "netdict" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "netrw" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "nqc" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "nroff" ++ call s:MapDelimiters('\"', '') ++ elseif a:filetype == "nsis" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "objc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "ocaml" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "occam" ++ call s:MapDelimiters('--','') ++ elseif a:filetype == "omlet" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "omnimark" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "openroad" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "opl" ++ call s:MapDelimiters("REM", "") ++ elseif a:filetype == "ora" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "otl" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "ox" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "pascal" ++ call s:MapDelimitersWithAlternative('{','}', '(*', '*)') ++ elseif a:filetype == "passwd" ++ call s:MapDelimitersWith('','') ++ elseif a:filetype == "pcap" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "pccts" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "perl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "pfmain" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "php" ++ call s:MapDelimitersWithAlternative('//','','/*', '*/') ++ elseif a:filetype == "phtml" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "pic" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "pike" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "pilrc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "pine" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "plaintex" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "plm" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "plsql" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "po" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "postscr" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "pov" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "povini" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "ppd" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "ppwiz" ++ call s:MapDelimiters(';;', '') ++ elseif a:filetype == "procmail" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "progress" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "prolog" ++ call s:MapDelimitersWithAlternative('%','','/*','*/') ++ elseif a:filetype == "psf" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ptcap" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "python" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "qf" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "radiance" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "Rails-log" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "ratpoison" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "r" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "readline" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rebol" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "registry" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "remind" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rexx" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "robots" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rpl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "rst" ++ call s:MapDelimiters('..', '') ++ elseif a:filetype == "rtf" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "ruby" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "sa" ++ call s:MapDelimiters('--','') ++ elseif a:filetype == "samba" ++ call s:MapDelimitersWithAlternative(';','', '#', '') ++ elseif a:filetype == "sas" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "sass" ++ call s:MapDelimitersWithAlternative('//','', '/*', '') ++ elseif a:filetype == "sather" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "scheme" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "scilab" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "screen" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "scsh" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "sdl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "sed" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "selectbuf" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "sgml" ++ call s:MapDelimiters('') ++ elseif a:filetype == "sgmldecl" ++ call s:MapDelimiters('--','--') ++ elseif a:filetype == "sgmllnx" ++ call s:MapDelimiters('') ++ elseif a:filetype == "sicad" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "simula" ++ call s:MapDelimitersWithAlternative('%', '', '--', '') ++ elseif a:filetype == "sinda" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "skill" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "slang" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "sl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "slrnrc" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "sm" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "smarty" ++ call s:MapDelimiters('{*', '*}') ++ elseif a:filetype == "smil" ++ call s:MapDelimiters('') ++ elseif a:filetype == "smith" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "sml" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "snnsnet" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "snnspat" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "snnsres" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "snobol4" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "spec" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "specman" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "spice" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "sql" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "sqlforms" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "sqlj" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "sqr" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "squid" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "st" ++ call s:MapDelimiters('"','') ++ elseif a:filetype == "stp" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "strace" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "svn" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "SVNcommitlog" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "systemverilog" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "tads" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "taglist" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "tags" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "tak" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "tasm" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "tcl" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "terminfo" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "tex" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "text" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "texinfo" ++ call s:MapDelimiters("@c ", "") ++ elseif a:filetype == "texmf" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "tf" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "tidy" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "tli" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "trasys" ++ call s:MapDelimiters("$", "") ++ elseif a:filetype == "tsalt" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "tsscl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "tssgm" ++ call s:MapDelimiters("comment = '","'") ++ elseif a:filetype == "uc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "uil" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "vb" ++ call s:MapDelimiters("'","") ++ elseif a:filetype == "vcscommit" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "vera" ++ call s:MapDelimitersWithAlternative('/*','*/','//','') ++ elseif a:filetype == "verilog" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "verilog_systemverilog" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "vgrindefs" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "vhdl" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "vim" ++ call s:MapDelimiters('"','') ++ elseif a:filetype == "viminfo" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "virata" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "vo_base" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "vrml" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "vsejcl" ++ call s:MapDelimiters('/*', '') ++ elseif a:filetype == "webmacro" ++ call s:MapDelimiters('##', '') ++ elseif a:filetype == "wget" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "winbatch" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "wml" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype =~ "[^w]*sh" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "wvdial" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "xdefaults" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "xf86conf" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "xhtml" ++ call s:MapDelimiters('') ++ elseif a:filetype == "xkb" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "xmath" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "xml" ++ call s:MapDelimiters('') ++ elseif a:filetype == "xmodmap" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "xpm2" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "xpm" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "xsd" ++ call s:MapDelimiters('') ++ elseif a:filetype == "xslt" ++ call s:MapDelimiters('') ++ elseif a:filetype == "yacc" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "yaml" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "z8a" ++ call s:MapDelimiters(';', '') ++ ++ elseif a:filetype == "" ++ call s:MapDelimitersWithAlternative("","", "", "") ++ ++ "we have not hardcoded the comment delimiters to use for this filetype so ++ "get them from &commentstring. ++ else ++ "print a disclaimer to the user :) ++ if !g:NERDShutUp ++ call s:NerdEcho("Unknown filetype '".a:filetype."', setting delimiters by &commentstring.\nPleeeeease email the author of the NERD commenter with this filetype\nand its delimiters!", 0) ++ endif ++ ++ "extract the delims from &commentstring ++ let left= substitute(&commentstring, '\(.*\)%s.*', '\1', '') ++ let right= substitute(&commentstring, '.*%s\(.*\)', '\1', 'g') ++ ++ call s:MapDelimiters(left,right) ++ endif ++endfunction ++ ++" Function: s:MapDelimiters(left, right) function {{{2 ++" This function is a wrapper for s:MapDelimiters(left, right, leftAlt, rightAlt, useAlt) and is called when there ++" is no alternative comment delimiters for the current filetype ++" ++" Args: ++" -left: the left comment delimiter ++" -right: the right comment delimiter ++function s:MapDelimiters(left, right) ++ call s:MapDelimitersWithAlternative(a:left, a:right, "", "") ++endfunction ++ ++" Function: s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) function {{{2 ++" this function sets up the comment delimiter buffer variables ++" ++" Args: ++" -left: the string defining the comment start delimiter ++" -right: the string defining the comment end delimiter ++" -leftAlt: the string for the alternative comment style defining the comment start delimiter ++" -rightAlt: the string for the alternative comment style defining the comment end delimiter ++function s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) ++ if !exists('g:NERD_' . &filetype . '_alt_style') ++ let b:left = a:left ++ let b:right = a:right ++ let b:leftAlt = a:leftAlt ++ let b:rightAlt = a:rightAlt ++ else ++ let b:left = a:leftAlt ++ let b:right = a:rightAlt ++ let b:leftAlt = a:left ++ let b:rightAlt = a:right ++ endif ++endfunction ++ ++" Function: s:SwitchToAlternativeDelimiters(printMsgs) function {{{2 ++" This function is used to swap the delimiters that are being used to the ++" alternative delimiters for that filetype. For example, if a c++ file is ++" being edited and // comments are being used, after this function is called ++" /**/ comments will be used. ++" ++" Args: ++" -printMsgs: if this is 1 then a message is echoed to the user telling them ++" if this function changed the delimiters or not ++function s:SwitchToAlternativeDelimiters(printMsgs) ++ "if both of the alternative delimiters are empty then there is no ++ "alternative comment style so bail out ++ if !s:HasMultipartDelims() ++ if a:printMsgs ++ call s:NerdEcho("Cannot use alternative delimiters, none are specified", 0) ++ endif ++ return 0 ++ endif ++ ++ "save the current delimiters ++ let tempLeft = b:left ++ let tempRight = b:right ++ ++ "swap current delimiters for alternative ++ let b:left = b:leftAlt ++ let b:right = b:rightAlt ++ ++ "set the previously current delimiters to be the new alternative ones ++ let b:leftAlt = tempLeft ++ let b:rightAlt = tempRight ++ ++ "tell the user what comment delimiters they are now using ++ if a:printMsgs ++ let leftNoEsc = b:left ++ let rightNoEsc = b:right ++ call s:NerdEcho("Now using " . leftNoEsc . " " . rightNoEsc . " to delimit comments", 1) ++ endif ++ ++ return 1 ++endfunction ++ ++" Section: Comment delimiter add/removal functions {{{1 ++" ============================================================================ ++" Function: s:AppendCommentToLine(){{{2 ++" This function appends comment delimiters at the EOL and places the cursor in ++" position to start typing the comment ++function s:AppendCommentToLine() ++ let left = s:GetLeft(0,1,0) ++ let right = s:GetRight(0,1,0) ++ ++ " get the len of the right delim ++ let lenRight = strlen(right) ++ ++ let isLineEmpty = strlen(getline(".")) == 0 ++ let insOrApp = (isLineEmpty==1 ? 'i' : 'A') ++ ++ "stick the delimiters down at the end of the line. We have to format the ++ "comment with spaces as appropriate ++ execute ":normal " . insOrApp . (isLineEmpty ? '' : ' ') . left . right . " " ++ ++ " if there is a right delimiter then we gotta move the cursor left ++ " by the len of the right delimiter so we insert between the delimiters ++ if lenRight > 0 ++ let leftMoveAmount = lenRight ++ execute ":normal " . leftMoveAmount . "h" ++ endif ++ startinsert ++endfunction ++ ++" Function: s:CommentBlock(top, bottom, lSide, rSide, forceNested ) {{{2 ++" This function is used to comment out a region of code. This region is ++" specified as a bounding box by arguments to the function. ++" ++" Args: ++" -top: the line number for the top line of code in the region ++" -bottom: the line number for the bottom line of code in the region ++" -lSide: the column number for the left most column in the region ++" -rSide: the column number for the right most column in the region ++" -forceNested: a flag indicating whether comments should be nested ++function s:CommentBlock(top, bottom, lSide, rSide, forceNested ) ++ " we need to create local copies of these arguments so we can modify them ++ let top = a:top ++ let bottom = a:bottom ++ let lSide = a:lSide ++ let rSide = a:rSide ++ ++ "if the top or bottom line starts with tabs we have to adjust the left and ++ "right boundaries so that they are set as though the tabs were spaces ++ let topline = getline(top) ++ let bottomline = getline(bottom) ++ if s:HasLeadingTabs(topline, bottomline) ++ ++ "find out how many tabs are in the top line and adjust the left ++ "boundary accordingly ++ let numTabs = s:NumberOfLeadingTabs(topline) ++ if lSide < numTabs ++ let lSide = &ts * lSide ++ else ++ let lSide = (lSide - numTabs) + (&ts * numTabs) ++ endif ++ ++ "find out how many tabs are in the bottom line and adjust the right ++ "boundary accordingly ++ let numTabs = s:NumberOfLeadingTabs(bottomline) ++ let rSide = (rSide - numTabs) + (&ts * numTabs) ++ endif ++ ++ "we must check that bottom IS actually below top, if it is not then we ++ "swap top and bottom. Similarly for left and right. ++ if bottom < top ++ let temp = top ++ let top = bottom ++ let bottom = top ++ endif ++ if rSide < lSide ++ let temp = lSide ++ let lSide = rSide ++ let rSide = temp ++ endif ++ ++ "if the current delimiters arent multipart then we will switch to the ++ "alternative delims (if THEY are) as the comment will be better and more ++ "accurate with multipart delims ++ let switchedDelims = 0 ++ if !s:Multipart() && g:NERDAllowAnyVisualDelims && s:AltMultipart() ++ let switchedDelims = 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++ ++ "start the commenting from the top and keep commenting till we reach the ++ "bottom ++ let currentLine=top ++ while currentLine <= bottom ++ ++ "check if we are allowed to comment this line ++ if s:CanCommentLine(a:forceNested, currentLine) ++ ++ "convert the leading tabs into spaces ++ let theLine = getline(currentLine) ++ let lineHasLeadTabs = s:HasLeadingTabs(theLine) ++ if lineHasLeadTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ ++ "dont comment lines that begin after the right boundary of the ++ "block unless the user has specified to do so ++ if theLine !~ '^ \{' . rSide . '\}' || !g:NERDBlockComIgnoreEmpty ++ ++ "attempt to place the cursor in on the left of the boundary box, ++ "then check if we were successful, if not then we cant comment this ++ "line ++ call setline(currentLine, theLine) ++ if s:CanPlaceCursor(currentLine, lSide) ++ ++ let leftSpaced = s:GetLeft(0,1,0) ++ let rightSpaced = s:GetRight(0,1,0) ++ ++ "stick the left delimiter down ++ let theLine = strpart(theLine, 0, lSide-1) . leftSpaced . strpart(theLine, lSide-1) ++ ++ if s:Multipart() ++ "stick the right delimiter down ++ let theLine = strpart(theLine, 0, rSide+strlen(leftSpaced)) . rightSpaced . strpart(theLine, rSide+strlen(rightSpaced)) ++ ++ let firstLeftDelim = s:FindDelimiterIndex(b:left, theLine) ++ let lastRightDelim = s:LastIndexOfDelim(b:right, theLine) ++ ++ if firstLeftDelim != -1 && lastRightDelim != -1 ++ let searchStr = strpart(theLine, 0, lastRightDelim) ++ let searchStr = strpart(searchStr, firstLeftDelim+strlen(b:left)) ++ ++ "replace the outter most delims in searchStr with ++ "place-holders ++ let theLineWithPlaceHolders = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, searchStr) ++ ++ "add the right delimiter onto the line ++ let theLine = strpart(theLine, 0, firstLeftDelim+strlen(b:left)) . theLineWithPlaceHolders . strpart(theLine, lastRightDelim) ++ endif ++ endif ++ endif ++ endif ++ ++ "restore tabs if needed ++ if lineHasLeadTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ call setline(currentLine, theLine) ++ endif ++ ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ "if we switched delims then we gotta go back to what they were before ++ if switchedDelims == 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++endfunction ++ ++" Function: s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) {{{2 ++" This function comments a range of lines. ++" ++" Args: ++" -forceNested: a flag indicating whether the called is requesting the comment ++" to be nested if need be ++" -alignRight/alignLeft: 0/1 if the comments delimiters should/shouldnt be ++" aligned left/right ++" -firstLine/lastLine: the top and bottom lines to comment ++function s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) ++ " we need to get the left and right indexes of the leftmost char in the ++ " block of of lines and the right most char so that we can do alignment of ++ " the delimiters if the user has specified ++ let leftAlignIndx = s:LeftMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) ++ let rightAlignIndx = s:RightMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) ++ ++ " gotta add the length of the left delimiter onto the rightAlignIndx cos ++ " we'll be adding a left delim to the line ++ let rightAlignIndx = rightAlignIndx + strlen(s:GetLeft(0,1,0)) ++ ++ " now we actually comment the lines. Do it line by line ++ let currentLine = a:firstLine ++ while currentLine <= a:lastLine ++ ++ " get the next line, check commentability and convert spaces to tabs ++ let theLine = getline(currentLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ if s:CanCommentLine(a:forceNested, currentLine) ++ "if the user has specified forceNesting then we check to see if we ++ "need to switch delimiters for place-holders ++ if a:forceNested && g:NERDUsePlaceHolders ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ endif ++ ++ " find out if the line is commented using normal delims and/or ++ " alternate ones ++ let isCommented = s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) ++ ++ " check if we can comment this line ++ if !isCommented || g:NERDUsePlaceHolders || s:Multipart() ++ if a:alignLeft ++ let theLine = s:AddLeftDelimAligned(b:left, theLine, leftAlignIndx) ++ else ++ let theLine = s:AddLeftDelim(s:GetLeft(0,1,0), theLine) ++ endif ++ if a:alignRight ++ let theLine = s:AddRightDelimAligned(b:right, theLine, rightAlignIndx) ++ else ++ let theLine = s:AddRightDelim(s:GetRight(0,1,0), theLine) ++ endif ++ endif ++ endif ++ ++ " restore leading tabs if appropriate ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ " we are done with this line ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++endfunction ++ ++" Function: s:CommentLinesMinimal(firstLine, lastLine) {{{2 ++" This function comments a range of lines in a minimal style. I ++" ++" Args: ++" -firstLine/lastLine: the top and bottom lines to comment ++function s:CommentLinesMinimal(firstLine, lastLine) ++ "check that minimal comments can be done on this filetype ++ if !s:HasMultipartDelims() ++ throw 'NERDCommenter.Delimiters exception: Minimal comments can only be used for filetypes that have multipart delimiters' ++ endif ++ ++ "if we need to use place holders for the comment, make sure they are ++ "enabled for this filetype ++ if !g:NERDUsePlaceHolders && s:DoesBlockHaveMultipartDelim(a:firstLine, a:lastLine) ++ throw 'NERDCommenter.Settings exception: Placeoholders are required but disabled.' ++ endif ++ ++ "get the left and right delims to smack on ++ let left = s:GetSexyComLeft(g:NERDSpaceDelims,0) ++ let right = s:GetSexyComRight(g:NERDSpaceDelims,0) ++ ++ "make sure all multipart delims on the lines are replaced with ++ "placeholders to prevent illegal syntax ++ let currentLine = a:firstLine ++ while(currentLine <= a:lastLine) ++ let theLine = getline(currentLine) ++ let theLine = s:ReplaceDelims(left, right, g:NERDLPlace, g:NERDRPlace, theLine) ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ "add the delim to the top line ++ let theLine = getline(a:firstLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let theLine = s:AddLeftDelim(left, theLine) ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:firstLine, theLine) ++ ++ "add the delim to the bottom line ++ let theLine = getline(a:lastLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let theLine = s:AddRightDelim(right, theLine) ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:lastLine, theLine) ++endfunction ++ ++" Function: s:CommentLinesSexy(topline, bottomline) function {{{2 ++" This function is used to comment lines in the 'Sexy' style. eg in c: ++" /* ++" * This is a sexy comment ++" */ ++" Args: ++" -topline: the line num of the top line in the sexy comment ++" -bottomline: the line num of the bottom line in the sexy comment ++function s:CommentLinesSexy(topline, bottomline) ++ let left = s:GetSexyComLeft(0, 0) ++ let right = s:GetSexyComRight(0, 0) ++ ++ "check if we can do a sexy comment with the available delimiters ++ if left == -1 || right == -1 ++ throw 'NERDCommenter.Delimiters exception: cannot perform sexy comments with available delimiters.' ++ endif ++ ++ "make sure the lines arent already commented sexually ++ if !s:CanSexyCommentLines(a:topline, a:bottomline) ++ throw 'NERDCommenter.Nesting exception: cannot nest sexy comments' ++ endif ++ ++ ++ let sexyComMarker = s:GetSexyComMarker(0,0) ++ let sexyComMarkerSpaced = s:GetSexyComMarker(1,0) ++ ++ ++ " we jam the comment as far to the right as possible ++ let leftAlignIndx = s:LeftMostIndx(1, 1, a:topline, a:bottomline) ++ ++ "check if we should use the compact style i.e that the left/right ++ "delimiters should appear on the first and last lines of the code and not ++ "on separate lines above/below the first/last lines of code ++ if g:NERDCompactSexyComs ++ let spaceString = (g:NERDSpaceDelims ? s:spaceStr : '') ++ ++ "comment the top line ++ let theLine = getline(a:topline) ++ let lineHasTabs = s:HasLeadingTabs(theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ let theLine = s:AddLeftDelimAligned(left . spaceString, theLine, leftAlignIndx) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:topline, theLine) ++ ++ "comment the bottom line ++ let theLine = getline(a:bottomline) ++ let lineHasTabs = s:HasLeadingTabs(theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ let theLine = s:AddRightDelim(spaceString . right, theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:bottomline, theLine) ++ else ++ ++ " add the left delimiter one line above the lines that are to be commented ++ call cursor(a:topline, 1) ++ execute 'normal! O' ++ call setline(a:topline, strpart(s:spaces, 0, leftAlignIndx) . left ) ++ ++ " add the right delimiter after bottom line (we have to add 1 cos we moved ++ " the lines down when we added the left delim ++ call cursor(a:bottomline+1, 1) ++ execute 'normal! o' ++ call setline(a:bottomline+2, strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . right ) ++ ++ endif ++ ++ " go thru each line adding the sexyComMarker marker to the start of each ++ " line in the appropriate place to align them with the comment delims ++ let currentLine = a:topline+1 ++ while currentLine <= a:bottomline + !g:NERDCompactSexyComs ++ " get the line and convert the tabs to spaces ++ let theLine = getline(currentLine) ++ let lineHasTabs = s:HasLeadingTabs(theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ ++ " add the sexyComMarker ++ let theLine = strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . sexyComMarkerSpaced . strpart(theLine, leftAlignIndx) ++ ++ if lineHasTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ ++ " set the line and move onto the next one ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++endfunction ++ ++" Function: s:CommentLinesToggle(forceNested, firstLine, lastLine) {{{2 ++" Applies "toggle" commenting to the given range of lines ++" ++" Args: ++" -forceNested: a flag indicating whether the called is requesting the comment ++" to be nested if need be ++" -firstLine/lastLine: the top and bottom lines to comment ++function s:CommentLinesToggle(forceNested, firstLine, lastLine) ++ let currentLine = a:firstLine ++ while currentLine <= a:lastLine ++ ++ " get the next line, check commentability and convert spaces to tabs ++ let theLine = getline(currentLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ if s:CanToggleCommentLine(a:forceNested, currentLine) ++ ++ "if the user has specified forceNesting then we check to see if we ++ "need to switch delimiters for place-holders ++ if g:NERDUsePlaceHolders ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ endif ++ ++ let theLine = s:AddLeftDelim(s:GetLeft(0, 1, 0), theLine) ++ let theLine = s:AddRightDelim(s:GetRight(0, 1, 0), theLine) ++ endif ++ ++ " restore leading tabs if appropriate ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ " we are done with this line ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++endfunction ++ ++" Function: s:CommentRegion(topline, topCol, bottomLine, bottomCol) function {{{2 ++" This function comments chunks of text selected in visual mode. ++" It will comment exactly the text that they have selected. ++" Args: ++" -topLine: the line num of the top line in the sexy comment ++" -topCol: top left col for this comment ++" -bottomline: the line num of the bottom line in the sexy comment ++" -bottomCol: the bottom right col for this comment ++" -forceNested: whether the caller wants comments to be nested if the ++" line(s) are already commented ++function s:CommentRegion(topLine, topCol, bottomLine, bottomCol, forceNested) ++ ++ "switch delims (if we can) if the current set isnt multipart ++ let switchedDelims = 0 ++ if !s:Multipart() && s:AltMultipart() && !g:NERDAllowAnyVisualDelims ++ let switchedDelims = 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++ ++ "if there is only one line in the comment then just do it ++ if a:topLine == a:bottomLine ++ call s:CommentBlock(a:topLine, a:bottomLine, a:topCol, a:bottomCol, a:forceNested) ++ ++ "there are multiple lines in the comment ++ else ++ "comment the top line ++ call s:CommentBlock(a:topLine, a:topLine, a:topCol, strlen(getline(a:topLine)), a:forceNested) ++ ++ "comment out all the lines in the middle of the comment ++ let topOfRange = a:topLine+1 ++ let bottomOfRange = a:bottomLine-1 ++ if topOfRange <= bottomOfRange ++ call s:CommentLines(a:forceNested, 0, 0, topOfRange, bottomOfRange) ++ endif ++ ++ "comment the bottom line ++ let bottom = getline(a:bottomLine) ++ let numLeadingSpacesTabs = strlen(substitute(bottom, '^\([ \t]*\).*$', '\1', '')) ++ call s:CommentBlock(a:bottomLine, a:bottomLine, numLeadingSpacesTabs+1, a:bottomCol, a:forceNested) ++ ++ endif ++ ++ "stick the cursor back on the char it was on before the comment ++ call cursor(a:topLine, a:topCol + strlen(b:left) + g:NERDSpaceDelims) ++ ++ "if we switched delims then we gotta go back to what they were before ++ if switchedDelims == 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++ ++endfunction ++ ++" Function: s:InvertComment(firstLine, lastLine) function {{{2 ++" Inverts the comments on the lines between and including the given line ++" numbers i.e all commented lines are uncommented and vice versa ++" Args: ++" -firstLine: the top of the range of lines to be inverted ++" -lastLine: the bottom of the range of lines to be inverted ++function s:InvertComment(firstLine, lastLine) ++ ++ " go thru all lines in the given range ++ let currentLine = a:firstLine ++ while currentLine <= a:lastLine ++ let theLine = getline(currentLine) ++ ++ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) ++ ++ " if the line is commented normally, uncomment it ++ if s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) ++ call s:UncommentLines(1, currentLine, currentLine) ++ let currentLine = currentLine + 1 ++ ++ " check if the line is commented sexually ++ elseif !empty(sexyComBounds) ++ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() ++ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) ++ ++ "move to the line after last line of the sexy comment ++ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() ++ let currentLine = bottomBound - (numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved) + 1 ++ ++ " the line isnt commented ++ else ++ call s:CommentLinesToggle(1, currentLine, currentLine) ++ let currentLine = currentLine + 1 ++ endif ++ ++ endwhile ++endfunction ++ ++" Function: NERDComment(isVisual, alignLeft, alignRight, type) function {{{2 ++" This function is a Wrapper for the main commenting functions ++" ++" Args: ++" -isVisual: a flag indicating whether the comment is requested in visual ++" mode or not ++" -type: the type of commenting requested. Can be 'sexy', 'invert', ++" 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', ++" 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' ++function! NERDComment(isVisual, type) range ++ " we want case sensitivity when commenting ++ let prevIgnoreCase = &ignorecase ++ set noignorecase ++ ++ if a:isVisual ++ let firstLine = line("'<") ++ let lastLine = line("'>") ++ let firstCol = col("'<") ++ let lastCol = col("'>") ++ else ++ let firstLine = a:firstline ++ let lastLine = a:lastline ++ endif ++ ++ let countWasGiven = (a:isVisual == 0 && firstLine != lastLine) ++ ++ let forceNested = (a:type == 'nested' || g:NERDDefaultNesting) ++ ++ if a:type == 'norm' || a:type == 'nested' ++ if a:isVisual && visualmode() == "" ++ call s:CommentBlock(firstLine, lastLine, firstCol, lastCol, forceNested) ++ elseif a:isVisual && visualmode() == "v" && (g:NERDCommentWholeLinesInVMode==0 || (g:NERDCommentWholeLinesInVMode==2 && s:HasMultipartDelims())) ++ call s:CommentRegion(firstLine, firstCol, lastLine, lastCol, forceNested) ++ else ++ call s:CommentLines(forceNested, 0, 0, firstLine, lastLine) ++ endif ++ ++ elseif a:type == 'alignLeft' || a:type == 'alignRight' || a:type == 'alignBoth' ++ let alignLeft = (a:type == 'alignLeft' || a:type == 'alignBoth') ++ let alignRight = (a:type == 'alignRight' || a:type == 'alignBoth') ++ call s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) ++ ++ elseif a:type == 'invert' ++ call s:InvertComment(firstLine, lastLine) ++ ++ elseif a:type == 'sexy' ++ try ++ call s:CommentLinesSexy(firstLine, lastLine) ++ catch /NERDCommenter.Delimiters/ ++ call s:NerdEcho("Sexy comments cannot be done with the available delimiters", 0) ++ catch /NERDCommenter.Nesting/ ++ call s:NerdEcho("Sexy comment aborted. Nested sexy cannot be nested", 0) ++ endtry ++ ++ elseif a:type == 'toggle' ++ let theLine = getline(firstLine) ++ ++ if s:IsInSexyComment(firstLine) || s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) ++ call s:UncommentLines(1, firstLine, lastLine) ++ else ++ call s:CommentLinesToggle(forceNested, firstLine, lastLine) ++ endif ++ ++ elseif a:type == 'minimal' ++ try ++ call s:CommentLinesMinimal(firstLine, lastLine) ++ catch /NERDCommenter.Delimiters/ ++ call s:NerdEcho("Minimal comments can only be used for filetypes that have multipart delimiters.", 0) ++ catch /NERDCommenter.Settings/ ++ call s:NerdEcho("Place holders are required but disabled.", 0) ++ endtry ++ ++ elseif a:type == 'toEOL' ++ call s:SaveScreenState() ++ call s:CommentBlock(firstLine, firstLine, col("."), col("$")-1, 1) ++ call s:RestoreScreenState() ++ ++ elseif a:type == 'prepend' ++ call s:PrependCommentToLine() ++ ++ elseif a:type == 'append' ++ call s:AppendCommentToLine() ++ ++ elseif a:type == 'insert' ++ call s:PlaceDelimitersAndInsBetween() ++ ++ elseif a:type == 'uncomment' ++ call s:UncommentLines(0, firstLine, lastLine) ++ ++ elseif a:type == 'yank' ++ if a:isVisual ++ normal gvy ++ elseif countWasGiven ++ execute firstLine .','. lastLine .'yank' ++ else ++ normal Y ++ endif ++ execute firstLine .','. lastLine .'call NERDComment('. a:isVisual .', "norm")' ++ endif ++ ++ let &ignorecase = prevIgnoreCase ++endfunction ++ ++" Function: s:PlaceDelimitersAndInsBetween() function {{{2 ++" This is function is called to place comment delimiters down and place the ++" cursor between them ++function s:PlaceDelimitersAndInsBetween() ++ " get the left and right delimiters without any escape chars in them ++ let left = s:GetLeft(0, 1, 0) ++ let right = s:GetRight(0, 1, 0) ++ ++ let theLine = getline(".") ++ let lineHasLeadTabs = s:HasLeadingTabs(theLine) || (theLine =~ '^ *$' && !&expandtab) ++ ++ "convert tabs to spaces and adjust the cursors column to take this into ++ "account ++ let untabbedCol = s:UntabbedCol(theLine, col(".")) ++ call setline(line("."), s:ConvertLeadingTabsToSpaces(theLine)) ++ call cursor(line("."), untabbedCol) ++ ++ " get the len of the right delim ++ let lenRight = strlen(right) ++ ++ let isDelimOnEOL = col(".") >= strlen(getline(".")) ++ ++ " if the cursor is in the first col then we gotta insert rather than ++ " append the comment delimiters here ++ let insOrApp = (col(".")==1 ? 'i' : 'a') ++ ++ " place the delimiters down. We do it differently depending on whether ++ " there is a left AND right delimiter ++ if lenRight > 0 ++ execute ":normal " . insOrApp . left . right ++ execute ":normal " . lenRight . "h" ++ else ++ execute ":normal " . insOrApp . left ++ ++ " if we are tacking the delim on the EOL then we gotta add a space ++ " after it cos when we go out of insert mode the cursor will move back ++ " one and the user wont be in position to type the comment. ++ if isDelimOnEOL ++ execute 'normal a ' ++ endif ++ endif ++ normal l ++ ++ "if needed convert spaces back to tabs and adjust the cursors col ++ "accordingly ++ if lineHasLeadTabs ++ let tabbedCol = s:TabbedCol(getline("."), col(".")) ++ call setline(line("."), s:ConvertLeadingSpacesToTabs(getline("."))) ++ call cursor(line("."), tabbedCol) ++ endif ++ ++ startinsert ++endfunction ++ ++" Function: s:PrependCommentToLine(){{{2 ++" This function prepends comment delimiters to the start of line and places ++" the cursor in position to start typing the comment ++function s:PrependCommentToLine() ++ " get the left and right delimiters without any escape chars in them ++ let left = s:GetLeft(0, 1, 0) ++ let right = s:GetRight(0, 1, 0) ++ ++ " get the len of the right delim ++ let lenRight = strlen(right) ++ ++ ++ "if the line is empty then we need to know about this later on ++ let isLineEmpty = strlen(getline(".")) == 0 ++ ++ "stick the delimiters down at the start of the line. We have to format the ++ "comment with spaces as appropriate ++ if lenRight > 0 ++ execute ":normal I" . left . right ++ else ++ execute ":normal I" . left ++ endif ++ ++ " if there is a right delimiter then we gotta move the cursor left ++ " by the len of the right delimiter so we insert between the delimiters ++ if lenRight > 0 ++ let leftMoveAmount = lenRight ++ execute ":normal " . leftMoveAmount . "h" ++ endif ++ normal l ++ ++ "if the line was empty then we gotta add an extra space on the end because ++ "the cursor will move back one more at the end of the last "execute" ++ "command ++ if isLineEmpty && lenRight == 0 ++ execute ":normal a " ++ endif ++ ++ startinsert ++endfunction ++" Function: s:RemoveDelimiters(left, right, line) {{{2 ++" this function is called to remove the first left comment delimiter and the ++" last right delimiter of the given line. ++" ++" The args left and right must be strings. If there is no right delimiter (as ++" is the case for e.g vim file comments) them the arg right should be "" ++" ++" Args: ++" -left: the left comment delimiter ++" -right: the right comment delimiter ++" -line: the line to remove the delimiters from ++function s:RemoveDelimiters(left, right, line) ++ ++ let l:left = a:left ++ let l:right = a:right ++ let lenLeft = strlen(left) ++ let lenRight = strlen(right) ++ ++ let delimsSpaced = (g:NERDSpaceDelims || g:NERDRemoveExtraSpaces) ++ ++ let line = a:line ++ ++ "look for the left delimiter, if we find it, remove it. ++ let leftIndx = s:FindDelimiterIndex(a:left, line) ++ if leftIndx != -1 ++ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+lenLeft) ++ ++ "if the user has specified that there is a space after the left delim ++ "then check for the space and remove it if it is there ++ if delimsSpaced && strpart(line, leftIndx, s:lenSpaceStr) == s:spaceStr ++ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+s:lenSpaceStr) ++ endif ++ endif ++ ++ "look for the right delimiter, if we find it, remove it ++ let rightIndx = s:FindDelimiterIndex(a:right, line) ++ if rightIndx != -1 ++ let line = strpart(line, 0, rightIndx) . strpart(line, rightIndx+lenRight) ++ ++ "if the user has specified that there is a space before the right delim ++ "then check for the space and remove it if it is there ++ if delimsSpaced && strpart(line, rightIndx-s:lenSpaceStr, s:lenSpaceStr) == s:spaceStr && s:Multipart() ++ let line = strpart(line, 0, rightIndx-s:lenSpaceStr) . strpart(line, rightIndx) ++ endif ++ endif ++ ++ return line ++endfunction ++ ++" Function: s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) {{{2 ++" This function uncomments the given lines ++" ++" Args: ++" onlyWholeLineComs: should be 1 for toggle style uncommenting ++" topLine: the top line of the visual selection to uncomment ++" bottomLine: the bottom line of the visual selection to uncomment ++function s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) ++ "make local copies of a:firstline and a:lastline and, if need be, swap ++ "them around if the top line is below the bottom ++ let l:firstline = a:topLine ++ let l:lastline = a:bottomLine ++ if firstline > lastline ++ let firstline = lastline ++ let lastline = a:topLine ++ endif ++ ++ "go thru each line uncommenting each line removing sexy comments ++ let currentLine = firstline ++ while currentLine <= lastline ++ ++ "check the current line to see if it is part of a sexy comment ++ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) ++ if !empty(sexyComBounds) ++ ++ "we need to store the num lines in the buf before the comment is ++ "removed so we know how many lines were removed when the sexy com ++ "was removed ++ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() ++ ++ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) ++ ++ "move to the line after last line of the sexy comment ++ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() ++ let numLinesRemoved = numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved ++ let currentLine = sexyComBounds[1] - numLinesRemoved + 1 ++ let lastline = lastline - numLinesRemoved ++ ++ "no sexy com was detected so uncomment the line as normal ++ else ++ let theLine = getline(currentLine) ++ if a:onlyWholeLineComs && (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) ++ call s:UncommentLinesNormal(currentLine, currentLine) ++ elseif !a:onlyWholeLineComs ++ call s:UncommentLinesNormal(currentLine, currentLine) ++ endif ++ let currentLine = currentLine + 1 ++ endif ++ endwhile ++ ++endfunction ++ ++" Function: s:UncommentLinesSexy(topline, bottomline) {{{2 ++" This function removes all the comment characters associated with the sexy ++" comment spanning the given lines ++" Args: ++" -topline/bottomline: the top/bottom lines of the sexy comment ++function s:UncommentLinesSexy(topline, bottomline) ++ let left = s:GetSexyComLeft(0,1) ++ let right = s:GetSexyComRight(0,1) ++ ++ ++ "check if it is even possible for sexy comments to exist with the ++ "available delimiters ++ if left == -1 || right == -1 ++ throw 'NERDCommenter.Delimiters exception: cannot uncomment sexy comments with available delimiters.' ++ endif ++ ++ let leftUnEsc = s:GetSexyComLeft(0,0) ++ let rightUnEsc = s:GetSexyComRight(0,0) ++ ++ let sexyComMarker = s:GetSexyComMarker(0, 1) ++ let sexyComMarkerUnEsc = s:GetSexyComMarker(0, 0) ++ ++ "the markerOffset is how far right we need to move the sexyComMarker to ++ "line it up with the end of the left delim ++ let markerOffset = strlen(leftUnEsc)-strlen(sexyComMarkerUnEsc) ++ ++ " go thru the intermediate lines of the sexy comment and remove the ++ " sexy comment markers (eg the '*'s on the start of line in a c sexy ++ " comment) ++ let currentLine = a:topline+1 ++ while currentLine < a:bottomline ++ let theLine = getline(currentLine) ++ ++ " remove the sexy comment marker from the line. We also remove the ++ " space after it if there is one and if appropriate options are set ++ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) ++ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) ++ endif ++ ++ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) ++ ++ let theLine = s:ConvertLeadingWhiteSpace(theLine) ++ ++ " move onto the next line ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ " gotta make a copy of a:bottomline cos we modify the position of the ++ " last line it if we remove the topline ++ let bottomline = a:bottomline ++ ++ " get the first line so we can remove the left delim from it ++ let theLine = getline(a:topline) ++ ++ " if the first line contains only the left delim then just delete it ++ if theLine =~ '^[ \t]*' . left . '[ \t]*$' && !g:NERDCompactSexyComs ++ call cursor(a:topline, 1) ++ normal dd ++ let bottomline = bottomline - 1 ++ ++ " topline contains more than just the left delim ++ else ++ ++ " remove the delim. If there is a space after it ++ " then remove this too if appropriate ++ let delimIndx = stridx(theLine, leftUnEsc) ++ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)) ++ endif ++ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) ++ call setline(a:topline, theLine) ++ endif ++ ++ " get the last line so we can remove the right delim ++ let theLine = getline(bottomline) ++ ++ " if the bottomline contains only the right delim then just delete it ++ if theLine =~ '^[ \t]*' . right . '[ \t]*$' ++ call cursor(bottomline, 1) ++ normal dd ++ ++ " the last line contains more than the right delim ++ else ++ " remove the right delim. If there is a space after it and ++ " if the appropriate options are set then remove this too. ++ let delimIndx = s:LastIndexOfDelim(rightUnEsc, theLine) ++ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)) ++ endif ++ ++ " if the last line also starts with a sexy comment marker then we ++ " remove this as well ++ if theLine =~ '^[ \t]*' . sexyComMarker ++ ++ " remove the sexyComMarker. If there is a space after it then ++ " remove that too ++ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) ++ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) ++ endif ++ endif ++ ++ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) ++ call setline(bottomline, theLine) ++ endif ++endfunction ++ ++" Function: s:UncommentLineNormal(line) {{{2 ++" uncomments the given line and returns the result ++" Args: ++" -line: the line to uncomment ++function s:UncommentLineNormal(line) ++ let line = a:line ++ ++ "get the comment status on the line so we know how it is commented ++ let lineCommentStatus = s:IsCommentedOuttermost(b:leftAlt, b:rightAlt, b:left, b:right, line) ++ ++ "it is commented with b:left and b:right so remove these delims ++ if lineCommentStatus == 1 ++ let line = s:RemoveDelimiters(b:leftAlt, b:rightAlt, line) ++ ++ "it is commented with b:leftAlt and b:rightAlt so remove these delims ++ elseif lineCommentStatus == 2 && g:NERDRemoveAltComs ++ let line = s:RemoveDelimiters(b:left, b:right, line) ++ ++ "it is not properly commented with any delims so we check if it has ++ "any random left or right delims on it and remove the outtermost ones ++ else ++ "get the positions of all delim types on the line ++ let indxLeft = s:FindDelimiterIndex(b:left, line) ++ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) ++ let indxRight = s:FindDelimiterIndex(b:right, line) ++ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) ++ ++ "remove the outter most left comment delim ++ if indxLeft != -1 && (indxLeft < indxLeftAlt || indxLeftAlt == -1) ++ let line = s:ReplaceLeftMostDelim(b:left, '', line) ++ elseif indxLeftAlt != -1 ++ let line = s:ReplaceLeftMostDelim(b:leftAlt, '', line) ++ endif ++ ++ "remove the outter most right comment delim ++ if indxRight != -1 && (indxRight < indxRightAlt || indxRightAlt == -1) ++ let line = s:ReplaceRightMostDelim(b:right, '', line) ++ elseif indxRightAlt != -1 ++ let line = s:ReplaceRightMostDelim(b:rightAlt, '', line) ++ endif ++ endif ++ ++ ++ let indxLeft = s:FindDelimiterIndex(b:left, line) ++ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) ++ let indxLeftPlace = s:FindDelimiterIndex(g:NERDLPlace, line) ++ ++ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) ++ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) ++ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) ++ ++ let right = b:right ++ let left = b:left ++ if !s:Multipart() ++ let right = b:rightAlt ++ let left = b:leftAlt ++ endif ++ ++ ++ "if there are place-holders on the line then we check to see if they are ++ "the outtermost delimiters on the line. If so then we replace them with ++ "real delimiters ++ if indxLeftPlace != -1 ++ if (indxLeftPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) ++ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) ++ endif ++ elseif indxRightPlace != -1 ++ if (indxRightPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) ++ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) ++ endif ++ ++ endif ++ ++ let line = s:ConvertLeadingWhiteSpace(line) ++ ++ return line ++endfunction ++ ++" Function: s:UncommentLinesNormal(topline, bottomline) {{{2 ++" This function is called to uncomment lines that arent a sexy comment ++" Args: ++" -topline/bottomline: the top/bottom line numbers of the comment ++function s:UncommentLinesNormal(topline, bottomline) ++ let currentLine = a:topline ++ while currentLine <= a:bottomline ++ let line = getline(currentLine) ++ call setline(currentLine, s:UncommentLineNormal(line)) ++ let currentLine = currentLine + 1 ++ endwhile ++endfunction ++ ++ ++" Section: Other helper functions {{{1 ++" ============================================================================ ++ ++" Function: s:AddLeftDelim(delim, theLine) {{{2 ++" Args: ++function s:AddLeftDelim(delim, theLine) ++ return substitute(a:theLine, '^\([ \t]*\)', '\1' . a:delim, '') ++endfunction ++ ++" Function: s:AddLeftDelimAligned(delim, theLine) {{{2 ++" Args: ++function s:AddLeftDelimAligned(delim, theLine, alignIndx) ++ ++ "if the line is not long enough then bung some extra spaces on the front ++ "so we can align the delim properly ++ let theLine = a:theLine ++ if strlen(theLine) < a:alignIndx ++ let theLine = strpart(s:spaces, 0, a:alignIndx - strlen(theLine)) ++ endif ++ ++ return strpart(theLine, 0, a:alignIndx) . a:delim . strpart(theLine, a:alignIndx) ++endfunction ++ ++" Function: s:AddRightDelim(delim, theLine) {{{2 ++" Args: ++function s:AddRightDelim(delim, theLine) ++ if a:delim == '' ++ return a:theLine ++ else ++ return substitute(a:theLine, '$', a:delim, '') ++ endif ++endfunction ++ ++" Function: s:AddRightDelimAligned(delim, theLine, alignIndx) {{{2 ++" Args: ++function s:AddRightDelimAligned(delim, theLine, alignIndx) ++ if a:delim == "" ++ return a:theLine ++ else ++ ++ " when we align the right delim we are just adding spaces ++ " so we get a string containing the needed spaces (it ++ " could be empty) ++ let extraSpaces = '' ++ let extraSpaces = strpart(s:spaces, 0, a:alignIndx-strlen(a:theLine)) ++ ++ " add the right delim ++ return substitute(a:theLine, '$', extraSpaces . a:delim, '') ++ endif ++endfunction ++ ++" Function: s:AltMultipart() {{{2 ++" returns 1 if the alternative delims are multipart ++function s:AltMultipart() ++ return b:rightAlt != '' ++endfunction ++ ++" Function: s:CanCommentLine(forceNested, line) {{{2 ++"This function is used to determine whether the given line can be commented. ++"It returns 1 if it can be and 0 otherwise ++" ++" Args: ++" -forceNested: a flag indicating whether the caller wants comments to be nested ++" if the current line is already commented ++" -lineNum: the line num of the line to check for commentability ++function s:CanCommentLine(forceNested, lineNum) ++ let theLine = getline(a:lineNum) ++ ++ " make sure we don't comment lines that are just spaces or tabs or empty. ++ if theLine =~ "^[ \t]*$" ++ return 0 ++ endif ++ ++ "if the line is part of a sexy comment then just flag it... ++ if s:IsInSexyComment(a:lineNum) ++ return 0 ++ endif ++ ++ let isCommented = s:IsCommentedNormOrSexy(a:lineNum) ++ ++ "if the line isnt commented return true ++ if !isCommented ++ return 1 ++ endif ++ ++ "if the line is commented but nesting is allowed then return true ++ if a:forceNested && (!s:Multipart() || g:NERDUsePlaceHolders) ++ return 1 ++ endif ++ ++ return 0 ++endfunction ++ ++" Function: s:CanPlaceCursor(line, col) {{{2 ++" returns 1 if the cursor can be placed exactly in the given position ++function s:CanPlaceCursor(line, col) ++ let c = col(".") ++ let l = line(".") ++ call cursor(a:line, a:col) ++ let success = (line(".") == a:line && col(".") == a:col) ++ call cursor(l,c) ++ return success ++endfunction ++ ++" Function: s:CanSexyCommentLines(topline, bottomline) {{{2 ++" Return: 1 if the given lines can be commented sexually, 0 otherwise ++function s:CanSexyCommentLines(topline, bottomline) ++ " see if the selected regions have any sexy comments ++ let currentLine = a:topline ++ while(currentLine <= a:bottomline) ++ if s:IsInSexyComment(currentLine) ++ return 0 ++ endif ++ let currentLine = currentLine + 1 ++ endwhile ++ return 1 ++endfunction ++" Function: s:CanToggleCommentLine(forceNested, line) {{{2 ++"This function is used to determine whether the given line can be toggle commented. ++"It returns 1 if it can be and 0 otherwise ++" ++" Args: ++" -lineNum: the line num of the line to check for commentability ++function s:CanToggleCommentLine(forceNested, lineNum) ++ let theLine = getline(a:lineNum) ++ if (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) && !a:forceNested ++ return 0 ++ endif ++ ++ " make sure we don't comment lines that are just spaces or tabs or empty. ++ if theLine =~ "^[ \t]*$" ++ return 0 ++ endif ++ ++ "if the line is part of a sexy comment then just flag it... ++ if s:IsInSexyComment(a:lineNum) ++ return 0 ++ endif ++ ++ return 1 ++endfunction ++ ++" Function: s:ConvertLeadingSpacesToTabs(line) {{{2 ++" This function takes a line and converts all leading tabs on that line into ++" spaces ++" ++" Args: ++" -line: the line whose leading tabs will be converted ++function s:ConvertLeadingSpacesToTabs(line) ++ let toReturn = a:line ++ while toReturn =~ '^\t*' . s:TabSpace() . '\(.*\)$' ++ let toReturn = substitute(toReturn, '^\(\t*\)' . s:TabSpace() . '\(.*\)$' , '\1\t\2' , "") ++ endwhile ++ ++ return toReturn ++endfunction ++ ++ ++" Function: s:ConvertLeadingTabsToSpaces(line) {{{2 ++" This function takes a line and converts all leading spaces on that line into ++" tabs ++" ++" Args: ++" -line: the line whose leading spaces will be converted ++function s:ConvertLeadingTabsToSpaces(line) ++ let toReturn = a:line ++ while toReturn =~ '^\( *\)\t' ++ let toReturn = substitute(toReturn, '^\( *\)\t', '\1' . s:TabSpace() , "") ++ endwhile ++ ++ return toReturn ++endfunction ++ ++" Function: s:ConvertLeadingWhiteSpace(line) {{{2 ++" Converts the leading white space to tabs/spaces depending on &ts ++" ++" Args: ++" -line: the line to convert ++function s:ConvertLeadingWhiteSpace(line) ++ let toReturn = a:line ++ while toReturn =~ '^ *\t' ++ let toReturn = substitute(toReturn, '^ *\zs\t\ze', s:TabSpace(), "g") ++ endwhile ++ ++ if !&expandtab ++ let toReturn = s:ConvertLeadingSpacesToTabs(toReturn) ++ endif ++ ++ return toReturn ++endfunction ++ ++ ++" Function: s:CountNonESCedOccurances(str, searchstr, escChar) {{{2 ++" This function counts the number of substrings contained in another string. ++" These substrings are only counted if they are not escaped with escChar ++" Args: ++" -str: the string to look for searchstr in ++" -searchstr: the substring to search for in str ++" -escChar: the escape character which, when preceding an instance of ++" searchstr, will cause it not to be counted ++function s:CountNonESCedOccurances(str, searchstr, escChar) ++ "get the index of the first occurrence of searchstr ++ let indx = stridx(a:str, a:searchstr) ++ ++ "if there is an instance of searchstr in str process it ++ if indx != -1 ++ "get the remainder of str after this instance of searchstr is removed ++ let lensearchstr = strlen(a:searchstr) ++ let strLeft = strpart(a:str, indx+lensearchstr) ++ ++ "if this instance of searchstr is not escaped, add one to the count ++ "and recurse. If it is escaped, just recurse ++ if !s:IsEscaped(a:str, indx, a:escChar) ++ return 1 + s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) ++ else ++ return s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) ++ endif ++ endif ++endfunction ++" Function: s:DoesBlockHaveDelim(delim, top, bottom) {{{2 ++" Returns 1 if the given block of lines has a delimiter (a:delim) in it ++" Args: ++" -delim: the comment delimiter to check the block for ++" -top: the top line number of the block ++" -bottom: the bottom line number of the block ++function s:DoesBlockHaveDelim(delim, top, bottom) ++ let currentLine = a:top ++ while currentLine < a:bottom ++ let theline = getline(currentLine) ++ if s:FindDelimiterIndex(a:delim, theline) != -1 ++ return 1 ++ endif ++ let currentLine = currentLine + 1 ++ endwhile ++ return 0 ++endfunction ++ ++" Function: s:DoesBlockHaveMultipartDelim(top, bottom) {{{2 ++" Returns 1 if the given block has a >= 1 multipart delimiter in it ++" Args: ++" -top: the top line number of the block ++" -bottom: the bottom line number of the block ++function s:DoesBlockHaveMultipartDelim(top, bottom) ++ if s:HasMultipartDelims() ++ if s:Multipart() ++ return s:DoesBlockHaveDelim(b:left, a:top, a:bottom) || s:DoesBlockHaveDelim(b:right, a:top, a:bottom) ++ else ++ return s:DoesBlockHaveDelim(b:leftAlt, a:top, a:bottom) || s:DoesBlockHaveDelim(b:rightAlt, a:top, a:bottom) ++ endif ++ endif ++ return 0 ++endfunction ++ ++ ++" Function: s:Esc(str) {{{2 ++" Escapes all the tricky chars in the given string ++function s:Esc(str) ++ let charsToEsc = '*/\."&$+' ++ return escape(a:str, charsToEsc) ++endfunction ++ ++" Function: s:FindDelimiterIndex(delimiter, line) {{{2 ++" This function is used to get the string index of the input comment delimiter ++" on the input line. If no valid comment delimiter is found in the line then ++" -1 is returned ++" Args: ++" -delimiter: the delimiter we are looking to find the index of ++" -line: the line we are looking for delimiter on ++function s:FindDelimiterIndex(delimiter, line) ++ ++ "make sure the delimiter isnt empty otherwise we go into an infinite loop. ++ if a:delimiter == "" ++ return -1 ++ endif ++ ++ ++ let l:delimiter = a:delimiter ++ let lenDel = strlen(l:delimiter) ++ ++ "get the index of the first occurrence of the delimiter ++ let delIndx = stridx(a:line, l:delimiter) ++ ++ "keep looping thru the line till we either find a real comment delimiter ++ "or run off the EOL ++ while delIndx != -1 ++ ++ "if we are not off the EOL get the str before the possible delimiter ++ "in question and check if it really is a delimiter. If it is, return ++ "its position ++ if delIndx != -1 ++ if s:IsDelimValid(l:delimiter, delIndx, a:line) ++ return delIndx ++ endif ++ endif ++ ++ "we have not yet found a real comment delimiter so move past the ++ "current one we are lookin at ++ let restOfLine = strpart(a:line, delIndx + lenDel) ++ let distToNextDelim = stridx(restOfLine , l:delimiter) ++ ++ "if distToNextDelim is -1 then there is no more potential delimiters ++ "on the line so set delIndx to -1. Otherwise, move along the line by ++ "distToNextDelim ++ if distToNextDelim == -1 ++ let delIndx = -1 ++ else ++ let delIndx = delIndx + lenDel + distToNextDelim ++ endif ++ endwhile ++ ++ "there is no comment delimiter on this line ++ return -1 ++endfunction ++ ++" Function: s:FindBoundingLinesOfSexyCom(lineNum) {{{2 ++" This function takes in a line number and tests whether this line number is ++" the top/bottom/middle line of a sexy comment. If it is then the top/bottom ++" lines of the sexy comment are returned ++" Args: ++" -lineNum: the line number that is to be tested whether it is the ++" top/bottom/middle line of a sexy com ++" Returns: ++" A string that has the top/bottom lines of the sexy comment encoded in it. ++" The format is 'topline,bottomline'. If a:lineNum turns out not to be the ++" top/bottom/middle of a sexy comment then -1 is returned ++function s:FindBoundingLinesOfSexyCom(lineNum) ++ ++ "find which delimiters to look for as the start/end delims of the comment ++ let left = '' ++ let right = '' ++ if s:Multipart() ++ let left = s:GetLeft(0,0,1) ++ let right = s:GetRight(0,0,1) ++ elseif s:AltMultipart() ++ let left = s:GetLeft(1,0,1) ++ let right = s:GetRight(1,0,1) ++ else ++ return [] ++ endif ++ ++ let sexyComMarker = s:GetSexyComMarker(0, 1) ++ ++ "initialise the top/bottom line numbers of the sexy comment to -1 ++ let top = -1 ++ let bottom = -1 ++ ++ let currentLine = a:lineNum ++ while top == -1 || bottom == -1 ++ let theLine = getline(currentLine) ++ ++ "check if the current line is the top of the sexy comment ++ if theLine =~ '^[ \t]*' . left && theLine !~ '.*' . right ++ let top = currentLine ++ let currentLine = a:lineNum ++ ++ "check if the current line is the bottom of the sexy comment ++ elseif theLine =~ '^[ \t]*' . right && theLine !~ '.*' . left ++ let bottom = currentLine ++ ++ "the right delimiter is on the same line as the last sexyComMarker ++ elseif theLine =~ '^[ \t]*' . sexyComMarker . '.*' . right ++ let bottom = currentLine ++ ++ "we have not found the top or bottom line so we assume currentLine is an ++ "intermediate line and look to prove otherwise ++ else ++ ++ "if the line doesnt start with a sexyComMarker then it is not a sexy ++ "comment ++ if theLine !~ '^[ \t]*' . sexyComMarker ++ return [] ++ endif ++ ++ endif ++ ++ "if top is -1 then we havent found the top yet so keep looking up ++ if top == -1 ++ let currentLine = currentLine - 1 ++ "if we have found the top line then go down looking for the bottom ++ else ++ let currentLine = currentLine + 1 ++ endif ++ ++ endwhile ++ ++ return [top, bottom] ++endfunction ++ ++ ++" Function: s:GetLeft(alt, space, esc) {{{2 ++" returns the left/left-alternative delimiter ++" Args: ++" -alt: specifies whether to get left or left-alternative delim ++" -space: specifies whether the delim should be spaced or not ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the delim should be ESCed ++function s:GetLeft(alt, space, esc) ++ let delim = b:left ++ ++ if a:alt ++ if b:leftAlt == '' ++ return '' ++ else ++ let delim = b:leftAlt ++ endif ++ endif ++ if delim == '' ++ return '' ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let delim = delim . s:spaceStr ++ endif ++ ++ if a:esc ++ let delim = s:Esc(delim) ++ endif ++ ++ return delim ++endfunction ++ ++" Function: s:GetRight(alt, space, esc) {{{2 ++" returns the right/right-alternative delimiter ++" Args: ++" -alt: specifies whether to get right or right-alternative delim ++" -space: specifies whether the delim should be spaced or not ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the delim should be ESCed ++function s:GetRight(alt, space, esc) ++ let delim = b:right ++ ++ if a:alt ++ if !s:AltMultipart() ++ return '' ++ else ++ let delim = b:rightAlt ++ endif ++ endif ++ if delim == '' ++ return '' ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let delim = s:spaceStr . delim ++ endif ++ ++ if a:esc ++ let delim = s:Esc(delim) ++ endif ++ ++ return delim ++endfunction ++ ++ ++" Function: s:GetSexyComMarker() {{{2 ++" Returns the sexy comment marker for the current filetype. ++" ++" C style sexy comments are assumed if possible. If not then the sexy comment ++" marker is the last char of the delimiter pair that has both left and right ++" delims and has the longest left delim ++" ++" Args: ++" -space: specifies whether the marker is to have a space string after it ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the marker are to be ESCed ++function s:GetSexyComMarker(space, esc) ++ let sexyComMarker = b:sexyComMarker ++ ++ "if there is no hardcoded marker then we find one ++ if sexyComMarker == '' ++ ++ "if the filetype has c style comments then use standard c sexy ++ "comments ++ if s:HasCStyleComments() ++ let sexyComMarker = '*' ++ else ++ "find a comment marker by getting the longest available left delim ++ "(that has a corresponding right delim) and taking the last char ++ let lenLeft = strlen(b:left) ++ let lenLeftAlt = strlen(b:leftAlt) ++ let left = '' ++ let right = '' ++ if s:Multipart() && lenLeft >= lenLeftAlt ++ let left = b:left ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ else ++ return -1 ++ endif ++ ++ "get the last char of left ++ let sexyComMarker = strpart(left, strlen(left)-1) ++ endif ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let sexyComMarker = sexyComMarker . s:spaceStr ++ endif ++ ++ if a:esc ++ let sexyComMarker = s:Esc(sexyComMarker) ++ endif ++ ++ return sexyComMarker ++endfunction ++ ++" Function: s:GetSexyComLeft(space, esc) {{{2 ++" Returns the left delimiter for sexy comments for this filetype or -1 if ++" there is none. C style sexy comments are used if possible ++" Args: ++" -space: specifies if the delim has a space string on the end ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the string are ESCed ++function s:GetSexyComLeft(space, esc) ++ let lenLeft = strlen(b:left) ++ let lenLeftAlt = strlen(b:leftAlt) ++ let left = '' ++ ++ "assume c style sexy comments if possible ++ if s:HasCStyleComments() ++ let left = '/*' ++ else ++ "grab the longest left delim that has a right ++ if s:Multipart() && lenLeft >= lenLeftAlt ++ let left = b:left ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ else ++ return -1 ++ endif ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let left = left . s:spaceStr ++ endif ++ ++ if a:esc ++ let left = s:Esc(left) ++ endif ++ ++ return left ++endfunction ++ ++" Function: s:GetSexyComRight(space, esc) {{{2 ++" Returns the right delimiter for sexy comments for this filetype or -1 if ++" there is none. C style sexy comments are used if possible. ++" Args: ++" -space: specifies if the delim has a space string on the start ++" (the space string will only be added if NERDSpaceDelims ++" is specified for the current filetype) ++" -esc: specifies whether the tricky chars in the string are ESCed ++function s:GetSexyComRight(space, esc) ++ let lenLeft = strlen(b:left) ++ let lenLeftAlt = strlen(b:leftAlt) ++ let right = '' ++ ++ "assume c style sexy comments if possible ++ if s:HasCStyleComments() ++ let right = '*/' ++ else ++ "grab the right delim that pairs with the longest left delim ++ if s:Multipart() && lenLeft >= lenLeftAlt ++ let right = b:right ++ elseif s:AltMultipart() ++ let right = b:rightAlt ++ else ++ return -1 ++ endif ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let right = s:spaceStr . right ++ endif ++ ++ if a:esc ++ let right = s:Esc(right) ++ endif ++ ++ return right ++endfunction ++ ++" Function: s:HasMultipartDelims() {{{2 ++" Returns 1 iff the current filetype has at least one set of multipart delims ++function s:HasMultipartDelims() ++ return s:Multipart() || s:AltMultipart() ++endfunction ++ ++" Function: s:HasLeadingTabs(...) {{{2 ++" Returns 1 if any of the given strings have leading tabs ++function s:HasLeadingTabs(...) ++ for s in a:000 ++ if s =~ '^\t.*' ++ return 1 ++ end ++ endfor ++ return 0 ++endfunction ++" Function: s:HasCStyleComments() {{{2 ++" Returns 1 iff the current filetype has c style comment delimiters ++function s:HasCStyleComments() ++ return (b:left == '/*' && b:right == '*/') || (b:leftAlt == '/*' && b:rightAlt == '*/') ++endfunction ++ ++" Function: s:InstallDocumentation(full_name, revision) {{{2 ++" Install help documentation. ++" Arguments: ++" full_name: Full name of this vim plugin script, including path name. ++" revision: Revision of the vim script. #version# mark in the document file ++" will be replaced with this string with 'v' prefix. ++" Return: ++" 1 if new document installed, 0 otherwise. ++" Note: Cleaned and generalized by guo-peng Wen. ++" ++" Note about authorship: this function was taken from the vimspell plugin ++" which can be found at http://www.vim.org/scripts/script.php?script_id=465 ++" ++function s:InstallDocumentation(full_name, revision) ++ " Name of the document path based on the system we use: ++ if has("vms") ++ " No chance that this script will work with ++ " VMS - to much pathname juggling here. ++ return 1 ++ elseif (has("unix")) ++ " On UNIX like system, using forward slash: ++ let l:slash_char = '/' ++ let l:mkdir_cmd = ':silent !mkdir -p ' ++ else ++ " On M$ system, use backslash. Also mkdir syntax is different. ++ " This should only work on W2K and up. ++ let l:slash_char = '\' ++ let l:mkdir_cmd = ':silent !mkdir ' ++ endif ++ ++ let l:doc_path = l:slash_char . 'doc' ++ let l:doc_home = l:slash_char . '.vim' . l:slash_char . 'doc' ++ ++ " Figure out document path based on full name of this script: ++ let l:vim_plugin_path = fnamemodify(a:full_name, ':h') ++ let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . l:doc_path ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ "Doc path: " . l:vim_doc_path ++ call s:NerdEcho("Doc path: " . l:vim_doc_path, 0) ++ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ " Try a default configuration in user home: ++ let l:vim_doc_path = expand("~") . l:doc_home ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ " Put a warning: ++ call s:NerdEcho("Unable to open documentation directory \ntype :help add-local-help for more information.", 0) ++ echo l:vim_doc_path ++ return 0 ++ endif ++ endif ++ endif ++ endif ++ ++ " Exit if we have problem to access the document directory: ++ if (!isdirectory(l:vim_plugin_path) || !isdirectory(l:vim_doc_path) || filewritable(l:vim_doc_path) != 2) ++ return 0 ++ endif ++ ++ " Full name of script and documentation file: ++ let l:script_name = fnamemodify(a:full_name, ':t') ++ let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' ++ let l:plugin_file = l:vim_plugin_path . l:slash_char . l:script_name ++ let l:doc_file = l:vim_doc_path . l:slash_char . l:doc_name ++ ++ " Bail out if document file is still up to date: ++ if (filereadable(l:doc_file) && getftime(l:plugin_file) < getftime(l:doc_file)) ++ return 0 ++ endif ++ ++ " Prepare window position restoring command: ++ if (strlen(@%)) ++ let l:go_back = 'b ' . bufnr("%") ++ else ++ let l:go_back = 'enew!' ++ endif ++ ++ " Create a new buffer & read in the plugin file (me): ++ setl nomodeline ++ exe 'enew!' ++ exe 'r ' . escape(l:plugin_file,s:NERDFileNameEscape) ++ ++ setl modeline ++ let l:buf = bufnr("%") ++ setl noswapfile modifiable ++ ++ norm zR ++ norm gg ++ ++ " Delete from first line to a line starts with ++ " === START_DOC ++ 1,/^=\{3,}\s\+START_DOC\C/ d ++ ++ " Delete from a line starts with ++ " === END_DOC ++ " to the end of the documents: ++ /^=\{3,}\s\+END_DOC\C/,$ d ++ ++ " Remove fold marks: ++ :%s/{\{3}[1-9]/ / ++ ++ " Add modeline for help doc: the modeline string is mangled intentionally ++ " to avoid it be recognized by VIM: ++ call append(line('$'), '') ++ call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') ++ ++ " Replace revision: ++ "exe "normal :1s/#version#/ v" . a:revision . "/\" ++ exe "normal :%s/#version#/ v" . a:revision . "/\" ++ ++ " Save the help document: ++ exe 'w! ' . escape(l:doc_file,s:NERDFileNameEscape) ++ exe l:go_back ++ exe 'bw ' . l:buf ++ ++ " Build help tags: ++ exe 'helptags ' . escape(l:vim_doc_path,s:NERDFileNameEscape) ++ ++ return 1 ++endfunction ++ ++ ++" Function: s:IsCommentedNormOrSexy(lineNum) {{{2 ++"This function is used to determine whether the given line is commented with ++"either set of delimiters or if it is part of a sexy comment ++" ++" Args: ++" -lineNum: the line number of the line to check ++function s:IsCommentedNormOrSexy(lineNum) ++ let theLine = getline(a:lineNum) ++ ++ "if the line is commented normally return 1 ++ if s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) ++ return 1 ++ endif ++ ++ "if the line is part of a sexy comment return 1 ++ if s:IsInSexyComment(a:lineNum) ++ return 1 ++ endif ++ return 0 ++endfunction ++ ++" Function: s:IsCommented(left, right, line) {{{2 ++"This function is used to determine whether the given line is commented with ++"the given delimiters ++" ++" Args: ++" -line: the line that to check if commented ++" -left/right: the left and right delimiters to check for ++function s:IsCommented(left, right, line) ++ "if the line isnt commented return true ++ if s:FindDelimiterIndex(a:left, a:line) != -1 && (s:FindDelimiterIndex(a:right, a:line) != -1 || !s:Multipart()) ++ return 1 ++ endif ++ return 0 ++endfunction ++ ++" Function: s:IsCommentedFromStartOfLine(left, line) {{{2 ++"This function is used to determine whether the given line is commented with ++"the given delimiters at the start of the line i.e the left delimiter is the ++"first thing on the line (apart from spaces\tabs) ++" ++" Args: ++" -line: the line that to check if commented ++" -left: the left delimiter to check for ++function s:IsCommentedFromStartOfLine(left, line) ++ let theLine = s:ConvertLeadingTabsToSpaces(a:line) ++ let numSpaces = strlen(substitute(theLine, '^\( *\).*$', '\1', '')) ++ let delimIndx = s:FindDelimiterIndex(a:left, theLine) ++ return delimIndx == numSpaces ++endfunction ++ ++" Function: s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) {{{2 ++" Finds the type of the outtermost delims on the line ++" ++" Args: ++" -line: the line that to check if the outtermost comments on it are ++" left/right ++" -left/right: the left and right delimiters to check for ++" -leftAlt/rightAlt: the left and right alternative delimiters to check for ++" ++" Returns: ++" 0 if the line is not commented with either set of delims ++" 1 if the line is commented with the left/right delim set ++" 2 if the line is commented with the leftAlt/rightAlt delim set ++function s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) ++ "get the first positions of the left delims and the last positions of the ++ "right delims ++ let indxLeft = s:FindDelimiterIndex(a:left, a:line) ++ let indxLeftAlt = s:FindDelimiterIndex(a:leftAlt, a:line) ++ let indxRight = s:LastIndexOfDelim(a:right, a:line) ++ let indxRightAlt = s:LastIndexOfDelim(a:rightAlt, a:line) ++ ++ "check if the line has a left delim before a leftAlt delim ++ if (indxLeft <= indxLeftAlt || indxLeftAlt == -1) && indxLeft != -1 ++ "check if the line has a right delim after any rightAlt delim ++ if (indxRight > indxRightAlt && indxRight > indxLeft) || !s:Multipart() ++ return 1 ++ endif ++ ++ "check if the line has a leftAlt delim before a left delim ++ elseif (indxLeftAlt <= indxLeft || indxLeft == -1) && indxLeftAlt != -1 ++ "check if the line has a rightAlt delim after any right delim ++ if (indxRightAlt > indxRight && indxRightAlt > indxLeftAlt) || !s:AltMultipart() ++ return 2 ++ endif ++ else ++ return 0 ++ endif ++ ++ return 0 ++ ++endfunction ++ ++ ++" Function: s:IsDelimValid(delimiter, delIndx, line) {{{2 ++" This function is responsible for determining whether a given instance of a ++" comment delimiter is a real delimiter or not. For example, in java the ++" // string is a comment delimiter but in the line: ++" System.out.println("//"); ++" it does not count as a comment delimiter. This function is responsible for ++" distinguishing between such cases. It does so by applying a set of ++" heuristics that are not fool proof but should work most of the time. ++" ++" Args: ++" -delimiter: the delimiter we are validating ++" -delIndx: the position of delimiter in line ++" -line: the line that delimiter occurs in ++" ++" Returns: ++" 0 if the given delimiter is not a real delimiter (as far as we can tell) , ++" 1 otherwise ++function s:IsDelimValid(delimiter, delIndx, line) ++ "get the delimiter without the escchars ++ let l:delimiter = a:delimiter ++ ++ "get the strings before and after the delimiter ++ let preComStr = strpart(a:line, 0, a:delIndx) ++ let postComStr = strpart(a:line, a:delIndx+strlen(delimiter)) ++ ++ "to check if the delimiter is real, make sure it isnt preceded by ++ "an odd number of quotes and followed by the same (which would indicate ++ "that it is part of a string and therefore is not a comment) ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, '"', "\\")) ++ return 0 ++ endif ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "'", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "'", "\\")) ++ return 0 ++ endif ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "`", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "`", "\\")) ++ return 0 ++ endif ++ ++ ++ "if the comment delimiter is escaped, assume it isnt a real delimiter ++ if s:IsEscaped(a:line, a:delIndx, "\\") ++ return 0 ++ endif ++ ++ "vim comments are so fuckin stupid!! Why the hell do they have comment ++ "delimiters that are used elsewhere in the syntax?!?! We need to check ++ "some conditions especially for vim ++ if &filetype == "vim" ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) ++ return 0 ++ endif ++ ++ "if the delimiter is on the very first char of the line or is the ++ "first non-tab/space char on the line then it is a valid comment delimiter ++ if a:delIndx == 0 || a:line =~ "^[ \t]\\{" . a:delIndx . "\\}\".*$" ++ return 1 ++ endif ++ ++ let numLeftParen =s:CountNonESCedOccurances(preComStr, "(", "\\") ++ let numRightParen =s:CountNonESCedOccurances(preComStr, ")", "\\") ++ ++ "if the quote is inside brackets then assume it isnt a comment ++ if numLeftParen > numRightParen ++ return 0 ++ endif ++ ++ "if the line has an even num of unescaped "'s then we can assume that ++ "any given " is not a comment delimiter ++ if s:IsNumEven(s:CountNonESCedOccurances(a:line, "\"", "\\")) ++ return 0 ++ endif ++ endif ++ ++ return 1 ++ ++endfunction ++ ++" Function: s:IsNumEven(num) {{{2 ++" A small function the returns 1 if the input number is even and 0 otherwise ++" Args: ++" -num: the number to check ++function s:IsNumEven(num) ++ return (a:num % 2) == 0 ++endfunction ++ ++" Function: s:IsEscaped(str, indx, escChar) {{{2 ++" This function takes a string, an index into that string and an esc char and ++" returns 1 if the char at the index is escaped (i.e if it is preceded by an ++" odd number of esc chars) ++" Args: ++" -str: the string to check ++" -indx: the index into str that we want to check ++" -escChar: the escape char the char at indx may be ESCed with ++function s:IsEscaped(str, indx, escChar) ++ "initialise numEscChars to 0 and look at the char before indx ++ let numEscChars = 0 ++ let curIndx = a:indx-1 ++ ++ "keep going back thru str until we either reach the start of the str or ++ "run out of esc chars ++ while curIndx >= 0 && strpart(a:str, curIndx, 1) == a:escChar ++ ++ "we have found another esc char so add one to the count and move left ++ "one char ++ let numEscChars = numEscChars + 1 ++ let curIndx = curIndx - 1 ++ ++ endwhile ++ ++ "if there is an odd num of esc chars directly before the char at indx then ++ "the char at indx is escaped ++ return !s:IsNumEven(numEscChars) ++endfunction ++ ++" Function: s:IsInSexyComment(line) {{{2 ++" returns 1 if the given line number is part of a sexy comment ++function s:IsInSexyComment(line) ++ return !empty(s:FindBoundingLinesOfSexyCom(a:line)) ++endfunction ++ ++" Function: s:IsSexyComment(topline, bottomline) {{{2 ++" This function takes in 2 line numbers and returns 1 if the lines between and ++" including the given line numbers are a sexy comment. It returns 0 otherwise. ++" Args: ++" -topline: the line that the possible sexy comment starts on ++" -bottomline: the line that the possible sexy comment stops on ++function s:IsSexyComment(topline, bottomline) ++ ++ "get the delim set that would be used for a sexy comment ++ let left = '' ++ let right = '' ++ if s:Multipart() ++ let left = b:left ++ let right = b:right ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ let right = b:rightAlt ++ else ++ return 0 ++ endif ++ ++ "swap the top and bottom line numbers around if need be ++ let topline = a:topline ++ let bottomline = a:bottomline ++ if bottomline < topline ++ topline = bottomline ++ bottomline = a:topline ++ endif ++ ++ "if there is < 2 lines in the comment it cannot be sexy ++ if (bottomline - topline) <= 0 ++ return 0 ++ endif ++ ++ "if the top line doesnt begin with a left delim then the comment isnt sexy ++ if getline(a:topline) !~ '^[ \t]*' . left ++ return 0 ++ endif ++ ++ "if there is a right delim on the top line then this isnt a sexy comment ++ if s:FindDelimiterIndex(right, getline(a:topline)) != -1 ++ return 0 ++ endif ++ ++ "if there is a left delim on the bottom line then this isnt a sexy comment ++ if s:FindDelimiterIndex(left, getline(a:bottomline)) != -1 ++ return 0 ++ endif ++ ++ "if the bottom line doesnt begin with a right delim then the comment isnt ++ "sexy ++ if getline(a:bottomline) !~ '^.*' . right . '$' ++ return 0 ++ endif ++ ++ let sexyComMarker = s:GetSexyComMarker(0, 1) ++ ++ "check each of the intermediate lines to make sure they start with a ++ "sexyComMarker ++ let currentLine = a:topline+1 ++ while currentLine < a:bottomline ++ let theLine = getline(currentLine) ++ ++ if theLine !~ '^[ \t]*' . sexyComMarker ++ return 0 ++ endif ++ ++ "if there is a right delim in an intermediate line then the block isnt ++ "a sexy comment ++ if s:FindDelimiterIndex(right, theLine) != -1 ++ return 0 ++ endif ++ ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ "we have not found anything to suggest that this isnt a sexy comment so ++ return 1 ++ ++endfunction ++ ++" Function: s:LastIndexOfDelim(delim, str) {{{2 ++" This function takes a string and a delimiter and returns the last index of ++" that delimiter in string ++" Args: ++" -delim: the delimiter to look for ++" -str: the string to look for delim in ++function s:LastIndexOfDelim(delim, str) ++ let delim = a:delim ++ let lenDelim = strlen(delim) ++ ++ "set index to the first occurrence of delim. If there is no occurrence then ++ "bail ++ let indx = s:FindDelimiterIndex(delim, a:str) ++ if indx == -1 ++ return -1 ++ endif ++ ++ "keep moving to the next instance of delim in str till there is none left ++ while 1 ++ ++ "search for the next delim after the previous one ++ let searchStr = strpart(a:str, indx+lenDelim) ++ let indx2 = s:FindDelimiterIndex(delim, searchStr) ++ ++ "if we find a delim update indx to record the position of it, if we ++ "dont find another delim then indx is the last one so break out of ++ "this loop ++ if indx2 != -1 ++ let indx = indx + indx2 + lenDelim ++ else ++ break ++ endif ++ endwhile ++ ++ return indx ++ ++endfunction ++ ++" Function: s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 ++" This function takes in 2 line numbers and returns the index of the left most ++" char (that is not a space or a tab) on all of these lines. ++" Args: ++" -countCommentedLines: 1 if lines that are commented are to be checked as ++" well. 0 otherwise ++" -countEmptyLines: 1 if empty lines are to be counted in the search ++" -topline: the top line to be checked ++" -bottomline: the bottom line to be checked ++function s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) ++ ++ " declare the left most index as an extreme value ++ let leftMostIndx = 1000 ++ ++ " go thru the block line by line updating leftMostIndx ++ let currentLine = a:topline ++ while currentLine <= a:bottomline ++ ++ " get the next line and if it is allowed to be commented, or is not ++ " commented, check it ++ let theLine = getline(currentLine) ++ if a:countEmptyLines || theLine !~ '^[ \t]*$' ++ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) ++ " convert spaces to tabs and get the number of leading spaces for ++ " this line and update leftMostIndx if need be ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let leadSpaceOfLine = strlen( substitute(theLine, '\(^[ \t]*\).*$','\1','') ) ++ if leadSpaceOfLine < leftMostIndx ++ let leftMostIndx = leadSpaceOfLine ++ endif ++ endif ++ endif ++ ++ " move on to the next line ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ if leftMostIndx == 1000 ++ return 0 ++ else ++ return leftMostIndx ++ endif ++endfunction ++ ++" Function: s:Multipart() {{{2 ++" returns 1 if the current delims are multipart ++function s:Multipart() ++ return b:right != '' ++endfunction ++ ++" Function: s:NerdEcho(msg, typeOfMsg) {{{2 ++" Args: ++" -msg: the message to echo ++" -typeOfMsg: 0 = warning message ++" 1 = normal message ++function s:NerdEcho(msg, typeOfMsg) ++ if a:typeOfMsg == 0 ++ echohl WarningMsg ++ echo 'NERDCommenter:' . a:msg ++ echohl None ++ elseif a:typeOfMsg == 1 ++ echo 'NERDCommenter:' . a:msg ++ endif ++endfunction ++ ++" Function: s:NumberOfLeadingTabs(s) {{{2 ++" returns the number of leading tabs in the given string ++function s:NumberOfLeadingTabs(s) ++ return strlen(substitute(a:s, '^\(\t*\).*$', '\1', "")) ++endfunction ++ ++" Function: s:NumLinesInBuf() {{{2 ++" Returns the number of lines in the current buffer ++function s:NumLinesInBuf() ++ return line('$') ++endfunction ++ ++" Function: s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) {{{2 ++" This function takes in a string, 2 delimiters in that string and 2 strings ++" to replace these delimiters with. ++" ++" Args: ++" -toReplace1: the first delimiter to replace ++" -toReplace2: the second delimiter to replace ++" -replacor1: the string to replace toReplace1 with ++" -replacor2: the string to replace toReplace2 with ++" -str: the string that the delimiters to be replaced are in ++function s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) ++ let line = s:ReplaceLeftMostDelim(a:toReplace1, a:replacor1, a:str) ++ let line = s:ReplaceRightMostDelim(a:toReplace2, a:replacor2, line) ++ return line ++endfunction ++ ++" Function: s:ReplaceLeftMostDelim(toReplace, replacor, str) {{{2 ++" This function takes a string and a delimiter and replaces the left most ++" occurrence of this delimiter in the string with a given string ++" ++" Args: ++" -toReplace: the delimiter in str that is to be replaced ++" -replacor: the string to replace toReplace with ++" -str: the string that contains toReplace ++function s:ReplaceLeftMostDelim(toReplace, replacor, str) ++ let toReplace = a:toReplace ++ let replacor = a:replacor ++ "get the left most occurrence of toReplace ++ let indxToReplace = s:FindDelimiterIndex(toReplace, a:str) ++ ++ "if there IS an occurrence of toReplace in str then replace it and return ++ "the resulting string ++ if indxToReplace != -1 ++ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) ++ return line ++ endif ++ ++ return a:str ++endfunction ++ ++" Function: s:ReplaceRightMostDelim(toReplace, replacor, str) {{{2 ++" This function takes a string and a delimiter and replaces the right most ++" occurrence of this delimiter in the string with a given string ++" ++" Args: ++" -toReplace: the delimiter in str that is to be replaced ++" -replacor: the string to replace toReplace with ++" -str: the string that contains toReplace ++" ++function s:ReplaceRightMostDelim(toReplace, replacor, str) ++ let toReplace = a:toReplace ++ let replacor = a:replacor ++ let lenToReplace = strlen(toReplace) ++ ++ "get the index of the last delim in str ++ let indxToReplace = s:LastIndexOfDelim(toReplace, a:str) ++ ++ "if there IS a delimiter in str, replace it and return the result ++ let line = a:str ++ if indxToReplace != -1 ++ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) ++ endif ++ return line ++endfunction ++ ++"FUNCTION: s:RestoreScreenState() {{{2 ++" ++"Sets the screen state back to what it was when s:SaveScreenState was last ++"called. ++" ++function s:RestoreScreenState() ++ if !exists("t:NERDComOldTopLine") || !exists("t:NERDComOldPos") ++ throw 'NERDCommenter exception: cannot restore screen' ++ endif ++ ++ call cursor(t:NERDComOldTopLine, 0) ++ normal zt ++ call setpos(".", t:NERDComOldPos) ++endfunction ++ ++" Function: s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 ++" This function takes in 2 line numbers and returns the index of the right most ++" char on all of these lines. ++" Args: ++" -countCommentedLines: 1 if lines that are commented are to be checked as ++" well. 0 otherwise ++" -countEmptyLines: 1 if empty lines are to be counted in the search ++" -topline: the top line to be checked ++" -bottomline: the bottom line to be checked ++function s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) ++ let rightMostIndx = -1 ++ ++ " go thru the block line by line updating rightMostIndx ++ let currentLine = a:topline ++ while currentLine <= a:bottomline ++ ++ " get the next line and see if it is commentable, otherwise it doesnt ++ " count ++ let theLine = getline(currentLine) ++ if a:countEmptyLines || theLine !~ '^[ \t]*$' ++ ++ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) ++ ++ " update rightMostIndx if need be ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let lineLen = strlen(theLine) ++ if lineLen > rightMostIndx ++ let rightMostIndx = lineLen ++ endif ++ endif ++ endif ++ ++ " move on to the next line ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ return rightMostIndx ++endfunction ++ ++"FUNCTION: s:SaveScreenState() {{{2 ++"Saves the current cursor position in the current buffer and the window ++"scroll position ++function s:SaveScreenState() ++ let t:NERDComOldPos = getpos(".") ++ let t:NERDComOldTopLine = line("w0") ++endfunction ++ ++" Function: s:SwapOutterMultiPartDelimsForPlaceHolders(line) {{{2 ++" This function takes a line and swaps the outter most multi-part delims for ++" place holders ++" Args: ++" -line: the line to swap the delims in ++" ++function s:SwapOutterMultiPartDelimsForPlaceHolders(line) ++ " find out if the line is commented using normal delims and/or ++ " alternate ones ++ let isCommented = s:IsCommented(b:left, b:right, a:line) ++ let isCommentedAlt = s:IsCommented(b:leftAlt, b:rightAlt, a:line) ++ ++ let line2 = a:line ++ ++ "if the line is commented and there is a right delimiter, replace ++ "the delims with place-holders ++ if isCommented && s:Multipart() ++ let line2 = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, a:line) ++ ++ "similarly if the line is commented with the alternative ++ "delimiters ++ elseif isCommentedAlt && s:AltMultipart() ++ let line2 = s:ReplaceDelims(b:leftAlt, b:rightAlt, g:NERDLPlace, g:NERDRPlace, a:line) ++ endif ++ ++ return line2 ++endfunction ++ ++" Function: s:SwapOutterPlaceHoldersForMultiPartDelims(line) {{{2 ++" This function takes a line and swaps the outtermost place holders for ++" multi-part delims ++" Args: ++" -line: the line to swap the delims in ++" ++function s:SwapOutterPlaceHoldersForMultiPartDelims(line) ++ let left = '' ++ let right = '' ++ if s:Multipart() ++ let left = b:left ++ let right = b:right ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ let right = b:rightAlt ++ endif ++ ++ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, a:line) ++ return line ++endfunction ++" Function: s:TabbedCol(line, col) {{{2 ++" Gets the col number for given line and existing col number. The new col ++" number is the col number when all leading spaces are converted to tabs ++" Args: ++" -line:the line to get the rel col for ++" -col: the abs col ++function s:TabbedCol(line, col) ++ let lineTruncated = strpart(a:line, 0, a:col) ++ let lineSpacesToTabs = substitute(lineTruncated, s:TabSpace(), '\t', 'g') ++ return strlen(lineSpacesToTabs) ++endfunction ++"FUNCTION: s:TabSpace() {{{2 ++"returns a string of spaces equal in length to &tabstop ++function s:TabSpace() ++ let tabSpace = "" ++ let spacesPerTab = &tabstop ++ while spacesPerTab > 0 ++ let tabSpace = tabSpace . " " ++ let spacesPerTab = spacesPerTab - 1 ++ endwhile ++ return tabSpace ++endfunction ++ ++" Function: s:UnEsc(str, escChar) {{{2 ++" This function removes all the escape chars from a string ++" Args: ++" -str: the string to remove esc chars from ++" -escChar: the escape char to be removed ++function s:UnEsc(str, escChar) ++ return substitute(a:str, a:escChar, "", "g") ++endfunction ++ ++" Function: s:UntabbedCol(line, col) {{{2 ++" Takes a line and a col and returns the absolute column of col taking into ++" account that a tab is worth 3 or 4 (or whatever) spaces. ++" Args: ++" -line:the line to get the abs col for ++" -col: the col that doesnt take into account tabs ++function s:UntabbedCol(line, col) ++ let lineTruncated = strpart(a:line, 0, a:col) ++ let lineTabsToSpaces = substitute(lineTruncated, '\t', s:TabSpace(), 'g') ++ return strlen(lineTabsToSpaces) ++endfunction ++" Section: Comment mapping setup {{{1 ++" =========================================================================== ++" This is where the mappings calls are made that set up the commenting key ++" mappings. ++ ++" set up the mapping to switch to/from alternative delimiters ++execute 'nnoremap ' . g:NERDAltComMap . ' :call SwitchToAlternativeDelimiters(1)' ++ ++" set up the mappings to comment out lines ++execute 'nnoremap ' . g:NERDComLineMap . ' :call NERDComment(0, "norm")' ++execute 'vnoremap ' . g:NERDComLineMap . ' :call NERDComment(1, "norm")' ++ ++" set up the mappings to do toggle comments ++execute 'nnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(0, "toggle")' ++execute 'vnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(1, "toggle")' ++ ++" set up the mapp to do minimal comments ++execute 'nnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(0, "minimal")' ++execute 'vnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(1, "minimal")' ++ ++" set up the mappings to comment out lines sexily ++execute 'nnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(0, "sexy")' ++execute 'vnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(1, "sexy")' ++ ++" set up the mappings to do invert comments ++execute 'nnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(0, "invert")' ++execute 'vnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(1, "invert")' ++ ++" set up the mappings to yank then comment out lines ++execute 'nmap ' . g:NERDComLineYankMap . ' :call NERDComment(0, "yank")' ++execute 'vmap ' . g:NERDComLineYankMap . ' :call NERDComment(1, "yank")' ++ ++" set up the mappings for left aligned comments ++execute 'nnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(0, "alignLeft")' ++execute 'vnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(1, "alignLeft")' ++ ++" set up the mappings for right aligned comments ++execute 'nnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(0, "alignRight")' ++execute 'vnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(1, "alignRight")' ++ ++" set up the mappings for left and right aligned comments ++execute 'nnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(0, "alignBoth")' ++execute 'vnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(1, "alignBoth")' ++ ++" set up the mappings to do nested comments ++execute 'nnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(0, "nested")' ++execute 'vnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(1, "nested")' ++ ++" set up the mapping to uncomment a line ++execute 'nnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(0, "uncomment")' ++execute 'vnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(1, "uncomment")' ++ ++" set up the mapping to comment out to the end of the line ++execute 'nnoremap ' . g:NERDComToEOLMap . ' :call NERDComment(0, "toEOL")' ++ ++" set up the mappings to append comments to the line ++execute 'nmap ' . g:NERDAppendComMap . ' :call NERDComment(0, "append")' ++ ++" set up the mappings to append comments to the line ++execute 'nmap ' . g:NERDPrependComMap . ' :call NERDComment(0, "prepend")' ++ ++" set up the mapping to insert comment delims at the cursor position in insert mode ++execute 'inoremap ' . g:NERDComInInsertMap . ' ' . ':call NERDComment(0, "insert")' ++ ++" Section: Menu item setup {{{1 ++" =========================================================================== ++"check if the user wants the menu to be displayed ++if g:NERDMenuMode != 0 ++ ++ let menuRoot = "" ++ if g:NERDMenuMode == 1 ++ let menuRoot = 'comment' ++ elseif g:NERDMenuMode == 2 ++ let menuRoot = '&comment' ++ elseif g:NERDMenuMode == 3 ++ let menuRoot = '&Plugin.&comment' ++ endif ++ ++ execute 'nmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(0, "norm")' ++ execute 'vmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(1, "norm")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(0, "toggle")' ++ execute 'vmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(1, "toggle")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(0, "minimal")' ++ execute 'vmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(1, "minimal")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(0, "nested")' ++ execute 'vmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(1, "nested")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ To\ EOL' . escape(g:NERDComToEOLMap, '\') . ' :call NERDComment(0, "toEOL")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(0,"invert")' ++ execute 'vmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(1,"invert")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(0,"sexy")' ++ execute 'vmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(1,"sexy")' ++ ++ execute 'nmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0Y' . g:NERDComLineMap ++ execute 'vmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0ygv' . g:NERDComLineMap ++ ++ execute 'nmenu '. menuRoot .'.Append\ Comment\ to\ Line' . escape(g:NERDAppendComMap, '\') . ' :call NERDComment(0, "append")' ++ execute 'nmenu '. menuRoot .'.Prepend\ Comment\ to\ Line' . escape(g:NERDPrependComMap, '\') . ' :call NERDComment(0, "prepend")' ++ ++ execute 'menu '. menuRoot .'.-Sep- :' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(0, "alignLeft")' ++ execute 'vmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(1, "alignLeft")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(0, "alignRight")' ++ execute 'vmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(1, "alignRight")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(0, "alignBoth")' ++ execute 'vmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(1, "alignBoth")' ++ ++ execute 'menu '. menuRoot .'.-Sep2- :' ++ ++ execute 'menu '. menuRoot .'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(0, "uncomment")' ++ execute 'vmenu ' . menuRoot.'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(1, "uncomment")' ++ ++ execute 'menu '. menuRoot .'.-Sep3- :' ++ ++ execute 'nmenu '. menuRoot .'.Use\ Alternative\ Delimiters' . escape(g:NERDAltComMap, '\') . ' :call SwitchToAlternativeDelimiters(1)' ++ ++ ++ execute 'imenu '. menuRoot .'.Insert\ Delims' . escape(g:NERDComInInsertMap, '\') . ' :call NERDComment(0, "insert")' ++ ++ execute 'menu '. menuRoot .'.-Sep4- :' ++ ++ execute 'menu '. menuRoot .'.Help:help\ NERDCommenterContents :help NERDCommenterContents' ++endif ++ ++" Section: Doc installation call {{{1 ++silent call s:InstallDocumentation(expand(':p'), s:NERD_commenter_version) ++ ++finish ++"============================================================================= ++" Section: The help file {{{1 ++" Title {{{2 ++" ============================================================================ ++=== START_DOC ++*NERD_commenter.txt* Plugin for commenting code #version# ++ ++ ++ NERD COMMENTER REFERENCE MANUAL~ ++ ++ ++ ++ ++ ++============================================================================== ++CONTENTS {{{2 *NERDCommenterContents* ++ ++ 1.Intro...................................|NERDCommenter| ++ 2.Functionality provided..................|NERDComFunctionality| ++ 2.1 Functionality Summary.............|NERDComFunctionalitySummary| ++ 2.2 Functionality Details.............|NERDComFunctionalityDetails| ++ 2.2.1 Comment map.................|NERDComComment| ++ 2.2.2 Nested comment map..........|NERDComNestedComment| ++ 2.2.3 Toggle comment map..........|NERDComToggleComment| ++ 2.2.4 Minimal comment map.........|NERDComMinimalComment| ++ 2.2.5 Invert comment map..........|NERDComInvertComment| ++ 2.2.6 Sexy comment map............|NERDComSexyComment| ++ 2.2.7 Yank comment map............|NERDComYankComment| ++ 2.2.8 Comment to EOL map..........|NERDComEOLComment| ++ 2.2.9 Append com to line map......|NERDComAppendComment| ++ 2.2.10 Prepend com to line map....|NERDComPrependComment| ++ 2.2.11 Insert comment map.........|NERDComInsertComment| ++ 2.2.12 Use alternate delims map...|NERDComAltDelim| ++ 2.2.13 Comment aligned maps.......|NERDComAlignedComment| ++ 2.2.14 Uncomment line map.........|NERDComUncommentLine| ++ 2.3 Supported filetypes...............|NERDComFiletypes| ++ 2.4 Sexy Comments.....................|NERDComSexyComments| ++ 2.5 The NERDComment function..........|NERDComNERDComment| ++ 3.Options.................................|NERDComOptions| ++ 3.1 Options summary...................|NERDComOptionsSummary| ++ 3.2 Options details...................|NERDComOptionsDetails| ++ 3.3 Default delimiter Options.........|NERDComDefaultDelims| ++ 3.4 Key mapping Options...............|NERDComMappings| ++ 4.Issues with the script..................|NERDComIssues| ++ 4.1 Delimiter detection heuristics....|NERDComHeuristics| ++ 4.2 Nesting issues....................|NERDComNesting| ++ 5.The author..............................|NERDComAuthor| ++ 6.TODO list...............................|NERDComTodo| ++ 7.Changelog...............................|NERDComChangelog| ++ 8.Credits.................................|NERDComCredits| ++ ++============================================================================== ++1. Intro {{{2 *NERDCommenter* ++ ++The NERD commenter provides many different commenting operations and styles ++which may be invoked via key mappings and a commenting menu. These operations ++are available for most filetypes. ++ ++There are also options available that allow you to tweak the commenting engine ++to you taste. ++ ++============================================================================== ++2. Functionality provided {{{2 *NERDComFunctionality* ++ ++------------------------------------------------------------------------------ ++2.1 Functionality summary {{{3 *NERDComFunctionalitySummary* ++ ++The following key mappings are provided by default (there is also a menu ++provided that contains menu items corresponding to all the below mappings): ++ ++Most of the following mappings are for normal/visual mode only. The ++|NERDComInsertComment| mapping is for insert mode only. ++ ++[count],cc |NERDComComment| ++Comments out the current line or text selected in visual mode. ++ ++ ++[count],cn |NERDComNestedComment| ++Same as |NERDComComment| but forces nesting. ++ ++ ++[count],c |NERDComToggleComment| ++Toggles the comment state of the selected line(s). If the topmost selected ++line is commented, all selected lines are uncommented and vice versa. ++ ++ ++[count],cm |NERDComMinimalComment| ++Comments the given lines using only one set of multipart delimiters if ++possible. ++ ++ ++[count],ci |NERDComInvertComment| ++Toggles the comment state of the selected line(s) individually. Each selected ++line that is commented is uncommented and vice versa. ++ ++ ++[count],cs |NERDComSexyComment| ++Comments out the selected lines ``sexually'' ++ ++ ++[count],cy |NERDComYankComment| ++Same as |NERDComComment| except that the commented line(s) are yanked ++before commenting. ++ ++ ++,c$ |NERDComEOLComment| ++Comments the current line from the cursor to the end of line. ++ ++ ++,cA |NERDComAppendComment| ++Adds comment delimiters to the end of line and goes into insert mode between ++them. ++ ++ ++,cI |NERDComPrependComment| ++Adds comment delimiters to the start of line and goes into insert mode between ++them. ++ ++ ++ |NERDComInsertComment| ++Adds comment delimiters at the current cursor position and inserts between. ++ ++ ++,ca |NERDComAltDelim| ++Switches to the alternative set of delimiters. ++ ++ ++[count],cl ++[count],cr ++[count],cb |NERDComAlignedComment| ++Same as |NERDComComment| except that the delimiters are aligned down the ++left side (,cl), the right side (,cr) or both sides ++(,cb). ++ ++ ++[count],cu |NERDComUncommentLine| ++Uncomments the selected line(s). ++ ++------------------------------------------------------------------------------ ++2.2 Functionality details {{{3 *NERDComFunctionalityDetails* ++ ++------------------------------------------------------------------------------ ++2.2.1 Comment map *NERDComComment* ++ ++Default mapping: [count],cc ++Change the mapping with: NERDComLineMap. ++Applicable modes: normal visual visual-line visual-block. ++ ++ ++Comments out the current line. If multiple lines are selected in visual-line ++mode, they are all commented out. If some text is selected in visual or ++visual-block mode then the script will try to comment out the exact text that ++is selected using multi-part delimiters if they are available. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.2 Nested comment map *NERDComNestedComment* ++ ++Default mapping: [count],cn ++Change the mapping with: NERDComLineNestMap. ++Applicable modes: normal visual visual-line visual-block. ++ ++Performs nested commenting. Works the same as ,cc except that if a ++line is already commented then it will be commented again. ++ ++If |NERDUsePlaceHolders| is set then the previous comment delimiters will ++be replaced by place-holder delimiters if needed. Otherwise the nested ++comment will only be added if the current commenting delimiters have no right ++delimiter (to avoid syntax errors) ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++Related options: ++|NERDDefaultNesting| ++ ++------------------------------------------------------------------------------ ++2.2.3 Toggle comment map *NERDComToggleComment* ++ ++Default mapping: [count],c ++Change the mapping with: NERDComLineToggleMap. ++Applicable modes: normal visual-line. ++ ++Toggles commenting of the lines selected. The behaviour of this mapping ++depends on whether the first line selected is commented or not. If so, all ++selected lines are uncommented and vice versa. ++ ++With this mapping, a line is only considered to be commented if it starts with ++a left delimiter. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.4 Minimal comment map *NERDComMinimalComment* ++ ++Default mapping: [count],cm ++Change the mapping with: NERDComLineMinimalMap ++Applicable modes: normal visual-line. ++ ++Comments the selected lines using one set of multipart delimiters if possible. ++ ++For example: if you are programming in c and you select 5 lines and press ++,cm then a '/*' will be placed at the start of the top line and a '*/' ++will be placed at the end of the last line. ++ ++Sets of multipart comment delimiters that are between the top and bottom ++selected lines are replaced with place holders (see |NERDLPlace|) if ++|NERDUsePlaceHolders| is set for the current filetype. If it is not, then ++the comment will be aborted if place holders are required to prevent illegal ++syntax. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.5 Invert comment map *NERDComInvertComment* ++ ++Default mapping: ,ci ++Change the mapping with: NERDComLineInvertMap. ++Applicable modes: normal visual-line. ++ ++Inverts the commented state of each selected line. If the a selected line is ++commented then it is uncommented and vice versa. Each line is examined and ++commented/uncommented individually. ++ ++With this mapping, a line is only considered to be commented if it starts with ++a left delimiter. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.6 Sexy comment map *NERDComSexyComment* ++ ++Default mapping: [count],cs ++Change the mapping with: NERDComLineSexyMap ++Applicable modes: normal, visual-line. ++ ++Comments the selected line(s) ``sexily''... see |NERDComSexyComments| for ++a description of what sexy comments are. Can only be done on filetypes for ++which there is at least one set of multipart comment delimiters specified. ++ ++Sexy comments cannot be nested and lines inside a sexy comment cannot be ++commented again. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++Related options: ++|NERDCompactSexyComs| ++ ++------------------------------------------------------------------------------ ++2.2.7 Yank comment map *NERDComYankComment* ++ ++Default mapping: [count],cy ++Change the mapping with: NERDComLineYankMap ++Applicable modes: normal visual visual-line visual-block. ++ ++Same as ,cc except that it yanks the line(s) that are commented first. ++ ++------------------------------------------------------------------------------ ++2.2.8 Comment to EOL map *NERDComEOLComment* ++ ++Default mapping: ,c$ ++Change the mapping with: NERDComToEOLMap ++Applicable modes: normal. ++ ++Comments the current line from the current cursor position up to the end of ++the line. ++ ++------------------------------------------------------------------------------ ++2.2.9 Append com to line map *NERDComAppendComment* ++ ++Default mapping: ,cA ++Change the mapping with: NERDAppendComMap. ++Applicable modes: normal. ++ ++Appends comment delimiters to the end of the current line and goes ++to insert mode between the new delimiters. ++ ++------------------------------------------------------------------------------ ++2.2.10 Prepend com to line map *NERDComPrependComment* ++ ++Default mapping: ,cI ++Change the mapping with: NERDPrependComMap. ++Applicable modes: normal. ++ ++Prepends comment delimiters to the start of the current line and goes to ++insert mode between the new delimiters. ++ ++------------------------------------------------------------------------------ ++2.2.11 Insert comment map *NERDComInsertComment* ++ ++Default mapping: ++Change the mapping with: NERDComInInsertMap. ++Applicable modes: insert. ++ ++Adds comment delimiters at the current cursor position and inserts ++between them. ++ ++------------------------------------------------------------------------------ ++2.2.12 Use alternate delims map *NERDComAltDelim* ++ ++Default mapping: ,ca ++Change the mapping with: NERDAltComMap ++Applicable modes: normal. ++ ++Changes to the alternative commenting style if one is available. For example, ++if the user is editing a c++ file using // comments and they hit ,ca ++then they will be switched over to /**/ comments. ++ ++See also |NERDComDefaultDelims| ++ ++------------------------------------------------------------------------------ ++2.2.13 Comment aligned maps *NERDComAlignedComment* ++ ++Default mappings: [count],cl [count],cr [count],cb ++Change the mappings with: NERDComAlignLeftMap, NERDComAlignRightMap and ++NERDComAlignBothMap. ++Applicable modes: normal visual-line. ++ ++Same as ,cc except that the comment delimiters are aligned on the left ++side, right side or both sides respectively. These comments are always nested ++if the line(s) are already commented. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.14 Uncomment line map *NERDComUncommentLine* ++ ++Default mapping: [count],cu ++Change the mapping with: NERDUncomLineMap. ++Applicable modes: normal visual visual-line visual-block. ++ ++Uncomments the current line. If multiple lines are selected in ++visual mode then they are all uncommented. ++ ++When uncommenting, if the line contains multiple sets of delimiters then the ++``outtermost'' pair of delimiters will be removed. ++ ++The script uses a set of heurisics to distinguish ``real'' delimiters from ++``fake'' ones when uncommenting. See |NERDComIssues| for details. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++Related options: ++|NERDRemoveAltComs| ++|NERDRemoveExtraSpaces| ++ ++------------------------------------------------------------------------------ ++2.3 Supported filetypes {{{3 *NERDComFiletypes* ++ ++Filetypes that can be commented by this plugin: ++abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asn ++aspvbs atlas autohotkey autoit automake ave awk basic b bc bdf bib bindzone ++bst btm caos catalog c cfg cg ch changelog cl clean clipper cmake conf config ++context cpp crontab cs csc csp css cterm cupl csv cvs dcl debchangelog ++debcontrol debsources def diff django docbk dns dosbatch dosini dot dracula ++dsl dtd dtml dylan ecd eiffel elf elmfilt erlang eruby eterm expect exports ++fetchmail fgl focexec form fortran foxpro fstab fvwm fx gdb gdmo geek ++gentoo-package-keywords' gentoo-package-mask' gentoo-package-use' gnuplot ++gtkrc haskell hb h help hercules hog html htmldjango htmlos ia64 icon idlang ++idl indent inform inittab ishd iss ist jam java javascript jess jgraph ++jproperties jproperties jsp kconfig kix kscript lace lex lftp lifelines lilo ++lisp lite lotos lout lprolog lscript lss lua lynx m4 mail make maple masm ++master matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc ++named nasm nastran natural ncf netdict netrw nqc nroff nsis objc ocaml occam ++omlet omnimark openroad opl ora otl ox pascal passwd pcap pccts perl pfmain ++php phtml pic pike pilrc pine plaintex plm plsql po postscr pov povini ppd ++ppwiz procmail progress prolog psf ptcap python python qf radiance ratpoison r ++rc readline rebol registry remind rexx robots rpl rtf ruby sa samba sas sass ++sather scheme scilab screen scsh sdl sed selectbuf sgml sgmldecl sgmllnx sh ++sicad simula sinda skill slang sl slrnrc sm smarty smil smith sml snnsnet ++snnspat snnsres snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp ++strace svn systemverilog tads taglist tags tak tasm tcl terminfo tex text ++plaintex texinfo texmf tf tidy tli trasys tsalt tsscl tssgm uc uil vb verilog ++verilog_systemverilog vgrindefs vhdl vim viminfo virata vo_base vrml vsejcl ++webmacro wget winbatch wml wvdial xdefaults xf86conf xhtml xkb xmath xml ++xmodmap xpm2 xpm xslt yacc yaml z8a ++ ++If a language is not in the list of hardcoded supported filetypes then the ++&commentstring vim option is used. ++ ++------------------------------------------------------------------------------ ++2.4 Sexy Comments {{{3 *NERDComSexyComments* ++These are comments that use one set of multipart comment delimiters as well as ++one other marker symbol. For example: > ++ /* ++ * This is a c style sexy comment ++ * So there! ++ */ ++ ++ /* This is a c style sexy comment ++ * So there! ++ * But this one is ``compact'' style */ ++< ++Here the multipart delimiters are /* and */ and the marker is *. The NERD ++commenter is capable of adding and removing comments of this type. ++ ++------------------------------------------------------------------------------ ++2.5 The NERDComment function {{{3 *NERDComNERDComment* ++ ++All of the NERD commenter mappings and menu items invoke a single function ++which delegates the commenting work to other functions. This function is ++public and has the prototype: > ++ function! NERDComment(isVisual, type) ++< ++The arguments to this function are simple: ++ - isVisual: if you wish to do any kind of visual comment then set this to ++ 1 and the function will use the '< and '> marks to find the comment ++ boundries. If set to 0 then the function will operate on the current ++ line. ++ - type: is used to specify what type of commenting operation is to be ++ performed, and it can be one of the following: 'sexy', 'invert', ++ 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', ++ 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' ++ ++For example, if you typed > ++ :call NERDComment(1, 'sexy') ++< ++then the script would do a sexy comment on the last visual selection. ++ ++ ++============================================================================== ++3. Options {{{2 *NERDComOptions* ++ ++------------------------------------------------------------------------------ ++3.1 Options summary *NERDComOptionsSummary* ++ ++|loaded_nerd_comments| Turns off the script. ++|NERDAllowAnyVisualDelims| Allows multipart alternative delims to ++ be used when commenting in ++ visual/visual-block mode. ++|NERDBlockComIgnoreEmpty| Forces right delims to be placed when ++ doing visual-block comments. ++|NERDCommentWholeLinesInVMode| Changes behaviour of visual comments. ++|NERDDefaultNesting| Tells the script to use nested comments ++ by default. ++|NERDMenuMode| Specifies how the NERD commenter menu ++ will appear (if at all). ++|NERDLPlace| Specifies what to use as the left ++ delimiter placeholder when nesting ++ comments. ++|NERDMapleader| Specifies what all the commenting key ++ mappings will begin with. ++|NERDUsePlaceHolders| Specifies which filetypes may use ++ placeholders when nesting comments. ++|NERDRemoveAltComs| Tells the script whether to remove ++ alternative comment delimiters when ++ uncommenting. ++|NERDRemoveExtraSpaces| Tells the script to always remove the ++ extra spaces when uncommenting ++ (regardless of whether NERDSpaceDelims ++ is set) ++|NERDRPlace| Specifies what to use as the right ++ delimiter placeholder when nesting ++ comments. ++|NERDShutUp| Stops "Unknown filetype" output from the ++ script ++|NERDSpaceDelims| Specifies whether to add extra spaces ++ around delimiters when commenting, and ++ whether to remove them when ++ uncommenting. ++|NERDCompactSexyComs| Specifies whether to use the compact ++ style sexy comments. ++ ++------------------------------------------------------------------------------ ++3.3 Options details *NERDComOptionsDetails* ++ ++To enable any of the below options you should put the given line in your ++~/.vimrc ++ ++ *loaded_nerd_comments* ++If this script is driving you insane you can turn it off by setting this ++option > ++ let loaded_nerd_comments=1 ++< ++------------------------------------------------------------------------------ ++ *NERDAllowAnyVisualDelims* ++Values: 0 or 1. ++Default: 1. ++ ++If set to 1 then, when doing a visual or visual-block comment (but not a ++visual-line comment), the script will choose the right delimiters to use for ++the comment. This means either using the current delimiters if they are ++multipart or using the alternative delimiters if THEY are multipart. For ++example if we are editing the following java code: > ++ float foo = 1221; ++ float bar = 324; ++ System.out.println(foo * bar); ++< ++If we are using // comments and select the "foo" and "bar" in visual-block ++mode, as shown left below (where '|'s are used to represent the visual-block ++boundary), and comment it then the script will use the alternative delims as ++shown on the right: > ++ ++ float |foo| = 1221; float /*foo*/ = 1221; ++ float |bar| = 324; float /*bar*/ = 324; ++ System.out.println(foo * bar); System.out.println(foo * bar); ++< ++------------------------------------------------------------------------------ ++ *NERDBlockComIgnoreEmpty* ++Values: 0 or 1. ++Default: 1. ++ ++This option affects visual-block mode commenting. If this option is turned ++on, lines that begin outside the right boundary of the selection block will be ++ignored. ++ ++For example, if you are commenting this chunk of c code in visual-block mode ++(where the '|'s are used to represent the visual-block boundary) > ++ #include ++ #include ++ #include ++ |int| main(){ ++ | | printf("SUCK THIS\n"); ++ | | while(1){ ++ | | fork(); ++ | | } ++ |} | ++< ++If NERDBlockComIgnoreEmpty=0 then this code will become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ /* */ printf("SUCK THIS\n"); ++ /* */ while(1){ ++ /* */ fork(); ++ /* */ } ++ /*} */ ++< ++Otherwise, the code block would become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ printf("SUCK THIS\n"); ++ while(1){ ++ fork(); ++ } ++ /*} */ ++< ++------------------------------------------------------------------------------ ++ *NERDCommentWholeLinesInVMode* ++Values: 0, 1 or 2. ++Default: 0. ++ ++By default the script tries to comment out exactly what is selected in visual ++mode (v). For example if you select and comment the following c code (using | ++to represent the visual boundary): > ++ in|t foo = 3; ++ int bar =| 9; ++ int baz = foo + bar; ++< ++This will result in: > ++ in/*t foo = 3;*/ ++ /*int bar =*/ 9; ++ int baz = foo + bar; ++< ++But some people prefer it if the whole lines are commented like: > ++ /*int foo = 3;*/ ++ /*int bar = 9;*/ ++ int baz = foo + bar; ++< ++If you prefer the second option then stick this line in your vimrc: > ++ let NERDCommentWholeLinesInVMode=1 ++< ++ ++If the filetype you are editing only has no multipart delimiters (for example ++a shell script) and you hadnt set this option then the above would become > ++ in#t foo = 3; ++ #int bar = 9; ++< ++(where # is the comment delimiter) as this is the closest the script can ++come to commenting out exactly what was selected. If you prefer for whole ++lines to be commented out when there is no multipart delimiters but the EXACT ++text that was selected to be commented out if there IS multipart delimiters ++then stick the following line in your vimrc: > ++ let NERDCommentWholeLinesInVMode=2 ++< ++ ++Note that this option does not affect the behaviour of |visual-block| mode. ++ ++------------------------------------------------------------------------------ ++ *NERDRemoveAltComs* ++Values: 0 or 1. ++Default: 1. ++ ++When uncommenting a line (for a filetype with an alternative commenting style) ++this option tells the script whether to look for, and remove, comments ++delimiters of the alternative style. ++ ++For example, if you are editing a c++ file using // style comments and you go ++,cu on this line: > ++ /* This is a c++ comment baby! */ ++< ++It will not be uncommented if the NERDRemoveAltComs is set to 0. ++ ++------------------------------------------------------------------------------ ++ *NERDRemoveExtraSpaces* ++Values: 0 or 1. ++Default: 1. ++ ++By default, the NERD commenter will remove spaces around comment delimiters if ++either: ++1. |NERDSpaceDelims| is set to 1. ++2. NERDRemoveExtraSpaces is set to 1. ++ ++This means that if we have the following lines in a c code file: > ++ /* int foo = 5; */ ++ /* int bar = 10; */ ++ int baz = foo + bar ++< ++If either of the above conditions hold then if these lines are uncommented ++they will become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++Otherwise they would become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++If you want the spaces to be removed only if |NERDSpaceDelims| is set then ++set NERDRemoveExtraSpaces to 0. ++ ++------------------------------------------------------------------------------ ++ *NERDLPlace* ++ *NERDRPlace* ++Values: arbitrary string. ++Default: ++ NERDLPlace: "[>" ++ NERDRPlace: "<]" ++ ++These options are used to control the strings used as place-holder delimiters. ++Place holder delimiters are used when performing nested commenting when the ++filetype supports commenting styles with both left and right delimiters. ++To set these options use lines like: > ++ let NERDLPlace="FOO" ++ let NERDRPlace="BAR" ++< ++Following the above example, if we have line of c code: > ++ /* int horse */ ++< ++and we comment it with ,cn it will be changed to: > ++ /*FOO int horse BAR*/ ++< ++When we uncomment this line it will go back to what it was. ++ ++------------------------------------------------------------------------------ ++ *NERDMapleader* ++Values: arbitrary string. ++Default: \c ++ ++NERDMapleader is used to specify what all the NERD commenter key mappings ++begin with. ++ ++The default key mappings will look like this: > ++ \cc ++ \cu ++ \ca ++ \ci ++ \cs ++ ... ++< ++However, if this line: > ++ let NERDMapleader = ',x' ++< ++were present in your vimrc then the default mappings would look like this: > ++ ,xc ++ ,xu ++ ,xa ++ ,xi ++ ,xs ++ ... ++< ++This option only affects the mappings that have not been explicitly set ++manually (see |NERDComMappings|). ++ ++------------------------------------------------------------------------------ ++ *NERDMenuMode* ++Values: 0, 1, 2, 3. ++Default: 3 ++ ++This option can take 4 values: ++ "0": Turns the menu off. ++ "1": Turns the 'comment' menu on with no menu shortcut. ++ "2": Turns the 'comment 'menu on with -c as the shortcut. ++ "3": Turns the 'Plugin -> comment' menu on with -c as the shortcut. ++ ++------------------------------------------------------------------------------ ++ *NERDUsePlaceHolders* ++Values: 0 or 1. ++Default 1. ++ ++This option is used to specify whether place-holder delimiters should be used ++when adding nested comments. ++ ++------------------------------------------------------------------------------ ++ *NERDShutUp* ++Values: 0 or 1. ++Default 1. ++ ++This option is used to prevent the script from echoing "Unknown filetype" ++messages. Stick this line in your vimrc: > ++ let NERDShutUp=1 ++< ++------------------------------------------------------------------------------ ++ *NERDSpaceDelims* ++Values: 0 or 1. ++Default 0. ++ ++Some people prefer a space after the left delimiter and before the right ++delimiter like this: > ++ /* int foo=2; */ ++< ++as opposed to this: > ++ /*int foo=2;*/ ++< ++If you want spaces to be added then set NERDSpaceDelims to 1 in your vimrc. ++ ++See also |NERDRemoveExtraSpaces|. ++ ++------------------------------------------------------------------------------ ++ *NERDCompactSexyComs* ++Values: 0 or 1. ++Default 0. ++ ++Some people may want their sexy comments to be like this: > ++ /* Hi There! ++ * This is a sexy comment ++ * in c */ ++< ++As opposed to like this: > ++ /* ++ * Hi There! ++ * This is a sexy comment ++ * in c ++ */ ++< ++If this option is set to 1 then the top style will be used. ++ ++------------------------------------------------------------------------------ ++ *NERDDefaultNesting* ++Values: 0 or 1. ++Default 0. ++ ++When this option is set to 1, comments are nested automatically. That is, if ++you hit ,cc on a line that is already commented it will be commented ++again ++ ++------------------------------------------------------------------------------ ++3.3 Default delimiter customisation *NERDComDefaultDelims* ++ ++If you want the NERD commenter to use the alternative delimiters for a ++specific filetype by default then put a line of this form into your vimrc: > ++ let NERD_<&filetype>_alt_style=1 ++< ++Example: java uses // style comments by default, but you want it to default to ++/* */ style comments instead. You would put this line in your vimrc: > ++ let NERD_java_alt_style=1 ++< ++ ++See |NERDComAltDelim| for switching commenting styles at runtime. ++ ++------------------------------------------------------------------------------ ++3.4 Key mapping customisation *NERDComMappings* ++ ++These options are used to override the default keys that are used for the ++commenting mappings. Their values must be set to strings. As an example: if ++you wanted to use the mapping ,foo to uncomment lines of code then ++you would place this line in your vimrc > ++ let NERDUncomLineMap=",foo" ++< ++Check out |NERDComFunctionality| for details about what the following ++mappings do. ++ ++Default Mapping Option to override~ ++ ++,ca NERDAltComMap ++,ce NERDAppendComMap ++,cl NERDComAlignLeftMap ++,cb NERDComAlignBothMap ++,cr NERDComAlignRightMap ++ NERDComInInsertMap ++,ci NERDComLineInvertMap ++,cc NERDComLineMap ++,cn NERDComLineNestMap ++,cs NERDComLineSexyMap ++,c NERDComLineToggleMap ++,cm NERDComLineMinimalMap ++,c$ NERDComToEOLMap ++,cy NERDComLineYankMap ++,cu NERDUncomLineMap ++ ++============================================================================== ++4. Issues with the script{{{2 *NERDComIssues* ++ ++ ++------------------------------------------------------------------------------ ++4.1 Delimiter detection heuristics *NERDComHeuristics* ++ ++Heuristics are used to distinguish the real comment delimiters ++ ++Because we have comment mappings that place delimiters in the middle of lines, ++removing comment delimiters is a bit tricky. This is because if comment ++delimiters appear in a line doesnt mean they really ARE delimiters. For ++example, Java uses // comments but the line > ++ System.out.println("//"); ++< ++clearly contains no real comment delimiters. ++ ++To distinguish between ``real'' comment delimiters and ``fake'' ones we use a ++set of heuristics. For example, one such heuristic states that any comment ++delimiter that has an odd number of non-escaped " characters both preceding ++and following it on the line is not a comment because it is probably part of a ++string. These heuristics, while usually pretty accurate, will not work for all ++cases. ++ ++------------------------------------------------------------------------------ ++4.2 Nesting issues *NERDComNesting* ++ ++If we have some line of code like this: > ++ /*int foo */ = /*5 + 9;*/ ++< ++This will not be uncommented legally. The NERD commenter will remove the ++"outter most" delimiters so the line will become: > ++ int foo */ = /*5 + 9; ++< ++which almost certainly will not be what you want. Nested sets of comments will ++uncomment fine though. Eg: > ++ /*int/* foo =*/ 5 + 9;*/ ++< ++will become: > ++ int/* foo =*/ 5 + 9; ++< ++(Note that in the above examples I have deliberately not used place holders ++for simplicity) ++ ++============================================================================== ++6. The author {{{2 *NERDComAuthor* ++ ++The author of the NERD commenter is Martyzillatron --- the half robot, half ++dinosaur bastard son of Megatron and Godzilla. He enjoys destroying ++metropolises and eating tourist busses. ++ ++Drop him a line at martin_grenfell at msn.com. He would love to hear from you. ++its a lonely life being the worlds premier terror machine. How would you feel ++if your face looked like a toaster and a t-rex put together? :( ++ ++============================================================================== ++7. TODO list {{{2 *NERDComTodo* ++ ++Uncommenting of minimal comments needs to be more robust. Currently it is easy ++to get illegal syntax when uncommenting them. ++ ++ ++ ++============================================================================== ++8. Changelog {{{2 *NERDComChangelog* ++ ++2.1.4 ++ - added support for the ahk filetype. Cheers to Don Hatlestad for the ++ email. ++ - added support for desktop and xsd filetypes. Thanks to Christophe Benz. ++ - added dummy support for Rails-log ++ - fixed a bunch of bugs in the comment delimiter setup process, thanks to ++ Cheng Fang for the email :D ++ - hardcore refactoring and removal of seldomly used, overly-complex ++ functionality. ++ - the script now requires vim 7 ++2.1.3 ++ - fixed numerous bugs that were causing tabs to permanently be converted ++ to spaces, even if noexpandtab was set. Thanks to Heptite on #vim for ++ working with me to track them down :) ++ - added dummy support for "lookupfile". Thanks to David Fishburn for the ++ email. ++ - added support for "rst", thanks to Niels Aan de Brugh for the email. ++ ++2.1.2 ++ - added support for the vera and ldif filetypes. Thanks to Normandie ++ Azucena and Florian Apolloner for the emails. ++ ++2.1.1 ++ - added dummy support for SVNcommitlog and vcscommit. Thanks to John ++ O'Shea for the email. ++ - added support for Groovy. Thanks to Jason Mills for the email. ++2.1.0 ++ - now the script resets the delimiters when the filetype of the buffer ++ changes (thanks to James Hales for the patch) ++ - added formal support/doc for prepending a count to many of the ++ commenting maps so you can go, eg, 5,cc to comment 5 lines from normal ++ mode. Thanks again to James Hales for the patch. ++ - added support for the "gams" filetype that Jorge Rodrigues created. ++ - added support for the "objc" filetype, thanks to Rainer Müller for the ++ email. ++ - added support for the "sass" filetype that Dmitry Ilyashevich created. ++ ++2.0.7 ++ - Added support for eclass and ebuild filetypes. Thanks to Alex Tarkovsky ++ for the email. ++ ++2.0.6 ++ - Changed the default setting of NERDMapleader to ",c", meaning all the ++ maps now start with ,c instead of \c. This is to stop a major mapping ++ clash with the vcscommand plugin. Anyone wanting to keep the \c map ++ leader should read :help NERDMapleader. ++ - Added support for debcontrol and dummy support for debchangelog ++ filetypes, thanks to Stefano Zacchiroli for the email. ++ - Made it so that the NERDShutUp option now only controls the "Pleeease ++ email the delimiters..." requests. It no longer affects the general ++ output of the script. ++ - Simplified the names of the help tags. ++ ++2.0.5 ++ - Added support for autoit, autohotkey and docbk filetypes (thanks to ++ Michael Böhler) ++ - Added support for cmake (thanks to Aaron Small) ++ - Added support for htmldjango and django filetypes (thanks to Ramiro ++ Morales) ++ - Improved the delimiters for eruby again ++ - Applied a patch from Seth Mason to fix some pathing issues with the help ++ file installation. ++ ++2.0.4 ++ - Added support for verilog_systemverilog and systemverilog filetypes ++ (Thanks to Alexey for the email) ++ - Added support for fstab, thanks to Lizendir for the email. ++ - Added support for the smarty filetype. ++ - Improved the delimiters for eruby. ++ - Added dummy support for changelog filetype. ++ ++2.0.3 ++ - Added dummy support for the csv filetype (thx to Mark Woodward for the ++ email) ++ - Added dummy support for vo_base and otl filetypes (thanks to fREW for ++ the email) ++ ++2.0.2: ++ - Minor bug fix that was stopping nested comments from working ++ ++2.0.1: ++ - Fixed the visual bell for the |NERDComToEOLMap| map. ++ - Added another possible value to the NERDMenuMode option which causes the ++ menu to be displayed under 'Plugin -> Comment'. See :h NERDMenuMode. ++ This new menu mode is now the default. ++ - Added support for the occam filetype (thanks to Anders for emailing me) ++ - Made the main commenting function (NERDComment) available outside the ++ script. ++ - bug fixes and refactoring ++ ++2.0.0: ++ - NOTE: renamed the script to NERD_commenter.vim. When you install this ++ version you must delete the old files: NERD_comments.vim and ++ NERD_comments.txt. ++ - Reworked the mappings and main entry point function for the script to ++ avoid causing visual-bells and screen scrolling. ++ - Changes to the script options (see |NERD_com-Customisation| for ++ details): ++ - They are all camel case now instead of underscored. ++ - Converted all of the regular expression options into simple boolean ++ options for simplicity. ++ - All the options are now stated positively, eg. ++ NERD_dont_remove_spaces_regexp has become NERDRemoveExtraSpaces. ++ - Some of the option names have been changed (other than in the above ++ ways) ++ - Some have been removed altogether, namely: NERD_create_h_filetype ++ (why was a commenting script creating a filetype?!), ++ NERD_left_align_regexp, NERD_right_align_regexp, ++ ++ - Removed all the NERD_use_alt_style_XXX_coms options and replaced them ++ with a better system. Now if a filetype has alternative delims, the ++ script will check whether an option of the form ++ "NERD_<&filetype>_alt_style" exists, and if it does then alt delims will ++ be used. See |NERD_com-cust-delims| for details. ++ - The script no longer removes extra spaces for sexy comments for the ++ NERDRemoveExtraSpaces option (it will still remove spaces if ++ NERDSpaceDelims is set). ++ - Added dummy support for viminfo and rtf. ++ - Added support for the "gentoo-package-\(keywords\|mask\|use\)" ++ filetypes. ++ - Added '#' comments as an alternative for the asm filetype ++ ++Thanks to Markus Klinik and Anders for bug reports, and again to Anders ++for his patch. Thanks to John O'Shea and fREW for the filetype ++information. ++ ++============================================================================== ++8. Credits {{{2 *NERDComCredits* ++ ++Thanks and respect to the following people: ++ ++Thanks to Nick Brettell for his many ideas and criticisms. A bloody good ++bastard. ++:normal :.-2s/good// ++ ++Thanks to Matthew Hawkins for his awesome refactoring! ++ ++Thanks to the authors of the vimspell whose documentation ++installation function I stole :) ++ ++Thanks to Greg Searle for the idea of using place-holders for nested comments. ++ ++Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! ++Also, thanks for the idea of doing sexy comments as well as his suggestions ++relating to it :P ++Thanks again to Nguyen for complaining about the NERD_comments menu mapping ++(-c) interfering with another mapping of his... and thus the ++NERD_dont_create_menu_shortcut option was born :P ++(it was then replaced with NERD_menu_mode in version 1.67 :) ++ ++Thanks to Sam R for pointing out some filetypes that NERD_comments could support! ++ ++Cheers to Litchi for the idea of having a mapping that appends a comment to ++the current line :) ++ ++Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some ++problems with commenting in visual mode. Thanks again to Jorge for his ++continued suggestions on this matter :) ++ ++Thanks to Martin Stubenschrott for pointing out a bug with the mapping ++:) Ive gotta stop breaking this mapping! ++ ++Thanks to Markus Erlmann for pointing out a conflict that this script was ++having with the taglist plugin. ++ ++Thanks to Brent Rice for alerting me about, and helping me track down, a bug ++in the script when the "ignorecase" option in vim was set. ++ ++Thanks to Richard Willis for telling me about how line continuation was ++causing problems on cygwin. Also, thanks pointing out a bug in the help file ++and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI ++have mercy on your soul :) ++ ++Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". ++Also, thanks for his suggested improvements about toggle comments after i ++implemented them. ++ ++Thanks to harry for telling me that i broke the cn mapping in 1.53 :), ++and thanks again for telling me about a bug that occurred when editing a file ++in a new tab. ++ ++Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc ++install function and added support for ada comments with spaces as well as ++making a couple of other small changes. ++ ++Thanks to David Bourgeois for pointing out a bug with when commenting c files ++:)... [a few days later] ok i completely misunderstood what David was talking ++about and ended up fixing a completely different bug to what he was talking ++about :P ++ ++Thanks to David Bourgeois for pointing out a bug when changing buffers. ++ ++Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that ++was causing spaces to be added to the end of lines with single-part ++delimiters. It's nice when people do my work for me :D ++ ++Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting ++sexy comments. Sexy comments dont look so sexy when they are only half removed ++:P ++ ++Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping ++the NERD_space_delim_filetype_regexp option from working with left aligned ++toggle comments. And for pointing out a bug when initialising VB comments. ++ ++Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". ++And for suggested improvements to minimal comments. ++ ++Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. ++In 1.65 ++ ++Thanks to Jonathan Derque for alerting me to some filetypes that could be ++supported (Namely: context, plaintext and mail). ++ ++Thanks to Joseph Barker for the sugesting that the menu be an optional ++feature. ++ ++Thanks to Gary Church and Tim Carey-Smith for complaining about the ++keymappings and causing me to introduce the NERD_mapleader option :) ++ ++Thanks to Vigil for pointing out that the "fetchmail" filetype was not ++supported and emailing me the delimiters ++ ++Thanks to Michael Brunner for telling me about the kconfig filetype. ++ ++Thanks to Antono Vasiljev for telling me about the netdict filetype. ++ ++Thanks to Melissa Reid for telling me about the omlet filetype. ++ ++Thanks to Ilia N Ternovich for alerting me to the 'qf' (quickfix) filetype. ++ ++Thanks to Markus Klinik for emailing me about a bug for sexy comments where ++spaces were being eaten. ++ ++Thanks to John O'Shea for emailing me about the RTF filetype. Thanks again for ++the SVNcommitlog and vcscommit filetypes. ++ ++Thanks to Anders for emailing me a patch to help get rid of all the visual ++bells and screen scrolling, and for sending me the delimiters for the occam ++filetype. ++ ++Thanks to Anders and Markus Klinik for emailing me about the screen scrolling ++issues and finally getting me off my ass about them :P ++ ++Thanks to Mark Woodward for emailing me about the csv filetype. ++ ++Thanks to fREW for emailing me with the /gentoo-package-(mask|keywords|use)/ ++filetypes the vo_base filetype. ++ ++Thanks to Alexey for emailing me about the verilog_systemverilog/systemverilog ++filetypes. ++ ++Cheers to Lizendir for the email about the fstab filetype ++ ++Thanks to Michael Böhler for emailing me with the autoit, autohotkey and docbk ++filetypes. ++ ++Thanks to Aaron Small for emailing me about the cmake filetype. ++ ++Thanks to Ramiro for emailing me about the htmldjango and django filetypes. ++ ++Thanks to Seth Mason for sending me a patch to fix some pathing issues for the ++help doc installation. ++ ++Thanks to Stefano Zacchiroli for emailing me with the debcontrol and ++debchangelog filetypes. ++ ++Thanks to Alex Tarkovsky for emailing me about the ebuild and eclass ++filetypes. ++ ++Cheers to Jorge Rodrigues for emailing me about the gams filetype. ++ ++Cheers to James Hales for the patch that made the comment maps work better with ++counts, and made the script reset comment delims for a buffer when its ++filetype changes. ++ ++Thank to Rainer Müller for emailing me with the Objective C delimiters. ++ ++Thanks to Jason Mills for emailing me the Groovy filetype. ++ ++Thanks to Normandie Azucena for emailing me about the vera filetype. ++ ++Thanks to Florian Apolloner for emailing me about the ldif filetype. ++ ++Cheers to David Fishburn for emailing me with the lookupfile filetype. ++ ++Thanks to Niels Aan de Brugh for emailing me with the rst filetype. ++ ++Cheers to heptite on #vim for helping me track down some tab-space conversion ++bugs. ++ ++Cheers to Don Hatlestad for telling me about the ahk filetype ++ ++Thanks to Christophe Benz for emailing me with the Desktop and xsd filetypes. ++ ++Cheers to Cheng Fang for the bug reports :D ++ ++Cheers to myself for being the best looking man on Earth! ++=== END_DOC ++" vim: set foldmethod=marker : +diff -urN vim71/1/plugin/.svn/all-wcprops vim71_ada/1/plugin/.svn/all-wcprops +--- vim71/1/plugin/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,23 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 51 ++/svnroot/gnuada/!svn/ver/818/trunk/tools/vim/plugin ++END ++taglist.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 63 ++/svnroot/gnuada/!svn/ver/695/trunk/tools/vim/plugin/taglist.vim ++END ++matchit.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 63 ++/svnroot/gnuada/!svn/ver/695/trunk/tools/vim/plugin/matchit.vim ++END ++NERD_commenter.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 70 ++/svnroot/gnuada/!svn/ver/782/trunk/tools/vim/plugin/NERD_commenter.vim ++END +diff -urN vim71/1/plugin/.svn/dir-prop-base vim71_ada/1/plugin/.svn/dir-prop-base +--- vim71/1/plugin/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,6 @@ ++K 10 ++svn:ignore ++V 9 ++.backups ++ ++END +diff -urN vim71/1/plugin/.svn/entries vim71_ada/1/plugin/.svn/entries +--- vim71/1/plugin/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/.svn/entries 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,67 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/plugin ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-12-03T21:21:48.223203Z ++818 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ ++taglist.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++2b4bbfd48d8655d77f21de415fbc444e ++2007-04-27T17:57:11.151403Z ++695 ++krischik ++has-props ++ ++matchit.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++e632c123b83638c701624d105b6dfebf ++2007-04-27T17:57:11.151403Z ++695 ++krischik ++has-props ++ ++NERD_commenter.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++a26e65639bda5a42c1f3e5661839739b ++2007-10-18T14:36:32.640792Z ++782 ++krischik ++has-props ++ +diff -urN vim71/1/plugin/.svn/format vim71_ada/1/plugin/.svn/format +--- vim71/1/plugin/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/.svn/format 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/plugin/.svn/prop-base/matchit.vim.svn-base vim71_ada/1/plugin/.svn/prop-base/matchit.vim.svn-base +--- vim71/1/plugin/.svn/prop-base/matchit.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/.svn/prop-base/matchit.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/plugin/.svn/prop-base/NERD_commenter.vim.svn-base vim71_ada/1/plugin/.svn/prop-base/NERD_commenter.vim.svn-base +--- vim71/1/plugin/.svn/prop-base/NERD_commenter.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/.svn/prop-base/NERD_commenter.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/plugin/.svn/prop-base/taglist.vim.svn-base vim71_ada/1/plugin/.svn/prop-base/taglist.vim.svn-base +--- vim71/1/plugin/.svn/prop-base/taglist.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/.svn/prop-base/taglist.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/plugin/.svn/text-base/matchit.vim.svn-base vim71_ada/1/plugin/.svn/text-base/matchit.vim.svn-base +--- vim71/1/plugin/.svn/text-base/matchit.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/.svn/text-base/matchit.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,814 @@ ++" matchit.vim: (global plugin) Extended "%" matching ++" Last Change: Tue Oct 24 11:00 AM 2006 EDT ++" Maintainer: Benji Fisher PhD ++" Version: 1.12, for Vim 6.3+ ++" URL: http://www.vim.org/script.php?script_id=39 ++ ++" Documentation: ++" The documentation is in a separate file, matchit.txt . ++ ++" Credits: ++" Vim editor by Bram Moolenaar (Thanks, Bram!) ++" Original script and design by Raul Segura Acevedo ++" Support for comments by Douglas Potts ++" Support for back references and other improvements by Benji Fisher ++" Support for many languages by Johannes Zellner ++" Suggestions for improvement, bug reports, and support for additional ++" languages by Jordi-Albert Batalla, Neil Bird, Servatius Brandt, Mark ++" Collett, Stephen Wall, Dany St-Amant, Yuheng Xie, and Johannes Zellner. ++ ++" Debugging: ++" If you'd like to try the built-in debugging commands... ++" :MatchDebug to activate debugging for the current buffer ++" This saves the values of several key script variables as buffer-local ++" variables. See the MatchDebug() function, below, for details. ++ ++" TODO: I should think about multi-line patterns for b:match_words. ++" This would require an option: how many lines to scan (default 1). ++" This would be useful for Python, maybe also for *ML. ++" TODO: Maybe I should add a menu so that people will actually use some of ++" the features that I have implemented. ++" TODO: Eliminate the MultiMatch function. Add yet another argument to ++" Match_wrapper() instead. ++" TODO: Allow :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1' ++" TODO: Make backrefs safer by using '\V' (very no-magic). ++" TODO: Add a level of indirection, so that custom % scripts can use my ++" work but extend it. ++ ++" allow user to prevent loading ++" and prevent duplicate loading ++if exists("loaded_matchit") || &cp ++ finish ++endif ++let loaded_matchit = 1 ++let s:last_mps = "" ++let s:last_words = "" ++ ++let s:save_cpo = &cpo ++set cpo&vim ++ ++nnoremap % :call Match_wrapper('',1,'n') ++nnoremap g% :call Match_wrapper('',0,'n') ++vnoremap % :call Match_wrapper('',1,'v') m'gv`` ++vnoremap g% :call Match_wrapper('',0,'v') m'gv`` ++onoremap % v:call Match_wrapper('',1,'o') ++onoremap g% v:call Match_wrapper('',0,'o') ++ ++" Analogues of [{ and ]} using matching patterns: ++nnoremap [% :call MultiMatch("bW", "n") ++nnoremap ]% :call MultiMatch("W", "n") ++vmap [% [%m'gv`` ++vmap ]% ]%m'gv`` ++" vnoremap [% :call MultiMatch("bW", "v") m'gv`` ++" vnoremap ]% :call MultiMatch("W", "v") m'gv`` ++onoremap [% v:call MultiMatch("bW", "o") ++onoremap ]% v:call MultiMatch("W", "o") ++ ++" text object: ++vmap a% [%v]% ++ ++" Auto-complete mappings: (not yet "ready for prime time") ++" TODO Read :help write-plugin for the "right" way to let the user ++" specify a key binding. ++" let g:match_auto = '' ++" let g:match_autoCR = '' ++" if exists("g:match_auto") ++" execute "inoremap " . g:match_auto . ' x"=Autocomplete()Pls' ++" endif ++" if exists("g:match_autoCR") ++" execute "inoremap " . g:match_autoCR . ' =Autocomplete()' ++" endif ++" if exists("g:match_gthhoh") ++" execute "inoremap " . g:match_gthhoh . ' :call Gthhoh()' ++" endif " gthhoh = "Get the heck out of here!" ++ ++let s:notslash = '\\\@" ++ endif ++ " In s:CleanUp(), we may need to check whether the cursor moved forward. ++ let startline = line(".") ++ let startcol = col(".") ++ " Use default behavior if called with a count or if no patterns are defined. ++ if v:count ++ exe "normal! " . v:count . "%" ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ elseif !exists("b:match_words") || b:match_words == "" ++ silent! normal! % ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ end ++ ++ " First step: if not already done, set the script variables ++ " s:do_BR flag for whether there are backrefs ++ " s:pat parsed version of b:match_words ++ " s:all regexp based on s:pat and the default groups ++ " ++ " Allow b:match_words = "GetVimMatchWords()" . ++ if b:match_words =~ ":" ++ let match_words = b:match_words ++ else ++ execute "let match_words =" b:match_words ++ endif ++" Thanks to Preben "Peppe" Guldberg and Bram Moolenaar for this suggestion! ++ if (match_words != s:last_words) || (&mps != s:last_mps) || ++ \ exists("b:match_debug") ++ let s:last_words = match_words ++ let s:last_mps = &mps ++ if match_words !~ s:notslash . '\\\d' ++ let s:do_BR = 0 ++ let s:pat = match_words ++ else ++ let s:do_BR = 1 ++ let s:pat = s:ParseWords(match_words) ++ endif ++ " The next several lines were here before ++ " BF started messing with this script. ++ " quote the special chars in 'matchpairs', replace [,:] with \| and then ++ " append the builtin pairs (/*, */, #if, #ifdef, #else, #elif, #endif) ++ " let default = substitute(escape(&mps, '[$^.*~\\/?]'), '[,:]\+', ++ " \ '\\|', 'g').'\|\/\*\|\*\/\|#if\>\|#ifdef\>\|#else\>\|#elif\>\|#endif\>' ++ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . ++ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' ++ " s:all = pattern with all the keywords ++ let s:all = s:pat . (strlen(s:pat) ? "," : "") . default ++ let s:all = substitute(s:all, s:notslash . '\zs[,:]\+', '\\|', 'g') ++ let s:all = '\%(' . s:all . '\)' ++ " let s:all = '\%(' . substitute(s:all, '\\\ze[,:]', '', 'g') . '\)' ++ if exists("b:match_debug") ++ let b:match_pat = s:pat ++ endif ++ endif ++ ++ " Second step: set the following local variables: ++ " matchline = line on which the cursor started ++ " curcol = number of characters before match ++ " prefix = regexp for start of line to start of match ++ " suffix = regexp for end of match to end of line ++ " Require match to end on or after the cursor and prefer it to ++ " start on or before the cursor. ++ let matchline = getline(startline) ++ if a:word != '' ++ " word given ++ if a:word !~ s:all ++ echohl WarningMsg|echo 'Missing rule for word:"'.a:word.'"'|echohl NONE ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ endif ++ let matchline = a:word ++ let curcol = 0 ++ let prefix = '^\%(' ++ let suffix = '\)$' ++ " Now the case when "word" is not given ++ else " Find the match that ends on or after the cursor and set curcol. ++ let regexp = s:Wholematch(matchline, s:all, startcol-1) ++ let curcol = match(matchline, regexp) ++ let endcol = matchend(matchline, regexp) ++ let suf = strlen(matchline) - endcol ++ let prefix = (curcol ? '^.*\%' . (curcol + 1) . 'c\%(' : '^\%(') ++ let suffix = (suf ? '\)\%' . (endcol + 1) . 'c.*$' : '\)$') ++ " If the match comes from the defaults, bail out. ++ if matchline !~ prefix . ++ \ substitute(s:pat, s:notslash.'\zs[,:]\+', '\\|', 'g') . suffix ++ silent! norm! % ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ endif ++ endif ++ if exists("b:match_debug") ++ let b:match_match = matchstr(matchline, regexp) ++ let b:match_col = curcol+1 ++ endif ++ ++ " Third step: Find the group and single word that match, and the original ++ " (backref) versions of these. Then, resolve the backrefs. ++ " Set the following local variable: ++ " group = colon-separated list of patterns, one of which matches ++ " = ini:mid:fin or ini:fin ++ " ++ " Reconstruct the version with unresolved backrefs. ++ let patBR = substitute(match_words.',', ++ \ s:notslash.'\zs[,:]*,[,:]*', ',', 'g') ++ let patBR = substitute(patBR, s:notslash.'\zs:\{2,}', ':', 'g') ++ " Now, set group and groupBR to the matching group: 'if:endif' or ++ " 'while:endwhile' or whatever. A bit of a kluge: s:Choose() returns ++ " group . "," . groupBR, and we pick it apart. ++ let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) ++ let i = matchend(group, s:notslash . ",") ++ let groupBR = strpart(group, i) ++ let group = strpart(group, 0, i-1) ++ " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix ++ if s:do_BR " Do the hard part: resolve those backrefs! ++ let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++ endif ++ if exists("b:match_debug") ++ let b:match_wholeBR = groupBR ++ let i = matchend(groupBR, s:notslash . ":") ++ let b:match_iniBR = strpart(groupBR, 0, i-1) ++ endif ++ ++ " Fourth step: Set the arguments for searchpair(). ++ let i = matchend(group, s:notslash . ":") ++ let j = matchend(group, '.*' . s:notslash . ":") ++ let ini = strpart(group, 0, i-1) ++ let mid = substitute(strpart(group, i,j-i-1), s:notslash.'\zs:', '\\|', 'g') ++ let fin = strpart(group, j) ++ "Un-escape the remaining , and : characters. ++ let ini = substitute(ini, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ let mid = substitute(mid, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ let fin = substitute(fin, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ " searchpair() requires that these patterns avoid \(\) groups. ++ let ini = substitute(ini, s:notslash . '\zs\\(', '\\%(', 'g') ++ let mid = substitute(mid, s:notslash . '\zs\\(', '\\%(', 'g') ++ let fin = substitute(fin, s:notslash . '\zs\\(', '\\%(', 'g') ++ " Set mid. This is optimized for readability, not micro-efficiency! ++ if a:forward && matchline =~ prefix . fin . suffix ++ \ || !a:forward && matchline =~ prefix . ini . suffix ++ let mid = "" ++ endif ++ " Set flag. This is optimized for readability, not micro-efficiency! ++ if a:forward && matchline =~ prefix . fin . suffix ++ \ || !a:forward && matchline !~ prefix . ini . suffix ++ let flag = "bW" ++ else ++ let flag = "W" ++ endif ++ " Set skip. ++ if exists("b:match_skip") ++ let skip = b:match_skip ++ elseif exists("b:match_comment") " backwards compatibility and testing! ++ let skip = "r:" . b:match_comment ++ else ++ let skip = 's:comment\|string' ++ endif ++ let skip = s:ParseSkip(skip) ++ if exists("b:match_debug") ++ let b:match_ini = ini ++ let b:match_tail = (strlen(mid) ? mid.'\|' : '') . fin ++ endif ++ ++ " Fifth step: actually start moving the cursor and call searchpair(). ++ " Later, :execute restore_cursor to get to the original screen. ++ let restore_cursor = virtcol(".") . "|" ++ normal! g0 ++ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor ++ normal! H ++ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ execute restore_cursor ++ call cursor(0, curcol + 1) ++ " normal! 0 ++ " if curcol ++ " execute "normal!" . curcol . "l" ++ " endif ++ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on")) ++ let skip = "0" ++ else ++ execute "if " . skip . "| let skip = '0' | endif" ++ endif ++ let sp_return = searchpair(ini, mid, fin, flag, skip) ++ let final_position = "call cursor(" . line(".") . "," . col(".") . ")" ++ " Restore cursor position and original screen. ++ execute restore_cursor ++ normal! m' ++ if sp_return > 0 ++ execute final_position ++ endif ++ return s:CleanUp(restore_options, a:mode, startline, startcol, mid.'\|'.fin) ++endfun ++ ++" Restore options and do some special handling for Operator-pending mode. ++" The optional argument is the tail of the matching group. ++fun! s:CleanUp(options, mode, startline, startcol, ...) ++ execute "set" a:options ++ " Open folds, if appropriate. ++ if a:mode != "o" ++ if &foldopen =~ "percent" ++ normal! zv ++ endif ++ " In Operator-pending mode, we want to include the whole match ++ " (for example, d%). ++ " This is only a problem if we end up moving in the forward direction. ++ elseif (a:startline < line(".")) || ++ \ (a:startline == line(".") && a:startcol < col(".")) ++ if a:0 ++ " Check whether the match is a single character. If not, move to the ++ " end of the match. ++ let matchline = getline(".") ++ let currcol = col(".") ++ let regexp = s:Wholematch(matchline, a:1, currcol-1) ++ let endcol = matchend(matchline, regexp) ++ if endcol > currcol " This is NOT off by one! ++ execute "normal!" . (endcol - currcol) . "l" ++ endif ++ endif " a:0 ++ endif " a:mode != "o" && etc. ++ return 0 ++endfun ++ ++" Example (simplified HTML patterns): if ++" a:groupBR = '<\(\k\+\)>:' ++" a:prefix = '^.\{3}\(' ++" a:group = '<\(\k\+\)>:' ++" a:suffix = '\).\{2}$' ++" a:matchline = "12312" or "12312" ++" then extract "tag" from a:matchline and return ":" . ++fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++ if a:matchline !~ a:prefix . ++ \ substitute(a:group, s:notslash . '\zs:', '\\|', 'g') . a:suffix ++ return a:group ++ endif ++ let i = matchend(a:groupBR, s:notslash . ':') ++ let ini = strpart(a:groupBR, 0, i-1) ++ let tailBR = strpart(a:groupBR, i) ++ let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix, ++ \ a:groupBR) ++ let i = matchend(word, s:notslash . ":") ++ let wordBR = strpart(word, i) ++ let word = strpart(word, 0, i-1) ++ " Now, a:matchline =~ a:prefix . word . a:suffix ++ if wordBR != ini ++ let table = s:Resolve(ini, wordBR, "table") ++ else ++ " let table = "----------" ++ let table = "" ++ let d = 0 ++ while d < 10 ++ if tailBR =~ s:notslash . '\\' . d ++ " let table[d] = d ++ let table = table . d ++ else ++ let table = table . "-" ++ endif ++ let d = d + 1 ++ endwhile ++ endif ++ let d = 9 ++ while d ++ if table[d] != "-" ++ let backref = substitute(a:matchline, a:prefix.word.a:suffix, ++ \ '\'.table[d], "") ++ " Are there any other characters that should be escaped? ++ let backref = escape(backref, '*,:') ++ execute s:Ref(ini, d, "start", "len") ++ let ini = strpart(ini, 0, start) . backref . strpart(ini, start+len) ++ let tailBR = substitute(tailBR, s:notslash . '\zs\\' . d, ++ \ escape(backref, '\\'), 'g') ++ endif ++ let d = d-1 ++ endwhile ++ if exists("b:match_debug") ++ if s:do_BR ++ let b:match_table = table ++ let b:match_word = word ++ else ++ let b:match_table = "" ++ let b:match_word = "" ++ endif ++ endif ++ return ini . ":" . tailBR ++endfun ++ ++" Input a comma-separated list of groups with backrefs, such as ++" a:groups = '\(foo\):end\1,\(bar\):end\1' ++" and return a comma-separated list of groups with backrefs replaced: ++" return '\(foo\):end\(foo\),\(bar\):end\(bar\)' ++fun! s:ParseWords(groups) ++ let groups = substitute(a:groups.",", s:notslash.'\zs[,:]*,[,:]*', ',', 'g') ++ let groups = substitute(groups, s:notslash . '\zs:\{2,}', ':', 'g') ++ let parsed = "" ++ while groups =~ '[^,:]' ++ let i = matchend(groups, s:notslash . ':') ++ let j = matchend(groups, s:notslash . ',') ++ let ini = strpart(groups, 0, i-1) ++ let tail = strpart(groups, i, j-i-1) . ":" ++ let groups = strpart(groups, j) ++ let parsed = parsed . ini ++ let i = matchend(tail, s:notslash . ':') ++ while i != -1 ++ " In 'if:else:endif', ini='if' and word='else' and then word='endif'. ++ let word = strpart(tail, 0, i-1) ++ let tail = strpart(tail, i) ++ let i = matchend(tail, s:notslash . ':') ++ let parsed = parsed . ":" . s:Resolve(ini, word, "word") ++ endwhile " Now, tail has been used up. ++ let parsed = parsed . "," ++ endwhile " groups =~ '[^,:]' ++ return parsed ++endfun ++ ++" TODO I think this can be simplified and/or made more efficient. ++" TODO What should I do if a:start is out of range? ++" Return a regexp that matches all of a:string, such that ++" matchstr(a:string, regexp) represents the match for a:pat that starts ++" as close to a:start as possible, before being preferred to after, and ++" ends after a:start . ++" Usage: ++" let regexp = s:Wholematch(getline("."), 'foo\|bar', col(".")-1) ++" let i = match(getline("."), regexp) ++" let j = matchend(getline("."), regexp) ++" let match = matchstr(getline("."), regexp) ++fun! s:Wholematch(string, pat, start) ++ let group = '\%(' . a:pat . '\)' ++ let prefix = (a:start ? '\(^.*\%<' . (a:start + 2) . 'c\)\zs' : '^') ++ let len = strlen(a:string) ++ let suffix = (a:start+1 < len ? '\(\%>'.(a:start+1).'c.*$\)\@=' : '$') ++ if a:string !~ prefix . group . suffix ++ let prefix = '' ++ endif ++ return prefix . group . suffix ++endfun ++ ++" No extra arguments: s:Ref(string, d) will ++" find the d'th occurrence of '\(' and return it, along with everything up ++" to and including the matching '\)'. ++" One argument: s:Ref(string, d, "start") returns the index of the start ++" of the d'th '\(' and any other argument returns the length of the group. ++" Two arguments: s:Ref(string, d, "foo", "bar") returns a string to be ++" executed, having the effect of ++" :let foo = s:Ref(string, d, "start") ++" :let bar = s:Ref(string, d, "len") ++fun! s:Ref(string, d, ...) ++ let len = strlen(a:string) ++ if a:d == 0 ++ let start = 0 ++ else ++ let cnt = a:d ++ let match = a:string ++ while cnt ++ let cnt = cnt - 1 ++ let index = matchend(match, s:notslash . '\\(') ++ if index == -1 ++ return "" ++ endif ++ let match = strpart(match, index) ++ endwhile ++ let start = len - strlen(match) ++ if a:0 == 1 && a:1 == "start" ++ return start - 2 ++ endif ++ let cnt = 1 ++ while cnt ++ let index = matchend(match, s:notslash . '\\(\|\\)') - 1 ++ if index == -2 ++ return "" ++ endif ++ " Increment if an open, decrement if a ')': ++ let cnt = cnt + (match[index]=="(" ? 1 : -1) " ')' ++ " let cnt = stridx('0(', match[index]) + cnt ++ let match = strpart(match, index+1) ++ endwhile ++ let start = start - 2 ++ let len = len - start - strlen(match) ++ endif ++ if a:0 == 1 ++ return len ++ elseif a:0 == 2 ++ return "let " . a:1 . "=" . start . "| let " . a:2 . "=" . len ++ else ++ return strpart(a:string, start, len) ++ endif ++endfun ++ ++" Count the number of disjoint copies of pattern in string. ++" If the pattern is a literal string and contains no '0' or '1' characters ++" then s:Count(string, pattern, '0', '1') should be faster than ++" s:Count(string, pattern). ++fun! s:Count(string, pattern, ...) ++ let pat = escape(a:pattern, '\\') ++ if a:0 > 1 ++ let foo = substitute(a:string, '[^'.a:pattern.']', "a:1", "g") ++ let foo = substitute(a:string, pat, a:2, "g") ++ let foo = substitute(foo, '[^' . a:2 . ']', "", "g") ++ return strlen(foo) ++ endif ++ let result = 0 ++ let foo = a:string ++ let index = matchend(foo, pat) ++ while index != -1 ++ let result = result + 1 ++ let foo = strpart(foo, index) ++ let index = matchend(foo, pat) ++ endwhile ++ return result ++endfun ++ ++" s:Resolve('\(a\)\(b\)', '\(c\)\2\1\1\2') should return table.word, where ++" word = '\(c\)\(b\)\(a\)\3\2' and table = '-32-------'. That is, the first ++" '\1' in target is replaced by '\(a\)' in word, table[1] = 3, and this ++" indicates that all other instances of '\1' in target are to be replaced ++" by '\3'. The hard part is dealing with nesting... ++" Note that ":" is an illegal character for source and target, ++" unless it is preceded by "\". ++fun! s:Resolve(source, target, output) ++ let word = a:target ++ let i = matchend(word, s:notslash . '\\\d') - 1 ++ let table = "----------" ++ while i != -2 " There are back references to be replaced. ++ let d = word[i] ++ let backref = s:Ref(a:source, d) ++ " The idea is to replace '\d' with backref. Before we do this, ++ " replace any \(\) groups in backref with :1, :2, ... if they ++ " correspond to the first, second, ... group already inserted ++ " into backref. Later, replace :1 with \1 and so on. The group ++ " number w+b within backref corresponds to the group number ++ " s within a:source. ++ " w = number of '\(' in word before the current one ++ let w = s:Count( ++ \ substitute(strpart(word, 0, i-1), '\\\\', '', 'g'), '\(', '1') ++ let b = 1 " number of the current '\(' in backref ++ let s = d " number of the current '\(' in a:source ++ while b <= s:Count(substitute(backref, '\\\\', '', 'g'), '\(', '1') ++ \ && s < 10 ++ if table[s] == "-" ++ if w + b < 10 ++ " let table[s] = w + b ++ let table = strpart(table, 0, s) . (w+b) . strpart(table, s+1) ++ endif ++ let b = b + 1 ++ let s = s + 1 ++ else ++ execute s:Ref(backref, b, "start", "len") ++ let ref = strpart(backref, start, len) ++ let backref = strpart(backref, 0, start) . ":". table[s] ++ \ . strpart(backref, start+len) ++ let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1') ++ endif ++ endwhile ++ let word = strpart(word, 0, i-1) . backref . strpart(word, i+1) ++ let i = matchend(word, s:notslash . '\\\d') - 1 ++ endwhile ++ let word = substitute(word, s:notslash . '\zs:', '\\', 'g') ++ if a:output == "table" ++ return table ++ elseif a:output == "word" ++ return word ++ else ++ return table . word ++ endif ++endfun ++ ++" Assume a:comma = ",". Then the format for a:patterns and a:1 is ++" a:patterns = ",,..." ++" a:1 = ",,..." ++" If is the first pattern that matches a:string then return ++" if no optional arguments are given; return , if a:1 is given. ++fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...) ++ let tail = (a:patterns =~ a:comma."$" ? a:patterns : a:patterns . a:comma) ++ let i = matchend(tail, s:notslash . a:comma) ++ if a:0 ++ let alttail = (a:1 =~ a:comma."$" ? a:1 : a:1 . a:comma) ++ let j = matchend(alttail, s:notslash . a:comma) ++ endif ++ let current = strpart(tail, 0, i-1) ++ if a:branch == "" ++ let currpat = current ++ else ++ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') ++ endif ++ while a:string !~ a:prefix . currpat . a:suffix ++ let tail = strpart(tail, i) ++ let i = matchend(tail, s:notslash . a:comma) ++ if i == -1 ++ return -1 ++ endif ++ let current = strpart(tail, 0, i-1) ++ if a:branch == "" ++ let currpat = current ++ else ++ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') ++ endif ++ if a:0 ++ let alttail = strpart(alttail, j) ++ let j = matchend(alttail, s:notslash . a:comma) ++ endif ++ endwhile ++ if a:0 ++ let current = current . a:comma . strpart(alttail, 0, j-1) ++ endif ++ return current ++endfun ++ ++" Call this function to turn on debugging information. Every time the main ++" script is run, buffer variables will be saved. These can be used directly ++" or viewed using the menu items below. ++if !exists(":MatchDebug") ++ command! -nargs=0 MatchDebug call s:Match_debug() ++endif ++ ++fun! s:Match_debug() ++ let b:match_debug = 1 " Save debugging information. ++ " pat = all of b:match_words with backrefs parsed ++ amenu &Matchit.&pat :echo b:match_pat ++ " match = bit of text that is recognized as a match ++ amenu &Matchit.&match :echo b:match_match ++ " curcol = cursor column of the start of the matching text ++ amenu &Matchit.&curcol :echo b:match_col ++ " wholeBR = matching group, original version ++ amenu &Matchit.wh&oleBR :echo b:match_wholeBR ++ " iniBR = 'if' piece, original version ++ amenu &Matchit.ini&BR :echo b:match_iniBR ++ " ini = 'if' piece, with all backrefs resolved from match ++ amenu &Matchit.&ini :echo b:match_ini ++ " tail = 'else\|endif' piece, with all backrefs resolved from match ++ amenu &Matchit.&tail :echo b:match_tail ++ " fin = 'endif' piece, with all backrefs resolved from match ++ amenu &Matchit.&word :echo b:match_word ++ " '\'.d in ini refers to the same thing as '\'.table[d] in word. ++ amenu &Matchit.t&able :echo '0:' . b:match_table . ':9' ++endfun ++ ++" Jump to the nearest unmatched "(" or "if" or "" if a:spflag == "bW" ++" or the nearest unmatched "" or "endif" or ")" if a:spflag == "W". ++" Return a "mark" for the original position, so that ++" let m = MultiMatch("bW", "n") ... execute m ++" will return to the original position. If there is a problem, do not ++" move the cursor and return "", unless a count is given, in which case ++" go up or down as many levels as possible and again return "". ++" TODO This relies on the same patterns as % matching. It might be a good ++" idea to give it its own matching patterns. ++fun! s:MultiMatch(spflag, mode) ++ if !exists("b:match_words") || b:match_words == "" ++ return "" ++ end ++ let restore_options = (&ic ? "" : "no") . "ignorecase" ++ if exists("b:match_ignorecase") ++ let &ignorecase = b:match_ignorecase ++ endif ++ let startline = line(".") ++ let startcol = col(".") ++ ++ " First step: if not already done, set the script variables ++ " s:do_BR flag for whether there are backrefs ++ " s:pat parsed version of b:match_words ++ " s:all regexp based on s:pat and the default groups ++ " This part is copied and slightly modified from s:Match_wrapper(). ++ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . ++ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' ++ " Allow b:match_words = "GetVimMatchWords()" . ++ if b:match_words =~ ":" ++ let match_words = b:match_words ++ else ++ execute "let match_words =" b:match_words ++ endif ++ if (match_words != s:last_words) || (&mps != s:last_mps) || ++ \ exists("b:match_debug") ++ let s:last_words = match_words ++ let s:last_mps = &mps ++ if match_words !~ s:notslash . '\\\d' ++ let s:do_BR = 0 ++ let s:pat = match_words ++ else ++ let s:do_BR = 1 ++ let s:pat = s:ParseWords(match_words) ++ endif ++ let s:all = '\%(' . substitute(s:pat . (strlen(s:pat)?",":"") . default, ++ \ '[,:]\+','\\|','g') . '\)' ++ if exists("b:match_debug") ++ let b:match_pat = s:pat ++ endif ++ endif ++ ++ " Second step: figure out the patterns for searchpair() ++ " and save the screen, cursor position, and 'ignorecase'. ++ " - TODO: A lot of this is copied from s:Match_wrapper(). ++ " - maybe even more functionality should be split off ++ " - into separate functions! ++ let cdefault = (s:pat =~ '[^,]$' ? "," : "") . default ++ let open = substitute(s:pat . cdefault, ++ \ s:notslash . '\zs:.\{-}' . s:notslash . ',', '\\),\\(', 'g') ++ let open = '\(' . substitute(open, s:notslash . '\zs:.*$', '\\)', '') ++ let close = substitute(s:pat . cdefault, ++ \ s:notslash . '\zs,.\{-}' . s:notslash . ':', '\\),\\(', 'g') ++ let close = substitute(close, '^.\{-}' . s:notslash . ':', '\\(', '') . '\)' ++ if exists("b:match_skip") ++ let skip = b:match_skip ++ elseif exists("b:match_comment") " backwards compatibility and testing! ++ let skip = "r:" . b:match_comment ++ else ++ let skip = 's:comment\|string' ++ endif ++ let skip = s:ParseSkip(skip) ++ " let restore_cursor = line(".") . "G" . virtcol(".") . "|" ++ " normal! H ++ " let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ let restore_cursor = virtcol(".") . "|" ++ normal! g0 ++ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor ++ normal! H ++ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ execute restore_cursor ++ ++ " Third step: call searchpair(). ++ " Replace '\('--but not '\\('--with '\%(' and ',' with '\|'. ++ let openpat = substitute(open, '\(\\\@" or ... ++" and return "endif" or "endwhile" or "" or ... . ++" For now, this uses b:match_words and the same script variables ++" as s:Match_wrapper() . Later, it may get its own patterns, ++" either from a buffer variable or passed as arguments. ++" fun! s:Autocomplete() ++" echo "autocomplete not yet implemented :-(" ++" if !exists("b:match_words") || b:match_words == "" ++" return "" ++" end ++" let startpos = s:MultiMatch("bW") ++" ++" if startpos == "" ++" return "" ++" endif ++" " - TODO: figure out whether 'if' or '' matched, and construct ++" " - the appropriate closing. ++" let matchline = getline(".") ++" let curcol = col(".") - 1 ++" " - TODO: Change the s:all argument if there is a new set of match pats. ++" let regexp = s:Wholematch(matchline, s:all, curcol) ++" let suf = strlen(matchline) - matchend(matchline, regexp) ++" let prefix = (curcol ? '^.\{' . curcol . '}\%(' : '^\%(') ++" let suffix = (suf ? '\).\{' . suf . '}$' : '\)$') ++" " Reconstruct the version with unresolved backrefs. ++" let patBR = substitute(b:match_words.',', '[,:]*,[,:]*', ',', 'g') ++" let patBR = substitute(patBR, ':\{2,}', ':', "g") ++" " Now, set group and groupBR to the matching group: 'if:endif' or ++" " 'while:endwhile' or whatever. ++" let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) ++" let i = matchend(group, s:notslash . ",") ++" let groupBR = strpart(group, i) ++" let group = strpart(group, 0, i-1) ++" " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix ++" if s:do_BR ++" let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++" endif ++" " let g:group = group ++" ++" " - TODO: Construct the closing from group. ++" let fake = "end" . expand("") ++" execute startpos ++" return fake ++" endfun ++ ++" Close all open structures. "Get the heck out of here!" ++" fun! s:Gthhoh() ++" let close = s:Autocomplete() ++" while strlen(close) ++" put=close ++" let close = s:Autocomplete() ++" endwhile ++" endfun ++ ++" Parse special strings as typical skip arguments for searchpair(): ++" s:foo becomes (current syntax item) =~ foo ++" S:foo becomes (current syntax item) !~ foo ++" r:foo becomes (line before cursor) =~ foo ++" R:foo becomes (line before cursor) !~ foo ++fun! s:ParseSkip(str) ++ let skip = a:str ++ if skip[1] == ":" ++ if skip[0] == "s" ++ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" . ++ \ strpart(skip,2) . "'" ++ elseif skip[0] == "S" ++ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" . ++ \ strpart(skip,2) . "'" ++ elseif skip[0] == "r" ++ let skip = "strpart(getline('.'),0,col('.'))=~'" . strpart(skip,2). "'" ++ elseif skip[0] == "R" ++ let skip = "strpart(getline('.'),0,col('.'))!~'" . strpart(skip,2). "'" ++ endif ++ endif ++ return skip ++endfun ++ ++let &cpo = s:save_cpo ++ ++" vim:sts=2:sw=2: +diff -urN vim71/1/plugin/.svn/text-base/NERD_commenter.vim.svn-base vim71_ada/1/plugin/.svn/text-base/NERD_commenter.vim.svn-base +--- vim71/1/plugin/.svn/text-base/NERD_commenter.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/.svn/text-base/NERD_commenter.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,4553 @@ ++" vim global plugin that provides easy code commenting for various file types ++" Last Change: 29 sep 2007 ++" Maintainer: Martin Grenfell ++let s:NERD_commenter_version = 2.1.4 ++ ++" For help documentation type :help NERDCommenter. If this fails, Restart vim ++" and try again. If it sill doesnt work... the help page is at the bottom ++" of this file. ++ ++" Section: script init stuff {{{1 ++if exists("loaded_nerd_comments") ++ finish ++endif ++if v:version < 700 ++ echoerr "NERDCommenter: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!" ++ finish ++endif ++let loaded_nerd_comments = 1 ++ ++" Section: spaces init {{{2 ++" Occasionally we need to grab a string of spaces so just make one here ++let s:spaces = "" ++while strlen(s:spaces) < 100 ++ let s:spaces = s:spaces . " " ++endwhile ++ ++" Function: s:InitVariable() function {{{2 ++" This function is used to initialise a given variable to a given value. The ++" variable is only initialised if it does not exist prior ++" ++" Args: ++" -var: the name of the var to be initialised ++" -value: the value to initialise var to ++" ++" Returns: ++" 1 if the var is set, 0 otherwise ++function s:InitVariable(var, value) ++ if !exists(a:var) ++ exec 'let ' . a:var . ' = ' . "'" . a:value . "'" ++ return 1 ++ endif ++ return 0 ++endfunction ++ ++" Section: space string init{{{2 ++" When putting spaces after the left delim and before the right we use ++" s:spaceStr for the space char. This way we can make it add anything after ++" the left and before the right by modifying this variable ++let s:spaceStr = ' ' ++let s:lenSpaceStr = strlen(s:spaceStr) ++ ++" Section: variable init calls {{{2 ++call s:InitVariable("g:NERDAllowAnyVisualDelims", 1) ++call s:InitVariable("g:NERDBlockComIgnoreEmpty", 0) ++call s:InitVariable("g:NERDCommentWholeLinesInVMode", 0) ++call s:InitVariable("g:NERDCompactSexyComs", 0) ++call s:InitVariable("g:NERDDefaultNesting", 0) ++call s:InitVariable("g:NERDMenuMode", 3) ++call s:InitVariable("g:NERDLPlace", "[>") ++call s:InitVariable("g:NERDUsePlaceHolders", 1) ++call s:InitVariable("g:NERDRemoveAltComs", 1) ++call s:InitVariable("g:NERDRemoveExtraSpaces", 0) ++call s:InitVariable("g:NERDRPlace", "<]") ++call s:InitVariable("g:NERDShutUp", '0') ++call s:InitVariable("g:NERDSpaceDelims", 0) ++call s:InitVariable("g:NERDDelimiterRequests", 1) ++ ++call s:InitVariable("g:NERDMapleader", ',c') ++ ++call s:InitVariable("g:NERDAltComMap", g:NERDMapleader . 'a') ++call s:InitVariable("g:NERDAppendComMap", g:NERDMapleader . 'A') ++call s:InitVariable("g:NERDComAlignBothMap", g:NERDMapleader . 'b') ++call s:InitVariable("g:NERDComAlignLeftMap", g:NERDMapleader . 'l') ++call s:InitVariable("g:NERDComAlignRightMap", g:NERDMapleader . 'r') ++call s:InitVariable("g:NERDComInInsertMap", '') ++call s:InitVariable("g:NERDComLineInvertMap", g:NERDMapleader . 'i') ++call s:InitVariable("g:NERDComLineMap", g:NERDMapleader . 'c') ++call s:InitVariable("g:NERDComLineNestMap", g:NERDMapleader . 'n') ++call s:InitVariable("g:NERDComLineSexyMap", g:NERDMapleader . 's') ++call s:InitVariable("g:NERDComLineToggleMap", g:NERDMapleader . '') ++call s:InitVariable("g:NERDComLineMinimalMap", g:NERDMapleader . 'm') ++call s:InitVariable("g:NERDComLineYankMap", g:NERDMapleader . 'y') ++call s:InitVariable("g:NERDComToEOLMap", g:NERDMapleader . '$') ++call s:InitVariable("g:NERDPrependComMap", g:NERDMapleader . 'I') ++call s:InitVariable("g:NERDUncomLineMap", g:NERDMapleader . 'u') ++let s:NERDFileNameEscape="[]#*$%'\" ?`!&();<>\\" ++ ++" Section: Comment mapping functions, autocommands and commands {{{1 ++" ============================================================================ ++" Section: Comment enabler autocommands {{{2 ++" ============================================================================ ++ ++if !exists("nerd_autocmds_loaded") ++ let nerd_autocmds_loaded=1 ++ ++ augroup commentEnablers ++ ++ "if the user enters a buffer or reads a buffer then we gotta set up ++ "the comment delimiters for that new filetype ++ autocmd BufEnter,BufRead * :call s:SetUpForNewFiletype(&filetype, 0) ++ ++ "if the filetype of a buffer changes, force the script to reset the ++ "delims for the buffer ++ autocmd Filetype * :call s:SetUpForNewFiletype(&filetype, 1) ++ augroup END ++ ++endif ++ ++ ++" Function: s:SetUpForNewFiletype(filetype) function {{{2 ++" This function is responsible for setting up buffer scoped variables for the ++" given filetype. ++" ++" These variables include the comment delimiters for the given filetype and calls ++" MapDelimiters or MapDelimitersWithAlternative passing in these delimiters. ++" ++" Args: ++" -filetype: the filetype to set delimiters for ++" -forceReset: 1 if the delimiters should be reset if they have already be ++" set for this buffer. ++" ++function s:SetUpForNewFiletype(filetype, forceReset) ++ "if we have already set the delimiters for this buffer then dont go thru ++ "it again ++ if !a:forceReset && exists("b:left") && b:left != '' ++ return ++ endif ++ ++ let b:sexyComMarker = '' ++ ++ "check the filetype against all known filetypes to see if we have ++ "hardcoded the comment delimiters to use ++ if a:filetype == "" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "abaqus" ++ call s:MapDelimiters('**', '') ++ elseif a:filetype == "abc" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "acedb" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "ada" ++ call s:MapDelimitersWithAlternative('--','', '-- ', '') ++ elseif a:filetype == "ahdl" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "ahk" ++ call s:MapDelimitersWithAlternative(';', '', '/*', '*/') ++ elseif a:filetype == "amiga" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "aml" ++ call s:MapDelimiters('/*', '') ++ elseif a:filetype == "ampl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ant" ++ call s:MapDelimiters('') ++ elseif a:filetype == "apache" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "apachestyle" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "asm68k" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "asm" ++ call s:MapDelimitersWithAlternative(';', '', '#', '') ++ elseif a:filetype == "asn" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "aspvbs" ++ call s:MapDelimiters('''', '') ++ elseif a:filetype == "atlas" ++ call s:MapDelimiters('C','$') ++ elseif a:filetype == "autohotkey" ++ call s:MapDelimiters(';','') ++ elseif a:filetype == "autoit" ++ call s:MapDelimiters(';','') ++ elseif a:filetype == "automake" ++ call s:MapDelimitersWithAlternative('#','', 'dnl ', '') ++ elseif a:filetype == "ave" ++ call s:MapDelimiters("'",'') ++ elseif a:filetype == "awk" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "basic" ++ call s:MapDelimitersWithAlternative("'",'', 'REM ', '') ++ elseif a:filetype == "b" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "bc" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "bdf" ++ call s:MapDelimiters('COMMENT ', '') ++ elseif a:filetype == "bib" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "bindzone" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "bst" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "btm" ++ call s:MapDelimiters('::', '') ++ elseif a:filetype == "caos" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "catalog" ++ call s:MapDelimiters('--','--') ++ elseif a:filetype == "c" ++ call s:MapDelimitersWithAlternative('/*','*/', '//', '') ++ elseif a:filetype == "cfg" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "cg" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "ch" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "changelog" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "cl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "clean" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "clipper" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "cmake" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "conf" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "config" ++ call s:MapDelimiters('dnl ', '') ++ elseif a:filetype == "context" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "cpp" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "crontab" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "cs" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "csc" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "csp" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "css" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "cterm" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "cupl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "csv" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "cvs" ++ call s:MapDelimiters('CVS:','') ++ elseif a:filetype == "dcl" ++ call s:MapDelimiters('$!', '') ++ elseif a:filetype == "debchangelog" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "debcontrol" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "debsources" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "def" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "desktop" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "diff" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "django" ++ call s:MapDelimitersWithAlternative('', '{#', '#}') ++ elseif a:filetype == "docbk" ++ call s:MapDelimiters('') ++ elseif a:filetype == "dns" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dosbatch" ++ call s:MapDelimiters('REM ','') ++ elseif a:filetype == "dosini" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dot" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "dracula" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dsl" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dtd" ++ call s:MapDelimiters('') ++ elseif a:filetype == "dtml" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "dylan" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == 'ebuild' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ecd" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == 'eclass' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "eiffel" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "elf" ++ call s:MapDelimiters("'", '') ++ elseif a:filetype == "elmfilt" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "erlang" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "eruby" ++ call s:MapDelimitersWithAlternative('', '<%#', '%>') ++ elseif a:filetype == "eterm" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "expect" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "exports" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fetchmail" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fgl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "focexec" ++ call s:MapDelimiters('-*', '') ++ elseif a:filetype == "form" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "fortran" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "foxpro" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "fstab" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fvwm" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fx" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "gams" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "gdb" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "gdmo" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "geek" ++ call s:MapDelimiters('GEEK_COMMENT:', '') ++ elseif a:filetype == 'gentoo-package-keywords' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == 'gentoo-package-mask' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == 'gentoo-package-use' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "gnuplot" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "groovy" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "gtkrc" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "haskell" ++ call s:MapDelimitersWithAlternative('--','', '{-', '-}') ++ elseif a:filetype == "hb" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "h" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "help" ++ call s:MapDelimiters('"','') ++ elseif a:filetype == "hercules" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "hog" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "html" ++ call s:MapDelimitersWithAlternative('', '//', '') ++ elseif a:filetype == "htmldjango" ++ call s:MapDelimitersWithAlternative('', '{#', '#}') ++ elseif a:filetype == "htmlos" ++ call s:MapDelimiters('#','/#') ++ elseif a:filetype == "ia64" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "icon" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "idlang" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "idl" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "indent" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "inform" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "inittab" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ishd" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "iss" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "ist" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "jam" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "java" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "javascript" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "jess" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "jgraph" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "jproperties" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "jsp" ++ call s:MapDelimiters('<%--', '--%>') ++ elseif a:filetype == "kconfig" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "kix" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "kscript" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "lace" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "ldif" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lex" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "lftp" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lifelines" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "lilo" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lisp" ++ call s:MapDelimitersWithAlternative(';','', '#|', '|#') ++ elseif a:filetype == "lite" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "lookupfile" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "lotos" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "lout" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lprolog" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "lscript" ++ call s:MapDelimiters("'", '') ++ elseif a:filetype == "lss" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lua" ++ call s:MapDelimitersWithAlternative('--','', '--[[', ']]') ++ elseif a:filetype == "lynx" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "m4" ++ call s:MapDelimiters('dnl ', '') ++ elseif a:filetype == "mail" ++ call s:MapDelimiters('> ','') ++ elseif a:filetype == "make" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "maple" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "masm" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "master" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "matlab" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "mel" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "mf" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "mib" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "mma" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "model" ++ call s:MapDelimiters('$','$') ++ elseif a:filetype =~ "moduala." ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "modula2" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "modula3" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "monk" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "mush" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "muttrc" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "named" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "nasm" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "nastran" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "natural" ++ call s:MapDelimiters('/*', '') ++ elseif a:filetype == "ncf" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "netdict" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "netrw" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "nqc" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "nroff" ++ call s:MapDelimiters('\"', '') ++ elseif a:filetype == "nsis" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "objc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "ocaml" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "occam" ++ call s:MapDelimiters('--','') ++ elseif a:filetype == "omlet" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "omnimark" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "openroad" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "opl" ++ call s:MapDelimiters("REM", "") ++ elseif a:filetype == "ora" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "otl" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "ox" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "pascal" ++ call s:MapDelimitersWithAlternative('{','}', '(*', '*)') ++ elseif a:filetype == "passwd" ++ call s:MapDelimitersWith('','') ++ elseif a:filetype == "pcap" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "pccts" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "perl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "pfmain" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "php" ++ call s:MapDelimitersWithAlternative('//','','/*', '*/') ++ elseif a:filetype == "phtml" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "pic" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "pike" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "pilrc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "pine" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "plaintex" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "plm" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "plsql" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "po" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "postscr" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "pov" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "povini" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "ppd" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "ppwiz" ++ call s:MapDelimiters(';;', '') ++ elseif a:filetype == "procmail" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "progress" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "prolog" ++ call s:MapDelimitersWithAlternative('%','','/*','*/') ++ elseif a:filetype == "psf" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ptcap" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "python" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "qf" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "radiance" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "Rails-log" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "ratpoison" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "r" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "readline" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rebol" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "registry" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "remind" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rexx" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "robots" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rpl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "rst" ++ call s:MapDelimiters('..', '') ++ elseif a:filetype == "rtf" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "ruby" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "sa" ++ call s:MapDelimiters('--','') ++ elseif a:filetype == "samba" ++ call s:MapDelimitersWithAlternative(';','', '#', '') ++ elseif a:filetype == "sas" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "sass" ++ call s:MapDelimitersWithAlternative('//','', '/*', '') ++ elseif a:filetype == "sather" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "scheme" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "scilab" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "screen" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "scsh" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "sdl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "sed" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "selectbuf" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "sgml" ++ call s:MapDelimiters('') ++ elseif a:filetype == "sgmldecl" ++ call s:MapDelimiters('--','--') ++ elseif a:filetype == "sgmllnx" ++ call s:MapDelimiters('') ++ elseif a:filetype == "sicad" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "simula" ++ call s:MapDelimitersWithAlternative('%', '', '--', '') ++ elseif a:filetype == "sinda" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "skill" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "slang" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "sl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "slrnrc" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "sm" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "smarty" ++ call s:MapDelimiters('{*', '*}') ++ elseif a:filetype == "smil" ++ call s:MapDelimiters('') ++ elseif a:filetype == "smith" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "sml" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "snnsnet" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "snnspat" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "snnsres" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "snobol4" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "spec" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "specman" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "spice" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "sql" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "sqlforms" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "sqlj" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "sqr" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "squid" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "st" ++ call s:MapDelimiters('"','') ++ elseif a:filetype == "stp" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "strace" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "svn" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "SVNcommitlog" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "systemverilog" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "tads" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "taglist" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "tags" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "tak" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "tasm" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "tcl" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "terminfo" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "tex" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "text" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "texinfo" ++ call s:MapDelimiters("@c ", "") ++ elseif a:filetype == "texmf" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "tf" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "tidy" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "tli" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "trasys" ++ call s:MapDelimiters("$", "") ++ elseif a:filetype == "tsalt" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "tsscl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "tssgm" ++ call s:MapDelimiters("comment = '","'") ++ elseif a:filetype == "uc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "uil" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "vb" ++ call s:MapDelimiters("'","") ++ elseif a:filetype == "vcscommit" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "vera" ++ call s:MapDelimitersWithAlternative('/*','*/','//','') ++ elseif a:filetype == "verilog" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "verilog_systemverilog" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "vgrindefs" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "vhdl" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "vim" ++ call s:MapDelimiters('"','') ++ elseif a:filetype == "viminfo" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "virata" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "vo_base" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "vrml" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "vsejcl" ++ call s:MapDelimiters('/*', '') ++ elseif a:filetype == "webmacro" ++ call s:MapDelimiters('##', '') ++ elseif a:filetype == "wget" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "winbatch" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "wml" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype =~ "[^w]*sh" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "wvdial" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "xdefaults" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "xf86conf" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "xhtml" ++ call s:MapDelimiters('') ++ elseif a:filetype == "xkb" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "xmath" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "xml" ++ call s:MapDelimiters('') ++ elseif a:filetype == "xmodmap" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "xpm2" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "xpm" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "xsd" ++ call s:MapDelimiters('') ++ elseif a:filetype == "xslt" ++ call s:MapDelimiters('') ++ elseif a:filetype == "yacc" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "yaml" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "z8a" ++ call s:MapDelimiters(';', '') ++ ++ elseif a:filetype == "" ++ call s:MapDelimitersWithAlternative("","", "", "") ++ ++ "we have not hardcoded the comment delimiters to use for this filetype so ++ "get them from &commentstring. ++ else ++ "print a disclaimer to the user :) ++ if !g:NERDShutUp ++ call s:NerdEcho("Unknown filetype '".a:filetype."', setting delimiters by &commentstring.\nPleeeeease email the author of the NERD commenter with this filetype\nand its delimiters!", 0) ++ endif ++ ++ "extract the delims from &commentstring ++ let left= substitute(&commentstring, '\(.*\)%s.*', '\1', '') ++ let right= substitute(&commentstring, '.*%s\(.*\)', '\1', 'g') ++ ++ call s:MapDelimiters(left,right) ++ endif ++endfunction ++ ++" Function: s:MapDelimiters(left, right) function {{{2 ++" This function is a wrapper for s:MapDelimiters(left, right, leftAlt, rightAlt, useAlt) and is called when there ++" is no alternative comment delimiters for the current filetype ++" ++" Args: ++" -left: the left comment delimiter ++" -right: the right comment delimiter ++function s:MapDelimiters(left, right) ++ call s:MapDelimitersWithAlternative(a:left, a:right, "", "") ++endfunction ++ ++" Function: s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) function {{{2 ++" this function sets up the comment delimiter buffer variables ++" ++" Args: ++" -left: the string defining the comment start delimiter ++" -right: the string defining the comment end delimiter ++" -leftAlt: the string for the alternative comment style defining the comment start delimiter ++" -rightAlt: the string for the alternative comment style defining the comment end delimiter ++function s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) ++ if !exists('g:NERD_' . &filetype . '_alt_style') ++ let b:left = a:left ++ let b:right = a:right ++ let b:leftAlt = a:leftAlt ++ let b:rightAlt = a:rightAlt ++ else ++ let b:left = a:leftAlt ++ let b:right = a:rightAlt ++ let b:leftAlt = a:left ++ let b:rightAlt = a:right ++ endif ++endfunction ++ ++" Function: s:SwitchToAlternativeDelimiters(printMsgs) function {{{2 ++" This function is used to swap the delimiters that are being used to the ++" alternative delimiters for that filetype. For example, if a c++ file is ++" being edited and // comments are being used, after this function is called ++" /**/ comments will be used. ++" ++" Args: ++" -printMsgs: if this is 1 then a message is echoed to the user telling them ++" if this function changed the delimiters or not ++function s:SwitchToAlternativeDelimiters(printMsgs) ++ "if both of the alternative delimiters are empty then there is no ++ "alternative comment style so bail out ++ if !s:HasMultipartDelims() ++ if a:printMsgs ++ call s:NerdEcho("Cannot use alternative delimiters, none are specified", 0) ++ endif ++ return 0 ++ endif ++ ++ "save the current delimiters ++ let tempLeft = b:left ++ let tempRight = b:right ++ ++ "swap current delimiters for alternative ++ let b:left = b:leftAlt ++ let b:right = b:rightAlt ++ ++ "set the previously current delimiters to be the new alternative ones ++ let b:leftAlt = tempLeft ++ let b:rightAlt = tempRight ++ ++ "tell the user what comment delimiters they are now using ++ if a:printMsgs ++ let leftNoEsc = b:left ++ let rightNoEsc = b:right ++ call s:NerdEcho("Now using " . leftNoEsc . " " . rightNoEsc . " to delimit comments", 1) ++ endif ++ ++ return 1 ++endfunction ++ ++" Section: Comment delimiter add/removal functions {{{1 ++" ============================================================================ ++" Function: s:AppendCommentToLine(){{{2 ++" This function appends comment delimiters at the EOL and places the cursor in ++" position to start typing the comment ++function s:AppendCommentToLine() ++ let left = s:GetLeft(0,1,0) ++ let right = s:GetRight(0,1,0) ++ ++ " get the len of the right delim ++ let lenRight = strlen(right) ++ ++ let isLineEmpty = strlen(getline(".")) == 0 ++ let insOrApp = (isLineEmpty==1 ? 'i' : 'A') ++ ++ "stick the delimiters down at the end of the line. We have to format the ++ "comment with spaces as appropriate ++ execute ":normal " . insOrApp . (isLineEmpty ? '' : ' ') . left . right . " " ++ ++ " if there is a right delimiter then we gotta move the cursor left ++ " by the len of the right delimiter so we insert between the delimiters ++ if lenRight > 0 ++ let leftMoveAmount = lenRight ++ execute ":normal " . leftMoveAmount . "h" ++ endif ++ startinsert ++endfunction ++ ++" Function: s:CommentBlock(top, bottom, lSide, rSide, forceNested ) {{{2 ++" This function is used to comment out a region of code. This region is ++" specified as a bounding box by arguments to the function. ++" ++" Args: ++" -top: the line number for the top line of code in the region ++" -bottom: the line number for the bottom line of code in the region ++" -lSide: the column number for the left most column in the region ++" -rSide: the column number for the right most column in the region ++" -forceNested: a flag indicating whether comments should be nested ++function s:CommentBlock(top, bottom, lSide, rSide, forceNested ) ++ " we need to create local copies of these arguments so we can modify them ++ let top = a:top ++ let bottom = a:bottom ++ let lSide = a:lSide ++ let rSide = a:rSide ++ ++ "if the top or bottom line starts with tabs we have to adjust the left and ++ "right boundaries so that they are set as though the tabs were spaces ++ let topline = getline(top) ++ let bottomline = getline(bottom) ++ if s:HasLeadingTabs(topline, bottomline) ++ ++ "find out how many tabs are in the top line and adjust the left ++ "boundary accordingly ++ let numTabs = s:NumberOfLeadingTabs(topline) ++ if lSide < numTabs ++ let lSide = &ts * lSide ++ else ++ let lSide = (lSide - numTabs) + (&ts * numTabs) ++ endif ++ ++ "find out how many tabs are in the bottom line and adjust the right ++ "boundary accordingly ++ let numTabs = s:NumberOfLeadingTabs(bottomline) ++ let rSide = (rSide - numTabs) + (&ts * numTabs) ++ endif ++ ++ "we must check that bottom IS actually below top, if it is not then we ++ "swap top and bottom. Similarly for left and right. ++ if bottom < top ++ let temp = top ++ let top = bottom ++ let bottom = top ++ endif ++ if rSide < lSide ++ let temp = lSide ++ let lSide = rSide ++ let rSide = temp ++ endif ++ ++ "if the current delimiters arent multipart then we will switch to the ++ "alternative delims (if THEY are) as the comment will be better and more ++ "accurate with multipart delims ++ let switchedDelims = 0 ++ if !s:Multipart() && g:NERDAllowAnyVisualDelims && s:AltMultipart() ++ let switchedDelims = 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++ ++ "start the commenting from the top and keep commenting till we reach the ++ "bottom ++ let currentLine=top ++ while currentLine <= bottom ++ ++ "check if we are allowed to comment this line ++ if s:CanCommentLine(a:forceNested, currentLine) ++ ++ "convert the leading tabs into spaces ++ let theLine = getline(currentLine) ++ let lineHasLeadTabs = s:HasLeadingTabs(theLine) ++ if lineHasLeadTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ ++ "dont comment lines that begin after the right boundary of the ++ "block unless the user has specified to do so ++ if theLine !~ '^ \{' . rSide . '\}' || !g:NERDBlockComIgnoreEmpty ++ ++ "attempt to place the cursor in on the left of the boundary box, ++ "then check if we were successful, if not then we cant comment this ++ "line ++ call setline(currentLine, theLine) ++ if s:CanPlaceCursor(currentLine, lSide) ++ ++ let leftSpaced = s:GetLeft(0,1,0) ++ let rightSpaced = s:GetRight(0,1,0) ++ ++ "stick the left delimiter down ++ let theLine = strpart(theLine, 0, lSide-1) . leftSpaced . strpart(theLine, lSide-1) ++ ++ if s:Multipart() ++ "stick the right delimiter down ++ let theLine = strpart(theLine, 0, rSide+strlen(leftSpaced)) . rightSpaced . strpart(theLine, rSide+strlen(rightSpaced)) ++ ++ let firstLeftDelim = s:FindDelimiterIndex(b:left, theLine) ++ let lastRightDelim = s:LastIndexOfDelim(b:right, theLine) ++ ++ if firstLeftDelim != -1 && lastRightDelim != -1 ++ let searchStr = strpart(theLine, 0, lastRightDelim) ++ let searchStr = strpart(searchStr, firstLeftDelim+strlen(b:left)) ++ ++ "replace the outter most delims in searchStr with ++ "place-holders ++ let theLineWithPlaceHolders = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, searchStr) ++ ++ "add the right delimiter onto the line ++ let theLine = strpart(theLine, 0, firstLeftDelim+strlen(b:left)) . theLineWithPlaceHolders . strpart(theLine, lastRightDelim) ++ endif ++ endif ++ endif ++ endif ++ ++ "restore tabs if needed ++ if lineHasLeadTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ call setline(currentLine, theLine) ++ endif ++ ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ "if we switched delims then we gotta go back to what they were before ++ if switchedDelims == 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++endfunction ++ ++" Function: s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) {{{2 ++" This function comments a range of lines. ++" ++" Args: ++" -forceNested: a flag indicating whether the called is requesting the comment ++" to be nested if need be ++" -alignRight/alignLeft: 0/1 if the comments delimiters should/shouldnt be ++" aligned left/right ++" -firstLine/lastLine: the top and bottom lines to comment ++function s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) ++ " we need to get the left and right indexes of the leftmost char in the ++ " block of of lines and the right most char so that we can do alignment of ++ " the delimiters if the user has specified ++ let leftAlignIndx = s:LeftMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) ++ let rightAlignIndx = s:RightMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) ++ ++ " gotta add the length of the left delimiter onto the rightAlignIndx cos ++ " we'll be adding a left delim to the line ++ let rightAlignIndx = rightAlignIndx + strlen(s:GetLeft(0,1,0)) ++ ++ " now we actually comment the lines. Do it line by line ++ let currentLine = a:firstLine ++ while currentLine <= a:lastLine ++ ++ " get the next line, check commentability and convert spaces to tabs ++ let theLine = getline(currentLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ if s:CanCommentLine(a:forceNested, currentLine) ++ "if the user has specified forceNesting then we check to see if we ++ "need to switch delimiters for place-holders ++ if a:forceNested && g:NERDUsePlaceHolders ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ endif ++ ++ " find out if the line is commented using normal delims and/or ++ " alternate ones ++ let isCommented = s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) ++ ++ " check if we can comment this line ++ if !isCommented || g:NERDUsePlaceHolders || s:Multipart() ++ if a:alignLeft ++ let theLine = s:AddLeftDelimAligned(b:left, theLine, leftAlignIndx) ++ else ++ let theLine = s:AddLeftDelim(s:GetLeft(0,1,0), theLine) ++ endif ++ if a:alignRight ++ let theLine = s:AddRightDelimAligned(b:right, theLine, rightAlignIndx) ++ else ++ let theLine = s:AddRightDelim(s:GetRight(0,1,0), theLine) ++ endif ++ endif ++ endif ++ ++ " restore leading tabs if appropriate ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ " we are done with this line ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++endfunction ++ ++" Function: s:CommentLinesMinimal(firstLine, lastLine) {{{2 ++" This function comments a range of lines in a minimal style. I ++" ++" Args: ++" -firstLine/lastLine: the top and bottom lines to comment ++function s:CommentLinesMinimal(firstLine, lastLine) ++ "check that minimal comments can be done on this filetype ++ if !s:HasMultipartDelims() ++ throw 'NERDCommenter.Delimiters exception: Minimal comments can only be used for filetypes that have multipart delimiters' ++ endif ++ ++ "if we need to use place holders for the comment, make sure they are ++ "enabled for this filetype ++ if !g:NERDUsePlaceHolders && s:DoesBlockHaveMultipartDelim(a:firstLine, a:lastLine) ++ throw 'NERDCommenter.Settings exception: Placeoholders are required but disabled.' ++ endif ++ ++ "get the left and right delims to smack on ++ let left = s:GetSexyComLeft(g:NERDSpaceDelims,0) ++ let right = s:GetSexyComRight(g:NERDSpaceDelims,0) ++ ++ "make sure all multipart delims on the lines are replaced with ++ "placeholders to prevent illegal syntax ++ let currentLine = a:firstLine ++ while(currentLine <= a:lastLine) ++ let theLine = getline(currentLine) ++ let theLine = s:ReplaceDelims(left, right, g:NERDLPlace, g:NERDRPlace, theLine) ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ "add the delim to the top line ++ let theLine = getline(a:firstLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let theLine = s:AddLeftDelim(left, theLine) ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:firstLine, theLine) ++ ++ "add the delim to the bottom line ++ let theLine = getline(a:lastLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let theLine = s:AddRightDelim(right, theLine) ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:lastLine, theLine) ++endfunction ++ ++" Function: s:CommentLinesSexy(topline, bottomline) function {{{2 ++" This function is used to comment lines in the 'Sexy' style. eg in c: ++" /* ++" * This is a sexy comment ++" */ ++" Args: ++" -topline: the line num of the top line in the sexy comment ++" -bottomline: the line num of the bottom line in the sexy comment ++function s:CommentLinesSexy(topline, bottomline) ++ let left = s:GetSexyComLeft(0, 0) ++ let right = s:GetSexyComRight(0, 0) ++ ++ "check if we can do a sexy comment with the available delimiters ++ if left == -1 || right == -1 ++ throw 'NERDCommenter.Delimiters exception: cannot perform sexy comments with available delimiters.' ++ endif ++ ++ "make sure the lines arent already commented sexually ++ if !s:CanSexyCommentLines(a:topline, a:bottomline) ++ throw 'NERDCommenter.Nesting exception: cannot nest sexy comments' ++ endif ++ ++ ++ let sexyComMarker = s:GetSexyComMarker(0,0) ++ let sexyComMarkerSpaced = s:GetSexyComMarker(1,0) ++ ++ ++ " we jam the comment as far to the right as possible ++ let leftAlignIndx = s:LeftMostIndx(1, 1, a:topline, a:bottomline) ++ ++ "check if we should use the compact style i.e that the left/right ++ "delimiters should appear on the first and last lines of the code and not ++ "on separate lines above/below the first/last lines of code ++ if g:NERDCompactSexyComs ++ let spaceString = (g:NERDSpaceDelims ? s:spaceStr : '') ++ ++ "comment the top line ++ let theLine = getline(a:topline) ++ let lineHasTabs = s:HasLeadingTabs(theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ let theLine = s:AddLeftDelimAligned(left . spaceString, theLine, leftAlignIndx) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:topline, theLine) ++ ++ "comment the bottom line ++ let theLine = getline(a:bottomline) ++ let lineHasTabs = s:HasLeadingTabs(theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ let theLine = s:AddRightDelim(spaceString . right, theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:bottomline, theLine) ++ else ++ ++ " add the left delimiter one line above the lines that are to be commented ++ call cursor(a:topline, 1) ++ execute 'normal! O' ++ call setline(a:topline, strpart(s:spaces, 0, leftAlignIndx) . left ) ++ ++ " add the right delimiter after bottom line (we have to add 1 cos we moved ++ " the lines down when we added the left delim ++ call cursor(a:bottomline+1, 1) ++ execute 'normal! o' ++ call setline(a:bottomline+2, strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . right ) ++ ++ endif ++ ++ " go thru each line adding the sexyComMarker marker to the start of each ++ " line in the appropriate place to align them with the comment delims ++ let currentLine = a:topline+1 ++ while currentLine <= a:bottomline + !g:NERDCompactSexyComs ++ " get the line and convert the tabs to spaces ++ let theLine = getline(currentLine) ++ let lineHasTabs = s:HasLeadingTabs(theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ ++ " add the sexyComMarker ++ let theLine = strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . sexyComMarkerSpaced . strpart(theLine, leftAlignIndx) ++ ++ if lineHasTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ ++ " set the line and move onto the next one ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++endfunction ++ ++" Function: s:CommentLinesToggle(forceNested, firstLine, lastLine) {{{2 ++" Applies "toggle" commenting to the given range of lines ++" ++" Args: ++" -forceNested: a flag indicating whether the called is requesting the comment ++" to be nested if need be ++" -firstLine/lastLine: the top and bottom lines to comment ++function s:CommentLinesToggle(forceNested, firstLine, lastLine) ++ let currentLine = a:firstLine ++ while currentLine <= a:lastLine ++ ++ " get the next line, check commentability and convert spaces to tabs ++ let theLine = getline(currentLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ if s:CanToggleCommentLine(a:forceNested, currentLine) ++ ++ "if the user has specified forceNesting then we check to see if we ++ "need to switch delimiters for place-holders ++ if g:NERDUsePlaceHolders ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ endif ++ ++ let theLine = s:AddLeftDelim(s:GetLeft(0, 1, 0), theLine) ++ let theLine = s:AddRightDelim(s:GetRight(0, 1, 0), theLine) ++ endif ++ ++ " restore leading tabs if appropriate ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ " we are done with this line ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++endfunction ++ ++" Function: s:CommentRegion(topline, topCol, bottomLine, bottomCol) function {{{2 ++" This function comments chunks of text selected in visual mode. ++" It will comment exactly the text that they have selected. ++" Args: ++" -topLine: the line num of the top line in the sexy comment ++" -topCol: top left col for this comment ++" -bottomline: the line num of the bottom line in the sexy comment ++" -bottomCol: the bottom right col for this comment ++" -forceNested: whether the caller wants comments to be nested if the ++" line(s) are already commented ++function s:CommentRegion(topLine, topCol, bottomLine, bottomCol, forceNested) ++ ++ "switch delims (if we can) if the current set isnt multipart ++ let switchedDelims = 0 ++ if !s:Multipart() && s:AltMultipart() && !g:NERDAllowAnyVisualDelims ++ let switchedDelims = 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++ ++ "if there is only one line in the comment then just do it ++ if a:topLine == a:bottomLine ++ call s:CommentBlock(a:topLine, a:bottomLine, a:topCol, a:bottomCol, a:forceNested) ++ ++ "there are multiple lines in the comment ++ else ++ "comment the top line ++ call s:CommentBlock(a:topLine, a:topLine, a:topCol, strlen(getline(a:topLine)), a:forceNested) ++ ++ "comment out all the lines in the middle of the comment ++ let topOfRange = a:topLine+1 ++ let bottomOfRange = a:bottomLine-1 ++ if topOfRange <= bottomOfRange ++ call s:CommentLines(a:forceNested, 0, 0, topOfRange, bottomOfRange) ++ endif ++ ++ "comment the bottom line ++ let bottom = getline(a:bottomLine) ++ let numLeadingSpacesTabs = strlen(substitute(bottom, '^\([ \t]*\).*$', '\1', '')) ++ call s:CommentBlock(a:bottomLine, a:bottomLine, numLeadingSpacesTabs+1, a:bottomCol, a:forceNested) ++ ++ endif ++ ++ "stick the cursor back on the char it was on before the comment ++ call cursor(a:topLine, a:topCol + strlen(b:left) + g:NERDSpaceDelims) ++ ++ "if we switched delims then we gotta go back to what they were before ++ if switchedDelims == 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++ ++endfunction ++ ++" Function: s:InvertComment(firstLine, lastLine) function {{{2 ++" Inverts the comments on the lines between and including the given line ++" numbers i.e all commented lines are uncommented and vice versa ++" Args: ++" -firstLine: the top of the range of lines to be inverted ++" -lastLine: the bottom of the range of lines to be inverted ++function s:InvertComment(firstLine, lastLine) ++ ++ " go thru all lines in the given range ++ let currentLine = a:firstLine ++ while currentLine <= a:lastLine ++ let theLine = getline(currentLine) ++ ++ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) ++ ++ " if the line is commented normally, uncomment it ++ if s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) ++ call s:UncommentLines(1, currentLine, currentLine) ++ let currentLine = currentLine + 1 ++ ++ " check if the line is commented sexually ++ elseif !empty(sexyComBounds) ++ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() ++ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) ++ ++ "move to the line after last line of the sexy comment ++ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() ++ let currentLine = bottomBound - (numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved) + 1 ++ ++ " the line isnt commented ++ else ++ call s:CommentLinesToggle(1, currentLine, currentLine) ++ let currentLine = currentLine + 1 ++ endif ++ ++ endwhile ++endfunction ++ ++" Function: NERDComment(isVisual, alignLeft, alignRight, type) function {{{2 ++" This function is a Wrapper for the main commenting functions ++" ++" Args: ++" -isVisual: a flag indicating whether the comment is requested in visual ++" mode or not ++" -type: the type of commenting requested. Can be 'sexy', 'invert', ++" 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', ++" 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' ++function! NERDComment(isVisual, type) range ++ " we want case sensitivity when commenting ++ let prevIgnoreCase = &ignorecase ++ set noignorecase ++ ++ if a:isVisual ++ let firstLine = line("'<") ++ let lastLine = line("'>") ++ let firstCol = col("'<") ++ let lastCol = col("'>") ++ else ++ let firstLine = a:firstline ++ let lastLine = a:lastline ++ endif ++ ++ let countWasGiven = (a:isVisual == 0 && firstLine != lastLine) ++ ++ let forceNested = (a:type == 'nested' || g:NERDDefaultNesting) ++ ++ if a:type == 'norm' || a:type == 'nested' ++ if a:isVisual && visualmode() == "" ++ call s:CommentBlock(firstLine, lastLine, firstCol, lastCol, forceNested) ++ elseif a:isVisual && visualmode() == "v" && (g:NERDCommentWholeLinesInVMode==0 || (g:NERDCommentWholeLinesInVMode==2 && s:HasMultipartDelims())) ++ call s:CommentRegion(firstLine, firstCol, lastLine, lastCol, forceNested) ++ else ++ call s:CommentLines(forceNested, 0, 0, firstLine, lastLine) ++ endif ++ ++ elseif a:type == 'alignLeft' || a:type == 'alignRight' || a:type == 'alignBoth' ++ let alignLeft = (a:type == 'alignLeft' || a:type == 'alignBoth') ++ let alignRight = (a:type == 'alignRight' || a:type == 'alignBoth') ++ call s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) ++ ++ elseif a:type == 'invert' ++ call s:InvertComment(firstLine, lastLine) ++ ++ elseif a:type == 'sexy' ++ try ++ call s:CommentLinesSexy(firstLine, lastLine) ++ catch /NERDCommenter.Delimiters/ ++ call s:NerdEcho("Sexy comments cannot be done with the available delimiters", 0) ++ catch /NERDCommenter.Nesting/ ++ call s:NerdEcho("Sexy comment aborted. Nested sexy cannot be nested", 0) ++ endtry ++ ++ elseif a:type == 'toggle' ++ let theLine = getline(firstLine) ++ ++ if s:IsInSexyComment(firstLine) || s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) ++ call s:UncommentLines(1, firstLine, lastLine) ++ else ++ call s:CommentLinesToggle(forceNested, firstLine, lastLine) ++ endif ++ ++ elseif a:type == 'minimal' ++ try ++ call s:CommentLinesMinimal(firstLine, lastLine) ++ catch /NERDCommenter.Delimiters/ ++ call s:NerdEcho("Minimal comments can only be used for filetypes that have multipart delimiters.", 0) ++ catch /NERDCommenter.Settings/ ++ call s:NerdEcho("Place holders are required but disabled.", 0) ++ endtry ++ ++ elseif a:type == 'toEOL' ++ call s:SaveScreenState() ++ call s:CommentBlock(firstLine, firstLine, col("."), col("$")-1, 1) ++ call s:RestoreScreenState() ++ ++ elseif a:type == 'prepend' ++ call s:PrependCommentToLine() ++ ++ elseif a:type == 'append' ++ call s:AppendCommentToLine() ++ ++ elseif a:type == 'insert' ++ call s:PlaceDelimitersAndInsBetween() ++ ++ elseif a:type == 'uncomment' ++ call s:UncommentLines(0, firstLine, lastLine) ++ ++ elseif a:type == 'yank' ++ if a:isVisual ++ normal gvy ++ elseif countWasGiven ++ execute firstLine .','. lastLine .'yank' ++ else ++ normal Y ++ endif ++ execute firstLine .','. lastLine .'call NERDComment('. a:isVisual .', "norm")' ++ endif ++ ++ let &ignorecase = prevIgnoreCase ++endfunction ++ ++" Function: s:PlaceDelimitersAndInsBetween() function {{{2 ++" This is function is called to place comment delimiters down and place the ++" cursor between them ++function s:PlaceDelimitersAndInsBetween() ++ " get the left and right delimiters without any escape chars in them ++ let left = s:GetLeft(0, 1, 0) ++ let right = s:GetRight(0, 1, 0) ++ ++ let theLine = getline(".") ++ let lineHasLeadTabs = s:HasLeadingTabs(theLine) || (theLine =~ '^ *$' && !&expandtab) ++ ++ "convert tabs to spaces and adjust the cursors column to take this into ++ "account ++ let untabbedCol = s:UntabbedCol(theLine, col(".")) ++ call setline(line("."), s:ConvertLeadingTabsToSpaces(theLine)) ++ call cursor(line("."), untabbedCol) ++ ++ " get the len of the right delim ++ let lenRight = strlen(right) ++ ++ let isDelimOnEOL = col(".") >= strlen(getline(".")) ++ ++ " if the cursor is in the first col then we gotta insert rather than ++ " append the comment delimiters here ++ let insOrApp = (col(".")==1 ? 'i' : 'a') ++ ++ " place the delimiters down. We do it differently depending on whether ++ " there is a left AND right delimiter ++ if lenRight > 0 ++ execute ":normal " . insOrApp . left . right ++ execute ":normal " . lenRight . "h" ++ else ++ execute ":normal " . insOrApp . left ++ ++ " if we are tacking the delim on the EOL then we gotta add a space ++ " after it cos when we go out of insert mode the cursor will move back ++ " one and the user wont be in position to type the comment. ++ if isDelimOnEOL ++ execute 'normal a ' ++ endif ++ endif ++ normal l ++ ++ "if needed convert spaces back to tabs and adjust the cursors col ++ "accordingly ++ if lineHasLeadTabs ++ let tabbedCol = s:TabbedCol(getline("."), col(".")) ++ call setline(line("."), s:ConvertLeadingSpacesToTabs(getline("."))) ++ call cursor(line("."), tabbedCol) ++ endif ++ ++ startinsert ++endfunction ++ ++" Function: s:PrependCommentToLine(){{{2 ++" This function prepends comment delimiters to the start of line and places ++" the cursor in position to start typing the comment ++function s:PrependCommentToLine() ++ " get the left and right delimiters without any escape chars in them ++ let left = s:GetLeft(0, 1, 0) ++ let right = s:GetRight(0, 1, 0) ++ ++ " get the len of the right delim ++ let lenRight = strlen(right) ++ ++ ++ "if the line is empty then we need to know about this later on ++ let isLineEmpty = strlen(getline(".")) == 0 ++ ++ "stick the delimiters down at the start of the line. We have to format the ++ "comment with spaces as appropriate ++ if lenRight > 0 ++ execute ":normal I" . left . right ++ else ++ execute ":normal I" . left ++ endif ++ ++ " if there is a right delimiter then we gotta move the cursor left ++ " by the len of the right delimiter so we insert between the delimiters ++ if lenRight > 0 ++ let leftMoveAmount = lenRight ++ execute ":normal " . leftMoveAmount . "h" ++ endif ++ normal l ++ ++ "if the line was empty then we gotta add an extra space on the end because ++ "the cursor will move back one more at the end of the last "execute" ++ "command ++ if isLineEmpty && lenRight == 0 ++ execute ":normal a " ++ endif ++ ++ startinsert ++endfunction ++" Function: s:RemoveDelimiters(left, right, line) {{{2 ++" this function is called to remove the first left comment delimiter and the ++" last right delimiter of the given line. ++" ++" The args left and right must be strings. If there is no right delimiter (as ++" is the case for e.g vim file comments) them the arg right should be "" ++" ++" Args: ++" -left: the left comment delimiter ++" -right: the right comment delimiter ++" -line: the line to remove the delimiters from ++function s:RemoveDelimiters(left, right, line) ++ ++ let l:left = a:left ++ let l:right = a:right ++ let lenLeft = strlen(left) ++ let lenRight = strlen(right) ++ ++ let delimsSpaced = (g:NERDSpaceDelims || g:NERDRemoveExtraSpaces) ++ ++ let line = a:line ++ ++ "look for the left delimiter, if we find it, remove it. ++ let leftIndx = s:FindDelimiterIndex(a:left, line) ++ if leftIndx != -1 ++ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+lenLeft) ++ ++ "if the user has specified that there is a space after the left delim ++ "then check for the space and remove it if it is there ++ if delimsSpaced && strpart(line, leftIndx, s:lenSpaceStr) == s:spaceStr ++ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+s:lenSpaceStr) ++ endif ++ endif ++ ++ "look for the right delimiter, if we find it, remove it ++ let rightIndx = s:FindDelimiterIndex(a:right, line) ++ if rightIndx != -1 ++ let line = strpart(line, 0, rightIndx) . strpart(line, rightIndx+lenRight) ++ ++ "if the user has specified that there is a space before the right delim ++ "then check for the space and remove it if it is there ++ if delimsSpaced && strpart(line, rightIndx-s:lenSpaceStr, s:lenSpaceStr) == s:spaceStr && s:Multipart() ++ let line = strpart(line, 0, rightIndx-s:lenSpaceStr) . strpart(line, rightIndx) ++ endif ++ endif ++ ++ return line ++endfunction ++ ++" Function: s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) {{{2 ++" This function uncomments the given lines ++" ++" Args: ++" onlyWholeLineComs: should be 1 for toggle style uncommenting ++" topLine: the top line of the visual selection to uncomment ++" bottomLine: the bottom line of the visual selection to uncomment ++function s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) ++ "make local copies of a:firstline and a:lastline and, if need be, swap ++ "them around if the top line is below the bottom ++ let l:firstline = a:topLine ++ let l:lastline = a:bottomLine ++ if firstline > lastline ++ let firstline = lastline ++ let lastline = a:topLine ++ endif ++ ++ "go thru each line uncommenting each line removing sexy comments ++ let currentLine = firstline ++ while currentLine <= lastline ++ ++ "check the current line to see if it is part of a sexy comment ++ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) ++ if !empty(sexyComBounds) ++ ++ "we need to store the num lines in the buf before the comment is ++ "removed so we know how many lines were removed when the sexy com ++ "was removed ++ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() ++ ++ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) ++ ++ "move to the line after last line of the sexy comment ++ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() ++ let numLinesRemoved = numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved ++ let currentLine = sexyComBounds[1] - numLinesRemoved + 1 ++ let lastline = lastline - numLinesRemoved ++ ++ "no sexy com was detected so uncomment the line as normal ++ else ++ let theLine = getline(currentLine) ++ if a:onlyWholeLineComs && (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) ++ call s:UncommentLinesNormal(currentLine, currentLine) ++ elseif !a:onlyWholeLineComs ++ call s:UncommentLinesNormal(currentLine, currentLine) ++ endif ++ let currentLine = currentLine + 1 ++ endif ++ endwhile ++ ++endfunction ++ ++" Function: s:UncommentLinesSexy(topline, bottomline) {{{2 ++" This function removes all the comment characters associated with the sexy ++" comment spanning the given lines ++" Args: ++" -topline/bottomline: the top/bottom lines of the sexy comment ++function s:UncommentLinesSexy(topline, bottomline) ++ let left = s:GetSexyComLeft(0,1) ++ let right = s:GetSexyComRight(0,1) ++ ++ ++ "check if it is even possible for sexy comments to exist with the ++ "available delimiters ++ if left == -1 || right == -1 ++ throw 'NERDCommenter.Delimiters exception: cannot uncomment sexy comments with available delimiters.' ++ endif ++ ++ let leftUnEsc = s:GetSexyComLeft(0,0) ++ let rightUnEsc = s:GetSexyComRight(0,0) ++ ++ let sexyComMarker = s:GetSexyComMarker(0, 1) ++ let sexyComMarkerUnEsc = s:GetSexyComMarker(0, 0) ++ ++ "the markerOffset is how far right we need to move the sexyComMarker to ++ "line it up with the end of the left delim ++ let markerOffset = strlen(leftUnEsc)-strlen(sexyComMarkerUnEsc) ++ ++ " go thru the intermediate lines of the sexy comment and remove the ++ " sexy comment markers (eg the '*'s on the start of line in a c sexy ++ " comment) ++ let currentLine = a:topline+1 ++ while currentLine < a:bottomline ++ let theLine = getline(currentLine) ++ ++ " remove the sexy comment marker from the line. We also remove the ++ " space after it if there is one and if appropriate options are set ++ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) ++ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) ++ endif ++ ++ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) ++ ++ let theLine = s:ConvertLeadingWhiteSpace(theLine) ++ ++ " move onto the next line ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ " gotta make a copy of a:bottomline cos we modify the position of the ++ " last line it if we remove the topline ++ let bottomline = a:bottomline ++ ++ " get the first line so we can remove the left delim from it ++ let theLine = getline(a:topline) ++ ++ " if the first line contains only the left delim then just delete it ++ if theLine =~ '^[ \t]*' . left . '[ \t]*$' && !g:NERDCompactSexyComs ++ call cursor(a:topline, 1) ++ normal dd ++ let bottomline = bottomline - 1 ++ ++ " topline contains more than just the left delim ++ else ++ ++ " remove the delim. If there is a space after it ++ " then remove this too if appropriate ++ let delimIndx = stridx(theLine, leftUnEsc) ++ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)) ++ endif ++ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) ++ call setline(a:topline, theLine) ++ endif ++ ++ " get the last line so we can remove the right delim ++ let theLine = getline(bottomline) ++ ++ " if the bottomline contains only the right delim then just delete it ++ if theLine =~ '^[ \t]*' . right . '[ \t]*$' ++ call cursor(bottomline, 1) ++ normal dd ++ ++ " the last line contains more than the right delim ++ else ++ " remove the right delim. If there is a space after it and ++ " if the appropriate options are set then remove this too. ++ let delimIndx = s:LastIndexOfDelim(rightUnEsc, theLine) ++ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)) ++ endif ++ ++ " if the last line also starts with a sexy comment marker then we ++ " remove this as well ++ if theLine =~ '^[ \t]*' . sexyComMarker ++ ++ " remove the sexyComMarker. If there is a space after it then ++ " remove that too ++ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) ++ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) ++ endif ++ endif ++ ++ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) ++ call setline(bottomline, theLine) ++ endif ++endfunction ++ ++" Function: s:UncommentLineNormal(line) {{{2 ++" uncomments the given line and returns the result ++" Args: ++" -line: the line to uncomment ++function s:UncommentLineNormal(line) ++ let line = a:line ++ ++ "get the comment status on the line so we know how it is commented ++ let lineCommentStatus = s:IsCommentedOuttermost(b:leftAlt, b:rightAlt, b:left, b:right, line) ++ ++ "it is commented with b:left and b:right so remove these delims ++ if lineCommentStatus == 1 ++ let line = s:RemoveDelimiters(b:leftAlt, b:rightAlt, line) ++ ++ "it is commented with b:leftAlt and b:rightAlt so remove these delims ++ elseif lineCommentStatus == 2 && g:NERDRemoveAltComs ++ let line = s:RemoveDelimiters(b:left, b:right, line) ++ ++ "it is not properly commented with any delims so we check if it has ++ "any random left or right delims on it and remove the outtermost ones ++ else ++ "get the positions of all delim types on the line ++ let indxLeft = s:FindDelimiterIndex(b:left, line) ++ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) ++ let indxRight = s:FindDelimiterIndex(b:right, line) ++ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) ++ ++ "remove the outter most left comment delim ++ if indxLeft != -1 && (indxLeft < indxLeftAlt || indxLeftAlt == -1) ++ let line = s:ReplaceLeftMostDelim(b:left, '', line) ++ elseif indxLeftAlt != -1 ++ let line = s:ReplaceLeftMostDelim(b:leftAlt, '', line) ++ endif ++ ++ "remove the outter most right comment delim ++ if indxRight != -1 && (indxRight < indxRightAlt || indxRightAlt == -1) ++ let line = s:ReplaceRightMostDelim(b:right, '', line) ++ elseif indxRightAlt != -1 ++ let line = s:ReplaceRightMostDelim(b:rightAlt, '', line) ++ endif ++ endif ++ ++ ++ let indxLeft = s:FindDelimiterIndex(b:left, line) ++ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) ++ let indxLeftPlace = s:FindDelimiterIndex(g:NERDLPlace, line) ++ ++ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) ++ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) ++ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) ++ ++ let right = b:right ++ let left = b:left ++ if !s:Multipart() ++ let right = b:rightAlt ++ let left = b:leftAlt ++ endif ++ ++ ++ "if there are place-holders on the line then we check to see if they are ++ "the outtermost delimiters on the line. If so then we replace them with ++ "real delimiters ++ if indxLeftPlace != -1 ++ if (indxLeftPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) ++ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) ++ endif ++ elseif indxRightPlace != -1 ++ if (indxRightPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) ++ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) ++ endif ++ ++ endif ++ ++ let line = s:ConvertLeadingWhiteSpace(line) ++ ++ return line ++endfunction ++ ++" Function: s:UncommentLinesNormal(topline, bottomline) {{{2 ++" This function is called to uncomment lines that arent a sexy comment ++" Args: ++" -topline/bottomline: the top/bottom line numbers of the comment ++function s:UncommentLinesNormal(topline, bottomline) ++ let currentLine = a:topline ++ while currentLine <= a:bottomline ++ let line = getline(currentLine) ++ call setline(currentLine, s:UncommentLineNormal(line)) ++ let currentLine = currentLine + 1 ++ endwhile ++endfunction ++ ++ ++" Section: Other helper functions {{{1 ++" ============================================================================ ++ ++" Function: s:AddLeftDelim(delim, theLine) {{{2 ++" Args: ++function s:AddLeftDelim(delim, theLine) ++ return substitute(a:theLine, '^\([ \t]*\)', '\1' . a:delim, '') ++endfunction ++ ++" Function: s:AddLeftDelimAligned(delim, theLine) {{{2 ++" Args: ++function s:AddLeftDelimAligned(delim, theLine, alignIndx) ++ ++ "if the line is not long enough then bung some extra spaces on the front ++ "so we can align the delim properly ++ let theLine = a:theLine ++ if strlen(theLine) < a:alignIndx ++ let theLine = strpart(s:spaces, 0, a:alignIndx - strlen(theLine)) ++ endif ++ ++ return strpart(theLine, 0, a:alignIndx) . a:delim . strpart(theLine, a:alignIndx) ++endfunction ++ ++" Function: s:AddRightDelim(delim, theLine) {{{2 ++" Args: ++function s:AddRightDelim(delim, theLine) ++ if a:delim == '' ++ return a:theLine ++ else ++ return substitute(a:theLine, '$', a:delim, '') ++ endif ++endfunction ++ ++" Function: s:AddRightDelimAligned(delim, theLine, alignIndx) {{{2 ++" Args: ++function s:AddRightDelimAligned(delim, theLine, alignIndx) ++ if a:delim == "" ++ return a:theLine ++ else ++ ++ " when we align the right delim we are just adding spaces ++ " so we get a string containing the needed spaces (it ++ " could be empty) ++ let extraSpaces = '' ++ let extraSpaces = strpart(s:spaces, 0, a:alignIndx-strlen(a:theLine)) ++ ++ " add the right delim ++ return substitute(a:theLine, '$', extraSpaces . a:delim, '') ++ endif ++endfunction ++ ++" Function: s:AltMultipart() {{{2 ++" returns 1 if the alternative delims are multipart ++function s:AltMultipart() ++ return b:rightAlt != '' ++endfunction ++ ++" Function: s:CanCommentLine(forceNested, line) {{{2 ++"This function is used to determine whether the given line can be commented. ++"It returns 1 if it can be and 0 otherwise ++" ++" Args: ++" -forceNested: a flag indicating whether the caller wants comments to be nested ++" if the current line is already commented ++" -lineNum: the line num of the line to check for commentability ++function s:CanCommentLine(forceNested, lineNum) ++ let theLine = getline(a:lineNum) ++ ++ " make sure we don't comment lines that are just spaces or tabs or empty. ++ if theLine =~ "^[ \t]*$" ++ return 0 ++ endif ++ ++ "if the line is part of a sexy comment then just flag it... ++ if s:IsInSexyComment(a:lineNum) ++ return 0 ++ endif ++ ++ let isCommented = s:IsCommentedNormOrSexy(a:lineNum) ++ ++ "if the line isnt commented return true ++ if !isCommented ++ return 1 ++ endif ++ ++ "if the line is commented but nesting is allowed then return true ++ if a:forceNested && (!s:Multipart() || g:NERDUsePlaceHolders) ++ return 1 ++ endif ++ ++ return 0 ++endfunction ++ ++" Function: s:CanPlaceCursor(line, col) {{{2 ++" returns 1 if the cursor can be placed exactly in the given position ++function s:CanPlaceCursor(line, col) ++ let c = col(".") ++ let l = line(".") ++ call cursor(a:line, a:col) ++ let success = (line(".") == a:line && col(".") == a:col) ++ call cursor(l,c) ++ return success ++endfunction ++ ++" Function: s:CanSexyCommentLines(topline, bottomline) {{{2 ++" Return: 1 if the given lines can be commented sexually, 0 otherwise ++function s:CanSexyCommentLines(topline, bottomline) ++ " see if the selected regions have any sexy comments ++ let currentLine = a:topline ++ while(currentLine <= a:bottomline) ++ if s:IsInSexyComment(currentLine) ++ return 0 ++ endif ++ let currentLine = currentLine + 1 ++ endwhile ++ return 1 ++endfunction ++" Function: s:CanToggleCommentLine(forceNested, line) {{{2 ++"This function is used to determine whether the given line can be toggle commented. ++"It returns 1 if it can be and 0 otherwise ++" ++" Args: ++" -lineNum: the line num of the line to check for commentability ++function s:CanToggleCommentLine(forceNested, lineNum) ++ let theLine = getline(a:lineNum) ++ if (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) && !a:forceNested ++ return 0 ++ endif ++ ++ " make sure we don't comment lines that are just spaces or tabs or empty. ++ if theLine =~ "^[ \t]*$" ++ return 0 ++ endif ++ ++ "if the line is part of a sexy comment then just flag it... ++ if s:IsInSexyComment(a:lineNum) ++ return 0 ++ endif ++ ++ return 1 ++endfunction ++ ++" Function: s:ConvertLeadingSpacesToTabs(line) {{{2 ++" This function takes a line and converts all leading tabs on that line into ++" spaces ++" ++" Args: ++" -line: the line whose leading tabs will be converted ++function s:ConvertLeadingSpacesToTabs(line) ++ let toReturn = a:line ++ while toReturn =~ '^\t*' . s:TabSpace() . '\(.*\)$' ++ let toReturn = substitute(toReturn, '^\(\t*\)' . s:TabSpace() . '\(.*\)$' , '\1\t\2' , "") ++ endwhile ++ ++ return toReturn ++endfunction ++ ++ ++" Function: s:ConvertLeadingTabsToSpaces(line) {{{2 ++" This function takes a line and converts all leading spaces on that line into ++" tabs ++" ++" Args: ++" -line: the line whose leading spaces will be converted ++function s:ConvertLeadingTabsToSpaces(line) ++ let toReturn = a:line ++ while toReturn =~ '^\( *\)\t' ++ let toReturn = substitute(toReturn, '^\( *\)\t', '\1' . s:TabSpace() , "") ++ endwhile ++ ++ return toReturn ++endfunction ++ ++" Function: s:ConvertLeadingWhiteSpace(line) {{{2 ++" Converts the leading white space to tabs/spaces depending on &ts ++" ++" Args: ++" -line: the line to convert ++function s:ConvertLeadingWhiteSpace(line) ++ let toReturn = a:line ++ while toReturn =~ '^ *\t' ++ let toReturn = substitute(toReturn, '^ *\zs\t\ze', s:TabSpace(), "g") ++ endwhile ++ ++ if !&expandtab ++ let toReturn = s:ConvertLeadingSpacesToTabs(toReturn) ++ endif ++ ++ return toReturn ++endfunction ++ ++ ++" Function: s:CountNonESCedOccurances(str, searchstr, escChar) {{{2 ++" This function counts the number of substrings contained in another string. ++" These substrings are only counted if they are not escaped with escChar ++" Args: ++" -str: the string to look for searchstr in ++" -searchstr: the substring to search for in str ++" -escChar: the escape character which, when preceding an instance of ++" searchstr, will cause it not to be counted ++function s:CountNonESCedOccurances(str, searchstr, escChar) ++ "get the index of the first occurrence of searchstr ++ let indx = stridx(a:str, a:searchstr) ++ ++ "if there is an instance of searchstr in str process it ++ if indx != -1 ++ "get the remainder of str after this instance of searchstr is removed ++ let lensearchstr = strlen(a:searchstr) ++ let strLeft = strpart(a:str, indx+lensearchstr) ++ ++ "if this instance of searchstr is not escaped, add one to the count ++ "and recurse. If it is escaped, just recurse ++ if !s:IsEscaped(a:str, indx, a:escChar) ++ return 1 + s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) ++ else ++ return s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) ++ endif ++ endif ++endfunction ++" Function: s:DoesBlockHaveDelim(delim, top, bottom) {{{2 ++" Returns 1 if the given block of lines has a delimiter (a:delim) in it ++" Args: ++" -delim: the comment delimiter to check the block for ++" -top: the top line number of the block ++" -bottom: the bottom line number of the block ++function s:DoesBlockHaveDelim(delim, top, bottom) ++ let currentLine = a:top ++ while currentLine < a:bottom ++ let theline = getline(currentLine) ++ if s:FindDelimiterIndex(a:delim, theline) != -1 ++ return 1 ++ endif ++ let currentLine = currentLine + 1 ++ endwhile ++ return 0 ++endfunction ++ ++" Function: s:DoesBlockHaveMultipartDelim(top, bottom) {{{2 ++" Returns 1 if the given block has a >= 1 multipart delimiter in it ++" Args: ++" -top: the top line number of the block ++" -bottom: the bottom line number of the block ++function s:DoesBlockHaveMultipartDelim(top, bottom) ++ if s:HasMultipartDelims() ++ if s:Multipart() ++ return s:DoesBlockHaveDelim(b:left, a:top, a:bottom) || s:DoesBlockHaveDelim(b:right, a:top, a:bottom) ++ else ++ return s:DoesBlockHaveDelim(b:leftAlt, a:top, a:bottom) || s:DoesBlockHaveDelim(b:rightAlt, a:top, a:bottom) ++ endif ++ endif ++ return 0 ++endfunction ++ ++ ++" Function: s:Esc(str) {{{2 ++" Escapes all the tricky chars in the given string ++function s:Esc(str) ++ let charsToEsc = '*/\."&$+' ++ return escape(a:str, charsToEsc) ++endfunction ++ ++" Function: s:FindDelimiterIndex(delimiter, line) {{{2 ++" This function is used to get the string index of the input comment delimiter ++" on the input line. If no valid comment delimiter is found in the line then ++" -1 is returned ++" Args: ++" -delimiter: the delimiter we are looking to find the index of ++" -line: the line we are looking for delimiter on ++function s:FindDelimiterIndex(delimiter, line) ++ ++ "make sure the delimiter isnt empty otherwise we go into an infinite loop. ++ if a:delimiter == "" ++ return -1 ++ endif ++ ++ ++ let l:delimiter = a:delimiter ++ let lenDel = strlen(l:delimiter) ++ ++ "get the index of the first occurrence of the delimiter ++ let delIndx = stridx(a:line, l:delimiter) ++ ++ "keep looping thru the line till we either find a real comment delimiter ++ "or run off the EOL ++ while delIndx != -1 ++ ++ "if we are not off the EOL get the str before the possible delimiter ++ "in question and check if it really is a delimiter. If it is, return ++ "its position ++ if delIndx != -1 ++ if s:IsDelimValid(l:delimiter, delIndx, a:line) ++ return delIndx ++ endif ++ endif ++ ++ "we have not yet found a real comment delimiter so move past the ++ "current one we are lookin at ++ let restOfLine = strpart(a:line, delIndx + lenDel) ++ let distToNextDelim = stridx(restOfLine , l:delimiter) ++ ++ "if distToNextDelim is -1 then there is no more potential delimiters ++ "on the line so set delIndx to -1. Otherwise, move along the line by ++ "distToNextDelim ++ if distToNextDelim == -1 ++ let delIndx = -1 ++ else ++ let delIndx = delIndx + lenDel + distToNextDelim ++ endif ++ endwhile ++ ++ "there is no comment delimiter on this line ++ return -1 ++endfunction ++ ++" Function: s:FindBoundingLinesOfSexyCom(lineNum) {{{2 ++" This function takes in a line number and tests whether this line number is ++" the top/bottom/middle line of a sexy comment. If it is then the top/bottom ++" lines of the sexy comment are returned ++" Args: ++" -lineNum: the line number that is to be tested whether it is the ++" top/bottom/middle line of a sexy com ++" Returns: ++" A string that has the top/bottom lines of the sexy comment encoded in it. ++" The format is 'topline,bottomline'. If a:lineNum turns out not to be the ++" top/bottom/middle of a sexy comment then -1 is returned ++function s:FindBoundingLinesOfSexyCom(lineNum) ++ ++ "find which delimiters to look for as the start/end delims of the comment ++ let left = '' ++ let right = '' ++ if s:Multipart() ++ let left = s:GetLeft(0,0,1) ++ let right = s:GetRight(0,0,1) ++ elseif s:AltMultipart() ++ let left = s:GetLeft(1,0,1) ++ let right = s:GetRight(1,0,1) ++ else ++ return [] ++ endif ++ ++ let sexyComMarker = s:GetSexyComMarker(0, 1) ++ ++ "initialise the top/bottom line numbers of the sexy comment to -1 ++ let top = -1 ++ let bottom = -1 ++ ++ let currentLine = a:lineNum ++ while top == -1 || bottom == -1 ++ let theLine = getline(currentLine) ++ ++ "check if the current line is the top of the sexy comment ++ if theLine =~ '^[ \t]*' . left && theLine !~ '.*' . right ++ let top = currentLine ++ let currentLine = a:lineNum ++ ++ "check if the current line is the bottom of the sexy comment ++ elseif theLine =~ '^[ \t]*' . right && theLine !~ '.*' . left ++ let bottom = currentLine ++ ++ "the right delimiter is on the same line as the last sexyComMarker ++ elseif theLine =~ '^[ \t]*' . sexyComMarker . '.*' . right ++ let bottom = currentLine ++ ++ "we have not found the top or bottom line so we assume currentLine is an ++ "intermediate line and look to prove otherwise ++ else ++ ++ "if the line doesnt start with a sexyComMarker then it is not a sexy ++ "comment ++ if theLine !~ '^[ \t]*' . sexyComMarker ++ return [] ++ endif ++ ++ endif ++ ++ "if top is -1 then we havent found the top yet so keep looking up ++ if top == -1 ++ let currentLine = currentLine - 1 ++ "if we have found the top line then go down looking for the bottom ++ else ++ let currentLine = currentLine + 1 ++ endif ++ ++ endwhile ++ ++ return [top, bottom] ++endfunction ++ ++ ++" Function: s:GetLeft(alt, space, esc) {{{2 ++" returns the left/left-alternative delimiter ++" Args: ++" -alt: specifies whether to get left or left-alternative delim ++" -space: specifies whether the delim should be spaced or not ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the delim should be ESCed ++function s:GetLeft(alt, space, esc) ++ let delim = b:left ++ ++ if a:alt ++ if b:leftAlt == '' ++ return '' ++ else ++ let delim = b:leftAlt ++ endif ++ endif ++ if delim == '' ++ return '' ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let delim = delim . s:spaceStr ++ endif ++ ++ if a:esc ++ let delim = s:Esc(delim) ++ endif ++ ++ return delim ++endfunction ++ ++" Function: s:GetRight(alt, space, esc) {{{2 ++" returns the right/right-alternative delimiter ++" Args: ++" -alt: specifies whether to get right or right-alternative delim ++" -space: specifies whether the delim should be spaced or not ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the delim should be ESCed ++function s:GetRight(alt, space, esc) ++ let delim = b:right ++ ++ if a:alt ++ if !s:AltMultipart() ++ return '' ++ else ++ let delim = b:rightAlt ++ endif ++ endif ++ if delim == '' ++ return '' ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let delim = s:spaceStr . delim ++ endif ++ ++ if a:esc ++ let delim = s:Esc(delim) ++ endif ++ ++ return delim ++endfunction ++ ++ ++" Function: s:GetSexyComMarker() {{{2 ++" Returns the sexy comment marker for the current filetype. ++" ++" C style sexy comments are assumed if possible. If not then the sexy comment ++" marker is the last char of the delimiter pair that has both left and right ++" delims and has the longest left delim ++" ++" Args: ++" -space: specifies whether the marker is to have a space string after it ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the marker are to be ESCed ++function s:GetSexyComMarker(space, esc) ++ let sexyComMarker = b:sexyComMarker ++ ++ "if there is no hardcoded marker then we find one ++ if sexyComMarker == '' ++ ++ "if the filetype has c style comments then use standard c sexy ++ "comments ++ if s:HasCStyleComments() ++ let sexyComMarker = '*' ++ else ++ "find a comment marker by getting the longest available left delim ++ "(that has a corresponding right delim) and taking the last char ++ let lenLeft = strlen(b:left) ++ let lenLeftAlt = strlen(b:leftAlt) ++ let left = '' ++ let right = '' ++ if s:Multipart() && lenLeft >= lenLeftAlt ++ let left = b:left ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ else ++ return -1 ++ endif ++ ++ "get the last char of left ++ let sexyComMarker = strpart(left, strlen(left)-1) ++ endif ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let sexyComMarker = sexyComMarker . s:spaceStr ++ endif ++ ++ if a:esc ++ let sexyComMarker = s:Esc(sexyComMarker) ++ endif ++ ++ return sexyComMarker ++endfunction ++ ++" Function: s:GetSexyComLeft(space, esc) {{{2 ++" Returns the left delimiter for sexy comments for this filetype or -1 if ++" there is none. C style sexy comments are used if possible ++" Args: ++" -space: specifies if the delim has a space string on the end ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the string are ESCed ++function s:GetSexyComLeft(space, esc) ++ let lenLeft = strlen(b:left) ++ let lenLeftAlt = strlen(b:leftAlt) ++ let left = '' ++ ++ "assume c style sexy comments if possible ++ if s:HasCStyleComments() ++ let left = '/*' ++ else ++ "grab the longest left delim that has a right ++ if s:Multipart() && lenLeft >= lenLeftAlt ++ let left = b:left ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ else ++ return -1 ++ endif ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let left = left . s:spaceStr ++ endif ++ ++ if a:esc ++ let left = s:Esc(left) ++ endif ++ ++ return left ++endfunction ++ ++" Function: s:GetSexyComRight(space, esc) {{{2 ++" Returns the right delimiter for sexy comments for this filetype or -1 if ++" there is none. C style sexy comments are used if possible. ++" Args: ++" -space: specifies if the delim has a space string on the start ++" (the space string will only be added if NERDSpaceDelims ++" is specified for the current filetype) ++" -esc: specifies whether the tricky chars in the string are ESCed ++function s:GetSexyComRight(space, esc) ++ let lenLeft = strlen(b:left) ++ let lenLeftAlt = strlen(b:leftAlt) ++ let right = '' ++ ++ "assume c style sexy comments if possible ++ if s:HasCStyleComments() ++ let right = '*/' ++ else ++ "grab the right delim that pairs with the longest left delim ++ if s:Multipart() && lenLeft >= lenLeftAlt ++ let right = b:right ++ elseif s:AltMultipart() ++ let right = b:rightAlt ++ else ++ return -1 ++ endif ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let right = s:spaceStr . right ++ endif ++ ++ if a:esc ++ let right = s:Esc(right) ++ endif ++ ++ return right ++endfunction ++ ++" Function: s:HasMultipartDelims() {{{2 ++" Returns 1 iff the current filetype has at least one set of multipart delims ++function s:HasMultipartDelims() ++ return s:Multipart() || s:AltMultipart() ++endfunction ++ ++" Function: s:HasLeadingTabs(...) {{{2 ++" Returns 1 if any of the given strings have leading tabs ++function s:HasLeadingTabs(...) ++ for s in a:000 ++ if s =~ '^\t.*' ++ return 1 ++ end ++ endfor ++ return 0 ++endfunction ++" Function: s:HasCStyleComments() {{{2 ++" Returns 1 iff the current filetype has c style comment delimiters ++function s:HasCStyleComments() ++ return (b:left == '/*' && b:right == '*/') || (b:leftAlt == '/*' && b:rightAlt == '*/') ++endfunction ++ ++" Function: s:InstallDocumentation(full_name, revision) {{{2 ++" Install help documentation. ++" Arguments: ++" full_name: Full name of this vim plugin script, including path name. ++" revision: Revision of the vim script. #version# mark in the document file ++" will be replaced with this string with 'v' prefix. ++" Return: ++" 1 if new document installed, 0 otherwise. ++" Note: Cleaned and generalized by guo-peng Wen. ++" ++" Note about authorship: this function was taken from the vimspell plugin ++" which can be found at http://www.vim.org/scripts/script.php?script_id=465 ++" ++function s:InstallDocumentation(full_name, revision) ++ " Name of the document path based on the system we use: ++ if has("vms") ++ " No chance that this script will work with ++ " VMS - to much pathname juggling here. ++ return 1 ++ elseif (has("unix")) ++ " On UNIX like system, using forward slash: ++ let l:slash_char = '/' ++ let l:mkdir_cmd = ':silent !mkdir -p ' ++ else ++ " On M$ system, use backslash. Also mkdir syntax is different. ++ " This should only work on W2K and up. ++ let l:slash_char = '\' ++ let l:mkdir_cmd = ':silent !mkdir ' ++ endif ++ ++ let l:doc_path = l:slash_char . 'doc' ++ let l:doc_home = l:slash_char . '.vim' . l:slash_char . 'doc' ++ ++ " Figure out document path based on full name of this script: ++ let l:vim_plugin_path = fnamemodify(a:full_name, ':h') ++ let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . l:doc_path ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ "Doc path: " . l:vim_doc_path ++ call s:NerdEcho("Doc path: " . l:vim_doc_path, 0) ++ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ " Try a default configuration in user home: ++ let l:vim_doc_path = expand("~") . l:doc_home ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ " Put a warning: ++ call s:NerdEcho("Unable to open documentation directory \ntype :help add-local-help for more information.", 0) ++ echo l:vim_doc_path ++ return 0 ++ endif ++ endif ++ endif ++ endif ++ ++ " Exit if we have problem to access the document directory: ++ if (!isdirectory(l:vim_plugin_path) || !isdirectory(l:vim_doc_path) || filewritable(l:vim_doc_path) != 2) ++ return 0 ++ endif ++ ++ " Full name of script and documentation file: ++ let l:script_name = fnamemodify(a:full_name, ':t') ++ let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' ++ let l:plugin_file = l:vim_plugin_path . l:slash_char . l:script_name ++ let l:doc_file = l:vim_doc_path . l:slash_char . l:doc_name ++ ++ " Bail out if document file is still up to date: ++ if (filereadable(l:doc_file) && getftime(l:plugin_file) < getftime(l:doc_file)) ++ return 0 ++ endif ++ ++ " Prepare window position restoring command: ++ if (strlen(@%)) ++ let l:go_back = 'b ' . bufnr("%") ++ else ++ let l:go_back = 'enew!' ++ endif ++ ++ " Create a new buffer & read in the plugin file (me): ++ setl nomodeline ++ exe 'enew!' ++ exe 'r ' . escape(l:plugin_file,s:NERDFileNameEscape) ++ ++ setl modeline ++ let l:buf = bufnr("%") ++ setl noswapfile modifiable ++ ++ norm zR ++ norm gg ++ ++ " Delete from first line to a line starts with ++ " === START_DOC ++ 1,/^=\{3,}\s\+START_DOC\C/ d ++ ++ " Delete from a line starts with ++ " === END_DOC ++ " to the end of the documents: ++ /^=\{3,}\s\+END_DOC\C/,$ d ++ ++ " Remove fold marks: ++ :%s/{\{3}[1-9]/ / ++ ++ " Add modeline for help doc: the modeline string is mangled intentionally ++ " to avoid it be recognized by VIM: ++ call append(line('$'), '') ++ call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') ++ ++ " Replace revision: ++ "exe "normal :1s/#version#/ v" . a:revision . "/\" ++ exe "normal :%s/#version#/ v" . a:revision . "/\" ++ ++ " Save the help document: ++ exe 'w! ' . escape(l:doc_file,s:NERDFileNameEscape) ++ exe l:go_back ++ exe 'bw ' . l:buf ++ ++ " Build help tags: ++ exe 'helptags ' . escape(l:vim_doc_path,s:NERDFileNameEscape) ++ ++ return 1 ++endfunction ++ ++ ++" Function: s:IsCommentedNormOrSexy(lineNum) {{{2 ++"This function is used to determine whether the given line is commented with ++"either set of delimiters or if it is part of a sexy comment ++" ++" Args: ++" -lineNum: the line number of the line to check ++function s:IsCommentedNormOrSexy(lineNum) ++ let theLine = getline(a:lineNum) ++ ++ "if the line is commented normally return 1 ++ if s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) ++ return 1 ++ endif ++ ++ "if the line is part of a sexy comment return 1 ++ if s:IsInSexyComment(a:lineNum) ++ return 1 ++ endif ++ return 0 ++endfunction ++ ++" Function: s:IsCommented(left, right, line) {{{2 ++"This function is used to determine whether the given line is commented with ++"the given delimiters ++" ++" Args: ++" -line: the line that to check if commented ++" -left/right: the left and right delimiters to check for ++function s:IsCommented(left, right, line) ++ "if the line isnt commented return true ++ if s:FindDelimiterIndex(a:left, a:line) != -1 && (s:FindDelimiterIndex(a:right, a:line) != -1 || !s:Multipart()) ++ return 1 ++ endif ++ return 0 ++endfunction ++ ++" Function: s:IsCommentedFromStartOfLine(left, line) {{{2 ++"This function is used to determine whether the given line is commented with ++"the given delimiters at the start of the line i.e the left delimiter is the ++"first thing on the line (apart from spaces\tabs) ++" ++" Args: ++" -line: the line that to check if commented ++" -left: the left delimiter to check for ++function s:IsCommentedFromStartOfLine(left, line) ++ let theLine = s:ConvertLeadingTabsToSpaces(a:line) ++ let numSpaces = strlen(substitute(theLine, '^\( *\).*$', '\1', '')) ++ let delimIndx = s:FindDelimiterIndex(a:left, theLine) ++ return delimIndx == numSpaces ++endfunction ++ ++" Function: s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) {{{2 ++" Finds the type of the outtermost delims on the line ++" ++" Args: ++" -line: the line that to check if the outtermost comments on it are ++" left/right ++" -left/right: the left and right delimiters to check for ++" -leftAlt/rightAlt: the left and right alternative delimiters to check for ++" ++" Returns: ++" 0 if the line is not commented with either set of delims ++" 1 if the line is commented with the left/right delim set ++" 2 if the line is commented with the leftAlt/rightAlt delim set ++function s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) ++ "get the first positions of the left delims and the last positions of the ++ "right delims ++ let indxLeft = s:FindDelimiterIndex(a:left, a:line) ++ let indxLeftAlt = s:FindDelimiterIndex(a:leftAlt, a:line) ++ let indxRight = s:LastIndexOfDelim(a:right, a:line) ++ let indxRightAlt = s:LastIndexOfDelim(a:rightAlt, a:line) ++ ++ "check if the line has a left delim before a leftAlt delim ++ if (indxLeft <= indxLeftAlt || indxLeftAlt == -1) && indxLeft != -1 ++ "check if the line has a right delim after any rightAlt delim ++ if (indxRight > indxRightAlt && indxRight > indxLeft) || !s:Multipart() ++ return 1 ++ endif ++ ++ "check if the line has a leftAlt delim before a left delim ++ elseif (indxLeftAlt <= indxLeft || indxLeft == -1) && indxLeftAlt != -1 ++ "check if the line has a rightAlt delim after any right delim ++ if (indxRightAlt > indxRight && indxRightAlt > indxLeftAlt) || !s:AltMultipart() ++ return 2 ++ endif ++ else ++ return 0 ++ endif ++ ++ return 0 ++ ++endfunction ++ ++ ++" Function: s:IsDelimValid(delimiter, delIndx, line) {{{2 ++" This function is responsible for determining whether a given instance of a ++" comment delimiter is a real delimiter or not. For example, in java the ++" // string is a comment delimiter but in the line: ++" System.out.println("//"); ++" it does not count as a comment delimiter. This function is responsible for ++" distinguishing between such cases. It does so by applying a set of ++" heuristics that are not fool proof but should work most of the time. ++" ++" Args: ++" -delimiter: the delimiter we are validating ++" -delIndx: the position of delimiter in line ++" -line: the line that delimiter occurs in ++" ++" Returns: ++" 0 if the given delimiter is not a real delimiter (as far as we can tell) , ++" 1 otherwise ++function s:IsDelimValid(delimiter, delIndx, line) ++ "get the delimiter without the escchars ++ let l:delimiter = a:delimiter ++ ++ "get the strings before and after the delimiter ++ let preComStr = strpart(a:line, 0, a:delIndx) ++ let postComStr = strpart(a:line, a:delIndx+strlen(delimiter)) ++ ++ "to check if the delimiter is real, make sure it isnt preceded by ++ "an odd number of quotes and followed by the same (which would indicate ++ "that it is part of a string and therefore is not a comment) ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, '"', "\\")) ++ return 0 ++ endif ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "'", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "'", "\\")) ++ return 0 ++ endif ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "`", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "`", "\\")) ++ return 0 ++ endif ++ ++ ++ "if the comment delimiter is escaped, assume it isnt a real delimiter ++ if s:IsEscaped(a:line, a:delIndx, "\\") ++ return 0 ++ endif ++ ++ "vim comments are so fuckin stupid!! Why the hell do they have comment ++ "delimiters that are used elsewhere in the syntax?!?! We need to check ++ "some conditions especially for vim ++ if &filetype == "vim" ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) ++ return 0 ++ endif ++ ++ "if the delimiter is on the very first char of the line or is the ++ "first non-tab/space char on the line then it is a valid comment delimiter ++ if a:delIndx == 0 || a:line =~ "^[ \t]\\{" . a:delIndx . "\\}\".*$" ++ return 1 ++ endif ++ ++ let numLeftParen =s:CountNonESCedOccurances(preComStr, "(", "\\") ++ let numRightParen =s:CountNonESCedOccurances(preComStr, ")", "\\") ++ ++ "if the quote is inside brackets then assume it isnt a comment ++ if numLeftParen > numRightParen ++ return 0 ++ endif ++ ++ "if the line has an even num of unescaped "'s then we can assume that ++ "any given " is not a comment delimiter ++ if s:IsNumEven(s:CountNonESCedOccurances(a:line, "\"", "\\")) ++ return 0 ++ endif ++ endif ++ ++ return 1 ++ ++endfunction ++ ++" Function: s:IsNumEven(num) {{{2 ++" A small function the returns 1 if the input number is even and 0 otherwise ++" Args: ++" -num: the number to check ++function s:IsNumEven(num) ++ return (a:num % 2) == 0 ++endfunction ++ ++" Function: s:IsEscaped(str, indx, escChar) {{{2 ++" This function takes a string, an index into that string and an esc char and ++" returns 1 if the char at the index is escaped (i.e if it is preceded by an ++" odd number of esc chars) ++" Args: ++" -str: the string to check ++" -indx: the index into str that we want to check ++" -escChar: the escape char the char at indx may be ESCed with ++function s:IsEscaped(str, indx, escChar) ++ "initialise numEscChars to 0 and look at the char before indx ++ let numEscChars = 0 ++ let curIndx = a:indx-1 ++ ++ "keep going back thru str until we either reach the start of the str or ++ "run out of esc chars ++ while curIndx >= 0 && strpart(a:str, curIndx, 1) == a:escChar ++ ++ "we have found another esc char so add one to the count and move left ++ "one char ++ let numEscChars = numEscChars + 1 ++ let curIndx = curIndx - 1 ++ ++ endwhile ++ ++ "if there is an odd num of esc chars directly before the char at indx then ++ "the char at indx is escaped ++ return !s:IsNumEven(numEscChars) ++endfunction ++ ++" Function: s:IsInSexyComment(line) {{{2 ++" returns 1 if the given line number is part of a sexy comment ++function s:IsInSexyComment(line) ++ return !empty(s:FindBoundingLinesOfSexyCom(a:line)) ++endfunction ++ ++" Function: s:IsSexyComment(topline, bottomline) {{{2 ++" This function takes in 2 line numbers and returns 1 if the lines between and ++" including the given line numbers are a sexy comment. It returns 0 otherwise. ++" Args: ++" -topline: the line that the possible sexy comment starts on ++" -bottomline: the line that the possible sexy comment stops on ++function s:IsSexyComment(topline, bottomline) ++ ++ "get the delim set that would be used for a sexy comment ++ let left = '' ++ let right = '' ++ if s:Multipart() ++ let left = b:left ++ let right = b:right ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ let right = b:rightAlt ++ else ++ return 0 ++ endif ++ ++ "swap the top and bottom line numbers around if need be ++ let topline = a:topline ++ let bottomline = a:bottomline ++ if bottomline < topline ++ topline = bottomline ++ bottomline = a:topline ++ endif ++ ++ "if there is < 2 lines in the comment it cannot be sexy ++ if (bottomline - topline) <= 0 ++ return 0 ++ endif ++ ++ "if the top line doesnt begin with a left delim then the comment isnt sexy ++ if getline(a:topline) !~ '^[ \t]*' . left ++ return 0 ++ endif ++ ++ "if there is a right delim on the top line then this isnt a sexy comment ++ if s:FindDelimiterIndex(right, getline(a:topline)) != -1 ++ return 0 ++ endif ++ ++ "if there is a left delim on the bottom line then this isnt a sexy comment ++ if s:FindDelimiterIndex(left, getline(a:bottomline)) != -1 ++ return 0 ++ endif ++ ++ "if the bottom line doesnt begin with a right delim then the comment isnt ++ "sexy ++ if getline(a:bottomline) !~ '^.*' . right . '$' ++ return 0 ++ endif ++ ++ let sexyComMarker = s:GetSexyComMarker(0, 1) ++ ++ "check each of the intermediate lines to make sure they start with a ++ "sexyComMarker ++ let currentLine = a:topline+1 ++ while currentLine < a:bottomline ++ let theLine = getline(currentLine) ++ ++ if theLine !~ '^[ \t]*' . sexyComMarker ++ return 0 ++ endif ++ ++ "if there is a right delim in an intermediate line then the block isnt ++ "a sexy comment ++ if s:FindDelimiterIndex(right, theLine) != -1 ++ return 0 ++ endif ++ ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ "we have not found anything to suggest that this isnt a sexy comment so ++ return 1 ++ ++endfunction ++ ++" Function: s:LastIndexOfDelim(delim, str) {{{2 ++" This function takes a string and a delimiter and returns the last index of ++" that delimiter in string ++" Args: ++" -delim: the delimiter to look for ++" -str: the string to look for delim in ++function s:LastIndexOfDelim(delim, str) ++ let delim = a:delim ++ let lenDelim = strlen(delim) ++ ++ "set index to the first occurrence of delim. If there is no occurrence then ++ "bail ++ let indx = s:FindDelimiterIndex(delim, a:str) ++ if indx == -1 ++ return -1 ++ endif ++ ++ "keep moving to the next instance of delim in str till there is none left ++ while 1 ++ ++ "search for the next delim after the previous one ++ let searchStr = strpart(a:str, indx+lenDelim) ++ let indx2 = s:FindDelimiterIndex(delim, searchStr) ++ ++ "if we find a delim update indx to record the position of it, if we ++ "dont find another delim then indx is the last one so break out of ++ "this loop ++ if indx2 != -1 ++ let indx = indx + indx2 + lenDelim ++ else ++ break ++ endif ++ endwhile ++ ++ return indx ++ ++endfunction ++ ++" Function: s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 ++" This function takes in 2 line numbers and returns the index of the left most ++" char (that is not a space or a tab) on all of these lines. ++" Args: ++" -countCommentedLines: 1 if lines that are commented are to be checked as ++" well. 0 otherwise ++" -countEmptyLines: 1 if empty lines are to be counted in the search ++" -topline: the top line to be checked ++" -bottomline: the bottom line to be checked ++function s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) ++ ++ " declare the left most index as an extreme value ++ let leftMostIndx = 1000 ++ ++ " go thru the block line by line updating leftMostIndx ++ let currentLine = a:topline ++ while currentLine <= a:bottomline ++ ++ " get the next line and if it is allowed to be commented, or is not ++ " commented, check it ++ let theLine = getline(currentLine) ++ if a:countEmptyLines || theLine !~ '^[ \t]*$' ++ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) ++ " convert spaces to tabs and get the number of leading spaces for ++ " this line and update leftMostIndx if need be ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let leadSpaceOfLine = strlen( substitute(theLine, '\(^[ \t]*\).*$','\1','') ) ++ if leadSpaceOfLine < leftMostIndx ++ let leftMostIndx = leadSpaceOfLine ++ endif ++ endif ++ endif ++ ++ " move on to the next line ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ if leftMostIndx == 1000 ++ return 0 ++ else ++ return leftMostIndx ++ endif ++endfunction ++ ++" Function: s:Multipart() {{{2 ++" returns 1 if the current delims are multipart ++function s:Multipart() ++ return b:right != '' ++endfunction ++ ++" Function: s:NerdEcho(msg, typeOfMsg) {{{2 ++" Args: ++" -msg: the message to echo ++" -typeOfMsg: 0 = warning message ++" 1 = normal message ++function s:NerdEcho(msg, typeOfMsg) ++ if a:typeOfMsg == 0 ++ echohl WarningMsg ++ echo 'NERDCommenter:' . a:msg ++ echohl None ++ elseif a:typeOfMsg == 1 ++ echo 'NERDCommenter:' . a:msg ++ endif ++endfunction ++ ++" Function: s:NumberOfLeadingTabs(s) {{{2 ++" returns the number of leading tabs in the given string ++function s:NumberOfLeadingTabs(s) ++ return strlen(substitute(a:s, '^\(\t*\).*$', '\1', "")) ++endfunction ++ ++" Function: s:NumLinesInBuf() {{{2 ++" Returns the number of lines in the current buffer ++function s:NumLinesInBuf() ++ return line('$') ++endfunction ++ ++" Function: s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) {{{2 ++" This function takes in a string, 2 delimiters in that string and 2 strings ++" to replace these delimiters with. ++" ++" Args: ++" -toReplace1: the first delimiter to replace ++" -toReplace2: the second delimiter to replace ++" -replacor1: the string to replace toReplace1 with ++" -replacor2: the string to replace toReplace2 with ++" -str: the string that the delimiters to be replaced are in ++function s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) ++ let line = s:ReplaceLeftMostDelim(a:toReplace1, a:replacor1, a:str) ++ let line = s:ReplaceRightMostDelim(a:toReplace2, a:replacor2, line) ++ return line ++endfunction ++ ++" Function: s:ReplaceLeftMostDelim(toReplace, replacor, str) {{{2 ++" This function takes a string and a delimiter and replaces the left most ++" occurrence of this delimiter in the string with a given string ++" ++" Args: ++" -toReplace: the delimiter in str that is to be replaced ++" -replacor: the string to replace toReplace with ++" -str: the string that contains toReplace ++function s:ReplaceLeftMostDelim(toReplace, replacor, str) ++ let toReplace = a:toReplace ++ let replacor = a:replacor ++ "get the left most occurrence of toReplace ++ let indxToReplace = s:FindDelimiterIndex(toReplace, a:str) ++ ++ "if there IS an occurrence of toReplace in str then replace it and return ++ "the resulting string ++ if indxToReplace != -1 ++ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) ++ return line ++ endif ++ ++ return a:str ++endfunction ++ ++" Function: s:ReplaceRightMostDelim(toReplace, replacor, str) {{{2 ++" This function takes a string and a delimiter and replaces the right most ++" occurrence of this delimiter in the string with a given string ++" ++" Args: ++" -toReplace: the delimiter in str that is to be replaced ++" -replacor: the string to replace toReplace with ++" -str: the string that contains toReplace ++" ++function s:ReplaceRightMostDelim(toReplace, replacor, str) ++ let toReplace = a:toReplace ++ let replacor = a:replacor ++ let lenToReplace = strlen(toReplace) ++ ++ "get the index of the last delim in str ++ let indxToReplace = s:LastIndexOfDelim(toReplace, a:str) ++ ++ "if there IS a delimiter in str, replace it and return the result ++ let line = a:str ++ if indxToReplace != -1 ++ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) ++ endif ++ return line ++endfunction ++ ++"FUNCTION: s:RestoreScreenState() {{{2 ++" ++"Sets the screen state back to what it was when s:SaveScreenState was last ++"called. ++" ++function s:RestoreScreenState() ++ if !exists("t:NERDComOldTopLine") || !exists("t:NERDComOldPos") ++ throw 'NERDCommenter exception: cannot restore screen' ++ endif ++ ++ call cursor(t:NERDComOldTopLine, 0) ++ normal zt ++ call setpos(".", t:NERDComOldPos) ++endfunction ++ ++" Function: s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 ++" This function takes in 2 line numbers and returns the index of the right most ++" char on all of these lines. ++" Args: ++" -countCommentedLines: 1 if lines that are commented are to be checked as ++" well. 0 otherwise ++" -countEmptyLines: 1 if empty lines are to be counted in the search ++" -topline: the top line to be checked ++" -bottomline: the bottom line to be checked ++function s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) ++ let rightMostIndx = -1 ++ ++ " go thru the block line by line updating rightMostIndx ++ let currentLine = a:topline ++ while currentLine <= a:bottomline ++ ++ " get the next line and see if it is commentable, otherwise it doesnt ++ " count ++ let theLine = getline(currentLine) ++ if a:countEmptyLines || theLine !~ '^[ \t]*$' ++ ++ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) ++ ++ " update rightMostIndx if need be ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let lineLen = strlen(theLine) ++ if lineLen > rightMostIndx ++ let rightMostIndx = lineLen ++ endif ++ endif ++ endif ++ ++ " move on to the next line ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ return rightMostIndx ++endfunction ++ ++"FUNCTION: s:SaveScreenState() {{{2 ++"Saves the current cursor position in the current buffer and the window ++"scroll position ++function s:SaveScreenState() ++ let t:NERDComOldPos = getpos(".") ++ let t:NERDComOldTopLine = line("w0") ++endfunction ++ ++" Function: s:SwapOutterMultiPartDelimsForPlaceHolders(line) {{{2 ++" This function takes a line and swaps the outter most multi-part delims for ++" place holders ++" Args: ++" -line: the line to swap the delims in ++" ++function s:SwapOutterMultiPartDelimsForPlaceHolders(line) ++ " find out if the line is commented using normal delims and/or ++ " alternate ones ++ let isCommented = s:IsCommented(b:left, b:right, a:line) ++ let isCommentedAlt = s:IsCommented(b:leftAlt, b:rightAlt, a:line) ++ ++ let line2 = a:line ++ ++ "if the line is commented and there is a right delimiter, replace ++ "the delims with place-holders ++ if isCommented && s:Multipart() ++ let line2 = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, a:line) ++ ++ "similarly if the line is commented with the alternative ++ "delimiters ++ elseif isCommentedAlt && s:AltMultipart() ++ let line2 = s:ReplaceDelims(b:leftAlt, b:rightAlt, g:NERDLPlace, g:NERDRPlace, a:line) ++ endif ++ ++ return line2 ++endfunction ++ ++" Function: s:SwapOutterPlaceHoldersForMultiPartDelims(line) {{{2 ++" This function takes a line and swaps the outtermost place holders for ++" multi-part delims ++" Args: ++" -line: the line to swap the delims in ++" ++function s:SwapOutterPlaceHoldersForMultiPartDelims(line) ++ let left = '' ++ let right = '' ++ if s:Multipart() ++ let left = b:left ++ let right = b:right ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ let right = b:rightAlt ++ endif ++ ++ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, a:line) ++ return line ++endfunction ++" Function: s:TabbedCol(line, col) {{{2 ++" Gets the col number for given line and existing col number. The new col ++" number is the col number when all leading spaces are converted to tabs ++" Args: ++" -line:the line to get the rel col for ++" -col: the abs col ++function s:TabbedCol(line, col) ++ let lineTruncated = strpart(a:line, 0, a:col) ++ let lineSpacesToTabs = substitute(lineTruncated, s:TabSpace(), '\t', 'g') ++ return strlen(lineSpacesToTabs) ++endfunction ++"FUNCTION: s:TabSpace() {{{2 ++"returns a string of spaces equal in length to &tabstop ++function s:TabSpace() ++ let tabSpace = "" ++ let spacesPerTab = &tabstop ++ while spacesPerTab > 0 ++ let tabSpace = tabSpace . " " ++ let spacesPerTab = spacesPerTab - 1 ++ endwhile ++ return tabSpace ++endfunction ++ ++" Function: s:UnEsc(str, escChar) {{{2 ++" This function removes all the escape chars from a string ++" Args: ++" -str: the string to remove esc chars from ++" -escChar: the escape char to be removed ++function s:UnEsc(str, escChar) ++ return substitute(a:str, a:escChar, "", "g") ++endfunction ++ ++" Function: s:UntabbedCol(line, col) {{{2 ++" Takes a line and a col and returns the absolute column of col taking into ++" account that a tab is worth 3 or 4 (or whatever) spaces. ++" Args: ++" -line:the line to get the abs col for ++" -col: the col that doesnt take into account tabs ++function s:UntabbedCol(line, col) ++ let lineTruncated = strpart(a:line, 0, a:col) ++ let lineTabsToSpaces = substitute(lineTruncated, '\t', s:TabSpace(), 'g') ++ return strlen(lineTabsToSpaces) ++endfunction ++" Section: Comment mapping setup {{{1 ++" =========================================================================== ++" This is where the mappings calls are made that set up the commenting key ++" mappings. ++ ++" set up the mapping to switch to/from alternative delimiters ++execute 'nnoremap ' . g:NERDAltComMap . ' :call SwitchToAlternativeDelimiters(1)' ++ ++" set up the mappings to comment out lines ++execute 'nnoremap ' . g:NERDComLineMap . ' :call NERDComment(0, "norm")' ++execute 'vnoremap ' . g:NERDComLineMap . ' :call NERDComment(1, "norm")' ++ ++" set up the mappings to do toggle comments ++execute 'nnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(0, "toggle")' ++execute 'vnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(1, "toggle")' ++ ++" set up the mapp to do minimal comments ++execute 'nnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(0, "minimal")' ++execute 'vnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(1, "minimal")' ++ ++" set up the mappings to comment out lines sexily ++execute 'nnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(0, "sexy")' ++execute 'vnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(1, "sexy")' ++ ++" set up the mappings to do invert comments ++execute 'nnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(0, "invert")' ++execute 'vnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(1, "invert")' ++ ++" set up the mappings to yank then comment out lines ++execute 'nmap ' . g:NERDComLineYankMap . ' :call NERDComment(0, "yank")' ++execute 'vmap ' . g:NERDComLineYankMap . ' :call NERDComment(1, "yank")' ++ ++" set up the mappings for left aligned comments ++execute 'nnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(0, "alignLeft")' ++execute 'vnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(1, "alignLeft")' ++ ++" set up the mappings for right aligned comments ++execute 'nnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(0, "alignRight")' ++execute 'vnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(1, "alignRight")' ++ ++" set up the mappings for left and right aligned comments ++execute 'nnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(0, "alignBoth")' ++execute 'vnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(1, "alignBoth")' ++ ++" set up the mappings to do nested comments ++execute 'nnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(0, "nested")' ++execute 'vnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(1, "nested")' ++ ++" set up the mapping to uncomment a line ++execute 'nnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(0, "uncomment")' ++execute 'vnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(1, "uncomment")' ++ ++" set up the mapping to comment out to the end of the line ++execute 'nnoremap ' . g:NERDComToEOLMap . ' :call NERDComment(0, "toEOL")' ++ ++" set up the mappings to append comments to the line ++execute 'nmap ' . g:NERDAppendComMap . ' :call NERDComment(0, "append")' ++ ++" set up the mappings to append comments to the line ++execute 'nmap ' . g:NERDPrependComMap . ' :call NERDComment(0, "prepend")' ++ ++" set up the mapping to insert comment delims at the cursor position in insert mode ++execute 'inoremap ' . g:NERDComInInsertMap . ' ' . ':call NERDComment(0, "insert")' ++ ++" Section: Menu item setup {{{1 ++" =========================================================================== ++"check if the user wants the menu to be displayed ++if g:NERDMenuMode != 0 ++ ++ let menuRoot = "" ++ if g:NERDMenuMode == 1 ++ let menuRoot = 'comment' ++ elseif g:NERDMenuMode == 2 ++ let menuRoot = '&comment' ++ elseif g:NERDMenuMode == 3 ++ let menuRoot = '&Plugin.&comment' ++ endif ++ ++ execute 'nmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(0, "norm")' ++ execute 'vmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(1, "norm")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(0, "toggle")' ++ execute 'vmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(1, "toggle")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(0, "minimal")' ++ execute 'vmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(1, "minimal")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(0, "nested")' ++ execute 'vmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(1, "nested")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ To\ EOL' . escape(g:NERDComToEOLMap, '\') . ' :call NERDComment(0, "toEOL")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(0,"invert")' ++ execute 'vmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(1,"invert")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(0,"sexy")' ++ execute 'vmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(1,"sexy")' ++ ++ execute 'nmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0Y' . g:NERDComLineMap ++ execute 'vmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0ygv' . g:NERDComLineMap ++ ++ execute 'nmenu '. menuRoot .'.Append\ Comment\ to\ Line' . escape(g:NERDAppendComMap, '\') . ' :call NERDComment(0, "append")' ++ execute 'nmenu '. menuRoot .'.Prepend\ Comment\ to\ Line' . escape(g:NERDPrependComMap, '\') . ' :call NERDComment(0, "prepend")' ++ ++ execute 'menu '. menuRoot .'.-Sep- :' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(0, "alignLeft")' ++ execute 'vmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(1, "alignLeft")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(0, "alignRight")' ++ execute 'vmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(1, "alignRight")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(0, "alignBoth")' ++ execute 'vmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(1, "alignBoth")' ++ ++ execute 'menu '. menuRoot .'.-Sep2- :' ++ ++ execute 'menu '. menuRoot .'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(0, "uncomment")' ++ execute 'vmenu ' . menuRoot.'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(1, "uncomment")' ++ ++ execute 'menu '. menuRoot .'.-Sep3- :' ++ ++ execute 'nmenu '. menuRoot .'.Use\ Alternative\ Delimiters' . escape(g:NERDAltComMap, '\') . ' :call SwitchToAlternativeDelimiters(1)' ++ ++ ++ execute 'imenu '. menuRoot .'.Insert\ Delims' . escape(g:NERDComInInsertMap, '\') . ' :call NERDComment(0, "insert")' ++ ++ execute 'menu '. menuRoot .'.-Sep4- :' ++ ++ execute 'menu '. menuRoot .'.Help:help\ NERDCommenterContents :help NERDCommenterContents' ++endif ++ ++" Section: Doc installation call {{{1 ++silent call s:InstallDocumentation(expand(':p'), s:NERD_commenter_version) ++ ++finish ++"============================================================================= ++" Section: The help file {{{1 ++" Title {{{2 ++" ============================================================================ ++=== START_DOC ++*NERD_commenter.txt* Plugin for commenting code #version# ++ ++ ++ NERD COMMENTER REFERENCE MANUAL~ ++ ++ ++ ++ ++ ++============================================================================== ++CONTENTS {{{2 *NERDCommenterContents* ++ ++ 1.Intro...................................|NERDCommenter| ++ 2.Functionality provided..................|NERDComFunctionality| ++ 2.1 Functionality Summary.............|NERDComFunctionalitySummary| ++ 2.2 Functionality Details.............|NERDComFunctionalityDetails| ++ 2.2.1 Comment map.................|NERDComComment| ++ 2.2.2 Nested comment map..........|NERDComNestedComment| ++ 2.2.3 Toggle comment map..........|NERDComToggleComment| ++ 2.2.4 Minimal comment map.........|NERDComMinimalComment| ++ 2.2.5 Invert comment map..........|NERDComInvertComment| ++ 2.2.6 Sexy comment map............|NERDComSexyComment| ++ 2.2.7 Yank comment map............|NERDComYankComment| ++ 2.2.8 Comment to EOL map..........|NERDComEOLComment| ++ 2.2.9 Append com to line map......|NERDComAppendComment| ++ 2.2.10 Prepend com to line map....|NERDComPrependComment| ++ 2.2.11 Insert comment map.........|NERDComInsertComment| ++ 2.2.12 Use alternate delims map...|NERDComAltDelim| ++ 2.2.13 Comment aligned maps.......|NERDComAlignedComment| ++ 2.2.14 Uncomment line map.........|NERDComUncommentLine| ++ 2.3 Supported filetypes...............|NERDComFiletypes| ++ 2.4 Sexy Comments.....................|NERDComSexyComments| ++ 2.5 The NERDComment function..........|NERDComNERDComment| ++ 3.Options.................................|NERDComOptions| ++ 3.1 Options summary...................|NERDComOptionsSummary| ++ 3.2 Options details...................|NERDComOptionsDetails| ++ 3.3 Default delimiter Options.........|NERDComDefaultDelims| ++ 3.4 Key mapping Options...............|NERDComMappings| ++ 4.Issues with the script..................|NERDComIssues| ++ 4.1 Delimiter detection heuristics....|NERDComHeuristics| ++ 4.2 Nesting issues....................|NERDComNesting| ++ 5.The author..............................|NERDComAuthor| ++ 6.TODO list...............................|NERDComTodo| ++ 7.Changelog...............................|NERDComChangelog| ++ 8.Credits.................................|NERDComCredits| ++ ++============================================================================== ++1. Intro {{{2 *NERDCommenter* ++ ++The NERD commenter provides many different commenting operations and styles ++which may be invoked via key mappings and a commenting menu. These operations ++are available for most filetypes. ++ ++There are also options available that allow you to tweak the commenting engine ++to you taste. ++ ++============================================================================== ++2. Functionality provided {{{2 *NERDComFunctionality* ++ ++------------------------------------------------------------------------------ ++2.1 Functionality summary {{{3 *NERDComFunctionalitySummary* ++ ++The following key mappings are provided by default (there is also a menu ++provided that contains menu items corresponding to all the below mappings): ++ ++Most of the following mappings are for normal/visual mode only. The ++|NERDComInsertComment| mapping is for insert mode only. ++ ++[count],cc |NERDComComment| ++Comments out the current line or text selected in visual mode. ++ ++ ++[count],cn |NERDComNestedComment| ++Same as |NERDComComment| but forces nesting. ++ ++ ++[count],c |NERDComToggleComment| ++Toggles the comment state of the selected line(s). If the topmost selected ++line is commented, all selected lines are uncommented and vice versa. ++ ++ ++[count],cm |NERDComMinimalComment| ++Comments the given lines using only one set of multipart delimiters if ++possible. ++ ++ ++[count],ci |NERDComInvertComment| ++Toggles the comment state of the selected line(s) individually. Each selected ++line that is commented is uncommented and vice versa. ++ ++ ++[count],cs |NERDComSexyComment| ++Comments out the selected lines ``sexually'' ++ ++ ++[count],cy |NERDComYankComment| ++Same as |NERDComComment| except that the commented line(s) are yanked ++before commenting. ++ ++ ++,c$ |NERDComEOLComment| ++Comments the current line from the cursor to the end of line. ++ ++ ++,cA |NERDComAppendComment| ++Adds comment delimiters to the end of line and goes into insert mode between ++them. ++ ++ ++,cI |NERDComPrependComment| ++Adds comment delimiters to the start of line and goes into insert mode between ++them. ++ ++ ++ |NERDComInsertComment| ++Adds comment delimiters at the current cursor position and inserts between. ++ ++ ++,ca |NERDComAltDelim| ++Switches to the alternative set of delimiters. ++ ++ ++[count],cl ++[count],cr ++[count],cb |NERDComAlignedComment| ++Same as |NERDComComment| except that the delimiters are aligned down the ++left side (,cl), the right side (,cr) or both sides ++(,cb). ++ ++ ++[count],cu |NERDComUncommentLine| ++Uncomments the selected line(s). ++ ++------------------------------------------------------------------------------ ++2.2 Functionality details {{{3 *NERDComFunctionalityDetails* ++ ++------------------------------------------------------------------------------ ++2.2.1 Comment map *NERDComComment* ++ ++Default mapping: [count],cc ++Change the mapping with: NERDComLineMap. ++Applicable modes: normal visual visual-line visual-block. ++ ++ ++Comments out the current line. If multiple lines are selected in visual-line ++mode, they are all commented out. If some text is selected in visual or ++visual-block mode then the script will try to comment out the exact text that ++is selected using multi-part delimiters if they are available. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.2 Nested comment map *NERDComNestedComment* ++ ++Default mapping: [count],cn ++Change the mapping with: NERDComLineNestMap. ++Applicable modes: normal visual visual-line visual-block. ++ ++Performs nested commenting. Works the same as ,cc except that if a ++line is already commented then it will be commented again. ++ ++If |NERDUsePlaceHolders| is set then the previous comment delimiters will ++be replaced by place-holder delimiters if needed. Otherwise the nested ++comment will only be added if the current commenting delimiters have no right ++delimiter (to avoid syntax errors) ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++Related options: ++|NERDDefaultNesting| ++ ++------------------------------------------------------------------------------ ++2.2.3 Toggle comment map *NERDComToggleComment* ++ ++Default mapping: [count],c ++Change the mapping with: NERDComLineToggleMap. ++Applicable modes: normal visual-line. ++ ++Toggles commenting of the lines selected. The behaviour of this mapping ++depends on whether the first line selected is commented or not. If so, all ++selected lines are uncommented and vice versa. ++ ++With this mapping, a line is only considered to be commented if it starts with ++a left delimiter. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.4 Minimal comment map *NERDComMinimalComment* ++ ++Default mapping: [count],cm ++Change the mapping with: NERDComLineMinimalMap ++Applicable modes: normal visual-line. ++ ++Comments the selected lines using one set of multipart delimiters if possible. ++ ++For example: if you are programming in c and you select 5 lines and press ++,cm then a '/*' will be placed at the start of the top line and a '*/' ++will be placed at the end of the last line. ++ ++Sets of multipart comment delimiters that are between the top and bottom ++selected lines are replaced with place holders (see |NERDLPlace|) if ++|NERDUsePlaceHolders| is set for the current filetype. If it is not, then ++the comment will be aborted if place holders are required to prevent illegal ++syntax. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.5 Invert comment map *NERDComInvertComment* ++ ++Default mapping: ,ci ++Change the mapping with: NERDComLineInvertMap. ++Applicable modes: normal visual-line. ++ ++Inverts the commented state of each selected line. If the a selected line is ++commented then it is uncommented and vice versa. Each line is examined and ++commented/uncommented individually. ++ ++With this mapping, a line is only considered to be commented if it starts with ++a left delimiter. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.6 Sexy comment map *NERDComSexyComment* ++ ++Default mapping: [count],cs ++Change the mapping with: NERDComLineSexyMap ++Applicable modes: normal, visual-line. ++ ++Comments the selected line(s) ``sexily''... see |NERDComSexyComments| for ++a description of what sexy comments are. Can only be done on filetypes for ++which there is at least one set of multipart comment delimiters specified. ++ ++Sexy comments cannot be nested and lines inside a sexy comment cannot be ++commented again. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++Related options: ++|NERDCompactSexyComs| ++ ++------------------------------------------------------------------------------ ++2.2.7 Yank comment map *NERDComYankComment* ++ ++Default mapping: [count],cy ++Change the mapping with: NERDComLineYankMap ++Applicable modes: normal visual visual-line visual-block. ++ ++Same as ,cc except that it yanks the line(s) that are commented first. ++ ++------------------------------------------------------------------------------ ++2.2.8 Comment to EOL map *NERDComEOLComment* ++ ++Default mapping: ,c$ ++Change the mapping with: NERDComToEOLMap ++Applicable modes: normal. ++ ++Comments the current line from the current cursor position up to the end of ++the line. ++ ++------------------------------------------------------------------------------ ++2.2.9 Append com to line map *NERDComAppendComment* ++ ++Default mapping: ,cA ++Change the mapping with: NERDAppendComMap. ++Applicable modes: normal. ++ ++Appends comment delimiters to the end of the current line and goes ++to insert mode between the new delimiters. ++ ++------------------------------------------------------------------------------ ++2.2.10 Prepend com to line map *NERDComPrependComment* ++ ++Default mapping: ,cI ++Change the mapping with: NERDPrependComMap. ++Applicable modes: normal. ++ ++Prepends comment delimiters to the start of the current line and goes to ++insert mode between the new delimiters. ++ ++------------------------------------------------------------------------------ ++2.2.11 Insert comment map *NERDComInsertComment* ++ ++Default mapping: ++Change the mapping with: NERDComInInsertMap. ++Applicable modes: insert. ++ ++Adds comment delimiters at the current cursor position and inserts ++between them. ++ ++------------------------------------------------------------------------------ ++2.2.12 Use alternate delims map *NERDComAltDelim* ++ ++Default mapping: ,ca ++Change the mapping with: NERDAltComMap ++Applicable modes: normal. ++ ++Changes to the alternative commenting style if one is available. For example, ++if the user is editing a c++ file using // comments and they hit ,ca ++then they will be switched over to /**/ comments. ++ ++See also |NERDComDefaultDelims| ++ ++------------------------------------------------------------------------------ ++2.2.13 Comment aligned maps *NERDComAlignedComment* ++ ++Default mappings: [count],cl [count],cr [count],cb ++Change the mappings with: NERDComAlignLeftMap, NERDComAlignRightMap and ++NERDComAlignBothMap. ++Applicable modes: normal visual-line. ++ ++Same as ,cc except that the comment delimiters are aligned on the left ++side, right side or both sides respectively. These comments are always nested ++if the line(s) are already commented. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.14 Uncomment line map *NERDComUncommentLine* ++ ++Default mapping: [count],cu ++Change the mapping with: NERDUncomLineMap. ++Applicable modes: normal visual visual-line visual-block. ++ ++Uncomments the current line. If multiple lines are selected in ++visual mode then they are all uncommented. ++ ++When uncommenting, if the line contains multiple sets of delimiters then the ++``outtermost'' pair of delimiters will be removed. ++ ++The script uses a set of heurisics to distinguish ``real'' delimiters from ++``fake'' ones when uncommenting. See |NERDComIssues| for details. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++Related options: ++|NERDRemoveAltComs| ++|NERDRemoveExtraSpaces| ++ ++------------------------------------------------------------------------------ ++2.3 Supported filetypes {{{3 *NERDComFiletypes* ++ ++Filetypes that can be commented by this plugin: ++abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asn ++aspvbs atlas autohotkey autoit automake ave awk basic b bc bdf bib bindzone ++bst btm caos catalog c cfg cg ch changelog cl clean clipper cmake conf config ++context cpp crontab cs csc csp css cterm cupl csv cvs dcl debchangelog ++debcontrol debsources def diff django docbk dns dosbatch dosini dot dracula ++dsl dtd dtml dylan ecd eiffel elf elmfilt erlang eruby eterm expect exports ++fetchmail fgl focexec form fortran foxpro fstab fvwm fx gdb gdmo geek ++gentoo-package-keywords' gentoo-package-mask' gentoo-package-use' gnuplot ++gtkrc haskell hb h help hercules hog html htmldjango htmlos ia64 icon idlang ++idl indent inform inittab ishd iss ist jam java javascript jess jgraph ++jproperties jproperties jsp kconfig kix kscript lace lex lftp lifelines lilo ++lisp lite lotos lout lprolog lscript lss lua lynx m4 mail make maple masm ++master matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc ++named nasm nastran natural ncf netdict netrw nqc nroff nsis objc ocaml occam ++omlet omnimark openroad opl ora otl ox pascal passwd pcap pccts perl pfmain ++php phtml pic pike pilrc pine plaintex plm plsql po postscr pov povini ppd ++ppwiz procmail progress prolog psf ptcap python python qf radiance ratpoison r ++rc readline rebol registry remind rexx robots rpl rtf ruby sa samba sas sass ++sather scheme scilab screen scsh sdl sed selectbuf sgml sgmldecl sgmllnx sh ++sicad simula sinda skill slang sl slrnrc sm smarty smil smith sml snnsnet ++snnspat snnsres snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp ++strace svn systemverilog tads taglist tags tak tasm tcl terminfo tex text ++plaintex texinfo texmf tf tidy tli trasys tsalt tsscl tssgm uc uil vb verilog ++verilog_systemverilog vgrindefs vhdl vim viminfo virata vo_base vrml vsejcl ++webmacro wget winbatch wml wvdial xdefaults xf86conf xhtml xkb xmath xml ++xmodmap xpm2 xpm xslt yacc yaml z8a ++ ++If a language is not in the list of hardcoded supported filetypes then the ++&commentstring vim option is used. ++ ++------------------------------------------------------------------------------ ++2.4 Sexy Comments {{{3 *NERDComSexyComments* ++These are comments that use one set of multipart comment delimiters as well as ++one other marker symbol. For example: > ++ /* ++ * This is a c style sexy comment ++ * So there! ++ */ ++ ++ /* This is a c style sexy comment ++ * So there! ++ * But this one is ``compact'' style */ ++< ++Here the multipart delimiters are /* and */ and the marker is *. The NERD ++commenter is capable of adding and removing comments of this type. ++ ++------------------------------------------------------------------------------ ++2.5 The NERDComment function {{{3 *NERDComNERDComment* ++ ++All of the NERD commenter mappings and menu items invoke a single function ++which delegates the commenting work to other functions. This function is ++public and has the prototype: > ++ function! NERDComment(isVisual, type) ++< ++The arguments to this function are simple: ++ - isVisual: if you wish to do any kind of visual comment then set this to ++ 1 and the function will use the '< and '> marks to find the comment ++ boundries. If set to 0 then the function will operate on the current ++ line. ++ - type: is used to specify what type of commenting operation is to be ++ performed, and it can be one of the following: 'sexy', 'invert', ++ 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', ++ 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' ++ ++For example, if you typed > ++ :call NERDComment(1, 'sexy') ++< ++then the script would do a sexy comment on the last visual selection. ++ ++ ++============================================================================== ++3. Options {{{2 *NERDComOptions* ++ ++------------------------------------------------------------------------------ ++3.1 Options summary *NERDComOptionsSummary* ++ ++|loaded_nerd_comments| Turns off the script. ++|NERDAllowAnyVisualDelims| Allows multipart alternative delims to ++ be used when commenting in ++ visual/visual-block mode. ++|NERDBlockComIgnoreEmpty| Forces right delims to be placed when ++ doing visual-block comments. ++|NERDCommentWholeLinesInVMode| Changes behaviour of visual comments. ++|NERDDefaultNesting| Tells the script to use nested comments ++ by default. ++|NERDMenuMode| Specifies how the NERD commenter menu ++ will appear (if at all). ++|NERDLPlace| Specifies what to use as the left ++ delimiter placeholder when nesting ++ comments. ++|NERDMapleader| Specifies what all the commenting key ++ mappings will begin with. ++|NERDUsePlaceHolders| Specifies which filetypes may use ++ placeholders when nesting comments. ++|NERDRemoveAltComs| Tells the script whether to remove ++ alternative comment delimiters when ++ uncommenting. ++|NERDRemoveExtraSpaces| Tells the script to always remove the ++ extra spaces when uncommenting ++ (regardless of whether NERDSpaceDelims ++ is set) ++|NERDRPlace| Specifies what to use as the right ++ delimiter placeholder when nesting ++ comments. ++|NERDShutUp| Stops "Unknown filetype" output from the ++ script ++|NERDSpaceDelims| Specifies whether to add extra spaces ++ around delimiters when commenting, and ++ whether to remove them when ++ uncommenting. ++|NERDCompactSexyComs| Specifies whether to use the compact ++ style sexy comments. ++ ++------------------------------------------------------------------------------ ++3.3 Options details *NERDComOptionsDetails* ++ ++To enable any of the below options you should put the given line in your ++~/.vimrc ++ ++ *loaded_nerd_comments* ++If this script is driving you insane you can turn it off by setting this ++option > ++ let loaded_nerd_comments=1 ++< ++------------------------------------------------------------------------------ ++ *NERDAllowAnyVisualDelims* ++Values: 0 or 1. ++Default: 1. ++ ++If set to 1 then, when doing a visual or visual-block comment (but not a ++visual-line comment), the script will choose the right delimiters to use for ++the comment. This means either using the current delimiters if they are ++multipart or using the alternative delimiters if THEY are multipart. For ++example if we are editing the following java code: > ++ float foo = 1221; ++ float bar = 324; ++ System.out.println(foo * bar); ++< ++If we are using // comments and select the "foo" and "bar" in visual-block ++mode, as shown left below (where '|'s are used to represent the visual-block ++boundary), and comment it then the script will use the alternative delims as ++shown on the right: > ++ ++ float |foo| = 1221; float /*foo*/ = 1221; ++ float |bar| = 324; float /*bar*/ = 324; ++ System.out.println(foo * bar); System.out.println(foo * bar); ++< ++------------------------------------------------------------------------------ ++ *NERDBlockComIgnoreEmpty* ++Values: 0 or 1. ++Default: 1. ++ ++This option affects visual-block mode commenting. If this option is turned ++on, lines that begin outside the right boundary of the selection block will be ++ignored. ++ ++For example, if you are commenting this chunk of c code in visual-block mode ++(where the '|'s are used to represent the visual-block boundary) > ++ #include ++ #include ++ #include ++ |int| main(){ ++ | | printf("SUCK THIS\n"); ++ | | while(1){ ++ | | fork(); ++ | | } ++ |} | ++< ++If NERDBlockComIgnoreEmpty=0 then this code will become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ /* */ printf("SUCK THIS\n"); ++ /* */ while(1){ ++ /* */ fork(); ++ /* */ } ++ /*} */ ++< ++Otherwise, the code block would become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ printf("SUCK THIS\n"); ++ while(1){ ++ fork(); ++ } ++ /*} */ ++< ++------------------------------------------------------------------------------ ++ *NERDCommentWholeLinesInVMode* ++Values: 0, 1 or 2. ++Default: 0. ++ ++By default the script tries to comment out exactly what is selected in visual ++mode (v). For example if you select and comment the following c code (using | ++to represent the visual boundary): > ++ in|t foo = 3; ++ int bar =| 9; ++ int baz = foo + bar; ++< ++This will result in: > ++ in/*t foo = 3;*/ ++ /*int bar =*/ 9; ++ int baz = foo + bar; ++< ++But some people prefer it if the whole lines are commented like: > ++ /*int foo = 3;*/ ++ /*int bar = 9;*/ ++ int baz = foo + bar; ++< ++If you prefer the second option then stick this line in your vimrc: > ++ let NERDCommentWholeLinesInVMode=1 ++< ++ ++If the filetype you are editing only has no multipart delimiters (for example ++a shell script) and you hadnt set this option then the above would become > ++ in#t foo = 3; ++ #int bar = 9; ++< ++(where # is the comment delimiter) as this is the closest the script can ++come to commenting out exactly what was selected. If you prefer for whole ++lines to be commented out when there is no multipart delimiters but the EXACT ++text that was selected to be commented out if there IS multipart delimiters ++then stick the following line in your vimrc: > ++ let NERDCommentWholeLinesInVMode=2 ++< ++ ++Note that this option does not affect the behaviour of |visual-block| mode. ++ ++------------------------------------------------------------------------------ ++ *NERDRemoveAltComs* ++Values: 0 or 1. ++Default: 1. ++ ++When uncommenting a line (for a filetype with an alternative commenting style) ++this option tells the script whether to look for, and remove, comments ++delimiters of the alternative style. ++ ++For example, if you are editing a c++ file using // style comments and you go ++,cu on this line: > ++ /* This is a c++ comment baby! */ ++< ++It will not be uncommented if the NERDRemoveAltComs is set to 0. ++ ++------------------------------------------------------------------------------ ++ *NERDRemoveExtraSpaces* ++Values: 0 or 1. ++Default: 1. ++ ++By default, the NERD commenter will remove spaces around comment delimiters if ++either: ++1. |NERDSpaceDelims| is set to 1. ++2. NERDRemoveExtraSpaces is set to 1. ++ ++This means that if we have the following lines in a c code file: > ++ /* int foo = 5; */ ++ /* int bar = 10; */ ++ int baz = foo + bar ++< ++If either of the above conditions hold then if these lines are uncommented ++they will become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++Otherwise they would become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++If you want the spaces to be removed only if |NERDSpaceDelims| is set then ++set NERDRemoveExtraSpaces to 0. ++ ++------------------------------------------------------------------------------ ++ *NERDLPlace* ++ *NERDRPlace* ++Values: arbitrary string. ++Default: ++ NERDLPlace: "[>" ++ NERDRPlace: "<]" ++ ++These options are used to control the strings used as place-holder delimiters. ++Place holder delimiters are used when performing nested commenting when the ++filetype supports commenting styles with both left and right delimiters. ++To set these options use lines like: > ++ let NERDLPlace="FOO" ++ let NERDRPlace="BAR" ++< ++Following the above example, if we have line of c code: > ++ /* int horse */ ++< ++and we comment it with ,cn it will be changed to: > ++ /*FOO int horse BAR*/ ++< ++When we uncomment this line it will go back to what it was. ++ ++------------------------------------------------------------------------------ ++ *NERDMapleader* ++Values: arbitrary string. ++Default: \c ++ ++NERDMapleader is used to specify what all the NERD commenter key mappings ++begin with. ++ ++The default key mappings will look like this: > ++ \cc ++ \cu ++ \ca ++ \ci ++ \cs ++ ... ++< ++However, if this line: > ++ let NERDMapleader = ',x' ++< ++were present in your vimrc then the default mappings would look like this: > ++ ,xc ++ ,xu ++ ,xa ++ ,xi ++ ,xs ++ ... ++< ++This option only affects the mappings that have not been explicitly set ++manually (see |NERDComMappings|). ++ ++------------------------------------------------------------------------------ ++ *NERDMenuMode* ++Values: 0, 1, 2, 3. ++Default: 3 ++ ++This option can take 4 values: ++ "0": Turns the menu off. ++ "1": Turns the 'comment' menu on with no menu shortcut. ++ "2": Turns the 'comment 'menu on with -c as the shortcut. ++ "3": Turns the 'Plugin -> comment' menu on with -c as the shortcut. ++ ++------------------------------------------------------------------------------ ++ *NERDUsePlaceHolders* ++Values: 0 or 1. ++Default 1. ++ ++This option is used to specify whether place-holder delimiters should be used ++when adding nested comments. ++ ++------------------------------------------------------------------------------ ++ *NERDShutUp* ++Values: 0 or 1. ++Default 1. ++ ++This option is used to prevent the script from echoing "Unknown filetype" ++messages. Stick this line in your vimrc: > ++ let NERDShutUp=1 ++< ++------------------------------------------------------------------------------ ++ *NERDSpaceDelims* ++Values: 0 or 1. ++Default 0. ++ ++Some people prefer a space after the left delimiter and before the right ++delimiter like this: > ++ /* int foo=2; */ ++< ++as opposed to this: > ++ /*int foo=2;*/ ++< ++If you want spaces to be added then set NERDSpaceDelims to 1 in your vimrc. ++ ++See also |NERDRemoveExtraSpaces|. ++ ++------------------------------------------------------------------------------ ++ *NERDCompactSexyComs* ++Values: 0 or 1. ++Default 0. ++ ++Some people may want their sexy comments to be like this: > ++ /* Hi There! ++ * This is a sexy comment ++ * in c */ ++< ++As opposed to like this: > ++ /* ++ * Hi There! ++ * This is a sexy comment ++ * in c ++ */ ++< ++If this option is set to 1 then the top style will be used. ++ ++------------------------------------------------------------------------------ ++ *NERDDefaultNesting* ++Values: 0 or 1. ++Default 0. ++ ++When this option is set to 1, comments are nested automatically. That is, if ++you hit ,cc on a line that is already commented it will be commented ++again ++ ++------------------------------------------------------------------------------ ++3.3 Default delimiter customisation *NERDComDefaultDelims* ++ ++If you want the NERD commenter to use the alternative delimiters for a ++specific filetype by default then put a line of this form into your vimrc: > ++ let NERD_<&filetype>_alt_style=1 ++< ++Example: java uses // style comments by default, but you want it to default to ++/* */ style comments instead. You would put this line in your vimrc: > ++ let NERD_java_alt_style=1 ++< ++ ++See |NERDComAltDelim| for switching commenting styles at runtime. ++ ++------------------------------------------------------------------------------ ++3.4 Key mapping customisation *NERDComMappings* ++ ++These options are used to override the default keys that are used for the ++commenting mappings. Their values must be set to strings. As an example: if ++you wanted to use the mapping ,foo to uncomment lines of code then ++you would place this line in your vimrc > ++ let NERDUncomLineMap=",foo" ++< ++Check out |NERDComFunctionality| for details about what the following ++mappings do. ++ ++Default Mapping Option to override~ ++ ++,ca NERDAltComMap ++,ce NERDAppendComMap ++,cl NERDComAlignLeftMap ++,cb NERDComAlignBothMap ++,cr NERDComAlignRightMap ++ NERDComInInsertMap ++,ci NERDComLineInvertMap ++,cc NERDComLineMap ++,cn NERDComLineNestMap ++,cs NERDComLineSexyMap ++,c NERDComLineToggleMap ++,cm NERDComLineMinimalMap ++,c$ NERDComToEOLMap ++,cy NERDComLineYankMap ++,cu NERDUncomLineMap ++ ++============================================================================== ++4. Issues with the script{{{2 *NERDComIssues* ++ ++ ++------------------------------------------------------------------------------ ++4.1 Delimiter detection heuristics *NERDComHeuristics* ++ ++Heuristics are used to distinguish the real comment delimiters ++ ++Because we have comment mappings that place delimiters in the middle of lines, ++removing comment delimiters is a bit tricky. This is because if comment ++delimiters appear in a line doesnt mean they really ARE delimiters. For ++example, Java uses // comments but the line > ++ System.out.println("//"); ++< ++clearly contains no real comment delimiters. ++ ++To distinguish between ``real'' comment delimiters and ``fake'' ones we use a ++set of heuristics. For example, one such heuristic states that any comment ++delimiter that has an odd number of non-escaped " characters both preceding ++and following it on the line is not a comment because it is probably part of a ++string. These heuristics, while usually pretty accurate, will not work for all ++cases. ++ ++------------------------------------------------------------------------------ ++4.2 Nesting issues *NERDComNesting* ++ ++If we have some line of code like this: > ++ /*int foo */ = /*5 + 9;*/ ++< ++This will not be uncommented legally. The NERD commenter will remove the ++"outter most" delimiters so the line will become: > ++ int foo */ = /*5 + 9; ++< ++which almost certainly will not be what you want. Nested sets of comments will ++uncomment fine though. Eg: > ++ /*int/* foo =*/ 5 + 9;*/ ++< ++will become: > ++ int/* foo =*/ 5 + 9; ++< ++(Note that in the above examples I have deliberately not used place holders ++for simplicity) ++ ++============================================================================== ++6. The author {{{2 *NERDComAuthor* ++ ++The author of the NERD commenter is Martyzillatron --- the half robot, half ++dinosaur bastard son of Megatron and Godzilla. He enjoys destroying ++metropolises and eating tourist busses. ++ ++Drop him a line at martin_grenfell at msn.com. He would love to hear from you. ++its a lonely life being the worlds premier terror machine. How would you feel ++if your face looked like a toaster and a t-rex put together? :( ++ ++============================================================================== ++7. TODO list {{{2 *NERDComTodo* ++ ++Uncommenting of minimal comments needs to be more robust. Currently it is easy ++to get illegal syntax when uncommenting them. ++ ++ ++ ++============================================================================== ++8. Changelog {{{2 *NERDComChangelog* ++ ++2.1.4 ++ - added support for the ahk filetype. Cheers to Don Hatlestad for the ++ email. ++ - added support for desktop and xsd filetypes. Thanks to Christophe Benz. ++ - added dummy support for Rails-log ++ - fixed a bunch of bugs in the comment delimiter setup process, thanks to ++ Cheng Fang for the email :D ++ - hardcore refactoring and removal of seldomly used, overly-complex ++ functionality. ++ - the script now requires vim 7 ++2.1.3 ++ - fixed numerous bugs that were causing tabs to permanently be converted ++ to spaces, even if noexpandtab was set. Thanks to Heptite on #vim for ++ working with me to track them down :) ++ - added dummy support for "lookupfile". Thanks to David Fishburn for the ++ email. ++ - added support for "rst", thanks to Niels Aan de Brugh for the email. ++ ++2.1.2 ++ - added support for the vera and ldif filetypes. Thanks to Normandie ++ Azucena and Florian Apolloner for the emails. ++ ++2.1.1 ++ - added dummy support for SVNcommitlog and vcscommit. Thanks to John ++ O'Shea for the email. ++ - added support for Groovy. Thanks to Jason Mills for the email. ++2.1.0 ++ - now the script resets the delimiters when the filetype of the buffer ++ changes (thanks to James Hales for the patch) ++ - added formal support/doc for prepending a count to many of the ++ commenting maps so you can go, eg, 5,cc to comment 5 lines from normal ++ mode. Thanks again to James Hales for the patch. ++ - added support for the "gams" filetype that Jorge Rodrigues created. ++ - added support for the "objc" filetype, thanks to Rainer Müller for the ++ email. ++ - added support for the "sass" filetype that Dmitry Ilyashevich created. ++ ++2.0.7 ++ - Added support for eclass and ebuild filetypes. Thanks to Alex Tarkovsky ++ for the email. ++ ++2.0.6 ++ - Changed the default setting of NERDMapleader to ",c", meaning all the ++ maps now start with ,c instead of \c. This is to stop a major mapping ++ clash with the vcscommand plugin. Anyone wanting to keep the \c map ++ leader should read :help NERDMapleader. ++ - Added support for debcontrol and dummy support for debchangelog ++ filetypes, thanks to Stefano Zacchiroli for the email. ++ - Made it so that the NERDShutUp option now only controls the "Pleeease ++ email the delimiters..." requests. It no longer affects the general ++ output of the script. ++ - Simplified the names of the help tags. ++ ++2.0.5 ++ - Added support for autoit, autohotkey and docbk filetypes (thanks to ++ Michael Böhler) ++ - Added support for cmake (thanks to Aaron Small) ++ - Added support for htmldjango and django filetypes (thanks to Ramiro ++ Morales) ++ - Improved the delimiters for eruby again ++ - Applied a patch from Seth Mason to fix some pathing issues with the help ++ file installation. ++ ++2.0.4 ++ - Added support for verilog_systemverilog and systemverilog filetypes ++ (Thanks to Alexey for the email) ++ - Added support for fstab, thanks to Lizendir for the email. ++ - Added support for the smarty filetype. ++ - Improved the delimiters for eruby. ++ - Added dummy support for changelog filetype. ++ ++2.0.3 ++ - Added dummy support for the csv filetype (thx to Mark Woodward for the ++ email) ++ - Added dummy support for vo_base and otl filetypes (thanks to fREW for ++ the email) ++ ++2.0.2: ++ - Minor bug fix that was stopping nested comments from working ++ ++2.0.1: ++ - Fixed the visual bell for the |NERDComToEOLMap| map. ++ - Added another possible value to the NERDMenuMode option which causes the ++ menu to be displayed under 'Plugin -> Comment'. See :h NERDMenuMode. ++ This new menu mode is now the default. ++ - Added support for the occam filetype (thanks to Anders for emailing me) ++ - Made the main commenting function (NERDComment) available outside the ++ script. ++ - bug fixes and refactoring ++ ++2.0.0: ++ - NOTE: renamed the script to NERD_commenter.vim. When you install this ++ version you must delete the old files: NERD_comments.vim and ++ NERD_comments.txt. ++ - Reworked the mappings and main entry point function for the script to ++ avoid causing visual-bells and screen scrolling. ++ - Changes to the script options (see |NERD_com-Customisation| for ++ details): ++ - They are all camel case now instead of underscored. ++ - Converted all of the regular expression options into simple boolean ++ options for simplicity. ++ - All the options are now stated positively, eg. ++ NERD_dont_remove_spaces_regexp has become NERDRemoveExtraSpaces. ++ - Some of the option names have been changed (other than in the above ++ ways) ++ - Some have been removed altogether, namely: NERD_create_h_filetype ++ (why was a commenting script creating a filetype?!), ++ NERD_left_align_regexp, NERD_right_align_regexp, ++ ++ - Removed all the NERD_use_alt_style_XXX_coms options and replaced them ++ with a better system. Now if a filetype has alternative delims, the ++ script will check whether an option of the form ++ "NERD_<&filetype>_alt_style" exists, and if it does then alt delims will ++ be used. See |NERD_com-cust-delims| for details. ++ - The script no longer removes extra spaces for sexy comments for the ++ NERDRemoveExtraSpaces option (it will still remove spaces if ++ NERDSpaceDelims is set). ++ - Added dummy support for viminfo and rtf. ++ - Added support for the "gentoo-package-\(keywords\|mask\|use\)" ++ filetypes. ++ - Added '#' comments as an alternative for the asm filetype ++ ++Thanks to Markus Klinik and Anders for bug reports, and again to Anders ++for his patch. Thanks to John O'Shea and fREW for the filetype ++information. ++ ++============================================================================== ++8. Credits {{{2 *NERDComCredits* ++ ++Thanks and respect to the following people: ++ ++Thanks to Nick Brettell for his many ideas and criticisms. A bloody good ++bastard. ++:normal :.-2s/good// ++ ++Thanks to Matthew Hawkins for his awesome refactoring! ++ ++Thanks to the authors of the vimspell whose documentation ++installation function I stole :) ++ ++Thanks to Greg Searle for the idea of using place-holders for nested comments. ++ ++Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! ++Also, thanks for the idea of doing sexy comments as well as his suggestions ++relating to it :P ++Thanks again to Nguyen for complaining about the NERD_comments menu mapping ++(-c) interfering with another mapping of his... and thus the ++NERD_dont_create_menu_shortcut option was born :P ++(it was then replaced with NERD_menu_mode in version 1.67 :) ++ ++Thanks to Sam R for pointing out some filetypes that NERD_comments could support! ++ ++Cheers to Litchi for the idea of having a mapping that appends a comment to ++the current line :) ++ ++Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some ++problems with commenting in visual mode. Thanks again to Jorge for his ++continued suggestions on this matter :) ++ ++Thanks to Martin Stubenschrott for pointing out a bug with the mapping ++:) Ive gotta stop breaking this mapping! ++ ++Thanks to Markus Erlmann for pointing out a conflict that this script was ++having with the taglist plugin. ++ ++Thanks to Brent Rice for alerting me about, and helping me track down, a bug ++in the script when the "ignorecase" option in vim was set. ++ ++Thanks to Richard Willis for telling me about how line continuation was ++causing problems on cygwin. Also, thanks pointing out a bug in the help file ++and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI ++have mercy on your soul :) ++ ++Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". ++Also, thanks for his suggested improvements about toggle comments after i ++implemented them. ++ ++Thanks to harry for telling me that i broke the cn mapping in 1.53 :), ++and thanks again for telling me about a bug that occurred when editing a file ++in a new tab. ++ ++Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc ++install function and added support for ada comments with spaces as well as ++making a couple of other small changes. ++ ++Thanks to David Bourgeois for pointing out a bug with when commenting c files ++:)... [a few days later] ok i completely misunderstood what David was talking ++about and ended up fixing a completely different bug to what he was talking ++about :P ++ ++Thanks to David Bourgeois for pointing out a bug when changing buffers. ++ ++Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that ++was causing spaces to be added to the end of lines with single-part ++delimiters. It's nice when people do my work for me :D ++ ++Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting ++sexy comments. Sexy comments dont look so sexy when they are only half removed ++:P ++ ++Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping ++the NERD_space_delim_filetype_regexp option from working with left aligned ++toggle comments. And for pointing out a bug when initialising VB comments. ++ ++Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". ++And for suggested improvements to minimal comments. ++ ++Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. ++In 1.65 ++ ++Thanks to Jonathan Derque for alerting me to some filetypes that could be ++supported (Namely: context, plaintext and mail). ++ ++Thanks to Joseph Barker for the sugesting that the menu be an optional ++feature. ++ ++Thanks to Gary Church and Tim Carey-Smith for complaining about the ++keymappings and causing me to introduce the NERD_mapleader option :) ++ ++Thanks to Vigil for pointing out that the "fetchmail" filetype was not ++supported and emailing me the delimiters ++ ++Thanks to Michael Brunner for telling me about the kconfig filetype. ++ ++Thanks to Antono Vasiljev for telling me about the netdict filetype. ++ ++Thanks to Melissa Reid for telling me about the omlet filetype. ++ ++Thanks to Ilia N Ternovich for alerting me to the 'qf' (quickfix) filetype. ++ ++Thanks to Markus Klinik for emailing me about a bug for sexy comments where ++spaces were being eaten. ++ ++Thanks to John O'Shea for emailing me about the RTF filetype. Thanks again for ++the SVNcommitlog and vcscommit filetypes. ++ ++Thanks to Anders for emailing me a patch to help get rid of all the visual ++bells and screen scrolling, and for sending me the delimiters for the occam ++filetype. ++ ++Thanks to Anders and Markus Klinik for emailing me about the screen scrolling ++issues and finally getting me off my ass about them :P ++ ++Thanks to Mark Woodward for emailing me about the csv filetype. ++ ++Thanks to fREW for emailing me with the /gentoo-package-(mask|keywords|use)/ ++filetypes the vo_base filetype. ++ ++Thanks to Alexey for emailing me about the verilog_systemverilog/systemverilog ++filetypes. ++ ++Cheers to Lizendir for the email about the fstab filetype ++ ++Thanks to Michael Böhler for emailing me with the autoit, autohotkey and docbk ++filetypes. ++ ++Thanks to Aaron Small for emailing me about the cmake filetype. ++ ++Thanks to Ramiro for emailing me about the htmldjango and django filetypes. ++ ++Thanks to Seth Mason for sending me a patch to fix some pathing issues for the ++help doc installation. ++ ++Thanks to Stefano Zacchiroli for emailing me with the debcontrol and ++debchangelog filetypes. ++ ++Thanks to Alex Tarkovsky for emailing me about the ebuild and eclass ++filetypes. ++ ++Cheers to Jorge Rodrigues for emailing me about the gams filetype. ++ ++Cheers to James Hales for the patch that made the comment maps work better with ++counts, and made the script reset comment delims for a buffer when its ++filetype changes. ++ ++Thank to Rainer Müller for emailing me with the Objective C delimiters. ++ ++Thanks to Jason Mills for emailing me the Groovy filetype. ++ ++Thanks to Normandie Azucena for emailing me about the vera filetype. ++ ++Thanks to Florian Apolloner for emailing me about the ldif filetype. ++ ++Cheers to David Fishburn for emailing me with the lookupfile filetype. ++ ++Thanks to Niels Aan de Brugh for emailing me with the rst filetype. ++ ++Cheers to heptite on #vim for helping me track down some tab-space conversion ++bugs. ++ ++Cheers to Don Hatlestad for telling me about the ahk filetype ++ ++Thanks to Christophe Benz for emailing me with the Desktop and xsd filetypes. ++ ++Cheers to Cheng Fang for the bug reports :D ++ ++Cheers to myself for being the best looking man on Earth! ++=== END_DOC ++" vim: set foldmethod=marker : +diff -urN vim71/1/plugin/.svn/text-base/taglist.vim.svn-base vim71_ada/1/plugin/.svn/text-base/taglist.vim.svn-base +--- vim71/1/plugin/.svn/text-base/taglist.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/.svn/text-base/taglist.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,4524 @@ ++" File: taglist.vim ++" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) ++" 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 ++" 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. ++" ++" 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 ++" you to efficiently browse through source code files for different ++" programming languages. You can visit the taglist plugin home page for more ++" information: ++" ++" http://vim-taglist.sourceforge.net ++" ++" You can subscribe to the taglist mailing list to post your questions ++" or suggestions for improvement or to report bugs. Visit the following ++" page for subscribing to the mailing list: ++" ++" http://groups.yahoo.com/group/taglist/ ++" ++" For more information about using this plugin, after installing the ++" taglist plugin, use the ":help taglist" command. ++" ++" Installation ++" ------------ ++" 1. Download the taglist.zip file and unzip the files to the $HOME/.vim ++" or the $HOME/vimfiles or the $VIM/vimfiles directory. This should ++" unzip the following two files (the directory structure should be ++" preserved): ++" ++" 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. ++" 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. ++" 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 ++" utility (not to the directory) in the .vimrc file. ++" 4. If you are running a terminal/console version of Vim and the ++" terminal doesn't support changing the window width then set the ++" 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. ++" 5. Restart Vim. ++" 6. You can now use the ":TlistToggle" command to open/close the taglist ++" window. You can use the ":help taglist" command to get more ++" information about using the taglist plugin. ++" ++" ****************** Do not modify after this line ************************ ++ ++" Line continuation used here ++let s:cpo_save = &cpo ++set cpo&vim ++ ++if !exists('loaded_taglist') ++ " First time loading the taglist plugin ++ " ++ " To speed up the loading of Vim, the taglist plugin uses autoload ++ " mechanism to load the taglist functions. ++ " Only define the configuration variables, user commands and some ++ " auto-commands and finish sourcing the file ++ ++ " The taglist plugin requires the built-in Vim system() function. If this ++ " function is not available, then don't load the plugin. ++ if !exists('*system') ++ echomsg 'Taglist: Vim system() built-in function is not available. ' . ++ \ 'Plugin is not loaded.' ++ let loaded_taglist = 'no' ++ let &cpo = s:cpo_save ++ finish ++ endif ++ ++ " Location of the exuberant ctags tool ++ if !exists('Tlist_Ctags_Cmd') ++ if executable('exuberant-ctags') ++ " On Debian Linux, exuberant ctags is installed ++ " as exuberant-ctags ++ let Tlist_Ctags_Cmd = 'exuberant-ctags' ++ elseif executable(' exctags') ++ " On Free-BSD, exuberant ctags is installed as exctags ++ let Tlist_Ctags_ Cmd = 'exctags' ++ elseif executable('ctags') ++ let Tlist_Ctags_Cmd = 'ctags' ++ elseif executable('ctags.exe') ++ let Tlist_Ctags_Cmd = 'ctags.exe' ++ elseif executable('tags') ++ let Tlist_Ctags_Cmd = 'tags' ++ else ++ echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . ++ \ 'not found in PATH. Plugin is not loaded.' ++ " Skip loading the plugin ++ let loaded_taglist = 'no' ++ let &cpo = s:cpo_save ++ finish ++ endif ++ endif ++ ++ ++ " Automatically open the taglist window on Vim startup ++ if !exists('Tlist_Auto_Open') ++ 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 ++ endif ++ ++ if !exists('Tlist_Show_Menu') ++ let Tlist_Show_Menu = 0 ++ endif ++ ++ " Tag listing sort type - 'name' or 'order' ++ if !exists('Tlist_Sort_Type') ++ let Tlist_Sort_Type = 'order' ++ endif ++ ++ " Tag listing window split (horizontal/vertical) control ++ if !exists('Tlist_Use_Horiz_Window') ++ let Tlist_Use_Horiz_Window = 0 ++ endif ++ ++ " Open the vertically split taglist window on the left or on the right ++ " side. This setting is relevant only if Tlist_Use_Horiz_Window is set to ++ " zero (i.e. only for vertically split windows) ++ if !exists('Tlist_Use_Right_Window') ++ let Tlist_Use_Right_Window = 0 ++ endif ++ ++ " Increase Vim window width to display vertically split taglist window. ++ " For MS-Windows version of Vim running in a MS-DOS window, this must be ++ " set to 0 otherwise the system may hang due to a Vim limitation. ++ if !exists('Tlist_Inc_Winwidth') ++ if (has('win16') || has('win95')) && !has('gui_running') ++ let Tlist_Inc_Winwidth = 0 ++ else ++ let Tlist_Inc_Winwidth = 1 ++ endif ++ endif ++ ++ " Vertically split taglist window width setting ++ if !exists('Tlist_WinWidth') ++ let Tlist_WinWidth = 30 ++ endif ++ ++ " Horizontally split taglist window height setting ++ if !exists('Tlist_WinHeight') ++ let Tlist_WinHeight = 10 ++ endif ++ ++ " Display tag prototypes or tag names in the taglist window ++ if !exists('Tlist_Display_Prototype') ++ let Tlist_Display_Prototype = 0 ++ endif ++ ++ " Display tag scopes in the taglist window ++ if !exists('Tlist_Display_Tag_Scope') ++ let Tlist_Display_Tag_Scope = 1 ++ endif ++ ++ " Use single left mouse click to jump to a tag. By default this is disabled. ++ " Only double click using the mouse will be processed. ++ if !exists('Tlist_Use_SingleClick') ++ let Tlist_Use_SingleClick = 0 ++ endif ++ ++ " Control whether additional help is displayed as part of the taglist or ++ " not. Also, controls whether empty lines are used to separate the tag ++ " tree. ++ if !exists('Tlist_Compact_Format') ++ let Tlist_Compact_Format = 0 ++ endif ++ ++ " Exit Vim if only the taglist window is currently open. By default, this is ++ " set to zero. ++ if !exists('Tlist_Exit_OnlyWindow') ++ let Tlist_Exit_OnlyWindow = 0 ++ endif ++ ++ " Automatically close the folds for the non-active files in the taglist ++ " window ++ if !exists('Tlist_File_Fold_Auto_Close') ++ let Tlist_File_Fold_Auto_Close = 0 ++ endif ++ ++ " Close the taglist window when a tag is selected ++ if !exists('Tlist_Close_On_Select') ++ let Tlist_Close_On_Select = 0 ++ endif ++ ++ " Automatically update the taglist window to display tags for newly ++ " edited files ++ if !exists('Tlist_Auto_Update') ++ let Tlist_Auto_Update = 1 ++ endif ++ ++ " Automatically highlight the current tag ++ if !exists('Tlist_Auto_Highlight_Tag') ++ let Tlist_Auto_Highlight_Tag = 1 ++ endif ++ ++ " Automatically highlight the current tag on entering a buffer ++ if !exists('Tlist_Highlight_Tag_On_BufEnter') ++ let Tlist_Highlight_Tag_On_BufEnter = 1 ++ endif ++ ++ " Enable fold column to display the folding for the tag tree ++ if !exists('Tlist_Enable_Fold_Column') ++ let Tlist_Enable_Fold_Column = 1 ++ endif ++ ++ " Display the tags for only one file in the taglist window ++ if !exists('Tlist_Show_One_File') ++ let Tlist_Show_One_File = 0 ++ endif ++ ++ if !exists('Tlist_Max_Submenu_Items') ++ let Tlist_Max_Submenu_Items = 20 ++ endif ++ ++ if !exists('Tlist_Max_Tag_Length') ++ let Tlist_Max_Tag_Length = 10 ++ endif ++ ++ " Do not change the name of the taglist title variable. The winmanager ++ " plugin relies on this name to determine the title for the taglist ++ " plugin. ++ let TagList_title = "__Tag_List__" ++ ++ " Taglist debug messages ++ let s:tlist_msg = '' ++ ++ " Define the taglist autocommand to automatically open the taglist window ++ " on Vim startup ++ if g:Tlist_Auto_Open ++ autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open() ++ endif ++ ++ " Refresh the taglist ++ if g:Tlist_Process_File_Always ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ ++ if g:Tlist_Show_Menu ++ autocmd GUIEnter * call s:Tlist_Menu_Init() ++ endif ++ ++ " When the taglist buffer is created when loading a Vim session file, ++ " the taglist buffer needs to be initialized. The BufFilePost event ++ " is used to handle this case. ++ autocmd BufFilePost __Tag_List__ call s:Tlist_Vim_Session_Load() ++ ++ " Define the user commands to manage the taglist window ++ command! -nargs=0 -bar TlistToggle call s:Tlist_Window_Toggle() ++ command! -nargs=0 -bar TlistOpen call s:Tlist_Window_Open() ++ " For backwards compatiblity define the Tlist command ++ command! -nargs=0 -bar Tlist TlistToggle ++ command! -nargs=+ -complete=file TlistAddFiles ++ \ call s:Tlist_Add_Files() ++ command! -nargs=+ -complete=dir TlistAddFilesRecursive ++ \ call s:Tlist_Add_Files_Recursive() ++ command! -nargs=0 -bar TlistClose call s:Tlist_Window_Close() ++ command! -nargs=0 -bar TlistUpdate call s:Tlist_Update_Current_File() ++ command! -nargs=0 -bar TlistHighlightTag call s:Tlist_Window_Highlight_Tag( ++ \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1) ++ " For backwards compatiblity define the TlistSync command ++ command! -nargs=0 -bar TlistSync TlistHighlightTag ++ command! -nargs=* -complete=buffer TlistShowPrototype ++ \ echo Tlist_Get_Tag_Prototype_By_Line() ++ command! -nargs=* -complete=buffer TlistShowTag ++ \ echo Tlist_Get_Tagname_By_Line() ++ command! -nargs=* -complete=file TlistSessionLoad ++ \ call s:Tlist_Session_Load() ++ command! -nargs=* -complete=file TlistSessionSave ++ \ call s:Tlist_Session_Save() ++ command! -bar TlistLock let Tlist_Auto_Update=0 ++ command! -bar TlistUnlock let Tlist_Auto_Update=1 ++ ++ " Commands for enabling/disabling debug and to display debug messages ++ command! -nargs=? -complete=file -bar TlistDebug ++ \ call s:Tlist_Debug_Enable() ++ command! -nargs=0 -bar TlistUndebug call s:Tlist_Debug_Disable() ++ command! -nargs=0 -bar TlistMessages call s:Tlist_Debug_Show() ++ ++ " Define autocommands to autoload the taglist plugin when needed. ++ ++ " Trick to get the current script ID ++ map xx xx ++ let s:tlist_sid = substitute(maparg('xx'), '\(\d\+_\)xx$', ++ \ '\1', '') ++ unmap xx ++ ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Window_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Menu_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined Tlist_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined TagList_* source ' . ++ \ escape(expand(''), ' ') ++ ++ let loaded_taglist = 'fast_load_done' ++ ++ if g:Tlist_Show_Menu && has('gui_running') ++ call s:Tlist_Menu_Init() ++ endif ++ ++ " restore 'cpo' ++ let &cpo = s:cpo_save ++ finish ++endif ++ ++if !exists('s:tlist_sid') ++ " Two or more versions of taglist plugin are installed. Don't ++ " load this version of the plugin. ++ finish ++endif ++ ++unlet! s:tlist_sid ++ ++if loaded_taglist != 'fast_load_done' ++ " restore 'cpo' ++ let &cpo = s:cpo_save ++ finish ++endif ++ ++" Taglist plugin functionality is available ++let loaded_taglist = 'available' ++ ++"------------------- end of user configurable options -------------------- ++ ++" Default language specific settings for supported file types and tag types ++" ++" Variable name format: ++" ++" s:tlist_def_{vim_ftype}_settings ++" ++" vim_ftype - Filetype detected by Vim ++" ++" Value format: ++" ++" ;:;:;... ++" ++" ctags_ftype - File type supported by exuberant ctags ++" flag - Flag supported by exuberant ctags to generate a tag type ++" name - Name of the tag type used in the taglist window to display the ++" tags of this type ++" ++ ++" Ada language ++let s:tlist_def_ada_settings = 'ada;' . ++ \ 'P:package spec;' . ++ \ 'p:package body;' . ++ \ 'T:type spec;' . ++ \ 't:type;' . ++ \ 'U:subtype spec;' . ++ \ 'u:subtype;' . ++ \ 'c:component;' . ++ \ 'l:literal;' . ++ \ 'V:variable spec;' . ++ \ 'v:variable;' . ++ \ 'f:formal;' . ++ \ 'n:constant;' . ++ \ 'x:exception;' . ++ \ 'R:subprogram spec;' . ++ \ 'r:subprogram body;' . ++ \ 'K:task spec;' . ++ \ 'k:task body;' . ++ \ 'O:protected spec;' . ++ \ 'o:protected body;' . ++ \ 'E:entry spec;' . ++ \ 'e:entry body;' . ++ \ 'b:label;' . ++ \ 'i:identifier;' . ++ \ 'a:autovar;' . ++ \ 'y:annon' ++ ++" assembly language ++let s:tlist_def_asm_settings = 'asm;d:define;l:label;m:macro;t:type' ++ ++" aspperl language ++let s:tlist_def_aspperl_settings = 'asp;f:function;s:sub;v:variable' ++ ++" aspvbs language ++let s:tlist_def_aspvbs_settings = 'asp;f:function;s:sub;v:variable' ++ ++" awk language ++let s:tlist_def_awk_settings = 'awk;f:function' ++ ++" beta language ++let s:tlist_def_beta_settings = 'beta;f:fragment;s:slot;v:pattern' ++ ++" c language ++let s:tlist_def_c_settings = 'c;d:macro;g:enum;s:struct;u:union;t:typedef;' . ++ \ 'v:variable;f:function' ++ ++" c++ language ++let s:tlist_def_cpp_settings = 'c++;n:namespace;v:variable;d:macro;t:typedef;' . ++ \ 'c:class;g:enum;s:struct;u:union;f:function' ++ ++" c# language ++let s:tlist_def_cs_settings = 'c#;d:macro;t:typedef;n:namespace;c:class;' . ++ \ 'E:event;g:enum;s:struct;i:interface;' . ++ \ 'p:properties;m:method' ++ ++" cobol language ++let s:tlist_def_cobol_settings = 'cobol;d:data;f:file;g:group;p:paragraph;' . ++ \ 'P:program;s:section' ++ ++" eiffel language ++let s:tlist_def_eiffel_settings = 'eiffel;c:class;f:feature' ++ ++" erlang language ++let s:tlist_def_erlang_settings = 'erlang;d:macro;r:record;m:module;f:function' ++ ++" expect (same as tcl) language ++let s:tlist_def_expect_settings = 'tcl;c:class;f:method;p:procedure' ++ ++" fortran language ++let s:tlist_def_fortran_settings = 'fortran;p:program;b:block data;' . ++ \ 'c:common;e:entry;i:interface;k:type;l:label;m:module;' . ++ \ 'n:namelist;t:derived;v:variable;f:function;s:subroutine' ++ ++" HTML language ++let s:tlist_def_html_settings = 'html;a:anchor;f:javascript function' ++ ++" java language ++let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' . ++ \ 'f:field;m:method' ++ ++" javascript language ++let s:tlist_def_javascript_settings = 'javascript;f:function' ++ ++" lisp language ++let s:tlist_def_lisp_settings = 'lisp;f:function' ++ ++" lua language ++let s:tlist_def_lua_settings = 'lua;f:function' ++ ++" makefiles ++let s:tlist_def_make_settings = 'make;m:macro' ++ ++" pascal language ++let s:tlist_def_pascal_settings = 'pascal;f:function;p:procedure' ++ ++" perl language ++let s:tlist_def_perl_settings = 'perl;c:constant;l:label;p:package;s:subroutine' ++ ++" php language ++let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function' ++ ++" python language ++let s:tlist_def_python_settings = 'python;c:class;m:member;f:function' ++ ++" rexx language ++let s:tlist_def_rexx_settings = 'rexx;s:subroutine' ++ ++" ruby language ++let s:tlist_def_ruby_settings = 'ruby;c:class;f:method;F:function;' . ++ \ 'm:singleton method' ++ ++" scheme language ++let s:tlist_def_scheme_settings = 'scheme;s:set;f:function' ++ ++" shell language ++let s:tlist_def_sh_settings = 'sh;f:function' ++ ++" C shell language ++let s:tlist_def_csh_settings = 'sh;f:function' ++ ++" Z shell language ++let s:tlist_def_zsh_settings = 'sh;f:function' ++ ++" slang language ++let s:tlist_def_slang_settings = 'slang;n:namespace;f:function' ++ ++" sml language ++let s:tlist_def_sml_settings = 'sml;e:exception;c:functor;s:signature;' . ++ \ 'r:structure;t:type;v:value;f:function' ++ ++" sql language ++let s:tlist_def_sql_settings = 'sql;c:cursor;F:field;P:package;r:record;' . ++ \ 's:subtype;t:table;T:trigger;v:variable;f:function;p:procedure' ++ ++" tcl language ++let s:tlist_def_tcl_settings = 'tcl;c:class;f:method;m:method;p:procedure' ++ ++" vera language ++let s:tlist_def_vera_settings = 'vera;c:class;d:macro;e:enumerator;' . ++ \ 'f:function;g:enum;m:member;p:program;' . ++ \ 'P:prototype;t:task;T:typedef;v:variable;' . ++ \ 'x:externvar' ++ ++"verilog language ++let s:tlist_def_verilog_settings = 'verilog;m:module;c:constant;P:parameter;' . ++ \ 'e:event;r:register;t:task;w:write;p:port;v:variable;f:function' ++ ++" vim language ++let s:tlist_def_vim_settings = 'vim;a:autocmds;v:variable;f:function' ++ ++" yacc language ++let s:tlist_def_yacc_settings = 'yacc;l:label' ++ ++"------------------- end of language specific options -------------------- ++ ++" Vim window size is changed by the taglist plugin or not ++let s:tlist_winsize_chgd = -1 ++" Taglist window is maximized or not ++let s:tlist_win_maximized = 0 ++" Name of files in the taglist ++let s:tlist_file_names='' ++" Number of files in the taglist ++let s:tlist_file_count = 0 ++" Number of filetypes supported by taglist ++let s:tlist_ftype_count = 0 ++" Is taglist part of other plugins like winmanager or cream? ++let s:tlist_app_name = "none" ++" Are we displaying brief help text ++let s:tlist_brief_help = 1 ++" List of files removed on user request ++let s:tlist_removed_flist = "" ++" Index of current file displayed in the taglist window ++let s:tlist_cur_file_idx = -1 ++" Taglist menu is empty or not ++let s:tlist_menu_empty = 1 ++ ++" An autocommand is used to refresh the taglist window when entering any ++" buffer. We don't want to refresh the taglist window if we are entering the ++" file window from one of the taglist functions. The 'Tlist_Skip_Refresh' ++" variable is used to skip the refresh of the taglist window and is set ++" and cleared appropriately. ++let s:Tlist_Skip_Refresh = 0 ++ ++" 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 ++ call setline('$', ' ') ++ endif ++ ++ if s:tlist_brief_help ++ " Add the brief help ++ call append(0, '" Press to display help text') ++ else ++ " Add the extensive help ++ call append(0, '" : Jump to tag definition') ++ call append(1, '" o : Jump to tag definition in new window') ++ call append(2, '" p : Preview the tag definition') ++ call append(3, '" : Display tag prototype') ++ call append(4, '" u : Update tag list') ++ call append(5, '" s : Select sort field') ++ call append(6, '" d : Remove file from taglist') ++ call append(7, '" x : Zoom-out/Zoom-in taglist window') ++ call append(8, '" + : Open a fold') ++ call append(9, '" - : Close a fold') ++ call append(10, '" * : Open all folds') ++ call append(11, '" = : Close all folds') ++ 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') ++ endif ++endfunction ++ ++" Tlist_Window_Toggle_Help_Text() ++" Toggle taglist plugin help text between the full version and the brief ++" version ++function! s:Tlist_Window_Toggle_Help_Text() ++ if g:Tlist_Compact_Format ++ " In compact display mode, do not display help ++ return ++ endif ++ ++ " Include the empty line displayed after the help text ++ let brief_help_size = 1 ++ let full_help_size = 16 ++ ++ setlocal modifiable ++ ++ " Set report option to a huge value to prevent informational messages ++ " while deleting the lines ++ let old_report = &report ++ set report=99999 ++ ++ " Remove the currently highlighted tag. Otherwise, the help text ++ " might be highlighted by mistake ++ match none ++ ++ " Toggle between brief and full help text ++ if s:tlist_brief_help ++ let s:tlist_brief_help = 0 ++ ++ " Remove the previous help ++ exe '1,' . brief_help_size . ' delete _' ++ ++ " Adjust the start/end line numbers for the files ++ call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) ++ else ++ let s:tlist_brief_help = 1 ++ ++ " Remove the previous help ++ exe '1,' . full_help_size . ' delete _' ++ ++ " Adjust the start/end line numbers for the files ++ call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) ++ endif ++ ++ call s:Tlist_Window_Display_Help() ++ ++ " Restore the report option ++ let &report = old_report ++ ++ setlocal nomodifiable ++endfunction ++ ++" Taglist debug support ++let s:tlist_debug = 0 ++ ++" File for storing the debug messages ++let s:tlist_debug_file = '' ++ ++" Tlist_Debug_Enable ++" Enable logging of taglist debug messages. ++function! s:Tlist_Debug_Enable(...) ++ let s:tlist_debug = 1 ++ ++ " Check whether a valid file name is supplied. ++ if a:1 != '' ++ let s:tlist_debug_file = fnamemodify(a:1, ':p') ++ ++ " Empty the log file ++ exe 'redir! > ' . s:tlist_debug_file ++ redir END ++ ++ " Check whether the log file is present/created ++ if !filewritable(s:tlist_debug_file) ++ call s:Tlist_Warning_Msg('Taglist: Unable to create log file ' ++ \ . s:tlist_debug_file) ++ let s:tlist_debug_file = '' ++ endif ++ endif ++endfunction ++ ++" Tlist_Debug_Disable ++" Disable logging of taglist debug messages. ++function! s:Tlist_Debug_Disable(...) ++ let s:tlist_debug = 0 ++ let s:tlist_debug_file = '' ++endfunction ++ ++" Tlist_Debug_Show ++" Display the taglist debug messages in a new window ++function! s:Tlist_Debug_Show() ++ if s:tlist_msg == '' ++ call s:Tlist_Warning_Msg('Taglist: No debug messages') ++ return ++ endif ++ ++ " Open a new window to display the taglist debug messages ++ new taglist_debug.txt ++ " Delete all the lines (if the buffer already exists) ++ silent! %delete _ ++ " Add the messages ++ silent! put =s:tlist_msg ++ " Move the cursor to the first line ++ normal! gg ++endfunction ++ ++" Tlist_Log_Msg ++" Log the supplied debug message along with the time ++function! s:Tlist_Log_Msg(msg) ++ if s:tlist_debug ++ if s:tlist_debug_file != '' ++ exe 'redir >> ' . s:tlist_debug_file ++ silent echon strftime('%H:%M:%S') . ': ' . a:msg . "\n" ++ redir END ++ else ++ " Log the message into a variable ++ " Retain only the last 3000 characters ++ let len = strlen(s:tlist_msg) ++ if len > 3000 ++ let s:tlist_msg = strpart(s:tlist_msg, len - 3000) ++ endif ++ let s:tlist_msg = s:tlist_msg . strftime('%H:%M:%S') . ': ' . ++ \ a:msg . "\n" ++ endif ++ endif ++endfunction ++ ++" Tlist_Warning_Msg() ++" Display a message using WarningMsg highlight group ++function! s:Tlist_Warning_Msg(msg) ++ echohl WarningMsg ++ echomsg a:msg ++ echohl None ++endfunction ++ ++" Last returned file index for file name lookup. ++" Used to speed up file lookup ++let s:tlist_file_name_idx_cache = -1 ++ ++" Tlist_Get_File_Index() ++" Return the index of the specified filename ++function! s:Tlist_Get_File_Index(fname) ++ if s:tlist_file_count == 0 || a:fname == '' ++ return -1 ++ endif ++ ++ " If the new filename is same as the last accessed filename, then ++ " return that index ++ if s:tlist_file_name_idx_cache != -1 && ++ \ s:tlist_file_name_idx_cache < s:tlist_file_count ++ if s:tlist_{s:tlist_file_name_idx_cache}_filename == a:fname ++ " Same as the last accessed file ++ return s:tlist_file_name_idx_cache ++ endif ++ endif ++ ++ " First, check whether the filename is present ++ let s_fname = a:fname . "\n" ++ let i = stridx(s:tlist_file_names, s_fname) ++ if i == -1 ++ let s:tlist_file_name_idx_cache = -1 ++ return -1 ++ endif ++ ++ " Second, compute the file name index ++ let nl_txt = substitute(strpart(s:tlist_file_names, 0, i), "[^\n]", '', 'g') ++ let s:tlist_file_name_idx_cache = strlen(nl_txt) ++ return s:tlist_file_name_idx_cache ++endfunction ++ ++" Last returned file index for line number lookup. ++" Used to speed up file lookup ++let s:tlist_file_lnum_idx_cache = -1 ++ ++" 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_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 ++ if s:tlist_file_lnum_idx_cache != -1 && ++ \ s:tlist_file_lnum_idx_cache < s:tlist_file_count ++ if a:lnum >= s:tlist_{s:tlist_file_lnum_idx_cache}_start && ++ \ a:lnum <= s:tlist_{s:tlist_file_lnum_idx_cache}_end ++ return s:tlist_file_lnum_idx_cache ++ endif ++ endif ++ ++ let fidx = -1 ++ ++ 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 ++ ++ endif ++ else ++ " 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 ++ ++ return fidx ++endfunction ++ ++" Tlist_Exe_Cmd_No_Acmds ++" Execute the specified Ex command after disabling autocommands ++function! s:Tlist_Exe_Cmd_No_Acmds(cmd) ++ let old_eventignore = &eventignore ++ set eventignore=all ++ exe a:cmd ++ let &eventignore = old_eventignore ++endfunction ++ ++" Tlist_Skip_File() ++" Check whether tag listing is supported for the specified file ++function! s:Tlist_Skip_File(filename, ftype) ++ " Skip buffers with no names and buffers with filetype not set ++ if a:filename == '' || a:ftype == '' ++ return 1 ++ endif ++ ++ " Skip files which are not supported by exuberant ctags ++ " First check whether default settings for this filetype are available. ++ " If it is not available, then check whether user specified settings are ++ " available. If both are not available, then don't list the tags for this ++ " filetype ++ let var = 's:tlist_def_' . a:ftype . '_settings' ++ if !exists(var) ++ let var = 'g:tlist_' . a:ftype . '_settings' ++ if !exists(var) ++ return 1 ++ endif ++ endif ++ ++ " Skip files which are not readable or files which are not yet stored ++ " to the disk ++ if !filereadable(a:filename) ++ return 1 ++ endif ++ ++ return 0 ++endfunction ++ ++" Tlist_User_Removed_File ++" Returns 1 if a file is removed by a user from the taglist ++function! s:Tlist_User_Removed_File(filename) ++ return stridx(s:tlist_removed_flist, a:filename . "\n") != -1 ++endfunction ++ ++" Tlist_Update_Remove_List ++" Update the list of user removed files from the taglist ++" add == 1, add the file to the removed list ++" add == 0, delete the file from the removed list ++function! s:Tlist_Update_Remove_List(filename, add) ++ if a:add ++ let s:tlist_removed_flist = s:tlist_removed_flist . a:filename . "\n" ++ else ++ let idx = stridx(s:tlist_removed_flist, a:filename . "\n") ++ let text_before = strpart(s:tlist_removed_flist, 0, idx) ++ let rem_text = strpart(s:tlist_removed_flist, idx) ++ let next_idx = stridx(rem_text, "\n") ++ let text_after = strpart(rem_text, next_idx + 1) ++ ++ let s:tlist_removed_flist = text_before . text_after ++ endif ++endfunction ++ ++" Tlist_FileType_Init ++" Initialize the ctags arguments and tag variable for the specified ++" file type ++function! s:Tlist_FileType_Init(ftype) ++ call s:Tlist_Log_Msg('Tlist_FileType_Init (' . a:ftype . ')') ++ " If the user didn't specify any settings, then use the default ++ " ctags args. Otherwise, use the settings specified by the user ++ let var = 'g:tlist_' . a:ftype . '_settings' ++ if exists(var) ++ " User specified ctags arguments ++ let settings = {var} . ';' ++ else ++ " Default ctags arguments ++ let var = 's:tlist_def_' . a:ftype . '_settings' ++ if !exists(var) ++ " No default settings for this file type. This filetype is ++ " not supported ++ return 0 ++ endif ++ let settings = s:tlist_def_{a:ftype}_settings . ';' ++ endif ++ ++ let msg = 'Taglist: Invalid ctags option setting - ' . settings ++ ++ " Format of the option that specifies the filetype and ctags arugments: ++ " ++ " ;flag1:name1;flag2:name2;flag3:name3 ++ " ++ ++ " Extract the file type to pass to ctags. This may be different from the ++ " file type detected by Vim ++ let pos = stridx(settings, ';') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let ctags_ftype = strpart(settings, 0, pos) ++ if ctags_ftype == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ " Make sure a valid filetype is supplied. If the user didn't specify a ++ " valid filetype, then the ctags option settings may be treated as the ++ " filetype ++ if ctags_ftype =~ ':' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ ++ " Remove the file type from settings ++ let settings = strpart(settings, pos + 1) ++ if settings == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ ++ " Process all the specified ctags flags. The format is ++ " flag1:name1;flag2:name2;flag3:name3 ++ let ctags_flags = '' ++ let cnt = 0 ++ while settings != '' ++ " Extract the flag ++ let pos = stridx(settings, ':') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let flag = strpart(settings, 0, pos) ++ if flag == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ " Remove the flag from settings ++ let settings = strpart(settings, pos + 1) ++ ++ " Extract the tag type name ++ let pos = stridx(settings, ';') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let name = strpart(settings, 0, pos) ++ if name == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let settings = strpart(settings, pos + 1) ++ ++ let cnt = cnt + 1 ++ ++ let s:tlist_{a:ftype}_{cnt}_name = flag ++ let s:tlist_{a:ftype}_{cnt}_fullname = name ++ let ctags_flags = ctags_flags . flag ++ endwhile ++ ++ let s:tlist_{a:ftype}_ctags_args = '--language-force=' . ctags_ftype . ++ \ ' --' . ctags_ftype . '-types=' . ctags_flags ++ let s:tlist_{a:ftype}_count = cnt ++ let s:tlist_{a:ftype}_ctags_flags = ctags_flags ++ ++ " Save the filetype name ++ let s:tlist_ftype_{s:tlist_ftype_count}_name = a:ftype ++ let s:tlist_ftype_count = s:tlist_ftype_count + 1 ++ ++ return 1 ++endfunction ++ ++" Tlist_Get_Filetype ++" Determine the filetype for the specified file ++function! s:Tlist_Get_Filetype(fname) ++ " Ignore the filetype autocommands ++ let old_eventignore = &eventignore ++ set eventignore=FileType ++ ++ " Save the 'filetype', as this will be changed temporarily ++ let old_filetype = &filetype ++ ++ " Run the filetypedetect group of autocommands to determine ++ " the filetype ++ exe 'doautocmd filetypedetect BufRead ' . a:fname ++ ++ " Save the detected filetype ++ let ftype = &filetype ++ ++ " Restore the previous state ++ let &filetype = old_filetype ++ let &eventignore = old_eventignore ++ ++ return ftype ++endfunction ++ ++" Tlist_Get_Buffer_Filetype ++" Get the filetype for the specified buffer ++function! s:Tlist_Get_Buffer_Filetype(bnum) ++ if bufloaded(a:bnum) ++ " For loaded buffers, the 'filetype' is already determined ++ return getbufvar(a:bnum, '&filetype') ++ endif ++ ++ " For unloaded buffers, if the 'filetype' option is set, return it ++ let ftype = getbufvar(a:bnum, '&filetype') ++ if ftype != '' ++ return ftype ++ endif ++ ++ " Skip non-existent buffers ++ if !bufexists(a:bnum) ++ return '' ++ endif ++ ++ " For buffers whose filetype is not yet determined, try to determine ++ " the filetype ++ let bname = bufname(a:bnum) ++ ++ return s:Tlist_Get_Filetype(bname) ++endfunction ++ ++" Tlist_Discard_TagInfo ++" Discard the stored tag information for a file ++function! s:Tlist_Discard_TagInfo(fidx) ++ call s:Tlist_Log_Msg('Tlist_Discard_TagInfo (' . ++ \ s:tlist_{a:fidx}_filename . ')') ++ let ftype = s:tlist_{a:fidx}_filetype ++ ++ " Discard information about the tags defined in the file ++ let i = 1 ++ while i <= s:tlist_{a:fidx}_tag_count ++ let fidx_i = 's:tlist_' . a:fidx . '_' . i ++ unlet! {fidx_i}_tag ++ unlet! {fidx_i}_tag_name ++ unlet! {fidx_i}_tag_type ++ unlet! {fidx_i}_ttype_idx ++ unlet! {fidx_i}_tag_proto ++ unlet! {fidx_i}_tag_searchpat ++ unlet! {fidx_i}_tag_linenum ++ let i = i + 1 ++ endwhile ++ ++ let s:tlist_{a:fidx}_tag_count = 0 ++ ++ " Discard information about tag type groups ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ if s:tlist_{a:fidx}_{ttype} != '' ++ let fidx_ttype = 's:tlist_' . a:fidx . '_' . ttype ++ let {fidx_ttype} = '' ++ let {fidx_ttype}_offset = 0 ++ let cnt = {fidx_ttype}_count ++ let {fidx_ttype}_count = 0 ++ let j = 1 ++ while j <= cnt ++ unlet! {fidx_ttype}_{j} ++ let j = j + 1 ++ endwhile ++ endif ++ let i = i + 1 ++ endwhile ++ ++ " Discard the stored menu command also ++ let s:tlist_{a:fidx}_menu_cmd = '' ++endfunction ++ ++" 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_Window_Update_Line_Offsets(start_idx, increment, offset) ++ let i = a:start_idx ++ ++ while i < s:tlist_file_count ++ if s:tlist_{i}_visible ++ " Update the start/end line number only if the file is visible ++ if a:increment ++ let s:tlist_{i}_start = s:tlist_{i}_start + a:offset ++ let s:tlist_{i}_end = s:tlist_{i}_end + a:offset ++ else ++ let s:tlist_{i}_start = s:tlist_{i}_start - a:offset ++ let s:tlist_{i}_end = s:tlist_{i}_end - a:offset ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++endfunction ++ ++" Tlist_Discard_FileInfo ++" Discard the stored information for a file ++function! s:Tlist_Discard_FileInfo(fidx) ++ call s:Tlist_Log_Msg('Tlist_Discard_FileInfo (' . ++ \ s:tlist_{a:fidx}_filename . ')') ++ call s:Tlist_Discard_TagInfo(a:fidx) ++ ++ let ftype = s:tlist_{a:fidx}_filetype ++ ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ unlet! s:tlist_{a:fidx}_{ttype} ++ unlet! s:tlist_{a:fidx}_{ttype}_offset ++ unlet! s:tlist_{a:fidx}_{ttype}_count ++ let i = i + 1 ++ endwhile ++ ++ unlet! s:tlist_{a:fidx}_filename ++ unlet! s:tlist_{a:fidx}_sort_type ++ unlet! s:tlist_{a:fidx}_filetype ++ unlet! s:tlist_{a:fidx}_mtime ++ unlet! s:tlist_{a:fidx}_start ++ unlet! s:tlist_{a:fidx}_end ++ unlet! s:tlist_{a:fidx}_valid ++ unlet! s:tlist_{a:fidx}_visible ++ unlet! s:tlist_{a:fidx}_tag_count ++ unlet! s:tlist_{a:fidx}_menu_cmd ++endfunction ++ ++" Tlist_Window_Remove_File_From_Display ++" Remove the specified 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 ++ return ++ endif ++ ++ " Remove the tags displayed for the specified file from the window ++ let start = s:tlist_{a:fidx}_start ++ " Include the empty line after the last line also ++ if g:Tlist_Compact_Format ++ let end = s:tlist_{a:fidx}_end ++ else ++ let end = s:tlist_{a:fidx}_end + 1 ++ endif ++ ++ setlocal modifiable ++ exe 'silent! ' . start . ',' . end . 'delete _' ++ setlocal nomodifiable ++ ++ " 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_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) ++endfunction ++ ++" Tlist_Remove_File ++" Remove the file under the cursor or the specified file index ++" user_request - User requested to remove the file from taglist ++function! s:Tlist_Remove_File(file_idx, user_request) ++ let fidx = a:file_idx ++ ++ if fidx == -1 ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ endif ++ call s:Tlist_Log_Msg('Tlist_Remove_File (' . ++ \ s:tlist_{fidx}_filename . ', ' . a:user_request . ')') ++ ++ let save_winnr = winnr() ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Taglist window is open, remove the file from display ++ ++ if save_winnr != winnum ++ let old_eventignore = &eventignore ++ set eventignore=all ++ exe winnum . 'wincmd w' ++ endif ++ ++ call s:Tlist_Window_Remove_File_From_Display(fidx) ++ ++ if save_winnr != winnum ++ exe save_winnr . 'wincmd w' ++ let &eventignore = old_eventignore ++ endif ++ endif ++ ++ let fname = s:tlist_{fidx}_filename ++ ++ if a:user_request ++ " As the user requested to remove the file from taglist, ++ " add it to the removed list ++ call s:Tlist_Update_Remove_List(fname, 1) ++ endif ++ ++ " Remove the file name from the taglist list of filenames ++ let idx = stridx(s:tlist_file_names, fname . "\n") ++ let text_before = strpart(s:tlist_file_names, 0, idx) ++ let rem_text = strpart(s:tlist_file_names, idx) ++ let next_idx = stridx(rem_text, "\n") ++ let text_after = strpart(rem_text, next_idx + 1) ++ let s:tlist_file_names = text_before . text_after ++ ++ call s:Tlist_Discard_FileInfo(fidx) ++ ++ " Shift all the file variables by one index ++ let i = fidx + 1 ++ ++ while i < s:tlist_file_count ++ let j = i - 1 ++ ++ let s:tlist_{j}_filename = s:tlist_{i}_filename ++ let s:tlist_{j}_sort_type = s:tlist_{i}_sort_type ++ let s:tlist_{j}_filetype = s:tlist_{i}_filetype ++ let s:tlist_{j}_mtime = s:tlist_{i}_mtime ++ let s:tlist_{j}_start = s:tlist_{i}_start ++ let s:tlist_{j}_end = s:tlist_{i}_end ++ let s:tlist_{j}_valid = s:tlist_{i}_valid ++ let s:tlist_{j}_visible = s:tlist_{i}_visible ++ let s:tlist_{j}_tag_count = s:tlist_{i}_tag_count ++ let s:tlist_{j}_menu_cmd = s:tlist_{i}_menu_cmd ++ ++ let k = 1 ++ while k <= s:tlist_{j}_tag_count ++ let s:tlist_{j}_{k}_tag = s:tlist_{i}_{k}_tag ++ let s:tlist_{j}_{k}_tag_name = s:tlist_{i}_{k}_tag_name ++ let s:tlist_{j}_{k}_tag_type = s:Tlist_Get_Tag_Type_By_Tag(i, k) ++ let s:tlist_{j}_{k}_ttype_idx = s:tlist_{i}_{k}_ttype_idx ++ let s:tlist_{j}_{k}_tag_proto = s:Tlist_Get_Tag_Prototype(i, k) ++ let s:tlist_{j}_{k}_tag_searchpat = s:Tlist_Get_Tag_SearchPat(i, k) ++ let s:tlist_{j}_{k}_tag_linenum = s:Tlist_Get_Tag_Linenum(i, k) ++ let k = k + 1 ++ endwhile ++ ++ let ftype = s:tlist_{i}_filetype ++ ++ let k = 1 ++ while k <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{k}_name ++ let s:tlist_{j}_{ttype} = s:tlist_{i}_{ttype} ++ let s:tlist_{j}_{ttype}_offset = s:tlist_{i}_{ttype}_offset ++ let s:tlist_{j}_{ttype}_count = s:tlist_{i}_{ttype}_count ++ if s:tlist_{j}_{ttype} != '' ++ let l = 1 ++ while l <= s:tlist_{j}_{ttype}_count ++ let s:tlist_{j}_{ttype}_{l} = s:tlist_{i}_{ttype}_{l} ++ let l = l + 1 ++ endwhile ++ endif ++ let k = k + 1 ++ endwhile ++ ++ " As the file and tag information is copied to the new index, ++ " discard the previous information ++ call s:Tlist_Discard_FileInfo(i) ++ ++ let i = i + 1 ++ endwhile ++ ++ " Reduce the number of files displayed ++ let s:tlist_file_count = s:tlist_file_count - 1 ++ ++ if g:Tlist_Show_One_File ++ " If the tags for only one file is displayed and if we just ++ " now removed that file, then invalidate the current file idx ++ if s:tlist_cur_file_idx == fidx ++ let s:tlist_cur_file_idx = -1 ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Goto_Window ++" Goto the taglist window ++function! s:Tlist_Window_Goto_Window() ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ if winnr() != winnum ++ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Create ++" Create a new taglist window. If it is already open, jump to it ++function! s:Tlist_Window_Create() ++ call s:Tlist_Log_Msg('Tlist_Window_Create()') ++ " If the window is open, jump to it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Jump to the existing window ++ if winnr() != winnum ++ exe winnum . 'wincmd w' ++ endif ++ return ++ endif ++ ++ " If used with winmanager don't open windows. Winmanager will handle ++ " the window/buffer management ++ if s:tlist_app_name == "winmanager" ++ return ++ endif ++ ++ " Create a new window. If user prefers a horizontal window, then open ++ " a horizontally split window. Otherwise open a vertically split ++ " window ++ if g:Tlist_Use_Horiz_Window ++ " Open a horizontally split window ++ let win_dir = 'botright' ++ " Horizontal window height ++ let win_size = g:Tlist_WinHeight ++ else ++ if s:tlist_winsize_chgd == -1 ++ " Open a vertically split window. Increase the window size, if ++ " needed, to accomodate the new window ++ if g:Tlist_Inc_Winwidth && ++ \ &columns < (80 + g:Tlist_WinWidth) ++ " Save the original window position ++ let s:tlist_pre_winx = getwinposx() ++ let s:tlist_pre_winy = getwinposy() ++ ++ " one extra column is needed to include the vertical split ++ let &columns= &columns + g:Tlist_WinWidth + 1 ++ ++ let s:tlist_winsize_chgd = 1 ++ else ++ let s:tlist_winsize_chgd = 0 ++ endif ++ endif ++ ++ if g:Tlist_Use_Right_Window ++ " Open the window at the rightmost place ++ let win_dir = 'botright vertical' ++ else ++ " Open the window at the leftmost place ++ let win_dir = 'topleft vertical' ++ endif ++ let win_size = g:Tlist_WinWidth ++ endif ++ ++ " If the tag listing temporary buffer already exists, then reuse it. ++ " Otherwise create a new buffer ++ let bufnum = bufnr(g:TagList_title) ++ if bufnum == -1 ++ " Create a new buffer ++ let wcmd = g:TagList_title ++ else ++ " Edit the existing buffer ++ let wcmd = '+buffer' . bufnum ++ endif ++ ++ " Create the taglist window ++ exe 'silent! ' . win_dir . ' ' . win_size . 'split ' . wcmd ++ ++ " Save the new window position ++ let s:tlist_winx = getwinposx() ++ let s:tlist_winy = getwinposy() ++ ++ " Initialize the taglist window ++ call s:Tlist_Window_Init() ++endfunction ++ ++" Tlist_Window_Zoom ++" Zoom (maximize/minimize) the taglist window ++function! s:Tlist_Window_Zoom() ++ if s:tlist_win_maximized ++ " Restore the window back to the previous size ++ if g:Tlist_Use_Horiz_Window ++ exe 'resize ' . g:Tlist_WinHeight ++ else ++ exe 'vert resize ' . g:Tlist_WinWidth ++ endif ++ let s:tlist_win_maximized = 0 ++ else ++ " Set the window size to the maximum possible without closing other ++ " windows ++ if g:Tlist_Use_Horiz_Window ++ resize ++ else ++ vert resize ++ endif ++ let s:tlist_win_maximized = 1 ++ endif ++endfunction ++ ++" Tlist_Ballon_Expr ++" When the mouse cursor is over a tag in the taglist window, display the ++" tag prototype (balloon) ++function! Tlist_Ballon_Expr() ++ " Get the file index ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(v:beval_lnum) ++ if fidx == -1 ++ return '' ++ endif ++ ++ " Get the tag output line for the current tag ++ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, v:beval_lnum) ++ if tidx == 0 ++ return '' ++ endif ++ ++ " Get the tag search pattern and display it ++ return s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Window_Check_Width ++" Check the width of the taglist window. For horizontally split windows, the ++" 'winfixheight' option is used to fix the height of the window. For ++" vertically split windows, Vim doesn't support the 'winfixwidth' option. So ++" need to handle window width changes from this function. ++function! s:Tlist_Window_Check_Width() ++ let tlist_winnr = bufwinnr(g:TagList_title) ++ if tlist_winnr == -1 ++ return ++ endif ++ ++ let width = winwidth(tlist_winnr) ++ if width != g:Tlist_WinWidth ++ call s:Tlist_Log_Msg("Tlist_Window_Check_Width: Changing window " . ++ \ "width from " . width . " to " . g:Tlist_WinWidth) ++ let save_winnr = winnr() ++ if save_winnr != tlist_winnr ++ call s:Tlist_Exe_Cmd_No_Acmds(tlist_winnr . 'wincmd w') ++ endif ++ exe 'vert resize ' . g:Tlist_WinWidth ++ if save_winnr != tlist_winnr ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Exit_Only_Window ++" If the 'Tlist_Exit_OnlyWindow' option is set, then exit Vim if only the ++" taglist window is present. ++function! s:Tlist_Window_Exit_Only_Window() ++ " Before quitting Vim, delete the taglist buffer so that ++ " the '0 mark is correctly set to the previous buffer. ++ if v:version < 700 ++ if winbufnr(2) == -1 ++ bdelete ++ quit ++ endif ++ else ++ if winbufnr(2) == -1 ++ if tabpagenr('$') == 1 ++ " Only one tag page is present ++ bdelete ++ quit ++ else ++ " More than one tab page is present. Close only the current ++ " tab page ++ close ++ endif ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Init ++" Set the default options for the taglist window ++function! s:Tlist_Window_Init() ++ call s:Tlist_Log_Msg('Tlist_Window_Init()') ++ ++ " The 'readonly' option should not be set for the taglist buffer. ++ " If Vim is started as "view/gview" or if the ":view" command is ++ " used, then the 'readonly' option is set for all the buffers. ++ " Unset it for the taglist buffer ++ setlocal noreadonly ++ ++ " Set the taglist buffer filetype to taglist ++ setlocal filetype=taglist ++ ++ " Define taglist window element highlighting ++ syntax match TagListComment '^" .*' ++ syntax match TagListFileName '^[^" ].*$' ++ syntax match TagListTitle '^ \S.*$' ++ syntax match TagListTagScope '\s\[.\{-\}\]$' ++ ++ " Define the highlighting only if colors are supported ++ if has('gui_running') || &t_Co > 2 ++ " 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 default link TagListTagName Search ++ endif ++ " Colors to highlight comments and titles ++ if hlexists('MyTagListComment') ++ highlight link TagListComment MyTagListComment ++ else ++ highlight clear TagListComment ++ highlight default link TagListComment Comment ++ endif ++ if hlexists('MyTagListTitle') ++ highlight link TagListTitle MyTagListTitle ++ else ++ highlight clear TagListTitle ++ highlight default link TagListTitle Title ++ endif ++ if hlexists('MyTagListFileName') ++ highlight link TagListFileName MyTagListFileName ++ else ++ highlight clear TagListFileName ++ highlight default TagListFileName guibg=Grey ctermbg=darkgray ++ \ guifg=white ctermfg=white ++ endif ++ if hlexists('MyTagListTagScope') ++ highlight link TagListTagScope MyTagListTagScope ++ else ++ highlight clear TagListTagScope ++ highlight default link TagListTagScope Identifier ++ endif ++ else ++ highlight default TagListTagName term=reverse cterm=reverse ++ endif ++ ++ " Folding related settings ++ setlocal foldenable ++ setlocal foldminlines=0 ++ setlocal foldmethod=manual ++ setlocal foldlevel=9999 ++ if g:Tlist_Enable_Fold_Column ++ setlocal foldcolumn=3 ++ else ++ setlocal foldcolumn=0 ++ endif ++ setlocal foldtext=v:folddashes.getline(v:foldstart) ++ ++ if s:tlist_app_name != "winmanager" ++ " Mark buffer as scratch ++ silent! setlocal buftype=nofile ++ if s:tlist_app_name == "none" ++ silent! setlocal bufhidden=delete ++ endif ++ silent! setlocal noswapfile ++ " Due to a bug in Vim 6.0, the winbufnr() function fails for unlisted ++ " buffers. So if the taglist buffer is unlisted, multiple taglist ++ " windows will be opened. This bug is fixed in Vim 6.1 and above ++ if v:version >= 601 ++ silent! setlocal nobuflisted ++ endif ++ endif ++ ++ silent! setlocal nowrap ++ ++ " If the 'number' option is set in the source window, it will affect the ++ " taglist window. So forcefully disable 'number' option for the taglist ++ " window ++ silent! setlocal nonumber ++ ++ " Use fixed height when horizontally split window is used ++ if g:Tlist_Use_Horiz_Window ++ if v:version >= 602 ++ set winfixheight ++ endif ++ endif ++ if !g:Tlist_Use_Horiz_Window && v:version >= 700 ++ set winfixwidth ++ endif ++ ++ " Setup balloon evaluation to display tag prototype ++ if v:version >= 700 && has('balloon_eval') ++ setlocal balloonexpr=Tlist_Ballon_Expr() ++ set ballooneval ++ 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_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 ++ nnoremap - :silent! foldclose ++ nnoremap * :silent! %foldopen! ++ nnoremap = :silent! %foldclose ++ nnoremap :silent! foldopen ++ nnoremap :silent! foldclose ++ nnoremap :silent! %foldopen! ++ 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_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_Window_Jump_To_Tag('useopen') ++ " Windows needs return ++ 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 ++ inoremap - :silent! foldclose ++ inoremap * :silent! %foldopen! ++ inoremap = :silent! %foldclose ++ inoremap :silent! foldopen ++ inoremap :silent! foldclose ++ inoremap :silent! %foldopen! ++ inoremap :call ++ \ 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_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 ++ if g:Tlist_Use_SingleClick == 1 ++ " Contributed by Bindu Wavell ++ " attempt to perform single click mapping, it would be much ++ " nicer if we could nnoremap ... however vim does ++ " not fire the when you use the mouse ++ " to enter a buffer. ++ let clickmap = ':if bufname("%") =~ "__Tag_List__" ' . ++ \ 'call Tlist_Window_Jump_To_Tag("useopen") ' . ++ \ ' endif ' ++ if maparg('', 'n') == '' ++ " no mapping for leftmouse ++ exe ':nnoremap ' . clickmap ++ else ++ " we have a mapping ++ let mapcmd = ':nnoremap ' ++ let mapcmd = mapcmd . substitute(substitute( ++ \ maparg('', 'n'), '|', '', 'g'), ++ \ '\c^', '', '') ++ let mapcmd = mapcmd . clickmap ++ exe mapcmd ++ endif ++ endif ++ ++ " Define the taglist autocommands ++ augroup TagListAutoCmds ++ autocmd! ++ " Display the tag prototype for the tag under the cursor. ++ autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info() ++ " Highlight the current tag periodically ++ 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 ++ autocmd BufUnload __Tag_List__ call s:Tlist_Post_Close_Cleanup() ++ " 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('')) ++ endif ++ " Exit Vim itself if only the taglist window is present (optional) ++ if g:Tlist_Exit_OnlyWindow ++ autocmd BufEnter __Tag_List__ nested ++ \ call s:Tlist_Window_Exit_Only_Window() ++ endif ++ if s:tlist_app_name != "winmanager" && ++ \ !g:Tlist_Process_File_Always && ++ \ (!has('gui_running') || !g:Tlist_Show_Menu) ++ " Auto refresh the taglist window ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ ++ if !g:Tlist_Use_Horiz_Window ++ if v:version < 700 ++ autocmd WinEnter * call s:Tlist_Window_Check_Width() ++ endif ++ endif ++ augroup end ++ ++ " Restore the previous cpoptions settings ++ let &cpoptions = old_cpoptions ++endfunction ++ ++" Tlist_Window_Refresh ++" Display the tags for all the files in the taglist window ++function! s:Tlist_Window_Refresh() ++ call s:Tlist_Log_Msg('Tlist_Window_Refresh()') ++ " Set report option to a huge value to prevent informational messages ++ " while deleting the lines ++ let old_report = &report ++ set report=99999 ++ ++ " Mark the buffer as modifiable ++ setlocal modifiable ++ ++ " Delete the contents of the buffer to the black-hole register ++ silent! %delete _ ++ ++ " As we have cleared the taglist window, mark all the files ++ " as not visible ++ let i = 0 ++ while i < s:tlist_file_count ++ let s:tlist_{i}_visible = 0 ++ let i = i + 1 ++ endwhile ++ ++ if g:Tlist_Compact_Format == 0 ++ " Display help in non-compact mode ++ call s:Tlist_Window_Display_Help() ++ endif ++ ++ " Mark the buffer as not modifiable ++ setlocal nomodifiable ++ ++ " Restore the report option ++ let &report = old_report ++ ++ " If the tags for only one file should be displayed in the taglist ++ " window, then no need to add the tags here. The bufenter autocommand ++ " will add the tags for that file. ++ if g:Tlist_Show_One_File ++ return ++ endif ++ ++ " List all the tags for the previously processed files ++ " Do this only if taglist is configured to display tags for more than ++ " one file. Otherwise, when Tlist_Show_One_File is configured, ++ " tags for the wrong file will be displayed. ++ let i = 0 ++ while i < s:tlist_file_count ++ call s:Tlist_Window_Refresh_File(s:tlist_{i}_filename, ++ \ s:tlist_{i}_filetype) ++ let i = i + 1 ++ endwhile ++ ++ if g:Tlist_Auto_Update ++ " Add and list the tags for all buffers in the Vim buffer list ++ let i = 1 ++ let last_bufnum = bufnr('$') ++ while i <= last_bufnum ++ if buflisted(i) ++ let fname = fnamemodify(bufname(i), ':p') ++ let ftype = s:Tlist_Get_Buffer_Filetype(i) ++ " If the file doesn't support tag listing, skip it ++ if !s:Tlist_Skip_File(fname, ftype) ++ call s:Tlist_Window_Refresh_File(fname, ftype) ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++ endif ++ ++ " If Tlist_File_Fold_Auto_Close option is set, then close all the folds ++ if g:Tlist_File_Fold_Auto_Close ++ " Close all the folds ++ silent! %foldclose ++ endif ++ ++ " Move the cursor to the top of the taglist window ++ normal! gg ++endfunction ++ ++" Tlist_Post_Close_Cleanup() ++" Close the taglist window and adjust the Vim window width ++function! s:Tlist_Post_Close_Cleanup() ++ call s:Tlist_Log_Msg('Tlist_Post_Close_Cleanup()') ++ " Mark all the files as not visible ++ let i = 0 ++ while i < s:tlist_file_count ++ let s:tlist_{i}_visible = 0 ++ let i = i + 1 ++ endwhile ++ ++ " Remove the taglist autocommands ++ silent! autocmd! TagListAutoCmds ++ ++ " Clear all the highlights ++ match none ++ ++ silent! syntax clear TagListTitle ++ silent! syntax clear TagListComment ++ silent! syntax clear TagListTagScope ++ ++ " Remove the left mouse click mapping if it was setup initially ++ if g:Tlist_Use_SingleClick ++ if hasmapto('') ++ nunmap ++ endif ++ endif ++ ++ if s:tlist_app_name != "winmanager" ++ if g:Tlist_Use_Horiz_Window || g:Tlist_Inc_Winwidth == 0 || ++ \ s:tlist_winsize_chgd != 1 || ++ \ &columns < (80 + g:Tlist_WinWidth) ++ " No need to adjust window width if using horizontally split taglist ++ " window or if columns is less than 101 or if the user chose not to ++ " adjust the window width ++ else ++ " If the user didn't manually move the window, then restore the window ++ " position to the pre-taglist position ++ if s:tlist_pre_winx != -1 && s:tlist_pre_winy != -1 && ++ \ getwinposx() == s:tlist_winx && ++ \ getwinposy() == s:tlist_winy ++ exe 'winpos ' . s:tlist_pre_winx . ' ' . s:tlist_pre_winy ++ endif ++ ++ " Adjust the Vim window width ++ let &columns= &columns - (g:Tlist_WinWidth + 1) ++ endif ++ endif ++ ++ let s:tlist_winsize_chgd = -1 ++ ++ " Reset taglist state variables ++ if s:tlist_app_name == "winmanager" ++ let s:tlist_app_name = "none" ++ endif ++ let s:tlist_window_initialized = 0 ++endfunction ++ ++" Tlist_Window_Refresh_File() ++" List the tags defined in the specified file in a Vim window ++function! s:Tlist_Window_Refresh_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Window_Refresh_File (' . a:filename . ')') ++ " First check whether the file already exists ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx != -1 ++ let file_listed = 1 ++ else ++ let file_listed = 0 ++ endif ++ ++ if !file_listed ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(a:filename) ++ return ++ endif ++ endif ++ ++ if file_listed && s:tlist_{fidx}_visible ++ " Check whether the file tags are currently valid ++ if s:tlist_{fidx}_valid ++ " Goto the first line in the file ++ exe s:tlist_{fidx}_start ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ endif ++ return ++ endif ++ ++ " Discard and remove the tags for this file from display ++ call s:Tlist_Discard_TagInfo(fidx) ++ call s:Tlist_Window_Remove_File_From_Display(fidx) ++ endif ++ ++ " Process and generate a list of tags defined in the file ++ if !file_listed || !s:tlist_{fidx}_valid ++ let ret_fidx = s:Tlist_Process_File(a:filename, a:ftype) ++ if ret_fidx == -1 ++ return ++ endif ++ let fidx = ret_fidx ++ endif ++ ++ " Set report option to a huge value to prevent informational messages ++ " while adding lines to the taglist window ++ let old_report = &report ++ set report=99999 ++ ++ if g:Tlist_Show_One_File ++ " Remove the previous file ++ if s:tlist_cur_file_idx != -1 ++ 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 ++ endif ++ let s:tlist_cur_file_idx = fidx ++ endif ++ ++ " Mark the buffer as modifiable ++ setlocal modifiable ++ ++ " Add new files to the end of the window. For existing files, add them at ++ " the same line where they were previously present. If the file is not ++ " visible, then add it at the end ++ if s:tlist_{fidx}_start == 0 || !s:tlist_{fidx}_visible ++ if g:Tlist_Compact_Format ++ let s:tlist_{fidx}_start = line('$') ++ else ++ let s:tlist_{fidx}_start = line('$') + 1 ++ endif ++ endif ++ ++ let s:tlist_{fidx}_visible = 1 ++ ++ " Goto the line where this file should be placed ++ if g:Tlist_Compact_Format ++ exe s:tlist_{fidx}_start ++ else ++ exe s:tlist_{fidx}_start - 1 ++ endif ++ ++ let txt = fnamemodify(s:tlist_{fidx}_filename, ':t') . ' (' . ++ \ fnamemodify(s:tlist_{fidx}_filename, ':p:h') . ')' ++ if g:Tlist_Compact_Format == 0 ++ silent! put =txt ++ else ++ silent! put! =txt ++ " Move to the next line ++ exe line('.') + 1 ++ endif ++ let file_start = s:tlist_{fidx}_start ++ ++ " Add the tag names grouped by tag type to the buffer with a title ++ let i = 1 ++ let ttype_cnt = s:tlist_{a:ftype}_count ++ while i <= ttype_cnt ++ let ttype = s:tlist_{a:ftype}_{i}_name ++ " Add the tag type only if there are tags for that type ++ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype ++ let ttype_txt = {fidx_ttype} ++ if ttype_txt != '' ++ let txt = ' ' . s:tlist_{a:ftype}_{i}_fullname ++ if g:Tlist_Compact_Format == 0 ++ let ttype_start_lnum = line('.') + 1 ++ silent! put =txt ++ else ++ let ttype_start_lnum = line('.') ++ silent! put! =txt ++ endif ++ silent! put =ttype_txt ++ ++ let {fidx_ttype}_offset = ttype_start_lnum - file_start ++ ++ " create a fold for this tag type ++ let fold_start = ttype_start_lnum ++ let fold_end = fold_start + {fidx_ttype}_count ++ exe fold_start . ',' . fold_end . 'fold' ++ ++ " Adjust the cursor position ++ if g:Tlist_Compact_Format == 0 ++ exe ttype_start_lnum + {fidx_ttype}_count ++ else ++ exe ttype_start_lnum + {fidx_ttype}_count + 1 ++ endif ++ ++ if g:Tlist_Compact_Format == 0 ++ " Separate the tag types by a empty line ++ silent! put ='' ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++ ++ if s:tlist_{fidx}_tag_count == 0 ++ if g:Tlist_Compact_Format == 0 ++ silent! put ='' ++ endif ++ endif ++ ++ let s:tlist_{fidx}_end = line('.') - 1 ++ ++ " Create a fold for the entire file ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' ++ exe 'silent! ' . s:tlist_{fidx}_start . ',' . ++ \ s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Goto the starting line for this file, ++ exe s:tlist_{fidx}_start ++ ++ if s:tlist_app_name == "winmanager" ++ " To handle a bug in the winmanager plugin, add a space at the ++ " last line ++ call setline('$', ' ') ++ endif ++ ++ " Mark the buffer as not modifiable ++ setlocal nomodifiable ++ ++ " Restore the report option ++ let &report = old_report ++ ++ " Update the start and end line numbers for all the files following this ++ " file ++ let start = s:tlist_{fidx}_start ++ " include the empty line after the last line ++ if g:Tlist_Compact_Format ++ let end = s:tlist_{fidx}_end ++ else ++ let end = s:tlist_{fidx}_end + 1 ++ endif ++ 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) ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(1) ++ endif ++endfunction ++ ++" Tlist_Init_File ++" Initialize the variables for a new file ++function! s:Tlist_Init_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Init_File (' . a:filename . ')') ++ " Add new files at the end of the list ++ let fidx = s:tlist_file_count ++ let s:tlist_file_count = s:tlist_file_count + 1 ++ " Add the new file name to the taglist list of file names ++ let s:tlist_file_names = s:tlist_file_names . a:filename . "\n" ++ ++ " Initialize the file variables ++ let s:tlist_{fidx}_filename = a:filename ++ let s:tlist_{fidx}_sort_type = g:Tlist_Sort_Type ++ let s:tlist_{fidx}_filetype = a:ftype ++ let s:tlist_{fidx}_mtime = -1 ++ let s:tlist_{fidx}_start = 0 ++ let s:tlist_{fidx}_end = 0 ++ let s:tlist_{fidx}_valid = 0 ++ let s:tlist_{fidx}_visible = 0 ++ let s:tlist_{fidx}_tag_count = 0 ++ let s:tlist_{fidx}_menu_cmd = '' ++ ++ " Initialize the tag type variables ++ let i = 1 ++ while i <= s:tlist_{a:ftype}_count ++ let ttype = s:tlist_{a:ftype}_{i}_name ++ let s:tlist_{fidx}_{ttype} = '' ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = 0 ++ let i = i + 1 ++ endwhile ++ ++ return fidx ++endfunction ++ ++" Tlist_Get_Tag_Type_By_Tag ++" Return the tag type for the specified tag index ++function! s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) ++ let ttype_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_type' ++ ++ " Already parsed and have the tag name ++ if exists(ttype_var) ++ return {ttype_var} ++ endif ++ ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let {ttype_var} = s:Tlist_Extract_Tagtype(tag_line) ++ ++ return {ttype_var} ++endfunction ++ ++" Tlist_Get_Tag_Prototype ++function! s:Tlist_Get_Tag_Prototype(fidx, tidx) ++ let tproto_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_proto' ++ ++ " Already parsed and have the tag prototype ++ if exists(tproto_var) ++ return {tproto_var} ++ endif ++ ++ " Parse and extract the tag prototype ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = stridx(tag_line, '/^') + 2 ++ let end = stridx(tag_line, '/;"' . "\t") ++ if tag_line[end - 1] == '$' ++ let end = end -1 ++ endif ++ let tag_proto = strpart(tag_line, start, end - start) ++ let {tproto_var} = substitute(tag_proto, '\s*', '', '') ++ ++ return {tproto_var} ++endfunction ++ ++" Tlist_Get_Tag_SearchPat ++function! s:Tlist_Get_Tag_SearchPat(fidx, tidx) ++ let tpat_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_searchpat' ++ ++ " Already parsed and have the tag search pattern ++ if exists(tpat_var) ++ return {tpat_var} ++ endif ++ ++ " Parse and extract the tag search pattern ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = stridx(tag_line, '/^') + 2 ++ let end = stridx(tag_line, '/;"' . "\t") ++ if tag_line[end - 1] == '$' ++ let end = end -1 ++ endif ++ let {tpat_var} = '\V\^' . strpart(tag_line, start, end - start) . ++ \ (tag_line[end] == '$' ? '\$' : '') ++ ++ return {tpat_var} ++endfunction ++ ++" Tlist_Get_Tag_Linenum ++" Return the tag line number, given the tag index ++function! s:Tlist_Get_Tag_Linenum(fidx, tidx) ++ let tline_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_linenum' ++ ++ " Already parsed and have the tag line number ++ if exists(tline_var) ++ return {tline_var} ++ endif ++ ++ " Parse and extract the tag line number ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = strridx(tag_line, 'line:') + 5 ++ let end = strridx(tag_line, "\t") ++ if end < start ++ let {tline_var} = strpart(tag_line, start) + 0 ++ else ++ let {tline_var} = strpart(tag_line, start, end - start) + 0 ++ endif ++ ++ return {tline_var} ++endfunction ++ ++" Tlist_Parse_Tagline ++" Parse a tag line from the ctags output. Separate the tag output based on the ++" tag type and store it in the tag type variable. ++" The format of each line in the ctags output is: ++" ++" tag_namefile_nameex_cmd;"extension_fields ++" ++function! s:Tlist_Parse_Tagline(tag_line) ++ if a:tag_line == '' ++ " Skip empty lines ++ return ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Extract_Tagtype(a:tag_line) ++ ++ " 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 ++ ++ " Update the total tag count ++ let s:tidx = s:tidx + 1 ++ ++ " The following variables are used to optimize this code. Vim is slow in ++ " using curly brace names. To reduce the amount of processing needed, the ++ " curly brace variables are pre-processed here ++ let fidx_tidx = 's:tlist_' . s:fidx . '_' . s:tidx ++ let fidx_ttype = 's:tlist_' . s:fidx . '_' . ttype ++ ++ " Update the count of this tag type ++ let ttype_idx = {fidx_ttype}_count + 1 ++ let {fidx_ttype}_count = ttype_idx ++ ++ " Store the ctags output for this tag ++ let {fidx_tidx}_tag = a:tag_line ++ ++ " Store the tag index and the tag type index (back pointers) ++ let {fidx_ttype}_{ttype_idx} = s:tidx ++ let {fidx_tidx}_ttype_idx = ttype_idx ++ ++ " Extract the tag name ++ let tag_name = strpart(a:tag_line, 0, stridx(a:tag_line, "\t")) ++ ++ " Extract the tag scope/prototype ++ if g:Tlist_Display_Prototype ++ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(s:fidx, s:tidx) ++ else ++ let ttxt = ' ' . tag_name ++ ++ " Add the tag scope, if it is available and is configured. Tag ++ " scope is the last field after the 'line:\t' field ++ if g:Tlist_Display_Tag_Scope ++ let tag_scope = s:Tlist_Extract_Tag_Scope(a:tag_line) ++ if tag_scope != '' ++ let ttxt = ttxt . ' [' . tag_scope . ']' ++ endif ++ endif ++ endif ++ ++ " Add this tag to the tag type variable ++ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" ++ ++ " Save the tag name ++ let {fidx_tidx}_tag_name = tag_name ++endfunction ++ ++" Tlist_Process_File ++" Get the list of tags defined in the specified file and store them ++" in Vim variables. Returns the file index where the tags are stored. ++function! s:Tlist_Process_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Process_File (' . a:filename . ', ' . ++ \ a:ftype . ')') ++ " Check whether this file is supported ++ if s:Tlist_Skip_File(a:filename, a:ftype) ++ return -1 ++ endif ++ ++ " If the tag types for this filetype are not yet created, then create ++ " them now ++ let var = 's:tlist_' . a:ftype . '_count' ++ if !exists(var) ++ if s:Tlist_FileType_Init(a:ftype) == 0 ++ return -1 ++ endif ++ endif ++ ++ " If this file is already processed, then use the cached values ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ " First time, this file is loaded ++ let fidx = s:Tlist_Init_File(a:filename, a:ftype) ++ else ++ " File was previously processed. Discard the tag information ++ call s:Tlist_Discard_TagInfo(fidx) ++ endif ++ ++ let s:tlist_{fidx}_valid = 1 ++ ++ " Exuberant ctags arguments to generate a tag list ++ let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nks ' ++ ++ " Form the ctags argument depending on the sort type ++ if s:tlist_{fidx}_sort_type == 'name' ++ let ctags_args = ctags_args . '--sort=yes' ++ else ++ let ctags_args = ctags_args . '--sort=no' ++ endif ++ ++ " Add the filetype specific arguments ++ let ctags_args = ctags_args . ' ' . s:tlist_{a:ftype}_ctags_args ++ ++ " Ctags command to produce output with regexp for locating the tags ++ let ctags_cmd = g:Tlist_Ctags_Cmd . ctags_args ++ let ctags_cmd = ctags_cmd . ' "' . a:filename . '"' ++ ++ if &shellxquote == '"' ++ " Double-quotes within double-quotes will not work in the ++ " command-line.If the 'shellxquote' option is set to double-quotes, ++ " then escape the double-quotes in the ctags command-line. ++ let ctags_cmd = escape(ctags_cmd, '"') ++ endif ++ ++ " In Windows 95, if not using cygwin, disable the 'shellslash' ++ " option. Otherwise, this will cause problems when running the ++ " ctags command. ++ if has('win95') && !has('win32unix') ++ let old_shellslash = &shellslash ++ set noshellslash ++ endif ++ ++ if has('win32') && !has('win32unix') && !has('win95') ++ \ && (&shell =~ 'cmd.exe') ++ " Windows does not correctly deal with commands that have more than 1 ++ " set of double quotes. It will strip them all resulting in: ++ " 'C:\Program' is not recognized as an internal or external command ++ " operable program or batch file. To work around this, place the ++ " command inside a batch file and call the batch file. ++ " Do this only on Win2K, WinXP and above. ++ " Contributed by: David Fishburn. ++ let s:taglist_tempfile = fnamemodify(tempname(), ':h') . ++ \ '\taglist.cmd' ++ exe 'redir! > ' . s:taglist_tempfile ++ silent echo ctags_cmd ++ redir END ++ ++ call s:Tlist_Log_Msg('Cmd inside batch file: ' . ctags_cmd) ++ let ctags_cmd = '"' . s:taglist_tempfile . '"' ++ endif ++ ++ call s:Tlist_Log_Msg('Cmd: ' . ctags_cmd) ++ ++ " Run ctags and get the tag list ++ let cmd_output = system(ctags_cmd) ++ ++ " Restore the value of the 'shellslash' option. ++ if has('win95') && !has('win32unix') ++ let &shellslash = old_shellslash ++ endif ++ ++ if exists('s:taglist_tempfile') ++ " Delete the temporary cmd file created on MS-Windows ++ call delete(s:taglist_tempfile) ++ endif ++ ++ " Handle errors ++ if v:shell_error ++ let msg = "Taglist: Failed to generate tags for " . a:filename ++ call s:Tlist_Warning_Msg(msg) ++ if cmd_output != '' ++ call s:Tlist_Warning_Msg(cmd_output) ++ endif ++ return fidx ++ endif ++ ++ " Store the modification time for the file ++ let s:tlist_{fidx}_mtime = getftime(a:filename) ++ ++ " No tags for current file ++ if cmd_output == '' ++ call s:Tlist_Log_Msg('No tags defined in ' . a:filename) ++ return fidx ++ endif ++ ++ call s:Tlist_Log_Msg('Generated tags information for ' . a:filename) ++ ++ if v:version > 601 ++ " The following script local variables are used by the ++ " Tlist_Parse_Tagline() function. ++ let s:ctags_flags = s:tlist_{a:ftype}_ctags_flags ++ let s:fidx = fidx ++ let s:tidx = 0 ++ ++ " Process the ctags output one line at a time. The substitute() ++ " command is used to parse the tag lines instead of using the ++ " matchstr()/stridx()/strpart() functions for performance reason ++ call substitute(cmd_output, "\\([^\n]\\+\\)\n", ++ \ '\=s:Tlist_Parse_Tagline(submatch(1))', 'g') ++ ++ " Save the number of tags for this file ++ let s:tlist_{fidx}_tag_count = s:tidx ++ ++ " The following script local variables are no longer needed ++ unlet! s:ctags_flags ++ unlet! s:tidx ++ unlet! s:fidx ++ else ++ " Due to a bug in Vim earlier than version 6.1, ++ " we cannot use substitute() to parse the ctags output. ++ " Instead the slow str*() functions are used ++ let ctags_flags = s:tlist_{a:ftype}_ctags_flags ++ let tidx = 0 ++ ++ while cmd_output != '' ++ " Extract one line at a time ++ let idx = stridx(cmd_output, "\n") ++ let one_line = strpart(cmd_output, 0, idx) ++ " Remove the line from the tags output ++ let cmd_output = strpart(cmd_output, idx + 1) ++ ++ if one_line == '' ++ " Line is not in proper tags format ++ continue ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Extract_Tagtype(one_line) ++ ++ " Make sure the tag type is a valid and supported one ++ if ttype == '' || stridx(ctags_flags, ttype) == -1 ++ " Line is not in proper tags format or Tag type is not ++ " supported ++ continue ++ endif ++ ++ " Update the total tag count ++ let tidx = tidx + 1 ++ ++ " The following variables are used to optimize this code. Vim is ++ " slow in using curly brace names. To reduce the amount of ++ " processing needed, the curly brace variables are pre-processed ++ " here ++ let fidx_tidx = 's:tlist_' . fidx . '_' . tidx ++ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype ++ ++ " Update the count of this tag type ++ let ttype_idx = {fidx_ttype}_count + 1 ++ let {fidx_ttype}_count = ttype_idx ++ ++ " Store the ctags output for this tag ++ let {fidx_tidx}_tag = one_line ++ ++ " Store the tag index and the tag type index (back pointers) ++ let {fidx_ttype}_{ttype_idx} = tidx ++ let {fidx_tidx}_ttype_idx = ttype_idx ++ ++ " Extract the tag name ++ let tag_name = strpart(one_line, 0, stridx(one_line, "\t")) ++ ++ " Extract the tag scope/prototype ++ if g:Tlist_Display_Prototype ++ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(fidx, tidx) ++ else ++ let ttxt = ' ' . tag_name ++ ++ " Add the tag scope, if it is available and is configured. Tag ++ " scope is the last field after the 'line:\t' field ++ if g:Tlist_Display_Tag_Scope ++ let tag_scope = s:Tlist_Extract_Tag_Scope(one_line) ++ if tag_scope != '' ++ let ttxt = ttxt . ' [' . tag_scope . ']' ++ endif ++ endif ++ endif ++ ++ " Add this tag to the tag type variable ++ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" ++ ++ " Save the tag name ++ let {fidx_tidx}_tag_name = tag_name ++ endwhile ++ ++ " Save the number of tags for this file ++ let s:tlist_{fidx}_tag_count = tidx ++ endif ++ ++ call s:Tlist_Log_Msg('Processed ' . s:tlist_{fidx}_tag_count . ++ \ ' tags in ' . a:filename) ++ ++ return fidx ++endfunction ++ ++" Tlist_Update_File ++" Update the tags for a file (if needed) ++function! Tlist_Update_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Update_File (' . a:filename . ')') ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(a:filename, a:ftype) ++ return ++ endif ++ ++ " Convert the file name to a full path ++ let fname = fnamemodify(a:filename, ':p') ++ ++ " First check whether the file already exists ++ let fidx = s:Tlist_Get_File_Index(fname) ++ ++ if fidx != -1 && s:tlist_{fidx}_valid ++ " File exists and the tags are valid ++ " Check whether the file was modified after the last tags update ++ " If it is modified, then update the tags ++ if s:tlist_{fidx}_mtime == getftime(fname) ++ return ++ endif ++ else ++ " If the tags were removed previously based on a user request, ++ " as we are going to update the tags (based on the user request), ++ " remove the filename from the deleted list ++ call s:Tlist_Update_Remove_List(fname, 0) ++ endif ++ ++ " If the taglist window is opened, update it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum == -1 ++ " Taglist window is not present. Just update the taglist ++ " and return ++ call s:Tlist_Process_File(fname, a:ftype) ++ else ++ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != -1 ++ " If tags for only one file are displayed and we are not ++ " updating the tags for that file, then no need to ++ " refresh the taglist window. Otherwise, the taglist ++ " window should be updated. ++ if s:tlist_{s:tlist_cur_file_idx}_filename != fname ++ call s:Tlist_Process_File(fname, a:ftype) ++ return ++ endif ++ endif ++ ++ " Save the current window number ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ " Save the cursor position ++ let save_line = line('.') ++ let save_col = col('.') ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(fname, a:ftype) ++ ++ " Restore the cursor position ++ if v:version >= 601 ++ call cursor(save_line, save_col) ++ else ++ exe save_line ++ exe 'normal! ' . save_col . '|' ++ endif ++ ++ if winnr() != save_winnr ++ " Go back to the original window ++ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') ++ endif ++ endif ++ ++ " Update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(1) ++ endif ++endfunction ++ ++" Tlist_Window_Close ++" Close the taglist window ++function! s:Tlist_Window_Close() ++ call s:Tlist_Log_Msg('Tlist_Window_Close()') ++ " Make sure the taglist window exists ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum == -1 ++ call s:Tlist_Warning_Msg('Error: Taglist window is not open') ++ return ++ endif ++ ++ if winnr() == winnum ++ " Already in the taglist window. Close it and return ++ if winbufnr(2) != -1 ++ " If a window other than the taglist window is open, ++ " then only close the taglist window. ++ close ++ endif ++ else ++ " Goto the taglist window, close it and then come back to the ++ " original window ++ let curbufnr = bufnr('%') ++ exe winnum . '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 ++endfunction ++ ++" Tlist_Window_Mark_File_Window ++" Mark the current window as the file window to use when jumping to a tag. ++" Only if the current window is a non-plugin, non-preview and non-taglist ++" window ++function! s:Tlist_Window_Mark_File_Window() ++ if getbufvar('%', '&buftype') == '' && !&previewwindow ++ let w:tlist_file_window = "yes" ++ endif ++endfunction ++ ++" Tlist_Window_Open ++" Open and refresh the taglist window ++function! s:Tlist_Window_Open() ++ call s:Tlist_Log_Msg('Tlist_Window_Open()') ++ " If the window is open, jump to it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Jump to the existing window ++ if winnr() != winnum ++ exe winnum . 'wincmd w' ++ endif ++ return ++ endif ++ ++ if s:tlist_app_name == "winmanager" ++ " Taglist plugin is no longer part of the winmanager app ++ let s:tlist_app_name = "none" ++ endif ++ ++ " Get the filename and filetype for the specified buffer ++ let curbuf_name = fnamemodify(bufname('%'), ':p') ++ let curbuf_ftype = getbufvar('%', '&filetype') ++ let cur_lnum = line('.') ++ ++ " Mark the current window as the desired window to open a file when a tag ++ " is selected. ++ call s:Tlist_Window_Mark_File_Window() ++ ++ " Open the taglist window ++ call s:Tlist_Window_Create() ++ ++ call s:Tlist_Window_Refresh() ++ ++ if g:Tlist_Show_One_File ++ " Add only the current buffer and file ++ " ++ " If the file doesn't support tag listing, skip it ++ if !s:Tlist_Skip_File(curbuf_name, curbuf_ftype) ++ call s:Tlist_Window_Refresh_File(curbuf_name, curbuf_ftype) ++ endif ++ endif ++ ++ if g:Tlist_File_Fold_Auto_Close ++ " Open the fold for the current file, as all the folds in ++ " the taglist window are closed ++ let fidx = s:Tlist_Get_File_Index(curbuf_name) ++ if fidx != -1 ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ endif ++ endif ++ ++ " Highlight the current tag ++ call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) ++endfunction ++ ++" Tlist_Window_Toggle() ++" Open or close a taglist window ++function! s:Tlist_Window_Toggle() ++ call s:Tlist_Log_Msg('Tlist_Window_Toggle()') ++ " If taglist window is open then close it. ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ call s:Tlist_Window_Close() ++ return ++ endif ++ ++ call s:Tlist_Window_Open() ++ ++ " 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 ++ call s:Tlist_Menu_Update_File(0) ++ endif ++endfunction ++ ++" 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 ++ ++ " 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 ++ ++ " 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) ++ ++ let all_files = strpart(all_files, nl_idx + 1) ++ if one_file == '' ++ continue ++ endif ++ ++ " Skip non-directory names ++ if !isdirectory(one_file) ++ continue ++ endif ++ ++ 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 ++" Add files recursively from a directory ++function! s:Tlist_Add_Files_Recursive(dir, ...) ++ let dir_name = fnamemodify(a:dir, ':p') ++ if !isdirectory(dir_name) ++ call s:Tlist_Warning_Msg('Error: ' . dir_name . ' is not a directory') ++ return ++ endif ++ ++ if a:0 == 1 ++ " User specified file pattern ++ let pat = a:1 ++ else ++ " Default file pattern ++ let pat = '*' ++ endif ++ ++ echon "\r " ++ echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t') ++ let fcnt = s:Tlist_Process_Dir(dir_name, pat) ++ ++ echon "\rAdded " . fcnt . " files to the taglist" ++endfunction ++ ++" Tlist_Add_Files ++" Add the specified list of files to the taglist ++function! s:Tlist_Add_Files(...) ++ let flist = '' ++ let i = 1 ++ ++ " Get all the files matching the file patterns supplied as argument ++ while i <= a:0 ++ let flist = flist . glob(a:{i}) . "\n" ++ let i = i + 1 ++ endwhile ++ ++ if flist == '' ++ call s:Tlist_Warning_Msg('Error: No matching files are found') ++ return ++ endif ++ ++ let fcnt = s:Tlist_Process_Filelist(flist) ++ echon "\rAdded " . fcnt . " files to the taglist" ++endfunction ++ ++" Tlist_Extract_Tagtype ++" Extract the tag type from the tag text ++function! s:Tlist_Extract_Tagtype(tag_line) ++ " The tag type is after the tag prototype field. The prototype field ++ " ends with the /;"\t string. We add 4 at the end to skip the characters ++ " in this special string.. ++ let start = strridx(a:tag_line, '/;"' . "\t") + 4 ++ let end = strridx(a:tag_line, 'line:') - 1 ++ let ttype = strpart(a:tag_line, start, end - start) ++ ++ return ttype ++endfunction ++ ++" Tlist_Extract_Tag_Scope ++" Extract the tag scope from the tag text ++function! s:Tlist_Extract_Tag_Scope(tag_line) ++ let start = strridx(a:tag_line, 'line:') ++ let end = strridx(a:tag_line, "\t") ++ if end <= start ++ return '' ++ endif ++ ++ let tag_scope = strpart(a:tag_line, end + 1) ++ let tag_scope = strpart(tag_scope, stridx(tag_scope, ':') + 1) ++ ++ return tag_scope ++endfunction ++ ++" Tlist_Refresh() ++" Refresh the taglist ++function! s:Tlist_Refresh() ++ call s:Tlist_Log_Msg('Tlist_Refresh (Skip_Refresh = ' . ++ \ s:Tlist_Skip_Refresh . ', ' . bufname('%') . ')') ++ " If we are entering the buffer from one of the taglist functions, then ++ " no need to refresh the taglist window again. ++ if s:Tlist_Skip_Refresh ++ " We still need to update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(0) ++ endif ++ return ++ endif ++ ++ " If part of the winmanager plugin and not configured to process ++ " tags always and not configured to display the tags menu, then return ++ if (s:tlist_app_name == 'winmanager') && !g:Tlist_Process_File_Always ++ \ && !g:Tlist_Show_Menu ++ return ++ endif ++ ++ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help ++ if &buftype != '' ++ return ++ endif ++ ++ let filename = fnamemodify(bufname('%'), ':p') ++ let ftype = &filetype ++ ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(filename, ftype) ++ return ++ endif ++ ++ let tlist_win = bufwinnr(g:TagList_title) ++ ++ " If the taglist window is not opened and not configured to process ++ " tags always and not displaying the tags menu, then return ++ if tlist_win == -1 && !g:Tlist_Process_File_Always && !g:Tlist_Show_Menu ++ return ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(filename) ++ return ++ endif ++ ++ " If the taglist should not be auto updated, then return ++ if !g:Tlist_Auto_Update ++ return ++ endif ++ endif ++ ++ let cur_lnum = line('.') ++ ++ if fidx == -1 ++ " Update the tags for the file ++ let fidx = s:Tlist_Process_File(filename, ftype) ++ else ++ let mtime = getftime(filename) ++ if s:tlist_{fidx}_mtime != mtime ++ " Invalidate the tags listed for this file ++ let s:tlist_{fidx}_valid = 0 ++ ++ " Update the taglist and the window ++ call Tlist_Update_File(filename, ftype) ++ ++ " Store the new file modification time ++ let s:tlist_{fidx}_mtime = mtime ++ endif ++ endif ++ ++ " Update the taglist window ++ if tlist_win != -1 ++ " Disable screen updates ++ let old_lazyredraw = &lazyredraw ++ set nolazyredraw ++ ++ " Save the current window number ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter ++ " Save the cursor position ++ let save_line = line('.') ++ let save_col = col('.') ++ endif ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(filename, ftype) ++ ++ " Open the fold for the file ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ ++ if g:Tlist_Highlight_Tag_On_BufEnter && g:Tlist_Auto_Highlight_Tag ++ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != fidx ++ " If displaying tags for only one file in the taglist ++ " window and about to display the tags for a new file, ++ " then center the current tag line for the new file ++ let center_tag_line = 1 ++ else ++ let center_tag_line = 0 ++ endif ++ ++ " Highlight the current tag ++ call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) ++ else ++ " Restore the cursor position ++ if v:version >= 601 ++ call cursor(save_line, save_col) ++ else ++ exe save_line ++ exe 'normal! ' . save_col . '|' ++ endif ++ endif ++ ++ " Jump back to the original window ++ if save_winnr != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') ++ endif ++ ++ " Restore screen updates ++ let &lazyredraw = old_lazyredraw ++ endif ++ ++ " Update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(0) ++ endif ++endfunction ++ ++" Tlist_Change_Sort() ++" Change the sort order of the tag listing ++" caller == 'cmd', command used in the taglist window ++" caller == 'menu', taglist menu ++" action == 'toggle', toggle sort from name to order and vice versa ++" action == 'set', set the sort order to sort_type ++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 == 'cmd' ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ " Remove the previous highlighting ++ match none ++ elseif a:caller == 'menu' ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx == -1 ++ return ++ endif ++ endif ++ ++ if a:action == 'toggle' ++ let sort_type = s:tlist_{fidx}_sort_type ++ ++ " Toggle the sort order from 'name' to 'order' and vice versa ++ if sort_type == 'name' ++ let s:tlist_{fidx}_sort_type = 'order' ++ else ++ let s:tlist_{fidx}_sort_type = 'name' ++ endif ++ else ++ let s:tlist_{fidx}_sort_type = a:sort_type ++ endif ++ ++ " Invalidate the tags listed for this file ++ let s:tlist_{fidx}_valid = 0 ++ ++ if a:caller == 'cmd' ++ " Save the current line for later restoration ++ let curline = '\V\^' . getline('.') . '\$' ++ ++ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, ++ \ s:tlist_{fidx}_filetype) ++ ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Go back to the cursor line before the tag list is sorted ++ call search(curline, 'w') ++ ++ call s:Tlist_Menu_Update_File(1) ++ else ++ call s:Tlist_Menu_Remove_File() ++ ++ call s:Tlist_Refresh() ++ endif ++endfunction ++ ++" Tlist_Update_Current_File() ++" Update taglist for the current buffer by regenerating the tag list ++" Contributed by WEN Guopeng. ++function! s:Tlist_Update_Current_File() ++ call s:Tlist_Log_Msg('Tlist_Update_Current_File()') ++ if winnr() == bufwinnr(g:TagList_title) ++ " In the taglist window. Update the current file ++ call s:Tlist_Window_Update_File() ++ else ++ " Not in the taglist window. Update the current buffer ++ let filename = fnamemodify(bufname('%'), ':p') ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx != -1 ++ let s:tlist_{fidx}_valid = 0 ++ endif ++ call Tlist_Update_File(filename, &filetype) ++ endif ++endfunction ++ ++" Tlist_Window_Update_File() ++" 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_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ " Remove the previous highlighting ++ match none ++ ++ " Save the current line for later restoration ++ let curline = '\V\^' . getline('.') . '\$' ++ ++ let s:tlist_{fidx}_valid = 0 ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, ++ \ s:tlist_{fidx}_filetype) ++ ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Go back to the tag line before the list is updated ++ call search(curline, 'w') ++endfunction ++ ++" Tlist_Window_Get_Tag_Type_By_Linenum() ++" Return the tag type index for the specified line in the taglist window ++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 ++ " tag type start line number and the number of tags in a tag type ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ let start_lnum = ++ \ s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset ++ let end = start_lnum + s:tlist_{a:fidx}_{ttype}_count ++ if a:lnum >= start_lnum && a:lnum <= end ++ break ++ endif ++ let i = i + 1 ++ endwhile ++ ++ " Current line doesn't belong to any of the displayed tag types ++ if i > s:tlist_{ftype}_count ++ return '' ++ endif ++ ++ return ttype ++endfunction ++ ++" 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 == '' ++ return 0 ++ endif ++ ++ " Compute the index into the displayed tags for the tag type ++ let ttype_lnum = s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset ++ let tidx = a:lnum - ttype_lnum ++ if tidx == 0 ++ return 0 ++ endif ++ ++ " Get the corresponding tag line and return it ++ return s:tlist_{a:fidx}_{ttype}_{tidx} ++endfunction ++ ++" Tlist_Window_Highlight_Line ++" Highlight the current line ++function! s:Tlist_Window_Highlight_Line() ++ " Clear previously selected name ++ match none ++ ++ " Highlight the current line ++ if g:Tlist_Display_Prototype == 0 ++ let pat = '/\%' . line('.') . 'l\s\+\zs.*/' ++ else ++ let pat = '/\%' . line('.') . 'l.*/' ++ endif ++ ++ exe 'match TagListTagName ' . pat ++endfunction ++ ++" 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_Window_Open_File(win_ctrl, filename, tagpat) ++ 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 == '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 ++ 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 ++ let first_usable_win = 0 ++ ++ let i = 1 ++ let bnum = winbufnr(i) ++ while bnum != -1 ++ if getwinvar(i, 'tlist_file_window') == 'yes' ++ let fwin_num = i ++ break ++ endif ++ if first_usable_win == 0 && ++ \ getbufvar(bnum, '&buftype') == '' && ++ \ !getwinvar(i, '&previewwindow') ++ " First non-taglist, non-plugin and non-preview window ++ let first_usable_win = i ++ endif ++ let i = i + 1 ++ let bnum = winbufnr(i) ++ endwhile ++ ++ " If a previously used window is not found, then use the first ++ " non-taglist window ++ if fwin_num == 0 ++ let fwin_num = first_usable_win ++ endif ++ ++ if fwin_num != 0 ++ " Jump to the file window ++ exe fwin_num . "wincmd w" ++ ++ " If the user asked to jump to the tag in a new window, then split ++ " the existing window into two. ++ if a:win_ctrl == 'newwin' ++ split ++ endif ++ exe "edit " . escape(a:filename, ' ') ++ else ++ " Open a new window ++ if g:Tlist_Use_Horiz_Window ++ exe 'leftabove split ' . escape(a:filename, ' ') ++ else ++ if winbufnr(2) == -1 ++ " Only the taglist window is present ++ if g:Tlist_Use_Right_Window ++ exe 'leftabove vertical split ' . ++ \ escape(a:filename, ' ') ++ else ++ exe 'rightbelow vertical split ' . ++ \ escape(a:filename, ' ') ++ endif ++ ++ " Go to the taglist window to change the window size to ++ " the user configured value ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ if g:Tlist_Use_Horiz_Window ++ exe 'resize ' . g:Tlist_WinHeight ++ else ++ exe 'vertical resize ' . g:Tlist_WinWidth ++ endif ++ " Go back to the file window ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ else ++ " A plugin or help window is also present ++ wincmd w ++ exe 'leftabove split ' . escape(a:filename, ' ') ++ endif ++ endif ++ endif ++ " Mark the window, so that it can be reused. ++ call s:Tlist_Window_Mark_File_Window() ++ else ++ if v:version >= 700 ++ " If the file is opened in more than one window, then check ++ " whether the last accessed window has the selected file. ++ " If it does, then use that window. ++ let lastwin_bufnum = winbufnr(winnr('#')) ++ if bufnr(a:filename) == lastwin_bufnum ++ let winnum = winnr('#') ++ endif ++ endif ++ exe winnum . 'wincmd w' ++ ++ " If the user asked to jump to the tag in a new window, then split the ++ " existing window into two. ++ if a:win_ctrl == 'newwin' ++ split ++ endif ++ endif ++ endif ++ ++ " Jump to the tag ++ if a:tagpat != '' ++ " Add the current cursor position to the jump list, so that user can ++ " jump back using the ' and ` marks. ++ mark ' ++ silent call search(a:tagpat, 'w') ++ ++ " Bring the line to the middle of the window ++ normal! z. ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ endif ++ ++ " If the user selects to preview the tag then jump back to the ++ " taglist window ++ if a:win_ctrl == 'preview' ++ " Go back to the taglist window ++ let winnum = bufwinnr(g:TagList_title) ++ exe winnum . 'wincmd w' ++ else ++ " 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_Window_Goto_Window() ++ close ++ ++ " Go back to the window displaying the selected file ++ let wnum = bufwinnr(a:filename) ++ if wnum != -1 && wnum != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds(wnum . 'wincmd w') ++ endif ++ endif ++ endif ++ ++ let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh ++endfunction ++ ++" Tlist_Window_Jump_To_Tag() ++" Jump to the location of the current 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(' . a:win_ctrl . ')') ++ " Do not process comment lines and empty lines ++ let curline = getline('.') ++ if curline =~ '^\s*$' || curline[0] == '"' ++ return ++ endif ++ ++ " If inside a closed fold, then use the first line of the fold ++ " and jump to the file. ++ let lnum = foldclosed('.') ++ if lnum == -1 ++ " Jump to the selected tag or file ++ let lnum = line('.') ++ else ++ " Open the closed fold ++ .foldopen! ++ endif ++ ++ 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_Window_Get_Tag_Index(fidx, lnum) ++ if tidx != 0 ++ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx) ++ ++ " Highlight the tagline ++ call s:Tlist_Window_Highlight_Line() ++ else ++ " Selected a line which is not a tag name. Just edit the file ++ let tagpat = '' ++ endif ++ ++ call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) ++endfunction ++ ++" Tlist_Window_Show_Info() ++" Display information about the entry under the cursor ++function! s:Tlist_Window_Show_Info() ++ call s:Tlist_Log_Msg('Tlist_Window_Show_Info()') ++ ++ " Clear the previously displayed line ++ echo ++ ++ " Do not process comment lines and empty lines ++ let curline = getline('.') ++ if curline =~ '^\s*$' || curline[0] == '"' ++ return ++ endif ++ ++ " If inside a fold, then don't display the prototype ++ if foldclosed('.') != -1 ++ return ++ endif ++ ++ let lnum = line('.') ++ ++ " Get the file index ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) ++ if fidx == -1 ++ return ++ endif ++ ++ if lnum == s:tlist_{fidx}_start ++ " Cursor is on a file name ++ let fname = s:tlist_{fidx}_filename ++ if strlen(fname) > 50 ++ let fname = fnamemodify(fname, ':t') ++ endif ++ echo fname . ', Filetype=' . s:tlist_{fidx}_filetype . ++ \ ', Tag count=' . s:tlist_{fidx}_tag_count ++ return ++ endif ++ ++ " Get the tag output line for the current tag ++ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) ++ if tidx == 0 ++ " Cursor is on a tag type ++ let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) ++ if ttype == '' ++ return ++ endif ++ ++ let ttype_name = '' ++ ++ let ftype = s:tlist_{fidx}_filetype ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ if ttype == s:tlist_{ftype}_{i}_name ++ let ttype_name = s:tlist_{ftype}_{i}_fullname ++ break ++ endif ++ let i = i + 1 ++ endwhile ++ ++ echo 'Tag type=' . ttype_name . ++ \ ', Tag count=' . s:tlist_{fidx}_{ttype}_count ++ return ++ endif ++ ++ " Get the tag search pattern and display it ++ echo s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Find_Nearest_Tag_Idx ++" Find the tag idx nearest to the supplied line number ++" Returns -1, if a tag couldn't be found for the specified line number ++function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum) ++ let sort_type = s:tlist_{a:fidx}_sort_type ++ ++ let left = 1 ++ let right = s:tlist_{a:fidx}_tag_count ++ ++ if sort_type == 'order' ++ " Tags sorted by order, use a binary search. ++ " The idea behind this function is taken from the ctags.vim script (by ++ " Alexey Marinichev) available at the Vim online website. ++ ++ " If the current line is the less than the first tag, then no need to ++ " search ++ let first_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, 1) ++ ++ if a:linenum < first_lnum ++ return -1 ++ endif ++ ++ while left < right ++ let middle = (right + left + 1) / 2 ++ let middle_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, middle) ++ ++ if middle_lnum == a:linenum ++ let left = middle ++ break ++ endif ++ ++ if middle_lnum > a:linenum ++ let right = middle - 1 ++ else ++ let left = middle ++ endif ++ endwhile ++ else ++ " Tags sorted by name, use a linear search. (contributed by Dave ++ " Eggum). ++ " Look for a tag with a line number less than or equal to the supplied ++ " line number. If multiple tags are found, then use the tag with the ++ " line number closest to the supplied line number. IOW, use the tag ++ " with the highest line number. ++ let closest_lnum = 0 ++ let final_left = 0 ++ while left <= right ++ let lnum = s:Tlist_Get_Tag_Linenum(a:fidx, left) ++ ++ if lnum < a:linenum && lnum > closest_lnum ++ let closest_lnum = lnum ++ let final_left = left ++ elseif lnum == a:linenum ++ let closest_lnum = lnum ++ let final_left = left ++ break ++ else ++ let left = left + 1 ++ endif ++ endwhile ++ if closest_lnum == 0 ++ return -1 ++ endif ++ if left >= right ++ let left = final_left ++ endif ++ endif ++ ++ return left ++endfunction ++ ++" 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_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. ++ if !g:Tlist_Auto_Highlight_Tag && a:cntx == 1 ++ return ++ endif ++ ++ if a:filename == '' ++ return ++ endif ++ ++ " 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 ++ ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ return ++ endif ++ ++ " If the file is currently not displayed in the taglist window, then retrn ++ if !s:tlist_{fidx}_visible ++ return ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return ++ endif ++ ++ " Ignore all autocommands ++ let old_ei = &eventignore ++ set eventignore=all ++ ++ " Save the original window number ++ let org_winnr = winnr() ++ ++ if org_winnr == winnum ++ let in_taglist_window = 1 ++ else ++ let in_taglist_window = 0 ++ endif ++ ++ " Go to the taglist window ++ if !in_taglist_window ++ exe winnum . 'wincmd w' ++ endif ++ ++ " Clear previously selected name ++ match none ++ ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, a:cur_lnum) ++ if tidx == -1 ++ " Make sure the current tag line is visible in the taglist window. ++ " Calling the winline() function makes the line visible. Don't know ++ " of a better way to achieve this. ++ let lnum = line('.') ++ ++ if lnum < s:tlist_{fidx}_start || lnum > s:tlist_{fidx}_end ++ " Move the cursor to the beginning of the file ++ exe s:tlist_{fidx}_start ++ endif ++ ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ ++ call winline() ++ ++ if !in_taglist_window ++ exe org_winnr . 'wincmd w' ++ endif ++ ++ " Restore the autocommands ++ let &eventignore = old_ei ++ return ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) ++ ++ " Compute the line number ++ " Start of file + Start of tag type + offset ++ let lnum = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + ++ \ s:tlist_{fidx}_{tidx}_ttype_idx ++ ++ " Goto the line containing the tag ++ exe lnum ++ ++ " Open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ ++ if a:center ++ " Move the tag line to the center of the taglist window ++ normal! z. ++ else ++ " Make sure the current tag line is visible in the taglist window. ++ " Calling the winline() function makes the line visible. Don't know ++ " of a better way to achieve this. ++ call winline() ++ endif ++ ++ " Highlight the tag name ++ call s:Tlist_Window_Highlight_Line() ++ ++ " Go back to the original window ++ if !in_taglist_window ++ exe org_winnr . 'wincmd w' ++ endif ++ ++ " Restore the autocommands ++ let &eventignore = old_ei ++ return ++endfunction ++ ++" Tlist_Get_Tag_Prototype_By_Line ++" Get the prototype for the tag on or before the specified line number in the ++" current buffer ++function! Tlist_Get_Tag_Prototype_By_Line(...) ++ if a:0 == 0 ++ " Arguments are not supplied. Use the current buffer name ++ " and line number ++ let filename = bufname('%') ++ let linenr = line('.') ++ elseif a:0 == 2 ++ " Filename and line number are specified ++ let filename = a:1 ++ let linenr = a:2 ++ if linenr !~ '\d\+' ++ " Invalid line number ++ return "" ++ endif ++ else ++ " Sufficient arguments are not supplied ++ let msg = 'Usage: Tlist_Get_Tag_Prototype_By_Line ' . ++ \ '' ++ call s:Tlist_Warning_Msg(msg) ++ return "" ++ endif ++ ++ " Expand the file to a fully qualified name ++ let filename = fnamemodify(filename, ':p') ++ if filename == '' ++ return "" ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ return "" ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return "" ++ endif ++ ++ " Get the tag text using the line number ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) ++ if tidx == -1 ++ return "" ++ endif ++ ++ return s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Get_Tagname_By_Line ++" Get the tag name on or before the specified line number in the ++" current buffer ++function! Tlist_Get_Tagname_By_Line(...) ++ if a:0 == 0 ++ " Arguments are not supplied. Use the current buffer name ++ " and line number ++ let filename = bufname('%') ++ let linenr = line('.') ++ elseif a:0 == 2 ++ " Filename and line number are specified ++ let filename = a:1 ++ let linenr = a:2 ++ if linenr !~ '\d\+' ++ " Invalid line number ++ return "" ++ endif ++ else ++ " Sufficient arguments are not supplied ++ let msg = 'Usage: Tlist_Get_Tagname_By_Line ' ++ call s:Tlist_Warning_Msg(msg) ++ return "" ++ endif ++ ++ " Make sure the current file has a name ++ let filename = fnamemodify(filename, ':p') ++ if filename == '' ++ return "" ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ return "" ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return "" ++ endif ++ ++ " Get the tag name using the line number ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) ++ if tidx == -1 ++ return "" ++ endif ++ ++ return s:tlist_{fidx}_{tidx}_tag_name ++endfunction ++ ++" 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_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 ++ if a:dir == -1 ++ normal! zk ++ else ++ " While moving down to the start of the next fold, ++ " no need to do go to the start of the next file. ++ normal! zj ++ return ++ endif ++ endif ++ ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ let cur_lnum = line('.') ++ ++ if a:dir == -1 ++ if cur_lnum > s:tlist_{fidx}_start ++ " Move to the beginning of the current file ++ exe s:tlist_{fidx}_start ++ return ++ endif ++ ++ 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 ++ ++ 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 ++ " Cursor is at the last file, wrap around to the first file ++ let fidx = 0 ++ endif ++ ++ if s:tlist_{fidx}_start != 0 ++ exe s:tlist_{fidx}_start ++ endif ++ return ++ endif ++endfunction ++ ++" Tlist_Session_Load ++" Load a taglist session (information about all the displayed files ++" and the tags) from the specified file ++function! s:Tlist_Session_Load(...) ++ if a:0 == 0 || a:1 == '' ++ call s:Tlist_Warning_Msg('Usage: TlistSessionLoad ') ++ return ++ endif ++ ++ let sessionfile = a:1 ++ ++ if !filereadable(sessionfile) ++ let msg = 'Taglist: Error - Unable to open file ' . sessionfile ++ call s:Tlist_Warning_Msg(msg) ++ return ++ endif ++ ++ " Mark the current window as the file window ++ call s:Tlist_Window_Mark_File_Window() ++ ++ " Source the session file ++ exe 'source ' . sessionfile ++ ++ let new_file_count = g:tlist_file_count ++ unlet! g:tlist_file_count ++ ++ let i = 0 ++ while i < new_file_count ++ let ftype = g:tlist_{i}_filetype ++ unlet! g:tlist_{i}_filetype ++ ++ if !exists('s:tlist_' . ftype . '_count') ++ if s:Tlist_FileType_Init(ftype) == 0 ++ let i = i + 1 ++ continue ++ endif ++ endif ++ ++ let fname = g:tlist_{i}_filename ++ unlet! g:tlist_{i}_filename ++ ++ let fidx = s:Tlist_Get_File_Index(fname) ++ if fidx != -1 ++ let s:tlist_{fidx}_visible = 0 ++ let i = i + 1 ++ continue ++ else ++ " As we are loading the tags from the session file, if this ++ " file was previously deleted by the user, now we need to ++ " add it back. So remove the file from the deleted list. ++ call s:Tlist_Update_Remove_List(fname, 0) ++ endif ++ ++ let fidx = s:Tlist_Init_File(fname, ftype) ++ ++ let s:tlist_{fidx}_filename = fname ++ ++ let s:tlist_{fidx}_sort_type = g:tlist_{i}_sort_type ++ unlet! g:tlist_{i}_sort_type ++ ++ let s:tlist_{fidx}_filetype = ftype ++ let s:tlist_{fidx}_mtime = getftime(fname) ++ ++ let s:tlist_{fidx}_start = 0 ++ let s:tlist_{fidx}_end = 0 ++ ++ let s:tlist_{fidx}_valid = 1 ++ ++ let s:tlist_{fidx}_tag_count = g:tlist_{i}_tag_count ++ unlet! g:tlist_{i}_tag_count ++ ++ let j = 1 ++ while j <= s:tlist_{fidx}_tag_count ++ let s:tlist_{fidx}_{j}_tag = g:tlist_{i}_{j}_tag ++ let s:tlist_{fidx}_{j}_tag_name = g:tlist_{i}_{j}_tag_name ++ let s:tlist_{fidx}_{j}_ttype_idx = g:tlist_{i}_{j}_ttype_idx ++ unlet! g:tlist_{i}_{j}_tag ++ unlet! g:tlist_{i}_{j}_tag_name ++ unlet! g:tlist_{i}_{j}_ttype_idx ++ let j = j + 1 ++ endwhile ++ ++ let j = 1 ++ while j <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{j}_name ++ ++ if exists('g:tlist_' . i . '_' . ttype) ++ let s:tlist_{fidx}_{ttype} = g:tlist_{i}_{ttype} ++ unlet! g:tlist_{i}_{ttype} ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = g:tlist_{i}_{ttype}_count ++ unlet! g:tlist_{i}_{ttype}_count ++ ++ let k = 1 ++ while k <= s:tlist_{fidx}_{ttype}_count ++ let s:tlist_{fidx}_{ttype}_{k} = g:tlist_{i}_{ttype}_{k} ++ unlet! g:tlist_{i}_{ttype}_{k} ++ let k = k + 1 ++ endwhile ++ else ++ let s:tlist_{fidx}_{ttype} = '' ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = 0 ++ endif ++ ++ let j = j + 1 ++ endwhile ++ ++ let i = i + 1 ++ endwhile ++ ++ " If the taglist window is open, then update it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ " Refresh the taglist window ++ call s:Tlist_Window_Refresh() ++ ++ " Go back to the original window ++ if save_winnr != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ endif ++ endif ++endfunction ++ ++" Tlist_Session_Save ++" Save a taglist session (information about all the displayed files ++" and the tags) into the specified file ++function! s:Tlist_Session_Save(...) ++ if a:0 == 0 || a:1 == '' ++ call s:Tlist_Warning_Msg('Usage: TlistSessionSave ') ++ return ++ endif ++ ++ let sessionfile = a:1 ++ ++ if s:tlist_file_count == 0 ++ " There is nothing to save ++ call s:Tlist_Warning_Msg('Warning: Taglist is empty. Nothing to save.') ++ return ++ endif ++ ++ if filereadable(sessionfile) ++ let ans = input('Do you want to overwrite ' . sessionfile . ' (Y/N)?') ++ if ans !=? 'y' ++ return ++ endif ++ ++ echo "\n" ++ endif ++ ++ let old_verbose = &verbose ++ set verbose&vim ++ ++ exe 'redir! > ' . sessionfile ++ ++ silent! echo '" Taglist session file. This file is auto-generated.' ++ silent! echo '" File information' ++ silent! echo 'let tlist_file_count = ' . s:tlist_file_count ++ ++ let i = 0 ++ ++ while i < s:tlist_file_count ++ " Store information about the file ++ silent! echo 'let tlist_' . i . "_filename = '" . ++ \ s:tlist_{i}_filename . "'" ++ silent! echo 'let tlist_' . i . '_sort_type = "' . ++ \ s:tlist_{i}_sort_type . '"' ++ silent! echo 'let tlist_' . i . '_filetype = "' . ++ \ s:tlist_{i}_filetype . '"' ++ silent! echo 'let tlist_' . i . '_tag_count = ' . ++ \ s:tlist_{i}_tag_count ++ " Store information about all the tags ++ let j = 1 ++ while j <= s:tlist_{i}_tag_count ++ let txt = escape(s:tlist_{i}_{j}_tag, '"\\') ++ silent! echo 'let tlist_' . i . '_' . j . '_tag = "' . txt . '"' ++ silent! echo 'let tlist_' . i . '_' . j . '_tag_name = "' . ++ \ s:tlist_{i}_{j}_tag_name . '"' ++ silent! echo 'let tlist_' . i . '_' . j . '_ttype_idx' . ' = ' . ++ \ s:tlist_{i}_{j}_ttype_idx ++ let j = j + 1 ++ endwhile ++ ++ " Store information about all the tags grouped by their type ++ let ftype = s:tlist_{i}_filetype ++ let j = 1 ++ while j <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{j}_name ++ if s:tlist_{i}_{ttype}_count != 0 ++ let txt = substitute(s:tlist_{i}_{ttype}, "\n", "\\\\n", 'g') ++ silent! echo 'let tlist_' . i . '_' . ttype . ' = "' . ++ \ txt . '"' ++ silent! echo 'let tlist_' . i . '_' . ttype . '_count = ' . ++ \ s:tlist_{i}_{ttype}_count ++ let k = 1 ++ while k <= s:tlist_{i}_{ttype}_count ++ silent! echo 'let tlist_' . i . '_' . ttype . '_' . k . ++ \ ' = ' . s:tlist_{i}_{ttype}_{k} ++ let k = k + 1 ++ endwhile ++ endif ++ let j = j + 1 ++ endwhile ++ ++ silent! echo ++ ++ let i = i + 1 ++ endwhile ++ ++ redir END ++ ++ let &verbose = old_verbose ++endfunction ++ ++" Tlist_Buffer_Removed ++" 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 . ')') ++ ++ " Make sure a valid filename is supplied ++ if a:filename == '' ++ return ++ endif ++ ++ " Get tag list index of the specified file ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ " File not present in the taglist ++ return ++ endif ++ ++ " Remove the file from the list ++ call s:Tlist_Remove_File(fidx, 0) ++endfunction ++ ++" When a buffer is deleted, remove the file from the taglist ++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(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) ++ if winnum == -1 ++ call s:Tlist_Warning_Msg('Taglist: Error - Taglist window is not open') ++ return ++ endif ++ ++ " Save the original window number ++ let org_winnr = winnr() ++ if org_winnr == winnum ++ let in_taglist_window = 1 ++ else ++ let in_taglist_window = 0 ++ endif ++ ++ if in_taglist_window ++ " When entering the taglist window, no need to update the folds ++ return ++ endif ++ ++ " Go to the taglist window ++ if !in_taglist_window ++ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') ++ endif ++ ++ " Close all the folds ++ silent! %foldclose ++ ++ " Get tag list index of the specified file ++ 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 ++ if !in_taglist_window ++ call s:Tlist_Exe_Cmd_No_Acmds(org_winnr . 'wincmd w') ++ endif ++endfunction ++ ++" 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_Window_Check_Auto_Open() ++ let open_window = 0 ++ ++ let i = 1 ++ let buf_num = winbufnr(i) ++ while buf_num != -1 ++ let filename = fnamemodify(bufname(buf_num), ':p') ++ if !s:Tlist_Skip_File(filename, getbufvar(buf_num, '&filetype')) ++ let open_window = 1 ++ break ++ endif ++ let i = i + 1 ++ let buf_num = winbufnr(i) ++ endwhile ++ ++ if open_window ++ call s:Tlist_Window_Toggle() ++ endif ++endfunction ++ ++function! s:Tlist_Menu_Add_Base_Menu() ++ call s:Tlist_Log_Msg('Adding the base menu') ++ ++ " Add the menu ++ anoremenu T&ags.Refresh\ menu :call Tlist_Menu_Refresh() ++ anoremenu T&ags.Sort\ menu\ by.Name ++ \ :call Tlist_Change_Sort('menu', 'set', 'name') ++ anoremenu T&ags.Sort\ menu\ by.Order ++ \ :call Tlist_Change_Sort('menu', 'set', 'order') ++ anoremenu T&ags.-SEP1- : ++ ++ if &mousemodel =~ 'popup' ++ anoremenu PopUp.T&ags.Refresh\ menu ++ \ :call Tlist_Menu_Refresh() ++ anoremenu PopUp.T&ags.Sort\ menu\ by.Name ++ \ :call Tlist_Change_Sort('menu', 'set', 'name') ++ anoremenu PopUp.T&ags.Sort\ menu\ by.Order ++ \ :call Tlist_Change_Sort('menu', 'set', 'order') ++ anoremenu PopUp.T&ags.-SEP1- : ++ endif ++endfunction ++ ++let s:menu_char_prefix = ++ \ '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ++ ++" Tlist_Menu_Get_Tag_Type_Cmd ++" Get the menu command for the specified tag type ++" 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 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 ++ ++ " Number of tag entries for this tag type ++ let tcnt = s:tlist_{fidx_ttype}_count ++ if tcnt == 0 " No entries for this tag type ++ return '' ++ endif ++ ++ let mcmd = '' ++ ++ " Create the menu items for the tags. ++ " Depending on the number of tags of this type, split the menu into ++ " multiple sub-menus, if needed. ++ if tcnt > g:Tlist_Max_Submenu_Items ++ let j = 1 ++ while j <= tcnt ++ let final_index = j + g:Tlist_Max_Submenu_Items - 1 ++ if final_index > tcnt ++ let final_index = tcnt ++ endif ++ ++ " Extract the first and last tag name and form the ++ " sub-menu name ++ let tidx = s:tlist_{fidx_ttype}_{j} ++ let first_tag = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let tidx = s:tlist_{fidx_ttype}_{final_index} ++ let last_tag = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ " Truncate the names, if they are greater than the ++ " max length ++ let first_tag = strpart(first_tag, 0, g:Tlist_Max_Tag_Length) ++ let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length) ++ ++ " Form the menu command prefix ++ 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 ++ ++ while j <= final_index ++ let tidx = s:tlist_{fidx_ttype}_{j} ++ ++ let tname = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let mcmd = mcmd . m_prefix . '\&' . ++ \ s:menu_char_prefix[m_prefix_idx] . '\.' . ++ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . ++ \ tidx . ')|' ++ ++ let m_prefix_idx = m_prefix_idx + 1 ++ let j = j + 1 ++ endwhile ++ endwhile ++ else ++ " Character prefix used to number the menu items (hotkey) ++ let m_prefix_idx = 0 ++ ++ 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} ++ ++ let tname = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let mcmd = mcmd . m_prefix . '\&' . ++ \ s:menu_char_prefix[m_prefix_idx] . '\.' . ++ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . tidx ++ \ . ')|' ++ ++ let m_prefix_idx = m_prefix_idx + 1 ++ let j = j + 1 ++ endwhile ++ endif ++ ++ return mcmd ++endfunction ++ ++" Update the taglist menu with the tags for the specified file ++function! s:Tlist_Menu_File_Refresh(fidx) ++ call s:Tlist_Log_Msg('Refreshing the tag menu for ' . s:tlist_{a:fidx}_filename) ++ " The 'B' flag is needed in the 'cpoptions' option ++ let old_cpoptions = &cpoptions ++ set cpoptions&vim ++ ++ exe s:tlist_{a:fidx}_menu_cmd ++ ++ " Update the popup menu (if enabled) ++ if &mousemodel =~ 'popup' ++ let cmd = substitute(s:tlist_{a:fidx}_menu_cmd, ' T\\&ags\.', ++ \ ' PopUp.T\\\&ags.', "g") ++ exe cmd ++ endif ++ ++ " The taglist menu is not empty now ++ let s:tlist_menu_empty = 0 ++ ++ " Restore the 'cpoptions' settings ++ let &cpoptions = old_cpoptions ++endfunction ++ ++" Tlist_Menu_Update_File ++" Add the taglist menu ++function! s:Tlist_Menu_Update_File(clear_menu) ++ if !has('gui_running') ++ " Not running in GUI mode ++ return ++ endif ++ ++ call s:Tlist_Log_Msg('Updating the tag menu, clear_menu = ' . a:clear_menu) ++ ++ " Remove the tags menu ++ if a:clear_menu ++ call s:Tlist_Menu_Remove_File() ++ ++ endif ++ ++ let fname = escape(fnamemodify(bufname('%'), ':t'), '.') ++ if fname != '' ++ exe 'anoremenu T&ags.' . fname . ' ' ++ anoremenu T&ags.-SEP2- : ++ endif ++ ++ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help ++ if &buftype != '' ++ return ++ endif ++ ++ let filename = fnamemodify(bufname('%'), ':p') ++ let ftype = &filetype ++ ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(filename, ftype) ++ return ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 || !s:tlist_{fidx}_valid ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(filename) ++ return ++ endif ++ ++ " Process the tags for the file ++ let fidx = s:Tlist_Process_File(filename, ftype) ++ if fidx == -1 ++ return ++ endif ++ endif ++ ++ if !s:tlist_{fidx}_tag_count ++ return ++ endif ++ ++ if s:tlist_{fidx}_menu_cmd != '' ++ " Update the menu with the cached command ++ call s:Tlist_Menu_File_Refresh(fidx) ++ ++ return ++ endif ++ ++ " We are going to add entries to the tags menu, so the menu won't be ++ " empty ++ let s:tlist_menu_empty = 0 ++ ++ 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, add_ttype_name, i) ++ if mcmd != '' ++ let cmd = cmd . mcmd ++ endif ++ ++ let i = i + 1 ++ endwhile ++ ++ " Cache the menu command for reuse ++ let s:tlist_{fidx}_menu_cmd = cmd ++ ++ " Update the menu ++ call s:Tlist_Menu_File_Refresh(fidx) ++endfunction ++ ++" Tlist_Menu_Remove_File ++" Remove the tags displayed in the tags menu ++function! s:Tlist_Menu_Remove_File() ++ if !has('gui_running') || s:tlist_menu_empty ++ return ++ endif ++ ++ call s:Tlist_Log_Msg('Removing the tags menu for a file') ++ ++ " Cleanup the Tags menu ++ silent! unmenu T&ags ++ if &mousemodel =~ 'popup' ++ silent! unmenu PopUp.T&ags ++ endif ++ ++ " Add a dummy menu item to retain teared off menu ++ noremenu T&ags.Dummy l ++ ++ silent! unmenu! T&ags ++ if &mousemodel =~ 'popup' ++ silent! unmenu! PopUp.T&ags ++ endif ++ ++ call s:Tlist_Menu_Add_Base_Menu() ++ ++ " Remove the dummy menu item ++ unmenu T&ags.Dummy ++ ++ let s:tlist_menu_empty = 1 ++endfunction ++ ++" Tlist_Menu_Refresh ++" Refresh the taglist menu ++function! s:Tlist_Menu_Refresh() ++ call s:Tlist_Log_Msg('Refreshing the tags menu') ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx != -1 ++ " Invalidate the cached menu command ++ let s:tlist_{fidx}_menu_cmd = '' ++ endif ++ ++ " Update the taglist, menu and window ++ call s:Tlist_Update_Current_File() ++endfunction ++ ++" Tlist_Menu_Jump_To_Tag ++" Jump to the selected tag ++function! s:Tlist_Menu_Jump_To_Tag(tidx) ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx == -1 ++ return ++ endif ++ ++ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, a:tidx) ++ if tagpat == '' ++ return ++ endif ++ ++ " Add the current cursor position to the jump list, so that user can ++ " jump back using the ' and ` marks. ++ mark ' ++ ++ silent call search(tagpat, 'w') ++ ++ " Bring the line to the middle of the window ++ normal! z. ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++endfunction ++ ++" Tlist_Menu_Init ++" Initialize the taglist menu ++function! s:Tlist_Menu_Init() ++ call s:Tlist_Menu_Add_Base_Menu() ++ ++ " Automatically add the tags defined in the current file to the menu ++ augroup TagListMenuCmds ++ autocmd! ++ ++ if !g:Tlist_Process_File_Always ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ autocmd BufLeave * call s:Tlist_Menu_Remove_File() ++ augroup end ++ ++ call s:Tlist_Menu_Update_File(0) ++endfunction ++ ++" Tlist_Vim_Session_Load ++" Initialize the taglist window/buffer, which is created when loading ++" a Vim session file. ++function! s:Tlist_Vim_Session_Load() ++ call s:Tlist_Log_Msg('Tlist_Vim_Session_Load') ++ ++ " Initialize the taglist window ++ call s:Tlist_Window_Init() ++ ++ " Refresh the taglist window ++ call s:Tlist_Window_Refresh() ++endfunction ++ ++" Tlist_Set_App ++" Set the name of the external plugin/application to which taglist ++" belongs. ++" Taglist plugin is part of another plugin like cream or winmanager. ++function! Tlist_Set_App(name) ++ if a:name == "" ++ return ++ endif ++ ++ let s:tlist_app_name = a:name ++endfunction ++ ++" Winmanager integration ++ ++" Initialization required for integration with winmanager ++function! TagList_Start() ++ " If current buffer is not taglist buffer, then don't proceed ++ if bufname('%') != '__Tag_List__' ++ return ++ endif ++ ++ call Tlist_Set_App('winmanager') ++ ++ " Get the current filename from the winmanager plugin ++ let bufnum = WinManagerGetLastEditedFile() ++ if bufnum != -1 ++ let filename = fnamemodify(bufname(bufnum), ':p') ++ let ftype = getbufvar(bufnum, '&filetype') ++ endif ++ ++ " Initialize the taglist window, if it is not already initialized ++ if !exists('s:tlist_window_initialized') || !s:tlist_window_initialized ++ call s:Tlist_Window_Init() ++ call s:Tlist_Window_Refresh() ++ let s:tlist_window_initialized = 1 ++ endif ++ ++ " Update the taglist window ++ if bufnum != -1 ++ if !s:Tlist_Skip_File(filename, ftype) && g:Tlist_Auto_Update ++ call s:Tlist_Window_Refresh_File(filename, ftype) ++ endif ++ endif ++endfunction ++ ++function! TagList_IsValid() ++ return 0 ++endfunction ++ ++function! TagList_WrapUp() ++ return 0 ++endfunction ++ ++" restore 'cpo' ++let &cpo = s:cpo_save ++unlet s:cpo_save ++ +diff -urN vim71/1/plugin/taglist.vim vim71_ada/1/plugin/taglist.vim +--- vim71/1/plugin/taglist.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/plugin/taglist.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,4524 @@ ++" File: taglist.vim ++" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) ++" 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 ++" 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. ++" ++" 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 ++" you to efficiently browse through source code files for different ++" programming languages. You can visit the taglist plugin home page for more ++" information: ++" ++" http://vim-taglist.sourceforge.net ++" ++" You can subscribe to the taglist mailing list to post your questions ++" or suggestions for improvement or to report bugs. Visit the following ++" page for subscribing to the mailing list: ++" ++" http://groups.yahoo.com/group/taglist/ ++" ++" For more information about using this plugin, after installing the ++" taglist plugin, use the ":help taglist" command. ++" ++" Installation ++" ------------ ++" 1. Download the taglist.zip file and unzip the files to the $HOME/.vim ++" or the $HOME/vimfiles or the $VIM/vimfiles directory. This should ++" unzip the following two files (the directory structure should be ++" preserved): ++" ++" 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. ++" 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. ++" 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 ++" utility (not to the directory) in the .vimrc file. ++" 4. If you are running a terminal/console version of Vim and the ++" terminal doesn't support changing the window width then set the ++" 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. ++" 5. Restart Vim. ++" 6. You can now use the ":TlistToggle" command to open/close the taglist ++" window. You can use the ":help taglist" command to get more ++" information about using the taglist plugin. ++" ++" ****************** Do not modify after this line ************************ ++ ++" Line continuation used here ++let s:cpo_save = &cpo ++set cpo&vim ++ ++if !exists('loaded_taglist') ++ " First time loading the taglist plugin ++ " ++ " To speed up the loading of Vim, the taglist plugin uses autoload ++ " mechanism to load the taglist functions. ++ " Only define the configuration variables, user commands and some ++ " auto-commands and finish sourcing the file ++ ++ " The taglist plugin requires the built-in Vim system() function. If this ++ " function is not available, then don't load the plugin. ++ if !exists('*system') ++ echomsg 'Taglist: Vim system() built-in function is not available. ' . ++ \ 'Plugin is not loaded.' ++ let loaded_taglist = 'no' ++ let &cpo = s:cpo_save ++ finish ++ endif ++ ++ " Location of the exuberant ctags tool ++ if !exists('Tlist_Ctags_Cmd') ++ if executable('exuberant-ctags') ++ " On Debian Linux, exuberant ctags is installed ++ " as exuberant-ctags ++ let Tlist_Ctags_Cmd = 'exuberant-ctags' ++ elseif executable(' exctags') ++ " On Free-BSD, exuberant ctags is installed as exctags ++ let Tlist_Ctags_ Cmd = 'exctags' ++ elseif executable('ctags') ++ let Tlist_Ctags_Cmd = 'ctags' ++ elseif executable('ctags.exe') ++ let Tlist_Ctags_Cmd = 'ctags.exe' ++ elseif executable('tags') ++ let Tlist_Ctags_Cmd = 'tags' ++ else ++ echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . ++ \ 'not found in PATH. Plugin is not loaded.' ++ " Skip loading the plugin ++ let loaded_taglist = 'no' ++ let &cpo = s:cpo_save ++ finish ++ endif ++ endif ++ ++ ++ " Automatically open the taglist window on Vim startup ++ if !exists('Tlist_Auto_Open') ++ 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 ++ endif ++ ++ if !exists('Tlist_Show_Menu') ++ let Tlist_Show_Menu = 0 ++ endif ++ ++ " Tag listing sort type - 'name' or 'order' ++ if !exists('Tlist_Sort_Type') ++ let Tlist_Sort_Type = 'order' ++ endif ++ ++ " Tag listing window split (horizontal/vertical) control ++ if !exists('Tlist_Use_Horiz_Window') ++ let Tlist_Use_Horiz_Window = 0 ++ endif ++ ++ " Open the vertically split taglist window on the left or on the right ++ " side. This setting is relevant only if Tlist_Use_Horiz_Window is set to ++ " zero (i.e. only for vertically split windows) ++ if !exists('Tlist_Use_Right_Window') ++ let Tlist_Use_Right_Window = 0 ++ endif ++ ++ " Increase Vim window width to display vertically split taglist window. ++ " For MS-Windows version of Vim running in a MS-DOS window, this must be ++ " set to 0 otherwise the system may hang due to a Vim limitation. ++ if !exists('Tlist_Inc_Winwidth') ++ if (has('win16') || has('win95')) && !has('gui_running') ++ let Tlist_Inc_Winwidth = 0 ++ else ++ let Tlist_Inc_Winwidth = 1 ++ endif ++ endif ++ ++ " Vertically split taglist window width setting ++ if !exists('Tlist_WinWidth') ++ let Tlist_WinWidth = 30 ++ endif ++ ++ " Horizontally split taglist window height setting ++ if !exists('Tlist_WinHeight') ++ let Tlist_WinHeight = 10 ++ endif ++ ++ " Display tag prototypes or tag names in the taglist window ++ if !exists('Tlist_Display_Prototype') ++ let Tlist_Display_Prototype = 0 ++ endif ++ ++ " Display tag scopes in the taglist window ++ if !exists('Tlist_Display_Tag_Scope') ++ let Tlist_Display_Tag_Scope = 1 ++ endif ++ ++ " Use single left mouse click to jump to a tag. By default this is disabled. ++ " Only double click using the mouse will be processed. ++ if !exists('Tlist_Use_SingleClick') ++ let Tlist_Use_SingleClick = 0 ++ endif ++ ++ " Control whether additional help is displayed as part of the taglist or ++ " not. Also, controls whether empty lines are used to separate the tag ++ " tree. ++ if !exists('Tlist_Compact_Format') ++ let Tlist_Compact_Format = 0 ++ endif ++ ++ " Exit Vim if only the taglist window is currently open. By default, this is ++ " set to zero. ++ if !exists('Tlist_Exit_OnlyWindow') ++ let Tlist_Exit_OnlyWindow = 0 ++ endif ++ ++ " Automatically close the folds for the non-active files in the taglist ++ " window ++ if !exists('Tlist_File_Fold_Auto_Close') ++ let Tlist_File_Fold_Auto_Close = 0 ++ endif ++ ++ " Close the taglist window when a tag is selected ++ if !exists('Tlist_Close_On_Select') ++ let Tlist_Close_On_Select = 0 ++ endif ++ ++ " Automatically update the taglist window to display tags for newly ++ " edited files ++ if !exists('Tlist_Auto_Update') ++ let Tlist_Auto_Update = 1 ++ endif ++ ++ " Automatically highlight the current tag ++ if !exists('Tlist_Auto_Highlight_Tag') ++ let Tlist_Auto_Highlight_Tag = 1 ++ endif ++ ++ " Automatically highlight the current tag on entering a buffer ++ if !exists('Tlist_Highlight_Tag_On_BufEnter') ++ let Tlist_Highlight_Tag_On_BufEnter = 1 ++ endif ++ ++ " Enable fold column to display the folding for the tag tree ++ if !exists('Tlist_Enable_Fold_Column') ++ let Tlist_Enable_Fold_Column = 1 ++ endif ++ ++ " Display the tags for only one file in the taglist window ++ if !exists('Tlist_Show_One_File') ++ let Tlist_Show_One_File = 0 ++ endif ++ ++ if !exists('Tlist_Max_Submenu_Items') ++ let Tlist_Max_Submenu_Items = 20 ++ endif ++ ++ if !exists('Tlist_Max_Tag_Length') ++ let Tlist_Max_Tag_Length = 10 ++ endif ++ ++ " Do not change the name of the taglist title variable. The winmanager ++ " plugin relies on this name to determine the title for the taglist ++ " plugin. ++ let TagList_title = "__Tag_List__" ++ ++ " Taglist debug messages ++ let s:tlist_msg = '' ++ ++ " Define the taglist autocommand to automatically open the taglist window ++ " on Vim startup ++ if g:Tlist_Auto_Open ++ autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open() ++ endif ++ ++ " Refresh the taglist ++ if g:Tlist_Process_File_Always ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ ++ if g:Tlist_Show_Menu ++ autocmd GUIEnter * call s:Tlist_Menu_Init() ++ endif ++ ++ " When the taglist buffer is created when loading a Vim session file, ++ " the taglist buffer needs to be initialized. The BufFilePost event ++ " is used to handle this case. ++ autocmd BufFilePost __Tag_List__ call s:Tlist_Vim_Session_Load() ++ ++ " Define the user commands to manage the taglist window ++ command! -nargs=0 -bar TlistToggle call s:Tlist_Window_Toggle() ++ command! -nargs=0 -bar TlistOpen call s:Tlist_Window_Open() ++ " For backwards compatiblity define the Tlist command ++ command! -nargs=0 -bar Tlist TlistToggle ++ command! -nargs=+ -complete=file TlistAddFiles ++ \ call s:Tlist_Add_Files() ++ command! -nargs=+ -complete=dir TlistAddFilesRecursive ++ \ call s:Tlist_Add_Files_Recursive() ++ command! -nargs=0 -bar TlistClose call s:Tlist_Window_Close() ++ command! -nargs=0 -bar TlistUpdate call s:Tlist_Update_Current_File() ++ command! -nargs=0 -bar TlistHighlightTag call s:Tlist_Window_Highlight_Tag( ++ \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1) ++ " For backwards compatiblity define the TlistSync command ++ command! -nargs=0 -bar TlistSync TlistHighlightTag ++ command! -nargs=* -complete=buffer TlistShowPrototype ++ \ echo Tlist_Get_Tag_Prototype_By_Line() ++ command! -nargs=* -complete=buffer TlistShowTag ++ \ echo Tlist_Get_Tagname_By_Line() ++ command! -nargs=* -complete=file TlistSessionLoad ++ \ call s:Tlist_Session_Load() ++ command! -nargs=* -complete=file TlistSessionSave ++ \ call s:Tlist_Session_Save() ++ command! -bar TlistLock let Tlist_Auto_Update=0 ++ command! -bar TlistUnlock let Tlist_Auto_Update=1 ++ ++ " Commands for enabling/disabling debug and to display debug messages ++ command! -nargs=? -complete=file -bar TlistDebug ++ \ call s:Tlist_Debug_Enable() ++ command! -nargs=0 -bar TlistUndebug call s:Tlist_Debug_Disable() ++ command! -nargs=0 -bar TlistMessages call s:Tlist_Debug_Show() ++ ++ " Define autocommands to autoload the taglist plugin when needed. ++ ++ " Trick to get the current script ID ++ map xx xx ++ let s:tlist_sid = substitute(maparg('xx'), '\(\d\+_\)xx$', ++ \ '\1', '') ++ unmap xx ++ ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Window_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Menu_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined Tlist_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined TagList_* source ' . ++ \ escape(expand(''), ' ') ++ ++ let loaded_taglist = 'fast_load_done' ++ ++ if g:Tlist_Show_Menu && has('gui_running') ++ call s:Tlist_Menu_Init() ++ endif ++ ++ " restore 'cpo' ++ let &cpo = s:cpo_save ++ finish ++endif ++ ++if !exists('s:tlist_sid') ++ " Two or more versions of taglist plugin are installed. Don't ++ " load this version of the plugin. ++ finish ++endif ++ ++unlet! s:tlist_sid ++ ++if loaded_taglist != 'fast_load_done' ++ " restore 'cpo' ++ let &cpo = s:cpo_save ++ finish ++endif ++ ++" Taglist plugin functionality is available ++let loaded_taglist = 'available' ++ ++"------------------- end of user configurable options -------------------- ++ ++" Default language specific settings for supported file types and tag types ++" ++" Variable name format: ++" ++" s:tlist_def_{vim_ftype}_settings ++" ++" vim_ftype - Filetype detected by Vim ++" ++" Value format: ++" ++" ;:;:;... ++" ++" ctags_ftype - File type supported by exuberant ctags ++" flag - Flag supported by exuberant ctags to generate a tag type ++" name - Name of the tag type used in the taglist window to display the ++" tags of this type ++" ++ ++" Ada language ++let s:tlist_def_ada_settings = 'ada;' . ++ \ 'P:package spec;' . ++ \ 'p:package body;' . ++ \ 'T:type spec;' . ++ \ 't:type;' . ++ \ 'U:subtype spec;' . ++ \ 'u:subtype;' . ++ \ 'c:component;' . ++ \ 'l:literal;' . ++ \ 'V:variable spec;' . ++ \ 'v:variable;' . ++ \ 'f:formal;' . ++ \ 'n:constant;' . ++ \ 'x:exception;' . ++ \ 'R:subprogram spec;' . ++ \ 'r:subprogram body;' . ++ \ 'K:task spec;' . ++ \ 'k:task body;' . ++ \ 'O:protected spec;' . ++ \ 'o:protected body;' . ++ \ 'E:entry spec;' . ++ \ 'e:entry body;' . ++ \ 'b:label;' . ++ \ 'i:identifier;' . ++ \ 'a:autovar;' . ++ \ 'y:annon' ++ ++" assembly language ++let s:tlist_def_asm_settings = 'asm;d:define;l:label;m:macro;t:type' ++ ++" aspperl language ++let s:tlist_def_aspperl_settings = 'asp;f:function;s:sub;v:variable' ++ ++" aspvbs language ++let s:tlist_def_aspvbs_settings = 'asp;f:function;s:sub;v:variable' ++ ++" awk language ++let s:tlist_def_awk_settings = 'awk;f:function' ++ ++" beta language ++let s:tlist_def_beta_settings = 'beta;f:fragment;s:slot;v:pattern' ++ ++" c language ++let s:tlist_def_c_settings = 'c;d:macro;g:enum;s:struct;u:union;t:typedef;' . ++ \ 'v:variable;f:function' ++ ++" c++ language ++let s:tlist_def_cpp_settings = 'c++;n:namespace;v:variable;d:macro;t:typedef;' . ++ \ 'c:class;g:enum;s:struct;u:union;f:function' ++ ++" c# language ++let s:tlist_def_cs_settings = 'c#;d:macro;t:typedef;n:namespace;c:class;' . ++ \ 'E:event;g:enum;s:struct;i:interface;' . ++ \ 'p:properties;m:method' ++ ++" cobol language ++let s:tlist_def_cobol_settings = 'cobol;d:data;f:file;g:group;p:paragraph;' . ++ \ 'P:program;s:section' ++ ++" eiffel language ++let s:tlist_def_eiffel_settings = 'eiffel;c:class;f:feature' ++ ++" erlang language ++let s:tlist_def_erlang_settings = 'erlang;d:macro;r:record;m:module;f:function' ++ ++" expect (same as tcl) language ++let s:tlist_def_expect_settings = 'tcl;c:class;f:method;p:procedure' ++ ++" fortran language ++let s:tlist_def_fortran_settings = 'fortran;p:program;b:block data;' . ++ \ 'c:common;e:entry;i:interface;k:type;l:label;m:module;' . ++ \ 'n:namelist;t:derived;v:variable;f:function;s:subroutine' ++ ++" HTML language ++let s:tlist_def_html_settings = 'html;a:anchor;f:javascript function' ++ ++" java language ++let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' . ++ \ 'f:field;m:method' ++ ++" javascript language ++let s:tlist_def_javascript_settings = 'javascript;f:function' ++ ++" lisp language ++let s:tlist_def_lisp_settings = 'lisp;f:function' ++ ++" lua language ++let s:tlist_def_lua_settings = 'lua;f:function' ++ ++" makefiles ++let s:tlist_def_make_settings = 'make;m:macro' ++ ++" pascal language ++let s:tlist_def_pascal_settings = 'pascal;f:function;p:procedure' ++ ++" perl language ++let s:tlist_def_perl_settings = 'perl;c:constant;l:label;p:package;s:subroutine' ++ ++" php language ++let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function' ++ ++" python language ++let s:tlist_def_python_settings = 'python;c:class;m:member;f:function' ++ ++" rexx language ++let s:tlist_def_rexx_settings = 'rexx;s:subroutine' ++ ++" ruby language ++let s:tlist_def_ruby_settings = 'ruby;c:class;f:method;F:function;' . ++ \ 'm:singleton method' ++ ++" scheme language ++let s:tlist_def_scheme_settings = 'scheme;s:set;f:function' ++ ++" shell language ++let s:tlist_def_sh_settings = 'sh;f:function' ++ ++" C shell language ++let s:tlist_def_csh_settings = 'sh;f:function' ++ ++" Z shell language ++let s:tlist_def_zsh_settings = 'sh;f:function' ++ ++" slang language ++let s:tlist_def_slang_settings = 'slang;n:namespace;f:function' ++ ++" sml language ++let s:tlist_def_sml_settings = 'sml;e:exception;c:functor;s:signature;' . ++ \ 'r:structure;t:type;v:value;f:function' ++ ++" sql language ++let s:tlist_def_sql_settings = 'sql;c:cursor;F:field;P:package;r:record;' . ++ \ 's:subtype;t:table;T:trigger;v:variable;f:function;p:procedure' ++ ++" tcl language ++let s:tlist_def_tcl_settings = 'tcl;c:class;f:method;m:method;p:procedure' ++ ++" vera language ++let s:tlist_def_vera_settings = 'vera;c:class;d:macro;e:enumerator;' . ++ \ 'f:function;g:enum;m:member;p:program;' . ++ \ 'P:prototype;t:task;T:typedef;v:variable;' . ++ \ 'x:externvar' ++ ++"verilog language ++let s:tlist_def_verilog_settings = 'verilog;m:module;c:constant;P:parameter;' . ++ \ 'e:event;r:register;t:task;w:write;p:port;v:variable;f:function' ++ ++" vim language ++let s:tlist_def_vim_settings = 'vim;a:autocmds;v:variable;f:function' ++ ++" yacc language ++let s:tlist_def_yacc_settings = 'yacc;l:label' ++ ++"------------------- end of language specific options -------------------- ++ ++" Vim window size is changed by the taglist plugin or not ++let s:tlist_winsize_chgd = -1 ++" Taglist window is maximized or not ++let s:tlist_win_maximized = 0 ++" Name of files in the taglist ++let s:tlist_file_names='' ++" Number of files in the taglist ++let s:tlist_file_count = 0 ++" Number of filetypes supported by taglist ++let s:tlist_ftype_count = 0 ++" Is taglist part of other plugins like winmanager or cream? ++let s:tlist_app_name = "none" ++" Are we displaying brief help text ++let s:tlist_brief_help = 1 ++" List of files removed on user request ++let s:tlist_removed_flist = "" ++" Index of current file displayed in the taglist window ++let s:tlist_cur_file_idx = -1 ++" Taglist menu is empty or not ++let s:tlist_menu_empty = 1 ++ ++" An autocommand is used to refresh the taglist window when entering any ++" buffer. We don't want to refresh the taglist window if we are entering the ++" file window from one of the taglist functions. The 'Tlist_Skip_Refresh' ++" variable is used to skip the refresh of the taglist window and is set ++" and cleared appropriately. ++let s:Tlist_Skip_Refresh = 0 ++ ++" 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 ++ call setline('$', ' ') ++ endif ++ ++ if s:tlist_brief_help ++ " Add the brief help ++ call append(0, '" Press to display help text') ++ else ++ " Add the extensive help ++ call append(0, '" : Jump to tag definition') ++ call append(1, '" o : Jump to tag definition in new window') ++ call append(2, '" p : Preview the tag definition') ++ call append(3, '" : Display tag prototype') ++ call append(4, '" u : Update tag list') ++ call append(5, '" s : Select sort field') ++ call append(6, '" d : Remove file from taglist') ++ call append(7, '" x : Zoom-out/Zoom-in taglist window') ++ call append(8, '" + : Open a fold') ++ call append(9, '" - : Close a fold') ++ call append(10, '" * : Open all folds') ++ call append(11, '" = : Close all folds') ++ 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') ++ endif ++endfunction ++ ++" Tlist_Window_Toggle_Help_Text() ++" Toggle taglist plugin help text between the full version and the brief ++" version ++function! s:Tlist_Window_Toggle_Help_Text() ++ if g:Tlist_Compact_Format ++ " In compact display mode, do not display help ++ return ++ endif ++ ++ " Include the empty line displayed after the help text ++ let brief_help_size = 1 ++ let full_help_size = 16 ++ ++ setlocal modifiable ++ ++ " Set report option to a huge value to prevent informational messages ++ " while deleting the lines ++ let old_report = &report ++ set report=99999 ++ ++ " Remove the currently highlighted tag. Otherwise, the help text ++ " might be highlighted by mistake ++ match none ++ ++ " Toggle between brief and full help text ++ if s:tlist_brief_help ++ let s:tlist_brief_help = 0 ++ ++ " Remove the previous help ++ exe '1,' . brief_help_size . ' delete _' ++ ++ " Adjust the start/end line numbers for the files ++ call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) ++ else ++ let s:tlist_brief_help = 1 ++ ++ " Remove the previous help ++ exe '1,' . full_help_size . ' delete _' ++ ++ " Adjust the start/end line numbers for the files ++ call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) ++ endif ++ ++ call s:Tlist_Window_Display_Help() ++ ++ " Restore the report option ++ let &report = old_report ++ ++ setlocal nomodifiable ++endfunction ++ ++" Taglist debug support ++let s:tlist_debug = 0 ++ ++" File for storing the debug messages ++let s:tlist_debug_file = '' ++ ++" Tlist_Debug_Enable ++" Enable logging of taglist debug messages. ++function! s:Tlist_Debug_Enable(...) ++ let s:tlist_debug = 1 ++ ++ " Check whether a valid file name is supplied. ++ if a:1 != '' ++ let s:tlist_debug_file = fnamemodify(a:1, ':p') ++ ++ " Empty the log file ++ exe 'redir! > ' . s:tlist_debug_file ++ redir END ++ ++ " Check whether the log file is present/created ++ if !filewritable(s:tlist_debug_file) ++ call s:Tlist_Warning_Msg('Taglist: Unable to create log file ' ++ \ . s:tlist_debug_file) ++ let s:tlist_debug_file = '' ++ endif ++ endif ++endfunction ++ ++" Tlist_Debug_Disable ++" Disable logging of taglist debug messages. ++function! s:Tlist_Debug_Disable(...) ++ let s:tlist_debug = 0 ++ let s:tlist_debug_file = '' ++endfunction ++ ++" Tlist_Debug_Show ++" Display the taglist debug messages in a new window ++function! s:Tlist_Debug_Show() ++ if s:tlist_msg == '' ++ call s:Tlist_Warning_Msg('Taglist: No debug messages') ++ return ++ endif ++ ++ " Open a new window to display the taglist debug messages ++ new taglist_debug.txt ++ " Delete all the lines (if the buffer already exists) ++ silent! %delete _ ++ " Add the messages ++ silent! put =s:tlist_msg ++ " Move the cursor to the first line ++ normal! gg ++endfunction ++ ++" Tlist_Log_Msg ++" Log the supplied debug message along with the time ++function! s:Tlist_Log_Msg(msg) ++ if s:tlist_debug ++ if s:tlist_debug_file != '' ++ exe 'redir >> ' . s:tlist_debug_file ++ silent echon strftime('%H:%M:%S') . ': ' . a:msg . "\n" ++ redir END ++ else ++ " Log the message into a variable ++ " Retain only the last 3000 characters ++ let len = strlen(s:tlist_msg) ++ if len > 3000 ++ let s:tlist_msg = strpart(s:tlist_msg, len - 3000) ++ endif ++ let s:tlist_msg = s:tlist_msg . strftime('%H:%M:%S') . ': ' . ++ \ a:msg . "\n" ++ endif ++ endif ++endfunction ++ ++" Tlist_Warning_Msg() ++" Display a message using WarningMsg highlight group ++function! s:Tlist_Warning_Msg(msg) ++ echohl WarningMsg ++ echomsg a:msg ++ echohl None ++endfunction ++ ++" Last returned file index for file name lookup. ++" Used to speed up file lookup ++let s:tlist_file_name_idx_cache = -1 ++ ++" Tlist_Get_File_Index() ++" Return the index of the specified filename ++function! s:Tlist_Get_File_Index(fname) ++ if s:tlist_file_count == 0 || a:fname == '' ++ return -1 ++ endif ++ ++ " If the new filename is same as the last accessed filename, then ++ " return that index ++ if s:tlist_file_name_idx_cache != -1 && ++ \ s:tlist_file_name_idx_cache < s:tlist_file_count ++ if s:tlist_{s:tlist_file_name_idx_cache}_filename == a:fname ++ " Same as the last accessed file ++ return s:tlist_file_name_idx_cache ++ endif ++ endif ++ ++ " First, check whether the filename is present ++ let s_fname = a:fname . "\n" ++ let i = stridx(s:tlist_file_names, s_fname) ++ if i == -1 ++ let s:tlist_file_name_idx_cache = -1 ++ return -1 ++ endif ++ ++ " Second, compute the file name index ++ let nl_txt = substitute(strpart(s:tlist_file_names, 0, i), "[^\n]", '', 'g') ++ let s:tlist_file_name_idx_cache = strlen(nl_txt) ++ return s:tlist_file_name_idx_cache ++endfunction ++ ++" Last returned file index for line number lookup. ++" Used to speed up file lookup ++let s:tlist_file_lnum_idx_cache = -1 ++ ++" 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_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 ++ if s:tlist_file_lnum_idx_cache != -1 && ++ \ s:tlist_file_lnum_idx_cache < s:tlist_file_count ++ if a:lnum >= s:tlist_{s:tlist_file_lnum_idx_cache}_start && ++ \ a:lnum <= s:tlist_{s:tlist_file_lnum_idx_cache}_end ++ return s:tlist_file_lnum_idx_cache ++ endif ++ endif ++ ++ let fidx = -1 ++ ++ 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 ++ ++ endif ++ else ++ " 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 ++ ++ return fidx ++endfunction ++ ++" Tlist_Exe_Cmd_No_Acmds ++" Execute the specified Ex command after disabling autocommands ++function! s:Tlist_Exe_Cmd_No_Acmds(cmd) ++ let old_eventignore = &eventignore ++ set eventignore=all ++ exe a:cmd ++ let &eventignore = old_eventignore ++endfunction ++ ++" Tlist_Skip_File() ++" Check whether tag listing is supported for the specified file ++function! s:Tlist_Skip_File(filename, ftype) ++ " Skip buffers with no names and buffers with filetype not set ++ if a:filename == '' || a:ftype == '' ++ return 1 ++ endif ++ ++ " Skip files which are not supported by exuberant ctags ++ " First check whether default settings for this filetype are available. ++ " If it is not available, then check whether user specified settings are ++ " available. If both are not available, then don't list the tags for this ++ " filetype ++ let var = 's:tlist_def_' . a:ftype . '_settings' ++ if !exists(var) ++ let var = 'g:tlist_' . a:ftype . '_settings' ++ if !exists(var) ++ return 1 ++ endif ++ endif ++ ++ " Skip files which are not readable or files which are not yet stored ++ " to the disk ++ if !filereadable(a:filename) ++ return 1 ++ endif ++ ++ return 0 ++endfunction ++ ++" Tlist_User_Removed_File ++" Returns 1 if a file is removed by a user from the taglist ++function! s:Tlist_User_Removed_File(filename) ++ return stridx(s:tlist_removed_flist, a:filename . "\n") != -1 ++endfunction ++ ++" Tlist_Update_Remove_List ++" Update the list of user removed files from the taglist ++" add == 1, add the file to the removed list ++" add == 0, delete the file from the removed list ++function! s:Tlist_Update_Remove_List(filename, add) ++ if a:add ++ let s:tlist_removed_flist = s:tlist_removed_flist . a:filename . "\n" ++ else ++ let idx = stridx(s:tlist_removed_flist, a:filename . "\n") ++ let text_before = strpart(s:tlist_removed_flist, 0, idx) ++ let rem_text = strpart(s:tlist_removed_flist, idx) ++ let next_idx = stridx(rem_text, "\n") ++ let text_after = strpart(rem_text, next_idx + 1) ++ ++ let s:tlist_removed_flist = text_before . text_after ++ endif ++endfunction ++ ++" Tlist_FileType_Init ++" Initialize the ctags arguments and tag variable for the specified ++" file type ++function! s:Tlist_FileType_Init(ftype) ++ call s:Tlist_Log_Msg('Tlist_FileType_Init (' . a:ftype . ')') ++ " If the user didn't specify any settings, then use the default ++ " ctags args. Otherwise, use the settings specified by the user ++ let var = 'g:tlist_' . a:ftype . '_settings' ++ if exists(var) ++ " User specified ctags arguments ++ let settings = {var} . ';' ++ else ++ " Default ctags arguments ++ let var = 's:tlist_def_' . a:ftype . '_settings' ++ if !exists(var) ++ " No default settings for this file type. This filetype is ++ " not supported ++ return 0 ++ endif ++ let settings = s:tlist_def_{a:ftype}_settings . ';' ++ endif ++ ++ let msg = 'Taglist: Invalid ctags option setting - ' . settings ++ ++ " Format of the option that specifies the filetype and ctags arugments: ++ " ++ " ;flag1:name1;flag2:name2;flag3:name3 ++ " ++ ++ " Extract the file type to pass to ctags. This may be different from the ++ " file type detected by Vim ++ let pos = stridx(settings, ';') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let ctags_ftype = strpart(settings, 0, pos) ++ if ctags_ftype == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ " Make sure a valid filetype is supplied. If the user didn't specify a ++ " valid filetype, then the ctags option settings may be treated as the ++ " filetype ++ if ctags_ftype =~ ':' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ ++ " Remove the file type from settings ++ let settings = strpart(settings, pos + 1) ++ if settings == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ ++ " Process all the specified ctags flags. The format is ++ " flag1:name1;flag2:name2;flag3:name3 ++ let ctags_flags = '' ++ let cnt = 0 ++ while settings != '' ++ " Extract the flag ++ let pos = stridx(settings, ':') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let flag = strpart(settings, 0, pos) ++ if flag == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ " Remove the flag from settings ++ let settings = strpart(settings, pos + 1) ++ ++ " Extract the tag type name ++ let pos = stridx(settings, ';') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let name = strpart(settings, 0, pos) ++ if name == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let settings = strpart(settings, pos + 1) ++ ++ let cnt = cnt + 1 ++ ++ let s:tlist_{a:ftype}_{cnt}_name = flag ++ let s:tlist_{a:ftype}_{cnt}_fullname = name ++ let ctags_flags = ctags_flags . flag ++ endwhile ++ ++ let s:tlist_{a:ftype}_ctags_args = '--language-force=' . ctags_ftype . ++ \ ' --' . ctags_ftype . '-types=' . ctags_flags ++ let s:tlist_{a:ftype}_count = cnt ++ let s:tlist_{a:ftype}_ctags_flags = ctags_flags ++ ++ " Save the filetype name ++ let s:tlist_ftype_{s:tlist_ftype_count}_name = a:ftype ++ let s:tlist_ftype_count = s:tlist_ftype_count + 1 ++ ++ return 1 ++endfunction ++ ++" Tlist_Get_Filetype ++" Determine the filetype for the specified file ++function! s:Tlist_Get_Filetype(fname) ++ " Ignore the filetype autocommands ++ let old_eventignore = &eventignore ++ set eventignore=FileType ++ ++ " Save the 'filetype', as this will be changed temporarily ++ let old_filetype = &filetype ++ ++ " Run the filetypedetect group of autocommands to determine ++ " the filetype ++ exe 'doautocmd filetypedetect BufRead ' . a:fname ++ ++ " Save the detected filetype ++ let ftype = &filetype ++ ++ " Restore the previous state ++ let &filetype = old_filetype ++ let &eventignore = old_eventignore ++ ++ return ftype ++endfunction ++ ++" Tlist_Get_Buffer_Filetype ++" Get the filetype for the specified buffer ++function! s:Tlist_Get_Buffer_Filetype(bnum) ++ if bufloaded(a:bnum) ++ " For loaded buffers, the 'filetype' is already determined ++ return getbufvar(a:bnum, '&filetype') ++ endif ++ ++ " For unloaded buffers, if the 'filetype' option is set, return it ++ let ftype = getbufvar(a:bnum, '&filetype') ++ if ftype != '' ++ return ftype ++ endif ++ ++ " Skip non-existent buffers ++ if !bufexists(a:bnum) ++ return '' ++ endif ++ ++ " For buffers whose filetype is not yet determined, try to determine ++ " the filetype ++ let bname = bufname(a:bnum) ++ ++ return s:Tlist_Get_Filetype(bname) ++endfunction ++ ++" Tlist_Discard_TagInfo ++" Discard the stored tag information for a file ++function! s:Tlist_Discard_TagInfo(fidx) ++ call s:Tlist_Log_Msg('Tlist_Discard_TagInfo (' . ++ \ s:tlist_{a:fidx}_filename . ')') ++ let ftype = s:tlist_{a:fidx}_filetype ++ ++ " Discard information about the tags defined in the file ++ let i = 1 ++ while i <= s:tlist_{a:fidx}_tag_count ++ let fidx_i = 's:tlist_' . a:fidx . '_' . i ++ unlet! {fidx_i}_tag ++ unlet! {fidx_i}_tag_name ++ unlet! {fidx_i}_tag_type ++ unlet! {fidx_i}_ttype_idx ++ unlet! {fidx_i}_tag_proto ++ unlet! {fidx_i}_tag_searchpat ++ unlet! {fidx_i}_tag_linenum ++ let i = i + 1 ++ endwhile ++ ++ let s:tlist_{a:fidx}_tag_count = 0 ++ ++ " Discard information about tag type groups ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ if s:tlist_{a:fidx}_{ttype} != '' ++ let fidx_ttype = 's:tlist_' . a:fidx . '_' . ttype ++ let {fidx_ttype} = '' ++ let {fidx_ttype}_offset = 0 ++ let cnt = {fidx_ttype}_count ++ let {fidx_ttype}_count = 0 ++ let j = 1 ++ while j <= cnt ++ unlet! {fidx_ttype}_{j} ++ let j = j + 1 ++ endwhile ++ endif ++ let i = i + 1 ++ endwhile ++ ++ " Discard the stored menu command also ++ let s:tlist_{a:fidx}_menu_cmd = '' ++endfunction ++ ++" 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_Window_Update_Line_Offsets(start_idx, increment, offset) ++ let i = a:start_idx ++ ++ while i < s:tlist_file_count ++ if s:tlist_{i}_visible ++ " Update the start/end line number only if the file is visible ++ if a:increment ++ let s:tlist_{i}_start = s:tlist_{i}_start + a:offset ++ let s:tlist_{i}_end = s:tlist_{i}_end + a:offset ++ else ++ let s:tlist_{i}_start = s:tlist_{i}_start - a:offset ++ let s:tlist_{i}_end = s:tlist_{i}_end - a:offset ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++endfunction ++ ++" Tlist_Discard_FileInfo ++" Discard the stored information for a file ++function! s:Tlist_Discard_FileInfo(fidx) ++ call s:Tlist_Log_Msg('Tlist_Discard_FileInfo (' . ++ \ s:tlist_{a:fidx}_filename . ')') ++ call s:Tlist_Discard_TagInfo(a:fidx) ++ ++ let ftype = s:tlist_{a:fidx}_filetype ++ ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ unlet! s:tlist_{a:fidx}_{ttype} ++ unlet! s:tlist_{a:fidx}_{ttype}_offset ++ unlet! s:tlist_{a:fidx}_{ttype}_count ++ let i = i + 1 ++ endwhile ++ ++ unlet! s:tlist_{a:fidx}_filename ++ unlet! s:tlist_{a:fidx}_sort_type ++ unlet! s:tlist_{a:fidx}_filetype ++ unlet! s:tlist_{a:fidx}_mtime ++ unlet! s:tlist_{a:fidx}_start ++ unlet! s:tlist_{a:fidx}_end ++ unlet! s:tlist_{a:fidx}_valid ++ unlet! s:tlist_{a:fidx}_visible ++ unlet! s:tlist_{a:fidx}_tag_count ++ unlet! s:tlist_{a:fidx}_menu_cmd ++endfunction ++ ++" Tlist_Window_Remove_File_From_Display ++" Remove the specified 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 ++ return ++ endif ++ ++ " Remove the tags displayed for the specified file from the window ++ let start = s:tlist_{a:fidx}_start ++ " Include the empty line after the last line also ++ if g:Tlist_Compact_Format ++ let end = s:tlist_{a:fidx}_end ++ else ++ let end = s:tlist_{a:fidx}_end + 1 ++ endif ++ ++ setlocal modifiable ++ exe 'silent! ' . start . ',' . end . 'delete _' ++ setlocal nomodifiable ++ ++ " 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_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) ++endfunction ++ ++" Tlist_Remove_File ++" Remove the file under the cursor or the specified file index ++" user_request - User requested to remove the file from taglist ++function! s:Tlist_Remove_File(file_idx, user_request) ++ let fidx = a:file_idx ++ ++ if fidx == -1 ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ endif ++ call s:Tlist_Log_Msg('Tlist_Remove_File (' . ++ \ s:tlist_{fidx}_filename . ', ' . a:user_request . ')') ++ ++ let save_winnr = winnr() ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Taglist window is open, remove the file from display ++ ++ if save_winnr != winnum ++ let old_eventignore = &eventignore ++ set eventignore=all ++ exe winnum . 'wincmd w' ++ endif ++ ++ call s:Tlist_Window_Remove_File_From_Display(fidx) ++ ++ if save_winnr != winnum ++ exe save_winnr . 'wincmd w' ++ let &eventignore = old_eventignore ++ endif ++ endif ++ ++ let fname = s:tlist_{fidx}_filename ++ ++ if a:user_request ++ " As the user requested to remove the file from taglist, ++ " add it to the removed list ++ call s:Tlist_Update_Remove_List(fname, 1) ++ endif ++ ++ " Remove the file name from the taglist list of filenames ++ let idx = stridx(s:tlist_file_names, fname . "\n") ++ let text_before = strpart(s:tlist_file_names, 0, idx) ++ let rem_text = strpart(s:tlist_file_names, idx) ++ let next_idx = stridx(rem_text, "\n") ++ let text_after = strpart(rem_text, next_idx + 1) ++ let s:tlist_file_names = text_before . text_after ++ ++ call s:Tlist_Discard_FileInfo(fidx) ++ ++ " Shift all the file variables by one index ++ let i = fidx + 1 ++ ++ while i < s:tlist_file_count ++ let j = i - 1 ++ ++ let s:tlist_{j}_filename = s:tlist_{i}_filename ++ let s:tlist_{j}_sort_type = s:tlist_{i}_sort_type ++ let s:tlist_{j}_filetype = s:tlist_{i}_filetype ++ let s:tlist_{j}_mtime = s:tlist_{i}_mtime ++ let s:tlist_{j}_start = s:tlist_{i}_start ++ let s:tlist_{j}_end = s:tlist_{i}_end ++ let s:tlist_{j}_valid = s:tlist_{i}_valid ++ let s:tlist_{j}_visible = s:tlist_{i}_visible ++ let s:tlist_{j}_tag_count = s:tlist_{i}_tag_count ++ let s:tlist_{j}_menu_cmd = s:tlist_{i}_menu_cmd ++ ++ let k = 1 ++ while k <= s:tlist_{j}_tag_count ++ let s:tlist_{j}_{k}_tag = s:tlist_{i}_{k}_tag ++ let s:tlist_{j}_{k}_tag_name = s:tlist_{i}_{k}_tag_name ++ let s:tlist_{j}_{k}_tag_type = s:Tlist_Get_Tag_Type_By_Tag(i, k) ++ let s:tlist_{j}_{k}_ttype_idx = s:tlist_{i}_{k}_ttype_idx ++ let s:tlist_{j}_{k}_tag_proto = s:Tlist_Get_Tag_Prototype(i, k) ++ let s:tlist_{j}_{k}_tag_searchpat = s:Tlist_Get_Tag_SearchPat(i, k) ++ let s:tlist_{j}_{k}_tag_linenum = s:Tlist_Get_Tag_Linenum(i, k) ++ let k = k + 1 ++ endwhile ++ ++ let ftype = s:tlist_{i}_filetype ++ ++ let k = 1 ++ while k <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{k}_name ++ let s:tlist_{j}_{ttype} = s:tlist_{i}_{ttype} ++ let s:tlist_{j}_{ttype}_offset = s:tlist_{i}_{ttype}_offset ++ let s:tlist_{j}_{ttype}_count = s:tlist_{i}_{ttype}_count ++ if s:tlist_{j}_{ttype} != '' ++ let l = 1 ++ while l <= s:tlist_{j}_{ttype}_count ++ let s:tlist_{j}_{ttype}_{l} = s:tlist_{i}_{ttype}_{l} ++ let l = l + 1 ++ endwhile ++ endif ++ let k = k + 1 ++ endwhile ++ ++ " As the file and tag information is copied to the new index, ++ " discard the previous information ++ call s:Tlist_Discard_FileInfo(i) ++ ++ let i = i + 1 ++ endwhile ++ ++ " Reduce the number of files displayed ++ let s:tlist_file_count = s:tlist_file_count - 1 ++ ++ if g:Tlist_Show_One_File ++ " If the tags for only one file is displayed and if we just ++ " now removed that file, then invalidate the current file idx ++ if s:tlist_cur_file_idx == fidx ++ let s:tlist_cur_file_idx = -1 ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Goto_Window ++" Goto the taglist window ++function! s:Tlist_Window_Goto_Window() ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ if winnr() != winnum ++ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Create ++" Create a new taglist window. If it is already open, jump to it ++function! s:Tlist_Window_Create() ++ call s:Tlist_Log_Msg('Tlist_Window_Create()') ++ " If the window is open, jump to it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Jump to the existing window ++ if winnr() != winnum ++ exe winnum . 'wincmd w' ++ endif ++ return ++ endif ++ ++ " If used with winmanager don't open windows. Winmanager will handle ++ " the window/buffer management ++ if s:tlist_app_name == "winmanager" ++ return ++ endif ++ ++ " Create a new window. If user prefers a horizontal window, then open ++ " a horizontally split window. Otherwise open a vertically split ++ " window ++ if g:Tlist_Use_Horiz_Window ++ " Open a horizontally split window ++ let win_dir = 'botright' ++ " Horizontal window height ++ let win_size = g:Tlist_WinHeight ++ else ++ if s:tlist_winsize_chgd == -1 ++ " Open a vertically split window. Increase the window size, if ++ " needed, to accomodate the new window ++ if g:Tlist_Inc_Winwidth && ++ \ &columns < (80 + g:Tlist_WinWidth) ++ " Save the original window position ++ let s:tlist_pre_winx = getwinposx() ++ let s:tlist_pre_winy = getwinposy() ++ ++ " one extra column is needed to include the vertical split ++ let &columns= &columns + g:Tlist_WinWidth + 1 ++ ++ let s:tlist_winsize_chgd = 1 ++ else ++ let s:tlist_winsize_chgd = 0 ++ endif ++ endif ++ ++ if g:Tlist_Use_Right_Window ++ " Open the window at the rightmost place ++ let win_dir = 'botright vertical' ++ else ++ " Open the window at the leftmost place ++ let win_dir = 'topleft vertical' ++ endif ++ let win_size = g:Tlist_WinWidth ++ endif ++ ++ " If the tag listing temporary buffer already exists, then reuse it. ++ " Otherwise create a new buffer ++ let bufnum = bufnr(g:TagList_title) ++ if bufnum == -1 ++ " Create a new buffer ++ let wcmd = g:TagList_title ++ else ++ " Edit the existing buffer ++ let wcmd = '+buffer' . bufnum ++ endif ++ ++ " Create the taglist window ++ exe 'silent! ' . win_dir . ' ' . win_size . 'split ' . wcmd ++ ++ " Save the new window position ++ let s:tlist_winx = getwinposx() ++ let s:tlist_winy = getwinposy() ++ ++ " Initialize the taglist window ++ call s:Tlist_Window_Init() ++endfunction ++ ++" Tlist_Window_Zoom ++" Zoom (maximize/minimize) the taglist window ++function! s:Tlist_Window_Zoom() ++ if s:tlist_win_maximized ++ " Restore the window back to the previous size ++ if g:Tlist_Use_Horiz_Window ++ exe 'resize ' . g:Tlist_WinHeight ++ else ++ exe 'vert resize ' . g:Tlist_WinWidth ++ endif ++ let s:tlist_win_maximized = 0 ++ else ++ " Set the window size to the maximum possible without closing other ++ " windows ++ if g:Tlist_Use_Horiz_Window ++ resize ++ else ++ vert resize ++ endif ++ let s:tlist_win_maximized = 1 ++ endif ++endfunction ++ ++" Tlist_Ballon_Expr ++" When the mouse cursor is over a tag in the taglist window, display the ++" tag prototype (balloon) ++function! Tlist_Ballon_Expr() ++ " Get the file index ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(v:beval_lnum) ++ if fidx == -1 ++ return '' ++ endif ++ ++ " Get the tag output line for the current tag ++ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, v:beval_lnum) ++ if tidx == 0 ++ return '' ++ endif ++ ++ " Get the tag search pattern and display it ++ return s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Window_Check_Width ++" Check the width of the taglist window. For horizontally split windows, the ++" 'winfixheight' option is used to fix the height of the window. For ++" vertically split windows, Vim doesn't support the 'winfixwidth' option. So ++" need to handle window width changes from this function. ++function! s:Tlist_Window_Check_Width() ++ let tlist_winnr = bufwinnr(g:TagList_title) ++ if tlist_winnr == -1 ++ return ++ endif ++ ++ let width = winwidth(tlist_winnr) ++ if width != g:Tlist_WinWidth ++ call s:Tlist_Log_Msg("Tlist_Window_Check_Width: Changing window " . ++ \ "width from " . width . " to " . g:Tlist_WinWidth) ++ let save_winnr = winnr() ++ if save_winnr != tlist_winnr ++ call s:Tlist_Exe_Cmd_No_Acmds(tlist_winnr . 'wincmd w') ++ endif ++ exe 'vert resize ' . g:Tlist_WinWidth ++ if save_winnr != tlist_winnr ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Exit_Only_Window ++" If the 'Tlist_Exit_OnlyWindow' option is set, then exit Vim if only the ++" taglist window is present. ++function! s:Tlist_Window_Exit_Only_Window() ++ " Before quitting Vim, delete the taglist buffer so that ++ " the '0 mark is correctly set to the previous buffer. ++ if v:version < 700 ++ if winbufnr(2) == -1 ++ bdelete ++ quit ++ endif ++ else ++ if winbufnr(2) == -1 ++ if tabpagenr('$') == 1 ++ " Only one tag page is present ++ bdelete ++ quit ++ else ++ " More than one tab page is present. Close only the current ++ " tab page ++ close ++ endif ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Init ++" Set the default options for the taglist window ++function! s:Tlist_Window_Init() ++ call s:Tlist_Log_Msg('Tlist_Window_Init()') ++ ++ " The 'readonly' option should not be set for the taglist buffer. ++ " If Vim is started as "view/gview" or if the ":view" command is ++ " used, then the 'readonly' option is set for all the buffers. ++ " Unset it for the taglist buffer ++ setlocal noreadonly ++ ++ " Set the taglist buffer filetype to taglist ++ setlocal filetype=taglist ++ ++ " Define taglist window element highlighting ++ syntax match TagListComment '^" .*' ++ syntax match TagListFileName '^[^" ].*$' ++ syntax match TagListTitle '^ \S.*$' ++ syntax match TagListTagScope '\s\[.\{-\}\]$' ++ ++ " Define the highlighting only if colors are supported ++ if has('gui_running') || &t_Co > 2 ++ " 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 default link TagListTagName Search ++ endif ++ " Colors to highlight comments and titles ++ if hlexists('MyTagListComment') ++ highlight link TagListComment MyTagListComment ++ else ++ highlight clear TagListComment ++ highlight default link TagListComment Comment ++ endif ++ if hlexists('MyTagListTitle') ++ highlight link TagListTitle MyTagListTitle ++ else ++ highlight clear TagListTitle ++ highlight default link TagListTitle Title ++ endif ++ if hlexists('MyTagListFileName') ++ highlight link TagListFileName MyTagListFileName ++ else ++ highlight clear TagListFileName ++ highlight default TagListFileName guibg=Grey ctermbg=darkgray ++ \ guifg=white ctermfg=white ++ endif ++ if hlexists('MyTagListTagScope') ++ highlight link TagListTagScope MyTagListTagScope ++ else ++ highlight clear TagListTagScope ++ highlight default link TagListTagScope Identifier ++ endif ++ else ++ highlight default TagListTagName term=reverse cterm=reverse ++ endif ++ ++ " Folding related settings ++ setlocal foldenable ++ setlocal foldminlines=0 ++ setlocal foldmethod=manual ++ setlocal foldlevel=9999 ++ if g:Tlist_Enable_Fold_Column ++ setlocal foldcolumn=3 ++ else ++ setlocal foldcolumn=0 ++ endif ++ setlocal foldtext=v:folddashes.getline(v:foldstart) ++ ++ if s:tlist_app_name != "winmanager" ++ " Mark buffer as scratch ++ silent! setlocal buftype=nofile ++ if s:tlist_app_name == "none" ++ silent! setlocal bufhidden=delete ++ endif ++ silent! setlocal noswapfile ++ " Due to a bug in Vim 6.0, the winbufnr() function fails for unlisted ++ " buffers. So if the taglist buffer is unlisted, multiple taglist ++ " windows will be opened. This bug is fixed in Vim 6.1 and above ++ if v:version >= 601 ++ silent! setlocal nobuflisted ++ endif ++ endif ++ ++ silent! setlocal nowrap ++ ++ " If the 'number' option is set in the source window, it will affect the ++ " taglist window. So forcefully disable 'number' option for the taglist ++ " window ++ silent! setlocal nonumber ++ ++ " Use fixed height when horizontally split window is used ++ if g:Tlist_Use_Horiz_Window ++ if v:version >= 602 ++ set winfixheight ++ endif ++ endif ++ if !g:Tlist_Use_Horiz_Window && v:version >= 700 ++ set winfixwidth ++ endif ++ ++ " Setup balloon evaluation to display tag prototype ++ if v:version >= 700 && has('balloon_eval') ++ setlocal balloonexpr=Tlist_Ballon_Expr() ++ set ballooneval ++ 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_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 ++ nnoremap - :silent! foldclose ++ nnoremap * :silent! %foldopen! ++ nnoremap = :silent! %foldclose ++ nnoremap :silent! foldopen ++ nnoremap :silent! foldclose ++ nnoremap :silent! %foldopen! ++ 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_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_Window_Jump_To_Tag('useopen') ++ " Windows needs return ++ 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 ++ inoremap - :silent! foldclose ++ inoremap * :silent! %foldopen! ++ inoremap = :silent! %foldclose ++ inoremap :silent! foldopen ++ inoremap :silent! foldclose ++ inoremap :silent! %foldopen! ++ inoremap :call ++ \ 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_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 ++ if g:Tlist_Use_SingleClick == 1 ++ " Contributed by Bindu Wavell ++ " attempt to perform single click mapping, it would be much ++ " nicer if we could nnoremap ... however vim does ++ " not fire the when you use the mouse ++ " to enter a buffer. ++ let clickmap = ':if bufname("%") =~ "__Tag_List__" ' . ++ \ 'call Tlist_Window_Jump_To_Tag("useopen") ' . ++ \ ' endif ' ++ if maparg('', 'n') == '' ++ " no mapping for leftmouse ++ exe ':nnoremap ' . clickmap ++ else ++ " we have a mapping ++ let mapcmd = ':nnoremap ' ++ let mapcmd = mapcmd . substitute(substitute( ++ \ maparg('', 'n'), '|', '', 'g'), ++ \ '\c^', '', '') ++ let mapcmd = mapcmd . clickmap ++ exe mapcmd ++ endif ++ endif ++ ++ " Define the taglist autocommands ++ augroup TagListAutoCmds ++ autocmd! ++ " Display the tag prototype for the tag under the cursor. ++ autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info() ++ " Highlight the current tag periodically ++ 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 ++ autocmd BufUnload __Tag_List__ call s:Tlist_Post_Close_Cleanup() ++ " 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('')) ++ endif ++ " Exit Vim itself if only the taglist window is present (optional) ++ if g:Tlist_Exit_OnlyWindow ++ autocmd BufEnter __Tag_List__ nested ++ \ call s:Tlist_Window_Exit_Only_Window() ++ endif ++ if s:tlist_app_name != "winmanager" && ++ \ !g:Tlist_Process_File_Always && ++ \ (!has('gui_running') || !g:Tlist_Show_Menu) ++ " Auto refresh the taglist window ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ ++ if !g:Tlist_Use_Horiz_Window ++ if v:version < 700 ++ autocmd WinEnter * call s:Tlist_Window_Check_Width() ++ endif ++ endif ++ augroup end ++ ++ " Restore the previous cpoptions settings ++ let &cpoptions = old_cpoptions ++endfunction ++ ++" Tlist_Window_Refresh ++" Display the tags for all the files in the taglist window ++function! s:Tlist_Window_Refresh() ++ call s:Tlist_Log_Msg('Tlist_Window_Refresh()') ++ " Set report option to a huge value to prevent informational messages ++ " while deleting the lines ++ let old_report = &report ++ set report=99999 ++ ++ " Mark the buffer as modifiable ++ setlocal modifiable ++ ++ " Delete the contents of the buffer to the black-hole register ++ silent! %delete _ ++ ++ " As we have cleared the taglist window, mark all the files ++ " as not visible ++ let i = 0 ++ while i < s:tlist_file_count ++ let s:tlist_{i}_visible = 0 ++ let i = i + 1 ++ endwhile ++ ++ if g:Tlist_Compact_Format == 0 ++ " Display help in non-compact mode ++ call s:Tlist_Window_Display_Help() ++ endif ++ ++ " Mark the buffer as not modifiable ++ setlocal nomodifiable ++ ++ " Restore the report option ++ let &report = old_report ++ ++ " If the tags for only one file should be displayed in the taglist ++ " window, then no need to add the tags here. The bufenter autocommand ++ " will add the tags for that file. ++ if g:Tlist_Show_One_File ++ return ++ endif ++ ++ " List all the tags for the previously processed files ++ " Do this only if taglist is configured to display tags for more than ++ " one file. Otherwise, when Tlist_Show_One_File is configured, ++ " tags for the wrong file will be displayed. ++ let i = 0 ++ while i < s:tlist_file_count ++ call s:Tlist_Window_Refresh_File(s:tlist_{i}_filename, ++ \ s:tlist_{i}_filetype) ++ let i = i + 1 ++ endwhile ++ ++ if g:Tlist_Auto_Update ++ " Add and list the tags for all buffers in the Vim buffer list ++ let i = 1 ++ let last_bufnum = bufnr('$') ++ while i <= last_bufnum ++ if buflisted(i) ++ let fname = fnamemodify(bufname(i), ':p') ++ let ftype = s:Tlist_Get_Buffer_Filetype(i) ++ " If the file doesn't support tag listing, skip it ++ if !s:Tlist_Skip_File(fname, ftype) ++ call s:Tlist_Window_Refresh_File(fname, ftype) ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++ endif ++ ++ " If Tlist_File_Fold_Auto_Close option is set, then close all the folds ++ if g:Tlist_File_Fold_Auto_Close ++ " Close all the folds ++ silent! %foldclose ++ endif ++ ++ " Move the cursor to the top of the taglist window ++ normal! gg ++endfunction ++ ++" Tlist_Post_Close_Cleanup() ++" Close the taglist window and adjust the Vim window width ++function! s:Tlist_Post_Close_Cleanup() ++ call s:Tlist_Log_Msg('Tlist_Post_Close_Cleanup()') ++ " Mark all the files as not visible ++ let i = 0 ++ while i < s:tlist_file_count ++ let s:tlist_{i}_visible = 0 ++ let i = i + 1 ++ endwhile ++ ++ " Remove the taglist autocommands ++ silent! autocmd! TagListAutoCmds ++ ++ " Clear all the highlights ++ match none ++ ++ silent! syntax clear TagListTitle ++ silent! syntax clear TagListComment ++ silent! syntax clear TagListTagScope ++ ++ " Remove the left mouse click mapping if it was setup initially ++ if g:Tlist_Use_SingleClick ++ if hasmapto('') ++ nunmap ++ endif ++ endif ++ ++ if s:tlist_app_name != "winmanager" ++ if g:Tlist_Use_Horiz_Window || g:Tlist_Inc_Winwidth == 0 || ++ \ s:tlist_winsize_chgd != 1 || ++ \ &columns < (80 + g:Tlist_WinWidth) ++ " No need to adjust window width if using horizontally split taglist ++ " window or if columns is less than 101 or if the user chose not to ++ " adjust the window width ++ else ++ " If the user didn't manually move the window, then restore the window ++ " position to the pre-taglist position ++ if s:tlist_pre_winx != -1 && s:tlist_pre_winy != -1 && ++ \ getwinposx() == s:tlist_winx && ++ \ getwinposy() == s:tlist_winy ++ exe 'winpos ' . s:tlist_pre_winx . ' ' . s:tlist_pre_winy ++ endif ++ ++ " Adjust the Vim window width ++ let &columns= &columns - (g:Tlist_WinWidth + 1) ++ endif ++ endif ++ ++ let s:tlist_winsize_chgd = -1 ++ ++ " Reset taglist state variables ++ if s:tlist_app_name == "winmanager" ++ let s:tlist_app_name = "none" ++ endif ++ let s:tlist_window_initialized = 0 ++endfunction ++ ++" Tlist_Window_Refresh_File() ++" List the tags defined in the specified file in a Vim window ++function! s:Tlist_Window_Refresh_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Window_Refresh_File (' . a:filename . ')') ++ " First check whether the file already exists ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx != -1 ++ let file_listed = 1 ++ else ++ let file_listed = 0 ++ endif ++ ++ if !file_listed ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(a:filename) ++ return ++ endif ++ endif ++ ++ if file_listed && s:tlist_{fidx}_visible ++ " Check whether the file tags are currently valid ++ if s:tlist_{fidx}_valid ++ " Goto the first line in the file ++ exe s:tlist_{fidx}_start ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ endif ++ return ++ endif ++ ++ " Discard and remove the tags for this file from display ++ call s:Tlist_Discard_TagInfo(fidx) ++ call s:Tlist_Window_Remove_File_From_Display(fidx) ++ endif ++ ++ " Process and generate a list of tags defined in the file ++ if !file_listed || !s:tlist_{fidx}_valid ++ let ret_fidx = s:Tlist_Process_File(a:filename, a:ftype) ++ if ret_fidx == -1 ++ return ++ endif ++ let fidx = ret_fidx ++ endif ++ ++ " Set report option to a huge value to prevent informational messages ++ " while adding lines to the taglist window ++ let old_report = &report ++ set report=99999 ++ ++ if g:Tlist_Show_One_File ++ " Remove the previous file ++ if s:tlist_cur_file_idx != -1 ++ 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 ++ endif ++ let s:tlist_cur_file_idx = fidx ++ endif ++ ++ " Mark the buffer as modifiable ++ setlocal modifiable ++ ++ " Add new files to the end of the window. For existing files, add them at ++ " the same line where they were previously present. If the file is not ++ " visible, then add it at the end ++ if s:tlist_{fidx}_start == 0 || !s:tlist_{fidx}_visible ++ if g:Tlist_Compact_Format ++ let s:tlist_{fidx}_start = line('$') ++ else ++ let s:tlist_{fidx}_start = line('$') + 1 ++ endif ++ endif ++ ++ let s:tlist_{fidx}_visible = 1 ++ ++ " Goto the line where this file should be placed ++ if g:Tlist_Compact_Format ++ exe s:tlist_{fidx}_start ++ else ++ exe s:tlist_{fidx}_start - 1 ++ endif ++ ++ let txt = fnamemodify(s:tlist_{fidx}_filename, ':t') . ' (' . ++ \ fnamemodify(s:tlist_{fidx}_filename, ':p:h') . ')' ++ if g:Tlist_Compact_Format == 0 ++ silent! put =txt ++ else ++ silent! put! =txt ++ " Move to the next line ++ exe line('.') + 1 ++ endif ++ let file_start = s:tlist_{fidx}_start ++ ++ " Add the tag names grouped by tag type to the buffer with a title ++ let i = 1 ++ let ttype_cnt = s:tlist_{a:ftype}_count ++ while i <= ttype_cnt ++ let ttype = s:tlist_{a:ftype}_{i}_name ++ " Add the tag type only if there are tags for that type ++ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype ++ let ttype_txt = {fidx_ttype} ++ if ttype_txt != '' ++ let txt = ' ' . s:tlist_{a:ftype}_{i}_fullname ++ if g:Tlist_Compact_Format == 0 ++ let ttype_start_lnum = line('.') + 1 ++ silent! put =txt ++ else ++ let ttype_start_lnum = line('.') ++ silent! put! =txt ++ endif ++ silent! put =ttype_txt ++ ++ let {fidx_ttype}_offset = ttype_start_lnum - file_start ++ ++ " create a fold for this tag type ++ let fold_start = ttype_start_lnum ++ let fold_end = fold_start + {fidx_ttype}_count ++ exe fold_start . ',' . fold_end . 'fold' ++ ++ " Adjust the cursor position ++ if g:Tlist_Compact_Format == 0 ++ exe ttype_start_lnum + {fidx_ttype}_count ++ else ++ exe ttype_start_lnum + {fidx_ttype}_count + 1 ++ endif ++ ++ if g:Tlist_Compact_Format == 0 ++ " Separate the tag types by a empty line ++ silent! put ='' ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++ ++ if s:tlist_{fidx}_tag_count == 0 ++ if g:Tlist_Compact_Format == 0 ++ silent! put ='' ++ endif ++ endif ++ ++ let s:tlist_{fidx}_end = line('.') - 1 ++ ++ " Create a fold for the entire file ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' ++ exe 'silent! ' . s:tlist_{fidx}_start . ',' . ++ \ s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Goto the starting line for this file, ++ exe s:tlist_{fidx}_start ++ ++ if s:tlist_app_name == "winmanager" ++ " To handle a bug in the winmanager plugin, add a space at the ++ " last line ++ call setline('$', ' ') ++ endif ++ ++ " Mark the buffer as not modifiable ++ setlocal nomodifiable ++ ++ " Restore the report option ++ let &report = old_report ++ ++ " Update the start and end line numbers for all the files following this ++ " file ++ let start = s:tlist_{fidx}_start ++ " include the empty line after the last line ++ if g:Tlist_Compact_Format ++ let end = s:tlist_{fidx}_end ++ else ++ let end = s:tlist_{fidx}_end + 1 ++ endif ++ 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) ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(1) ++ endif ++endfunction ++ ++" Tlist_Init_File ++" Initialize the variables for a new file ++function! s:Tlist_Init_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Init_File (' . a:filename . ')') ++ " Add new files at the end of the list ++ let fidx = s:tlist_file_count ++ let s:tlist_file_count = s:tlist_file_count + 1 ++ " Add the new file name to the taglist list of file names ++ let s:tlist_file_names = s:tlist_file_names . a:filename . "\n" ++ ++ " Initialize the file variables ++ let s:tlist_{fidx}_filename = a:filename ++ let s:tlist_{fidx}_sort_type = g:Tlist_Sort_Type ++ let s:tlist_{fidx}_filetype = a:ftype ++ let s:tlist_{fidx}_mtime = -1 ++ let s:tlist_{fidx}_start = 0 ++ let s:tlist_{fidx}_end = 0 ++ let s:tlist_{fidx}_valid = 0 ++ let s:tlist_{fidx}_visible = 0 ++ let s:tlist_{fidx}_tag_count = 0 ++ let s:tlist_{fidx}_menu_cmd = '' ++ ++ " Initialize the tag type variables ++ let i = 1 ++ while i <= s:tlist_{a:ftype}_count ++ let ttype = s:tlist_{a:ftype}_{i}_name ++ let s:tlist_{fidx}_{ttype} = '' ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = 0 ++ let i = i + 1 ++ endwhile ++ ++ return fidx ++endfunction ++ ++" Tlist_Get_Tag_Type_By_Tag ++" Return the tag type for the specified tag index ++function! s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) ++ let ttype_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_type' ++ ++ " Already parsed and have the tag name ++ if exists(ttype_var) ++ return {ttype_var} ++ endif ++ ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let {ttype_var} = s:Tlist_Extract_Tagtype(tag_line) ++ ++ return {ttype_var} ++endfunction ++ ++" Tlist_Get_Tag_Prototype ++function! s:Tlist_Get_Tag_Prototype(fidx, tidx) ++ let tproto_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_proto' ++ ++ " Already parsed and have the tag prototype ++ if exists(tproto_var) ++ return {tproto_var} ++ endif ++ ++ " Parse and extract the tag prototype ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = stridx(tag_line, '/^') + 2 ++ let end = stridx(tag_line, '/;"' . "\t") ++ if tag_line[end - 1] == '$' ++ let end = end -1 ++ endif ++ let tag_proto = strpart(tag_line, start, end - start) ++ let {tproto_var} = substitute(tag_proto, '\s*', '', '') ++ ++ return {tproto_var} ++endfunction ++ ++" Tlist_Get_Tag_SearchPat ++function! s:Tlist_Get_Tag_SearchPat(fidx, tidx) ++ let tpat_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_searchpat' ++ ++ " Already parsed and have the tag search pattern ++ if exists(tpat_var) ++ return {tpat_var} ++ endif ++ ++ " Parse and extract the tag search pattern ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = stridx(tag_line, '/^') + 2 ++ let end = stridx(tag_line, '/;"' . "\t") ++ if tag_line[end - 1] == '$' ++ let end = end -1 ++ endif ++ let {tpat_var} = '\V\^' . strpart(tag_line, start, end - start) . ++ \ (tag_line[end] == '$' ? '\$' : '') ++ ++ return {tpat_var} ++endfunction ++ ++" Tlist_Get_Tag_Linenum ++" Return the tag line number, given the tag index ++function! s:Tlist_Get_Tag_Linenum(fidx, tidx) ++ let tline_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_linenum' ++ ++ " Already parsed and have the tag line number ++ if exists(tline_var) ++ return {tline_var} ++ endif ++ ++ " Parse and extract the tag line number ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = strridx(tag_line, 'line:') + 5 ++ let end = strridx(tag_line, "\t") ++ if end < start ++ let {tline_var} = strpart(tag_line, start) + 0 ++ else ++ let {tline_var} = strpart(tag_line, start, end - start) + 0 ++ endif ++ ++ return {tline_var} ++endfunction ++ ++" Tlist_Parse_Tagline ++" Parse a tag line from the ctags output. Separate the tag output based on the ++" tag type and store it in the tag type variable. ++" The format of each line in the ctags output is: ++" ++" tag_namefile_nameex_cmd;"extension_fields ++" ++function! s:Tlist_Parse_Tagline(tag_line) ++ if a:tag_line == '' ++ " Skip empty lines ++ return ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Extract_Tagtype(a:tag_line) ++ ++ " 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 ++ ++ " Update the total tag count ++ let s:tidx = s:tidx + 1 ++ ++ " The following variables are used to optimize this code. Vim is slow in ++ " using curly brace names. To reduce the amount of processing needed, the ++ " curly brace variables are pre-processed here ++ let fidx_tidx = 's:tlist_' . s:fidx . '_' . s:tidx ++ let fidx_ttype = 's:tlist_' . s:fidx . '_' . ttype ++ ++ " Update the count of this tag type ++ let ttype_idx = {fidx_ttype}_count + 1 ++ let {fidx_ttype}_count = ttype_idx ++ ++ " Store the ctags output for this tag ++ let {fidx_tidx}_tag = a:tag_line ++ ++ " Store the tag index and the tag type index (back pointers) ++ let {fidx_ttype}_{ttype_idx} = s:tidx ++ let {fidx_tidx}_ttype_idx = ttype_idx ++ ++ " Extract the tag name ++ let tag_name = strpart(a:tag_line, 0, stridx(a:tag_line, "\t")) ++ ++ " Extract the tag scope/prototype ++ if g:Tlist_Display_Prototype ++ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(s:fidx, s:tidx) ++ else ++ let ttxt = ' ' . tag_name ++ ++ " Add the tag scope, if it is available and is configured. Tag ++ " scope is the last field after the 'line:\t' field ++ if g:Tlist_Display_Tag_Scope ++ let tag_scope = s:Tlist_Extract_Tag_Scope(a:tag_line) ++ if tag_scope != '' ++ let ttxt = ttxt . ' [' . tag_scope . ']' ++ endif ++ endif ++ endif ++ ++ " Add this tag to the tag type variable ++ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" ++ ++ " Save the tag name ++ let {fidx_tidx}_tag_name = tag_name ++endfunction ++ ++" Tlist_Process_File ++" Get the list of tags defined in the specified file and store them ++" in Vim variables. Returns the file index where the tags are stored. ++function! s:Tlist_Process_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Process_File (' . a:filename . ', ' . ++ \ a:ftype . ')') ++ " Check whether this file is supported ++ if s:Tlist_Skip_File(a:filename, a:ftype) ++ return -1 ++ endif ++ ++ " If the tag types for this filetype are not yet created, then create ++ " them now ++ let var = 's:tlist_' . a:ftype . '_count' ++ if !exists(var) ++ if s:Tlist_FileType_Init(a:ftype) == 0 ++ return -1 ++ endif ++ endif ++ ++ " If this file is already processed, then use the cached values ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ " First time, this file is loaded ++ let fidx = s:Tlist_Init_File(a:filename, a:ftype) ++ else ++ " File was previously processed. Discard the tag information ++ call s:Tlist_Discard_TagInfo(fidx) ++ endif ++ ++ let s:tlist_{fidx}_valid = 1 ++ ++ " Exuberant ctags arguments to generate a tag list ++ let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nks ' ++ ++ " Form the ctags argument depending on the sort type ++ if s:tlist_{fidx}_sort_type == 'name' ++ let ctags_args = ctags_args . '--sort=yes' ++ else ++ let ctags_args = ctags_args . '--sort=no' ++ endif ++ ++ " Add the filetype specific arguments ++ let ctags_args = ctags_args . ' ' . s:tlist_{a:ftype}_ctags_args ++ ++ " Ctags command to produce output with regexp for locating the tags ++ let ctags_cmd = g:Tlist_Ctags_Cmd . ctags_args ++ let ctags_cmd = ctags_cmd . ' "' . a:filename . '"' ++ ++ if &shellxquote == '"' ++ " Double-quotes within double-quotes will not work in the ++ " command-line.If the 'shellxquote' option is set to double-quotes, ++ " then escape the double-quotes in the ctags command-line. ++ let ctags_cmd = escape(ctags_cmd, '"') ++ endif ++ ++ " In Windows 95, if not using cygwin, disable the 'shellslash' ++ " option. Otherwise, this will cause problems when running the ++ " ctags command. ++ if has('win95') && !has('win32unix') ++ let old_shellslash = &shellslash ++ set noshellslash ++ endif ++ ++ if has('win32') && !has('win32unix') && !has('win95') ++ \ && (&shell =~ 'cmd.exe') ++ " Windows does not correctly deal with commands that have more than 1 ++ " set of double quotes. It will strip them all resulting in: ++ " 'C:\Program' is not recognized as an internal or external command ++ " operable program or batch file. To work around this, place the ++ " command inside a batch file and call the batch file. ++ " Do this only on Win2K, WinXP and above. ++ " Contributed by: David Fishburn. ++ let s:taglist_tempfile = fnamemodify(tempname(), ':h') . ++ \ '\taglist.cmd' ++ exe 'redir! > ' . s:taglist_tempfile ++ silent echo ctags_cmd ++ redir END ++ ++ call s:Tlist_Log_Msg('Cmd inside batch file: ' . ctags_cmd) ++ let ctags_cmd = '"' . s:taglist_tempfile . '"' ++ endif ++ ++ call s:Tlist_Log_Msg('Cmd: ' . ctags_cmd) ++ ++ " Run ctags and get the tag list ++ let cmd_output = system(ctags_cmd) ++ ++ " Restore the value of the 'shellslash' option. ++ if has('win95') && !has('win32unix') ++ let &shellslash = old_shellslash ++ endif ++ ++ if exists('s:taglist_tempfile') ++ " Delete the temporary cmd file created on MS-Windows ++ call delete(s:taglist_tempfile) ++ endif ++ ++ " Handle errors ++ if v:shell_error ++ let msg = "Taglist: Failed to generate tags for " . a:filename ++ call s:Tlist_Warning_Msg(msg) ++ if cmd_output != '' ++ call s:Tlist_Warning_Msg(cmd_output) ++ endif ++ return fidx ++ endif ++ ++ " Store the modification time for the file ++ let s:tlist_{fidx}_mtime = getftime(a:filename) ++ ++ " No tags for current file ++ if cmd_output == '' ++ call s:Tlist_Log_Msg('No tags defined in ' . a:filename) ++ return fidx ++ endif ++ ++ call s:Tlist_Log_Msg('Generated tags information for ' . a:filename) ++ ++ if v:version > 601 ++ " The following script local variables are used by the ++ " Tlist_Parse_Tagline() function. ++ let s:ctags_flags = s:tlist_{a:ftype}_ctags_flags ++ let s:fidx = fidx ++ let s:tidx = 0 ++ ++ " Process the ctags output one line at a time. The substitute() ++ " command is used to parse the tag lines instead of using the ++ " matchstr()/stridx()/strpart() functions for performance reason ++ call substitute(cmd_output, "\\([^\n]\\+\\)\n", ++ \ '\=s:Tlist_Parse_Tagline(submatch(1))', 'g') ++ ++ " Save the number of tags for this file ++ let s:tlist_{fidx}_tag_count = s:tidx ++ ++ " The following script local variables are no longer needed ++ unlet! s:ctags_flags ++ unlet! s:tidx ++ unlet! s:fidx ++ else ++ " Due to a bug in Vim earlier than version 6.1, ++ " we cannot use substitute() to parse the ctags output. ++ " Instead the slow str*() functions are used ++ let ctags_flags = s:tlist_{a:ftype}_ctags_flags ++ let tidx = 0 ++ ++ while cmd_output != '' ++ " Extract one line at a time ++ let idx = stridx(cmd_output, "\n") ++ let one_line = strpart(cmd_output, 0, idx) ++ " Remove the line from the tags output ++ let cmd_output = strpart(cmd_output, idx + 1) ++ ++ if one_line == '' ++ " Line is not in proper tags format ++ continue ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Extract_Tagtype(one_line) ++ ++ " Make sure the tag type is a valid and supported one ++ if ttype == '' || stridx(ctags_flags, ttype) == -1 ++ " Line is not in proper tags format or Tag type is not ++ " supported ++ continue ++ endif ++ ++ " Update the total tag count ++ let tidx = tidx + 1 ++ ++ " The following variables are used to optimize this code. Vim is ++ " slow in using curly brace names. To reduce the amount of ++ " processing needed, the curly brace variables are pre-processed ++ " here ++ let fidx_tidx = 's:tlist_' . fidx . '_' . tidx ++ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype ++ ++ " Update the count of this tag type ++ let ttype_idx = {fidx_ttype}_count + 1 ++ let {fidx_ttype}_count = ttype_idx ++ ++ " Store the ctags output for this tag ++ let {fidx_tidx}_tag = one_line ++ ++ " Store the tag index and the tag type index (back pointers) ++ let {fidx_ttype}_{ttype_idx} = tidx ++ let {fidx_tidx}_ttype_idx = ttype_idx ++ ++ " Extract the tag name ++ let tag_name = strpart(one_line, 0, stridx(one_line, "\t")) ++ ++ " Extract the tag scope/prototype ++ if g:Tlist_Display_Prototype ++ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(fidx, tidx) ++ else ++ let ttxt = ' ' . tag_name ++ ++ " Add the tag scope, if it is available and is configured. Tag ++ " scope is the last field after the 'line:\t' field ++ if g:Tlist_Display_Tag_Scope ++ let tag_scope = s:Tlist_Extract_Tag_Scope(one_line) ++ if tag_scope != '' ++ let ttxt = ttxt . ' [' . tag_scope . ']' ++ endif ++ endif ++ endif ++ ++ " Add this tag to the tag type variable ++ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" ++ ++ " Save the tag name ++ let {fidx_tidx}_tag_name = tag_name ++ endwhile ++ ++ " Save the number of tags for this file ++ let s:tlist_{fidx}_tag_count = tidx ++ endif ++ ++ call s:Tlist_Log_Msg('Processed ' . s:tlist_{fidx}_tag_count . ++ \ ' tags in ' . a:filename) ++ ++ return fidx ++endfunction ++ ++" Tlist_Update_File ++" Update the tags for a file (if needed) ++function! Tlist_Update_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Update_File (' . a:filename . ')') ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(a:filename, a:ftype) ++ return ++ endif ++ ++ " Convert the file name to a full path ++ let fname = fnamemodify(a:filename, ':p') ++ ++ " First check whether the file already exists ++ let fidx = s:Tlist_Get_File_Index(fname) ++ ++ if fidx != -1 && s:tlist_{fidx}_valid ++ " File exists and the tags are valid ++ " Check whether the file was modified after the last tags update ++ " If it is modified, then update the tags ++ if s:tlist_{fidx}_mtime == getftime(fname) ++ return ++ endif ++ else ++ " If the tags were removed previously based on a user request, ++ " as we are going to update the tags (based on the user request), ++ " remove the filename from the deleted list ++ call s:Tlist_Update_Remove_List(fname, 0) ++ endif ++ ++ " If the taglist window is opened, update it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum == -1 ++ " Taglist window is not present. Just update the taglist ++ " and return ++ call s:Tlist_Process_File(fname, a:ftype) ++ else ++ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != -1 ++ " If tags for only one file are displayed and we are not ++ " updating the tags for that file, then no need to ++ " refresh the taglist window. Otherwise, the taglist ++ " window should be updated. ++ if s:tlist_{s:tlist_cur_file_idx}_filename != fname ++ call s:Tlist_Process_File(fname, a:ftype) ++ return ++ endif ++ endif ++ ++ " Save the current window number ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ " Save the cursor position ++ let save_line = line('.') ++ let save_col = col('.') ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(fname, a:ftype) ++ ++ " Restore the cursor position ++ if v:version >= 601 ++ call cursor(save_line, save_col) ++ else ++ exe save_line ++ exe 'normal! ' . save_col . '|' ++ endif ++ ++ if winnr() != save_winnr ++ " Go back to the original window ++ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') ++ endif ++ endif ++ ++ " Update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(1) ++ endif ++endfunction ++ ++" Tlist_Window_Close ++" Close the taglist window ++function! s:Tlist_Window_Close() ++ call s:Tlist_Log_Msg('Tlist_Window_Close()') ++ " Make sure the taglist window exists ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum == -1 ++ call s:Tlist_Warning_Msg('Error: Taglist window is not open') ++ return ++ endif ++ ++ if winnr() == winnum ++ " Already in the taglist window. Close it and return ++ if winbufnr(2) != -1 ++ " If a window other than the taglist window is open, ++ " then only close the taglist window. ++ close ++ endif ++ else ++ " Goto the taglist window, close it and then come back to the ++ " original window ++ let curbufnr = bufnr('%') ++ exe winnum . '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 ++endfunction ++ ++" Tlist_Window_Mark_File_Window ++" Mark the current window as the file window to use when jumping to a tag. ++" Only if the current window is a non-plugin, non-preview and non-taglist ++" window ++function! s:Tlist_Window_Mark_File_Window() ++ if getbufvar('%', '&buftype') == '' && !&previewwindow ++ let w:tlist_file_window = "yes" ++ endif ++endfunction ++ ++" Tlist_Window_Open ++" Open and refresh the taglist window ++function! s:Tlist_Window_Open() ++ call s:Tlist_Log_Msg('Tlist_Window_Open()') ++ " If the window is open, jump to it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Jump to the existing window ++ if winnr() != winnum ++ exe winnum . 'wincmd w' ++ endif ++ return ++ endif ++ ++ if s:tlist_app_name == "winmanager" ++ " Taglist plugin is no longer part of the winmanager app ++ let s:tlist_app_name = "none" ++ endif ++ ++ " Get the filename and filetype for the specified buffer ++ let curbuf_name = fnamemodify(bufname('%'), ':p') ++ let curbuf_ftype = getbufvar('%', '&filetype') ++ let cur_lnum = line('.') ++ ++ " Mark the current window as the desired window to open a file when a tag ++ " is selected. ++ call s:Tlist_Window_Mark_File_Window() ++ ++ " Open the taglist window ++ call s:Tlist_Window_Create() ++ ++ call s:Tlist_Window_Refresh() ++ ++ if g:Tlist_Show_One_File ++ " Add only the current buffer and file ++ " ++ " If the file doesn't support tag listing, skip it ++ if !s:Tlist_Skip_File(curbuf_name, curbuf_ftype) ++ call s:Tlist_Window_Refresh_File(curbuf_name, curbuf_ftype) ++ endif ++ endif ++ ++ if g:Tlist_File_Fold_Auto_Close ++ " Open the fold for the current file, as all the folds in ++ " the taglist window are closed ++ let fidx = s:Tlist_Get_File_Index(curbuf_name) ++ if fidx != -1 ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ endif ++ endif ++ ++ " Highlight the current tag ++ call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) ++endfunction ++ ++" Tlist_Window_Toggle() ++" Open or close a taglist window ++function! s:Tlist_Window_Toggle() ++ call s:Tlist_Log_Msg('Tlist_Window_Toggle()') ++ " If taglist window is open then close it. ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ call s:Tlist_Window_Close() ++ return ++ endif ++ ++ call s:Tlist_Window_Open() ++ ++ " 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 ++ call s:Tlist_Menu_Update_File(0) ++ endif ++endfunction ++ ++" 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 ++ ++ " 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 ++ ++ " 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) ++ ++ let all_files = strpart(all_files, nl_idx + 1) ++ if one_file == '' ++ continue ++ endif ++ ++ " Skip non-directory names ++ if !isdirectory(one_file) ++ continue ++ endif ++ ++ 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 ++" Add files recursively from a directory ++function! s:Tlist_Add_Files_Recursive(dir, ...) ++ let dir_name = fnamemodify(a:dir, ':p') ++ if !isdirectory(dir_name) ++ call s:Tlist_Warning_Msg('Error: ' . dir_name . ' is not a directory') ++ return ++ endif ++ ++ if a:0 == 1 ++ " User specified file pattern ++ let pat = a:1 ++ else ++ " Default file pattern ++ let pat = '*' ++ endif ++ ++ echon "\r " ++ echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t') ++ let fcnt = s:Tlist_Process_Dir(dir_name, pat) ++ ++ echon "\rAdded " . fcnt . " files to the taglist" ++endfunction ++ ++" Tlist_Add_Files ++" Add the specified list of files to the taglist ++function! s:Tlist_Add_Files(...) ++ let flist = '' ++ let i = 1 ++ ++ " Get all the files matching the file patterns supplied as argument ++ while i <= a:0 ++ let flist = flist . glob(a:{i}) . "\n" ++ let i = i + 1 ++ endwhile ++ ++ if flist == '' ++ call s:Tlist_Warning_Msg('Error: No matching files are found') ++ return ++ endif ++ ++ let fcnt = s:Tlist_Process_Filelist(flist) ++ echon "\rAdded " . fcnt . " files to the taglist" ++endfunction ++ ++" Tlist_Extract_Tagtype ++" Extract the tag type from the tag text ++function! s:Tlist_Extract_Tagtype(tag_line) ++ " The tag type is after the tag prototype field. The prototype field ++ " ends with the /;"\t string. We add 4 at the end to skip the characters ++ " in this special string.. ++ let start = strridx(a:tag_line, '/;"' . "\t") + 4 ++ let end = strridx(a:tag_line, 'line:') - 1 ++ let ttype = strpart(a:tag_line, start, end - start) ++ ++ return ttype ++endfunction ++ ++" Tlist_Extract_Tag_Scope ++" Extract the tag scope from the tag text ++function! s:Tlist_Extract_Tag_Scope(tag_line) ++ let start = strridx(a:tag_line, 'line:') ++ let end = strridx(a:tag_line, "\t") ++ if end <= start ++ return '' ++ endif ++ ++ let tag_scope = strpart(a:tag_line, end + 1) ++ let tag_scope = strpart(tag_scope, stridx(tag_scope, ':') + 1) ++ ++ return tag_scope ++endfunction ++ ++" Tlist_Refresh() ++" Refresh the taglist ++function! s:Tlist_Refresh() ++ call s:Tlist_Log_Msg('Tlist_Refresh (Skip_Refresh = ' . ++ \ s:Tlist_Skip_Refresh . ', ' . bufname('%') . ')') ++ " If we are entering the buffer from one of the taglist functions, then ++ " no need to refresh the taglist window again. ++ if s:Tlist_Skip_Refresh ++ " We still need to update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(0) ++ endif ++ return ++ endif ++ ++ " If part of the winmanager plugin and not configured to process ++ " tags always and not configured to display the tags menu, then return ++ if (s:tlist_app_name == 'winmanager') && !g:Tlist_Process_File_Always ++ \ && !g:Tlist_Show_Menu ++ return ++ endif ++ ++ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help ++ if &buftype != '' ++ return ++ endif ++ ++ let filename = fnamemodify(bufname('%'), ':p') ++ let ftype = &filetype ++ ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(filename, ftype) ++ return ++ endif ++ ++ let tlist_win = bufwinnr(g:TagList_title) ++ ++ " If the taglist window is not opened and not configured to process ++ " tags always and not displaying the tags menu, then return ++ if tlist_win == -1 && !g:Tlist_Process_File_Always && !g:Tlist_Show_Menu ++ return ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(filename) ++ return ++ endif ++ ++ " If the taglist should not be auto updated, then return ++ if !g:Tlist_Auto_Update ++ return ++ endif ++ endif ++ ++ let cur_lnum = line('.') ++ ++ if fidx == -1 ++ " Update the tags for the file ++ let fidx = s:Tlist_Process_File(filename, ftype) ++ else ++ let mtime = getftime(filename) ++ if s:tlist_{fidx}_mtime != mtime ++ " Invalidate the tags listed for this file ++ let s:tlist_{fidx}_valid = 0 ++ ++ " Update the taglist and the window ++ call Tlist_Update_File(filename, ftype) ++ ++ " Store the new file modification time ++ let s:tlist_{fidx}_mtime = mtime ++ endif ++ endif ++ ++ " Update the taglist window ++ if tlist_win != -1 ++ " Disable screen updates ++ let old_lazyredraw = &lazyredraw ++ set nolazyredraw ++ ++ " Save the current window number ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter ++ " Save the cursor position ++ let save_line = line('.') ++ let save_col = col('.') ++ endif ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(filename, ftype) ++ ++ " Open the fold for the file ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ ++ if g:Tlist_Highlight_Tag_On_BufEnter && g:Tlist_Auto_Highlight_Tag ++ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != fidx ++ " If displaying tags for only one file in the taglist ++ " window and about to display the tags for a new file, ++ " then center the current tag line for the new file ++ let center_tag_line = 1 ++ else ++ let center_tag_line = 0 ++ endif ++ ++ " Highlight the current tag ++ call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) ++ else ++ " Restore the cursor position ++ if v:version >= 601 ++ call cursor(save_line, save_col) ++ else ++ exe save_line ++ exe 'normal! ' . save_col . '|' ++ endif ++ endif ++ ++ " Jump back to the original window ++ if save_winnr != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') ++ endif ++ ++ " Restore screen updates ++ let &lazyredraw = old_lazyredraw ++ endif ++ ++ " Update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(0) ++ endif ++endfunction ++ ++" Tlist_Change_Sort() ++" Change the sort order of the tag listing ++" caller == 'cmd', command used in the taglist window ++" caller == 'menu', taglist menu ++" action == 'toggle', toggle sort from name to order and vice versa ++" action == 'set', set the sort order to sort_type ++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 == 'cmd' ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ " Remove the previous highlighting ++ match none ++ elseif a:caller == 'menu' ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx == -1 ++ return ++ endif ++ endif ++ ++ if a:action == 'toggle' ++ let sort_type = s:tlist_{fidx}_sort_type ++ ++ " Toggle the sort order from 'name' to 'order' and vice versa ++ if sort_type == 'name' ++ let s:tlist_{fidx}_sort_type = 'order' ++ else ++ let s:tlist_{fidx}_sort_type = 'name' ++ endif ++ else ++ let s:tlist_{fidx}_sort_type = a:sort_type ++ endif ++ ++ " Invalidate the tags listed for this file ++ let s:tlist_{fidx}_valid = 0 ++ ++ if a:caller == 'cmd' ++ " Save the current line for later restoration ++ let curline = '\V\^' . getline('.') . '\$' ++ ++ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, ++ \ s:tlist_{fidx}_filetype) ++ ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Go back to the cursor line before the tag list is sorted ++ call search(curline, 'w') ++ ++ call s:Tlist_Menu_Update_File(1) ++ else ++ call s:Tlist_Menu_Remove_File() ++ ++ call s:Tlist_Refresh() ++ endif ++endfunction ++ ++" Tlist_Update_Current_File() ++" Update taglist for the current buffer by regenerating the tag list ++" Contributed by WEN Guopeng. ++function! s:Tlist_Update_Current_File() ++ call s:Tlist_Log_Msg('Tlist_Update_Current_File()') ++ if winnr() == bufwinnr(g:TagList_title) ++ " In the taglist window. Update the current file ++ call s:Tlist_Window_Update_File() ++ else ++ " Not in the taglist window. Update the current buffer ++ let filename = fnamemodify(bufname('%'), ':p') ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx != -1 ++ let s:tlist_{fidx}_valid = 0 ++ endif ++ call Tlist_Update_File(filename, &filetype) ++ endif ++endfunction ++ ++" Tlist_Window_Update_File() ++" 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_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ " Remove the previous highlighting ++ match none ++ ++ " Save the current line for later restoration ++ let curline = '\V\^' . getline('.') . '\$' ++ ++ let s:tlist_{fidx}_valid = 0 ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, ++ \ s:tlist_{fidx}_filetype) ++ ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Go back to the tag line before the list is updated ++ call search(curline, 'w') ++endfunction ++ ++" Tlist_Window_Get_Tag_Type_By_Linenum() ++" Return the tag type index for the specified line in the taglist window ++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 ++ " tag type start line number and the number of tags in a tag type ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ let start_lnum = ++ \ s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset ++ let end = start_lnum + s:tlist_{a:fidx}_{ttype}_count ++ if a:lnum >= start_lnum && a:lnum <= end ++ break ++ endif ++ let i = i + 1 ++ endwhile ++ ++ " Current line doesn't belong to any of the displayed tag types ++ if i > s:tlist_{ftype}_count ++ return '' ++ endif ++ ++ return ttype ++endfunction ++ ++" 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 == '' ++ return 0 ++ endif ++ ++ " Compute the index into the displayed tags for the tag type ++ let ttype_lnum = s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset ++ let tidx = a:lnum - ttype_lnum ++ if tidx == 0 ++ return 0 ++ endif ++ ++ " Get the corresponding tag line and return it ++ return s:tlist_{a:fidx}_{ttype}_{tidx} ++endfunction ++ ++" Tlist_Window_Highlight_Line ++" Highlight the current line ++function! s:Tlist_Window_Highlight_Line() ++ " Clear previously selected name ++ match none ++ ++ " Highlight the current line ++ if g:Tlist_Display_Prototype == 0 ++ let pat = '/\%' . line('.') . 'l\s\+\zs.*/' ++ else ++ let pat = '/\%' . line('.') . 'l.*/' ++ endif ++ ++ exe 'match TagListTagName ' . pat ++endfunction ++ ++" 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_Window_Open_File(win_ctrl, filename, tagpat) ++ 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 == '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 ++ 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 ++ let first_usable_win = 0 ++ ++ let i = 1 ++ let bnum = winbufnr(i) ++ while bnum != -1 ++ if getwinvar(i, 'tlist_file_window') == 'yes' ++ let fwin_num = i ++ break ++ endif ++ if first_usable_win == 0 && ++ \ getbufvar(bnum, '&buftype') == '' && ++ \ !getwinvar(i, '&previewwindow') ++ " First non-taglist, non-plugin and non-preview window ++ let first_usable_win = i ++ endif ++ let i = i + 1 ++ let bnum = winbufnr(i) ++ endwhile ++ ++ " If a previously used window is not found, then use the first ++ " non-taglist window ++ if fwin_num == 0 ++ let fwin_num = first_usable_win ++ endif ++ ++ if fwin_num != 0 ++ " Jump to the file window ++ exe fwin_num . "wincmd w" ++ ++ " If the user asked to jump to the tag in a new window, then split ++ " the existing window into two. ++ if a:win_ctrl == 'newwin' ++ split ++ endif ++ exe "edit " . escape(a:filename, ' ') ++ else ++ " Open a new window ++ if g:Tlist_Use_Horiz_Window ++ exe 'leftabove split ' . escape(a:filename, ' ') ++ else ++ if winbufnr(2) == -1 ++ " Only the taglist window is present ++ if g:Tlist_Use_Right_Window ++ exe 'leftabove vertical split ' . ++ \ escape(a:filename, ' ') ++ else ++ exe 'rightbelow vertical split ' . ++ \ escape(a:filename, ' ') ++ endif ++ ++ " Go to the taglist window to change the window size to ++ " the user configured value ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ if g:Tlist_Use_Horiz_Window ++ exe 'resize ' . g:Tlist_WinHeight ++ else ++ exe 'vertical resize ' . g:Tlist_WinWidth ++ endif ++ " Go back to the file window ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ else ++ " A plugin or help window is also present ++ wincmd w ++ exe 'leftabove split ' . escape(a:filename, ' ') ++ endif ++ endif ++ endif ++ " Mark the window, so that it can be reused. ++ call s:Tlist_Window_Mark_File_Window() ++ else ++ if v:version >= 700 ++ " If the file is opened in more than one window, then check ++ " whether the last accessed window has the selected file. ++ " If it does, then use that window. ++ let lastwin_bufnum = winbufnr(winnr('#')) ++ if bufnr(a:filename) == lastwin_bufnum ++ let winnum = winnr('#') ++ endif ++ endif ++ exe winnum . 'wincmd w' ++ ++ " If the user asked to jump to the tag in a new window, then split the ++ " existing window into two. ++ if a:win_ctrl == 'newwin' ++ split ++ endif ++ endif ++ endif ++ ++ " Jump to the tag ++ if a:tagpat != '' ++ " Add the current cursor position to the jump list, so that user can ++ " jump back using the ' and ` marks. ++ mark ' ++ silent call search(a:tagpat, 'w') ++ ++ " Bring the line to the middle of the window ++ normal! z. ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ endif ++ ++ " If the user selects to preview the tag then jump back to the ++ " taglist window ++ if a:win_ctrl == 'preview' ++ " Go back to the taglist window ++ let winnum = bufwinnr(g:TagList_title) ++ exe winnum . 'wincmd w' ++ else ++ " 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_Window_Goto_Window() ++ close ++ ++ " Go back to the window displaying the selected file ++ let wnum = bufwinnr(a:filename) ++ if wnum != -1 && wnum != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds(wnum . 'wincmd w') ++ endif ++ endif ++ endif ++ ++ let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh ++endfunction ++ ++" Tlist_Window_Jump_To_Tag() ++" Jump to the location of the current 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(' . a:win_ctrl . ')') ++ " Do not process comment lines and empty lines ++ let curline = getline('.') ++ if curline =~ '^\s*$' || curline[0] == '"' ++ return ++ endif ++ ++ " If inside a closed fold, then use the first line of the fold ++ " and jump to the file. ++ let lnum = foldclosed('.') ++ if lnum == -1 ++ " Jump to the selected tag or file ++ let lnum = line('.') ++ else ++ " Open the closed fold ++ .foldopen! ++ endif ++ ++ 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_Window_Get_Tag_Index(fidx, lnum) ++ if tidx != 0 ++ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx) ++ ++ " Highlight the tagline ++ call s:Tlist_Window_Highlight_Line() ++ else ++ " Selected a line which is not a tag name. Just edit the file ++ let tagpat = '' ++ endif ++ ++ call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) ++endfunction ++ ++" Tlist_Window_Show_Info() ++" Display information about the entry under the cursor ++function! s:Tlist_Window_Show_Info() ++ call s:Tlist_Log_Msg('Tlist_Window_Show_Info()') ++ ++ " Clear the previously displayed line ++ echo ++ ++ " Do not process comment lines and empty lines ++ let curline = getline('.') ++ if curline =~ '^\s*$' || curline[0] == '"' ++ return ++ endif ++ ++ " If inside a fold, then don't display the prototype ++ if foldclosed('.') != -1 ++ return ++ endif ++ ++ let lnum = line('.') ++ ++ " Get the file index ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) ++ if fidx == -1 ++ return ++ endif ++ ++ if lnum == s:tlist_{fidx}_start ++ " Cursor is on a file name ++ let fname = s:tlist_{fidx}_filename ++ if strlen(fname) > 50 ++ let fname = fnamemodify(fname, ':t') ++ endif ++ echo fname . ', Filetype=' . s:tlist_{fidx}_filetype . ++ \ ', Tag count=' . s:tlist_{fidx}_tag_count ++ return ++ endif ++ ++ " Get the tag output line for the current tag ++ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) ++ if tidx == 0 ++ " Cursor is on a tag type ++ let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) ++ if ttype == '' ++ return ++ endif ++ ++ let ttype_name = '' ++ ++ let ftype = s:tlist_{fidx}_filetype ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ if ttype == s:tlist_{ftype}_{i}_name ++ let ttype_name = s:tlist_{ftype}_{i}_fullname ++ break ++ endif ++ let i = i + 1 ++ endwhile ++ ++ echo 'Tag type=' . ttype_name . ++ \ ', Tag count=' . s:tlist_{fidx}_{ttype}_count ++ return ++ endif ++ ++ " Get the tag search pattern and display it ++ echo s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Find_Nearest_Tag_Idx ++" Find the tag idx nearest to the supplied line number ++" Returns -1, if a tag couldn't be found for the specified line number ++function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum) ++ let sort_type = s:tlist_{a:fidx}_sort_type ++ ++ let left = 1 ++ let right = s:tlist_{a:fidx}_tag_count ++ ++ if sort_type == 'order' ++ " Tags sorted by order, use a binary search. ++ " The idea behind this function is taken from the ctags.vim script (by ++ " Alexey Marinichev) available at the Vim online website. ++ ++ " If the current line is the less than the first tag, then no need to ++ " search ++ let first_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, 1) ++ ++ if a:linenum < first_lnum ++ return -1 ++ endif ++ ++ while left < right ++ let middle = (right + left + 1) / 2 ++ let middle_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, middle) ++ ++ if middle_lnum == a:linenum ++ let left = middle ++ break ++ endif ++ ++ if middle_lnum > a:linenum ++ let right = middle - 1 ++ else ++ let left = middle ++ endif ++ endwhile ++ else ++ " Tags sorted by name, use a linear search. (contributed by Dave ++ " Eggum). ++ " Look for a tag with a line number less than or equal to the supplied ++ " line number. If multiple tags are found, then use the tag with the ++ " line number closest to the supplied line number. IOW, use the tag ++ " with the highest line number. ++ let closest_lnum = 0 ++ let final_left = 0 ++ while left <= right ++ let lnum = s:Tlist_Get_Tag_Linenum(a:fidx, left) ++ ++ if lnum < a:linenum && lnum > closest_lnum ++ let closest_lnum = lnum ++ let final_left = left ++ elseif lnum == a:linenum ++ let closest_lnum = lnum ++ let final_left = left ++ break ++ else ++ let left = left + 1 ++ endif ++ endwhile ++ if closest_lnum == 0 ++ return -1 ++ endif ++ if left >= right ++ let left = final_left ++ endif ++ endif ++ ++ return left ++endfunction ++ ++" 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_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. ++ if !g:Tlist_Auto_Highlight_Tag && a:cntx == 1 ++ return ++ endif ++ ++ if a:filename == '' ++ return ++ endif ++ ++ " 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 ++ ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ return ++ endif ++ ++ " If the file is currently not displayed in the taglist window, then retrn ++ if !s:tlist_{fidx}_visible ++ return ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return ++ endif ++ ++ " Ignore all autocommands ++ let old_ei = &eventignore ++ set eventignore=all ++ ++ " Save the original window number ++ let org_winnr = winnr() ++ ++ if org_winnr == winnum ++ let in_taglist_window = 1 ++ else ++ let in_taglist_window = 0 ++ endif ++ ++ " Go to the taglist window ++ if !in_taglist_window ++ exe winnum . 'wincmd w' ++ endif ++ ++ " Clear previously selected name ++ match none ++ ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, a:cur_lnum) ++ if tidx == -1 ++ " Make sure the current tag line is visible in the taglist window. ++ " Calling the winline() function makes the line visible. Don't know ++ " of a better way to achieve this. ++ let lnum = line('.') ++ ++ if lnum < s:tlist_{fidx}_start || lnum > s:tlist_{fidx}_end ++ " Move the cursor to the beginning of the file ++ exe s:tlist_{fidx}_start ++ endif ++ ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ ++ call winline() ++ ++ if !in_taglist_window ++ exe org_winnr . 'wincmd w' ++ endif ++ ++ " Restore the autocommands ++ let &eventignore = old_ei ++ return ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) ++ ++ " Compute the line number ++ " Start of file + Start of tag type + offset ++ let lnum = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + ++ \ s:tlist_{fidx}_{tidx}_ttype_idx ++ ++ " Goto the line containing the tag ++ exe lnum ++ ++ " Open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ ++ if a:center ++ " Move the tag line to the center of the taglist window ++ normal! z. ++ else ++ " Make sure the current tag line is visible in the taglist window. ++ " Calling the winline() function makes the line visible. Don't know ++ " of a better way to achieve this. ++ call winline() ++ endif ++ ++ " Highlight the tag name ++ call s:Tlist_Window_Highlight_Line() ++ ++ " Go back to the original window ++ if !in_taglist_window ++ exe org_winnr . 'wincmd w' ++ endif ++ ++ " Restore the autocommands ++ let &eventignore = old_ei ++ return ++endfunction ++ ++" Tlist_Get_Tag_Prototype_By_Line ++" Get the prototype for the tag on or before the specified line number in the ++" current buffer ++function! Tlist_Get_Tag_Prototype_By_Line(...) ++ if a:0 == 0 ++ " Arguments are not supplied. Use the current buffer name ++ " and line number ++ let filename = bufname('%') ++ let linenr = line('.') ++ elseif a:0 == 2 ++ " Filename and line number are specified ++ let filename = a:1 ++ let linenr = a:2 ++ if linenr !~ '\d\+' ++ " Invalid line number ++ return "" ++ endif ++ else ++ " Sufficient arguments are not supplied ++ let msg = 'Usage: Tlist_Get_Tag_Prototype_By_Line ' . ++ \ '' ++ call s:Tlist_Warning_Msg(msg) ++ return "" ++ endif ++ ++ " Expand the file to a fully qualified name ++ let filename = fnamemodify(filename, ':p') ++ if filename == '' ++ return "" ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ return "" ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return "" ++ endif ++ ++ " Get the tag text using the line number ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) ++ if tidx == -1 ++ return "" ++ endif ++ ++ return s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Get_Tagname_By_Line ++" Get the tag name on or before the specified line number in the ++" current buffer ++function! Tlist_Get_Tagname_By_Line(...) ++ if a:0 == 0 ++ " Arguments are not supplied. Use the current buffer name ++ " and line number ++ let filename = bufname('%') ++ let linenr = line('.') ++ elseif a:0 == 2 ++ " Filename and line number are specified ++ let filename = a:1 ++ let linenr = a:2 ++ if linenr !~ '\d\+' ++ " Invalid line number ++ return "" ++ endif ++ else ++ " Sufficient arguments are not supplied ++ let msg = 'Usage: Tlist_Get_Tagname_By_Line ' ++ call s:Tlist_Warning_Msg(msg) ++ return "" ++ endif ++ ++ " Make sure the current file has a name ++ let filename = fnamemodify(filename, ':p') ++ if filename == '' ++ return "" ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ return "" ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return "" ++ endif ++ ++ " Get the tag name using the line number ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) ++ if tidx == -1 ++ return "" ++ endif ++ ++ return s:tlist_{fidx}_{tidx}_tag_name ++endfunction ++ ++" 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_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 ++ if a:dir == -1 ++ normal! zk ++ else ++ " While moving down to the start of the next fold, ++ " no need to do go to the start of the next file. ++ normal! zj ++ return ++ endif ++ endif ++ ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ let cur_lnum = line('.') ++ ++ if a:dir == -1 ++ if cur_lnum > s:tlist_{fidx}_start ++ " Move to the beginning of the current file ++ exe s:tlist_{fidx}_start ++ return ++ endif ++ ++ 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 ++ ++ 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 ++ " Cursor is at the last file, wrap around to the first file ++ let fidx = 0 ++ endif ++ ++ if s:tlist_{fidx}_start != 0 ++ exe s:tlist_{fidx}_start ++ endif ++ return ++ endif ++endfunction ++ ++" Tlist_Session_Load ++" Load a taglist session (information about all the displayed files ++" and the tags) from the specified file ++function! s:Tlist_Session_Load(...) ++ if a:0 == 0 || a:1 == '' ++ call s:Tlist_Warning_Msg('Usage: TlistSessionLoad ') ++ return ++ endif ++ ++ let sessionfile = a:1 ++ ++ if !filereadable(sessionfile) ++ let msg = 'Taglist: Error - Unable to open file ' . sessionfile ++ call s:Tlist_Warning_Msg(msg) ++ return ++ endif ++ ++ " Mark the current window as the file window ++ call s:Tlist_Window_Mark_File_Window() ++ ++ " Source the session file ++ exe 'source ' . sessionfile ++ ++ let new_file_count = g:tlist_file_count ++ unlet! g:tlist_file_count ++ ++ let i = 0 ++ while i < new_file_count ++ let ftype = g:tlist_{i}_filetype ++ unlet! g:tlist_{i}_filetype ++ ++ if !exists('s:tlist_' . ftype . '_count') ++ if s:Tlist_FileType_Init(ftype) == 0 ++ let i = i + 1 ++ continue ++ endif ++ endif ++ ++ let fname = g:tlist_{i}_filename ++ unlet! g:tlist_{i}_filename ++ ++ let fidx = s:Tlist_Get_File_Index(fname) ++ if fidx != -1 ++ let s:tlist_{fidx}_visible = 0 ++ let i = i + 1 ++ continue ++ else ++ " As we are loading the tags from the session file, if this ++ " file was previously deleted by the user, now we need to ++ " add it back. So remove the file from the deleted list. ++ call s:Tlist_Update_Remove_List(fname, 0) ++ endif ++ ++ let fidx = s:Tlist_Init_File(fname, ftype) ++ ++ let s:tlist_{fidx}_filename = fname ++ ++ let s:tlist_{fidx}_sort_type = g:tlist_{i}_sort_type ++ unlet! g:tlist_{i}_sort_type ++ ++ let s:tlist_{fidx}_filetype = ftype ++ let s:tlist_{fidx}_mtime = getftime(fname) ++ ++ let s:tlist_{fidx}_start = 0 ++ let s:tlist_{fidx}_end = 0 ++ ++ let s:tlist_{fidx}_valid = 1 ++ ++ let s:tlist_{fidx}_tag_count = g:tlist_{i}_tag_count ++ unlet! g:tlist_{i}_tag_count ++ ++ let j = 1 ++ while j <= s:tlist_{fidx}_tag_count ++ let s:tlist_{fidx}_{j}_tag = g:tlist_{i}_{j}_tag ++ let s:tlist_{fidx}_{j}_tag_name = g:tlist_{i}_{j}_tag_name ++ let s:tlist_{fidx}_{j}_ttype_idx = g:tlist_{i}_{j}_ttype_idx ++ unlet! g:tlist_{i}_{j}_tag ++ unlet! g:tlist_{i}_{j}_tag_name ++ unlet! g:tlist_{i}_{j}_ttype_idx ++ let j = j + 1 ++ endwhile ++ ++ let j = 1 ++ while j <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{j}_name ++ ++ if exists('g:tlist_' . i . '_' . ttype) ++ let s:tlist_{fidx}_{ttype} = g:tlist_{i}_{ttype} ++ unlet! g:tlist_{i}_{ttype} ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = g:tlist_{i}_{ttype}_count ++ unlet! g:tlist_{i}_{ttype}_count ++ ++ let k = 1 ++ while k <= s:tlist_{fidx}_{ttype}_count ++ let s:tlist_{fidx}_{ttype}_{k} = g:tlist_{i}_{ttype}_{k} ++ unlet! g:tlist_{i}_{ttype}_{k} ++ let k = k + 1 ++ endwhile ++ else ++ let s:tlist_{fidx}_{ttype} = '' ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = 0 ++ endif ++ ++ let j = j + 1 ++ endwhile ++ ++ let i = i + 1 ++ endwhile ++ ++ " If the taglist window is open, then update it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ " Refresh the taglist window ++ call s:Tlist_Window_Refresh() ++ ++ " Go back to the original window ++ if save_winnr != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ endif ++ endif ++endfunction ++ ++" Tlist_Session_Save ++" Save a taglist session (information about all the displayed files ++" and the tags) into the specified file ++function! s:Tlist_Session_Save(...) ++ if a:0 == 0 || a:1 == '' ++ call s:Tlist_Warning_Msg('Usage: TlistSessionSave ') ++ return ++ endif ++ ++ let sessionfile = a:1 ++ ++ if s:tlist_file_count == 0 ++ " There is nothing to save ++ call s:Tlist_Warning_Msg('Warning: Taglist is empty. Nothing to save.') ++ return ++ endif ++ ++ if filereadable(sessionfile) ++ let ans = input('Do you want to overwrite ' . sessionfile . ' (Y/N)?') ++ if ans !=? 'y' ++ return ++ endif ++ ++ echo "\n" ++ endif ++ ++ let old_verbose = &verbose ++ set verbose&vim ++ ++ exe 'redir! > ' . sessionfile ++ ++ silent! echo '" Taglist session file. This file is auto-generated.' ++ silent! echo '" File information' ++ silent! echo 'let tlist_file_count = ' . s:tlist_file_count ++ ++ let i = 0 ++ ++ while i < s:tlist_file_count ++ " Store information about the file ++ silent! echo 'let tlist_' . i . "_filename = '" . ++ \ s:tlist_{i}_filename . "'" ++ silent! echo 'let tlist_' . i . '_sort_type = "' . ++ \ s:tlist_{i}_sort_type . '"' ++ silent! echo 'let tlist_' . i . '_filetype = "' . ++ \ s:tlist_{i}_filetype . '"' ++ silent! echo 'let tlist_' . i . '_tag_count = ' . ++ \ s:tlist_{i}_tag_count ++ " Store information about all the tags ++ let j = 1 ++ while j <= s:tlist_{i}_tag_count ++ let txt = escape(s:tlist_{i}_{j}_tag, '"\\') ++ silent! echo 'let tlist_' . i . '_' . j . '_tag = "' . txt . '"' ++ silent! echo 'let tlist_' . i . '_' . j . '_tag_name = "' . ++ \ s:tlist_{i}_{j}_tag_name . '"' ++ silent! echo 'let tlist_' . i . '_' . j . '_ttype_idx' . ' = ' . ++ \ s:tlist_{i}_{j}_ttype_idx ++ let j = j + 1 ++ endwhile ++ ++ " Store information about all the tags grouped by their type ++ let ftype = s:tlist_{i}_filetype ++ let j = 1 ++ while j <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{j}_name ++ if s:tlist_{i}_{ttype}_count != 0 ++ let txt = substitute(s:tlist_{i}_{ttype}, "\n", "\\\\n", 'g') ++ silent! echo 'let tlist_' . i . '_' . ttype . ' = "' . ++ \ txt . '"' ++ silent! echo 'let tlist_' . i . '_' . ttype . '_count = ' . ++ \ s:tlist_{i}_{ttype}_count ++ let k = 1 ++ while k <= s:tlist_{i}_{ttype}_count ++ silent! echo 'let tlist_' . i . '_' . ttype . '_' . k . ++ \ ' = ' . s:tlist_{i}_{ttype}_{k} ++ let k = k + 1 ++ endwhile ++ endif ++ let j = j + 1 ++ endwhile ++ ++ silent! echo ++ ++ let i = i + 1 ++ endwhile ++ ++ redir END ++ ++ let &verbose = old_verbose ++endfunction ++ ++" Tlist_Buffer_Removed ++" 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 . ')') ++ ++ " Make sure a valid filename is supplied ++ if a:filename == '' ++ return ++ endif ++ ++ " Get tag list index of the specified file ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ " File not present in the taglist ++ return ++ endif ++ ++ " Remove the file from the list ++ call s:Tlist_Remove_File(fidx, 0) ++endfunction ++ ++" When a buffer is deleted, remove the file from the taglist ++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(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) ++ if winnum == -1 ++ call s:Tlist_Warning_Msg('Taglist: Error - Taglist window is not open') ++ return ++ endif ++ ++ " Save the original window number ++ let org_winnr = winnr() ++ if org_winnr == winnum ++ let in_taglist_window = 1 ++ else ++ let in_taglist_window = 0 ++ endif ++ ++ if in_taglist_window ++ " When entering the taglist window, no need to update the folds ++ return ++ endif ++ ++ " Go to the taglist window ++ if !in_taglist_window ++ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') ++ endif ++ ++ " Close all the folds ++ silent! %foldclose ++ ++ " Get tag list index of the specified file ++ 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 ++ if !in_taglist_window ++ call s:Tlist_Exe_Cmd_No_Acmds(org_winnr . 'wincmd w') ++ endif ++endfunction ++ ++" 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_Window_Check_Auto_Open() ++ let open_window = 0 ++ ++ let i = 1 ++ let buf_num = winbufnr(i) ++ while buf_num != -1 ++ let filename = fnamemodify(bufname(buf_num), ':p') ++ if !s:Tlist_Skip_File(filename, getbufvar(buf_num, '&filetype')) ++ let open_window = 1 ++ break ++ endif ++ let i = i + 1 ++ let buf_num = winbufnr(i) ++ endwhile ++ ++ if open_window ++ call s:Tlist_Window_Toggle() ++ endif ++endfunction ++ ++function! s:Tlist_Menu_Add_Base_Menu() ++ call s:Tlist_Log_Msg('Adding the base menu') ++ ++ " Add the menu ++ anoremenu T&ags.Refresh\ menu :call Tlist_Menu_Refresh() ++ anoremenu T&ags.Sort\ menu\ by.Name ++ \ :call Tlist_Change_Sort('menu', 'set', 'name') ++ anoremenu T&ags.Sort\ menu\ by.Order ++ \ :call Tlist_Change_Sort('menu', 'set', 'order') ++ anoremenu T&ags.-SEP1- : ++ ++ if &mousemodel =~ 'popup' ++ anoremenu PopUp.T&ags.Refresh\ menu ++ \ :call Tlist_Menu_Refresh() ++ anoremenu PopUp.T&ags.Sort\ menu\ by.Name ++ \ :call Tlist_Change_Sort('menu', 'set', 'name') ++ anoremenu PopUp.T&ags.Sort\ menu\ by.Order ++ \ :call Tlist_Change_Sort('menu', 'set', 'order') ++ anoremenu PopUp.T&ags.-SEP1- : ++ endif ++endfunction ++ ++let s:menu_char_prefix = ++ \ '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ++ ++" Tlist_Menu_Get_Tag_Type_Cmd ++" Get the menu command for the specified tag type ++" 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 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 ++ ++ " Number of tag entries for this tag type ++ let tcnt = s:tlist_{fidx_ttype}_count ++ if tcnt == 0 " No entries for this tag type ++ return '' ++ endif ++ ++ let mcmd = '' ++ ++ " Create the menu items for the tags. ++ " Depending on the number of tags of this type, split the menu into ++ " multiple sub-menus, if needed. ++ if tcnt > g:Tlist_Max_Submenu_Items ++ let j = 1 ++ while j <= tcnt ++ let final_index = j + g:Tlist_Max_Submenu_Items - 1 ++ if final_index > tcnt ++ let final_index = tcnt ++ endif ++ ++ " Extract the first and last tag name and form the ++ " sub-menu name ++ let tidx = s:tlist_{fidx_ttype}_{j} ++ let first_tag = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let tidx = s:tlist_{fidx_ttype}_{final_index} ++ let last_tag = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ " Truncate the names, if they are greater than the ++ " max length ++ let first_tag = strpart(first_tag, 0, g:Tlist_Max_Tag_Length) ++ let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length) ++ ++ " Form the menu command prefix ++ 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 ++ ++ while j <= final_index ++ let tidx = s:tlist_{fidx_ttype}_{j} ++ ++ let tname = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let mcmd = mcmd . m_prefix . '\&' . ++ \ s:menu_char_prefix[m_prefix_idx] . '\.' . ++ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . ++ \ tidx . ')|' ++ ++ let m_prefix_idx = m_prefix_idx + 1 ++ let j = j + 1 ++ endwhile ++ endwhile ++ else ++ " Character prefix used to number the menu items (hotkey) ++ let m_prefix_idx = 0 ++ ++ 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} ++ ++ let tname = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let mcmd = mcmd . m_prefix . '\&' . ++ \ s:menu_char_prefix[m_prefix_idx] . '\.' . ++ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . tidx ++ \ . ')|' ++ ++ let m_prefix_idx = m_prefix_idx + 1 ++ let j = j + 1 ++ endwhile ++ endif ++ ++ return mcmd ++endfunction ++ ++" Update the taglist menu with the tags for the specified file ++function! s:Tlist_Menu_File_Refresh(fidx) ++ call s:Tlist_Log_Msg('Refreshing the tag menu for ' . s:tlist_{a:fidx}_filename) ++ " The 'B' flag is needed in the 'cpoptions' option ++ let old_cpoptions = &cpoptions ++ set cpoptions&vim ++ ++ exe s:tlist_{a:fidx}_menu_cmd ++ ++ " Update the popup menu (if enabled) ++ if &mousemodel =~ 'popup' ++ let cmd = substitute(s:tlist_{a:fidx}_menu_cmd, ' T\\&ags\.', ++ \ ' PopUp.T\\\&ags.', "g") ++ exe cmd ++ endif ++ ++ " The taglist menu is not empty now ++ let s:tlist_menu_empty = 0 ++ ++ " Restore the 'cpoptions' settings ++ let &cpoptions = old_cpoptions ++endfunction ++ ++" Tlist_Menu_Update_File ++" Add the taglist menu ++function! s:Tlist_Menu_Update_File(clear_menu) ++ if !has('gui_running') ++ " Not running in GUI mode ++ return ++ endif ++ ++ call s:Tlist_Log_Msg('Updating the tag menu, clear_menu = ' . a:clear_menu) ++ ++ " Remove the tags menu ++ if a:clear_menu ++ call s:Tlist_Menu_Remove_File() ++ ++ endif ++ ++ let fname = escape(fnamemodify(bufname('%'), ':t'), '.') ++ if fname != '' ++ exe 'anoremenu T&ags.' . fname . ' ' ++ anoremenu T&ags.-SEP2- : ++ endif ++ ++ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help ++ if &buftype != '' ++ return ++ endif ++ ++ let filename = fnamemodify(bufname('%'), ':p') ++ let ftype = &filetype ++ ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(filename, ftype) ++ return ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 || !s:tlist_{fidx}_valid ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(filename) ++ return ++ endif ++ ++ " Process the tags for the file ++ let fidx = s:Tlist_Process_File(filename, ftype) ++ if fidx == -1 ++ return ++ endif ++ endif ++ ++ if !s:tlist_{fidx}_tag_count ++ return ++ endif ++ ++ if s:tlist_{fidx}_menu_cmd != '' ++ " Update the menu with the cached command ++ call s:Tlist_Menu_File_Refresh(fidx) ++ ++ return ++ endif ++ ++ " We are going to add entries to the tags menu, so the menu won't be ++ " empty ++ let s:tlist_menu_empty = 0 ++ ++ 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, add_ttype_name, i) ++ if mcmd != '' ++ let cmd = cmd . mcmd ++ endif ++ ++ let i = i + 1 ++ endwhile ++ ++ " Cache the menu command for reuse ++ let s:tlist_{fidx}_menu_cmd = cmd ++ ++ " Update the menu ++ call s:Tlist_Menu_File_Refresh(fidx) ++endfunction ++ ++" Tlist_Menu_Remove_File ++" Remove the tags displayed in the tags menu ++function! s:Tlist_Menu_Remove_File() ++ if !has('gui_running') || s:tlist_menu_empty ++ return ++ endif ++ ++ call s:Tlist_Log_Msg('Removing the tags menu for a file') ++ ++ " Cleanup the Tags menu ++ silent! unmenu T&ags ++ if &mousemodel =~ 'popup' ++ silent! unmenu PopUp.T&ags ++ endif ++ ++ " Add a dummy menu item to retain teared off menu ++ noremenu T&ags.Dummy l ++ ++ silent! unmenu! T&ags ++ if &mousemodel =~ 'popup' ++ silent! unmenu! PopUp.T&ags ++ endif ++ ++ call s:Tlist_Menu_Add_Base_Menu() ++ ++ " Remove the dummy menu item ++ unmenu T&ags.Dummy ++ ++ let s:tlist_menu_empty = 1 ++endfunction ++ ++" Tlist_Menu_Refresh ++" Refresh the taglist menu ++function! s:Tlist_Menu_Refresh() ++ call s:Tlist_Log_Msg('Refreshing the tags menu') ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx != -1 ++ " Invalidate the cached menu command ++ let s:tlist_{fidx}_menu_cmd = '' ++ endif ++ ++ " Update the taglist, menu and window ++ call s:Tlist_Update_Current_File() ++endfunction ++ ++" Tlist_Menu_Jump_To_Tag ++" Jump to the selected tag ++function! s:Tlist_Menu_Jump_To_Tag(tidx) ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx == -1 ++ return ++ endif ++ ++ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, a:tidx) ++ if tagpat == '' ++ return ++ endif ++ ++ " Add the current cursor position to the jump list, so that user can ++ " jump back using the ' and ` marks. ++ mark ' ++ ++ silent call search(tagpat, 'w') ++ ++ " Bring the line to the middle of the window ++ normal! z. ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++endfunction ++ ++" Tlist_Menu_Init ++" Initialize the taglist menu ++function! s:Tlist_Menu_Init() ++ call s:Tlist_Menu_Add_Base_Menu() ++ ++ " Automatically add the tags defined in the current file to the menu ++ augroup TagListMenuCmds ++ autocmd! ++ ++ if !g:Tlist_Process_File_Always ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ autocmd BufLeave * call s:Tlist_Menu_Remove_File() ++ augroup end ++ ++ call s:Tlist_Menu_Update_File(0) ++endfunction ++ ++" Tlist_Vim_Session_Load ++" Initialize the taglist window/buffer, which is created when loading ++" a Vim session file. ++function! s:Tlist_Vim_Session_Load() ++ call s:Tlist_Log_Msg('Tlist_Vim_Session_Load') ++ ++ " Initialize the taglist window ++ call s:Tlist_Window_Init() ++ ++ " Refresh the taglist window ++ call s:Tlist_Window_Refresh() ++endfunction ++ ++" Tlist_Set_App ++" Set the name of the external plugin/application to which taglist ++" belongs. ++" Taglist plugin is part of another plugin like cream or winmanager. ++function! Tlist_Set_App(name) ++ if a:name == "" ++ return ++ endif ++ ++ let s:tlist_app_name = a:name ++endfunction ++ ++" Winmanager integration ++ ++" Initialization required for integration with winmanager ++function! TagList_Start() ++ " If current buffer is not taglist buffer, then don't proceed ++ if bufname('%') != '__Tag_List__' ++ return ++ endif ++ ++ call Tlist_Set_App('winmanager') ++ ++ " Get the current filename from the winmanager plugin ++ let bufnum = WinManagerGetLastEditedFile() ++ if bufnum != -1 ++ let filename = fnamemodify(bufname(bufnum), ':p') ++ let ftype = getbufvar(bufnum, '&filetype') ++ endif ++ ++ " Initialize the taglist window, if it is not already initialized ++ if !exists('s:tlist_window_initialized') || !s:tlist_window_initialized ++ call s:Tlist_Window_Init() ++ call s:Tlist_Window_Refresh() ++ let s:tlist_window_initialized = 1 ++ endif ++ ++ " Update the taglist window ++ if bufnum != -1 ++ if !s:Tlist_Skip_File(filename, ftype) && g:Tlist_Auto_Update ++ call s:Tlist_Window_Refresh_File(filename, ftype) ++ endif ++ endif ++endfunction ++ ++function! TagList_IsValid() ++ return 0 ++endfunction ++ ++function! TagList_WrapUp() ++ return 0 ++endfunction ++ ++" restore 'cpo' ++let &cpo = s:cpo_save ++unlet s:cpo_save ++ +diff -urN vim71/1/SCRIPTS/Diff_All.cmd vim71_ada/1/SCRIPTS/Diff_All.cmd +--- vim71/1/SCRIPTS/Diff_All.cmd 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/Diff_All.cmd 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,6 @@ ++C:\bin\Vim\vim70\gvim -g -d --nofork .\indent\ada.vim %HOME%\vimfiles\indent\ada.vim ++C:\bin\Vim\vim70\gvim -g -d --nofork .\ftdetect\ada.vim %HOME%\vimfiles\ftdetect\ada.vim ++C:\bin\Vim\vim70\gvim -g -d --nofork .\syntax\ada.vim %HOME%\vimfiles\syntax\ada.vim ++C:\bin\Vim\vim70\gvim -g -d --nofork .\ftplugin\ada.vim %HOME%\vimfiles\ftplugin\ada.vim ++C:\bin\Vim\vim70\gvim -g -d --nofork .\compiler\gnat.vim %HOME%\vimfiles\compiler\gnat.vim ++C:\bin\Vim\vim70\gvim -g -d --nofork .\plugin\rainbow_parenthsis.vim %HOME%\vimfiles\plugin\rainbow_parenthsis.vim +diff -urN vim71/1/SCRIPTS/Diff_Home.zsh vim71_ada/1/SCRIPTS/Diff_Home.zsh +--- vim71/1/SCRIPTS/Diff_Home.zsh 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/Diff_Home.zsh 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,24 @@ ++#!/bin/zsh ++ ++setopt No_X_Trace; ++setopt Glob; ++setopt Extended_Glob; ++setopt Null_Glob; ++ ++pushd ..; ++ for I in \ ++ **/*.vim \ ++ macros/[[:alnum:]]##.bash \ ++ macros/[[:alnum:]]##.zsh \ ++ doc/[[:alnum:]]##.txt ; ++ do ++ if diff --brief --report-identical-files "${I}" ~/vimfiles/"${I}"; then ++ echo "do nothing"; ++ else ++ gvimdiff --nofork "${I}" ~/vimfiles/"${I}" ++ fi; ++ done; unset I; ++popd; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=zsh encoding=utf-8 fileformat=unix +diff -urN vim71/1/SCRIPTS/Diff_Portable.bash vim71_ada/1/SCRIPTS/Diff_Portable.bash +--- vim71/1/SCRIPTS/Diff_Portable.bash 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/Diff_Portable.bash 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,37 @@ ++#!/bin/bash ++ ++source /etc/profile.d/vim.bash ++set -o xtrace; ++ ++declare -r in_Target_Base="${1}" ++ ++declare -x VIMBIN='/opt/gnat/tools/bin'; ++declare -x VIM='/opt/gnat/tools/share/vim'; ++declare -x VIMRUNTIME='/opt/gnat/tools/share/vim/vim71'; ++declare -x Target="${in_Target_Base}/Bin/GVimPortable/App/vim/vimfiles"; ++ ++function Compare () ++ { ++ local in_File="${0}"; ++ ++ if diff --brief --report-identical-files "${in_File}" "${Target}/${in_File}"; then ++ echo "do nothing"; ++ else ++ ${VIMBIN}/gvim -d --nofork "${in_File}" "${Target}/${in_File}" ++ fi; ++ } ++declare -x -f Compare; ++ ++pushd ..; ++ find . \ ++ '(' \ ++ -iname "*.vim" -o \ ++ -iregex ".*/macros/[a-z_0-9]*.bash" -o \ ++ -iregex ".*/doc/[a-z_0-9]*.txt" \ ++ ')' \ ++ -exec \ ++ /bin/bash -c Compare '{}' ';' ; ++popd; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix +diff -urN vim71/1/SCRIPTS/Diff_Source.bash vim71_ada/1/SCRIPTS/Diff_Source.bash +--- vim71/1/SCRIPTS/Diff_Source.bash 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/Diff_Source.bash 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,43 @@ ++#!/bin/bash ++ ++source /etc/profile.d/vim.bash ++set -o xtrace; ++ ++#declare -x VIMBIN='/cygdrive/c/bin/Vim/vim71'; ++ ++declare -x VIMBIN='/opt/gnat/tools/bin'; ++declare -x VIM='/opt/gnat/tools/share/vim'; ++declare -x VIMRUNTIME='/opt/gnat/tools/share/vim/vim71'; ++declare -x Target="../../rpm/BUILD/vim-runtime-$(date +%d%m%Y)" ++declare -x -f Compare; ++ ++function Compare () ++ { ++ local in_File="${0}"; ++ ++ if test -f ${Target}/${in_File} ; then ++ if diff --brief --report-identical-files "${in_File}" "${Target}/${in_File}" ; then ++ echo "do nothing"; ++ else ++ ${VIMBIN}/gvim -d --nofork "${in_File}" "${Target}/${in_File}"; ++ fi; ++ else ++ echo "${in_File} not part of the main runtime"; ++ fi; ++ ++ return; ++ } ++ ++pushd ..; ++ find . \ ++ '(' \ ++ -iname "*.vim" -o \ ++ -iregex ".*/macros/[a-z_0-9]*.bash" -o \ ++ -iregex ".*/doc/[a-z_0-9]*.txt" \ ++ ')' \ ++ -exec \ ++ /bin/bash -c Compare '{}' ';' ; ++popd; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix +diff -urN vim71/1/SCRIPTS/Edit_All.bash vim71_ada/1/SCRIPTS/Edit_All.bash +--- vim71/1/SCRIPTS/Edit_All.bash 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/Edit_All.bash 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,17 @@ ++#!/bin/bash ++ ++pushd ..; ++ find . \ ++ '(' \ ++ -iname "*.vim" -o \ ++ -iregex ".*/doc/[a-z_]*.txt" \ ++ ')' \ ++ -print | \ ++ xargs --replace --max-args=64 \ ++ /opt/gnat/tools/bin/gvim \ ++ --servername "Edit All" \ ++ --remote-silent ; ++popd; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix +diff -urN vim71/1/SCRIPTS/Make_Tar.bash vim71_ada/1/SCRIPTS/Make_Tar.bash +--- vim71/1/SCRIPTS/Make_Tar.bash 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/Make_Tar.bash 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,20 @@ ++#!/bin/bash ++ ++pushd ..; ++ find . \ ++ '(' \ ++ -iname "*.vim" -o \ ++ -ipath "./macros/*.bash" -o \ ++ -iregex ".*/doc/[a-z]*.txt" \ ++ ')' \ ++ -print | \ ++ xargs \ ++ tar \ ++ --create \ ++ --bzip2 \ ++ --verbose \ ++ --file=ada_vimfiles.tar-bz2 ; ++popd; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix +diff -urN vim71/1/SCRIPTS/.svn/all-wcprops vim71_ada/1/SCRIPTS/.svn/all-wcprops +--- vim71/1/SCRIPTS/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,41 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 52 ++/svnroot/gnuada/!svn/ver/773/trunk/tools/vim/SCRIPTS ++END ++Make_Tar.bash ++K 25 ++svn:wc:ra_dav:version-url ++V 66 ++/svnroot/gnuada/!svn/ver/342/trunk/tools/vim/SCRIPTS/Make_Tar.bash ++END ++Diff_All.cmd ++K 25 ++svn:wc:ra_dav:version-url ++V 65 ++/svnroot/gnuada/!svn/ver/773/trunk/tools/vim/SCRIPTS/Diff_All.cmd ++END ++Diff_Home.zsh ++K 25 ++svn:wc:ra_dav:version-url ++V 66 ++/svnroot/gnuada/!svn/ver/695/trunk/tools/vim/SCRIPTS/Diff_Home.zsh ++END ++Diff_Source.bash ++K 25 ++svn:wc:ra_dav:version-url ++V 69 ++/svnroot/gnuada/!svn/ver/743/trunk/tools/vim/SCRIPTS/Diff_Source.bash ++END ++Edit_All.bash ++K 25 ++svn:wc:ra_dav:version-url ++V 66 ++/svnroot/gnuada/!svn/ver/429/trunk/tools/vim/SCRIPTS/Edit_All.bash ++END ++Diff_Portable.bash ++K 25 ++svn:wc:ra_dav:version-url ++V 71 ++/svnroot/gnuada/!svn/ver/743/trunk/tools/vim/SCRIPTS/Diff_Portable.bash ++END +diff -urN vim71/1/SCRIPTS/.svn/dir-prop-base vim71_ada/1/SCRIPTS/.svn/dir-prop-base +--- vim71/1/SCRIPTS/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,6 @@ ++K 10 ++svn:ignore ++V 9 ++.backups ++ ++END +diff -urN vim71/1/SCRIPTS/.svn/entries vim71_ada/1/SCRIPTS/.svn/entries +--- vim71/1/SCRIPTS/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/entries 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,106 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/SCRIPTS ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-09-17T08:58:57.545957Z ++773 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ ++Make_Tar.bash ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++8fa993957020a567d7d18cf275f79f85 ++2006-07-27T19:03:11.250838Z ++342 ++krischik ++has-props ++ ++Diff_All.cmd ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++e5a39f09b8532487297a2b21ce18539c ++2007-09-17T08:58:57.545957Z ++773 ++krischik ++has-props ++ ++Diff_Home.zsh ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++2467db473cdf6e65848a2f29a33da0dc ++2007-04-27T17:57:11.151403Z ++695 ++krischik ++has-props ++ ++Diff_Source.bash ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++bfe42019807a5f00339c2a577835a52f ++2007-07-08T15:01:50.709462Z ++743 ++krischik ++has-props ++ ++Edit_All.bash ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++386419783256e147810d36e58847f593 ++2006-10-15T17:43:45.084385Z ++429 ++krischik ++has-props ++ ++Diff_Portable.bash ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++6fbd7df3976bc16679aa4dd121ad4723 ++2007-07-08T15:01:50.709462Z ++743 ++krischik ++has-props ++ +diff -urN vim71/1/SCRIPTS/.svn/format vim71_ada/1/SCRIPTS/.svn/format +--- vim71/1/SCRIPTS/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/format 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/SCRIPTS/.svn/prop-base/Diff_All.cmd.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_All.cmd.svn-base +--- vim71/1/SCRIPTS/.svn/prop-base/Diff_All.cmd.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_All.cmd.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 14 ++svn:executable ++V 1 ++* ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 15 ++text/x-dosbatch ++END +diff -urN vim71/1/SCRIPTS/.svn/prop-base/Diff_Home.zsh.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Home.zsh.svn-base +--- vim71/1/SCRIPTS/.svn/prop-base/Diff_Home.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Home.zsh.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 14 ++svn:executable ++V 1 ++* ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 9 ++text/x-sh ++END +diff -urN vim71/1/SCRIPTS/.svn/prop-base/Diff_Portable.bash.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Portable.bash.svn-base +--- vim71/1/SCRIPTS/.svn/prop-base/Diff_Portable.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Portable.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 14 ++svn:executable ++V 1 ++* ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 9 ++text/x-sh ++END +diff -urN vim71/1/SCRIPTS/.svn/prop-base/Diff_Source.bash.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Source.bash.svn-base +--- vim71/1/SCRIPTS/.svn/prop-base/Diff_Source.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Source.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 14 ++svn:executable ++V 1 ++* ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 9 ++text/x-sh ++END +diff -urN vim71/1/SCRIPTS/.svn/prop-base/Edit_All.bash.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Edit_All.bash.svn-base +--- vim71/1/SCRIPTS/.svn/prop-base/Edit_All.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/prop-base/Edit_All.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 14 ++svn:executable ++V 1 ++* ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 9 ++text/x-sh ++END +diff -urN vim71/1/SCRIPTS/.svn/prop-base/Make_Tar.bash.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Make_Tar.bash.svn-base +--- vim71/1/SCRIPTS/.svn/prop-base/Make_Tar.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/prop-base/Make_Tar.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 14 ++svn:executable ++V 1 ++* ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 9 ++text/x-sh ++END +diff -urN vim71/1/SCRIPTS/.svn/text-base/Diff_All.cmd.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Diff_All.cmd.svn-base +--- vim71/1/SCRIPTS/.svn/text-base/Diff_All.cmd.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/text-base/Diff_All.cmd.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,6 @@ ++C:\bin\Vim\vim70\gvim -g -d --nofork .\indent\ada.vim %HOME%\vimfiles\indent\ada.vim ++C:\bin\Vim\vim70\gvim -g -d --nofork .\ftdetect\ada.vim %HOME%\vimfiles\ftdetect\ada.vim ++C:\bin\Vim\vim70\gvim -g -d --nofork .\syntax\ada.vim %HOME%\vimfiles\syntax\ada.vim ++C:\bin\Vim\vim70\gvim -g -d --nofork .\ftplugin\ada.vim %HOME%\vimfiles\ftplugin\ada.vim ++C:\bin\Vim\vim70\gvim -g -d --nofork .\compiler\gnat.vim %HOME%\vimfiles\compiler\gnat.vim ++C:\bin\Vim\vim70\gvim -g -d --nofork .\plugin\rainbow_parenthsis.vim %HOME%\vimfiles\plugin\rainbow_parenthsis.vim +diff -urN vim71/1/SCRIPTS/.svn/text-base/Diff_Home.zsh.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Home.zsh.svn-base +--- vim71/1/SCRIPTS/.svn/text-base/Diff_Home.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Home.zsh.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,24 @@ ++#!/bin/zsh ++ ++setopt No_X_Trace; ++setopt Glob; ++setopt Extended_Glob; ++setopt Null_Glob; ++ ++pushd ..; ++ for I in \ ++ **/*.vim \ ++ macros/[[:alnum:]]##.bash \ ++ macros/[[:alnum:]]##.zsh \ ++ doc/[[:alnum:]]##.txt ; ++ do ++ if diff --brief --report-identical-files "${I}" ~/vimfiles/"${I}"; then ++ echo "do nothing"; ++ else ++ gvimdiff --nofork "${I}" ~/vimfiles/"${I}" ++ fi; ++ done; unset I; ++popd; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=zsh encoding=utf-8 fileformat=unix +diff -urN vim71/1/SCRIPTS/.svn/text-base/Diff_Portable.bash.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Portable.bash.svn-base +--- vim71/1/SCRIPTS/.svn/text-base/Diff_Portable.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Portable.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,37 @@ ++#!/bin/bash ++ ++source /etc/profile.d/vim.bash ++set -o xtrace; ++ ++declare -r in_Target_Base="${1}" ++ ++declare -x VIMBIN='/opt/gnat/tools/bin'; ++declare -x VIM='/opt/gnat/tools/share/vim'; ++declare -x VIMRUNTIME='/opt/gnat/tools/share/vim/vim71'; ++declare -x Target="${in_Target_Base}/Bin/GVimPortable/App/vim/vimfiles"; ++ ++function Compare () ++ { ++ local in_File="${0}"; ++ ++ if diff --brief --report-identical-files "${in_File}" "${Target}/${in_File}"; then ++ echo "do nothing"; ++ else ++ ${VIMBIN}/gvim -d --nofork "${in_File}" "${Target}/${in_File}" ++ fi; ++ } ++declare -x -f Compare; ++ ++pushd ..; ++ find . \ ++ '(' \ ++ -iname "*.vim" -o \ ++ -iregex ".*/macros/[a-z_0-9]*.bash" -o \ ++ -iregex ".*/doc/[a-z_0-9]*.txt" \ ++ ')' \ ++ -exec \ ++ /bin/bash -c Compare '{}' ';' ; ++popd; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix +diff -urN vim71/1/SCRIPTS/.svn/text-base/Diff_Source.bash.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Source.bash.svn-base +--- vim71/1/SCRIPTS/.svn/text-base/Diff_Source.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Source.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,43 @@ ++#!/bin/bash ++ ++source /etc/profile.d/vim.bash ++set -o xtrace; ++ ++#declare -x VIMBIN='/cygdrive/c/bin/Vim/vim71'; ++ ++declare -x VIMBIN='/opt/gnat/tools/bin'; ++declare -x VIM='/opt/gnat/tools/share/vim'; ++declare -x VIMRUNTIME='/opt/gnat/tools/share/vim/vim71'; ++declare -x Target="../../rpm/BUILD/vim-runtime-$(date +%d%m%Y)" ++declare -x -f Compare; ++ ++function Compare () ++ { ++ local in_File="${0}"; ++ ++ if test -f ${Target}/${in_File} ; then ++ if diff --brief --report-identical-files "${in_File}" "${Target}/${in_File}" ; then ++ echo "do nothing"; ++ else ++ ${VIMBIN}/gvim -d --nofork "${in_File}" "${Target}/${in_File}"; ++ fi; ++ else ++ echo "${in_File} not part of the main runtime"; ++ fi; ++ ++ return; ++ } ++ ++pushd ..; ++ find . \ ++ '(' \ ++ -iname "*.vim" -o \ ++ -iregex ".*/macros/[a-z_0-9]*.bash" -o \ ++ -iregex ".*/doc/[a-z_0-9]*.txt" \ ++ ')' \ ++ -exec \ ++ /bin/bash -c Compare '{}' ';' ; ++popd; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix +diff -urN vim71/1/SCRIPTS/.svn/text-base/Edit_All.bash.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Edit_All.bash.svn-base +--- vim71/1/SCRIPTS/.svn/text-base/Edit_All.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/text-base/Edit_All.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,17 @@ ++#!/bin/bash ++ ++pushd ..; ++ find . \ ++ '(' \ ++ -iname "*.vim" -o \ ++ -iregex ".*/doc/[a-z_]*.txt" \ ++ ')' \ ++ -print | \ ++ xargs --replace --max-args=64 \ ++ /opt/gnat/tools/bin/gvim \ ++ --servername "Edit All" \ ++ --remote-silent ; ++popd; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix +diff -urN vim71/1/SCRIPTS/.svn/text-base/Make_Tar.bash.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Make_Tar.bash.svn-base +--- vim71/1/SCRIPTS/.svn/text-base/Make_Tar.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/SCRIPTS/.svn/text-base/Make_Tar.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,20 @@ ++#!/bin/bash ++ ++pushd ..; ++ find . \ ++ '(' \ ++ -iname "*.vim" -o \ ++ -ipath "./macros/*.bash" -o \ ++ -iregex ".*/doc/[a-z]*.txt" \ ++ ')' \ ++ -print | \ ++ xargs \ ++ tar \ ++ --create \ ++ --bzip2 \ ++ --verbose \ ++ --file=ada_vimfiles.tar-bz2 ; ++popd; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix +diff -urN vim71/1/.svn/all-wcprops vim71_ada/1/.svn/all-wcprops +--- vim71/1/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,11 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 44 ++/svnroot/gnuada/!svn/ver/825/trunk/tools/vim ++END ++ada_options.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 60 ++/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/ada_options.vim ++END +diff -urN vim71/1/.svn/dir-prop-base vim71_ada/1/.svn/dir-prop-base +--- vim71/1/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,8 @@ ++K 10 ++svn:ignore ++V 25 ++.backups ++*.tar-bz2 ++*.vba ++ ++END +diff -urN vim71/1/.svn/entries vim71_ada/1/.svn/entries +--- vim71/1/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/.svn/entries 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,74 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-12-09T13:34:03.484664Z ++825 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ ++colors ++dir ++ ++indent ++dir ++ ++ftdetect ++dir ++ ++macros ++dir ++ ++doc ++dir ++ ++syntax ++dir ++ ++SCRIPTS ++dir ++ ++autoload ++dir ++ ++ftplugin ++dir ++ ++compiler ++dir ++ ++ada_options.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++2ed6ca5b229dcdc415152a2bcb6f1b31 ++2007-09-17T09:11:59.633161Z ++774 ++krischik ++has-props ++ ++plugin ++dir ++ +diff -urN vim71/1/.svn/format vim71_ada/1/.svn/format +--- vim71/1/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/.svn/format 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/.svn/prop-base/ada_options.vim.svn-base vim71_ada/1/.svn/prop-base/ada_options.vim.svn-base +--- vim71/1/.svn/prop-base/ada_options.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/.svn/prop-base/ada_options.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/.svn/text-base/ada_options.vim.svn-base vim71_ada/1/.svn/text-base/ada_options.vim.svn-base +--- vim71/1/.svn/text-base/ada_options.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/.svn/text-base/ada_options.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,105 @@ ++"------------------------------------------------------------------------------ ++" Description: Options setable by the Ada plugin ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL$ ++" History: 24.05.2006 MK Unified Headers ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 02.10.2006 MK Folding for "gnat pretty" ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Bram suggested to save on spaces ++" Usage: copy content into your .vimrc and change options to your ++" likeing. ++" Help Page: ft-ada-options ++"------------------------------------------------------------------------------ ++ ++echoerr 'It is suggested to copy the content of ada_options into .vimrc!' ++finish " 1}}} ++ ++" Section: Ada options {{{1 ++ ++ let g:ada_abbrev = 1 ++ let g:ada_default_compiler = 'gnat' ++ let g:ada_extended_tagging = 'list' ++ let g:ada_folding = 'i' ++" let g:ada_folding = 'gibxp' ++" let g:ada_folding = 'spftc' ++ let g:ada_rainbow_color = 1 ++ let g:ada_space_errors = 1 ++ let g:ada_standard_types = 1 ++ let g:ada_with_gnat_project_files = 1 ++" let g:ada_extended_completion = 1 ++" let g:ada_line_errors = 1 ++" let g:ada_omni_with_keywords = 1 ++ ++ let g:Tlist_Exit_OnlyWindow = 1 ++ let g:Tlist_File_Fold_Auto_Close = 1 ++ let g:Tlist_Sort_Type = "name" ++ ++ let g:NERD_use_ada_with_spaces = 1 ++ ++ let g:backup_directory = '.backups' ++ let g:backup_purge = 10 ++ ++ let g:mapleader = "" ++ ++ if &diff ++ let g:Tlist_Auto_Open = 0 ++ else ++ let g:Tlist_Auto_Open = 1 ++ endif ++ ++ filetype plugin indent on ++ syntax enable ++ ++" }}}1 ++ ++" Section: Vimball options {{{1 ++:set expandtab fileformat=unix encoding=utf-8 ++:.+2,.+13 MkVimball ada-4.5.0 ++ ++ada_options.vim ++autoload/ada.vim ++autoload/adacomplete.vim ++autoload/decada.vim ++autoload/gnat.vim ++compiler/decada.vim ++compiler/gnat.vim ++doc/ft_ada.txt ++ftdetect/ada.vim ++ftplugin/ada.vim ++indent/ada.vim ++syntax/ada.vim ++ ++" }}}1 ++ ++" Section: Tar options {{{1 ++ ++tar --create --bzip2 \ ++ --file="ada-4.5.0.tar.bz2" \ ++ autoload/ada.vim \ ++ autoload/adacomplete.vim \ ++ autoload/decada.vim \ ++ autoload/gnat.vim \ ++ compiler/decada.vim \ ++ compiler/gnat.vim \ ++ doc/ft_ada.txt \ ++ ftdetect/ada.vim \ ++ ftplugin/ada.vim \ ++ indent/ada.vim \ ++ syntax/ada.vim ; ++ ++" }}}1 ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++" vim: nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++" vim: textwidth=0 foldmethod=marker foldmethod=marker +diff -urN vim71/1/syntax/ada.vim vim71_ada/1/syntax/ada.vim +--- vim71/1/syntax/ada.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/syntax/ada.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,368 @@ ++"---------------------------------------------------------------------------- ++" Description: Vim Ada syntax file ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" David A. Wheeler ++" Simon Bradley ++" Contributors: Preben Randhol. ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ ++" http://www.dwheeler.com/vim ++" History: 24.05.2006 MK Unified Headers ++" 26.05.2006 MK ' should not be in iskeyword. ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 02.10.2006 MK Better folding. ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Spell check for comments and strings only ++" 05.11.2006 MK Bram suggested to save on spaces ++" Help Page: help ft-ada-syntax ++"------------------------------------------------------------------------------ ++" The formal spec of Ada 2005 (ARM) is the "Ada 2005 Reference Manual". ++" For more Ada 2005 info, see http://www.gnuada.org and http://www.adapower.com. ++" ++" This vim syntax file works on vim 7.0 only and makes use of most of Voim 7.0 ++" advanced features. ++"------------------------------------------------------------------------------ ++ ++if exists("b:current_syntax") || version < 700 ++ finish ++endif ++ ++let b:current_syntax = "ada" ++ ++" Section: Ada is entirely case-insensitive. {{{1 ++" ++syntax case ignore ++setlocal nosmartcase ++setlocal ignorecase ++ ++" Section: Highlighting commands {{{1 ++" ++" There are 72 reserved words in total in Ada2005. Some keywords are ++" used in more than one way. For example: ++" 1. "end" is a general keyword, but "end if" ends a Conditional. ++" 2. "then" is a conditional, but "and then" is an operator. ++" ++for b:Item in g:ada#Keywords ++ " Standard Exceptions (including I/O). ++ " We'll highlight the standard exceptions, similar to vim's Python mode. ++ " It's possible to redefine the standard exceptions as something else, ++ " but doing so is very bad practice, so simply highlighting them makes sense. ++ if b:Item['kind'] == "x" ++ execute "syntax keyword adaException " . b:Item['word'] ++ endif ++ if b:Item['kind'] == "a" ++ execute 'syntax match adaAttribute "\V' . b:Item['word'] . '"' ++ endif ++ " We don't normally highlight types in package Standard ++ " (Integer, Character, Float, etc.). I don't think it looks good ++ " with the other type keywords, and many Ada programs define ++ " so many of their own types that it looks inconsistent. ++ " However, if you want this highlighting, turn on "ada_standard_types". ++ " For package Standard's definition, see ARM section A.1. ++ if b:Item['kind'] == "t" && exists ("g:ada_standard_types") ++ execute "syntax keyword adaBuiltinType " . b:Item['word'] ++ endif ++endfor ++ ++" Section: others {{{1 ++" ++syntax keyword adaLabel others ++ ++" Section: Operatoren {{{1 ++" ++syntax keyword adaOperator abs mod not rem xor ++syntax match adaOperator "\" ++syntax match adaOperator "\" ++syntax match adaOperator "\" ++syntax match adaOperator "\" ++syntax match adaOperator "[-+*/<>&]" ++syntax keyword adaOperator ** ++syntax match adaOperator "[/<>]=" ++syntax keyword adaOperator => ++syntax match adaOperator "\.\." ++syntax match adaOperator "=" ++ ++" Section: <> {{{1 ++" ++" Handle the box, <>, specially: ++" ++syntax keyword adaSpecial <> ++ ++" Section: rainbow color {{{1 ++" ++if exists("g:ada_rainbow_color") ++ syntax match adaSpecial "[:;.,]" ++ call rainbow_parenthsis#LoadRound () ++ call rainbow_parenthsis#Activate () ++else ++ syntax match adaSpecial "[:;().,]" ++endif ++ ++" Section: := {{{1 ++" ++" We won't map "adaAssignment" by default, but we need to map ":=" to ++" something or the "=" inside it will be mislabelled as an operator. ++" Note that in Ada, assignment (:=) is not considered an operator. ++" ++syntax match adaAssignment ":=" ++ ++" Section: Numbers, including floating point, exponents, and alternate bases. {{{1 ++" ++syntax match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" ++syntax match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" ++ ++" Section: Identify leading numeric signs {{{1 ++" ++" In "A-5" the "-" is an operator, " but in "A:=-5" the "-" is a sign. This ++" handles "A3+-5" (etc.) correctly. " This assumes that if you put a ++" don't put a space after +/- when it's used " as an operator, you won't ++" put a space before it either -- which is true " in code I've seen. ++" ++syntax match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 ++ ++" Section: Labels for the goto statement. {{{1 ++" ++syntax region adaLabel start="<<" end=">>" ++ ++" Section: Boolean Constants {{{1 ++" Boolean Constants. ++syntax keyword adaBoolean true false ++ ++" Section: Warn C/C++ {{{1 ++" ++" Warn people who try to use C/C++ notation erroneously: ++" ++syntax match adaError "//" ++syntax match adaError "/\*" ++syntax match adaError "==" ++ ++ ++" Section: Space Errors {{{1 ++" ++if exists("g:ada_space_errors") ++ if !exists("g:ada_no_trail_space_error") ++ syntax match adaSpaceError excludenl "\s\+$" ++ endif ++ if !exists("g:ada_no_tab_space_error") ++ syntax match adaSpaceError " \+\t"me=e-1 ++ endif ++ if !exists("g:ada_all_tab_usage") ++ syntax match adaSpecial "\t" ++ endif ++endif ++ ++" Section: end {{{1 ++" Unless special ("end loop", "end if", etc.), "end" marks the end of a ++" begin, package, task etc. Assiging it to adaEnd. ++syntax match adaEnd /\/ ++ ++syntax keyword adaPreproc pragma ++ ++syntax keyword adaRepeat exit for loop reverse while ++syntax match adaRepeat "\" ++ ++syntax keyword adaStatement accept delay goto raise requeue return ++syntax keyword adaStatement terminate ++syntax match adaStatement "\" ++ ++" Section: Handle Ada's record keywords. {{{1 ++" ++" 'record' usually starts a structure, but "with null record;" does not, ++" and 'end record;' ends a structure. The ordering here is critical - ++" 'record;' matches a "with null record", so make it a keyword (this can ++" match when the 'with' or 'null' is on a previous line). ++" We see the "end" in "end record" before the word record, so we match that ++" pattern as adaStructure (and it won't match the "record;" pattern). ++" ++syntax match adaStructure "\" contains=adaRecord ++syntax match adaStructure "\" contains=adaRecord ++syntax match adaKeyword "\" ++syntax match adaConditional "\" ++syntax match adaConditional "\" ++syntax match adaConditional "\" ++syntax match adaConditional "\" ++syntax match adaConditional "\" ++syntax keyword adaConditional if case select ++syntax keyword adaConditional elsif when ++ ++" Section: other keywords {{{1 ++syntax match adaKeyword "\" contains=adaRecord ++syntax keyword adaKeyword all do exception in new null out ++syntax keyword adaKeyword separate until overriding ++ ++" Section: begin keywords {{{1 ++" ++" These keywords begin various constructs, and you _might_ want to ++" highlight them differently. ++" ++syntax keyword adaBegin begin body declare entry generic ++syntax keyword adaBegin protected renames task ++ ++syntax match adaBegin "\" contains=adaFunction ++syntax match adaBegin "\" contains=adaProcedure ++syntax match adaBegin "\" contains=adaPackage ++ ++if exists("ada_with_gnat_project_files") ++ syntax keyword adaBegin project ++endif ++ ++" Section: with, use {{{1 ++" ++if exists("ada_withuse_ordinary") ++ " Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. ++ syntax keyword adaKeyword with use ++else ++ " Highlight "with" and "use" clauses like C's "#include" when they're used ++ " to reference other compilation units; otherwise they're ordinary keywords. ++ " If we have vim 6.0 or later, we'll use its advanced pattern-matching ++ " capabilities so that we won't match leading spaces. ++ syntax match adaKeyword "\" ++ syntax match adaKeyword "\" ++ syntax match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syntax match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syntax match adaInc "\" contained contains=NONE ++ syntax match adaInc "\" contained contains=NONE ++ syntax match adaInc "\" contained contains=NONE ++ " Recognize "with null record" as a keyword (even the "record"). ++ syntax match adaKeyword "\" ++ " Consider generic formal parameters of subprograms and packages as keywords. ++ syntax match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>" ++ syntax match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>" ++endif ++ ++" Section: String and character constants. {{{1 ++" ++syntax region adaString contains=@Spell start=+"+ skip=+""+ end=+"+ ++syntax match adaCharacter "'.'" ++ ++" Section: Todo (only highlighted in comments) {{{1 ++" ++syntax keyword adaTodo contained TODO FIXME XXX NOTE ++ ++" Section: Comments. {{{1 ++" ++syntax region adaComment ++ \ oneline ++ \ contains=adaTodo,adaLineError,@Spell ++ \ start="--" ++ \ end="$" ++ ++" Section: line errors {{{1 ++" ++" Note: Line errors have become quite slow with Vim 7.0 ++" ++if exists("g:ada_line_errors") ++ syntax match adaLineError "\(^.\{79}\)\@<=." contains=ALL containedin=ALL ++endif ++ ++" Section: syntax folding {{{1 ++" ++" Syntax folding is very tricky - for now I still suggest to use ++" indent folding ++" ++if exists("g:ada_folding") && g:ada_folding[0] == 's' ++ if stridx (g:ada_folding, 'p') >= 0 ++ syntax region adaPackage ++ \ start="\(\\|\\)\s*\z(\k*\)" ++ \ end="end\s\+\z1\s*;" ++ \ keepend extend transparent fold contains=ALL ++ endif ++ if stridx (g:ada_folding, 'f') >= 0 ++ syntax region adaProcedure ++ \ start="\\s*\z(\k*\)" ++ \ end="\\s\+\z1\s*;" ++ \ keepend extend transparent fold contains=ALL ++ syntax region adaFunction ++ \ start="\\s*\z(\k*\)" ++ \ end="end\s\+\z1\s*;" ++ \ keepend extend transparent fold contains=ALL ++ endif ++ if stridx (g:ada_folding, 'f') >= 0 ++ syntax region adaRecord ++ \ start="\" ++ \ end="\" ++ \ keepend extend transparent fold contains=ALL ++ endif ++endif ++ ++" Section: The default methods for highlighting. Can be overridden later. {{{1 ++" ++highlight def link adaCharacter Character ++highlight def link adaComment Comment ++highlight def link adaConditional Conditional ++highlight def link adaKeyword Keyword ++highlight def link adaLabel Label ++highlight def link adaNumber Number ++highlight def link adaSign Number ++highlight def link adaOperator Operator ++highlight def link adaPreproc PreProc ++highlight def link adaRepeat Repeat ++highlight def link adaSpecial Special ++highlight def link adaStatement Statement ++highlight def link adaString String ++highlight def link adaStructure Structure ++highlight def link adaTodo Todo ++highlight def link adaType Type ++highlight def link adaTypedef Typedef ++highlight def link adaStorageClass StorageClass ++highlight def link adaBoolean Boolean ++highlight def link adaException Exception ++highlight def link adaAttribute Tag ++highlight def link adaInc Include ++highlight def link adaError Error ++highlight def link adaSpaceError Error ++highlight def link adaLineError Error ++highlight def link adaBuiltinType Type ++highlight def link adaAssignment Special ++ ++" Subsection: Begin, End {{{2 ++" ++if exists ("ada_begin_preproc") ++ " This is the old default display: ++ highlight def link adaBegin PreProc ++ highlight def link adaEnd PreProc ++else ++ " This is the new default display: ++ highlight def link adaBegin Keyword ++ highlight def link adaEnd Keyword ++endif ++ ++ ++" Section: formatoptions {{{1 ++" ++setlocal formatoptions+=ron ++ ++" Section: sync {{{1 ++" ++" We don't need to look backwards to highlight correctly; ++" this speeds things up greatly. ++syntax sync minlines=1 maxlines=1 ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++"vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++"vim: foldmethod=marker +diff -urN vim71/1/syntax/bush.vim vim71_ada/1/syntax/bush.vim +--- vim71/1/syntax/bush.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/syntax/bush.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,309 @@ ++" Vim syntax file ++" Language: BUSH / AdaScript ++" Maintainer: Ken O. Burtch ++" URL: http://www.pegasoft.ca/bush ++" Last Change: 2004-06-29 ++ ++" Former Maintainer: Simon Bradley ++" (was ) ++" Other contributors: Preben Randhol. ++" The formal spec of Ada95 (ARM) is the "Ada95 Reference Manual". ++" For more Ada95 info, see http://www.gnuada.org and http://www.adapower.com. ++ ++" This vim syntax file works on vim 5.6, 5.7, 5.8 and 6.x. ++" It implements Bram Moolenaar's April 25, 2001 recommendations to make ++" the syntax file maximally portable across different versions of vim. ++" If vim 6.0+ is available, ++" this syntax file takes advantage of the vim 6.0 advanced pattern-matching ++" functions to avoid highlighting uninteresting leading spaces in ++" some expressions containing "with" and "use". ++ ++" For version 5.x: Clear all syntax items ++" For version 6.x: Quit when a syntax file was already loaded ++if version < 600 ++ syntax clear ++elseif exists("b:current_syntax") ++ finish ++endif ++ ++" Ada is entirely case-insensitive. ++syn case ignore ++ ++" We don't need to look backwards to highlight correctly; ++" this speeds things up greatly. ++syn sync minlines=1 maxlines=1 ++ ++" Highlighting commands. There are 69 reserved words in total in Ada95. ++" Some keywords are used in more than one way. For example: ++" 1. "end" is a general keyword, but "end if" ends a Conditional. ++" 2. "then" is a conditional, but "and then" is an operator. ++ ++ ++" Standard Exceptions (including I/O). ++" We'll highlight the standard exceptions, similar to vim's Python mode. ++" It's possible to redefine the standard exceptions as something else, ++" but doing so is very bad practice, so simply highlighting them makes sense. ++syn keyword adaException Constraint_Error Program_Error Storage_Error ++syn keyword adaException Tasking_Error ++syn keyword adaException Status_Error Mode_Error Name_Error Use_Error ++syn keyword adaException Device_Error End_Error Data_Error Layout_Error ++syn keyword adaException Length_Error Pattern_Error Index_Error ++syn keyword adaException Translation_Error ++syn keyword adaException Time_Error Argument_Error ++syn keyword adaException Tag_Error ++syn keyword adaException Picture_Error ++" Interfaces ++syn keyword adaException Terminator_Error Conversion_Error ++syn keyword adaException Pointer_Error Dereference_Error Update_Error ++" This isn't in the Ada spec, but a GNAT extension. ++syn keyword adaException Assert_Failure ++" We don't list ALL exceptions defined in particular compilers (e.g., GNAT), ++" because it's quite reasonable to define those phrases as non-exceptions. ++ ++ ++" We don't normally highlight types in package Standard ++" (Integer, Character, Float, etc.). I don't think it looks good ++" with the other type keywords, and many Ada programs define ++" so many of their own types that it looks inconsistent. ++" However, if you want this highlighting, turn on "ada_standard_types". ++" For package Standard's definition, see ARM section A.1. ++ ++if exists("ada_standard_types") ++ syn keyword adaBuiltinType Boolean Integer Natural Positive Float ++ syn keyword adaBuiltinType Character Wide_Character ++ syn keyword adaBuiltinType String Wide_String ++ syn keyword adaBuiltinType Duration ++ " These aren't listed in ARM section A.1's code, but they're noted as ++ " options in ARM sections 3.5.4 and 3.5.7: ++ syn keyword adaBuiltinType Short_Integer Short_Short_Integer ++ syn keyword adaBuiltinType Long_Integer Long_Long_Integer ++ syn keyword adaBuiltinType Short_Float Short_Short_Float ++ syn keyword adaBuiltinType Long_Float Long_Long_Float ++ " BUSH-specific types ++ syn keyword adaBuiltinType command ++ syn keyword adaBuiltinType socket_type ++ syn keyword adaBuiltinType unbounded_string ++ syn keyword adaBuiltinType universal_typeless ++ syn keyword adaBuiltinType universal_string ++ syn keyword adaBuiltinType universal_numeric ++endif ++ ++" There are MANY other predefined types; they've not been added, because ++" determining when they're a type requires context in general. ++" One potential addition would be Unbounded_String. ++ ++ ++syn keyword adaLabel others ++ ++syn keyword adaOperator abs mod not rem xor ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "[-+*/<>&]" ++syn keyword adaOperator ** ++syn match adaOperator "[/<>]=" ++syn keyword adaOperator => ++syn match adaOperator "\.\." ++syn match adaOperator "=" ++ ++" We won't map "adaAssignment" by default, but we need to map ":=" to ++" something or the "=" inside it will be mislabelled as an operator. ++" Note that in Ada, assignment (:=) is not considered an operator. ++syn match adaAssignment ":=" ++ ++" Handle the box, <>, specially: ++syn keyword adaSpecial <> ++ ++" Numbers, including floating point, exponents, and alternate bases. ++syn match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" ++syn match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" ++ ++" Identify leading numeric signs. In "A-5" the "-" is an operator, ++" but in "A:=-5" the "-" is a sign. This handles "A3+-5" (etc.) correctly. ++" This assumes that if you put a don't put a space after +/- when it's used ++" as an operator, you won't put a space before it either -- which is true ++" in code I've seen. ++syn match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 ++ ++" Labels for the goto statement. ++syn region adaLabel start="<<" end=">>" ++ ++" Boolean Constants. ++syn keyword adaBoolean true false ++ ++" Warn people who try to use C/C++ notation erroneously: ++syn match adaError "//" ++syn match adaError "/\*" ++syn match adaError "==" ++ ++ ++if exists("ada_space_errors") ++ if !exists("ada_no_trail_space_error") ++ syn match adaSpaceError excludenl "\s\+$" ++ endif ++ if !exists("ada_no_tab_space_error") ++ syn match adaSpaceError " \+\t"me=e-1 ++ endif ++endif ++ ++" Unless special ("end loop", "end if", etc.), "end" marks the end of a ++" begin, package, task etc. Assiging it to adaEnd. ++syn match adaEnd "\" ++ ++syn keyword adaPreproc pragma ++ ++syn keyword adaRepeat exit for loop reverse while ++syn match adaRepeat "\" ++ ++syn keyword adaStatement accept delay goto raise requeue return ++syn keyword adaStatement terminate ++" BUSH-specific statements ++syn keyword adaStatement cd ++syn keyword adaStatement clear ++syn keyword adaStatement env ++syn keyword adaStatement inkey ++syn keyword adaStatement jobs ++syn keyword adaStatement logout ++syn keyword adaStatement pwd ++syn keyword adaStatement step ++syn keyword adaStatement trace ++syn keyword adaStatement typeset ++syn keyword adaStatement unset ++syn keyword adaStatement wait ++syn keyword adaStatement history ++syn keyword adaStatement "?" ++syn match adaStatement "\" ++ ++" Handle Ada's record keywords. ++" 'record' usually starts a structure, but "with null record;" does not, ++" and 'end record;' ends a structure. The ordering here is critical - ++" 'record;' matches a "with null record", so make it a keyword (this can ++" match when the 'with' or 'null' is on a previous line). ++" We see the "end" in "end record" before the word record, so we match that ++" pattern as adaStructure (and it won't match the "record;" pattern). ++syn match adaStructure "\" ++syn match adaStructure "\" ++syn match adaKeyword "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn keyword adaConditional if case select ++syn keyword adaConditional elsif when ++ ++syn keyword adaKeyword all do exception in is new null out ++syn keyword adaKeyword separate until ++ ++" These keywords begin various constructs, and you _might_ want to ++" highlight them differently. ++syn keyword adaBegin begin body declare entry function generic ++syn keyword adaBegin package procedure protected renames task ++ ++ ++if exists("ada_withuse_ordinary") ++" Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. ++ syn keyword adaKeyword with use ++else ++ " Highlight "with" and "use" clauses like C's "#include" when they're used ++ " to reference other compilation units; otherwise they're ordinary keywords. ++ " If we have vim 6.0 or later, we'll use its advanced pattern-matching ++ " capabilities so that we won't match leading spaces. ++ syn match adaKeyword "\" ++ syn match adaKeyword "\" ++ if version < 600 ++ syn match adaBeginWith "^\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syn match adaSemiWith ";\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>"lc=1 contains=adaInc ++ else ++ syn match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syn match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ endif ++ syn match adaInc "\" contained contains=NONE ++ syn match adaInc "\" contained contains=NONE ++ syn match adaInc "\" contained contains=NONE ++ " Recognize "with null record" as a keyword (even the "record"). ++ syn match adaKeyword "\" ++ " Consider generic formal parameters of subprograms and packages as keywords. ++ if version < 600 ++ syn match adaKeyword ";\s*with\s\+\(function\|procedure\|package\)\>" ++ syn match adaKeyword "^\s*with\s\+\(function\|procedure\|package\)\>" ++ else ++ syn match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>" ++ syn match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>" ++ endif ++endif ++ ++ ++" String and character constants. ++syn region adaString start=+"+ skip=+""+ end=+"+ ++syn match adaCharacter "'.'" ++ ++" Todo (only highlighted in comments) ++syn keyword adaTodo contained TODO FIXME XXX ++ ++" Comments. ++syn region adaComment oneline contains=adaTodo start="--" end="$" ++ ++ ++ ++" Define the default highlighting. ++" For version 5.7 and earlier: only when not done already ++" For version 5.8 and later: only when an item doesn't have highlighting yet ++if version >= 508 || !exists("did_ada_syn_inits") ++ if version < 508 ++ let did_ada_syn_inits = 1 ++ command -nargs=+ HiLink hi link ++ else ++ command -nargs=+ HiLink hi def link ++ endif ++ ++ " The default methods for highlighting. Can be overridden later. ++ HiLink adaCharacter Character ++ HiLink adaComment Comment ++ HiLink adaConditional Conditional ++ HiLink adaKeyword Keyword ++ HiLink adaLabel Label ++ HiLink adaNumber Number ++ HiLink adaSign Number ++ HiLink adaOperator Operator ++ HiLink adaPreproc PreProc ++ HiLink adaRepeat Repeat ++ HiLink adaSpecial Special ++ HiLink adaStatement Statement ++ HiLink adaString String ++ HiLink adaStructure Structure ++ HiLink adaTodo Todo ++ HiLink adaType Type ++ HiLink adaTypedef Typedef ++ HiLink adaStorageClass StorageClass ++ HiLink adaBoolean Boolean ++ HiLink adaException Exception ++ HiLink adaInc Include ++ HiLink adaError Error ++ HiLink adaSpaceError Error ++ HiLink adaBuiltinType Type ++ ++ if exists("ada_begin_preproc") ++ " This is the old default display: ++ HiLink adaBegin PreProc ++ HiLink adaEnd PreProc ++ else ++ " This is the new default display: ++ HiLink adaBegin Keyword ++ HiLink adaEnd Keyword ++ endif ++ ++ delcommand HiLink ++endif ++ ++let b:current_syntax = "ada" ++ ++" vim: ts=8 +diff -urN vim71/1/syntax/.svn/all-wcprops vim71_ada/1/syntax/.svn/all-wcprops +--- vim71/1/syntax/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/syntax/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,17 @@ ++K 25 ++svn:wc:ra_dav:version-url ++V 51 ++/svnroot/gnuada/!svn/ver/793/trunk/tools/vim/syntax ++END ++ada.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 59 ++/svnroot/gnuada/!svn/ver/793/trunk/tools/vim/syntax/ada.vim ++END ++bush.vim ++K 25 ++svn:wc:ra_dav:version-url ++V 60 ++/svnroot/gnuada/!svn/ver/746/trunk/tools/vim/syntax/bush.vim ++END +diff -urN vim71/1/syntax/.svn/dir-prop-base vim71_ada/1/syntax/.svn/dir-prop-base +--- vim71/1/syntax/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/syntax/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,6 @@ ++K 10 ++svn:ignore ++V 9 ++.backups ++ ++END +diff -urN vim71/1/syntax/.svn/entries vim71_ada/1/syntax/.svn/entries +--- vim71/1/syntax/.svn/entries 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/syntax/.svn/entries 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,54 @@ ++8 ++ ++dir ++841 ++https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax ++https://gnuada.svn.sourceforge.net/svnroot/gnuada ++ ++ ++ ++2007-11-01T18:29:58.081603Z ++793 ++krischik ++has-props ++ ++svn:special svn:externals svn:needs-lock ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++9b0cb6ef-3e0e-0410-8360-d61ff0ace097 ++ ++ada.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++1f3e27d039a012d7bc96fd9e2b95ff20 ++2007-11-01T18:29:58.081603Z ++793 ++krischik ++has-props ++ ++bush.vim ++file ++ ++ ++ ++ ++2008-01-16T15:37:03.000000Z ++7b0798091c1dad50554c7905c6803cbe ++2007-07-08T16:24:46.571321Z ++746 ++krischik ++has-props ++ +diff -urN vim71/1/syntax/.svn/format vim71_ada/1/syntax/.svn/format +--- vim71/1/syntax/.svn/format 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/syntax/.svn/format 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1 @@ ++8 +diff -urN vim71/1/syntax/.svn/prop-base/ada.vim.svn-base vim71_ada/1/syntax/.svn/prop-base/ada.vim.svn-base +--- vim71/1/syntax/.svn/prop-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/syntax/.svn/prop-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/syntax/.svn/prop-base/bush.vim.svn-base vim71_ada/1/syntax/.svn/prop-base/bush.vim.svn-base +--- vim71/1/syntax/.svn/prop-base/bush.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/syntax/.svn/prop-base/bush.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,13 @@ ++K 13 ++svn:eol-style ++V 2 ++LF ++K 12 ++svn:keywords ++V 31 ++Author Date Id Revision HeadURL ++K 13 ++svn:mime-type ++V 10 ++text/x-vim ++END +diff -urN vim71/1/syntax/.svn/text-base/ada.vim.svn-base vim71_ada/1/syntax/.svn/text-base/ada.vim.svn-base +--- vim71/1/syntax/.svn/text-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/syntax/.svn/text-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,368 @@ ++"---------------------------------------------------------------------------- ++" Description: Vim Ada syntax file ++" Language: Ada (2005) ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Copyright: Copyright (C) 2006 Martin Krischik ++" Maintainer: Martin Krischik ++" David A. Wheeler ++" Simon Bradley ++" Contributors: Preben Randhol. ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL$ ++" http://www.dwheeler.com/vim ++" History: 24.05.2006 MK Unified Headers ++" 26.05.2006 MK ' should not be in iskeyword. ++" 16.07.2006 MK Ada-Mode as vim-ball ++" 02.10.2006 MK Better folding. ++" 15.10.2006 MK Bram's suggestion for runtime integration ++" 05.11.2006 MK Spell check for comments and strings only ++" 05.11.2006 MK Bram suggested to save on spaces ++" Help Page: help ft-ada-syntax ++"------------------------------------------------------------------------------ ++" The formal spec of Ada 2005 (ARM) is the "Ada 2005 Reference Manual". ++" For more Ada 2005 info, see http://www.gnuada.org and http://www.adapower.com. ++" ++" This vim syntax file works on vim 7.0 only and makes use of most of Voim 7.0 ++" advanced features. ++"------------------------------------------------------------------------------ ++ ++if exists("b:current_syntax") || version < 700 ++ finish ++endif ++ ++let b:current_syntax = "ada" ++ ++" Section: Ada is entirely case-insensitive. {{{1 ++" ++syntax case ignore ++setlocal nosmartcase ++setlocal ignorecase ++ ++" Section: Highlighting commands {{{1 ++" ++" There are 72 reserved words in total in Ada2005. Some keywords are ++" used in more than one way. For example: ++" 1. "end" is a general keyword, but "end if" ends a Conditional. ++" 2. "then" is a conditional, but "and then" is an operator. ++" ++for b:Item in g:ada#Keywords ++ " Standard Exceptions (including I/O). ++ " We'll highlight the standard exceptions, similar to vim's Python mode. ++ " It's possible to redefine the standard exceptions as something else, ++ " but doing so is very bad practice, so simply highlighting them makes sense. ++ if b:Item['kind'] == "x" ++ execute "syntax keyword adaException " . b:Item['word'] ++ endif ++ if b:Item['kind'] == "a" ++ execute 'syntax match adaAttribute "\V' . b:Item['word'] . '"' ++ endif ++ " We don't normally highlight types in package Standard ++ " (Integer, Character, Float, etc.). I don't think it looks good ++ " with the other type keywords, and many Ada programs define ++ " so many of their own types that it looks inconsistent. ++ " However, if you want this highlighting, turn on "ada_standard_types". ++ " For package Standard's definition, see ARM section A.1. ++ if b:Item['kind'] == "t" && exists ("g:ada_standard_types") ++ execute "syntax keyword adaBuiltinType " . b:Item['word'] ++ endif ++endfor ++ ++" Section: others {{{1 ++" ++syntax keyword adaLabel others ++ ++" Section: Operatoren {{{1 ++" ++syntax keyword adaOperator abs mod not rem xor ++syntax match adaOperator "\" ++syntax match adaOperator "\" ++syntax match adaOperator "\" ++syntax match adaOperator "\" ++syntax match adaOperator "[-+*/<>&]" ++syntax keyword adaOperator ** ++syntax match adaOperator "[/<>]=" ++syntax keyword adaOperator => ++syntax match adaOperator "\.\." ++syntax match adaOperator "=" ++ ++" Section: <> {{{1 ++" ++" Handle the box, <>, specially: ++" ++syntax keyword adaSpecial <> ++ ++" Section: rainbow color {{{1 ++" ++if exists("g:ada_rainbow_color") ++ syntax match adaSpecial "[:;.,]" ++ call rainbow_parenthsis#LoadRound () ++ call rainbow_parenthsis#Activate () ++else ++ syntax match adaSpecial "[:;().,]" ++endif ++ ++" Section: := {{{1 ++" ++" We won't map "adaAssignment" by default, but we need to map ":=" to ++" something or the "=" inside it will be mislabelled as an operator. ++" Note that in Ada, assignment (:=) is not considered an operator. ++" ++syntax match adaAssignment ":=" ++ ++" Section: Numbers, including floating point, exponents, and alternate bases. {{{1 ++" ++syntax match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" ++syntax match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" ++ ++" Section: Identify leading numeric signs {{{1 ++" ++" In "A-5" the "-" is an operator, " but in "A:=-5" the "-" is a sign. This ++" handles "A3+-5" (etc.) correctly. " This assumes that if you put a ++" don't put a space after +/- when it's used " as an operator, you won't ++" put a space before it either -- which is true " in code I've seen. ++" ++syntax match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 ++ ++" Section: Labels for the goto statement. {{{1 ++" ++syntax region adaLabel start="<<" end=">>" ++ ++" Section: Boolean Constants {{{1 ++" Boolean Constants. ++syntax keyword adaBoolean true false ++ ++" Section: Warn C/C++ {{{1 ++" ++" Warn people who try to use C/C++ notation erroneously: ++" ++syntax match adaError "//" ++syntax match adaError "/\*" ++syntax match adaError "==" ++ ++ ++" Section: Space Errors {{{1 ++" ++if exists("g:ada_space_errors") ++ if !exists("g:ada_no_trail_space_error") ++ syntax match adaSpaceError excludenl "\s\+$" ++ endif ++ if !exists("g:ada_no_tab_space_error") ++ syntax match adaSpaceError " \+\t"me=e-1 ++ endif ++ if !exists("g:ada_all_tab_usage") ++ syntax match adaSpecial "\t" ++ endif ++endif ++ ++" Section: end {{{1 ++" Unless special ("end loop", "end if", etc.), "end" marks the end of a ++" begin, package, task etc. Assiging it to adaEnd. ++syntax match adaEnd /\/ ++ ++syntax keyword adaPreproc pragma ++ ++syntax keyword adaRepeat exit for loop reverse while ++syntax match adaRepeat "\" ++ ++syntax keyword adaStatement accept delay goto raise requeue return ++syntax keyword adaStatement terminate ++syntax match adaStatement "\" ++ ++" Section: Handle Ada's record keywords. {{{1 ++" ++" 'record' usually starts a structure, but "with null record;" does not, ++" and 'end record;' ends a structure. The ordering here is critical - ++" 'record;' matches a "with null record", so make it a keyword (this can ++" match when the 'with' or 'null' is on a previous line). ++" We see the "end" in "end record" before the word record, so we match that ++" pattern as adaStructure (and it won't match the "record;" pattern). ++" ++syntax match adaStructure "\" contains=adaRecord ++syntax match adaStructure "\" contains=adaRecord ++syntax match adaKeyword "\" ++syntax match adaConditional "\" ++syntax match adaConditional "\" ++syntax match adaConditional "\" ++syntax match adaConditional "\" ++syntax match adaConditional "\" ++syntax keyword adaConditional if case select ++syntax keyword adaConditional elsif when ++ ++" Section: other keywords {{{1 ++syntax match adaKeyword "\" contains=adaRecord ++syntax keyword adaKeyword all do exception in new null out ++syntax keyword adaKeyword separate until overriding ++ ++" Section: begin keywords {{{1 ++" ++" These keywords begin various constructs, and you _might_ want to ++" highlight them differently. ++" ++syntax keyword adaBegin begin body declare entry generic ++syntax keyword adaBegin protected renames task ++ ++syntax match adaBegin "\" contains=adaFunction ++syntax match adaBegin "\" contains=adaProcedure ++syntax match adaBegin "\" contains=adaPackage ++ ++if exists("ada_with_gnat_project_files") ++ syntax keyword adaBegin project ++endif ++ ++" Section: with, use {{{1 ++" ++if exists("ada_withuse_ordinary") ++ " Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. ++ syntax keyword adaKeyword with use ++else ++ " Highlight "with" and "use" clauses like C's "#include" when they're used ++ " to reference other compilation units; otherwise they're ordinary keywords. ++ " If we have vim 6.0 or later, we'll use its advanced pattern-matching ++ " capabilities so that we won't match leading spaces. ++ syntax match adaKeyword "\" ++ syntax match adaKeyword "\" ++ syntax match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syntax match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syntax match adaInc "\" contained contains=NONE ++ syntax match adaInc "\" contained contains=NONE ++ syntax match adaInc "\" contained contains=NONE ++ " Recognize "with null record" as a keyword (even the "record"). ++ syntax match adaKeyword "\" ++ " Consider generic formal parameters of subprograms and packages as keywords. ++ syntax match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>" ++ syntax match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>" ++endif ++ ++" Section: String and character constants. {{{1 ++" ++syntax region adaString contains=@Spell start=+"+ skip=+""+ end=+"+ ++syntax match adaCharacter "'.'" ++ ++" Section: Todo (only highlighted in comments) {{{1 ++" ++syntax keyword adaTodo contained TODO FIXME XXX NOTE ++ ++" Section: Comments. {{{1 ++" ++syntax region adaComment ++ \ oneline ++ \ contains=adaTodo,adaLineError,@Spell ++ \ start="--" ++ \ end="$" ++ ++" Section: line errors {{{1 ++" ++" Note: Line errors have become quite slow with Vim 7.0 ++" ++if exists("g:ada_line_errors") ++ syntax match adaLineError "\(^.\{79}\)\@<=." contains=ALL containedin=ALL ++endif ++ ++" Section: syntax folding {{{1 ++" ++" Syntax folding is very tricky - for now I still suggest to use ++" indent folding ++" ++if exists("g:ada_folding") && g:ada_folding[0] == 's' ++ if stridx (g:ada_folding, 'p') >= 0 ++ syntax region adaPackage ++ \ start="\(\\|\\)\s*\z(\k*\)" ++ \ end="end\s\+\z1\s*;" ++ \ keepend extend transparent fold contains=ALL ++ endif ++ if stridx (g:ada_folding, 'f') >= 0 ++ syntax region adaProcedure ++ \ start="\\s*\z(\k*\)" ++ \ end="\\s\+\z1\s*;" ++ \ keepend extend transparent fold contains=ALL ++ syntax region adaFunction ++ \ start="\\s*\z(\k*\)" ++ \ end="end\s\+\z1\s*;" ++ \ keepend extend transparent fold contains=ALL ++ endif ++ if stridx (g:ada_folding, 'f') >= 0 ++ syntax region adaRecord ++ \ start="\" ++ \ end="\" ++ \ keepend extend transparent fold contains=ALL ++ endif ++endif ++ ++" Section: The default methods for highlighting. Can be overridden later. {{{1 ++" ++highlight def link adaCharacter Character ++highlight def link adaComment Comment ++highlight def link adaConditional Conditional ++highlight def link adaKeyword Keyword ++highlight def link adaLabel Label ++highlight def link adaNumber Number ++highlight def link adaSign Number ++highlight def link adaOperator Operator ++highlight def link adaPreproc PreProc ++highlight def link adaRepeat Repeat ++highlight def link adaSpecial Special ++highlight def link adaStatement Statement ++highlight def link adaString String ++highlight def link adaStructure Structure ++highlight def link adaTodo Todo ++highlight def link adaType Type ++highlight def link adaTypedef Typedef ++highlight def link adaStorageClass StorageClass ++highlight def link adaBoolean Boolean ++highlight def link adaException Exception ++highlight def link adaAttribute Tag ++highlight def link adaInc Include ++highlight def link adaError Error ++highlight def link adaSpaceError Error ++highlight def link adaLineError Error ++highlight def link adaBuiltinType Type ++highlight def link adaAssignment Special ++ ++" Subsection: Begin, End {{{2 ++" ++if exists ("ada_begin_preproc") ++ " This is the old default display: ++ highlight def link adaBegin PreProc ++ highlight def link adaEnd PreProc ++else ++ " This is the new default display: ++ highlight def link adaBegin Keyword ++ highlight def link adaEnd Keyword ++endif ++ ++ ++" Section: formatoptions {{{1 ++" ++setlocal formatoptions+=ron ++ ++" Section: sync {{{1 ++" ++" We don't need to look backwards to highlight correctly; ++" this speeds things up greatly. ++syntax sync minlines=1 maxlines=1 ++ ++finish " 1}}} ++ ++"------------------------------------------------------------------------------ ++" Copyright (C) 2006 Martin Krischik ++" ++" Vim is Charityware - see ":help license" or uganda.txt for licence details. ++"------------------------------------------------------------------------------ ++"vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab ++"vim: foldmethod=marker +diff -urN vim71/1/syntax/.svn/text-base/bush.vim.svn-base vim71_ada/1/syntax/.svn/text-base/bush.vim.svn-base +--- vim71/1/syntax/.svn/text-base/bush.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/1/syntax/.svn/text-base/bush.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,309 @@ ++" Vim syntax file ++" Language: BUSH / AdaScript ++" Maintainer: Ken O. Burtch ++" URL: http://www.pegasoft.ca/bush ++" Last Change: 2004-06-29 ++ ++" Former Maintainer: Simon Bradley ++" (was ) ++" Other contributors: Preben Randhol. ++" The formal spec of Ada95 (ARM) is the "Ada95 Reference Manual". ++" For more Ada95 info, see http://www.gnuada.org and http://www.adapower.com. ++ ++" This vim syntax file works on vim 5.6, 5.7, 5.8 and 6.x. ++" It implements Bram Moolenaar's April 25, 2001 recommendations to make ++" the syntax file maximally portable across different versions of vim. ++" If vim 6.0+ is available, ++" this syntax file takes advantage of the vim 6.0 advanced pattern-matching ++" functions to avoid highlighting uninteresting leading spaces in ++" some expressions containing "with" and "use". ++ ++" For version 5.x: Clear all syntax items ++" For version 6.x: Quit when a syntax file was already loaded ++if version < 600 ++ syntax clear ++elseif exists("b:current_syntax") ++ finish ++endif ++ ++" Ada is entirely case-insensitive. ++syn case ignore ++ ++" We don't need to look backwards to highlight correctly; ++" this speeds things up greatly. ++syn sync minlines=1 maxlines=1 ++ ++" Highlighting commands. There are 69 reserved words in total in Ada95. ++" Some keywords are used in more than one way. For example: ++" 1. "end" is a general keyword, but "end if" ends a Conditional. ++" 2. "then" is a conditional, but "and then" is an operator. ++ ++ ++" Standard Exceptions (including I/O). ++" We'll highlight the standard exceptions, similar to vim's Python mode. ++" It's possible to redefine the standard exceptions as something else, ++" but doing so is very bad practice, so simply highlighting them makes sense. ++syn keyword adaException Constraint_Error Program_Error Storage_Error ++syn keyword adaException Tasking_Error ++syn keyword adaException Status_Error Mode_Error Name_Error Use_Error ++syn keyword adaException Device_Error End_Error Data_Error Layout_Error ++syn keyword adaException Length_Error Pattern_Error Index_Error ++syn keyword adaException Translation_Error ++syn keyword adaException Time_Error Argument_Error ++syn keyword adaException Tag_Error ++syn keyword adaException Picture_Error ++" Interfaces ++syn keyword adaException Terminator_Error Conversion_Error ++syn keyword adaException Pointer_Error Dereference_Error Update_Error ++" This isn't in the Ada spec, but a GNAT extension. ++syn keyword adaException Assert_Failure ++" We don't list ALL exceptions defined in particular compilers (e.g., GNAT), ++" because it's quite reasonable to define those phrases as non-exceptions. ++ ++ ++" We don't normally highlight types in package Standard ++" (Integer, Character, Float, etc.). I don't think it looks good ++" with the other type keywords, and many Ada programs define ++" so many of their own types that it looks inconsistent. ++" However, if you want this highlighting, turn on "ada_standard_types". ++" For package Standard's definition, see ARM section A.1. ++ ++if exists("ada_standard_types") ++ syn keyword adaBuiltinType Boolean Integer Natural Positive Float ++ syn keyword adaBuiltinType Character Wide_Character ++ syn keyword adaBuiltinType String Wide_String ++ syn keyword adaBuiltinType Duration ++ " These aren't listed in ARM section A.1's code, but they're noted as ++ " options in ARM sections 3.5.4 and 3.5.7: ++ syn keyword adaBuiltinType Short_Integer Short_Short_Integer ++ syn keyword adaBuiltinType Long_Integer Long_Long_Integer ++ syn keyword adaBuiltinType Short_Float Short_Short_Float ++ syn keyword adaBuiltinType Long_Float Long_Long_Float ++ " BUSH-specific types ++ syn keyword adaBuiltinType command ++ syn keyword adaBuiltinType socket_type ++ syn keyword adaBuiltinType unbounded_string ++ syn keyword adaBuiltinType universal_typeless ++ syn keyword adaBuiltinType universal_string ++ syn keyword adaBuiltinType universal_numeric ++endif ++ ++" There are MANY other predefined types; they've not been added, because ++" determining when they're a type requires context in general. ++" One potential addition would be Unbounded_String. ++ ++ ++syn keyword adaLabel others ++ ++syn keyword adaOperator abs mod not rem xor ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "[-+*/<>&]" ++syn keyword adaOperator ** ++syn match adaOperator "[/<>]=" ++syn keyword adaOperator => ++syn match adaOperator "\.\." ++syn match adaOperator "=" ++ ++" We won't map "adaAssignment" by default, but we need to map ":=" to ++" something or the "=" inside it will be mislabelled as an operator. ++" Note that in Ada, assignment (:=) is not considered an operator. ++syn match adaAssignment ":=" ++ ++" Handle the box, <>, specially: ++syn keyword adaSpecial <> ++ ++" Numbers, including floating point, exponents, and alternate bases. ++syn match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" ++syn match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" ++ ++" Identify leading numeric signs. In "A-5" the "-" is an operator, ++" but in "A:=-5" the "-" is a sign. This handles "A3+-5" (etc.) correctly. ++" This assumes that if you put a don't put a space after +/- when it's used ++" as an operator, you won't put a space before it either -- which is true ++" in code I've seen. ++syn match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 ++ ++" Labels for the goto statement. ++syn region adaLabel start="<<" end=">>" ++ ++" Boolean Constants. ++syn keyword adaBoolean true false ++ ++" Warn people who try to use C/C++ notation erroneously: ++syn match adaError "//" ++syn match adaError "/\*" ++syn match adaError "==" ++ ++ ++if exists("ada_space_errors") ++ if !exists("ada_no_trail_space_error") ++ syn match adaSpaceError excludenl "\s\+$" ++ endif ++ if !exists("ada_no_tab_space_error") ++ syn match adaSpaceError " \+\t"me=e-1 ++ endif ++endif ++ ++" Unless special ("end loop", "end if", etc.), "end" marks the end of a ++" begin, package, task etc. Assiging it to adaEnd. ++syn match adaEnd "\" ++ ++syn keyword adaPreproc pragma ++ ++syn keyword adaRepeat exit for loop reverse while ++syn match adaRepeat "\" ++ ++syn keyword adaStatement accept delay goto raise requeue return ++syn keyword adaStatement terminate ++" BUSH-specific statements ++syn keyword adaStatement cd ++syn keyword adaStatement clear ++syn keyword adaStatement env ++syn keyword adaStatement inkey ++syn keyword adaStatement jobs ++syn keyword adaStatement logout ++syn keyword adaStatement pwd ++syn keyword adaStatement step ++syn keyword adaStatement trace ++syn keyword adaStatement typeset ++syn keyword adaStatement unset ++syn keyword adaStatement wait ++syn keyword adaStatement history ++syn keyword adaStatement "?" ++syn match adaStatement "\" ++ ++" Handle Ada's record keywords. ++" 'record' usually starts a structure, but "with null record;" does not, ++" and 'end record;' ends a structure. The ordering here is critical - ++" 'record;' matches a "with null record", so make it a keyword (this can ++" match when the 'with' or 'null' is on a previous line). ++" We see the "end" in "end record" before the word record, so we match that ++" pattern as adaStructure (and it won't match the "record;" pattern). ++syn match adaStructure "\" ++syn match adaStructure "\" ++syn match adaKeyword "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn keyword adaConditional if case select ++syn keyword adaConditional elsif when ++ ++syn keyword adaKeyword all do exception in is new null out ++syn keyword adaKeyword separate until ++ ++" These keywords begin various constructs, and you _might_ want to ++" highlight them differently. ++syn keyword adaBegin begin body declare entry function generic ++syn keyword adaBegin package procedure protected renames task ++ ++ ++if exists("ada_withuse_ordinary") ++" Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. ++ syn keyword adaKeyword with use ++else ++ " Highlight "with" and "use" clauses like C's "#include" when they're used ++ " to reference other compilation units; otherwise they're ordinary keywords. ++ " If we have vim 6.0 or later, we'll use its advanced pattern-matching ++ " capabilities so that we won't match leading spaces. ++ syn match adaKeyword "\" ++ syn match adaKeyword "\" ++ if version < 600 ++ syn match adaBeginWith "^\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syn match adaSemiWith ";\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>"lc=1 contains=adaInc ++ else ++ syn match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syn match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ endif ++ syn match adaInc "\" contained contains=NONE ++ syn match adaInc "\" contained contains=NONE ++ syn match adaInc "\" contained contains=NONE ++ " Recognize "with null record" as a keyword (even the "record"). ++ syn match adaKeyword "\" ++ " Consider generic formal parameters of subprograms and packages as keywords. ++ if version < 600 ++ syn match adaKeyword ";\s*with\s\+\(function\|procedure\|package\)\>" ++ syn match adaKeyword "^\s*with\s\+\(function\|procedure\|package\)\>" ++ else ++ syn match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>" ++ syn match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>" ++ endif ++endif ++ ++ ++" String and character constants. ++syn region adaString start=+"+ skip=+""+ end=+"+ ++syn match adaCharacter "'.'" ++ ++" Todo (only highlighted in comments) ++syn keyword adaTodo contained TODO FIXME XXX ++ ++" Comments. ++syn region adaComment oneline contains=adaTodo start="--" end="$" ++ ++ ++ ++" Define the default highlighting. ++" For version 5.7 and earlier: only when not done already ++" For version 5.8 and later: only when an item doesn't have highlighting yet ++if version >= 508 || !exists("did_ada_syn_inits") ++ if version < 508 ++ let did_ada_syn_inits = 1 ++ command -nargs=+ HiLink hi link ++ else ++ command -nargs=+ HiLink hi def link ++ endif ++ ++ " The default methods for highlighting. Can be overridden later. ++ HiLink adaCharacter Character ++ HiLink adaComment Comment ++ HiLink adaConditional Conditional ++ HiLink adaKeyword Keyword ++ HiLink adaLabel Label ++ HiLink adaNumber Number ++ HiLink adaSign Number ++ HiLink adaOperator Operator ++ HiLink adaPreproc PreProc ++ HiLink adaRepeat Repeat ++ HiLink adaSpecial Special ++ HiLink adaStatement Statement ++ HiLink adaString String ++ HiLink adaStructure Structure ++ HiLink adaTodo Todo ++ HiLink adaType Type ++ HiLink adaTypedef Typedef ++ HiLink adaStorageClass StorageClass ++ HiLink adaBoolean Boolean ++ HiLink adaException Exception ++ HiLink adaInc Include ++ HiLink adaError Error ++ HiLink adaSpaceError Error ++ HiLink adaBuiltinType Type ++ ++ if exists("ada_begin_preproc") ++ " This is the old default display: ++ HiLink adaBegin PreProc ++ HiLink adaEnd PreProc ++ else ++ " This is the new default display: ++ HiLink adaBegin Keyword ++ HiLink adaEnd Keyword ++ endif ++ ++ delcommand HiLink ++endif ++ ++let b:current_syntax = "ada" ++ ++" vim: ts=8 +diff -urN vim71/runtime/autoload/adacomplete.vim vim71_ada/runtime/autoload/adacomplete.vim +--- vim71/runtime/autoload/adacomplete.vim 2007-05-05 19:34:16.000000000 +0200 ++++ vim71_ada/runtime/autoload/adacomplete.vim 2008-01-16 16:46:40.000000000 +0100 +@@ -1,13 +1,13 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada omnicompletion file + " Language: Ada (2005) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ + " Maintainer: Martin Krischik +-" $Author: karsten $ +-" $Date: 2008/01/16 15:58:14 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ + " History: 24.05.2006 MK Unified Headers + " 26.05.2006 MK improved search for begin of word. + " 16.07.2006 MK Ada-Mode as vim-ball +diff -urN vim71/runtime/autoload/ada.vim vim71_ada/runtime/autoload/ada.vim +--- vim71/runtime/autoload/ada.vim 2007-05-05 20:02:22.000000000 +0200 ++++ vim71_ada/runtime/autoload/ada.vim 2008-01-16 16:46:40.000000000 +0100 +@@ -1,14 +1,16 @@ + "------------------------------------------------------------------------------ + " Description: Perform Ada specific completion & tagging. + " Language: Ada (2005) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ +-" Maintainer: Martin Krischik ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Maintainer: Martin Krischik ++" Taylor Venable + " Neil Bird +-" $Author: karsten $ +-" $Date: 2008/01/16 15:58:14 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ + " History: 24.05.2006 MK Unified Headers + " 26.05.2006 MK ' should not be in iskeyword. + " 16.07.2006 MK Ada-Mode as vim-ball +@@ -17,6 +19,10 @@ + " 05.11.2006 MK Bram suggested not to use include protection for + " autoload + " 05.11.2006 MK Bram suggested to save on spaces ++" 08.07.2007 TV fix mapleader problems. ++" 09.05.2007 MK Session just won't work no matter how much ++" tweaking is done ++" 19.09.2007 NO still some mapleader problems + " Help Page: ft-ada-functions + "------------------------------------------------------------------------------ + +@@ -425,7 +431,15 @@ + execute '!ctags --excmd=number ' . l:Filename + endfunction ada#Create_Tags + +-function ada#Switch_Session (New_Session) "{{{1 ++" Section: ada#Switch_Session {{{1 ++" ++function ada#Switch_Session (New_Session) ++ " ++ " you should not save to much date into the seession since they will ++ " be sourced ++ " ++ set sessionoptions=buffers,curdir,folds,globals,resize,slash,tabpages,tabpages,unix,winpos,winsize ++ + if a:New_Session != v:this_session + " + " We actualy got a new session - otherwise there +@@ -437,18 +451,23 @@ + + let v:this_session = a:New_Session + +- if filereadable (v:this_session) +- execute 'source ' . v:this_session +- endif ++ "if filereadable (v:this_session) ++ "execute 'source ' . v:this_session ++ "endif + + augroup ada_session + autocmd! + autocmd VimLeavePre * execute 'mksession! ' . v:this_session + augroup END ++ " ++ "if exists ("g:Tlist_Auto_Open") && g:Tlist_Auto_Open ++ "TlistOpen ++ "endif ++ + endif + + return +-endfunction ada#Switch_Session "}}}1 ++endfunction ada#Switch_Session + + " Section: GNAT Pretty Printer folding {{{1 + " +@@ -546,18 +565,23 @@ + \ a:Keys . + \" :" . a:Command . "" + else ++ if exists("g:mapleader") ++ let l:leader = g:mapleader ++ else ++ let l:leader = '\' ++ endif + execute + \ "50amenu " . + \ "Ada." . escape(a:Text, ' ') . +- \ "" . escape(g:mapleader . "a" . a:Keys , '\') . ++ \ "" . escape(l:leader . "a" . a:Keys , '\') . + \ " :" . a:Command . "" + execute + \ "nnoremap " . +- \ escape(g:mapleader . "a" . a:Keys , '\') . ++ \ escape(l:leader . "a" . a:Keys , '\') . + \" :" . a:Command + execute + \ "inoremap " . +- \ escape(g:mapleader . "a" . a:Keys , '\') . ++ \ escape(l:leader . "a" . a:Keys , '\') . + \" :" . a:Command + endif + return +@@ -566,10 +590,15 @@ + " Section: ada#Map_Popup {{{2 + " + function ada#Map_Popup (Text, Keys, Command) ++ if exists("g:mapleader") ++ let l:leader = g:mapleader ++ else ++ let l:leader = '\' ++ endif + execute + \ "50amenu " . + \ "PopUp." . escape(a:Text, ' ') . +- \ "" . escape(g:mapleader . "a" . a:Keys , '\') . ++ \ "" . escape(l:leader . "a" . a:Keys , '\') . + \ " :" . a:Command . "" + + call ada#Map_Menu (a:Text, a:Keys, a:Command) +diff -urN vim71/runtime/autoload/decada.vim vim71_ada/runtime/autoload/decada.vim +--- vim71/runtime/autoload/decada.vim 2007-05-05 19:25:32.000000000 +0200 ++++ vim71_ada/runtime/autoload/decada.vim 2008-01-16 16:46:41.000000000 +0100 +@@ -1,14 +1,14 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada/Dec Ada compiler file + " Language: Ada (Dec Ada) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik +-" Maintainer: Martin Krischik +-" $Author: karsten $ +-" $Date: 2008/01/16 15:58:14 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ + " History: 21.07.2006 MK New Dec Ada + " 15.10.2006 MK Bram's suggestion for runtime integration + " 05.11.2006 MK Bram suggested not to use include protection for +@@ -45,7 +45,7 @@ + call ada#Switch_Session (a:1) + elseif argc() == 0 && strlen (v:servername) > 0 + call ada#Switch_Session ( +- \ expand('~')[0:-2] . ".vimfiles.session]" . ++ \ expand('~')[0:-2] . ".vimfiles.session]decada_" . + \ v:servername . ".vim") + endif + return +diff -urN vim71/runtime/autoload/gnat.vim vim71_ada/runtime/autoload/gnat.vim +--- vim71/runtime/autoload/gnat.vim 2007-05-05 20:18:20.000000000 +0200 ++++ vim71_ada/runtime/autoload/gnat.vim 2008-01-16 16:46:46.000000000 +0100 +@@ -1,14 +1,15 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada/GNAT compiler file + " Language: Ada (GNAT) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik +-" Maintainer: Martin Krischik +-" $Author: karsten $ +-" $Date: 2008/01/16 15:58:14 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ ++" Maintainer: Martin Krischi k ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ + " History: 24.05.2006 MK Unified Headers + " 16.07.2006 MK Ada-Mode as vim-ball + " 05.08.2006 MK Add session support +@@ -16,6 +17,7 @@ + " 05.11.2006 MK Bram suggested not to use include protection for + " autoload + " 05.11.2006 MK Bram suggested to save on spaces ++" 19.09.2007 NO use project file only when there is a project + " Help Page: compiler-gnat + "------------------------------------------------------------------------------ + +@@ -71,13 +73,19 @@ + execute 'mksession! ' . v:this_session + endif + +- if strlen (self.Project_File) > 0 +- call ada#Switch_Session ( +- \ expand('~') . "/vimfiles/session/" . +- \ fnamemodify (self.Project_File, ":t:r") . ".vim") +- else +- call ada#Switch_Session ('') +- endif ++ "if strlen (self.Project_File) > 0 ++ "if has("vms") ++ "call ada#Switch_Session ( ++ "\ expand('~')[0:-2] . ".vimfiles.session]gnat_" . ++ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") ++ "else ++ "call ada#Switch_Session ( ++ "\ expand('~') . "/vimfiles/session/gnat_" . ++ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") ++ "endif ++ "else ++ "call ada#Switch_Session ('') ++ "endif + + return + endfunction gnat#Set_Project_File " }}}1 +diff -urN vim71/runtime/compiler/decada.vim vim71_ada/runtime/compiler/decada.vim +--- vim71/runtime/compiler/decada.vim 2007-05-05 20:09:54.000000000 +0200 ++++ vim71_ada/runtime/compiler/decada.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -1,16 +1,17 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada/Dec Ada compiler file + " Language: Ada (Dec Ada) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik +-" Maintainer: Martin Krischik +-" $Author: karsten $ +-" $Date: 2008/01/16 15:58:14 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ + " History: 21.07.2006 MK New Dec Ada + " 15.10.2006 MK Bram's suggestion for runtime integration ++" 08.09.2006 MK Correct double load protection. + " Help Page: compiler-decada + "------------------------------------------------------------------------------ + +@@ -24,6 +25,13 @@ + + if !exists("g:decada") + let g:decada = decada#New () ++ ++ call ada#Map_Menu ( ++ \'Dec Ada.Build', ++ \'', ++ \'call decada.Make ()') ++ ++ call g:decada.Set_Session () + endif + + if exists(":CompilerSet") != 2 +@@ -33,16 +41,9 @@ + command -nargs=* CompilerSet setlocal + endif + +-call g:decada.Set_Session () +- + execute "CompilerSet makeprg=" . escape (g:decada.Make_Command, ' ') + execute "CompilerSet errorformat=" . escape (g:decada.Error_Format, ' ') + +-call ada#Map_Menu ( +- \'Dec Ada.Build', +- \'', +- \'call decada.Make ()') +- + finish " 1}}} + + "------------------------------------------------------------------------------ +diff -urN vim71/runtime/compiler/gnat.vim vim71_ada/runtime/compiler/gnat.vim +--- vim71/runtime/compiler/gnat.vim 2007-05-05 20:04:19.000000000 +0200 ++++ vim71_ada/runtime/compiler/gnat.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -1,17 +1,19 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada/GNAT compiler file + " Language: Ada (GNAT) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik +-" Maintainer: Martin Krischik +-" $Author: karsten $ +-" $Date: 2008/01/16 15:58:14 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ ++" Maintainer: Martin Krischi k ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ + " History: 24.05.2006 MK Unified Headers + " 16.07.2006 MK Ada-Mode as vim-ball + " 15.10.2006 MK Bram's suggestion for runtime integration ++" 19.09.2007 NO use project file only when there is a project + " Help Page: compiler-gnat + "------------------------------------------------------------------------------ + +@@ -46,6 +48,8 @@ + \ 'GNAT.Set Projectfile\.\.\.', + \ ':SetProject', + \ 'call gnat.Set_Project_File ()') ++ ++ call g:gnat.Set_Session () + endif + + if exists(":CompilerSet") != 2 +@@ -55,8 +59,6 @@ + command -nargs=* CompilerSet setlocal + endif + +-call g:gnat.Set_Session () +- + execute "CompilerSet makeprg=" . escape (g:gnat.Get_Command('Make'), ' ') + execute "CompilerSet errorformat=" . escape (g:gnat.Error_Format, ' ') + +diff -urN vim71/runtime/doc/ft_ada.txt vim71_ada/runtime/doc/ft_ada.txt +--- vim71/runtime/doc/ft_ada.txt 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/doc/ft_ada.txt 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,516 @@ ++*ft_ada.txt* Ada File type Plug-ins Last change: 2007 Seb 17 ++ ++ ++ ADA FILE TYPE PLUG-INS REFERENCE MANUAL~ ++ ++ADA *ada.vim* ++ ++1. Syntax Highlighting |ft-ada-syntax| ++2. Plug-in |ft-ada-plugin| ++3. Omni Completion |ft-ada-omni| ++ 3.1 Omni Completion with "gnat xref" |gnat-xref| ++ 3.2 Omni Completion with "ctags" |ada-ctags| ++4. Compiler Support |ada-compiler| ++ 4.1 GNAT |compiler-gnat| ++ 4.1 Dec Ada |compiler-decada| ++5. References |ada-reference| ++ 5.1 Options |ft-ada-options| ++ 5.2 Functions |ft-ada-functions| ++ 5.3 Commands |ft-ada-commands| ++ 5.4 Variables |ft-ada-variables| ++ 5.5 Constants |ft-ada-contstants| ++8. Extra Plug-ins |ada-extra-plugins| ++ ++============================================================================== ++1. Syntax Highlighting ~ ++ *ft-ada-syntax* ++ ++This mode is designed for the 2005 edition of Ada ("Ada 2005"), which includes ++support for objected-programming, protected types, and so on. It handles code ++written for the original Ada language ("Ada83", "Ada87", "Ada95") as well, ++though code which uses Ada 2005-only keywords will be wrongly colored (such ++code should be fixed anyway). For more information about Ada, see ++http://www.adapower.com. ++ ++The Ada mode handles a number of situations cleanly. ++ ++For example, it knows that the "-" in "-5" is a number, but the same character ++in "A-5" is an operator. Normally, a "with" or "use" clause referencing ++another compilation unit is coloured the same way as C's "#include" is coloured. ++If you have "Conditional" or "Repeat" groups coloured differently, then "end ++if" and "end loop" will be coloured as part of those respective groups. ++ ++You can set these to different colours using vim's "highlight" command (e.g., ++to change how loops are displayed, enter the command ":hi Repeat" followed by ++the colour specification; on simple terminals the colour specification ++ctermfg=White often shows well). ++ ++There are several options you can select in this Ada mode. See|ft-ada-options| ++for a complete list. ++ ++To enable them, assign a value to the option. For example, to turn one on: ++ > ++ > let g:ada_standard_types = 1 ++> ++To disable them use ":unlet". Example: ++> ++ > unlet g:ada_standard_types ++ ++You can just use ":" and type these into the command line to set these ++temporarily before loading an Ada file. You can make these option settings ++permanent by adding the "let" command(s), without a colon, to your "~/.vimrc" ++file. ++ ++Even on a slow (90Mhz) PC this mode works quickly, but if you find the ++performance unacceptable, turn on |g:ada_withuse_ordinary|. ++ ++Syntax folding instructions (|fold-syntax|) are added when |g:ada_folding| is ++set. ++ ++============================================================================== ++2. File type Plug-in ~ ++ *ft-ada-indent* *ft-ada-plugin* ++ ++The Ada plug-in provides support for: ++ ++ - auto indenting (|indent.txt|) ++ - insert completion (|i_CTRL-N|) ++ - user completion (|i_CTRL-X_CTRL-U|) ++ - tag searches (|tagsrch.txt|) ++ - Quick Fix (|quickfix.txt|) ++ - backspace handling (|'backspace'|) ++ - comment handling (|'comments'|, |'commentstring'|) ++ ++The plug-in only activates the features of the Ada mode whenever an Ada ++files is opened and add adds Ada related entries to the main and pop-up menu. ++ ++============================================================================== ++3. Omni Completion ~ ++ *ft-ada-omni* ++ ++The Ada omni-completions (|i_CTRL-X_CTRL-O|) uses tags database created either ++by "gnat xref -v" or the "exuberant Ctags (http://ctags.sourceforge.net). The ++complete function will automatically detect which tool was used to create the ++tags file. ++ ++------------------------------------------------------------------------------ ++3.1 Omni Completion with "gnat xref" ~ ++ *gnat-xref* ++ ++GNAT XREF uses the compiler internal information (ali-files) to produce the ++tags file. This has the advantage to be 100% correct and the option of deep ++nested analysis. However the code must compile, the generator is quite ++slow and the created tags file contains only the basic Ctags information for ++each entry - not enough for some of the more advanced Vim code browser ++plug-ins. ++ ++NOTE: "gnat xref -v" is very tricky to use as it has almost no diagnostic ++ output - If nothing is printed then usually the parameters are wrong. ++ Here some important tips: ++ ++1) You need to compile your code first and use the "-aO" option to point to ++ your .ali files. ++2) "gnat xref -v ../Include/adacl.ads" won't work - use the "gnat xref -v ++ -aI../Include adacl.ads" instead. ++3) "gnat xref -v -aI../Include *.ad?" won't work - use "cd ../Include" and ++ then "gnat xref -v *.ad?" ++4) Project manager support is completely broken - don't even try "gnat xref ++ -Padacl.gpr". ++5) VIM is faster when the tags file is sorted - use "sort --unique ++ --ignore-case --output=tags tags" . ++6) Remember to insert "!_TAG_FILE_SORTED 2 %sort ui" as first line to mark ++ the file assorted. ++ ++------------------------------------------------------------------------------ ++3.2 Omni Completion with "ctags"~ ++ *ada-ctags* ++ ++Exuberant Ctags uses it's own multi-language code parser. The parser is quite ++fast, produces a lot of extra informations (hence the name "Exuberant Ctags") ++and can run on files which currently do not compile. ++ ++There are also lots of other Vim-tools which use exuberant Ctags. ++ ++You will need to install a version of the Exuberant Ctags which has Ada ++support patched in. Such a version is available from the GNU Ada Project ++(http://gnuada.sourceforge.net). ++ ++The Ada parser for Exuberant Ctags is fairly new - don't expect complete ++support yet. ++ ++============================================================================== ++4. Compiler Support ~ ++ *ada-compiler* ++ ++The Ada mode supports more then one Ada compiler and will automatically load the ++compiler set in|g:ada_default_compiler|whenever an Ada source is opened. The ++provided compiler plug-ins are split into the actual compiler plug-in and a ++collection of support functions and variables. This allows the easy ++development of specialized compiler plug-ins fine tuned to your development ++environment. ++ ++------------------------------------------------------------------------------ ++4.1 GNAT ~ ++ *compiler-gnat* ++ ++GNAT is the only free (beer and speech) Ada compiler available. There are ++several version available which differentiate in the licence terms used. ++ ++The GNAT compiler plug-in will perform a compile on pressing and then ++immediately shows the result. You can set the project file to be used by ++setting: ++ > ++ > call g:gnat.Set_Project_File ('my_project.gpr') ++ ++Setting a project file will also create a Vim session (|views-sessions|) so - ++like with the GPS - opened files, window positions etc. will remembered ++separately for all projects. ++ ++ *gnat_members* ++GNAT OBJECT ~ ++ ++ *g:gnat.Make()* ++g:gnat.Make() ++ Calls|g:gnat.Make_Command|and displays the result inside a ++ |quickfix| window. ++ ++ *g:gnat.Pretty()* ++g:gnat.Pretty() ++ Calls|g:gnat.Pretty_Command| ++ ++ *g:gnat.Find()* ++g:gnat.Find() ++ Calls|g:gnat.Find_Command| ++ ++ *g:gnat.Tags()* ++g:gnat.Tags() ++ Calls|g:gnat.Tags_Command| ++ ++ *g:gnat.Set_Project_File()* ++g:gnat.Set_Project_File([{file}]) ++ Set gnat project file and load associated session. An open ++ project will be closed and the session written. If called ++ without file name the file selector opens for selection of a ++ project file. If called with an empty string then the project ++ and associated session are closed. ++ ++ *g:gnat.Project_File* ++g:gnat.Project_File string ++ Current project file. ++ ++ *g:gnat.Make_Command* ++g:gnat.Make_Command string ++ External command used for|g:gnat.Make()| (|'makeprg'|). ++ ++ *g:gnat.Pretty_Program* ++g:gnat.Pretty_Program string ++ External command used for|g:gnat.Pretty()| ++ ++ *g:gnat.Find_Program* ++g:gnat.Find_Program string ++ External command used for|g:gnat.Find()| ++ ++ *g:gnat.Tags_Command* ++g:gnat.Tags_Command string ++ External command used for|g:gnat.Tags()| ++ ++ *g:gnat.Error_Format* ++g:gnat.Error_Format string ++ Error format (|'errorformat'|) ++ ++------------------------------------------------------------------------------ ++4.2 Dec Ada ~ ++ *compiler-hpada* *compiler-decada* ++ *compiler-vaxada* *compiler-compaqada* ++ ++Dec Ada (also known by - in chronological order - VAX Ada, Dec Ada, Compaq Ada ++and HP Ada) is a fairly dated Ada 83 compiler. Support is basic: will ++compile the current unit. ++ ++The Dec Ada compiler expects the package name and not the file name to be ++passed a parameter. The compiler plug-in supports the usual file name ++convention to convert the file into a unit name. For separates both '-' and ++'__' are allowed. ++ ++ *decada_members* ++DEC ADA OBJECT ~ ++ ++ *g:decada.Make()* ++g:decada.Make() function ++ Calls|g:decada.Make_Command|and displays the result inside a ++ |quickfix| window. ++ ++ *g:decada.Unit_Name()* ++g:decada.Unit_Name() function ++ Get the Unit name for the current file. ++ ++ *g:decada.Make_Command* ++g:decada.Make_Command string ++ External command used for|g:decadat.Make()| (|'makeprg'|). ++ ++ *g:decada.Error_Format* ++g:decada.Error_Format| string ++ Error format (|'errorformat'|). ++ ++============================================================================== ++5. References ~ ++ *ada-reference* ++ ++------------------------------------------------------------------------------ ++5.1 Options ~ ++ *ft-ada-options* ++ ++ *g:ada_standard_types* ++g:ada_standard_types bool (true when exists) ++ Highlight types in package Standard (e.g., "Float") ++ ++ *g:ada_space_errors* ++ *g:ada_no_trail_space_error* ++ *g:ada_no_tab_space_error* ++ *g:ada_all_tab_usage* ++g:ada_space_errors bool (true when exists) ++ Highlight extraneous errors in spaces ... ++ g:ada_no_trail_space_error ++ - but ignore trailing spaces at the end of a line ++ g:ada_no_tab_space_error ++ - but ignore tabs after spaces ++ g:ada_all_tab_usage ++ - highlight all tab use ++ ++ *g:ada_line_errors* ++g:ada_line_errors bool (true when exists) ++ Highlight lines which are to long. Note: This highlighting ++ option is quite CPU intensive. ++ ++ *g:ada_rainbow_color* ++g:ada_rainbow_color bool (true when exists) ++ Use rainbow colours for '(' and ')'. You need the ++ rainbow_parenthesis for this to work ++ ++ *g:ada_folding* ++g:ada_folding set ('sigpft') ++ Use folding for Ada sources. ++ 's': activate syntax folding on load ++ 'p': fold packages ++ 'f': fold functions and procedures ++ 't': fold types ++ 'c': fold conditionals ++ 'g': activate gnat pretty print folding on load ++ 'i': lone 'is' folded with line above ++ 'b': lone 'begin' folded with line above ++ 'p': lone 'private' folded with line above ++ 'x': lone 'exception' folded with line above ++ 'i': activate indent folding on load ++ ++ Note: Syntax folding is in an early (unuseable) stage and ++ indent or gnat pretty folding is suggested. ++ ++ For gnat pretty folding to work the following settings are ++ suggested: -cl3 -M79 -c2 -c3 -c4 -A1 -A2 -A3 -A4 -A5 ++ ++ For indent folding to work the following settings are ++ suggested: shiftwidth=3 softtabstop=3 ++ ++ *g:ada_abbrev* ++g:ada_abbrev bool (true when exists) ++ Add some abbreviations. This feature more or less superseded ++ by the various completion methods. ++ ++ *g:ada_withuse_ordinary* ++g:ada_withuse_ordinary bool (true when exists) ++ Show "with" and "use" as ordinary keywords (when used to ++ reference other compilation units they're normally highlighted ++ specially). ++ ++ *g:ada_begin_preproc* ++g:ada_begin_preproc bool (true when exists) ++ Show all begin-like keywords using the colouring of C ++ preprocessor commands. ++ ++ *g:ada_omni_with_keywords* ++g:ada_omni_with_keywords ++ Add Keywords, Pragmas, Attributes to omni-completions ++ (|compl-omni|). Note: You can always complete then with user ++ completion (|i_CTRL-X_CTRL-U|). ++ ++ *g:ada_extended_tagging* ++g:ada_extended_tagging enum ('jump', 'list') ++ use extended tagging, two options are available ++ 'jump': use tjump to jump. ++ 'list': add tags quick fix list. ++ Normal tagging does not support function or operator ++ overloading as these features are not available in C and ++ tagging was originally developed for C. ++ ++ *g:ada_extended_completion* ++g:ada_extended_completion ++ Uses extended completion for and completions ++ (|i_CTRL-N|). In this mode the '.' is used as part of the ++ identifier so that 'Object.Method' or 'Package.Procedure' are ++ completed together. ++ ++ *g:ada_gnat_extensions* ++g:ada_gnat_extensions bool (true when exists) ++ Support GNAT extensions. ++ ++ *g:ada_with_gnat_project_files* ++g:ada_with_gnat_project_files bool (true when exists) ++ Add gnat project file keywords and Attributes. ++ ++ *g:ada_default_compiler* ++g:ada_default_compiler string ++ set default compiler. Currently supported is 'gnat' and ++ 'decada'. ++ ++An "exists" type is a boolean is considered true when the variable is defined ++and false when the variable is undefined. The value which the variable is ++set makes no difference. ++ ++------------------------------------------------------------------------------ ++5.3 Commands ~ ++ *ft-ada-commands* ++ ++:AdaRainbow *:AdaRainbow* ++ Toggles rainbow colour (|g:ada_rainbow_color|) mode for ++ '(' and ')' ++ ++:AdaLines *:AdaLines* ++ Toggles line error (|g:ada_line_errors|) display ++ ++:AdaSpaces *:AdaSpaces* ++ Toggles space error (|g:ada_space_errors|) display. ++ ++:AdaTagDir *:AdaTagDir* ++ Creates tags file for the directory of the current file. ++ ++:AdaTagFile *:AdaTagFile* ++ Creates tags file for the current file. ++ ++:AdaTypes *:AdaTypes* ++ Toggles standard types (|g:ada_standard_types|) colour. ++ ++:GnatFind *:GnatFind* ++ Calls |g:gnat.Find()| ++ ++:GnatPretty *:GnatPretty* ++ Calls |g:gnat.Pretty()| ++ ++:GnatTags *:GnatTags* ++ Calls |g:gnat.Tags()| ++ ++------------------------------------------------------------------------------ ++5.3 Variables ~ ++ *ft-ada-variables* ++ ++ *g:gnat* ++g:gnat object ++ Control object which manages GNAT compiles. The object ++ is created when the first Ada source code is loaded provided ++ that |g:ada_default_compiler|is set to 'gnat'. See|gnat_members| ++ for details. ++ ++ *g:decada* ++g:decada object ++ Control object which manages Dec Ada compiles. The object ++ is created when the first Ada source code is loaded provided ++ that |g:ada_default_compiler|is set to 'decada'. See ++ |decada_members|for details. ++ ++------------------------------------------------------------------------------ ++5.4 Constants ~ ++ *ft-ada-constants* ++ ft-ada-constants ++ ++All constants are locked. See |:lockvar| for details. ++ ++ *g:ada#WordRegex* ++g:ada#WordRegex string ++ Regular expression to search for Ada words ++ ++ *g:ada#DotWordRegex* ++g:ada#DotWordRegex string ++ Regular expression to search for Ada words separated by dots. ++ ++ *g:ada#Comment* ++g:ada#Comment string ++ Regular expression to search for Ada comments ++ ++ *g:ada#Keywords* ++g:ada#Keywords list of dictionaries ++ List of keywords, attributes etc. pp. in the format used by ++ omni completion. See |complete-items| for details. ++ ++ *g:ada#Ctags_Kinds* ++g:ada#Ctags_Kinds dictionary of lists ++ Dictionary of the various kinds of items which the Ada support ++ for Ctags generates. ++ ++------------------------------------------------------------------------------ ++5.2 Functions ~ ++ *ft-ada-functions* ++ ++ada#Word([{line}, {col}]) *ada#Word()* ++ Return full name of Ada entity under the cursor (or at given ++ line/column), stripping white space/newlines as necessary. ++ ++ada#List_Tag([{line}, {col}]) *ada#Listtags()* ++ List all occurrences of the Ada entity under the cursor (or at ++ given line/column) inside the quick-fix window ++ ++ada#Jump_Tag ({ident}, {mode}) *ada#Jump_Tag()* ++ List all occurrences of the Ada entity under the cursor (or at ++ given line/column) in the tag jump list. Mode can either be ++ 'tjump' or 'stjump'. ++ ++ada#Create_Tags ({option}) *ada#Create_Tags()* ++ Creates tag file using Ctags. The option can either be 'file' ++ for the current file, 'dir' for the directory of the current ++ file or a file name. ++ ++gnat#Insert_Tags_Header() *gnat#Insert_Tags_Header()* ++ Adds the tag file header (!_TAG_) information to the current ++ file which are missing from the GNAT XREF output. ++ ++ada#Switch_Syntax_Option ({option}) *ada#Switch_Syntax_Option()* ++ Toggles highlighting options on or off. Used for the Ada menu. ++ ++ *gnat#New()* ++gnat#New () ++ Create a new gnat object. See |g:gnat| for details. ++ ++ ++============================================================================== ++8. Extra Plugins ~ ++ *ada-extra-plugins* ++ ++You can optionally install the following extra plug-in. They work well with Ada ++and enhance the ability of the Ada mode.: ++ ++backup.vim ++ http://www.vim.org/scripts/script.php?script_id=1537 ++ Keeps as many backups as you like so you don't have to. ++ ++rainbow_parenthsis.vim ++ http://www.vim.org/scripts/script.php?script_id=1561 ++ Very helpful since Ada uses only '(' and ')'. ++ ++nerd_comments.vim ++ http://www.vim.org/scripts/script.php?script_id=1218 ++ Excellent commenting and uncommenting support for almost any ++ programming language. ++ ++matchit.vim ++ http://www.vim.org/scripts/script.php?script_id=39 ++ '%' jumping for any language. The normal '%' jump only works for '{}' ++ style languages. The Ada mode will set the needed search patters. ++ ++taglist.vim ++ http://www.vim.org/scripts/script.php?script_id=273 ++ Source code explorer sidebar. There is a patch for Ada available. ++ ++The GNU Ada Project distribution (http://gnuada.sourceforge.net) of Vim ++contains all of the above. ++ ++============================================================================== ++vim: textwidth=78 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++vim: filetype=help +diff -urN vim71/runtime/doc/NERD_commenter.txt vim71_ada/runtime/doc/NERD_commenter.txt +--- vim71/runtime/doc/NERD_commenter.txt 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/doc/NERD_commenter.txt 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,1155 @@ ++*NERD_comments.txt* Plugin for commenting code v169 ++ ++ ++ NERD_COMMENTS REFERENCE MANUAL~ ++ ++ ++ ++ ++ ++============================================================================== ++CONTENTS {{{2 *NERD_comments-contents* ++ ++ 1.Intro...................................|NERD_comments| ++ 2.Functionality provided..................|NERD_com-functionality| ++ 2.1 Functionality Summary.............|NERD_com-functionality-summary| ++ 2.2 Functionality Details.............|NERD_com-functionality-details| ++ 2.2.1 Comment map.................|NERD_com-comment| ++ 2.2.2 Nested comment map..........|NERD_com-nested-comment| ++ 2.2.3 Toggle comment map..........|NERD_com-toggle-comment| ++ 2.2.4 Minimal comment map.........|NERD_com-minimal-comment| ++ 2.2.5 Invert comment map..........|NERD_com-invert-comment| ++ 2.2.6 Sexy comment map............|NERD_com-sexy-comment| ++ 2.2.7 Yank comment map............|NERD_com-yank-comment| ++ 2.2.8 Comment to EOL map..........|NERD_com-EOL-comment| ++ 2.2.9 Append com to line map......|NERD_com-append-comment| ++ 2.2.10 Prepend com to line map....|NERD_com-prepend-comment| ++ 2.2.11 Insert comment map.........|NERD_com-insert-comment| ++ 2.2.12 Use alternate delims map...|NERD_com-alt-delim| ++ 2.2.13 Comment aligned maps.......|NERD_com-aligned-comment| ++ 2.2.14 Uncomment line map.........|NERD_com-uncomment-line| ++ 2.3 Supported filetypes...............|NERD_com-filetypes| ++ 2.4 Sexy Comments.....................|NERD_com_sexy_comments| ++ 3.Customisation...........................|NERD_com-customisation| ++ 3.1 Customisation summary.............|NERD_com-cust-summary| ++ 3.2 Customisation details.............|NERD_com-cust-details| ++ 3.3 Default delimiter customisation...|NERD_com-cust-delims| ++ 3.4 Key mapping customisation.........|NERD_com-cust-keys| ++ 3.5 Sample regular expressions........|NERD_com-reg-exps| ++ 4.Issues with the script..................|NERD_com-issues| ++ 4.1 Delimiter detection heuristics....|NERD_com-heuristics| ++ 4.2 Nesting issues....................|NERD_com-nesting| ++ 4.3 Nesting issues....................|NERD_com-nesting| ++ 4.3 Mark clobbering...................|NERD_com-mark-clobbering| ++ 5.TODO list...............................|NERD_com-todo| ++ 6.Credits.................................|NERD_com-credits| ++ ++============================================================================== ++1. Intro {{{2 *NERD_comments* ++ ++NERD_comments provides a set of handy key mappings for commenting code. These ++mappings are consistent across all supported filetypes. ++ ++When writing NERD_comments I have tried to give it as many features/options as ++possible while keeping it so that the plugin can still be used with little or ++no knowledge of these. The average user need only know about a few key ++mappings to use NERD_comments while there are plenty of other features for the ++l33t nerd take advantage of. ++ ++Enjoy :D ++ ++============================================================================== ++2. Functionality provided {{{2 *NERD_com-functionality* ++ ++------------------------------------------------------------------------------ ++2.1 Functionality summary {{{3 *NERD_com-functionality-summary* ++ ++The following key mappings are provided by default (there is also a menu ++provided that contains menu items corresponding to all the below mappings): ++ ++Note: is a user defined key that is used to start keymappings and ++defaults to \. Check out || for details. ++ ++Most of the following mappings are for normal/visual mode only. The ++|NERD_com-insert-comment| mapping is for insert mode only. ++ ++cc |NERD_com-comment-map| ++Comments out the current line or text selected in visual mode. ++ ++ ++cn |NERD_com-nested-comment| ++Same as |NERD_com-comment-map| but enforces nesting. ++ ++ ++c |NERD_com-toggle-comment| ++Toggles the comment state of the selected line(s). If the topmost selected ++line is commented, all selected lines are uncommented and vice versa. ++ ++ ++cm |NERD_com-minimal-comment| ++Comments the given lines using only one set of multipart delimiters if ++possible. ++ ++ ++ci |NERD_com-invert-comment| ++Toggles the comment state of the selected line(s) individually. Each selected ++line that is commented is uncommented and vice versa. ++ ++ ++cs |NERD_com-sexy-comment| ++Comments out the selected lines ``sexually'' ++ ++ ++cy |NERD_com-yank-comment| ++Same as |NERD_com-comment-map| except that the commented line(s) are yanked ++before commenting. ++ ++ ++c$ |NERD_com-EOL-comment| ++Comments the current line from the cursor to the end of line. ++ ++ ++cA |NERD_com-append-comment| ++Adds comment delimiters to the end of line and goes into insert mode between ++them. ++ ++ ++cI |NERD_com-prepend-comment| ++Adds comment delimiters to the start of line and goes into insert mode between ++them. ++ ++ ++ |NERD_com-insert-comment| ++Adds comment delimiters at the current cursor position and inserts between. ++ ++ ++ca |NERD_com-alt-delim| ++Switches to the alternative set of delimiters. ++ ++ ++cl OR cr OR cb |NERD_com-aligned-comment| ++Same as |NERD_com-comment| except that the delimiters are aligned down the ++left side (cl), the right side (cr) or both sides ++(cb). ++ ++ ++cu |NERD_com-uncomment-line| ++Uncomments the selected line(s). ++ ++------------------------------------------------------------------------------ ++2.2 Functionality details {{{3 *NERD_com-functionality-details* ++ ++------------------------------------------------------------------------------ ++2.2.1 Comment map *NERD_com-comment* ++cc ++Comments out the current line. If multiple lines are selected in visual-line ++mode, they are all commented out. If some text is selected in visual or ++visual-block mode then NERD_comments will try to comment out the exact text ++that is selected using multi-part delimiters if they are available. ++ ++Works in normal, visual, visual-line and visual-block mode. ++ ++Change the mapping with: |NERD_com_line_map|. ++ ++Relevant options: ++|NERD_allow_any_visual_delims_regexp| ++|NERD_comment_whole_lines_in_v_mode| ++|NERD_block_com_after_right| ++|NERD_left_align_regexp| ++|NERD_place_holder_regexp| ++|NERD_right_align_regexp| ++|NERD_space_delim_filetype_regexp| ++|NERD_use_nested_comments_default| ++ ++------------------------------------------------------------------------------ ++2.2.2 Nested comment map *NERD_com-nested-comment* ++cn ++Performs nested commenting. Works the same as cc except that if a ++line is already commented then it will be commented again. ++ ++If the filetype is covered by the |NERD_place_holder_regexp| option ++then the previous comment delimiters will be replaced by place-holder ++delimiters if needed. Otherwise the nested comment will only be added if the ++current commenting delimiters have no right delimiter (to avoid compiler ++errors) ++ ++Works in normal, visual, visual-line, visual-block modes. ++ ++Change the mapping with: |NERD_com_line_nest_map|. ++ ++Relevant options: ++|NERD_allow_any_visual_delims_regexp| ++|NERD_comment_whole_lines_in_v_mode| ++|NERD_block_com_after_right| ++|NERD_left_align_regexp| ++|NERD_place_holder_regexp| ++|NERD_right_align_regexp| ++|NERD_space_delim_filetype_regexp| ++|NERD_use_nested_comments_default| ++ ++ ++------------------------------------------------------------------------------ ++2.2.3 Toggle comment map *NERD_com-toggle-comment* ++c ++Toggles commenting of the lines selected. The behaviour of this mapping ++depends on whether the first line selected is commented or not. If so, all ++selected lines are uncommented and vice versa. ++ ++With this mapping, lines are only considered to be commented if a left comment ++delimiter is the first non-space/tab char on the line. ++ ++Works in normal, visual-line, modes. ++Using this mapping in visual or visual-block modes will cause it to work like ++|NERD_com-comment| ++ ++Change the mapping with: |NERD_com_line_toggle_map|. ++ ++Relevant options: ++|NERD_left_align_regexp| ++|NERD_right_align_regexp| ++|NERD_space_delim_filetype_regexp| ++|NERD_use_nested_comments_default| ++ ++------------------------------------------------------------------------------ ++2.2.4 Minimal comment map *NERD_com-minimal-comment* ++cm ++Comments the selected lines using one set of multipart delimiters if possible. ++ ++For example: if you are programming in c and you select 5 lines and press ++cm then a '/*' will be placed at the start of the top line and a '*/' ++will be placed at the end of the last line. ++ ++Sets of multipart comment delimiters that are between the top and bottom ++selected lines are replaced with place holders (see |NERD_lPlace|) if ++NERD_place_holder_regexp is set for the current filetype. If it is not, then ++the comment will be aborted if place holders are required to prevent illegal ++syntax. ++ ++------------------------------------------------------------------------------ ++2.2.5 Invert comment map *NERD_com-invert-comment* ++ci ++Inverts the commented state of each selected line. If the a selected line is ++commented then it is uncommented and vice versa. Each line is examined and ++commented/uncommented individually. ++ ++With this mapping, lines are only considered to be commented if a left comment ++delimiter is the first non-space/tab char on the line. ++ ++Works in normal, visual-line, modes. ++ ++Change the mapping with: |NERD_com_line_invert_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.6 Sexy comment map *NERD_com-sexy-comment* ++cs ++Comments the selected line(s) ``sexily''... see |NERD_com_sexy_commenting| for ++a description of what sexy comments are. Can only be done on filetypes for ++which there is at least one set of multipart comment delimiters specified. ++ ++Sexy comments cannot be nested and lines inside a sexy comment cannot be ++commented again. ++ ++Works in normal, visual-line. ++ ++Change the mapping with: |NERD_com_line_sexy_map| ++ ++Relevant options: ++|NERD_use_compact_sexy_com_regexp| ++ ++------------------------------------------------------------------------------ ++2.2.7 Yank comment map *NERD_com-yank-comment* ++cy ++Same as cc except that it yanks the line(s) that are commented first. ++ ++Works in normal, visual, visual-line, visual-block modes. ++ ++Change the mapping with: |NERD_com_line_yank_map| ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.8 Comment to EOL map *NERD_com-EOL-comment* ++c$ ++Comments the current line from the current cursor position up to the end of ++the line. ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_com_to_end_of_line_map| ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.9 Append com to line map *NERD_com-append-comment* ++cA ++Appends comment delimiters to the end of the current line and goes ++to insert mode between the new delimiters. ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_append_com_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.10 Prepend com to line map *NERD_com-prepend-comment* ++cI ++Prepends comment delimiters to the start of the current line and goes to ++insert mode between the new delimiters. ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_prepend_com_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.11 Insert comment map *NERD_com-insert-comment* ++ ++Adds comment delimiters at the current cursor position and inserts ++between them. ++ ++Works in insert mode. ++ ++Change the mapping with: |NERD_com_in_insert_map|. ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.12 Use alternate delims map *NERD_com-alt-delim* ++ca ++Changes to the alternative commenting style if one is available. For example, ++if the user is editing a c++ file using // comments and they hit ca ++then they will be switched over to /**/ comments. ++keys for this mappings can be overridden with the ++ ++Works in normal mode. ++ ++Change the mapping with: |NERD_alt_com_map| ++ ++Relevant options: ++ ++ ++------------------------------------------------------------------------------ ++2.2.13 Comment aligned maps *NERD_com-aligned-comment* ++cl cr cb ++Same as cc except that the comment delimiters are aligned on the left ++side, right side or both sides respectively. These comments are always nested ++if the line(s) are already commented. ++ ++Works in normal, visual-line. ++ ++Change the mappings with: |NERD_com_align_left_map|, |NERD_com_align_right_map| ++and |NERD_com_align_both_map|. ++ ++Relevant options: ++|NERD_left_align_regexp| ++|NERD_right_align_regexp| ++ ++ ++------------------------------------------------------------------------------ ++2.2.14 Uncomment line map *NERD_com-uncomment-line* ++cu ++Uncomments the current line. If multiple lines are selected in ++visual mode then they are all uncommented. ++ ++When uncommenting, if the line contains multiple sets of delimiters then the ++``outtermost'' pair of delimiters will be removed. ++ ++The script uses a set of heurisics to distinguish ``real'' delimiters from ++``fake'' ones when uncommenting. See |NERD_com-issues| for details. ++ ++Works in normal, visual, visual-line, visual-block. ++ ++Change the mapping with: |NERD_uncom_line_map|. ++ ++Relevant options: ++|NERD_dont_remove_alt_coms| ++|NERD_dont_remove_spaces_regexp| ++ ++ ++------------------------------------------------------------------------------ ++2.3 Supported filetypes *NERD_com-filetypes* ++ ++Files that can be commented by this plugin: ++abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asm ++asn aspvbs atlas automake ave awk basic b bc bdf bib bindzone btm caos catalog ++c cfg cg ch cl clean clipper conf config cpp crontab cs csc csp css cterm cupl ++cvs dcl def diff dns dosbatch dosini dot dracula dsl dtd dtml dylan ecd eiffel ++elf elmfilt erlang eruby eterm expect exports fgl focexec form fortran foxpro ++fvwm fx gdb gdmo gnuplot gtkrc haskell hb h help hercules hog html htmlos ia64 ++icon idlang idl indent inform inittab ishd iss ist jam java javascript jess ++jgraph jproperties jproperties jsp kix kscript lace lex lftp lifelines lilo ++lisp lite lotos lout lprolog lscript lss lua lynx m4 make maple masm master ++matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc named ++nasm nastran natural ncf netrw nqc nsis ocaml omnimark openroad opl ora ox ++pascal pcap pccts perl pfmain php phtml pic pike pilrc pine plm plsql po ++postscr pov povini ppd ppwiz procmail progress prolog psf ptcap python python ++radiance ratpoison r rc readline rebol registry remind rexx robots rpl ruby sa ++samba sas sather scheme scilab screen scsh sdl sed sgml sgmldecl sgmllnx sicad ++simula sinda skill slang sl slrnrc sm smil smith sml snnsnet snnspat snnsres ++snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp strace svn tads ++taglist tags tak tasm tcl terminfo tex texinfo texmf tf tidy tli trasys tsalt ++tsscl tssgm uc uil vb verilog vgrindefs vhdl vim virata vrml vsejcl webmacro ++wget winbatch wml sh wvdial xdefaults xf86conf xhtml xkb xmath xml xmodmap ++xpm2 xpm xslt yacc yaml z8a ++ ++If a language is not in the list of hardcoded supported filetypes then the ++&commentstring vim option is used. ++ ++ ++------------------------------------------------------------------------------ ++2.4 Sexy Comments *NERD_com_sexy_comments* ++These are comments that use one set of multipart comment delimiters as well as ++one other marker symbol. For example: > ++ /* ++ * This is a c style sexy comment ++ * So there! ++ */ ++ ++ /* This is a c style sexy comment ++ * So there! ++ * But this one is ``compact'' style */ ++< ++Here the multipart delimiters are /* and */ and the marker is *. NERD_comments ++is capable of adding and removing comments of this type. ++ ++ ++============================================================================== ++3. Customisation {{{2 *NERD_com-customisation* ++ ++------------------------------------------------------------------------------ ++3.1 Customisation summary *NERD_com-cust-summary* ++ ++|loaded_nerd_comments| Turns off the script. ++|NERD_allow_any_visual_delims_regexp| Allows multipart alternative delims to ++ be used when commenting in ++ visual/visual-block mode. ++|NERD_block_com_after_right| Forces right delims to be placed when ++ doing visual-block comments. ++|NERD_comment_whole_lines_in_v_mode| Changes behaviour of visual comments. ++|NERD_menu_mode| Determines if a NERD comment menu will ++ be made and whether the menu will have a ++ keyboard shortcut. ++|NERD_dont_remove_alt_coms| Causes alternative comments not to be ++ removed when uncommenting. ++|NERD_dont_remove_spaces_regexp| Causes spaces not to be removed when ++ uncommenting if the filetype doesnt ++ match |NERD_space_delim_filetype_regexp| ++|NERD_create_h_filetype| Creates a new filetype for .h files. ++|NERD_lPlace| Specifies what to use as the left ++ delimiter placeholder when nesting ++ comments. ++|NERD_left_align_regexp| Specifies which filetypes to align left ++ delimiters for. ++|NERD_mapleader| Specifies what all the commenting key ++ mappings will begin with. ++|NERD_place_holder_regexp| Specifies which filetypes may use ++ placeholders when nesting comments. ++|NERD_right_align_regexp| Specifies which filetypes to align right ++ delimiters for. ++|NERD_rPlace| Specifies what to use as the right ++ delimiter placeholder when nesting ++ comments. ++|NERD_shut_up| Stops all output from the script. ++|NERD_space_delim_filetype_regexp| Specifies which filetypes to add spaces ++ around the delimiters for. ++|NERD_use_compact_sexy_com_regexp| Specifies which filetypes to use compact ++ sexy comments for. ++|NERD_use_nested_comments_default| Tells the script to use nested comments ++ by default. ++ ++----------------------------------------------------------------------------- ++3.3 Customisation details *NERD_com-cust-details* ++ ++To enable any of the below options you should put the given line in your ++~/.vimrc ++ ++ *loaded_nerd_comments* ++If this script is driving you insane you can turn it off by setting this ++option > ++ let loaded_nerd_comments=1 ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_allow_any_visual_delims_regexp* ++This option is set to a regular expression that is used to specify which ++filetypes this option should be turned on for. If this covers the current ++filetype then, when NERD_comments is doing a visual or visual-block comment ++(but not a visual-line comment) it will choose the right delimiters to use for ++the comment. This normally means using the current delimiters if they are ++multipart or using the alternative delimiters if THEY are multipart and the ++current delims are not. For example if we are editing the following java ++code: > ++ float foo = 1221; ++ float bar = 324; ++ System.out.println(foo * bar); ++< ++If we are using // comments and select the "foo" and "bar" in visual-block ++mode, as shown left below (where '|'s are used to represent the visual-block ++boundary), and comment it then it will use the alternative delims as shown on ++the right: > ++ float |foo| = 1221; float /*foo*/ = 1221; ++ float |bar| = 324; float /*bar*/ = 324; ++ System.out.println(foo * bar); System.out.println(foo * bar); ++< ++By default this option is set to '.*' i.e is turned on for all filetypes. ++ ++----------------------------------------------------------------------------- ++ *NERD_block_com_after_right* ++This option affects commenting when it is done in visual-block mode. If this ++option is turned on, lines that begin outside the right boundary of the ++selection block will be commented. Enable this option with: > ++ let NERD_block_com_after_right=1 ++< ++For example, if you are commenting this chunk of c code in visual-block mode ++(where the '|'s are used to represent the visual-block boundary) > ++ #include ++ #include ++ #include ++ |int| main(){ ++ | | printf("SUCK THIS\n"); ++ | | while(1){ ++ | | fork(); ++ | | } ++ |} | ++< ++If NERD_block_com_after_right=1 then this code will become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ /* */ printf("SUCK THIS\n"); ++ /* */ while(1){ ++ /* */ fork(); ++ /* */ } ++ /*} */ ++< ++Otherwise, the code block would become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ printf("SUCK THIS\n"); ++ while(1){ ++ fork(); ++ } ++ /*} */ ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_comment_whole_lines_in_v_mode* ++This option can take 2 values. By default NERD_comments tries to comment out ++exactly what is selected in visual mode (v). For example if you select and ++comment the following c code (using | to represent the visual boundary): > ++ in|t foo = 3; ++ int bar =| 9; ++ int baz = foo + bar; ++< ++This will result in: > ++ in/*t foo = 3;*/ ++ /*int bar =*/ 9; ++ int baz = foo + bar; ++< ++But some people prefer it if the whole lines are commented like: > ++ /*int foo = 3;*/ ++ /*int bar = 9;*/ ++ int baz = foo + bar; ++< ++If you prefer the second option then stick this line in your .vimrc: > ++ let NERD_comment_whole_lines_in_v_mode=1 ++< ++ ++If the filetype you are editing only has no multipart delimiters (for example ++a shell script) and you hadnt set this option then the above would become > ++ in#t foo = 3; ++ #int bar = 9; ++< ++(where # is the comment delimiter) as this is the closest NERD_comments can ++come to commenting out exactly what was selected. If you prefer for whole ++lines to be commented out when there is no multipart delimiters but the EXACT ++text that was selected to be commented out if there IS multipart delimiters ++then stick the following line in your .vimrc: > ++ let NERD_comment_whole_lines_in_v_mode=2 ++< ++ ++Note that this option does not affect the behaviour of visual-block mode (). ++ ++----------------------------------------------------------------------------- ++ *NERD_dont_remove_alt_coms* ++When uncommenting a line when there is an alternative commenting style for the ++current filetype, this option tells the script not to look for, and remove, ++comments delimiters of the alternative style. > ++ let NERD_dont_remove_alt_coms=1 ++< ++For example, if you are editing a c++ file using // style comments and you go ++cu on this line: > ++ /* This is a c++ comment baby! */ ++< ++It will not be uncommented if the NERD_dont_remove_alt_coms is set to 1. ++ ++----------------------------------------------------------------------------- ++ *NERD_dont_remove_spaces_regexp* ++By default, the NERD commenter will remove spaces around comment delimiters if ++either: ++1. The current filetype matches the |NERD_space_delim_filetype_regexp| option ++ (which is a regular expression). ++2. The current filtype doesnt match NERD_dont_remove_spaces_regexp option ++ (which is also a reg exp) ++ ++This means that if we have the following lines in a c code file: > ++ /* int foo = 5; */ ++ /* int bar = 10; */ ++ int baz = foo + bar ++< ++If either of the above conditions hold then if these lines are uncommented ++they will become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++Otherwise they would become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++If you want the spaces to be removed only if the current filetype matches ++|NERD_space_delim_filetype_regexp| then set the ++NERD_dont_remove_spaces_regexp option in your vimrc so that it matches the ++desired filetypes. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++Defaults to "^python$" ++ ++----------------------------------------------------------------------------- ++ *NERD_create_h_filetype* ++If this option is set then NERD_comments will create a seperate filetype for h ++files. This could be needed because some versions of vim treat h files as cpp ++files which can be dodgy for commenting because if you are using // to comment ++cpp files then this is invalid when you are commenting h files for a c ++project (unless you arent adhering to the ANSI standard... naughty naughty). ++To enable this option, stick the following line in your .vimrc: > ++ let NERD_create_h_filetype = 1 ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_lPlace* ++ *NERD_rPlace* ++These options are used to control the strings used as place-holder delimiters. ++Place holder delimiters are used when performing nested commenting when the ++filetype supports commenting styles with both left and right delimiters. ++To set these options use lines like: > ++ let NERD_lPlace="FOO" ++ let NERD_rPlace="BAR" ++< ++Following the above example, if we have line of c code: > ++ /* int horse */ ++< ++and we comment it with cn it will be changed to: > ++ /*FOO int horse BAR*/ ++< ++When we uncomment this line it will go back to what it was. ++NERD_lPlace defaults to '[>', NERD_rPlace defaults to '<]'. ++ ++----------------------------------------------------------------------------- ++ *NERD_left_align_regexp* ++This option is a regular expression which is used to specify which filetypes ++should have their left delimiters aligned when commenting multiple lines. ++ ++For example, consider this chunk of c code: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 while(foo < 50){ ++ 4 foo = foo + bar; ++ 5 printf("i am just making up this code\n"); ++ 6 printf("i have no idea what im writing\n"); ++ 7 } ++< ++If the NERD_left_align_regexp regexp covers c files then if we select lines ++3-7 in visual mode and hit cc the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /*while(foo < 50){*/ ++ 4 /* foo = foo + bar;*/ ++ 5 /* printf("i am just making up this code\n");*/ ++ 6 /* printf("i have no idea what im writing\n");*/ ++ 7 /*}*/ ++< ++If NERD_left_align_regexp doesnt cover c files then the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /* while(foo < 50){ */ ++ 4 /* foo = foo + bar; */ ++ 5 /* printf("i am just making up this code\n"); */ ++ 6 /* printf("i have no idea what im writing\n"); */ ++ 7 /* } */ ++< ++NERD_left_align_regexp defaults to '^$' meaning no filetypes have their left ++delims aligned. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_mapleader* ++NERD_mapleader is used to specify what all the NERD commenter key mappings ++begin with. ++ ++Assuming that == '\', the default key mappings will look like this: > ++ \cc ++ \cu ++ \ca ++ \ci ++ \cs ++ ... ++< ++However, if this line: > ++ let NERD_mapleader = ',x' ++< ++were present in your vimrc then the default mappings would look like this: > ++ ,xc ++ ,xu ++ ,xa ++ ,xi ++ ,xs ++ ... ++< ++This option only affects the mappings that have not been explicitly set ++manually (see |NERD_com-cust-keys|). ++ ++Default is c. ++ ++----------------------------------------------------------------------------- ++ *NERD_menu_mode* ++This option can take 3 values: ++ "0": Turns the NERD commenter menu off completely. ++ "1": Turns the NERD commenter menu on with no menu shortcut. ++ "2": Turns the NERD commenter menu on with -c as the menu shortcut. ++ ++Default is "2". ++ ++----------------------------------------------------------------------------- ++ *NERD_place_holder_regexp* ++This option is a regular expression which is used to specify which filetypes ++place-holder delimiters should be used for when adding nested comments. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_right_align_regexp* ++This option is a regular expression which is used to specify which filetypes ++should have their right delimiters aligned when commenting multiple lines. ++ ++For example, consider this chunk of c code: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 while(foo < 50){ ++ 4 foo = foo + bar; ++ 5 printf("i am just making up this code\n"); ++ 6 printf("i have no idea what im writing\n"); ++ 7 } ++< ++If the NERD_right_align_regexp regexp covers c files then if we select lines ++3-7 in visual mode and hit cc the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /*while(foo < 50){ */ ++ 4 /*foo = foo + bar; */ ++ 5 /*printf("i am just making up this code\n"); */ ++ 6 /*printf("i have no idea what im writing\n");*/ ++ 7 /*} */ ++< ++If NERD_right_align_regexp doesnt cover c files then the code will become: > ++ 1 int foo = 3; ++ 2 int bar = 5; ++ 3 /* while(foo < 50){ */ ++ 4 /* foo = foo + bar; */ ++ 5 /* printf("i am just making up this code\n"); */ ++ 6 /* printf("i have no idea what im writing\n"); */ ++ 7 /* } */ ++< ++NERD_right_align_regexp defaults to '^$' meaning no filetypes have their right ++delims aligned. ++ ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_shut_up* ++This option is used to prevent NERD_comments from echoing anything. ++Stick this line in your .vimrc: > ++ let NERD_shut_up=1 ++< ++ ++----------------------------------------------------------------------------- ++ *NERD_space_delim_filetype_regexp* ++Some people prefer a space after the left delimiter and before the right ++delimiter like this: > ++ /* int foo=2; */ ++< ++as opposed to this: > ++ /*int foo=2;*/ ++< ++This option is a regular expression that is used to specify which filetypes ++NERD_comments should use spaces for (as in the first eg above). ++NERD_space_delim_filetype_regexp defaults to '^$'. ++ ++See also |NERD_dont_remove_spaces_regexp|. ++See |NERD_com-reg-exps| for example reg exps. ++ ++----------------------------------------------------------------------------- ++ *NERD_use_compact_sexy_com_regexp* ++Some people may want their sexy comments to be like this: > ++ /* Hi There! ++ * This is a sexy comment ++ * in c */ ++< ++As opposed to like this: > ++ /* ++ * Hi There! ++ * This is a sexy comment ++ * in c ++ */ ++< ++The option NERD_use_compact_sexy_com_regexp is a regular expression. If the ++filetype that the user is commenting matches this regular expression then when ++they do sexy comments they will look like the first comment above. ++ ++----------------------------------------------------------------------------- ++ *NERD_use_nested_comments_default* ++When this option is turned on comments are nested automatically. That is, if ++you hit cc on a line that is already commented, or contains comments, ++it will be commented again. > ++ let NERD_use_nested_comments_default=1 ++< ++ ++----------------------------------------------------------------------------- ++3.3 Default delimiter customisation *NERD_com-cust-delims* ++These options are used to tell NERD_comments which delimiters to use for a ++given filetype when it first loads up. To set one of these options just stick ++the corresponding line in your .vimrc. For example: if i want to use /* */ to ++delimit comments in java files instead of // (which is the default) then I ++would stick this line in my .vimrc: > ++ let NERD_use_c_style_java_comments=1 ++< ++ ++Note that if filetype has two commenting styles, which are both supported, you ++can switch between them with ca. See |NERD_com-alt-delim|. These ++options only change which style is used when the script is initialsed. ++ ++NERD_use_ada_with_spaces: use -- instead of -- for ada files. ++NERD_use_c_style_acedb_comments: use /**/ instead of // for acedb files. ++NERD_use_c_style_ch_comments: use /**/ instead of // for ch files. ++NERD_use_c_style_clean_comments: use /**/ instead of // for clean files. ++NERD_use_c_style_clipper_comments: use /**/ instead of // for clipper files. ++NERD_use_c_style_cpp_comments: use /**/ instead of // for c++ files. ++NERD_use_c_style_cs_comments: use /**/ instead of // for c# files. ++NERD_use_c_style_dot_comments: use /**/ instead of // for dot files. ++NERD_use_c_style_dylan_comments: use /**/ instead of // for dylan files. ++NERD_use_c_style_h_comments: use /**/ instead of // for h files. ++NERD_use_c_style_hercules_comments: use /**/ instead of // for hercules files. ++NERD_use_c_style_idl_comments: use /**/ instead of // for idl files. ++NERD_use_c_style_ishd_comments: use /**/ instead of // for ishd files. ++NERD_use_c_style_java_comments: use /**/ instead of // for java files. ++NERD_use_c_style_javascript_comments: use /**/ instead of // for javascript files. ++NERD_use_c_style_kscript_comments: use /**/ instead of // for kscript files. ++NERD_use_c_style_mel_comments: use /**/ instead of // for mel files. ++NERD_use_c_style_named_comments: use /**/ instead of // for named files. ++NERD_use_c_style_pccts_comments: use /**/ instead of // for pccts files. ++NERD_use_c_style_php_comments: use /* */ instead of // for php files. ++NERD_use_c_style_pike_comments: use /**/ instead of // for pike files. ++NERD_use_c_style_pilrc_comments: use /**/ instead of // for pilrc files. ++NERD_use_c_style_plm_comments: use /**/ instead of // for plm files. ++NERD_use_c_style_pov_comments: use /**/ instead of // for pov files. ++NERD_use_c_style_prolog_comments: use /**/ instead of % for prolog files. ++NERD_use_c_style_rc_comments: use /**/ instead of // for rc files. ++NERD_use_c_style_tads_comments: use /**/ instead of // for tads files. ++NERD_use_c_style_tsalt_comments: use /**/ instead of // for tsalt files. ++NERD_use_c_style_uc_comments: use /**/ instead of // for uc files. ++NERD_use_c_style_verilog_comments: use /**/ instead of // for verilog files. ++NERD_use_dash_dash_simula_comments: use -- instead of % for simula files. ++NERD_use_dnl_style_automake_comments: use dnl instead of # for automake files. ++NERD_use_hash_samba_comments: use # instead of ; for samba files. ++NERD_use_long_haskell_comments: use {--} instead of -- for haskell files. ++NERD_use_long_lisp_comments: use #||# instead of ; for lisp files. ++NERD_use_long_lua_comments: use --[[]] instead of -- for lua files. ++NERD_use_paren_star_pascal_comments: use (**) instead of {} for pascal files. ++NERD_use_REM_basic_comments: use REM instead of ' for basic files. ++NERD_use_single_part_c_comments: use // instead of /* */ for c files. ++ ++ ++----------------------------------------------------------------------------- ++3.4 Key mapping customisation *NERD_com-cust-keys* ++ ++These options are used to override the default keys that are used for the ++commenting mappings. Their values must be set to strings. As an example: if ++you wanted to use the mapping foo to uncomment lines of code then ++you would place this line in your vimrc > ++ let NERD_uncom_line_map="foo" ++< ++ ++Check out |NERD_com-functionality| for details about what the following ++mappings do. ++ ++ *NERD_alt_com_map* ++To override the ca mapping, set this option > ++ let NERD_alt_com_map="" ++< ++ *NERD_append_com_map* ++To override the ce mapping, set this option > ++ let NERD_append_com_map="" ++< ++ *NERD_com_align_left_map* ++To override the cl mapping, set this option > ++ let NERD_com_align_left_map="" ++< ++ *NERD_com_align_both_map* ++To override the cb mapping, set this option > ++ let NERD_com_align_both_map="" ++< ++ *NERD_com_align_right_map* ++To override the cr mapping, set this option > ++ let NERD_com_align_right_map="" ++< ++ *NERD_com_in_insert_map* ++To override the mapping, set this option > ++ let NERD_com_in_insert_map="" ++< ++ *NERD_com_line_invert_map* ++To override the ci mapping, set this option > ++ let NERD_com_line_invert_map="" ++< ++ *NERD_com_line_map* ++To override the cc mapping, set this option > ++ let NERD_com_line_map="" ++< ++ *NERD_com_line_nest_map* ++To override the cn mapping, set this option > ++ let NERD_com_line_nest_map="" ++< ++ *NERD_com_line_sexy_map* ++To override the cs mapping, set this option > ++ let NERD_com_line_sexy_map="" ++< ++ *NERD_com_line_toggle_map* ++To override the c mapping, set this option > ++ let NERD_com_line_toggle_map="" ++< ++ *NERD_com_line_minimal_map* ++To override the cm mapping, set this option > ++ let NERD_com_line_minimal_map="" ++< ++ *NERD_com_to_end_of_line_map* ++To override the c$ mapping, set this option > ++ let NERD_com_to_end_of_line_map="" ++< ++ *NERD_com_line_yank_map* ++To override the cy mapping, set this option > ++ let NERD_com_line_yank_map="" ++< ++ *NERD_uncom_line_map* ++To override the cu mapping, set this option > ++ let NERD_uncom_line_map="" ++< ++ ++------------------------------------------------------------------------------ ++3.5 Sample regular expressions *NERD_com-reg-exps* ++ ++Many of the options in the NERD commenter must be set to regular ++expressions... regular expressions can be a bit confusing so i have provided ++some template ones here that you can start from: ++ ++Regexp1: '.*' ++Matches any filetype. This is useful for turning an option on for all files. ++ ++Regexp2: '^$' ++Matches no filetypes. This is useful for turning an option off for all files. ++ ++Regexp3: '^\(java\)$' ++Matches only the java filetype. ++ ++Regexp4: '^\(c\|vim\)$' ++Matches only c and vim filetypes. ++ ++Regexp5: '^\(c.*\|vim\)$' ++Matches filetypes beginning with c (eg c, cpp, cs, etc) as well ++as vim files. ++ ++Regexp6: '^\(c.*\|java\|tex\)$' ++Matches filetypes beginning with c (eg c, cpp, cs, etc) as well as java and ++tex filetypes. ++ ++Regexp7: '^\(python\)\@!' ++Matches anything other than 'python'. ++ ++Regexp8: '^c\(s\)\@!' ++Matches 'c' followed by anything accept an 's'. ++ ++Regexp9: '^\(foo$\|bar$\|baz$\)\@!' ++Matches any strings except 'foo', 'bar' and 'baz'. ++ ++============================================================================== ++4. Issues with the script{{{2 *NERD_com-issues* ++ ++ ++------------------------------------------------------------------------------ ++4.1 Delimiter detection heuristics *NERD_com-heuristics* ++ ++Heuristics are used to distinguish the real comment delimiters ++ ++Because we have comment mappings that place delimiters in the middle of lines, ++removing comment delimiters is a bit tricky. This is because if comment ++delimiters appear in a line doesnt mean they really ARE delimiters. For ++example, Java uses // comments but the line > ++ System.out.println("//"); ++< ++clearly contains no real comment delimiters. ++ ++To distinguish between ``real'' comment delimiters and ``fake'' ones we use a ++set of heuristics. For example, one such heuristic states that any comment ++delimiter that has an odd number of non-escaped " characters both preceding ++and following it on the line is not a comment because it is probably part of a ++string. These heuristics, while usually pretty accurate, will not work for all ++cases. ++ ++------------------------------------------------------------------------------ ++4.2 Nesting issues *NERD_com-nesting* ++ ++If we have some line of code like this: > ++ /*int foo */ = /*5 + 9;*/ ++< ++This will not be uncommented legally. The NERD commenter will remove the ++"outter most" delimiters so the line will become: > ++ int foo */ = /*5 + 9; ++< ++which almost certainly will not be what you want. Nested sets of comments will ++uncomment fine though. Eg: > ++ /*int/* foo =*/ 5 + 9;*/ ++< ++will become: > ++ int/* foo =*/ 5 + 9; ++< ++(Note that in the above examples I have deliberately not used place holders ++for simplicity) ++ ++------------------------------------------------------------------------------ ++4.3 Mark clobbering *NERD_com-mark-clobbering* ++ ++The script clobbers the s and t marks when doing most comments. Im not sure ++how to save and restore the marks yet. ++ ++ ++ ++============================================================================== ++5. TODO list {{{2 *NERD_com-todo* ++ ++Uncommenting of minimal comments needs to be more robust. Currently it is easy ++to get illegal syntax when uncommenting them. ++ ++ ++ ++============================================================================== ++6. Credits {{{2 *NERD_com-credits* ++ ++Thanks and respect to the following people: ++ ++Thanks to Nick Brettell for his many ideas and criticisms. A bloody good ++bastard. ++:normal :.-2s/good// ++ ++Thanks to Matthew Hawkins for his awesome refactoring! ++ ++Thanks to the authors of the vimspell whose documentation ++installation function I stole :) ++ ++Thanks to Greg Searle for the idea of using place-holders for nested comments. ++ ++Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! ++Also, thanks for the idea of doing sexy comments as well as his suggestions ++relating to it :P ++Thanks again to Nguyen for complaining about the NERD_comments menu mapping ++(-c) interfering with another mapping of his... and thus the ++NERD_dont_create_menu_shortcut option was born :P ++(it was then replaced with NERD_menu_mode in version 1.67 :) ++ ++Thanks to Sam R for pointing out some filetypes that NERD_comments could support! ++ ++Cheers to Litchi for the idea of having a mapping that appends a comment to ++the current line :) ++ ++Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some ++problems with commenting in visual mode. Thanks again to Jorge for his ++continued suggestions on this matter :) ++ ++Thanks to Martin Stubenschrott for pointing out a bug with the mapping ++:) Ive gotta stop breaking this mapping! ++ ++Thanks to Markus Erlmann for pointing out a conflict that this script was ++having with the taglist plugin. ++ ++Thanks to Brent Rice for alerting me about, and helping me track down, a bug ++in the script when the "ignorecase" option in vim was set. ++ ++Thanks to Richard Willis for telling me about how line continuation was ++causing problems on cygwin. Also, thanks pointing out a bug in the help file ++and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI ++have mercy on your soul :) ++ ++Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". ++Also, thanks for his suggested improvements about toggle comments after i ++implemented them. ++ ++Thanks to harry for telling me that i broke the cn mapping in 1.53 :), ++and thanks again for telling me about a bug that occurred when editing a file ++in a new tab. ++ ++Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc ++install function and added support for ada comments with spaces as well as ++making a couple of other small changes. ++ ++Thanks to David Bourgeois for pointing out a bug with when commenting c files ++:)... [a few days later] ok i completely misunderstood what David was talking ++about and ended up fixing a completely different bug to what he was talking ++about :P ++ ++Thanks to David Bourgeois for pointing out a bug when changing buffers. ++ ++Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that ++was causing spaces to be added to the end of lines with single-part ++delimiters. It's nice when people do my work for me :D ++ ++Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting ++sexy comments. Sexy comments dont look so sexy when they are only half removed ++:P ++ ++Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping ++the NERD_space_delim_filetype_regexp option from working with left aligned ++toggle comments. And for pointing out a bug when initialising VB comments. ++ ++Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". ++And for suggested improvements to minimal comments. ++ ++Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. ++In 1.65 ++ ++Thanks to Jonathan Derque for alerting me to some filetypes that could be ++supported (Namely: context, plaintext and mail). ++ ++Thanks to Joseph Barker for the sugesting that the menu be an optional ++feature. ++ ++Thanks to Gary Church and Tim Carey-Smith for complaining about the ++keymappings and causing me to introduce the NERD_mapleader option :) ++ ++ ++Cheers to myself for being the best looking man on Earth! ++ ++ ++ vim:tw=78:ts=8:ft=help:norl: +diff -urN vim71/runtime/ftplugin/ada.vim vim71_ada/runtime/ftplugin/ada.vim +--- vim71/runtime/ftplugin/ada.vim 2007-05-05 19:17:45.000000000 +0200 ++++ vim71_ada/runtime/ftplugin/ada.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -1,14 +1,15 @@ + "------------------------------------------------------------------------------ + " Description: Perform Ada specific completion & tagging. + " Language: Ada (2005) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ +-" Maintainer: Martin Krischik ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" Maintainer: Martin Krischik ++" Taylor Venable + " Neil Bird +-" $Author: karsten $ +-" $Date: 2008/01/16 15:58:14 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ + " History: 24.05.2006 MK Unified Headers + " 26.05.2006 MK ' should not be in iskeyword. + " 16.07.2006 MK Ada-Mode as vim-ball +@@ -17,6 +18,7 @@ + " 05.11.2006 MK Bram suggested not to use include protection for + " autoload + " 05.11.2006 MK Bram suggested to save on spaces ++" 08.07.2007 TV fix default compiler problems. + " Help Page: ft-ada-plugin + "------------------------------------------------------------------------------ + " Provides mapping overrides for tag jumping that figure out the current +@@ -30,7 +32,7 @@ + endif + + " Don't load another plugin for this buffer +-let b:did_ftplugin = 38 ++let b:did_ftplugin = 45 + + " + " Temporarily set cpoptions to ensure the script loads OK +@@ -104,8 +106,17 @@ + \ s:notend . '\:\\s\+\' + endif + ++ + " Section: Compiler {{{1 + " ++if ! exists("g:ada_default_compiler") ++ if has("vms") ++ let g:ada_default_compiler = 'decada' ++ else ++ let g:ada_default_compiler = 'gnat' ++ endif ++endif ++ + if ! exists("current_compiler") || + \ current_compiler != g:ada_default_compiler + execute "compiler " . g:ada_default_compiler +diff -urN vim71/runtime/indent/ada.vim vim71_ada/runtime/indent/ada.vim +--- vim71/runtime/indent/ada.vim 2007-05-05 19:25:37.000000000 +0200 ++++ vim71_ada/runtime/indent/ada.vim 2008-01-16 16:37:02.000000000 +0100 +@@ -1,19 +1,21 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada indent file + " Language: Ada (2005) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik +-" Maintainer: Martin Krischik ++" Maintainer: Martin Krischik + " Neil Bird +-" $Author: karsten $ +-" $Date: 2008/01/16 15:58:14 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ + " History: 24.05.2006 MK Unified Headers + " 16.07.2006 MK Ada-Mode as vim-ball + " 15.10.2006 MK Bram's suggestion for runtime integration + " 05.11.2006 MK Bram suggested to save on spaces ++" 19.09.2007 NO g: missing before ada#Comment + " Help Page: ft-vim-indent + "------------------------------------------------------------------------------ + " ToDo: +@@ -27,7 +29,7 @@ + finish + endif + +-let b:did_indent = 1 ++let b:did_indent = 45 + + setlocal indentexpr=GetAdaIndent() + setlocal indentkeys-=0{,0} +@@ -58,7 +60,7 @@ + " Seems to work OK as it 'starts' with the indent of the /previous/ line. + function s:MainBlockIndent (prev_indent, prev_lnum, blockstart, stop_at) + let lnum = a:prev_lnum +- let line = substitute( getline(lnum), ada#Comment, '', '' ) ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) + while lnum > 1 + if a:stop_at != '' && line =~ '^\s*' . a:stop_at && indent(lnum) < a:prev_indent + return a:prev_indent +@@ -72,7 +74,7 @@ + let lnum = prevnonblank(lnum - 1) + " Get previous non-blank/non-comment-only line + while 1 +- let line = substitute( getline(lnum), ada#Comment, '', '' ) ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) + if line !~ '^\s*$' && line !~ '^\s*#' + break + endif +@@ -116,7 +118,7 @@ + " Get previous non-blank/non-comment-only line + while 1 + let line = getline(lnum) +- let line = substitute( line, ada#Comment, '', '' ) ++ let line = substitute( line, g:ada#Comment, '', '' ) + if line !~ '^\s*$' + break + endif +@@ -143,7 +145,8 @@ + let lnum = prevnonblank(lnum - 1) + " Get previous non-blank/non-comment-only line + while 1 +- let line = substitute( getline(lnum), ada#Comment, '', '' ) ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) ++ + if line !~ '^\s*$' && line !~ '^\s*#' + break + endif +@@ -222,7 +225,7 @@ + exe lnum + exe 'normal! $F)%' + if getline('.') =~ '^\s*(' +- " Dire layout - use previous indent (could check for ada#Comment here) ++ " Dire layout - use previous indent (could check for g:ada#Comment here) + let ind = indent( prevnonblank( line('.')-1 ) ) + else + let ind = indent('.') +diff -urN vim71/runtime/macros/svnignore.bash vim71_ada/runtime/macros/svnignore.bash +--- vim71/runtime/macros/svnignore.bash 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/macros/svnignore.bash 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,9 @@ ++#!/bin/bash ++ ++svn propedit \ ++ --editor-cmd="gvim -f" \ ++ svn:ignore \ ++ "${@}" ; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/runtime/macros/svnignore.btm vim71_ada/runtime/macros/svnignore.btm +--- vim71/runtime/macros/svnignore.btm 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/macros/svnignore.btm 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,27 @@ ++::!C:\Bin\4Portable\App\4\4nt.EXE ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: Description: Works like "tail -f" . ++:: $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++:: Maintainer: Martin Krischik ++:: Jason Heddings (vim at heddway dot com) ++:: $Author: karsten $ ++:: $Date: 2008/01/16 15:58:14 $ ++:: Version: 3.0 ++:: $Revision: 1.1 $ ++:: $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.btm $ ++:: History: 17.11.2007 Edit svn:ignore data ++:: Help Page: tail.txt ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++ ++svn propedit ^ ++ --editor-cmd="gvim -f" ^ ++ svn:ignore ^ ++ "%[$]" ++ ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: Copyright (C) 2006 Martin Krischik ++:: ++:: Vim is Charityware - see ":help license" or uganda.txt for licence details. ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++:: vim: filetype=btm encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/runtime/macros/svnignore.zsh vim71_ada/runtime/macros/svnignore.zsh +--- vim71/runtime/macros/svnignore.zsh 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/macros/svnignore.zsh 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,29 @@ ++#!/bin/zsh ++#------------------------------------------------------------------------------ ++# Description: Works like "tail -f" . ++# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++# Maintainer: Martin Krischik ++# Jason Heddings (vim at heddway dot com) ++# $Author: karsten $ ++# $Date: 2008/01/16 15:58:14 $ ++# Version: 3.0 ++# $Revision: 1.1 $ ++# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.zsh $ ++# History: 17.11.2007 Edit svn:ignore data ++# Help Page: tail.txt ++#------------------------------------------------------------------------------ ++ ++setopt No_X_Trace; ++ ++svn propedit \ ++ --editor-cmd="gvim -f" \ ++ svn:ignore \ ++ "${=@}" ; ++ ++#------------------------------------------------------------------------------ ++# Copyright (C) 2006 Martin Krischik ++# ++# Vim is Charityware - see ":help license" or uganda.txt for licence details. ++#------------------------------------------------------------------------------ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/runtime/macros/vim.bash vim71_ada/runtime/macros/vim.bash +--- vim71/runtime/macros/vim.bash 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/macros/vim.bash 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,191 @@ ++#!/bin/echo usage: source ++########################################################### {{{1 ########### ++# Description: Set alias names for a custom installed vim/ctags. ++# Language: Bash Shell Script ++# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++# Maintainer: Martin Krischik ++# $Author: karsten $ ++# $Date: 2008/01/16 15:58:14 $ ++# Version: 3.6 ++# $Revision: 1.1 $ ++# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/vim.bash $ ++# History: 26.07.2006 MK pretty new ++# Usage: copy to /etc/profile.d and make world executable ++########################################################### }}}1 ########### ++ ++ ++if ! type lxpm 2>/dev/null 1>/dev/null; then ++ ++ # Variablen ++ UName=$(uname) ++ ++ case "${UName}" in # {{{1 ++ (Linux*) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}2 ++ (CYGWIN*) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}2 ++ (SunOS) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; ++ elif test -x "${HOME}/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="${HOME}/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" ++ PATH="${VIM}/bin:${PATH}" ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi ++ ;; # }}}2 ++ (*) # {{{2 ++ ;; # }}}2 ++ esac; # }}}1 ++ ++ # Simple Functions ++ ++ for i in ctags etags eview evim ex gview gvim gvimdiff rgview rgvim rview rvim view vim vimdiff vimtutor xxd; do # {{{1 ++ ++ case "${UName}" in # {{{2 ++ (MINGW*) # {{{3 ++ if test -n "${VIM}"; then ++ declare -x -f ${i}; ++ ++ eval "function ${i} () ++ { ++ ${VIM}/vim71/gvim.exe \"\${@}\" ++ return; ++ }" ++ else ++ unset -f ${i} 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}3 ++ (Linux|CYGWIN*) # {{{3 ++ if test -n "${VIM}"; then ++ declare -x -f ${i}; ++ ++ eval "function ${i} () ++ { ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/${i}\" \"\${@}\" ; ++ return; ++ }" ++ else ++ unset -f ${i} 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}3 ++ (*) # {{{3 ++ ;; # }}}3 ++ esac; # }}}2 ++ done; # }}}1 ++ ++ # Server Functions ++ ++ for i in lxpm med epm; do # {{{1 ++ declare -x -f ${i} ++ ++ case "${UName}" in # {{{2 ++ (MINGW*) # {{{3 ++ if test -n "${VIM}"; then ++ eval "function ${i} () ++ { ++ if test -z "\${1}"; then ++ ${VIM}/vim71/gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & ++ else ++ ${VIM}/vim71/gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & ++ fi; ++ return; ++ }" ++ else ++ eval "function ${i} () ++ { ++ if test -z "\${1}"; then ++ gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & ++ else ++ gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & ++ fi; ++ return; ++ }" ++ fi; ++ ;; # }}}3 ++ (Linux|CYGWIN*|SunOS) # {{{3 ++ if test -n "${VIM}"; then ++ eval "function ${i} () ++ { ++ if test -z \"\${1}\"; then ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" \"\${@}\" \ ++ >/dev/null 2>/dev/null & ++ else ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" \ ++ >/dev/null 2>/dev/null & ++ fi ++ return; ++ }" ++ else ++ eval "function ${i} () ++ { ++ if test -z \"\${1}\"; then ++ gvim --servername \"${i} ${HOSTNAME}\" >/dev/null 2>/dev/null & ++ else ++ gvim --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" >/dev/null 2>/dev/null & ++ fi ++ return; ++ }" ++ fi; ++ ;; # }}}3 ++ (*) # {{{3 ++ ;; # }}}3 ++ esac; # }}}2 ++ done; # }}}1 ++ ++ # Some applications read the EDITOR variable to determine your favourite text ++ # editor. So uncomment the line below and enter the editor of your choice :-) ++ if test -n "${VIM}"; then ++ declare -x EDITOR="${VIM}/bin/gvim -f"; ++ declare -x VISUAL="${VIM}/bin/gvim -f"; ++ else ++ declare -x EDITOR="$(which gvim) -f"; ++ declare -x VISUAL="$(which gvim) -f"; ++ fi; ++ # Unset local Variablen ++ ++ unset UName ++ ++ printf "\e[42m%-30.30s : \e[43m %-40.40s \e[m\n" "$(basename ${BASH_SOURCE:-${0}})" "VIM 7.0 symbols set." ++ ++fi; ++ ++########################################################### {{{1 ########### ++# Copyright (C) 2006 Martin Krischik ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License ++# as published by the Free Software Foundation; either version 2 ++# of the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ++########################################################### }}}1 ########### ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker +diff -urN vim71/runtime/macros/vim.zsh vim71_ada/runtime/macros/vim.zsh +--- vim71/runtime/macros/vim.zsh 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/macros/vim.zsh 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,17 @@ ++#!/bin/echo usage: source ++ ++setopt No_Verbose ++setopt No_X_Trace ++setopt Typeset_Silent; ++ ++# ++# Bash script is zsh compatible ++# ++HOSTNAME="${HOSTNAME:-${HOST}}" ++BASH_SOURCE="$(basename ${0} .zsh).bash" ++source "$(dirname ${0})/${BASH_SOURCE}" ++unset BASH_SOURCE; ++ ++############################################################# {{{1 ########### ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab ++# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/runtime/plugin/matchit.vim vim71_ada/runtime/plugin/matchit.vim +--- vim71/runtime/plugin/matchit.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/plugin/matchit.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,814 @@ ++" matchit.vim: (global plugin) Extended "%" matching ++" Last Change: Tue Oct 24 11:00 AM 2006 EDT ++" Maintainer: Benji Fisher PhD ++" Version: 1.12, for Vim 6.3+ ++" URL: http://www.vim.org/script.php?script_id=39 ++ ++" Documentation: ++" The documentation is in a separate file, matchit.txt . ++ ++" Credits: ++" Vim editor by Bram Moolenaar (Thanks, Bram!) ++" Original script and design by Raul Segura Acevedo ++" Support for comments by Douglas Potts ++" Support for back references and other improvements by Benji Fisher ++" Support for many languages by Johannes Zellner ++" Suggestions for improvement, bug reports, and support for additional ++" languages by Jordi-Albert Batalla, Neil Bird, Servatius Brandt, Mark ++" Collett, Stephen Wall, Dany St-Amant, Yuheng Xie, and Johannes Zellner. ++ ++" Debugging: ++" If you'd like to try the built-in debugging commands... ++" :MatchDebug to activate debugging for the current buffer ++" This saves the values of several key script variables as buffer-local ++" variables. See the MatchDebug() function, below, for details. ++ ++" TODO: I should think about multi-line patterns for b:match_words. ++" This would require an option: how many lines to scan (default 1). ++" This would be useful for Python, maybe also for *ML. ++" TODO: Maybe I should add a menu so that people will actually use some of ++" the features that I have implemented. ++" TODO: Eliminate the MultiMatch function. Add yet another argument to ++" Match_wrapper() instead. ++" TODO: Allow :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1' ++" TODO: Make backrefs safer by using '\V' (very no-magic). ++" TODO: Add a level of indirection, so that custom % scripts can use my ++" work but extend it. ++ ++" allow user to prevent loading ++" and prevent duplicate loading ++if exists("loaded_matchit") || &cp ++ finish ++endif ++let loaded_matchit = 1 ++let s:last_mps = "" ++let s:last_words = "" ++ ++let s:save_cpo = &cpo ++set cpo&vim ++ ++nnoremap % :call Match_wrapper('',1,'n') ++nnoremap g% :call Match_wrapper('',0,'n') ++vnoremap % :call Match_wrapper('',1,'v') m'gv`` ++vnoremap g% :call Match_wrapper('',0,'v') m'gv`` ++onoremap % v:call Match_wrapper('',1,'o') ++onoremap g% v:call Match_wrapper('',0,'o') ++ ++" Analogues of [{ and ]} using matching patterns: ++nnoremap [% :call MultiMatch("bW", "n") ++nnoremap ]% :call MultiMatch("W", "n") ++vmap [% [%m'gv`` ++vmap ]% ]%m'gv`` ++" vnoremap [% :call MultiMatch("bW", "v") m'gv`` ++" vnoremap ]% :call MultiMatch("W", "v") m'gv`` ++onoremap [% v:call MultiMatch("bW", "o") ++onoremap ]% v:call MultiMatch("W", "o") ++ ++" text object: ++vmap a% [%v]% ++ ++" Auto-complete mappings: (not yet "ready for prime time") ++" TODO Read :help write-plugin for the "right" way to let the user ++" specify a key binding. ++" let g:match_auto = '' ++" let g:match_autoCR = '' ++" if exists("g:match_auto") ++" execute "inoremap " . g:match_auto . ' x"=Autocomplete()Pls' ++" endif ++" if exists("g:match_autoCR") ++" execute "inoremap " . g:match_autoCR . ' =Autocomplete()' ++" endif ++" if exists("g:match_gthhoh") ++" execute "inoremap " . g:match_gthhoh . ' :call Gthhoh()' ++" endif " gthhoh = "Get the heck out of here!" ++ ++let s:notslash = '\\\@" ++ endif ++ " In s:CleanUp(), we may need to check whether the cursor moved forward. ++ let startline = line(".") ++ let startcol = col(".") ++ " Use default behavior if called with a count or if no patterns are defined. ++ if v:count ++ exe "normal! " . v:count . "%" ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ elseif !exists("b:match_words") || b:match_words == "" ++ silent! normal! % ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ end ++ ++ " First step: if not already done, set the script variables ++ " s:do_BR flag for whether there are backrefs ++ " s:pat parsed version of b:match_words ++ " s:all regexp based on s:pat and the default groups ++ " ++ " Allow b:match_words = "GetVimMatchWords()" . ++ if b:match_words =~ ":" ++ let match_words = b:match_words ++ else ++ execute "let match_words =" b:match_words ++ endif ++" Thanks to Preben "Peppe" Guldberg and Bram Moolenaar for this suggestion! ++ if (match_words != s:last_words) || (&mps != s:last_mps) || ++ \ exists("b:match_debug") ++ let s:last_words = match_words ++ let s:last_mps = &mps ++ if match_words !~ s:notslash . '\\\d' ++ let s:do_BR = 0 ++ let s:pat = match_words ++ else ++ let s:do_BR = 1 ++ let s:pat = s:ParseWords(match_words) ++ endif ++ " The next several lines were here before ++ " BF started messing with this script. ++ " quote the special chars in 'matchpairs', replace [,:] with \| and then ++ " append the builtin pairs (/*, */, #if, #ifdef, #else, #elif, #endif) ++ " let default = substitute(escape(&mps, '[$^.*~\\/?]'), '[,:]\+', ++ " \ '\\|', 'g').'\|\/\*\|\*\/\|#if\>\|#ifdef\>\|#else\>\|#elif\>\|#endif\>' ++ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . ++ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' ++ " s:all = pattern with all the keywords ++ let s:all = s:pat . (strlen(s:pat) ? "," : "") . default ++ let s:all = substitute(s:all, s:notslash . '\zs[,:]\+', '\\|', 'g') ++ let s:all = '\%(' . s:all . '\)' ++ " let s:all = '\%(' . substitute(s:all, '\\\ze[,:]', '', 'g') . '\)' ++ if exists("b:match_debug") ++ let b:match_pat = s:pat ++ endif ++ endif ++ ++ " Second step: set the following local variables: ++ " matchline = line on which the cursor started ++ " curcol = number of characters before match ++ " prefix = regexp for start of line to start of match ++ " suffix = regexp for end of match to end of line ++ " Require match to end on or after the cursor and prefer it to ++ " start on or before the cursor. ++ let matchline = getline(startline) ++ if a:word != '' ++ " word given ++ if a:word !~ s:all ++ echohl WarningMsg|echo 'Missing rule for word:"'.a:word.'"'|echohl NONE ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ endif ++ let matchline = a:word ++ let curcol = 0 ++ let prefix = '^\%(' ++ let suffix = '\)$' ++ " Now the case when "word" is not given ++ else " Find the match that ends on or after the cursor and set curcol. ++ let regexp = s:Wholematch(matchline, s:all, startcol-1) ++ let curcol = match(matchline, regexp) ++ let endcol = matchend(matchline, regexp) ++ let suf = strlen(matchline) - endcol ++ let prefix = (curcol ? '^.*\%' . (curcol + 1) . 'c\%(' : '^\%(') ++ let suffix = (suf ? '\)\%' . (endcol + 1) . 'c.*$' : '\)$') ++ " If the match comes from the defaults, bail out. ++ if matchline !~ prefix . ++ \ substitute(s:pat, s:notslash.'\zs[,:]\+', '\\|', 'g') . suffix ++ silent! norm! % ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ endif ++ endif ++ if exists("b:match_debug") ++ let b:match_match = matchstr(matchline, regexp) ++ let b:match_col = curcol+1 ++ endif ++ ++ " Third step: Find the group and single word that match, and the original ++ " (backref) versions of these. Then, resolve the backrefs. ++ " Set the following local variable: ++ " group = colon-separated list of patterns, one of which matches ++ " = ini:mid:fin or ini:fin ++ " ++ " Reconstruct the version with unresolved backrefs. ++ let patBR = substitute(match_words.',', ++ \ s:notslash.'\zs[,:]*,[,:]*', ',', 'g') ++ let patBR = substitute(patBR, s:notslash.'\zs:\{2,}', ':', 'g') ++ " Now, set group and groupBR to the matching group: 'if:endif' or ++ " 'while:endwhile' or whatever. A bit of a kluge: s:Choose() returns ++ " group . "," . groupBR, and we pick it apart. ++ let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) ++ let i = matchend(group, s:notslash . ",") ++ let groupBR = strpart(group, i) ++ let group = strpart(group, 0, i-1) ++ " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix ++ if s:do_BR " Do the hard part: resolve those backrefs! ++ let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++ endif ++ if exists("b:match_debug") ++ let b:match_wholeBR = groupBR ++ let i = matchend(groupBR, s:notslash . ":") ++ let b:match_iniBR = strpart(groupBR, 0, i-1) ++ endif ++ ++ " Fourth step: Set the arguments for searchpair(). ++ let i = matchend(group, s:notslash . ":") ++ let j = matchend(group, '.*' . s:notslash . ":") ++ let ini = strpart(group, 0, i-1) ++ let mid = substitute(strpart(group, i,j-i-1), s:notslash.'\zs:', '\\|', 'g') ++ let fin = strpart(group, j) ++ "Un-escape the remaining , and : characters. ++ let ini = substitute(ini, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ let mid = substitute(mid, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ let fin = substitute(fin, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ " searchpair() requires that these patterns avoid \(\) groups. ++ let ini = substitute(ini, s:notslash . '\zs\\(', '\\%(', 'g') ++ let mid = substitute(mid, s:notslash . '\zs\\(', '\\%(', 'g') ++ let fin = substitute(fin, s:notslash . '\zs\\(', '\\%(', 'g') ++ " Set mid. This is optimized for readability, not micro-efficiency! ++ if a:forward && matchline =~ prefix . fin . suffix ++ \ || !a:forward && matchline =~ prefix . ini . suffix ++ let mid = "" ++ endif ++ " Set flag. This is optimized for readability, not micro-efficiency! ++ if a:forward && matchline =~ prefix . fin . suffix ++ \ || !a:forward && matchline !~ prefix . ini . suffix ++ let flag = "bW" ++ else ++ let flag = "W" ++ endif ++ " Set skip. ++ if exists("b:match_skip") ++ let skip = b:match_skip ++ elseif exists("b:match_comment") " backwards compatibility and testing! ++ let skip = "r:" . b:match_comment ++ else ++ let skip = 's:comment\|string' ++ endif ++ let skip = s:ParseSkip(skip) ++ if exists("b:match_debug") ++ let b:match_ini = ini ++ let b:match_tail = (strlen(mid) ? mid.'\|' : '') . fin ++ endif ++ ++ " Fifth step: actually start moving the cursor and call searchpair(). ++ " Later, :execute restore_cursor to get to the original screen. ++ let restore_cursor = virtcol(".") . "|" ++ normal! g0 ++ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor ++ normal! H ++ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ execute restore_cursor ++ call cursor(0, curcol + 1) ++ " normal! 0 ++ " if curcol ++ " execute "normal!" . curcol . "l" ++ " endif ++ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on")) ++ let skip = "0" ++ else ++ execute "if " . skip . "| let skip = '0' | endif" ++ endif ++ let sp_return = searchpair(ini, mid, fin, flag, skip) ++ let final_position = "call cursor(" . line(".") . "," . col(".") . ")" ++ " Restore cursor position and original screen. ++ execute restore_cursor ++ normal! m' ++ if sp_return > 0 ++ execute final_position ++ endif ++ return s:CleanUp(restore_options, a:mode, startline, startcol, mid.'\|'.fin) ++endfun ++ ++" Restore options and do some special handling for Operator-pending mode. ++" The optional argument is the tail of the matching group. ++fun! s:CleanUp(options, mode, startline, startcol, ...) ++ execute "set" a:options ++ " Open folds, if appropriate. ++ if a:mode != "o" ++ if &foldopen =~ "percent" ++ normal! zv ++ endif ++ " In Operator-pending mode, we want to include the whole match ++ " (for example, d%). ++ " This is only a problem if we end up moving in the forward direction. ++ elseif (a:startline < line(".")) || ++ \ (a:startline == line(".") && a:startcol < col(".")) ++ if a:0 ++ " Check whether the match is a single character. If not, move to the ++ " end of the match. ++ let matchline = getline(".") ++ let currcol = col(".") ++ let regexp = s:Wholematch(matchline, a:1, currcol-1) ++ let endcol = matchend(matchline, regexp) ++ if endcol > currcol " This is NOT off by one! ++ execute "normal!" . (endcol - currcol) . "l" ++ endif ++ endif " a:0 ++ endif " a:mode != "o" && etc. ++ return 0 ++endfun ++ ++" Example (simplified HTML patterns): if ++" a:groupBR = '<\(\k\+\)>:' ++" a:prefix = '^.\{3}\(' ++" a:group = '<\(\k\+\)>:' ++" a:suffix = '\).\{2}$' ++" a:matchline = "12312" or "12312" ++" then extract "tag" from a:matchline and return ":" . ++fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++ if a:matchline !~ a:prefix . ++ \ substitute(a:group, s:notslash . '\zs:', '\\|', 'g') . a:suffix ++ return a:group ++ endif ++ let i = matchend(a:groupBR, s:notslash . ':') ++ let ini = strpart(a:groupBR, 0, i-1) ++ let tailBR = strpart(a:groupBR, i) ++ let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix, ++ \ a:groupBR) ++ let i = matchend(word, s:notslash . ":") ++ let wordBR = strpart(word, i) ++ let word = strpart(word, 0, i-1) ++ " Now, a:matchline =~ a:prefix . word . a:suffix ++ if wordBR != ini ++ let table = s:Resolve(ini, wordBR, "table") ++ else ++ " let table = "----------" ++ let table = "" ++ let d = 0 ++ while d < 10 ++ if tailBR =~ s:notslash . '\\' . d ++ " let table[d] = d ++ let table = table . d ++ else ++ let table = table . "-" ++ endif ++ let d = d + 1 ++ endwhile ++ endif ++ let d = 9 ++ while d ++ if table[d] != "-" ++ let backref = substitute(a:matchline, a:prefix.word.a:suffix, ++ \ '\'.table[d], "") ++ " Are there any other characters that should be escaped? ++ let backref = escape(backref, '*,:') ++ execute s:Ref(ini, d, "start", "len") ++ let ini = strpart(ini, 0, start) . backref . strpart(ini, start+len) ++ let tailBR = substitute(tailBR, s:notslash . '\zs\\' . d, ++ \ escape(backref, '\\'), 'g') ++ endif ++ let d = d-1 ++ endwhile ++ if exists("b:match_debug") ++ if s:do_BR ++ let b:match_table = table ++ let b:match_word = word ++ else ++ let b:match_table = "" ++ let b:match_word = "" ++ endif ++ endif ++ return ini . ":" . tailBR ++endfun ++ ++" Input a comma-separated list of groups with backrefs, such as ++" a:groups = '\(foo\):end\1,\(bar\):end\1' ++" and return a comma-separated list of groups with backrefs replaced: ++" return '\(foo\):end\(foo\),\(bar\):end\(bar\)' ++fun! s:ParseWords(groups) ++ let groups = substitute(a:groups.",", s:notslash.'\zs[,:]*,[,:]*', ',', 'g') ++ let groups = substitute(groups, s:notslash . '\zs:\{2,}', ':', 'g') ++ let parsed = "" ++ while groups =~ '[^,:]' ++ let i = matchend(groups, s:notslash . ':') ++ let j = matchend(groups, s:notslash . ',') ++ let ini = strpart(groups, 0, i-1) ++ let tail = strpart(groups, i, j-i-1) . ":" ++ let groups = strpart(groups, j) ++ let parsed = parsed . ini ++ let i = matchend(tail, s:notslash . ':') ++ while i != -1 ++ " In 'if:else:endif', ini='if' and word='else' and then word='endif'. ++ let word = strpart(tail, 0, i-1) ++ let tail = strpart(tail, i) ++ let i = matchend(tail, s:notslash . ':') ++ let parsed = parsed . ":" . s:Resolve(ini, word, "word") ++ endwhile " Now, tail has been used up. ++ let parsed = parsed . "," ++ endwhile " groups =~ '[^,:]' ++ return parsed ++endfun ++ ++" TODO I think this can be simplified and/or made more efficient. ++" TODO What should I do if a:start is out of range? ++" Return a regexp that matches all of a:string, such that ++" matchstr(a:string, regexp) represents the match for a:pat that starts ++" as close to a:start as possible, before being preferred to after, and ++" ends after a:start . ++" Usage: ++" let regexp = s:Wholematch(getline("."), 'foo\|bar', col(".")-1) ++" let i = match(getline("."), regexp) ++" let j = matchend(getline("."), regexp) ++" let match = matchstr(getline("."), regexp) ++fun! s:Wholematch(string, pat, start) ++ let group = '\%(' . a:pat . '\)' ++ let prefix = (a:start ? '\(^.*\%<' . (a:start + 2) . 'c\)\zs' : '^') ++ let len = strlen(a:string) ++ let suffix = (a:start+1 < len ? '\(\%>'.(a:start+1).'c.*$\)\@=' : '$') ++ if a:string !~ prefix . group . suffix ++ let prefix = '' ++ endif ++ return prefix . group . suffix ++endfun ++ ++" No extra arguments: s:Ref(string, d) will ++" find the d'th occurrence of '\(' and return it, along with everything up ++" to and including the matching '\)'. ++" One argument: s:Ref(string, d, "start") returns the index of the start ++" of the d'th '\(' and any other argument returns the length of the group. ++" Two arguments: s:Ref(string, d, "foo", "bar") returns a string to be ++" executed, having the effect of ++" :let foo = s:Ref(string, d, "start") ++" :let bar = s:Ref(string, d, "len") ++fun! s:Ref(string, d, ...) ++ let len = strlen(a:string) ++ if a:d == 0 ++ let start = 0 ++ else ++ let cnt = a:d ++ let match = a:string ++ while cnt ++ let cnt = cnt - 1 ++ let index = matchend(match, s:notslash . '\\(') ++ if index == -1 ++ return "" ++ endif ++ let match = strpart(match, index) ++ endwhile ++ let start = len - strlen(match) ++ if a:0 == 1 && a:1 == "start" ++ return start - 2 ++ endif ++ let cnt = 1 ++ while cnt ++ let index = matchend(match, s:notslash . '\\(\|\\)') - 1 ++ if index == -2 ++ return "" ++ endif ++ " Increment if an open, decrement if a ')': ++ let cnt = cnt + (match[index]=="(" ? 1 : -1) " ')' ++ " let cnt = stridx('0(', match[index]) + cnt ++ let match = strpart(match, index+1) ++ endwhile ++ let start = start - 2 ++ let len = len - start - strlen(match) ++ endif ++ if a:0 == 1 ++ return len ++ elseif a:0 == 2 ++ return "let " . a:1 . "=" . start . "| let " . a:2 . "=" . len ++ else ++ return strpart(a:string, start, len) ++ endif ++endfun ++ ++" Count the number of disjoint copies of pattern in string. ++" If the pattern is a literal string and contains no '0' or '1' characters ++" then s:Count(string, pattern, '0', '1') should be faster than ++" s:Count(string, pattern). ++fun! s:Count(string, pattern, ...) ++ let pat = escape(a:pattern, '\\') ++ if a:0 > 1 ++ let foo = substitute(a:string, '[^'.a:pattern.']', "a:1", "g") ++ let foo = substitute(a:string, pat, a:2, "g") ++ let foo = substitute(foo, '[^' . a:2 . ']', "", "g") ++ return strlen(foo) ++ endif ++ let result = 0 ++ let foo = a:string ++ let index = matchend(foo, pat) ++ while index != -1 ++ let result = result + 1 ++ let foo = strpart(foo, index) ++ let index = matchend(foo, pat) ++ endwhile ++ return result ++endfun ++ ++" s:Resolve('\(a\)\(b\)', '\(c\)\2\1\1\2') should return table.word, where ++" word = '\(c\)\(b\)\(a\)\3\2' and table = '-32-------'. That is, the first ++" '\1' in target is replaced by '\(a\)' in word, table[1] = 3, and this ++" indicates that all other instances of '\1' in target are to be replaced ++" by '\3'. The hard part is dealing with nesting... ++" Note that ":" is an illegal character for source and target, ++" unless it is preceded by "\". ++fun! s:Resolve(source, target, output) ++ let word = a:target ++ let i = matchend(word, s:notslash . '\\\d') - 1 ++ let table = "----------" ++ while i != -2 " There are back references to be replaced. ++ let d = word[i] ++ let backref = s:Ref(a:source, d) ++ " The idea is to replace '\d' with backref. Before we do this, ++ " replace any \(\) groups in backref with :1, :2, ... if they ++ " correspond to the first, second, ... group already inserted ++ " into backref. Later, replace :1 with \1 and so on. The group ++ " number w+b within backref corresponds to the group number ++ " s within a:source. ++ " w = number of '\(' in word before the current one ++ let w = s:Count( ++ \ substitute(strpart(word, 0, i-1), '\\\\', '', 'g'), '\(', '1') ++ let b = 1 " number of the current '\(' in backref ++ let s = d " number of the current '\(' in a:source ++ while b <= s:Count(substitute(backref, '\\\\', '', 'g'), '\(', '1') ++ \ && s < 10 ++ if table[s] == "-" ++ if w + b < 10 ++ " let table[s] = w + b ++ let table = strpart(table, 0, s) . (w+b) . strpart(table, s+1) ++ endif ++ let b = b + 1 ++ let s = s + 1 ++ else ++ execute s:Ref(backref, b, "start", "len") ++ let ref = strpart(backref, start, len) ++ let backref = strpart(backref, 0, start) . ":". table[s] ++ \ . strpart(backref, start+len) ++ let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1') ++ endif ++ endwhile ++ let word = strpart(word, 0, i-1) . backref . strpart(word, i+1) ++ let i = matchend(word, s:notslash . '\\\d') - 1 ++ endwhile ++ let word = substitute(word, s:notslash . '\zs:', '\\', 'g') ++ if a:output == "table" ++ return table ++ elseif a:output == "word" ++ return word ++ else ++ return table . word ++ endif ++endfun ++ ++" Assume a:comma = ",". Then the format for a:patterns and a:1 is ++" a:patterns = ",,..." ++" a:1 = ",,..." ++" If is the first pattern that matches a:string then return ++" if no optional arguments are given; return , if a:1 is given. ++fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...) ++ let tail = (a:patterns =~ a:comma."$" ? a:patterns : a:patterns . a:comma) ++ let i = matchend(tail, s:notslash . a:comma) ++ if a:0 ++ let alttail = (a:1 =~ a:comma."$" ? a:1 : a:1 . a:comma) ++ let j = matchend(alttail, s:notslash . a:comma) ++ endif ++ let current = strpart(tail, 0, i-1) ++ if a:branch == "" ++ let currpat = current ++ else ++ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') ++ endif ++ while a:string !~ a:prefix . currpat . a:suffix ++ let tail = strpart(tail, i) ++ let i = matchend(tail, s:notslash . a:comma) ++ if i == -1 ++ return -1 ++ endif ++ let current = strpart(tail, 0, i-1) ++ if a:branch == "" ++ let currpat = current ++ else ++ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') ++ endif ++ if a:0 ++ let alttail = strpart(alttail, j) ++ let j = matchend(alttail, s:notslash . a:comma) ++ endif ++ endwhile ++ if a:0 ++ let current = current . a:comma . strpart(alttail, 0, j-1) ++ endif ++ return current ++endfun ++ ++" Call this function to turn on debugging information. Every time the main ++" script is run, buffer variables will be saved. These can be used directly ++" or viewed using the menu items below. ++if !exists(":MatchDebug") ++ command! -nargs=0 MatchDebug call s:Match_debug() ++endif ++ ++fun! s:Match_debug() ++ let b:match_debug = 1 " Save debugging information. ++ " pat = all of b:match_words with backrefs parsed ++ amenu &Matchit.&pat :echo b:match_pat ++ " match = bit of text that is recognized as a match ++ amenu &Matchit.&match :echo b:match_match ++ " curcol = cursor column of the start of the matching text ++ amenu &Matchit.&curcol :echo b:match_col ++ " wholeBR = matching group, original version ++ amenu &Matchit.wh&oleBR :echo b:match_wholeBR ++ " iniBR = 'if' piece, original version ++ amenu &Matchit.ini&BR :echo b:match_iniBR ++ " ini = 'if' piece, with all backrefs resolved from match ++ amenu &Matchit.&ini :echo b:match_ini ++ " tail = 'else\|endif' piece, with all backrefs resolved from match ++ amenu &Matchit.&tail :echo b:match_tail ++ " fin = 'endif' piece, with all backrefs resolved from match ++ amenu &Matchit.&word :echo b:match_word ++ " '\'.d in ini refers to the same thing as '\'.table[d] in word. ++ amenu &Matchit.t&able :echo '0:' . b:match_table . ':9' ++endfun ++ ++" Jump to the nearest unmatched "(" or "if" or "" if a:spflag == "bW" ++" or the nearest unmatched "" or "endif" or ")" if a:spflag == "W". ++" Return a "mark" for the original position, so that ++" let m = MultiMatch("bW", "n") ... execute m ++" will return to the original position. If there is a problem, do not ++" move the cursor and return "", unless a count is given, in which case ++" go up or down as many levels as possible and again return "". ++" TODO This relies on the same patterns as % matching. It might be a good ++" idea to give it its own matching patterns. ++fun! s:MultiMatch(spflag, mode) ++ if !exists("b:match_words") || b:match_words == "" ++ return "" ++ end ++ let restore_options = (&ic ? "" : "no") . "ignorecase" ++ if exists("b:match_ignorecase") ++ let &ignorecase = b:match_ignorecase ++ endif ++ let startline = line(".") ++ let startcol = col(".") ++ ++ " First step: if not already done, set the script variables ++ " s:do_BR flag for whether there are backrefs ++ " s:pat parsed version of b:match_words ++ " s:all regexp based on s:pat and the default groups ++ " This part is copied and slightly modified from s:Match_wrapper(). ++ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . ++ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' ++ " Allow b:match_words = "GetVimMatchWords()" . ++ if b:match_words =~ ":" ++ let match_words = b:match_words ++ else ++ execute "let match_words =" b:match_words ++ endif ++ if (match_words != s:last_words) || (&mps != s:last_mps) || ++ \ exists("b:match_debug") ++ let s:last_words = match_words ++ let s:last_mps = &mps ++ if match_words !~ s:notslash . '\\\d' ++ let s:do_BR = 0 ++ let s:pat = match_words ++ else ++ let s:do_BR = 1 ++ let s:pat = s:ParseWords(match_words) ++ endif ++ let s:all = '\%(' . substitute(s:pat . (strlen(s:pat)?",":"") . default, ++ \ '[,:]\+','\\|','g') . '\)' ++ if exists("b:match_debug") ++ let b:match_pat = s:pat ++ endif ++ endif ++ ++ " Second step: figure out the patterns for searchpair() ++ " and save the screen, cursor position, and 'ignorecase'. ++ " - TODO: A lot of this is copied from s:Match_wrapper(). ++ " - maybe even more functionality should be split off ++ " - into separate functions! ++ let cdefault = (s:pat =~ '[^,]$' ? "," : "") . default ++ let open = substitute(s:pat . cdefault, ++ \ s:notslash . '\zs:.\{-}' . s:notslash . ',', '\\),\\(', 'g') ++ let open = '\(' . substitute(open, s:notslash . '\zs:.*$', '\\)', '') ++ let close = substitute(s:pat . cdefault, ++ \ s:notslash . '\zs,.\{-}' . s:notslash . ':', '\\),\\(', 'g') ++ let close = substitute(close, '^.\{-}' . s:notslash . ':', '\\(', '') . '\)' ++ if exists("b:match_skip") ++ let skip = b:match_skip ++ elseif exists("b:match_comment") " backwards compatibility and testing! ++ let skip = "r:" . b:match_comment ++ else ++ let skip = 's:comment\|string' ++ endif ++ let skip = s:ParseSkip(skip) ++ " let restore_cursor = line(".") . "G" . virtcol(".") . "|" ++ " normal! H ++ " let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ let restore_cursor = virtcol(".") . "|" ++ normal! g0 ++ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor ++ normal! H ++ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ execute restore_cursor ++ ++ " Third step: call searchpair(). ++ " Replace '\('--but not '\\('--with '\%(' and ',' with '\|'. ++ let openpat = substitute(open, '\(\\\@" or ... ++" and return "endif" or "endwhile" or "" or ... . ++" For now, this uses b:match_words and the same script variables ++" as s:Match_wrapper() . Later, it may get its own patterns, ++" either from a buffer variable or passed as arguments. ++" fun! s:Autocomplete() ++" echo "autocomplete not yet implemented :-(" ++" if !exists("b:match_words") || b:match_words == "" ++" return "" ++" end ++" let startpos = s:MultiMatch("bW") ++" ++" if startpos == "" ++" return "" ++" endif ++" " - TODO: figure out whether 'if' or '' matched, and construct ++" " - the appropriate closing. ++" let matchline = getline(".") ++" let curcol = col(".") - 1 ++" " - TODO: Change the s:all argument if there is a new set of match pats. ++" let regexp = s:Wholematch(matchline, s:all, curcol) ++" let suf = strlen(matchline) - matchend(matchline, regexp) ++" let prefix = (curcol ? '^.\{' . curcol . '}\%(' : '^\%(') ++" let suffix = (suf ? '\).\{' . suf . '}$' : '\)$') ++" " Reconstruct the version with unresolved backrefs. ++" let patBR = substitute(b:match_words.',', '[,:]*,[,:]*', ',', 'g') ++" let patBR = substitute(patBR, ':\{2,}', ':', "g") ++" " Now, set group and groupBR to the matching group: 'if:endif' or ++" " 'while:endwhile' or whatever. ++" let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) ++" let i = matchend(group, s:notslash . ",") ++" let groupBR = strpart(group, i) ++" let group = strpart(group, 0, i-1) ++" " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix ++" if s:do_BR ++" let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++" endif ++" " let g:group = group ++" ++" " - TODO: Construct the closing from group. ++" let fake = "end" . expand("") ++" execute startpos ++" return fake ++" endfun ++ ++" Close all open structures. "Get the heck out of here!" ++" fun! s:Gthhoh() ++" let close = s:Autocomplete() ++" while strlen(close) ++" put=close ++" let close = s:Autocomplete() ++" endwhile ++" endfun ++ ++" Parse special strings as typical skip arguments for searchpair(): ++" s:foo becomes (current syntax item) =~ foo ++" S:foo becomes (current syntax item) !~ foo ++" r:foo becomes (line before cursor) =~ foo ++" R:foo becomes (line before cursor) !~ foo ++fun! s:ParseSkip(str) ++ let skip = a:str ++ if skip[1] == ":" ++ if skip[0] == "s" ++ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" . ++ \ strpart(skip,2) . "'" ++ elseif skip[0] == "S" ++ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" . ++ \ strpart(skip,2) . "'" ++ elseif skip[0] == "r" ++ let skip = "strpart(getline('.'),0,col('.'))=~'" . strpart(skip,2). "'" ++ elseif skip[0] == "R" ++ let skip = "strpart(getline('.'),0,col('.'))!~'" . strpart(skip,2). "'" ++ endif ++ endif ++ return skip ++endfun ++ ++let &cpo = s:save_cpo ++ ++" vim:sts=2:sw=2: +diff -urN vim71/runtime/plugin/NERD_commenter.vim vim71_ada/runtime/plugin/NERD_commenter.vim +--- vim71/runtime/plugin/NERD_commenter.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/plugin/NERD_commenter.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,4553 @@ ++" vim global plugin that provides easy code commenting for various file types ++" Last Change: 29 sep 2007 ++" Maintainer: Martin Grenfell ++let s:NERD_commenter_version = 2.1.4 ++ ++" For help documentation type :help NERDCommenter. If this fails, Restart vim ++" and try again. If it sill doesnt work... the help page is at the bottom ++" of this file. ++ ++" Section: script init stuff {{{1 ++if exists("loaded_nerd_comments") ++ finish ++endif ++if v:version < 700 ++ echoerr "NERDCommenter: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!" ++ finish ++endif ++let loaded_nerd_comments = 1 ++ ++" Section: spaces init {{{2 ++" Occasionally we need to grab a string of spaces so just make one here ++let s:spaces = "" ++while strlen(s:spaces) < 100 ++ let s:spaces = s:spaces . " " ++endwhile ++ ++" Function: s:InitVariable() function {{{2 ++" This function is used to initialise a given variable to a given value. The ++" variable is only initialised if it does not exist prior ++" ++" Args: ++" -var: the name of the var to be initialised ++" -value: the value to initialise var to ++" ++" Returns: ++" 1 if the var is set, 0 otherwise ++function s:InitVariable(var, value) ++ if !exists(a:var) ++ exec 'let ' . a:var . ' = ' . "'" . a:value . "'" ++ return 1 ++ endif ++ return 0 ++endfunction ++ ++" Section: space string init{{{2 ++" When putting spaces after the left delim and before the right we use ++" s:spaceStr for the space char. This way we can make it add anything after ++" the left and before the right by modifying this variable ++let s:spaceStr = ' ' ++let s:lenSpaceStr = strlen(s:spaceStr) ++ ++" Section: variable init calls {{{2 ++call s:InitVariable("g:NERDAllowAnyVisualDelims", 1) ++call s:InitVariable("g:NERDBlockComIgnoreEmpty", 0) ++call s:InitVariable("g:NERDCommentWholeLinesInVMode", 0) ++call s:InitVariable("g:NERDCompactSexyComs", 0) ++call s:InitVariable("g:NERDDefaultNesting", 0) ++call s:InitVariable("g:NERDMenuMode", 3) ++call s:InitVariable("g:NERDLPlace", "[>") ++call s:InitVariable("g:NERDUsePlaceHolders", 1) ++call s:InitVariable("g:NERDRemoveAltComs", 1) ++call s:InitVariable("g:NERDRemoveExtraSpaces", 0) ++call s:InitVariable("g:NERDRPlace", "<]") ++call s:InitVariable("g:NERDShutUp", '0') ++call s:InitVariable("g:NERDSpaceDelims", 0) ++call s:InitVariable("g:NERDDelimiterRequests", 1) ++ ++call s:InitVariable("g:NERDMapleader", ',c') ++ ++call s:InitVariable("g:NERDAltComMap", g:NERDMapleader . 'a') ++call s:InitVariable("g:NERDAppendComMap", g:NERDMapleader . 'A') ++call s:InitVariable("g:NERDComAlignBothMap", g:NERDMapleader . 'b') ++call s:InitVariable("g:NERDComAlignLeftMap", g:NERDMapleader . 'l') ++call s:InitVariable("g:NERDComAlignRightMap", g:NERDMapleader . 'r') ++call s:InitVariable("g:NERDComInInsertMap", '') ++call s:InitVariable("g:NERDComLineInvertMap", g:NERDMapleader . 'i') ++call s:InitVariable("g:NERDComLineMap", g:NERDMapleader . 'c') ++call s:InitVariable("g:NERDComLineNestMap", g:NERDMapleader . 'n') ++call s:InitVariable("g:NERDComLineSexyMap", g:NERDMapleader . 's') ++call s:InitVariable("g:NERDComLineToggleMap", g:NERDMapleader . '') ++call s:InitVariable("g:NERDComLineMinimalMap", g:NERDMapleader . 'm') ++call s:InitVariable("g:NERDComLineYankMap", g:NERDMapleader . 'y') ++call s:InitVariable("g:NERDComToEOLMap", g:NERDMapleader . '$') ++call s:InitVariable("g:NERDPrependComMap", g:NERDMapleader . 'I') ++call s:InitVariable("g:NERDUncomLineMap", g:NERDMapleader . 'u') ++let s:NERDFileNameEscape="[]#*$%'\" ?`!&();<>\\" ++ ++" Section: Comment mapping functions, autocommands and commands {{{1 ++" ============================================================================ ++" Section: Comment enabler autocommands {{{2 ++" ============================================================================ ++ ++if !exists("nerd_autocmds_loaded") ++ let nerd_autocmds_loaded=1 ++ ++ augroup commentEnablers ++ ++ "if the user enters a buffer or reads a buffer then we gotta set up ++ "the comment delimiters for that new filetype ++ autocmd BufEnter,BufRead * :call s:SetUpForNewFiletype(&filetype, 0) ++ ++ "if the filetype of a buffer changes, force the script to reset the ++ "delims for the buffer ++ autocmd Filetype * :call s:SetUpForNewFiletype(&filetype, 1) ++ augroup END ++ ++endif ++ ++ ++" Function: s:SetUpForNewFiletype(filetype) function {{{2 ++" This function is responsible for setting up buffer scoped variables for the ++" given filetype. ++" ++" These variables include the comment delimiters for the given filetype and calls ++" MapDelimiters or MapDelimitersWithAlternative passing in these delimiters. ++" ++" Args: ++" -filetype: the filetype to set delimiters for ++" -forceReset: 1 if the delimiters should be reset if they have already be ++" set for this buffer. ++" ++function s:SetUpForNewFiletype(filetype, forceReset) ++ "if we have already set the delimiters for this buffer then dont go thru ++ "it again ++ if !a:forceReset && exists("b:left") && b:left != '' ++ return ++ endif ++ ++ let b:sexyComMarker = '' ++ ++ "check the filetype against all known filetypes to see if we have ++ "hardcoded the comment delimiters to use ++ if a:filetype == "" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "abaqus" ++ call s:MapDelimiters('**', '') ++ elseif a:filetype == "abc" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "acedb" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "ada" ++ call s:MapDelimitersWithAlternative('--','', '-- ', '') ++ elseif a:filetype == "ahdl" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "ahk" ++ call s:MapDelimitersWithAlternative(';', '', '/*', '*/') ++ elseif a:filetype == "amiga" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "aml" ++ call s:MapDelimiters('/*', '') ++ elseif a:filetype == "ampl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ant" ++ call s:MapDelimiters('') ++ elseif a:filetype == "apache" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "apachestyle" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "asm68k" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "asm" ++ call s:MapDelimitersWithAlternative(';', '', '#', '') ++ elseif a:filetype == "asn" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "aspvbs" ++ call s:MapDelimiters('''', '') ++ elseif a:filetype == "atlas" ++ call s:MapDelimiters('C','$') ++ elseif a:filetype == "autohotkey" ++ call s:MapDelimiters(';','') ++ elseif a:filetype == "autoit" ++ call s:MapDelimiters(';','') ++ elseif a:filetype == "automake" ++ call s:MapDelimitersWithAlternative('#','', 'dnl ', '') ++ elseif a:filetype == "ave" ++ call s:MapDelimiters("'",'') ++ elseif a:filetype == "awk" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "basic" ++ call s:MapDelimitersWithAlternative("'",'', 'REM ', '') ++ elseif a:filetype == "b" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "bc" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "bdf" ++ call s:MapDelimiters('COMMENT ', '') ++ elseif a:filetype == "bib" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "bindzone" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "bst" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "btm" ++ call s:MapDelimiters('::', '') ++ elseif a:filetype == "caos" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "catalog" ++ call s:MapDelimiters('--','--') ++ elseif a:filetype == "c" ++ call s:MapDelimitersWithAlternative('/*','*/', '//', '') ++ elseif a:filetype == "cfg" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "cg" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "ch" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "changelog" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "cl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "clean" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "clipper" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "cmake" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "conf" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "config" ++ call s:MapDelimiters('dnl ', '') ++ elseif a:filetype == "context" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "cpp" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "crontab" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "cs" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "csc" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "csp" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "css" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "cterm" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "cupl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "csv" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "cvs" ++ call s:MapDelimiters('CVS:','') ++ elseif a:filetype == "dcl" ++ call s:MapDelimiters('$!', '') ++ elseif a:filetype == "debchangelog" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "debcontrol" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "debsources" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "def" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "desktop" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "diff" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "django" ++ call s:MapDelimitersWithAlternative('', '{#', '#}') ++ elseif a:filetype == "docbk" ++ call s:MapDelimiters('') ++ elseif a:filetype == "dns" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dosbatch" ++ call s:MapDelimiters('REM ','') ++ elseif a:filetype == "dosini" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dot" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "dracula" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dsl" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "dtd" ++ call s:MapDelimiters('') ++ elseif a:filetype == "dtml" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "dylan" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == 'ebuild' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ecd" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == 'eclass' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "eiffel" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "elf" ++ call s:MapDelimiters("'", '') ++ elseif a:filetype == "elmfilt" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "erlang" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "eruby" ++ call s:MapDelimitersWithAlternative('', '<%#', '%>') ++ elseif a:filetype == "eterm" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "expect" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "exports" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fetchmail" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fgl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "focexec" ++ call s:MapDelimiters('-*', '') ++ elseif a:filetype == "form" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "fortran" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "foxpro" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "fstab" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fvwm" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "fx" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "gams" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "gdb" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "gdmo" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "geek" ++ call s:MapDelimiters('GEEK_COMMENT:', '') ++ elseif a:filetype == 'gentoo-package-keywords' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == 'gentoo-package-mask' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == 'gentoo-package-use' ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "gnuplot" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "groovy" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "gtkrc" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "haskell" ++ call s:MapDelimitersWithAlternative('--','', '{-', '-}') ++ elseif a:filetype == "hb" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "h" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "help" ++ call s:MapDelimiters('"','') ++ elseif a:filetype == "hercules" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "hog" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "html" ++ call s:MapDelimitersWithAlternative('', '//', '') ++ elseif a:filetype == "htmldjango" ++ call s:MapDelimitersWithAlternative('', '{#', '#}') ++ elseif a:filetype == "htmlos" ++ call s:MapDelimiters('#','/#') ++ elseif a:filetype == "ia64" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "icon" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "idlang" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "idl" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "indent" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "inform" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "inittab" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ishd" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "iss" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "ist" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "jam" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "java" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "javascript" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "jess" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "jgraph" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "jproperties" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "jsp" ++ call s:MapDelimiters('<%--', '--%>') ++ elseif a:filetype == "kconfig" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "kix" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "kscript" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "lace" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "ldif" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lex" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "lftp" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lifelines" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "lilo" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lisp" ++ call s:MapDelimitersWithAlternative(';','', '#|', '|#') ++ elseif a:filetype == "lite" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "lookupfile" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "lotos" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "lout" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lprolog" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "lscript" ++ call s:MapDelimiters("'", '') ++ elseif a:filetype == "lss" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "lua" ++ call s:MapDelimitersWithAlternative('--','', '--[[', ']]') ++ elseif a:filetype == "lynx" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "m4" ++ call s:MapDelimiters('dnl ', '') ++ elseif a:filetype == "mail" ++ call s:MapDelimiters('> ','') ++ elseif a:filetype == "make" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "maple" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "masm" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "master" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "matlab" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "mel" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "mf" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "mib" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "mma" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "model" ++ call s:MapDelimiters('$','$') ++ elseif a:filetype =~ "moduala." ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "modula2" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "modula3" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "monk" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "mush" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "muttrc" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "named" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "nasm" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "nastran" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "natural" ++ call s:MapDelimiters('/*', '') ++ elseif a:filetype == "ncf" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "netdict" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "netrw" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "nqc" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "nroff" ++ call s:MapDelimiters('\"', '') ++ elseif a:filetype == "nsis" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "objc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "ocaml" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "occam" ++ call s:MapDelimiters('--','') ++ elseif a:filetype == "omlet" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "omnimark" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "openroad" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "opl" ++ call s:MapDelimiters("REM", "") ++ elseif a:filetype == "ora" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "otl" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "ox" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "pascal" ++ call s:MapDelimitersWithAlternative('{','}', '(*', '*)') ++ elseif a:filetype == "passwd" ++ call s:MapDelimitersWith('','') ++ elseif a:filetype == "pcap" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "pccts" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "perl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "pfmain" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "php" ++ call s:MapDelimitersWithAlternative('//','','/*', '*/') ++ elseif a:filetype == "phtml" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "pic" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "pike" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "pilrc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "pine" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "plaintex" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "plm" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "plsql" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "po" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "postscr" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "pov" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "povini" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "ppd" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "ppwiz" ++ call s:MapDelimiters(';;', '') ++ elseif a:filetype == "procmail" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "progress" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "prolog" ++ call s:MapDelimitersWithAlternative('%','','/*','*/') ++ elseif a:filetype == "psf" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "ptcap" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "python" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "qf" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "radiance" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "Rails-log" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "ratpoison" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "r" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "readline" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rebol" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "registry" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "remind" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rexx" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "robots" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "rpl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "rst" ++ call s:MapDelimiters('..', '') ++ elseif a:filetype == "rtf" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "ruby" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "sa" ++ call s:MapDelimiters('--','') ++ elseif a:filetype == "samba" ++ call s:MapDelimitersWithAlternative(';','', '#', '') ++ elseif a:filetype == "sas" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "sass" ++ call s:MapDelimitersWithAlternative('//','', '/*', '') ++ elseif a:filetype == "sather" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "scheme" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "scilab" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "screen" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "scsh" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "sdl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "sed" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "selectbuf" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "sgml" ++ call s:MapDelimiters('') ++ elseif a:filetype == "sgmldecl" ++ call s:MapDelimiters('--','--') ++ elseif a:filetype == "sgmllnx" ++ call s:MapDelimiters('') ++ elseif a:filetype == "sicad" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "simula" ++ call s:MapDelimitersWithAlternative('%', '', '--', '') ++ elseif a:filetype == "sinda" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "skill" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "slang" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "sl" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "slrnrc" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "sm" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "smarty" ++ call s:MapDelimiters('{*', '*}') ++ elseif a:filetype == "smil" ++ call s:MapDelimiters('') ++ elseif a:filetype == "smith" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "sml" ++ call s:MapDelimiters('(*','*)') ++ elseif a:filetype == "snnsnet" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "snnspat" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "snnsres" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "snobol4" ++ call s:MapDelimiters('*', '') ++ elseif a:filetype == "spec" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "specman" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "spice" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "sql" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "sqlforms" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "sqlj" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "sqr" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "squid" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "st" ++ call s:MapDelimiters('"','') ++ elseif a:filetype == "stp" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "strace" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "svn" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "SVNcommitlog" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "systemverilog" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "tads" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "taglist" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "tags" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "tak" ++ call s:MapDelimiters('$', '') ++ elseif a:filetype == "tasm" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "tcl" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "terminfo" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "tex" ++ call s:MapDelimiters('%','') ++ elseif a:filetype == "text" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "texinfo" ++ call s:MapDelimiters("@c ", "") ++ elseif a:filetype == "texmf" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "tf" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "tidy" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "tli" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "trasys" ++ call s:MapDelimiters("$", "") ++ elseif a:filetype == "tsalt" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "tsscl" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "tssgm" ++ call s:MapDelimiters("comment = '","'") ++ elseif a:filetype == "uc" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "uil" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "vb" ++ call s:MapDelimiters("'","") ++ elseif a:filetype == "vcscommit" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "vera" ++ call s:MapDelimitersWithAlternative('/*','*/','//','') ++ elseif a:filetype == "verilog" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "verilog_systemverilog" ++ call s:MapDelimitersWithAlternative('//','', '/*','*/') ++ elseif a:filetype == "vgrindefs" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "vhdl" ++ call s:MapDelimiters('--', '') ++ elseif a:filetype == "vim" ++ call s:MapDelimiters('"','') ++ elseif a:filetype == "viminfo" ++ call s:MapDelimiters('','') ++ elseif a:filetype == "virata" ++ call s:MapDelimiters('%', '') ++ elseif a:filetype == "vo_base" ++ call s:MapDelimiters('', '') ++ elseif a:filetype == "vrml" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "vsejcl" ++ call s:MapDelimiters('/*', '') ++ elseif a:filetype == "webmacro" ++ call s:MapDelimiters('##', '') ++ elseif a:filetype == "wget" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "winbatch" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "wml" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype =~ "[^w]*sh" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "wvdial" ++ call s:MapDelimiters(';', '') ++ elseif a:filetype == "xdefaults" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "xf86conf" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "xhtml" ++ call s:MapDelimiters('') ++ elseif a:filetype == "xkb" ++ call s:MapDelimiters('//', '') ++ elseif a:filetype == "xmath" ++ call s:MapDelimiters('#', '') ++ elseif a:filetype == "xml" ++ call s:MapDelimiters('') ++ elseif a:filetype == "xmodmap" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "xpm2" ++ call s:MapDelimiters('!', '') ++ elseif a:filetype == "xpm" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "xsd" ++ call s:MapDelimiters('') ++ elseif a:filetype == "xslt" ++ call s:MapDelimiters('') ++ elseif a:filetype == "yacc" ++ call s:MapDelimiters('/*','*/') ++ elseif a:filetype == "yaml" ++ call s:MapDelimiters('#','') ++ elseif a:filetype == "z8a" ++ call s:MapDelimiters(';', '') ++ ++ elseif a:filetype == "" ++ call s:MapDelimitersWithAlternative("","", "", "") ++ ++ "we have not hardcoded the comment delimiters to use for this filetype so ++ "get them from &commentstring. ++ else ++ "print a disclaimer to the user :) ++ if !g:NERDShutUp ++ call s:NerdEcho("Unknown filetype '".a:filetype."', setting delimiters by &commentstring.\nPleeeeease email the author of the NERD commenter with this filetype\nand its delimiters!", 0) ++ endif ++ ++ "extract the delims from &commentstring ++ let left= substitute(&commentstring, '\(.*\)%s.*', '\1', '') ++ let right= substitute(&commentstring, '.*%s\(.*\)', '\1', 'g') ++ ++ call s:MapDelimiters(left,right) ++ endif ++endfunction ++ ++" Function: s:MapDelimiters(left, right) function {{{2 ++" This function is a wrapper for s:MapDelimiters(left, right, leftAlt, rightAlt, useAlt) and is called when there ++" is no alternative comment delimiters for the current filetype ++" ++" Args: ++" -left: the left comment delimiter ++" -right: the right comment delimiter ++function s:MapDelimiters(left, right) ++ call s:MapDelimitersWithAlternative(a:left, a:right, "", "") ++endfunction ++ ++" Function: s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) function {{{2 ++" this function sets up the comment delimiter buffer variables ++" ++" Args: ++" -left: the string defining the comment start delimiter ++" -right: the string defining the comment end delimiter ++" -leftAlt: the string for the alternative comment style defining the comment start delimiter ++" -rightAlt: the string for the alternative comment style defining the comment end delimiter ++function s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) ++ if !exists('g:NERD_' . &filetype . '_alt_style') ++ let b:left = a:left ++ let b:right = a:right ++ let b:leftAlt = a:leftAlt ++ let b:rightAlt = a:rightAlt ++ else ++ let b:left = a:leftAlt ++ let b:right = a:rightAlt ++ let b:leftAlt = a:left ++ let b:rightAlt = a:right ++ endif ++endfunction ++ ++" Function: s:SwitchToAlternativeDelimiters(printMsgs) function {{{2 ++" This function is used to swap the delimiters that are being used to the ++" alternative delimiters for that filetype. For example, if a c++ file is ++" being edited and // comments are being used, after this function is called ++" /**/ comments will be used. ++" ++" Args: ++" -printMsgs: if this is 1 then a message is echoed to the user telling them ++" if this function changed the delimiters or not ++function s:SwitchToAlternativeDelimiters(printMsgs) ++ "if both of the alternative delimiters are empty then there is no ++ "alternative comment style so bail out ++ if !s:HasMultipartDelims() ++ if a:printMsgs ++ call s:NerdEcho("Cannot use alternative delimiters, none are specified", 0) ++ endif ++ return 0 ++ endif ++ ++ "save the current delimiters ++ let tempLeft = b:left ++ let tempRight = b:right ++ ++ "swap current delimiters for alternative ++ let b:left = b:leftAlt ++ let b:right = b:rightAlt ++ ++ "set the previously current delimiters to be the new alternative ones ++ let b:leftAlt = tempLeft ++ let b:rightAlt = tempRight ++ ++ "tell the user what comment delimiters they are now using ++ if a:printMsgs ++ let leftNoEsc = b:left ++ let rightNoEsc = b:right ++ call s:NerdEcho("Now using " . leftNoEsc . " " . rightNoEsc . " to delimit comments", 1) ++ endif ++ ++ return 1 ++endfunction ++ ++" Section: Comment delimiter add/removal functions {{{1 ++" ============================================================================ ++" Function: s:AppendCommentToLine(){{{2 ++" This function appends comment delimiters at the EOL and places the cursor in ++" position to start typing the comment ++function s:AppendCommentToLine() ++ let left = s:GetLeft(0,1,0) ++ let right = s:GetRight(0,1,0) ++ ++ " get the len of the right delim ++ let lenRight = strlen(right) ++ ++ let isLineEmpty = strlen(getline(".")) == 0 ++ let insOrApp = (isLineEmpty==1 ? 'i' : 'A') ++ ++ "stick the delimiters down at the end of the line. We have to format the ++ "comment with spaces as appropriate ++ execute ":normal " . insOrApp . (isLineEmpty ? '' : ' ') . left . right . " " ++ ++ " if there is a right delimiter then we gotta move the cursor left ++ " by the len of the right delimiter so we insert between the delimiters ++ if lenRight > 0 ++ let leftMoveAmount = lenRight ++ execute ":normal " . leftMoveAmount . "h" ++ endif ++ startinsert ++endfunction ++ ++" Function: s:CommentBlock(top, bottom, lSide, rSide, forceNested ) {{{2 ++" This function is used to comment out a region of code. This region is ++" specified as a bounding box by arguments to the function. ++" ++" Args: ++" -top: the line number for the top line of code in the region ++" -bottom: the line number for the bottom line of code in the region ++" -lSide: the column number for the left most column in the region ++" -rSide: the column number for the right most column in the region ++" -forceNested: a flag indicating whether comments should be nested ++function s:CommentBlock(top, bottom, lSide, rSide, forceNested ) ++ " we need to create local copies of these arguments so we can modify them ++ let top = a:top ++ let bottom = a:bottom ++ let lSide = a:lSide ++ let rSide = a:rSide ++ ++ "if the top or bottom line starts with tabs we have to adjust the left and ++ "right boundaries so that they are set as though the tabs were spaces ++ let topline = getline(top) ++ let bottomline = getline(bottom) ++ if s:HasLeadingTabs(topline, bottomline) ++ ++ "find out how many tabs are in the top line and adjust the left ++ "boundary accordingly ++ let numTabs = s:NumberOfLeadingTabs(topline) ++ if lSide < numTabs ++ let lSide = &ts * lSide ++ else ++ let lSide = (lSide - numTabs) + (&ts * numTabs) ++ endif ++ ++ "find out how many tabs are in the bottom line and adjust the right ++ "boundary accordingly ++ let numTabs = s:NumberOfLeadingTabs(bottomline) ++ let rSide = (rSide - numTabs) + (&ts * numTabs) ++ endif ++ ++ "we must check that bottom IS actually below top, if it is not then we ++ "swap top and bottom. Similarly for left and right. ++ if bottom < top ++ let temp = top ++ let top = bottom ++ let bottom = top ++ endif ++ if rSide < lSide ++ let temp = lSide ++ let lSide = rSide ++ let rSide = temp ++ endif ++ ++ "if the current delimiters arent multipart then we will switch to the ++ "alternative delims (if THEY are) as the comment will be better and more ++ "accurate with multipart delims ++ let switchedDelims = 0 ++ if !s:Multipart() && g:NERDAllowAnyVisualDelims && s:AltMultipart() ++ let switchedDelims = 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++ ++ "start the commenting from the top and keep commenting till we reach the ++ "bottom ++ let currentLine=top ++ while currentLine <= bottom ++ ++ "check if we are allowed to comment this line ++ if s:CanCommentLine(a:forceNested, currentLine) ++ ++ "convert the leading tabs into spaces ++ let theLine = getline(currentLine) ++ let lineHasLeadTabs = s:HasLeadingTabs(theLine) ++ if lineHasLeadTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ ++ "dont comment lines that begin after the right boundary of the ++ "block unless the user has specified to do so ++ if theLine !~ '^ \{' . rSide . '\}' || !g:NERDBlockComIgnoreEmpty ++ ++ "attempt to place the cursor in on the left of the boundary box, ++ "then check if we were successful, if not then we cant comment this ++ "line ++ call setline(currentLine, theLine) ++ if s:CanPlaceCursor(currentLine, lSide) ++ ++ let leftSpaced = s:GetLeft(0,1,0) ++ let rightSpaced = s:GetRight(0,1,0) ++ ++ "stick the left delimiter down ++ let theLine = strpart(theLine, 0, lSide-1) . leftSpaced . strpart(theLine, lSide-1) ++ ++ if s:Multipart() ++ "stick the right delimiter down ++ let theLine = strpart(theLine, 0, rSide+strlen(leftSpaced)) . rightSpaced . strpart(theLine, rSide+strlen(rightSpaced)) ++ ++ let firstLeftDelim = s:FindDelimiterIndex(b:left, theLine) ++ let lastRightDelim = s:LastIndexOfDelim(b:right, theLine) ++ ++ if firstLeftDelim != -1 && lastRightDelim != -1 ++ let searchStr = strpart(theLine, 0, lastRightDelim) ++ let searchStr = strpart(searchStr, firstLeftDelim+strlen(b:left)) ++ ++ "replace the outter most delims in searchStr with ++ "place-holders ++ let theLineWithPlaceHolders = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, searchStr) ++ ++ "add the right delimiter onto the line ++ let theLine = strpart(theLine, 0, firstLeftDelim+strlen(b:left)) . theLineWithPlaceHolders . strpart(theLine, lastRightDelim) ++ endif ++ endif ++ endif ++ endif ++ ++ "restore tabs if needed ++ if lineHasLeadTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ call setline(currentLine, theLine) ++ endif ++ ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ "if we switched delims then we gotta go back to what they were before ++ if switchedDelims == 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++endfunction ++ ++" Function: s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) {{{2 ++" This function comments a range of lines. ++" ++" Args: ++" -forceNested: a flag indicating whether the called is requesting the comment ++" to be nested if need be ++" -alignRight/alignLeft: 0/1 if the comments delimiters should/shouldnt be ++" aligned left/right ++" -firstLine/lastLine: the top and bottom lines to comment ++function s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) ++ " we need to get the left and right indexes of the leftmost char in the ++ " block of of lines and the right most char so that we can do alignment of ++ " the delimiters if the user has specified ++ let leftAlignIndx = s:LeftMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) ++ let rightAlignIndx = s:RightMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) ++ ++ " gotta add the length of the left delimiter onto the rightAlignIndx cos ++ " we'll be adding a left delim to the line ++ let rightAlignIndx = rightAlignIndx + strlen(s:GetLeft(0,1,0)) ++ ++ " now we actually comment the lines. Do it line by line ++ let currentLine = a:firstLine ++ while currentLine <= a:lastLine ++ ++ " get the next line, check commentability and convert spaces to tabs ++ let theLine = getline(currentLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ if s:CanCommentLine(a:forceNested, currentLine) ++ "if the user has specified forceNesting then we check to see if we ++ "need to switch delimiters for place-holders ++ if a:forceNested && g:NERDUsePlaceHolders ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ endif ++ ++ " find out if the line is commented using normal delims and/or ++ " alternate ones ++ let isCommented = s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) ++ ++ " check if we can comment this line ++ if !isCommented || g:NERDUsePlaceHolders || s:Multipart() ++ if a:alignLeft ++ let theLine = s:AddLeftDelimAligned(b:left, theLine, leftAlignIndx) ++ else ++ let theLine = s:AddLeftDelim(s:GetLeft(0,1,0), theLine) ++ endif ++ if a:alignRight ++ let theLine = s:AddRightDelimAligned(b:right, theLine, rightAlignIndx) ++ else ++ let theLine = s:AddRightDelim(s:GetRight(0,1,0), theLine) ++ endif ++ endif ++ endif ++ ++ " restore leading tabs if appropriate ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ " we are done with this line ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++endfunction ++ ++" Function: s:CommentLinesMinimal(firstLine, lastLine) {{{2 ++" This function comments a range of lines in a minimal style. I ++" ++" Args: ++" -firstLine/lastLine: the top and bottom lines to comment ++function s:CommentLinesMinimal(firstLine, lastLine) ++ "check that minimal comments can be done on this filetype ++ if !s:HasMultipartDelims() ++ throw 'NERDCommenter.Delimiters exception: Minimal comments can only be used for filetypes that have multipart delimiters' ++ endif ++ ++ "if we need to use place holders for the comment, make sure they are ++ "enabled for this filetype ++ if !g:NERDUsePlaceHolders && s:DoesBlockHaveMultipartDelim(a:firstLine, a:lastLine) ++ throw 'NERDCommenter.Settings exception: Placeoholders are required but disabled.' ++ endif ++ ++ "get the left and right delims to smack on ++ let left = s:GetSexyComLeft(g:NERDSpaceDelims,0) ++ let right = s:GetSexyComRight(g:NERDSpaceDelims,0) ++ ++ "make sure all multipart delims on the lines are replaced with ++ "placeholders to prevent illegal syntax ++ let currentLine = a:firstLine ++ while(currentLine <= a:lastLine) ++ let theLine = getline(currentLine) ++ let theLine = s:ReplaceDelims(left, right, g:NERDLPlace, g:NERDRPlace, theLine) ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ "add the delim to the top line ++ let theLine = getline(a:firstLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let theLine = s:AddLeftDelim(left, theLine) ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:firstLine, theLine) ++ ++ "add the delim to the bottom line ++ let theLine = getline(a:lastLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let theLine = s:AddRightDelim(right, theLine) ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:lastLine, theLine) ++endfunction ++ ++" Function: s:CommentLinesSexy(topline, bottomline) function {{{2 ++" This function is used to comment lines in the 'Sexy' style. eg in c: ++" /* ++" * This is a sexy comment ++" */ ++" Args: ++" -topline: the line num of the top line in the sexy comment ++" -bottomline: the line num of the bottom line in the sexy comment ++function s:CommentLinesSexy(topline, bottomline) ++ let left = s:GetSexyComLeft(0, 0) ++ let right = s:GetSexyComRight(0, 0) ++ ++ "check if we can do a sexy comment with the available delimiters ++ if left == -1 || right == -1 ++ throw 'NERDCommenter.Delimiters exception: cannot perform sexy comments with available delimiters.' ++ endif ++ ++ "make sure the lines arent already commented sexually ++ if !s:CanSexyCommentLines(a:topline, a:bottomline) ++ throw 'NERDCommenter.Nesting exception: cannot nest sexy comments' ++ endif ++ ++ ++ let sexyComMarker = s:GetSexyComMarker(0,0) ++ let sexyComMarkerSpaced = s:GetSexyComMarker(1,0) ++ ++ ++ " we jam the comment as far to the right as possible ++ let leftAlignIndx = s:LeftMostIndx(1, 1, a:topline, a:bottomline) ++ ++ "check if we should use the compact style i.e that the left/right ++ "delimiters should appear on the first and last lines of the code and not ++ "on separate lines above/below the first/last lines of code ++ if g:NERDCompactSexyComs ++ let spaceString = (g:NERDSpaceDelims ? s:spaceStr : '') ++ ++ "comment the top line ++ let theLine = getline(a:topline) ++ let lineHasTabs = s:HasLeadingTabs(theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ let theLine = s:AddLeftDelimAligned(left . spaceString, theLine, leftAlignIndx) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:topline, theLine) ++ ++ "comment the bottom line ++ let theLine = getline(a:bottomline) ++ let lineHasTabs = s:HasLeadingTabs(theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ let theLine = s:AddRightDelim(spaceString . right, theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ call setline(a:bottomline, theLine) ++ else ++ ++ " add the left delimiter one line above the lines that are to be commented ++ call cursor(a:topline, 1) ++ execute 'normal! O' ++ call setline(a:topline, strpart(s:spaces, 0, leftAlignIndx) . left ) ++ ++ " add the right delimiter after bottom line (we have to add 1 cos we moved ++ " the lines down when we added the left delim ++ call cursor(a:bottomline+1, 1) ++ execute 'normal! o' ++ call setline(a:bottomline+2, strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . right ) ++ ++ endif ++ ++ " go thru each line adding the sexyComMarker marker to the start of each ++ " line in the appropriate place to align them with the comment delims ++ let currentLine = a:topline+1 ++ while currentLine <= a:bottomline + !g:NERDCompactSexyComs ++ " get the line and convert the tabs to spaces ++ let theLine = getline(currentLine) ++ let lineHasTabs = s:HasLeadingTabs(theLine) ++ if lineHasTabs ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ endif ++ ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ ++ " add the sexyComMarker ++ let theLine = strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . sexyComMarkerSpaced . strpart(theLine, leftAlignIndx) ++ ++ if lineHasTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ ++ " set the line and move onto the next one ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++endfunction ++ ++" Function: s:CommentLinesToggle(forceNested, firstLine, lastLine) {{{2 ++" Applies "toggle" commenting to the given range of lines ++" ++" Args: ++" -forceNested: a flag indicating whether the called is requesting the comment ++" to be nested if need be ++" -firstLine/lastLine: the top and bottom lines to comment ++function s:CommentLinesToggle(forceNested, firstLine, lastLine) ++ let currentLine = a:firstLine ++ while currentLine <= a:lastLine ++ ++ " get the next line, check commentability and convert spaces to tabs ++ let theLine = getline(currentLine) ++ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ if s:CanToggleCommentLine(a:forceNested, currentLine) ++ ++ "if the user has specified forceNesting then we check to see if we ++ "need to switch delimiters for place-holders ++ if g:NERDUsePlaceHolders ++ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) ++ endif ++ ++ let theLine = s:AddLeftDelim(s:GetLeft(0, 1, 0), theLine) ++ let theLine = s:AddRightDelim(s:GetRight(0, 1, 0), theLine) ++ endif ++ ++ " restore leading tabs if appropriate ++ if lineHasLeadingTabs ++ let theLine = s:ConvertLeadingSpacesToTabs(theLine) ++ endif ++ ++ " we are done with this line ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++endfunction ++ ++" Function: s:CommentRegion(topline, topCol, bottomLine, bottomCol) function {{{2 ++" This function comments chunks of text selected in visual mode. ++" It will comment exactly the text that they have selected. ++" Args: ++" -topLine: the line num of the top line in the sexy comment ++" -topCol: top left col for this comment ++" -bottomline: the line num of the bottom line in the sexy comment ++" -bottomCol: the bottom right col for this comment ++" -forceNested: whether the caller wants comments to be nested if the ++" line(s) are already commented ++function s:CommentRegion(topLine, topCol, bottomLine, bottomCol, forceNested) ++ ++ "switch delims (if we can) if the current set isnt multipart ++ let switchedDelims = 0 ++ if !s:Multipart() && s:AltMultipart() && !g:NERDAllowAnyVisualDelims ++ let switchedDelims = 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++ ++ "if there is only one line in the comment then just do it ++ if a:topLine == a:bottomLine ++ call s:CommentBlock(a:topLine, a:bottomLine, a:topCol, a:bottomCol, a:forceNested) ++ ++ "there are multiple lines in the comment ++ else ++ "comment the top line ++ call s:CommentBlock(a:topLine, a:topLine, a:topCol, strlen(getline(a:topLine)), a:forceNested) ++ ++ "comment out all the lines in the middle of the comment ++ let topOfRange = a:topLine+1 ++ let bottomOfRange = a:bottomLine-1 ++ if topOfRange <= bottomOfRange ++ call s:CommentLines(a:forceNested, 0, 0, topOfRange, bottomOfRange) ++ endif ++ ++ "comment the bottom line ++ let bottom = getline(a:bottomLine) ++ let numLeadingSpacesTabs = strlen(substitute(bottom, '^\([ \t]*\).*$', '\1', '')) ++ call s:CommentBlock(a:bottomLine, a:bottomLine, numLeadingSpacesTabs+1, a:bottomCol, a:forceNested) ++ ++ endif ++ ++ "stick the cursor back on the char it was on before the comment ++ call cursor(a:topLine, a:topCol + strlen(b:left) + g:NERDSpaceDelims) ++ ++ "if we switched delims then we gotta go back to what they were before ++ if switchedDelims == 1 ++ call s:SwitchToAlternativeDelimiters(0) ++ endif ++ ++endfunction ++ ++" Function: s:InvertComment(firstLine, lastLine) function {{{2 ++" Inverts the comments on the lines between and including the given line ++" numbers i.e all commented lines are uncommented and vice versa ++" Args: ++" -firstLine: the top of the range of lines to be inverted ++" -lastLine: the bottom of the range of lines to be inverted ++function s:InvertComment(firstLine, lastLine) ++ ++ " go thru all lines in the given range ++ let currentLine = a:firstLine ++ while currentLine <= a:lastLine ++ let theLine = getline(currentLine) ++ ++ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) ++ ++ " if the line is commented normally, uncomment it ++ if s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) ++ call s:UncommentLines(1, currentLine, currentLine) ++ let currentLine = currentLine + 1 ++ ++ " check if the line is commented sexually ++ elseif !empty(sexyComBounds) ++ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() ++ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) ++ ++ "move to the line after last line of the sexy comment ++ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() ++ let currentLine = bottomBound - (numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved) + 1 ++ ++ " the line isnt commented ++ else ++ call s:CommentLinesToggle(1, currentLine, currentLine) ++ let currentLine = currentLine + 1 ++ endif ++ ++ endwhile ++endfunction ++ ++" Function: NERDComment(isVisual, alignLeft, alignRight, type) function {{{2 ++" This function is a Wrapper for the main commenting functions ++" ++" Args: ++" -isVisual: a flag indicating whether the comment is requested in visual ++" mode or not ++" -type: the type of commenting requested. Can be 'sexy', 'invert', ++" 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', ++" 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' ++function! NERDComment(isVisual, type) range ++ " we want case sensitivity when commenting ++ let prevIgnoreCase = &ignorecase ++ set noignorecase ++ ++ if a:isVisual ++ let firstLine = line("'<") ++ let lastLine = line("'>") ++ let firstCol = col("'<") ++ let lastCol = col("'>") ++ else ++ let firstLine = a:firstline ++ let lastLine = a:lastline ++ endif ++ ++ let countWasGiven = (a:isVisual == 0 && firstLine != lastLine) ++ ++ let forceNested = (a:type == 'nested' || g:NERDDefaultNesting) ++ ++ if a:type == 'norm' || a:type == 'nested' ++ if a:isVisual && visualmode() == "" ++ call s:CommentBlock(firstLine, lastLine, firstCol, lastCol, forceNested) ++ elseif a:isVisual && visualmode() == "v" && (g:NERDCommentWholeLinesInVMode==0 || (g:NERDCommentWholeLinesInVMode==2 && s:HasMultipartDelims())) ++ call s:CommentRegion(firstLine, firstCol, lastLine, lastCol, forceNested) ++ else ++ call s:CommentLines(forceNested, 0, 0, firstLine, lastLine) ++ endif ++ ++ elseif a:type == 'alignLeft' || a:type == 'alignRight' || a:type == 'alignBoth' ++ let alignLeft = (a:type == 'alignLeft' || a:type == 'alignBoth') ++ let alignRight = (a:type == 'alignRight' || a:type == 'alignBoth') ++ call s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) ++ ++ elseif a:type == 'invert' ++ call s:InvertComment(firstLine, lastLine) ++ ++ elseif a:type == 'sexy' ++ try ++ call s:CommentLinesSexy(firstLine, lastLine) ++ catch /NERDCommenter.Delimiters/ ++ call s:NerdEcho("Sexy comments cannot be done with the available delimiters", 0) ++ catch /NERDCommenter.Nesting/ ++ call s:NerdEcho("Sexy comment aborted. Nested sexy cannot be nested", 0) ++ endtry ++ ++ elseif a:type == 'toggle' ++ let theLine = getline(firstLine) ++ ++ if s:IsInSexyComment(firstLine) || s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) ++ call s:UncommentLines(1, firstLine, lastLine) ++ else ++ call s:CommentLinesToggle(forceNested, firstLine, lastLine) ++ endif ++ ++ elseif a:type == 'minimal' ++ try ++ call s:CommentLinesMinimal(firstLine, lastLine) ++ catch /NERDCommenter.Delimiters/ ++ call s:NerdEcho("Minimal comments can only be used for filetypes that have multipart delimiters.", 0) ++ catch /NERDCommenter.Settings/ ++ call s:NerdEcho("Place holders are required but disabled.", 0) ++ endtry ++ ++ elseif a:type == 'toEOL' ++ call s:SaveScreenState() ++ call s:CommentBlock(firstLine, firstLine, col("."), col("$")-1, 1) ++ call s:RestoreScreenState() ++ ++ elseif a:type == 'prepend' ++ call s:PrependCommentToLine() ++ ++ elseif a:type == 'append' ++ call s:AppendCommentToLine() ++ ++ elseif a:type == 'insert' ++ call s:PlaceDelimitersAndInsBetween() ++ ++ elseif a:type == 'uncomment' ++ call s:UncommentLines(0, firstLine, lastLine) ++ ++ elseif a:type == 'yank' ++ if a:isVisual ++ normal gvy ++ elseif countWasGiven ++ execute firstLine .','. lastLine .'yank' ++ else ++ normal Y ++ endif ++ execute firstLine .','. lastLine .'call NERDComment('. a:isVisual .', "norm")' ++ endif ++ ++ let &ignorecase = prevIgnoreCase ++endfunction ++ ++" Function: s:PlaceDelimitersAndInsBetween() function {{{2 ++" This is function is called to place comment delimiters down and place the ++" cursor between them ++function s:PlaceDelimitersAndInsBetween() ++ " get the left and right delimiters without any escape chars in them ++ let left = s:GetLeft(0, 1, 0) ++ let right = s:GetRight(0, 1, 0) ++ ++ let theLine = getline(".") ++ let lineHasLeadTabs = s:HasLeadingTabs(theLine) || (theLine =~ '^ *$' && !&expandtab) ++ ++ "convert tabs to spaces and adjust the cursors column to take this into ++ "account ++ let untabbedCol = s:UntabbedCol(theLine, col(".")) ++ call setline(line("."), s:ConvertLeadingTabsToSpaces(theLine)) ++ call cursor(line("."), untabbedCol) ++ ++ " get the len of the right delim ++ let lenRight = strlen(right) ++ ++ let isDelimOnEOL = col(".") >= strlen(getline(".")) ++ ++ " if the cursor is in the first col then we gotta insert rather than ++ " append the comment delimiters here ++ let insOrApp = (col(".")==1 ? 'i' : 'a') ++ ++ " place the delimiters down. We do it differently depending on whether ++ " there is a left AND right delimiter ++ if lenRight > 0 ++ execute ":normal " . insOrApp . left . right ++ execute ":normal " . lenRight . "h" ++ else ++ execute ":normal " . insOrApp . left ++ ++ " if we are tacking the delim on the EOL then we gotta add a space ++ " after it cos when we go out of insert mode the cursor will move back ++ " one and the user wont be in position to type the comment. ++ if isDelimOnEOL ++ execute 'normal a ' ++ endif ++ endif ++ normal l ++ ++ "if needed convert spaces back to tabs and adjust the cursors col ++ "accordingly ++ if lineHasLeadTabs ++ let tabbedCol = s:TabbedCol(getline("."), col(".")) ++ call setline(line("."), s:ConvertLeadingSpacesToTabs(getline("."))) ++ call cursor(line("."), tabbedCol) ++ endif ++ ++ startinsert ++endfunction ++ ++" Function: s:PrependCommentToLine(){{{2 ++" This function prepends comment delimiters to the start of line and places ++" the cursor in position to start typing the comment ++function s:PrependCommentToLine() ++ " get the left and right delimiters without any escape chars in them ++ let left = s:GetLeft(0, 1, 0) ++ let right = s:GetRight(0, 1, 0) ++ ++ " get the len of the right delim ++ let lenRight = strlen(right) ++ ++ ++ "if the line is empty then we need to know about this later on ++ let isLineEmpty = strlen(getline(".")) == 0 ++ ++ "stick the delimiters down at the start of the line. We have to format the ++ "comment with spaces as appropriate ++ if lenRight > 0 ++ execute ":normal I" . left . right ++ else ++ execute ":normal I" . left ++ endif ++ ++ " if there is a right delimiter then we gotta move the cursor left ++ " by the len of the right delimiter so we insert between the delimiters ++ if lenRight > 0 ++ let leftMoveAmount = lenRight ++ execute ":normal " . leftMoveAmount . "h" ++ endif ++ normal l ++ ++ "if the line was empty then we gotta add an extra space on the end because ++ "the cursor will move back one more at the end of the last "execute" ++ "command ++ if isLineEmpty && lenRight == 0 ++ execute ":normal a " ++ endif ++ ++ startinsert ++endfunction ++" Function: s:RemoveDelimiters(left, right, line) {{{2 ++" this function is called to remove the first left comment delimiter and the ++" last right delimiter of the given line. ++" ++" The args left and right must be strings. If there is no right delimiter (as ++" is the case for e.g vim file comments) them the arg right should be "" ++" ++" Args: ++" -left: the left comment delimiter ++" -right: the right comment delimiter ++" -line: the line to remove the delimiters from ++function s:RemoveDelimiters(left, right, line) ++ ++ let l:left = a:left ++ let l:right = a:right ++ let lenLeft = strlen(left) ++ let lenRight = strlen(right) ++ ++ let delimsSpaced = (g:NERDSpaceDelims || g:NERDRemoveExtraSpaces) ++ ++ let line = a:line ++ ++ "look for the left delimiter, if we find it, remove it. ++ let leftIndx = s:FindDelimiterIndex(a:left, line) ++ if leftIndx != -1 ++ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+lenLeft) ++ ++ "if the user has specified that there is a space after the left delim ++ "then check for the space and remove it if it is there ++ if delimsSpaced && strpart(line, leftIndx, s:lenSpaceStr) == s:spaceStr ++ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+s:lenSpaceStr) ++ endif ++ endif ++ ++ "look for the right delimiter, if we find it, remove it ++ let rightIndx = s:FindDelimiterIndex(a:right, line) ++ if rightIndx != -1 ++ let line = strpart(line, 0, rightIndx) . strpart(line, rightIndx+lenRight) ++ ++ "if the user has specified that there is a space before the right delim ++ "then check for the space and remove it if it is there ++ if delimsSpaced && strpart(line, rightIndx-s:lenSpaceStr, s:lenSpaceStr) == s:spaceStr && s:Multipart() ++ let line = strpart(line, 0, rightIndx-s:lenSpaceStr) . strpart(line, rightIndx) ++ endif ++ endif ++ ++ return line ++endfunction ++ ++" Function: s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) {{{2 ++" This function uncomments the given lines ++" ++" Args: ++" onlyWholeLineComs: should be 1 for toggle style uncommenting ++" topLine: the top line of the visual selection to uncomment ++" bottomLine: the bottom line of the visual selection to uncomment ++function s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) ++ "make local copies of a:firstline and a:lastline and, if need be, swap ++ "them around if the top line is below the bottom ++ let l:firstline = a:topLine ++ let l:lastline = a:bottomLine ++ if firstline > lastline ++ let firstline = lastline ++ let lastline = a:topLine ++ endif ++ ++ "go thru each line uncommenting each line removing sexy comments ++ let currentLine = firstline ++ while currentLine <= lastline ++ ++ "check the current line to see if it is part of a sexy comment ++ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) ++ if !empty(sexyComBounds) ++ ++ "we need to store the num lines in the buf before the comment is ++ "removed so we know how many lines were removed when the sexy com ++ "was removed ++ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() ++ ++ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) ++ ++ "move to the line after last line of the sexy comment ++ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() ++ let numLinesRemoved = numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved ++ let currentLine = sexyComBounds[1] - numLinesRemoved + 1 ++ let lastline = lastline - numLinesRemoved ++ ++ "no sexy com was detected so uncomment the line as normal ++ else ++ let theLine = getline(currentLine) ++ if a:onlyWholeLineComs && (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) ++ call s:UncommentLinesNormal(currentLine, currentLine) ++ elseif !a:onlyWholeLineComs ++ call s:UncommentLinesNormal(currentLine, currentLine) ++ endif ++ let currentLine = currentLine + 1 ++ endif ++ endwhile ++ ++endfunction ++ ++" Function: s:UncommentLinesSexy(topline, bottomline) {{{2 ++" This function removes all the comment characters associated with the sexy ++" comment spanning the given lines ++" Args: ++" -topline/bottomline: the top/bottom lines of the sexy comment ++function s:UncommentLinesSexy(topline, bottomline) ++ let left = s:GetSexyComLeft(0,1) ++ let right = s:GetSexyComRight(0,1) ++ ++ ++ "check if it is even possible for sexy comments to exist with the ++ "available delimiters ++ if left == -1 || right == -1 ++ throw 'NERDCommenter.Delimiters exception: cannot uncomment sexy comments with available delimiters.' ++ endif ++ ++ let leftUnEsc = s:GetSexyComLeft(0,0) ++ let rightUnEsc = s:GetSexyComRight(0,0) ++ ++ let sexyComMarker = s:GetSexyComMarker(0, 1) ++ let sexyComMarkerUnEsc = s:GetSexyComMarker(0, 0) ++ ++ "the markerOffset is how far right we need to move the sexyComMarker to ++ "line it up with the end of the left delim ++ let markerOffset = strlen(leftUnEsc)-strlen(sexyComMarkerUnEsc) ++ ++ " go thru the intermediate lines of the sexy comment and remove the ++ " sexy comment markers (eg the '*'s on the start of line in a c sexy ++ " comment) ++ let currentLine = a:topline+1 ++ while currentLine < a:bottomline ++ let theLine = getline(currentLine) ++ ++ " remove the sexy comment marker from the line. We also remove the ++ " space after it if there is one and if appropriate options are set ++ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) ++ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) ++ endif ++ ++ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) ++ ++ let theLine = s:ConvertLeadingWhiteSpace(theLine) ++ ++ " move onto the next line ++ call setline(currentLine, theLine) ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ " gotta make a copy of a:bottomline cos we modify the position of the ++ " last line it if we remove the topline ++ let bottomline = a:bottomline ++ ++ " get the first line so we can remove the left delim from it ++ let theLine = getline(a:topline) ++ ++ " if the first line contains only the left delim then just delete it ++ if theLine =~ '^[ \t]*' . left . '[ \t]*$' && !g:NERDCompactSexyComs ++ call cursor(a:topline, 1) ++ normal dd ++ let bottomline = bottomline - 1 ++ ++ " topline contains more than just the left delim ++ else ++ ++ " remove the delim. If there is a space after it ++ " then remove this too if appropriate ++ let delimIndx = stridx(theLine, leftUnEsc) ++ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)) ++ endif ++ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) ++ call setline(a:topline, theLine) ++ endif ++ ++ " get the last line so we can remove the right delim ++ let theLine = getline(bottomline) ++ ++ " if the bottomline contains only the right delim then just delete it ++ if theLine =~ '^[ \t]*' . right . '[ \t]*$' ++ call cursor(bottomline, 1) ++ normal dd ++ ++ " the last line contains more than the right delim ++ else ++ " remove the right delim. If there is a space after it and ++ " if the appropriate options are set then remove this too. ++ let delimIndx = s:LastIndexOfDelim(rightUnEsc, theLine) ++ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)) ++ endif ++ ++ " if the last line also starts with a sexy comment marker then we ++ " remove this as well ++ if theLine =~ '^[ \t]*' . sexyComMarker ++ ++ " remove the sexyComMarker. If there is a space after it then ++ " remove that too ++ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) ++ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) ++ else ++ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) ++ endif ++ endif ++ ++ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) ++ call setline(bottomline, theLine) ++ endif ++endfunction ++ ++" Function: s:UncommentLineNormal(line) {{{2 ++" uncomments the given line and returns the result ++" Args: ++" -line: the line to uncomment ++function s:UncommentLineNormal(line) ++ let line = a:line ++ ++ "get the comment status on the line so we know how it is commented ++ let lineCommentStatus = s:IsCommentedOuttermost(b:leftAlt, b:rightAlt, b:left, b:right, line) ++ ++ "it is commented with b:left and b:right so remove these delims ++ if lineCommentStatus == 1 ++ let line = s:RemoveDelimiters(b:leftAlt, b:rightAlt, line) ++ ++ "it is commented with b:leftAlt and b:rightAlt so remove these delims ++ elseif lineCommentStatus == 2 && g:NERDRemoveAltComs ++ let line = s:RemoveDelimiters(b:left, b:right, line) ++ ++ "it is not properly commented with any delims so we check if it has ++ "any random left or right delims on it and remove the outtermost ones ++ else ++ "get the positions of all delim types on the line ++ let indxLeft = s:FindDelimiterIndex(b:left, line) ++ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) ++ let indxRight = s:FindDelimiterIndex(b:right, line) ++ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) ++ ++ "remove the outter most left comment delim ++ if indxLeft != -1 && (indxLeft < indxLeftAlt || indxLeftAlt == -1) ++ let line = s:ReplaceLeftMostDelim(b:left, '', line) ++ elseif indxLeftAlt != -1 ++ let line = s:ReplaceLeftMostDelim(b:leftAlt, '', line) ++ endif ++ ++ "remove the outter most right comment delim ++ if indxRight != -1 && (indxRight < indxRightAlt || indxRightAlt == -1) ++ let line = s:ReplaceRightMostDelim(b:right, '', line) ++ elseif indxRightAlt != -1 ++ let line = s:ReplaceRightMostDelim(b:rightAlt, '', line) ++ endif ++ endif ++ ++ ++ let indxLeft = s:FindDelimiterIndex(b:left, line) ++ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) ++ let indxLeftPlace = s:FindDelimiterIndex(g:NERDLPlace, line) ++ ++ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) ++ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) ++ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) ++ ++ let right = b:right ++ let left = b:left ++ if !s:Multipart() ++ let right = b:rightAlt ++ let left = b:leftAlt ++ endif ++ ++ ++ "if there are place-holders on the line then we check to see if they are ++ "the outtermost delimiters on the line. If so then we replace them with ++ "real delimiters ++ if indxLeftPlace != -1 ++ if (indxLeftPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) ++ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) ++ endif ++ elseif indxRightPlace != -1 ++ if (indxRightPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) ++ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) ++ endif ++ ++ endif ++ ++ let line = s:ConvertLeadingWhiteSpace(line) ++ ++ return line ++endfunction ++ ++" Function: s:UncommentLinesNormal(topline, bottomline) {{{2 ++" This function is called to uncomment lines that arent a sexy comment ++" Args: ++" -topline/bottomline: the top/bottom line numbers of the comment ++function s:UncommentLinesNormal(topline, bottomline) ++ let currentLine = a:topline ++ while currentLine <= a:bottomline ++ let line = getline(currentLine) ++ call setline(currentLine, s:UncommentLineNormal(line)) ++ let currentLine = currentLine + 1 ++ endwhile ++endfunction ++ ++ ++" Section: Other helper functions {{{1 ++" ============================================================================ ++ ++" Function: s:AddLeftDelim(delim, theLine) {{{2 ++" Args: ++function s:AddLeftDelim(delim, theLine) ++ return substitute(a:theLine, '^\([ \t]*\)', '\1' . a:delim, '') ++endfunction ++ ++" Function: s:AddLeftDelimAligned(delim, theLine) {{{2 ++" Args: ++function s:AddLeftDelimAligned(delim, theLine, alignIndx) ++ ++ "if the line is not long enough then bung some extra spaces on the front ++ "so we can align the delim properly ++ let theLine = a:theLine ++ if strlen(theLine) < a:alignIndx ++ let theLine = strpart(s:spaces, 0, a:alignIndx - strlen(theLine)) ++ endif ++ ++ return strpart(theLine, 0, a:alignIndx) . a:delim . strpart(theLine, a:alignIndx) ++endfunction ++ ++" Function: s:AddRightDelim(delim, theLine) {{{2 ++" Args: ++function s:AddRightDelim(delim, theLine) ++ if a:delim == '' ++ return a:theLine ++ else ++ return substitute(a:theLine, '$', a:delim, '') ++ endif ++endfunction ++ ++" Function: s:AddRightDelimAligned(delim, theLine, alignIndx) {{{2 ++" Args: ++function s:AddRightDelimAligned(delim, theLine, alignIndx) ++ if a:delim == "" ++ return a:theLine ++ else ++ ++ " when we align the right delim we are just adding spaces ++ " so we get a string containing the needed spaces (it ++ " could be empty) ++ let extraSpaces = '' ++ let extraSpaces = strpart(s:spaces, 0, a:alignIndx-strlen(a:theLine)) ++ ++ " add the right delim ++ return substitute(a:theLine, '$', extraSpaces . a:delim, '') ++ endif ++endfunction ++ ++" Function: s:AltMultipart() {{{2 ++" returns 1 if the alternative delims are multipart ++function s:AltMultipart() ++ return b:rightAlt != '' ++endfunction ++ ++" Function: s:CanCommentLine(forceNested, line) {{{2 ++"This function is used to determine whether the given line can be commented. ++"It returns 1 if it can be and 0 otherwise ++" ++" Args: ++" -forceNested: a flag indicating whether the caller wants comments to be nested ++" if the current line is already commented ++" -lineNum: the line num of the line to check for commentability ++function s:CanCommentLine(forceNested, lineNum) ++ let theLine = getline(a:lineNum) ++ ++ " make sure we don't comment lines that are just spaces or tabs or empty. ++ if theLine =~ "^[ \t]*$" ++ return 0 ++ endif ++ ++ "if the line is part of a sexy comment then just flag it... ++ if s:IsInSexyComment(a:lineNum) ++ return 0 ++ endif ++ ++ let isCommented = s:IsCommentedNormOrSexy(a:lineNum) ++ ++ "if the line isnt commented return true ++ if !isCommented ++ return 1 ++ endif ++ ++ "if the line is commented but nesting is allowed then return true ++ if a:forceNested && (!s:Multipart() || g:NERDUsePlaceHolders) ++ return 1 ++ endif ++ ++ return 0 ++endfunction ++ ++" Function: s:CanPlaceCursor(line, col) {{{2 ++" returns 1 if the cursor can be placed exactly in the given position ++function s:CanPlaceCursor(line, col) ++ let c = col(".") ++ let l = line(".") ++ call cursor(a:line, a:col) ++ let success = (line(".") == a:line && col(".") == a:col) ++ call cursor(l,c) ++ return success ++endfunction ++ ++" Function: s:CanSexyCommentLines(topline, bottomline) {{{2 ++" Return: 1 if the given lines can be commented sexually, 0 otherwise ++function s:CanSexyCommentLines(topline, bottomline) ++ " see if the selected regions have any sexy comments ++ let currentLine = a:topline ++ while(currentLine <= a:bottomline) ++ if s:IsInSexyComment(currentLine) ++ return 0 ++ endif ++ let currentLine = currentLine + 1 ++ endwhile ++ return 1 ++endfunction ++" Function: s:CanToggleCommentLine(forceNested, line) {{{2 ++"This function is used to determine whether the given line can be toggle commented. ++"It returns 1 if it can be and 0 otherwise ++" ++" Args: ++" -lineNum: the line num of the line to check for commentability ++function s:CanToggleCommentLine(forceNested, lineNum) ++ let theLine = getline(a:lineNum) ++ if (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) && !a:forceNested ++ return 0 ++ endif ++ ++ " make sure we don't comment lines that are just spaces or tabs or empty. ++ if theLine =~ "^[ \t]*$" ++ return 0 ++ endif ++ ++ "if the line is part of a sexy comment then just flag it... ++ if s:IsInSexyComment(a:lineNum) ++ return 0 ++ endif ++ ++ return 1 ++endfunction ++ ++" Function: s:ConvertLeadingSpacesToTabs(line) {{{2 ++" This function takes a line and converts all leading tabs on that line into ++" spaces ++" ++" Args: ++" -line: the line whose leading tabs will be converted ++function s:ConvertLeadingSpacesToTabs(line) ++ let toReturn = a:line ++ while toReturn =~ '^\t*' . s:TabSpace() . '\(.*\)$' ++ let toReturn = substitute(toReturn, '^\(\t*\)' . s:TabSpace() . '\(.*\)$' , '\1\t\2' , "") ++ endwhile ++ ++ return toReturn ++endfunction ++ ++ ++" Function: s:ConvertLeadingTabsToSpaces(line) {{{2 ++" This function takes a line and converts all leading spaces on that line into ++" tabs ++" ++" Args: ++" -line: the line whose leading spaces will be converted ++function s:ConvertLeadingTabsToSpaces(line) ++ let toReturn = a:line ++ while toReturn =~ '^\( *\)\t' ++ let toReturn = substitute(toReturn, '^\( *\)\t', '\1' . s:TabSpace() , "") ++ endwhile ++ ++ return toReturn ++endfunction ++ ++" Function: s:ConvertLeadingWhiteSpace(line) {{{2 ++" Converts the leading white space to tabs/spaces depending on &ts ++" ++" Args: ++" -line: the line to convert ++function s:ConvertLeadingWhiteSpace(line) ++ let toReturn = a:line ++ while toReturn =~ '^ *\t' ++ let toReturn = substitute(toReturn, '^ *\zs\t\ze', s:TabSpace(), "g") ++ endwhile ++ ++ if !&expandtab ++ let toReturn = s:ConvertLeadingSpacesToTabs(toReturn) ++ endif ++ ++ return toReturn ++endfunction ++ ++ ++" Function: s:CountNonESCedOccurances(str, searchstr, escChar) {{{2 ++" This function counts the number of substrings contained in another string. ++" These substrings are only counted if they are not escaped with escChar ++" Args: ++" -str: the string to look for searchstr in ++" -searchstr: the substring to search for in str ++" -escChar: the escape character which, when preceding an instance of ++" searchstr, will cause it not to be counted ++function s:CountNonESCedOccurances(str, searchstr, escChar) ++ "get the index of the first occurrence of searchstr ++ let indx = stridx(a:str, a:searchstr) ++ ++ "if there is an instance of searchstr in str process it ++ if indx != -1 ++ "get the remainder of str after this instance of searchstr is removed ++ let lensearchstr = strlen(a:searchstr) ++ let strLeft = strpart(a:str, indx+lensearchstr) ++ ++ "if this instance of searchstr is not escaped, add one to the count ++ "and recurse. If it is escaped, just recurse ++ if !s:IsEscaped(a:str, indx, a:escChar) ++ return 1 + s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) ++ else ++ return s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) ++ endif ++ endif ++endfunction ++" Function: s:DoesBlockHaveDelim(delim, top, bottom) {{{2 ++" Returns 1 if the given block of lines has a delimiter (a:delim) in it ++" Args: ++" -delim: the comment delimiter to check the block for ++" -top: the top line number of the block ++" -bottom: the bottom line number of the block ++function s:DoesBlockHaveDelim(delim, top, bottom) ++ let currentLine = a:top ++ while currentLine < a:bottom ++ let theline = getline(currentLine) ++ if s:FindDelimiterIndex(a:delim, theline) != -1 ++ return 1 ++ endif ++ let currentLine = currentLine + 1 ++ endwhile ++ return 0 ++endfunction ++ ++" Function: s:DoesBlockHaveMultipartDelim(top, bottom) {{{2 ++" Returns 1 if the given block has a >= 1 multipart delimiter in it ++" Args: ++" -top: the top line number of the block ++" -bottom: the bottom line number of the block ++function s:DoesBlockHaveMultipartDelim(top, bottom) ++ if s:HasMultipartDelims() ++ if s:Multipart() ++ return s:DoesBlockHaveDelim(b:left, a:top, a:bottom) || s:DoesBlockHaveDelim(b:right, a:top, a:bottom) ++ else ++ return s:DoesBlockHaveDelim(b:leftAlt, a:top, a:bottom) || s:DoesBlockHaveDelim(b:rightAlt, a:top, a:bottom) ++ endif ++ endif ++ return 0 ++endfunction ++ ++ ++" Function: s:Esc(str) {{{2 ++" Escapes all the tricky chars in the given string ++function s:Esc(str) ++ let charsToEsc = '*/\."&$+' ++ return escape(a:str, charsToEsc) ++endfunction ++ ++" Function: s:FindDelimiterIndex(delimiter, line) {{{2 ++" This function is used to get the string index of the input comment delimiter ++" on the input line. If no valid comment delimiter is found in the line then ++" -1 is returned ++" Args: ++" -delimiter: the delimiter we are looking to find the index of ++" -line: the line we are looking for delimiter on ++function s:FindDelimiterIndex(delimiter, line) ++ ++ "make sure the delimiter isnt empty otherwise we go into an infinite loop. ++ if a:delimiter == "" ++ return -1 ++ endif ++ ++ ++ let l:delimiter = a:delimiter ++ let lenDel = strlen(l:delimiter) ++ ++ "get the index of the first occurrence of the delimiter ++ let delIndx = stridx(a:line, l:delimiter) ++ ++ "keep looping thru the line till we either find a real comment delimiter ++ "or run off the EOL ++ while delIndx != -1 ++ ++ "if we are not off the EOL get the str before the possible delimiter ++ "in question and check if it really is a delimiter. If it is, return ++ "its position ++ if delIndx != -1 ++ if s:IsDelimValid(l:delimiter, delIndx, a:line) ++ return delIndx ++ endif ++ endif ++ ++ "we have not yet found a real comment delimiter so move past the ++ "current one we are lookin at ++ let restOfLine = strpart(a:line, delIndx + lenDel) ++ let distToNextDelim = stridx(restOfLine , l:delimiter) ++ ++ "if distToNextDelim is -1 then there is no more potential delimiters ++ "on the line so set delIndx to -1. Otherwise, move along the line by ++ "distToNextDelim ++ if distToNextDelim == -1 ++ let delIndx = -1 ++ else ++ let delIndx = delIndx + lenDel + distToNextDelim ++ endif ++ endwhile ++ ++ "there is no comment delimiter on this line ++ return -1 ++endfunction ++ ++" Function: s:FindBoundingLinesOfSexyCom(lineNum) {{{2 ++" This function takes in a line number and tests whether this line number is ++" the top/bottom/middle line of a sexy comment. If it is then the top/bottom ++" lines of the sexy comment are returned ++" Args: ++" -lineNum: the line number that is to be tested whether it is the ++" top/bottom/middle line of a sexy com ++" Returns: ++" A string that has the top/bottom lines of the sexy comment encoded in it. ++" The format is 'topline,bottomline'. If a:lineNum turns out not to be the ++" top/bottom/middle of a sexy comment then -1 is returned ++function s:FindBoundingLinesOfSexyCom(lineNum) ++ ++ "find which delimiters to look for as the start/end delims of the comment ++ let left = '' ++ let right = '' ++ if s:Multipart() ++ let left = s:GetLeft(0,0,1) ++ let right = s:GetRight(0,0,1) ++ elseif s:AltMultipart() ++ let left = s:GetLeft(1,0,1) ++ let right = s:GetRight(1,0,1) ++ else ++ return [] ++ endif ++ ++ let sexyComMarker = s:GetSexyComMarker(0, 1) ++ ++ "initialise the top/bottom line numbers of the sexy comment to -1 ++ let top = -1 ++ let bottom = -1 ++ ++ let currentLine = a:lineNum ++ while top == -1 || bottom == -1 ++ let theLine = getline(currentLine) ++ ++ "check if the current line is the top of the sexy comment ++ if theLine =~ '^[ \t]*' . left && theLine !~ '.*' . right ++ let top = currentLine ++ let currentLine = a:lineNum ++ ++ "check if the current line is the bottom of the sexy comment ++ elseif theLine =~ '^[ \t]*' . right && theLine !~ '.*' . left ++ let bottom = currentLine ++ ++ "the right delimiter is on the same line as the last sexyComMarker ++ elseif theLine =~ '^[ \t]*' . sexyComMarker . '.*' . right ++ let bottom = currentLine ++ ++ "we have not found the top or bottom line so we assume currentLine is an ++ "intermediate line and look to prove otherwise ++ else ++ ++ "if the line doesnt start with a sexyComMarker then it is not a sexy ++ "comment ++ if theLine !~ '^[ \t]*' . sexyComMarker ++ return [] ++ endif ++ ++ endif ++ ++ "if top is -1 then we havent found the top yet so keep looking up ++ if top == -1 ++ let currentLine = currentLine - 1 ++ "if we have found the top line then go down looking for the bottom ++ else ++ let currentLine = currentLine + 1 ++ endif ++ ++ endwhile ++ ++ return [top, bottom] ++endfunction ++ ++ ++" Function: s:GetLeft(alt, space, esc) {{{2 ++" returns the left/left-alternative delimiter ++" Args: ++" -alt: specifies whether to get left or left-alternative delim ++" -space: specifies whether the delim should be spaced or not ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the delim should be ESCed ++function s:GetLeft(alt, space, esc) ++ let delim = b:left ++ ++ if a:alt ++ if b:leftAlt == '' ++ return '' ++ else ++ let delim = b:leftAlt ++ endif ++ endif ++ if delim == '' ++ return '' ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let delim = delim . s:spaceStr ++ endif ++ ++ if a:esc ++ let delim = s:Esc(delim) ++ endif ++ ++ return delim ++endfunction ++ ++" Function: s:GetRight(alt, space, esc) {{{2 ++" returns the right/right-alternative delimiter ++" Args: ++" -alt: specifies whether to get right or right-alternative delim ++" -space: specifies whether the delim should be spaced or not ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the delim should be ESCed ++function s:GetRight(alt, space, esc) ++ let delim = b:right ++ ++ if a:alt ++ if !s:AltMultipart() ++ return '' ++ else ++ let delim = b:rightAlt ++ endif ++ endif ++ if delim == '' ++ return '' ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let delim = s:spaceStr . delim ++ endif ++ ++ if a:esc ++ let delim = s:Esc(delim) ++ endif ++ ++ return delim ++endfunction ++ ++ ++" Function: s:GetSexyComMarker() {{{2 ++" Returns the sexy comment marker for the current filetype. ++" ++" C style sexy comments are assumed if possible. If not then the sexy comment ++" marker is the last char of the delimiter pair that has both left and right ++" delims and has the longest left delim ++" ++" Args: ++" -space: specifies whether the marker is to have a space string after it ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the marker are to be ESCed ++function s:GetSexyComMarker(space, esc) ++ let sexyComMarker = b:sexyComMarker ++ ++ "if there is no hardcoded marker then we find one ++ if sexyComMarker == '' ++ ++ "if the filetype has c style comments then use standard c sexy ++ "comments ++ if s:HasCStyleComments() ++ let sexyComMarker = '*' ++ else ++ "find a comment marker by getting the longest available left delim ++ "(that has a corresponding right delim) and taking the last char ++ let lenLeft = strlen(b:left) ++ let lenLeftAlt = strlen(b:leftAlt) ++ let left = '' ++ let right = '' ++ if s:Multipart() && lenLeft >= lenLeftAlt ++ let left = b:left ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ else ++ return -1 ++ endif ++ ++ "get the last char of left ++ let sexyComMarker = strpart(left, strlen(left)-1) ++ endif ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let sexyComMarker = sexyComMarker . s:spaceStr ++ endif ++ ++ if a:esc ++ let sexyComMarker = s:Esc(sexyComMarker) ++ endif ++ ++ return sexyComMarker ++endfunction ++ ++" Function: s:GetSexyComLeft(space, esc) {{{2 ++" Returns the left delimiter for sexy comments for this filetype or -1 if ++" there is none. C style sexy comments are used if possible ++" Args: ++" -space: specifies if the delim has a space string on the end ++" (the space string will only be added if NERDSpaceDelims is set) ++" -esc: specifies whether the tricky chars in the string are ESCed ++function s:GetSexyComLeft(space, esc) ++ let lenLeft = strlen(b:left) ++ let lenLeftAlt = strlen(b:leftAlt) ++ let left = '' ++ ++ "assume c style sexy comments if possible ++ if s:HasCStyleComments() ++ let left = '/*' ++ else ++ "grab the longest left delim that has a right ++ if s:Multipart() && lenLeft >= lenLeftAlt ++ let left = b:left ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ else ++ return -1 ++ endif ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let left = left . s:spaceStr ++ endif ++ ++ if a:esc ++ let left = s:Esc(left) ++ endif ++ ++ return left ++endfunction ++ ++" Function: s:GetSexyComRight(space, esc) {{{2 ++" Returns the right delimiter for sexy comments for this filetype or -1 if ++" there is none. C style sexy comments are used if possible. ++" Args: ++" -space: specifies if the delim has a space string on the start ++" (the space string will only be added if NERDSpaceDelims ++" is specified for the current filetype) ++" -esc: specifies whether the tricky chars in the string are ESCed ++function s:GetSexyComRight(space, esc) ++ let lenLeft = strlen(b:left) ++ let lenLeftAlt = strlen(b:leftAlt) ++ let right = '' ++ ++ "assume c style sexy comments if possible ++ if s:HasCStyleComments() ++ let right = '*/' ++ else ++ "grab the right delim that pairs with the longest left delim ++ if s:Multipart() && lenLeft >= lenLeftAlt ++ let right = b:right ++ elseif s:AltMultipart() ++ let right = b:rightAlt ++ else ++ return -1 ++ endif ++ endif ++ ++ if a:space && g:NERDSpaceDelims ++ let right = s:spaceStr . right ++ endif ++ ++ if a:esc ++ let right = s:Esc(right) ++ endif ++ ++ return right ++endfunction ++ ++" Function: s:HasMultipartDelims() {{{2 ++" Returns 1 iff the current filetype has at least one set of multipart delims ++function s:HasMultipartDelims() ++ return s:Multipart() || s:AltMultipart() ++endfunction ++ ++" Function: s:HasLeadingTabs(...) {{{2 ++" Returns 1 if any of the given strings have leading tabs ++function s:HasLeadingTabs(...) ++ for s in a:000 ++ if s =~ '^\t.*' ++ return 1 ++ end ++ endfor ++ return 0 ++endfunction ++" Function: s:HasCStyleComments() {{{2 ++" Returns 1 iff the current filetype has c style comment delimiters ++function s:HasCStyleComments() ++ return (b:left == '/*' && b:right == '*/') || (b:leftAlt == '/*' && b:rightAlt == '*/') ++endfunction ++ ++" Function: s:InstallDocumentation(full_name, revision) {{{2 ++" Install help documentation. ++" Arguments: ++" full_name: Full name of this vim plugin script, including path name. ++" revision: Revision of the vim script. #version# mark in the document file ++" will be replaced with this string with 'v' prefix. ++" Return: ++" 1 if new document installed, 0 otherwise. ++" Note: Cleaned and generalized by guo-peng Wen. ++" ++" Note about authorship: this function was taken from the vimspell plugin ++" which can be found at http://www.vim.org/scripts/script.php?script_id=465 ++" ++function s:InstallDocumentation(full_name, revision) ++ " Name of the document path based on the system we use: ++ if has("vms") ++ " No chance that this script will work with ++ " VMS - to much pathname juggling here. ++ return 1 ++ elseif (has("unix")) ++ " On UNIX like system, using forward slash: ++ let l:slash_char = '/' ++ let l:mkdir_cmd = ':silent !mkdir -p ' ++ else ++ " On M$ system, use backslash. Also mkdir syntax is different. ++ " This should only work on W2K and up. ++ let l:slash_char = '\' ++ let l:mkdir_cmd = ':silent !mkdir ' ++ endif ++ ++ let l:doc_path = l:slash_char . 'doc' ++ let l:doc_home = l:slash_char . '.vim' . l:slash_char . 'doc' ++ ++ " Figure out document path based on full name of this script: ++ let l:vim_plugin_path = fnamemodify(a:full_name, ':h') ++ let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . l:doc_path ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ "Doc path: " . l:vim_doc_path ++ call s:NerdEcho("Doc path: " . l:vim_doc_path, 0) ++ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ " Try a default configuration in user home: ++ let l:vim_doc_path = expand("~") . l:doc_home ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' ++ if (!(filewritable(l:vim_doc_path) == 2)) ++ " Put a warning: ++ call s:NerdEcho("Unable to open documentation directory \ntype :help add-local-help for more information.", 0) ++ echo l:vim_doc_path ++ return 0 ++ endif ++ endif ++ endif ++ endif ++ ++ " Exit if we have problem to access the document directory: ++ if (!isdirectory(l:vim_plugin_path) || !isdirectory(l:vim_doc_path) || filewritable(l:vim_doc_path) != 2) ++ return 0 ++ endif ++ ++ " Full name of script and documentation file: ++ let l:script_name = fnamemodify(a:full_name, ':t') ++ let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' ++ let l:plugin_file = l:vim_plugin_path . l:slash_char . l:script_name ++ let l:doc_file = l:vim_doc_path . l:slash_char . l:doc_name ++ ++ " Bail out if document file is still up to date: ++ if (filereadable(l:doc_file) && getftime(l:plugin_file) < getftime(l:doc_file)) ++ return 0 ++ endif ++ ++ " Prepare window position restoring command: ++ if (strlen(@%)) ++ let l:go_back = 'b ' . bufnr("%") ++ else ++ let l:go_back = 'enew!' ++ endif ++ ++ " Create a new buffer & read in the plugin file (me): ++ setl nomodeline ++ exe 'enew!' ++ exe 'r ' . escape(l:plugin_file,s:NERDFileNameEscape) ++ ++ setl modeline ++ let l:buf = bufnr("%") ++ setl noswapfile modifiable ++ ++ norm zR ++ norm gg ++ ++ " Delete from first line to a line starts with ++ " === START_DOC ++ 1,/^=\{3,}\s\+START_DOC\C/ d ++ ++ " Delete from a line starts with ++ " === END_DOC ++ " to the end of the documents: ++ /^=\{3,}\s\+END_DOC\C/,$ d ++ ++ " Remove fold marks: ++ :%s/{\{3}[1-9]/ / ++ ++ " Add modeline for help doc: the modeline string is mangled intentionally ++ " to avoid it be recognized by VIM: ++ call append(line('$'), '') ++ call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') ++ ++ " Replace revision: ++ "exe "normal :1s/#version#/ v" . a:revision . "/\" ++ exe "normal :%s/#version#/ v" . a:revision . "/\" ++ ++ " Save the help document: ++ exe 'w! ' . escape(l:doc_file,s:NERDFileNameEscape) ++ exe l:go_back ++ exe 'bw ' . l:buf ++ ++ " Build help tags: ++ exe 'helptags ' . escape(l:vim_doc_path,s:NERDFileNameEscape) ++ ++ return 1 ++endfunction ++ ++ ++" Function: s:IsCommentedNormOrSexy(lineNum) {{{2 ++"This function is used to determine whether the given line is commented with ++"either set of delimiters or if it is part of a sexy comment ++" ++" Args: ++" -lineNum: the line number of the line to check ++function s:IsCommentedNormOrSexy(lineNum) ++ let theLine = getline(a:lineNum) ++ ++ "if the line is commented normally return 1 ++ if s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) ++ return 1 ++ endif ++ ++ "if the line is part of a sexy comment return 1 ++ if s:IsInSexyComment(a:lineNum) ++ return 1 ++ endif ++ return 0 ++endfunction ++ ++" Function: s:IsCommented(left, right, line) {{{2 ++"This function is used to determine whether the given line is commented with ++"the given delimiters ++" ++" Args: ++" -line: the line that to check if commented ++" -left/right: the left and right delimiters to check for ++function s:IsCommented(left, right, line) ++ "if the line isnt commented return true ++ if s:FindDelimiterIndex(a:left, a:line) != -1 && (s:FindDelimiterIndex(a:right, a:line) != -1 || !s:Multipart()) ++ return 1 ++ endif ++ return 0 ++endfunction ++ ++" Function: s:IsCommentedFromStartOfLine(left, line) {{{2 ++"This function is used to determine whether the given line is commented with ++"the given delimiters at the start of the line i.e the left delimiter is the ++"first thing on the line (apart from spaces\tabs) ++" ++" Args: ++" -line: the line that to check if commented ++" -left: the left delimiter to check for ++function s:IsCommentedFromStartOfLine(left, line) ++ let theLine = s:ConvertLeadingTabsToSpaces(a:line) ++ let numSpaces = strlen(substitute(theLine, '^\( *\).*$', '\1', '')) ++ let delimIndx = s:FindDelimiterIndex(a:left, theLine) ++ return delimIndx == numSpaces ++endfunction ++ ++" Function: s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) {{{2 ++" Finds the type of the outtermost delims on the line ++" ++" Args: ++" -line: the line that to check if the outtermost comments on it are ++" left/right ++" -left/right: the left and right delimiters to check for ++" -leftAlt/rightAlt: the left and right alternative delimiters to check for ++" ++" Returns: ++" 0 if the line is not commented with either set of delims ++" 1 if the line is commented with the left/right delim set ++" 2 if the line is commented with the leftAlt/rightAlt delim set ++function s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) ++ "get the first positions of the left delims and the last positions of the ++ "right delims ++ let indxLeft = s:FindDelimiterIndex(a:left, a:line) ++ let indxLeftAlt = s:FindDelimiterIndex(a:leftAlt, a:line) ++ let indxRight = s:LastIndexOfDelim(a:right, a:line) ++ let indxRightAlt = s:LastIndexOfDelim(a:rightAlt, a:line) ++ ++ "check if the line has a left delim before a leftAlt delim ++ if (indxLeft <= indxLeftAlt || indxLeftAlt == -1) && indxLeft != -1 ++ "check if the line has a right delim after any rightAlt delim ++ if (indxRight > indxRightAlt && indxRight > indxLeft) || !s:Multipart() ++ return 1 ++ endif ++ ++ "check if the line has a leftAlt delim before a left delim ++ elseif (indxLeftAlt <= indxLeft || indxLeft == -1) && indxLeftAlt != -1 ++ "check if the line has a rightAlt delim after any right delim ++ if (indxRightAlt > indxRight && indxRightAlt > indxLeftAlt) || !s:AltMultipart() ++ return 2 ++ endif ++ else ++ return 0 ++ endif ++ ++ return 0 ++ ++endfunction ++ ++ ++" Function: s:IsDelimValid(delimiter, delIndx, line) {{{2 ++" This function is responsible for determining whether a given instance of a ++" comment delimiter is a real delimiter or not. For example, in java the ++" // string is a comment delimiter but in the line: ++" System.out.println("//"); ++" it does not count as a comment delimiter. This function is responsible for ++" distinguishing between such cases. It does so by applying a set of ++" heuristics that are not fool proof but should work most of the time. ++" ++" Args: ++" -delimiter: the delimiter we are validating ++" -delIndx: the position of delimiter in line ++" -line: the line that delimiter occurs in ++" ++" Returns: ++" 0 if the given delimiter is not a real delimiter (as far as we can tell) , ++" 1 otherwise ++function s:IsDelimValid(delimiter, delIndx, line) ++ "get the delimiter without the escchars ++ let l:delimiter = a:delimiter ++ ++ "get the strings before and after the delimiter ++ let preComStr = strpart(a:line, 0, a:delIndx) ++ let postComStr = strpart(a:line, a:delIndx+strlen(delimiter)) ++ ++ "to check if the delimiter is real, make sure it isnt preceded by ++ "an odd number of quotes and followed by the same (which would indicate ++ "that it is part of a string and therefore is not a comment) ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, '"', "\\")) ++ return 0 ++ endif ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "'", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "'", "\\")) ++ return 0 ++ endif ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "`", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "`", "\\")) ++ return 0 ++ endif ++ ++ ++ "if the comment delimiter is escaped, assume it isnt a real delimiter ++ if s:IsEscaped(a:line, a:delIndx, "\\") ++ return 0 ++ endif ++ ++ "vim comments are so fuckin stupid!! Why the hell do they have comment ++ "delimiters that are used elsewhere in the syntax?!?! We need to check ++ "some conditions especially for vim ++ if &filetype == "vim" ++ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) ++ return 0 ++ endif ++ ++ "if the delimiter is on the very first char of the line or is the ++ "first non-tab/space char on the line then it is a valid comment delimiter ++ if a:delIndx == 0 || a:line =~ "^[ \t]\\{" . a:delIndx . "\\}\".*$" ++ return 1 ++ endif ++ ++ let numLeftParen =s:CountNonESCedOccurances(preComStr, "(", "\\") ++ let numRightParen =s:CountNonESCedOccurances(preComStr, ")", "\\") ++ ++ "if the quote is inside brackets then assume it isnt a comment ++ if numLeftParen > numRightParen ++ return 0 ++ endif ++ ++ "if the line has an even num of unescaped "'s then we can assume that ++ "any given " is not a comment delimiter ++ if s:IsNumEven(s:CountNonESCedOccurances(a:line, "\"", "\\")) ++ return 0 ++ endif ++ endif ++ ++ return 1 ++ ++endfunction ++ ++" Function: s:IsNumEven(num) {{{2 ++" A small function the returns 1 if the input number is even and 0 otherwise ++" Args: ++" -num: the number to check ++function s:IsNumEven(num) ++ return (a:num % 2) == 0 ++endfunction ++ ++" Function: s:IsEscaped(str, indx, escChar) {{{2 ++" This function takes a string, an index into that string and an esc char and ++" returns 1 if the char at the index is escaped (i.e if it is preceded by an ++" odd number of esc chars) ++" Args: ++" -str: the string to check ++" -indx: the index into str that we want to check ++" -escChar: the escape char the char at indx may be ESCed with ++function s:IsEscaped(str, indx, escChar) ++ "initialise numEscChars to 0 and look at the char before indx ++ let numEscChars = 0 ++ let curIndx = a:indx-1 ++ ++ "keep going back thru str until we either reach the start of the str or ++ "run out of esc chars ++ while curIndx >= 0 && strpart(a:str, curIndx, 1) == a:escChar ++ ++ "we have found another esc char so add one to the count and move left ++ "one char ++ let numEscChars = numEscChars + 1 ++ let curIndx = curIndx - 1 ++ ++ endwhile ++ ++ "if there is an odd num of esc chars directly before the char at indx then ++ "the char at indx is escaped ++ return !s:IsNumEven(numEscChars) ++endfunction ++ ++" Function: s:IsInSexyComment(line) {{{2 ++" returns 1 if the given line number is part of a sexy comment ++function s:IsInSexyComment(line) ++ return !empty(s:FindBoundingLinesOfSexyCom(a:line)) ++endfunction ++ ++" Function: s:IsSexyComment(topline, bottomline) {{{2 ++" This function takes in 2 line numbers and returns 1 if the lines between and ++" including the given line numbers are a sexy comment. It returns 0 otherwise. ++" Args: ++" -topline: the line that the possible sexy comment starts on ++" -bottomline: the line that the possible sexy comment stops on ++function s:IsSexyComment(topline, bottomline) ++ ++ "get the delim set that would be used for a sexy comment ++ let left = '' ++ let right = '' ++ if s:Multipart() ++ let left = b:left ++ let right = b:right ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ let right = b:rightAlt ++ else ++ return 0 ++ endif ++ ++ "swap the top and bottom line numbers around if need be ++ let topline = a:topline ++ let bottomline = a:bottomline ++ if bottomline < topline ++ topline = bottomline ++ bottomline = a:topline ++ endif ++ ++ "if there is < 2 lines in the comment it cannot be sexy ++ if (bottomline - topline) <= 0 ++ return 0 ++ endif ++ ++ "if the top line doesnt begin with a left delim then the comment isnt sexy ++ if getline(a:topline) !~ '^[ \t]*' . left ++ return 0 ++ endif ++ ++ "if there is a right delim on the top line then this isnt a sexy comment ++ if s:FindDelimiterIndex(right, getline(a:topline)) != -1 ++ return 0 ++ endif ++ ++ "if there is a left delim on the bottom line then this isnt a sexy comment ++ if s:FindDelimiterIndex(left, getline(a:bottomline)) != -1 ++ return 0 ++ endif ++ ++ "if the bottom line doesnt begin with a right delim then the comment isnt ++ "sexy ++ if getline(a:bottomline) !~ '^.*' . right . '$' ++ return 0 ++ endif ++ ++ let sexyComMarker = s:GetSexyComMarker(0, 1) ++ ++ "check each of the intermediate lines to make sure they start with a ++ "sexyComMarker ++ let currentLine = a:topline+1 ++ while currentLine < a:bottomline ++ let theLine = getline(currentLine) ++ ++ if theLine !~ '^[ \t]*' . sexyComMarker ++ return 0 ++ endif ++ ++ "if there is a right delim in an intermediate line then the block isnt ++ "a sexy comment ++ if s:FindDelimiterIndex(right, theLine) != -1 ++ return 0 ++ endif ++ ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ "we have not found anything to suggest that this isnt a sexy comment so ++ return 1 ++ ++endfunction ++ ++" Function: s:LastIndexOfDelim(delim, str) {{{2 ++" This function takes a string and a delimiter and returns the last index of ++" that delimiter in string ++" Args: ++" -delim: the delimiter to look for ++" -str: the string to look for delim in ++function s:LastIndexOfDelim(delim, str) ++ let delim = a:delim ++ let lenDelim = strlen(delim) ++ ++ "set index to the first occurrence of delim. If there is no occurrence then ++ "bail ++ let indx = s:FindDelimiterIndex(delim, a:str) ++ if indx == -1 ++ return -1 ++ endif ++ ++ "keep moving to the next instance of delim in str till there is none left ++ while 1 ++ ++ "search for the next delim after the previous one ++ let searchStr = strpart(a:str, indx+lenDelim) ++ let indx2 = s:FindDelimiterIndex(delim, searchStr) ++ ++ "if we find a delim update indx to record the position of it, if we ++ "dont find another delim then indx is the last one so break out of ++ "this loop ++ if indx2 != -1 ++ let indx = indx + indx2 + lenDelim ++ else ++ break ++ endif ++ endwhile ++ ++ return indx ++ ++endfunction ++ ++" Function: s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 ++" This function takes in 2 line numbers and returns the index of the left most ++" char (that is not a space or a tab) on all of these lines. ++" Args: ++" -countCommentedLines: 1 if lines that are commented are to be checked as ++" well. 0 otherwise ++" -countEmptyLines: 1 if empty lines are to be counted in the search ++" -topline: the top line to be checked ++" -bottomline: the bottom line to be checked ++function s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) ++ ++ " declare the left most index as an extreme value ++ let leftMostIndx = 1000 ++ ++ " go thru the block line by line updating leftMostIndx ++ let currentLine = a:topline ++ while currentLine <= a:bottomline ++ ++ " get the next line and if it is allowed to be commented, or is not ++ " commented, check it ++ let theLine = getline(currentLine) ++ if a:countEmptyLines || theLine !~ '^[ \t]*$' ++ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) ++ " convert spaces to tabs and get the number of leading spaces for ++ " this line and update leftMostIndx if need be ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let leadSpaceOfLine = strlen( substitute(theLine, '\(^[ \t]*\).*$','\1','') ) ++ if leadSpaceOfLine < leftMostIndx ++ let leftMostIndx = leadSpaceOfLine ++ endif ++ endif ++ endif ++ ++ " move on to the next line ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ if leftMostIndx == 1000 ++ return 0 ++ else ++ return leftMostIndx ++ endif ++endfunction ++ ++" Function: s:Multipart() {{{2 ++" returns 1 if the current delims are multipart ++function s:Multipart() ++ return b:right != '' ++endfunction ++ ++" Function: s:NerdEcho(msg, typeOfMsg) {{{2 ++" Args: ++" -msg: the message to echo ++" -typeOfMsg: 0 = warning message ++" 1 = normal message ++function s:NerdEcho(msg, typeOfMsg) ++ if a:typeOfMsg == 0 ++ echohl WarningMsg ++ echo 'NERDCommenter:' . a:msg ++ echohl None ++ elseif a:typeOfMsg == 1 ++ echo 'NERDCommenter:' . a:msg ++ endif ++endfunction ++ ++" Function: s:NumberOfLeadingTabs(s) {{{2 ++" returns the number of leading tabs in the given string ++function s:NumberOfLeadingTabs(s) ++ return strlen(substitute(a:s, '^\(\t*\).*$', '\1', "")) ++endfunction ++ ++" Function: s:NumLinesInBuf() {{{2 ++" Returns the number of lines in the current buffer ++function s:NumLinesInBuf() ++ return line('$') ++endfunction ++ ++" Function: s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) {{{2 ++" This function takes in a string, 2 delimiters in that string and 2 strings ++" to replace these delimiters with. ++" ++" Args: ++" -toReplace1: the first delimiter to replace ++" -toReplace2: the second delimiter to replace ++" -replacor1: the string to replace toReplace1 with ++" -replacor2: the string to replace toReplace2 with ++" -str: the string that the delimiters to be replaced are in ++function s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) ++ let line = s:ReplaceLeftMostDelim(a:toReplace1, a:replacor1, a:str) ++ let line = s:ReplaceRightMostDelim(a:toReplace2, a:replacor2, line) ++ return line ++endfunction ++ ++" Function: s:ReplaceLeftMostDelim(toReplace, replacor, str) {{{2 ++" This function takes a string and a delimiter and replaces the left most ++" occurrence of this delimiter in the string with a given string ++" ++" Args: ++" -toReplace: the delimiter in str that is to be replaced ++" -replacor: the string to replace toReplace with ++" -str: the string that contains toReplace ++function s:ReplaceLeftMostDelim(toReplace, replacor, str) ++ let toReplace = a:toReplace ++ let replacor = a:replacor ++ "get the left most occurrence of toReplace ++ let indxToReplace = s:FindDelimiterIndex(toReplace, a:str) ++ ++ "if there IS an occurrence of toReplace in str then replace it and return ++ "the resulting string ++ if indxToReplace != -1 ++ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) ++ return line ++ endif ++ ++ return a:str ++endfunction ++ ++" Function: s:ReplaceRightMostDelim(toReplace, replacor, str) {{{2 ++" This function takes a string and a delimiter and replaces the right most ++" occurrence of this delimiter in the string with a given string ++" ++" Args: ++" -toReplace: the delimiter in str that is to be replaced ++" -replacor: the string to replace toReplace with ++" -str: the string that contains toReplace ++" ++function s:ReplaceRightMostDelim(toReplace, replacor, str) ++ let toReplace = a:toReplace ++ let replacor = a:replacor ++ let lenToReplace = strlen(toReplace) ++ ++ "get the index of the last delim in str ++ let indxToReplace = s:LastIndexOfDelim(toReplace, a:str) ++ ++ "if there IS a delimiter in str, replace it and return the result ++ let line = a:str ++ if indxToReplace != -1 ++ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) ++ endif ++ return line ++endfunction ++ ++"FUNCTION: s:RestoreScreenState() {{{2 ++" ++"Sets the screen state back to what it was when s:SaveScreenState was last ++"called. ++" ++function s:RestoreScreenState() ++ if !exists("t:NERDComOldTopLine") || !exists("t:NERDComOldPos") ++ throw 'NERDCommenter exception: cannot restore screen' ++ endif ++ ++ call cursor(t:NERDComOldTopLine, 0) ++ normal zt ++ call setpos(".", t:NERDComOldPos) ++endfunction ++ ++" Function: s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 ++" This function takes in 2 line numbers and returns the index of the right most ++" char on all of these lines. ++" Args: ++" -countCommentedLines: 1 if lines that are commented are to be checked as ++" well. 0 otherwise ++" -countEmptyLines: 1 if empty lines are to be counted in the search ++" -topline: the top line to be checked ++" -bottomline: the bottom line to be checked ++function s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) ++ let rightMostIndx = -1 ++ ++ " go thru the block line by line updating rightMostIndx ++ let currentLine = a:topline ++ while currentLine <= a:bottomline ++ ++ " get the next line and see if it is commentable, otherwise it doesnt ++ " count ++ let theLine = getline(currentLine) ++ if a:countEmptyLines || theLine !~ '^[ \t]*$' ++ ++ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) ++ ++ " update rightMostIndx if need be ++ let theLine = s:ConvertLeadingTabsToSpaces(theLine) ++ let lineLen = strlen(theLine) ++ if lineLen > rightMostIndx ++ let rightMostIndx = lineLen ++ endif ++ endif ++ endif ++ ++ " move on to the next line ++ let currentLine = currentLine + 1 ++ endwhile ++ ++ return rightMostIndx ++endfunction ++ ++"FUNCTION: s:SaveScreenState() {{{2 ++"Saves the current cursor position in the current buffer and the window ++"scroll position ++function s:SaveScreenState() ++ let t:NERDComOldPos = getpos(".") ++ let t:NERDComOldTopLine = line("w0") ++endfunction ++ ++" Function: s:SwapOutterMultiPartDelimsForPlaceHolders(line) {{{2 ++" This function takes a line and swaps the outter most multi-part delims for ++" place holders ++" Args: ++" -line: the line to swap the delims in ++" ++function s:SwapOutterMultiPartDelimsForPlaceHolders(line) ++ " find out if the line is commented using normal delims and/or ++ " alternate ones ++ let isCommented = s:IsCommented(b:left, b:right, a:line) ++ let isCommentedAlt = s:IsCommented(b:leftAlt, b:rightAlt, a:line) ++ ++ let line2 = a:line ++ ++ "if the line is commented and there is a right delimiter, replace ++ "the delims with place-holders ++ if isCommented && s:Multipart() ++ let line2 = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, a:line) ++ ++ "similarly if the line is commented with the alternative ++ "delimiters ++ elseif isCommentedAlt && s:AltMultipart() ++ let line2 = s:ReplaceDelims(b:leftAlt, b:rightAlt, g:NERDLPlace, g:NERDRPlace, a:line) ++ endif ++ ++ return line2 ++endfunction ++ ++" Function: s:SwapOutterPlaceHoldersForMultiPartDelims(line) {{{2 ++" This function takes a line and swaps the outtermost place holders for ++" multi-part delims ++" Args: ++" -line: the line to swap the delims in ++" ++function s:SwapOutterPlaceHoldersForMultiPartDelims(line) ++ let left = '' ++ let right = '' ++ if s:Multipart() ++ let left = b:left ++ let right = b:right ++ elseif s:AltMultipart() ++ let left = b:leftAlt ++ let right = b:rightAlt ++ endif ++ ++ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, a:line) ++ return line ++endfunction ++" Function: s:TabbedCol(line, col) {{{2 ++" Gets the col number for given line and existing col number. The new col ++" number is the col number when all leading spaces are converted to tabs ++" Args: ++" -line:the line to get the rel col for ++" -col: the abs col ++function s:TabbedCol(line, col) ++ let lineTruncated = strpart(a:line, 0, a:col) ++ let lineSpacesToTabs = substitute(lineTruncated, s:TabSpace(), '\t', 'g') ++ return strlen(lineSpacesToTabs) ++endfunction ++"FUNCTION: s:TabSpace() {{{2 ++"returns a string of spaces equal in length to &tabstop ++function s:TabSpace() ++ let tabSpace = "" ++ let spacesPerTab = &tabstop ++ while spacesPerTab > 0 ++ let tabSpace = tabSpace . " " ++ let spacesPerTab = spacesPerTab - 1 ++ endwhile ++ return tabSpace ++endfunction ++ ++" Function: s:UnEsc(str, escChar) {{{2 ++" This function removes all the escape chars from a string ++" Args: ++" -str: the string to remove esc chars from ++" -escChar: the escape char to be removed ++function s:UnEsc(str, escChar) ++ return substitute(a:str, a:escChar, "", "g") ++endfunction ++ ++" Function: s:UntabbedCol(line, col) {{{2 ++" Takes a line and a col and returns the absolute column of col taking into ++" account that a tab is worth 3 or 4 (or whatever) spaces. ++" Args: ++" -line:the line to get the abs col for ++" -col: the col that doesnt take into account tabs ++function s:UntabbedCol(line, col) ++ let lineTruncated = strpart(a:line, 0, a:col) ++ let lineTabsToSpaces = substitute(lineTruncated, '\t', s:TabSpace(), 'g') ++ return strlen(lineTabsToSpaces) ++endfunction ++" Section: Comment mapping setup {{{1 ++" =========================================================================== ++" This is where the mappings calls are made that set up the commenting key ++" mappings. ++ ++" set up the mapping to switch to/from alternative delimiters ++execute 'nnoremap ' . g:NERDAltComMap . ' :call SwitchToAlternativeDelimiters(1)' ++ ++" set up the mappings to comment out lines ++execute 'nnoremap ' . g:NERDComLineMap . ' :call NERDComment(0, "norm")' ++execute 'vnoremap ' . g:NERDComLineMap . ' :call NERDComment(1, "norm")' ++ ++" set up the mappings to do toggle comments ++execute 'nnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(0, "toggle")' ++execute 'vnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(1, "toggle")' ++ ++" set up the mapp to do minimal comments ++execute 'nnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(0, "minimal")' ++execute 'vnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(1, "minimal")' ++ ++" set up the mappings to comment out lines sexily ++execute 'nnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(0, "sexy")' ++execute 'vnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(1, "sexy")' ++ ++" set up the mappings to do invert comments ++execute 'nnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(0, "invert")' ++execute 'vnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(1, "invert")' ++ ++" set up the mappings to yank then comment out lines ++execute 'nmap ' . g:NERDComLineYankMap . ' :call NERDComment(0, "yank")' ++execute 'vmap ' . g:NERDComLineYankMap . ' :call NERDComment(1, "yank")' ++ ++" set up the mappings for left aligned comments ++execute 'nnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(0, "alignLeft")' ++execute 'vnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(1, "alignLeft")' ++ ++" set up the mappings for right aligned comments ++execute 'nnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(0, "alignRight")' ++execute 'vnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(1, "alignRight")' ++ ++" set up the mappings for left and right aligned comments ++execute 'nnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(0, "alignBoth")' ++execute 'vnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(1, "alignBoth")' ++ ++" set up the mappings to do nested comments ++execute 'nnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(0, "nested")' ++execute 'vnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(1, "nested")' ++ ++" set up the mapping to uncomment a line ++execute 'nnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(0, "uncomment")' ++execute 'vnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(1, "uncomment")' ++ ++" set up the mapping to comment out to the end of the line ++execute 'nnoremap ' . g:NERDComToEOLMap . ' :call NERDComment(0, "toEOL")' ++ ++" set up the mappings to append comments to the line ++execute 'nmap ' . g:NERDAppendComMap . ' :call NERDComment(0, "append")' ++ ++" set up the mappings to append comments to the line ++execute 'nmap ' . g:NERDPrependComMap . ' :call NERDComment(0, "prepend")' ++ ++" set up the mapping to insert comment delims at the cursor position in insert mode ++execute 'inoremap ' . g:NERDComInInsertMap . ' ' . ':call NERDComment(0, "insert")' ++ ++" Section: Menu item setup {{{1 ++" =========================================================================== ++"check if the user wants the menu to be displayed ++if g:NERDMenuMode != 0 ++ ++ let menuRoot = "" ++ if g:NERDMenuMode == 1 ++ let menuRoot = 'comment' ++ elseif g:NERDMenuMode == 2 ++ let menuRoot = '&comment' ++ elseif g:NERDMenuMode == 3 ++ let menuRoot = '&Plugin.&comment' ++ endif ++ ++ execute 'nmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(0, "norm")' ++ execute 'vmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(1, "norm")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(0, "toggle")' ++ execute 'vmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(1, "toggle")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(0, "minimal")' ++ execute 'vmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(1, "minimal")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(0, "nested")' ++ execute 'vmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(1, "nested")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ To\ EOL' . escape(g:NERDComToEOLMap, '\') . ' :call NERDComment(0, "toEOL")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(0,"invert")' ++ execute 'vmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(1,"invert")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(0,"sexy")' ++ execute 'vmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(1,"sexy")' ++ ++ execute 'nmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0Y' . g:NERDComLineMap ++ execute 'vmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0ygv' . g:NERDComLineMap ++ ++ execute 'nmenu '. menuRoot .'.Append\ Comment\ to\ Line' . escape(g:NERDAppendComMap, '\') . ' :call NERDComment(0, "append")' ++ execute 'nmenu '. menuRoot .'.Prepend\ Comment\ to\ Line' . escape(g:NERDPrependComMap, '\') . ' :call NERDComment(0, "prepend")' ++ ++ execute 'menu '. menuRoot .'.-Sep- :' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(0, "alignLeft")' ++ execute 'vmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(1, "alignLeft")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(0, "alignRight")' ++ execute 'vmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(1, "alignRight")' ++ ++ execute 'nmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(0, "alignBoth")' ++ execute 'vmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(1, "alignBoth")' ++ ++ execute 'menu '. menuRoot .'.-Sep2- :' ++ ++ execute 'menu '. menuRoot .'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(0, "uncomment")' ++ execute 'vmenu ' . menuRoot.'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(1, "uncomment")' ++ ++ execute 'menu '. menuRoot .'.-Sep3- :' ++ ++ execute 'nmenu '. menuRoot .'.Use\ Alternative\ Delimiters' . escape(g:NERDAltComMap, '\') . ' :call SwitchToAlternativeDelimiters(1)' ++ ++ ++ execute 'imenu '. menuRoot .'.Insert\ Delims' . escape(g:NERDComInInsertMap, '\') . ' :call NERDComment(0, "insert")' ++ ++ execute 'menu '. menuRoot .'.-Sep4- :' ++ ++ execute 'menu '. menuRoot .'.Help:help\ NERDCommenterContents :help NERDCommenterContents' ++endif ++ ++" Section: Doc installation call {{{1 ++silent call s:InstallDocumentation(expand(':p'), s:NERD_commenter_version) ++ ++finish ++"============================================================================= ++" Section: The help file {{{1 ++" Title {{{2 ++" ============================================================================ ++=== START_DOC ++*NERD_commenter.txt* Plugin for commenting code #version# ++ ++ ++ NERD COMMENTER REFERENCE MANUAL~ ++ ++ ++ ++ ++ ++============================================================================== ++CONTENTS {{{2 *NERDCommenterContents* ++ ++ 1.Intro...................................|NERDCommenter| ++ 2.Functionality provided..................|NERDComFunctionality| ++ 2.1 Functionality Summary.............|NERDComFunctionalitySummary| ++ 2.2 Functionality Details.............|NERDComFunctionalityDetails| ++ 2.2.1 Comment map.................|NERDComComment| ++ 2.2.2 Nested comment map..........|NERDComNestedComment| ++ 2.2.3 Toggle comment map..........|NERDComToggleComment| ++ 2.2.4 Minimal comment map.........|NERDComMinimalComment| ++ 2.2.5 Invert comment map..........|NERDComInvertComment| ++ 2.2.6 Sexy comment map............|NERDComSexyComment| ++ 2.2.7 Yank comment map............|NERDComYankComment| ++ 2.2.8 Comment to EOL map..........|NERDComEOLComment| ++ 2.2.9 Append com to line map......|NERDComAppendComment| ++ 2.2.10 Prepend com to line map....|NERDComPrependComment| ++ 2.2.11 Insert comment map.........|NERDComInsertComment| ++ 2.2.12 Use alternate delims map...|NERDComAltDelim| ++ 2.2.13 Comment aligned maps.......|NERDComAlignedComment| ++ 2.2.14 Uncomment line map.........|NERDComUncommentLine| ++ 2.3 Supported filetypes...............|NERDComFiletypes| ++ 2.4 Sexy Comments.....................|NERDComSexyComments| ++ 2.5 The NERDComment function..........|NERDComNERDComment| ++ 3.Options.................................|NERDComOptions| ++ 3.1 Options summary...................|NERDComOptionsSummary| ++ 3.2 Options details...................|NERDComOptionsDetails| ++ 3.3 Default delimiter Options.........|NERDComDefaultDelims| ++ 3.4 Key mapping Options...............|NERDComMappings| ++ 4.Issues with the script..................|NERDComIssues| ++ 4.1 Delimiter detection heuristics....|NERDComHeuristics| ++ 4.2 Nesting issues....................|NERDComNesting| ++ 5.The author..............................|NERDComAuthor| ++ 6.TODO list...............................|NERDComTodo| ++ 7.Changelog...............................|NERDComChangelog| ++ 8.Credits.................................|NERDComCredits| ++ ++============================================================================== ++1. Intro {{{2 *NERDCommenter* ++ ++The NERD commenter provides many different commenting operations and styles ++which may be invoked via key mappings and a commenting menu. These operations ++are available for most filetypes. ++ ++There are also options available that allow you to tweak the commenting engine ++to you taste. ++ ++============================================================================== ++2. Functionality provided {{{2 *NERDComFunctionality* ++ ++------------------------------------------------------------------------------ ++2.1 Functionality summary {{{3 *NERDComFunctionalitySummary* ++ ++The following key mappings are provided by default (there is also a menu ++provided that contains menu items corresponding to all the below mappings): ++ ++Most of the following mappings are for normal/visual mode only. The ++|NERDComInsertComment| mapping is for insert mode only. ++ ++[count],cc |NERDComComment| ++Comments out the current line or text selected in visual mode. ++ ++ ++[count],cn |NERDComNestedComment| ++Same as |NERDComComment| but forces nesting. ++ ++ ++[count],c |NERDComToggleComment| ++Toggles the comment state of the selected line(s). If the topmost selected ++line is commented, all selected lines are uncommented and vice versa. ++ ++ ++[count],cm |NERDComMinimalComment| ++Comments the given lines using only one set of multipart delimiters if ++possible. ++ ++ ++[count],ci |NERDComInvertComment| ++Toggles the comment state of the selected line(s) individually. Each selected ++line that is commented is uncommented and vice versa. ++ ++ ++[count],cs |NERDComSexyComment| ++Comments out the selected lines ``sexually'' ++ ++ ++[count],cy |NERDComYankComment| ++Same as |NERDComComment| except that the commented line(s) are yanked ++before commenting. ++ ++ ++,c$ |NERDComEOLComment| ++Comments the current line from the cursor to the end of line. ++ ++ ++,cA |NERDComAppendComment| ++Adds comment delimiters to the end of line and goes into insert mode between ++them. ++ ++ ++,cI |NERDComPrependComment| ++Adds comment delimiters to the start of line and goes into insert mode between ++them. ++ ++ ++ |NERDComInsertComment| ++Adds comment delimiters at the current cursor position and inserts between. ++ ++ ++,ca |NERDComAltDelim| ++Switches to the alternative set of delimiters. ++ ++ ++[count],cl ++[count],cr ++[count],cb |NERDComAlignedComment| ++Same as |NERDComComment| except that the delimiters are aligned down the ++left side (,cl), the right side (,cr) or both sides ++(,cb). ++ ++ ++[count],cu |NERDComUncommentLine| ++Uncomments the selected line(s). ++ ++------------------------------------------------------------------------------ ++2.2 Functionality details {{{3 *NERDComFunctionalityDetails* ++ ++------------------------------------------------------------------------------ ++2.2.1 Comment map *NERDComComment* ++ ++Default mapping: [count],cc ++Change the mapping with: NERDComLineMap. ++Applicable modes: normal visual visual-line visual-block. ++ ++ ++Comments out the current line. If multiple lines are selected in visual-line ++mode, they are all commented out. If some text is selected in visual or ++visual-block mode then the script will try to comment out the exact text that ++is selected using multi-part delimiters if they are available. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.2 Nested comment map *NERDComNestedComment* ++ ++Default mapping: [count],cn ++Change the mapping with: NERDComLineNestMap. ++Applicable modes: normal visual visual-line visual-block. ++ ++Performs nested commenting. Works the same as ,cc except that if a ++line is already commented then it will be commented again. ++ ++If |NERDUsePlaceHolders| is set then the previous comment delimiters will ++be replaced by place-holder delimiters if needed. Otherwise the nested ++comment will only be added if the current commenting delimiters have no right ++delimiter (to avoid syntax errors) ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++Related options: ++|NERDDefaultNesting| ++ ++------------------------------------------------------------------------------ ++2.2.3 Toggle comment map *NERDComToggleComment* ++ ++Default mapping: [count],c ++Change the mapping with: NERDComLineToggleMap. ++Applicable modes: normal visual-line. ++ ++Toggles commenting of the lines selected. The behaviour of this mapping ++depends on whether the first line selected is commented or not. If so, all ++selected lines are uncommented and vice versa. ++ ++With this mapping, a line is only considered to be commented if it starts with ++a left delimiter. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.4 Minimal comment map *NERDComMinimalComment* ++ ++Default mapping: [count],cm ++Change the mapping with: NERDComLineMinimalMap ++Applicable modes: normal visual-line. ++ ++Comments the selected lines using one set of multipart delimiters if possible. ++ ++For example: if you are programming in c and you select 5 lines and press ++,cm then a '/*' will be placed at the start of the top line and a '*/' ++will be placed at the end of the last line. ++ ++Sets of multipart comment delimiters that are between the top and bottom ++selected lines are replaced with place holders (see |NERDLPlace|) if ++|NERDUsePlaceHolders| is set for the current filetype. If it is not, then ++the comment will be aborted if place holders are required to prevent illegal ++syntax. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.5 Invert comment map *NERDComInvertComment* ++ ++Default mapping: ,ci ++Change the mapping with: NERDComLineInvertMap. ++Applicable modes: normal visual-line. ++ ++Inverts the commented state of each selected line. If the a selected line is ++commented then it is uncommented and vice versa. Each line is examined and ++commented/uncommented individually. ++ ++With this mapping, a line is only considered to be commented if it starts with ++a left delimiter. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.6 Sexy comment map *NERDComSexyComment* ++ ++Default mapping: [count],cs ++Change the mapping with: NERDComLineSexyMap ++Applicable modes: normal, visual-line. ++ ++Comments the selected line(s) ``sexily''... see |NERDComSexyComments| for ++a description of what sexy comments are. Can only be done on filetypes for ++which there is at least one set of multipart comment delimiters specified. ++ ++Sexy comments cannot be nested and lines inside a sexy comment cannot be ++commented again. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++Related options: ++|NERDCompactSexyComs| ++ ++------------------------------------------------------------------------------ ++2.2.7 Yank comment map *NERDComYankComment* ++ ++Default mapping: [count],cy ++Change the mapping with: NERDComLineYankMap ++Applicable modes: normal visual visual-line visual-block. ++ ++Same as ,cc except that it yanks the line(s) that are commented first. ++ ++------------------------------------------------------------------------------ ++2.2.8 Comment to EOL map *NERDComEOLComment* ++ ++Default mapping: ,c$ ++Change the mapping with: NERDComToEOLMap ++Applicable modes: normal. ++ ++Comments the current line from the current cursor position up to the end of ++the line. ++ ++------------------------------------------------------------------------------ ++2.2.9 Append com to line map *NERDComAppendComment* ++ ++Default mapping: ,cA ++Change the mapping with: NERDAppendComMap. ++Applicable modes: normal. ++ ++Appends comment delimiters to the end of the current line and goes ++to insert mode between the new delimiters. ++ ++------------------------------------------------------------------------------ ++2.2.10 Prepend com to line map *NERDComPrependComment* ++ ++Default mapping: ,cI ++Change the mapping with: NERDPrependComMap. ++Applicable modes: normal. ++ ++Prepends comment delimiters to the start of the current line and goes to ++insert mode between the new delimiters. ++ ++------------------------------------------------------------------------------ ++2.2.11 Insert comment map *NERDComInsertComment* ++ ++Default mapping: ++Change the mapping with: NERDComInInsertMap. ++Applicable modes: insert. ++ ++Adds comment delimiters at the current cursor position and inserts ++between them. ++ ++------------------------------------------------------------------------------ ++2.2.12 Use alternate delims map *NERDComAltDelim* ++ ++Default mapping: ,ca ++Change the mapping with: NERDAltComMap ++Applicable modes: normal. ++ ++Changes to the alternative commenting style if one is available. For example, ++if the user is editing a c++ file using // comments and they hit ,ca ++then they will be switched over to /**/ comments. ++ ++See also |NERDComDefaultDelims| ++ ++------------------------------------------------------------------------------ ++2.2.13 Comment aligned maps *NERDComAlignedComment* ++ ++Default mappings: [count],cl [count],cr [count],cb ++Change the mappings with: NERDComAlignLeftMap, NERDComAlignRightMap and ++NERDComAlignBothMap. ++Applicable modes: normal visual-line. ++ ++Same as ,cc except that the comment delimiters are aligned on the left ++side, right side or both sides respectively. These comments are always nested ++if the line(s) are already commented. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++------------------------------------------------------------------------------ ++2.2.14 Uncomment line map *NERDComUncommentLine* ++ ++Default mapping: [count],cu ++Change the mapping with: NERDUncomLineMap. ++Applicable modes: normal visual visual-line visual-block. ++ ++Uncomments the current line. If multiple lines are selected in ++visual mode then they are all uncommented. ++ ++When uncommenting, if the line contains multiple sets of delimiters then the ++``outtermost'' pair of delimiters will be removed. ++ ++The script uses a set of heurisics to distinguish ``real'' delimiters from ++``fake'' ones when uncommenting. See |NERDComIssues| for details. ++ ++If a [count] is given in normal mode, the mapping works as though that many ++lines were selected in visual-line mode. ++ ++Related options: ++|NERDRemoveAltComs| ++|NERDRemoveExtraSpaces| ++ ++------------------------------------------------------------------------------ ++2.3 Supported filetypes {{{3 *NERDComFiletypes* ++ ++Filetypes that can be commented by this plugin: ++abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asn ++aspvbs atlas autohotkey autoit automake ave awk basic b bc bdf bib bindzone ++bst btm caos catalog c cfg cg ch changelog cl clean clipper cmake conf config ++context cpp crontab cs csc csp css cterm cupl csv cvs dcl debchangelog ++debcontrol debsources def diff django docbk dns dosbatch dosini dot dracula ++dsl dtd dtml dylan ecd eiffel elf elmfilt erlang eruby eterm expect exports ++fetchmail fgl focexec form fortran foxpro fstab fvwm fx gdb gdmo geek ++gentoo-package-keywords' gentoo-package-mask' gentoo-package-use' gnuplot ++gtkrc haskell hb h help hercules hog html htmldjango htmlos ia64 icon idlang ++idl indent inform inittab ishd iss ist jam java javascript jess jgraph ++jproperties jproperties jsp kconfig kix kscript lace lex lftp lifelines lilo ++lisp lite lotos lout lprolog lscript lss lua lynx m4 mail make maple masm ++master matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc ++named nasm nastran natural ncf netdict netrw nqc nroff nsis objc ocaml occam ++omlet omnimark openroad opl ora otl ox pascal passwd pcap pccts perl pfmain ++php phtml pic pike pilrc pine plaintex plm plsql po postscr pov povini ppd ++ppwiz procmail progress prolog psf ptcap python python qf radiance ratpoison r ++rc readline rebol registry remind rexx robots rpl rtf ruby sa samba sas sass ++sather scheme scilab screen scsh sdl sed selectbuf sgml sgmldecl sgmllnx sh ++sicad simula sinda skill slang sl slrnrc sm smarty smil smith sml snnsnet ++snnspat snnsres snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp ++strace svn systemverilog tads taglist tags tak tasm tcl terminfo tex text ++plaintex texinfo texmf tf tidy tli trasys tsalt tsscl tssgm uc uil vb verilog ++verilog_systemverilog vgrindefs vhdl vim viminfo virata vo_base vrml vsejcl ++webmacro wget winbatch wml wvdial xdefaults xf86conf xhtml xkb xmath xml ++xmodmap xpm2 xpm xslt yacc yaml z8a ++ ++If a language is not in the list of hardcoded supported filetypes then the ++&commentstring vim option is used. ++ ++------------------------------------------------------------------------------ ++2.4 Sexy Comments {{{3 *NERDComSexyComments* ++These are comments that use one set of multipart comment delimiters as well as ++one other marker symbol. For example: > ++ /* ++ * This is a c style sexy comment ++ * So there! ++ */ ++ ++ /* This is a c style sexy comment ++ * So there! ++ * But this one is ``compact'' style */ ++< ++Here the multipart delimiters are /* and */ and the marker is *. The NERD ++commenter is capable of adding and removing comments of this type. ++ ++------------------------------------------------------------------------------ ++2.5 The NERDComment function {{{3 *NERDComNERDComment* ++ ++All of the NERD commenter mappings and menu items invoke a single function ++which delegates the commenting work to other functions. This function is ++public and has the prototype: > ++ function! NERDComment(isVisual, type) ++< ++The arguments to this function are simple: ++ - isVisual: if you wish to do any kind of visual comment then set this to ++ 1 and the function will use the '< and '> marks to find the comment ++ boundries. If set to 0 then the function will operate on the current ++ line. ++ - type: is used to specify what type of commenting operation is to be ++ performed, and it can be one of the following: 'sexy', 'invert', ++ 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', ++ 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' ++ ++For example, if you typed > ++ :call NERDComment(1, 'sexy') ++< ++then the script would do a sexy comment on the last visual selection. ++ ++ ++============================================================================== ++3. Options {{{2 *NERDComOptions* ++ ++------------------------------------------------------------------------------ ++3.1 Options summary *NERDComOptionsSummary* ++ ++|loaded_nerd_comments| Turns off the script. ++|NERDAllowAnyVisualDelims| Allows multipart alternative delims to ++ be used when commenting in ++ visual/visual-block mode. ++|NERDBlockComIgnoreEmpty| Forces right delims to be placed when ++ doing visual-block comments. ++|NERDCommentWholeLinesInVMode| Changes behaviour of visual comments. ++|NERDDefaultNesting| Tells the script to use nested comments ++ by default. ++|NERDMenuMode| Specifies how the NERD commenter menu ++ will appear (if at all). ++|NERDLPlace| Specifies what to use as the left ++ delimiter placeholder when nesting ++ comments. ++|NERDMapleader| Specifies what all the commenting key ++ mappings will begin with. ++|NERDUsePlaceHolders| Specifies which filetypes may use ++ placeholders when nesting comments. ++|NERDRemoveAltComs| Tells the script whether to remove ++ alternative comment delimiters when ++ uncommenting. ++|NERDRemoveExtraSpaces| Tells the script to always remove the ++ extra spaces when uncommenting ++ (regardless of whether NERDSpaceDelims ++ is set) ++|NERDRPlace| Specifies what to use as the right ++ delimiter placeholder when nesting ++ comments. ++|NERDShutUp| Stops "Unknown filetype" output from the ++ script ++|NERDSpaceDelims| Specifies whether to add extra spaces ++ around delimiters when commenting, and ++ whether to remove them when ++ uncommenting. ++|NERDCompactSexyComs| Specifies whether to use the compact ++ style sexy comments. ++ ++------------------------------------------------------------------------------ ++3.3 Options details *NERDComOptionsDetails* ++ ++To enable any of the below options you should put the given line in your ++~/.vimrc ++ ++ *loaded_nerd_comments* ++If this script is driving you insane you can turn it off by setting this ++option > ++ let loaded_nerd_comments=1 ++< ++------------------------------------------------------------------------------ ++ *NERDAllowAnyVisualDelims* ++Values: 0 or 1. ++Default: 1. ++ ++If set to 1 then, when doing a visual or visual-block comment (but not a ++visual-line comment), the script will choose the right delimiters to use for ++the comment. This means either using the current delimiters if they are ++multipart or using the alternative delimiters if THEY are multipart. For ++example if we are editing the following java code: > ++ float foo = 1221; ++ float bar = 324; ++ System.out.println(foo * bar); ++< ++If we are using // comments and select the "foo" and "bar" in visual-block ++mode, as shown left below (where '|'s are used to represent the visual-block ++boundary), and comment it then the script will use the alternative delims as ++shown on the right: > ++ ++ float |foo| = 1221; float /*foo*/ = 1221; ++ float |bar| = 324; float /*bar*/ = 324; ++ System.out.println(foo * bar); System.out.println(foo * bar); ++< ++------------------------------------------------------------------------------ ++ *NERDBlockComIgnoreEmpty* ++Values: 0 or 1. ++Default: 1. ++ ++This option affects visual-block mode commenting. If this option is turned ++on, lines that begin outside the right boundary of the selection block will be ++ignored. ++ ++For example, if you are commenting this chunk of c code in visual-block mode ++(where the '|'s are used to represent the visual-block boundary) > ++ #include ++ #include ++ #include ++ |int| main(){ ++ | | printf("SUCK THIS\n"); ++ | | while(1){ ++ | | fork(); ++ | | } ++ |} | ++< ++If NERDBlockComIgnoreEmpty=0 then this code will become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ /* */ printf("SUCK THIS\n"); ++ /* */ while(1){ ++ /* */ fork(); ++ /* */ } ++ /*} */ ++< ++Otherwise, the code block would become: > ++ #include ++ #include ++ #include ++ /*int*/ main(){ ++ printf("SUCK THIS\n"); ++ while(1){ ++ fork(); ++ } ++ /*} */ ++< ++------------------------------------------------------------------------------ ++ *NERDCommentWholeLinesInVMode* ++Values: 0, 1 or 2. ++Default: 0. ++ ++By default the script tries to comment out exactly what is selected in visual ++mode (v). For example if you select and comment the following c code (using | ++to represent the visual boundary): > ++ in|t foo = 3; ++ int bar =| 9; ++ int baz = foo + bar; ++< ++This will result in: > ++ in/*t foo = 3;*/ ++ /*int bar =*/ 9; ++ int baz = foo + bar; ++< ++But some people prefer it if the whole lines are commented like: > ++ /*int foo = 3;*/ ++ /*int bar = 9;*/ ++ int baz = foo + bar; ++< ++If you prefer the second option then stick this line in your vimrc: > ++ let NERDCommentWholeLinesInVMode=1 ++< ++ ++If the filetype you are editing only has no multipart delimiters (for example ++a shell script) and you hadnt set this option then the above would become > ++ in#t foo = 3; ++ #int bar = 9; ++< ++(where # is the comment delimiter) as this is the closest the script can ++come to commenting out exactly what was selected. If you prefer for whole ++lines to be commented out when there is no multipart delimiters but the EXACT ++text that was selected to be commented out if there IS multipart delimiters ++then stick the following line in your vimrc: > ++ let NERDCommentWholeLinesInVMode=2 ++< ++ ++Note that this option does not affect the behaviour of |visual-block| mode. ++ ++------------------------------------------------------------------------------ ++ *NERDRemoveAltComs* ++Values: 0 or 1. ++Default: 1. ++ ++When uncommenting a line (for a filetype with an alternative commenting style) ++this option tells the script whether to look for, and remove, comments ++delimiters of the alternative style. ++ ++For example, if you are editing a c++ file using // style comments and you go ++,cu on this line: > ++ /* This is a c++ comment baby! */ ++< ++It will not be uncommented if the NERDRemoveAltComs is set to 0. ++ ++------------------------------------------------------------------------------ ++ *NERDRemoveExtraSpaces* ++Values: 0 or 1. ++Default: 1. ++ ++By default, the NERD commenter will remove spaces around comment delimiters if ++either: ++1. |NERDSpaceDelims| is set to 1. ++2. NERDRemoveExtraSpaces is set to 1. ++ ++This means that if we have the following lines in a c code file: > ++ /* int foo = 5; */ ++ /* int bar = 10; */ ++ int baz = foo + bar ++< ++If either of the above conditions hold then if these lines are uncommented ++they will become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++Otherwise they would become: > ++ int foo = 5; ++ int bar = 10; ++ int baz = foo + bar ++< ++If you want the spaces to be removed only if |NERDSpaceDelims| is set then ++set NERDRemoveExtraSpaces to 0. ++ ++------------------------------------------------------------------------------ ++ *NERDLPlace* ++ *NERDRPlace* ++Values: arbitrary string. ++Default: ++ NERDLPlace: "[>" ++ NERDRPlace: "<]" ++ ++These options are used to control the strings used as place-holder delimiters. ++Place holder delimiters are used when performing nested commenting when the ++filetype supports commenting styles with both left and right delimiters. ++To set these options use lines like: > ++ let NERDLPlace="FOO" ++ let NERDRPlace="BAR" ++< ++Following the above example, if we have line of c code: > ++ /* int horse */ ++< ++and we comment it with ,cn it will be changed to: > ++ /*FOO int horse BAR*/ ++< ++When we uncomment this line it will go back to what it was. ++ ++------------------------------------------------------------------------------ ++ *NERDMapleader* ++Values: arbitrary string. ++Default: \c ++ ++NERDMapleader is used to specify what all the NERD commenter key mappings ++begin with. ++ ++The default key mappings will look like this: > ++ \cc ++ \cu ++ \ca ++ \ci ++ \cs ++ ... ++< ++However, if this line: > ++ let NERDMapleader = ',x' ++< ++were present in your vimrc then the default mappings would look like this: > ++ ,xc ++ ,xu ++ ,xa ++ ,xi ++ ,xs ++ ... ++< ++This option only affects the mappings that have not been explicitly set ++manually (see |NERDComMappings|). ++ ++------------------------------------------------------------------------------ ++ *NERDMenuMode* ++Values: 0, 1, 2, 3. ++Default: 3 ++ ++This option can take 4 values: ++ "0": Turns the menu off. ++ "1": Turns the 'comment' menu on with no menu shortcut. ++ "2": Turns the 'comment 'menu on with -c as the shortcut. ++ "3": Turns the 'Plugin -> comment' menu on with -c as the shortcut. ++ ++------------------------------------------------------------------------------ ++ *NERDUsePlaceHolders* ++Values: 0 or 1. ++Default 1. ++ ++This option is used to specify whether place-holder delimiters should be used ++when adding nested comments. ++ ++------------------------------------------------------------------------------ ++ *NERDShutUp* ++Values: 0 or 1. ++Default 1. ++ ++This option is used to prevent the script from echoing "Unknown filetype" ++messages. Stick this line in your vimrc: > ++ let NERDShutUp=1 ++< ++------------------------------------------------------------------------------ ++ *NERDSpaceDelims* ++Values: 0 or 1. ++Default 0. ++ ++Some people prefer a space after the left delimiter and before the right ++delimiter like this: > ++ /* int foo=2; */ ++< ++as opposed to this: > ++ /*int foo=2;*/ ++< ++If you want spaces to be added then set NERDSpaceDelims to 1 in your vimrc. ++ ++See also |NERDRemoveExtraSpaces|. ++ ++------------------------------------------------------------------------------ ++ *NERDCompactSexyComs* ++Values: 0 or 1. ++Default 0. ++ ++Some people may want their sexy comments to be like this: > ++ /* Hi There! ++ * This is a sexy comment ++ * in c */ ++< ++As opposed to like this: > ++ /* ++ * Hi There! ++ * This is a sexy comment ++ * in c ++ */ ++< ++If this option is set to 1 then the top style will be used. ++ ++------------------------------------------------------------------------------ ++ *NERDDefaultNesting* ++Values: 0 or 1. ++Default 0. ++ ++When this option is set to 1, comments are nested automatically. That is, if ++you hit ,cc on a line that is already commented it will be commented ++again ++ ++------------------------------------------------------------------------------ ++3.3 Default delimiter customisation *NERDComDefaultDelims* ++ ++If you want the NERD commenter to use the alternative delimiters for a ++specific filetype by default then put a line of this form into your vimrc: > ++ let NERD_<&filetype>_alt_style=1 ++< ++Example: java uses // style comments by default, but you want it to default to ++/* */ style comments instead. You would put this line in your vimrc: > ++ let NERD_java_alt_style=1 ++< ++ ++See |NERDComAltDelim| for switching commenting styles at runtime. ++ ++------------------------------------------------------------------------------ ++3.4 Key mapping customisation *NERDComMappings* ++ ++These options are used to override the default keys that are used for the ++commenting mappings. Their values must be set to strings. As an example: if ++you wanted to use the mapping ,foo to uncomment lines of code then ++you would place this line in your vimrc > ++ let NERDUncomLineMap=",foo" ++< ++Check out |NERDComFunctionality| for details about what the following ++mappings do. ++ ++Default Mapping Option to override~ ++ ++,ca NERDAltComMap ++,ce NERDAppendComMap ++,cl NERDComAlignLeftMap ++,cb NERDComAlignBothMap ++,cr NERDComAlignRightMap ++ NERDComInInsertMap ++,ci NERDComLineInvertMap ++,cc NERDComLineMap ++,cn NERDComLineNestMap ++,cs NERDComLineSexyMap ++,c NERDComLineToggleMap ++,cm NERDComLineMinimalMap ++,c$ NERDComToEOLMap ++,cy NERDComLineYankMap ++,cu NERDUncomLineMap ++ ++============================================================================== ++4. Issues with the script{{{2 *NERDComIssues* ++ ++ ++------------------------------------------------------------------------------ ++4.1 Delimiter detection heuristics *NERDComHeuristics* ++ ++Heuristics are used to distinguish the real comment delimiters ++ ++Because we have comment mappings that place delimiters in the middle of lines, ++removing comment delimiters is a bit tricky. This is because if comment ++delimiters appear in a line doesnt mean they really ARE delimiters. For ++example, Java uses // comments but the line > ++ System.out.println("//"); ++< ++clearly contains no real comment delimiters. ++ ++To distinguish between ``real'' comment delimiters and ``fake'' ones we use a ++set of heuristics. For example, one such heuristic states that any comment ++delimiter that has an odd number of non-escaped " characters both preceding ++and following it on the line is not a comment because it is probably part of a ++string. These heuristics, while usually pretty accurate, will not work for all ++cases. ++ ++------------------------------------------------------------------------------ ++4.2 Nesting issues *NERDComNesting* ++ ++If we have some line of code like this: > ++ /*int foo */ = /*5 + 9;*/ ++< ++This will not be uncommented legally. The NERD commenter will remove the ++"outter most" delimiters so the line will become: > ++ int foo */ = /*5 + 9; ++< ++which almost certainly will not be what you want. Nested sets of comments will ++uncomment fine though. Eg: > ++ /*int/* foo =*/ 5 + 9;*/ ++< ++will become: > ++ int/* foo =*/ 5 + 9; ++< ++(Note that in the above examples I have deliberately not used place holders ++for simplicity) ++ ++============================================================================== ++6. The author {{{2 *NERDComAuthor* ++ ++The author of the NERD commenter is Martyzillatron --- the half robot, half ++dinosaur bastard son of Megatron and Godzilla. He enjoys destroying ++metropolises and eating tourist busses. ++ ++Drop him a line at martin_grenfell at msn.com. He would love to hear from you. ++its a lonely life being the worlds premier terror machine. How would you feel ++if your face looked like a toaster and a t-rex put together? :( ++ ++============================================================================== ++7. TODO list {{{2 *NERDComTodo* ++ ++Uncommenting of minimal comments needs to be more robust. Currently it is easy ++to get illegal syntax when uncommenting them. ++ ++ ++ ++============================================================================== ++8. Changelog {{{2 *NERDComChangelog* ++ ++2.1.4 ++ - added support for the ahk filetype. Cheers to Don Hatlestad for the ++ email. ++ - added support for desktop and xsd filetypes. Thanks to Christophe Benz. ++ - added dummy support for Rails-log ++ - fixed a bunch of bugs in the comment delimiter setup process, thanks to ++ Cheng Fang for the email :D ++ - hardcore refactoring and removal of seldomly used, overly-complex ++ functionality. ++ - the script now requires vim 7 ++2.1.3 ++ - fixed numerous bugs that were causing tabs to permanently be converted ++ to spaces, even if noexpandtab was set. Thanks to Heptite on #vim for ++ working with me to track them down :) ++ - added dummy support for "lookupfile". Thanks to David Fishburn for the ++ email. ++ - added support for "rst", thanks to Niels Aan de Brugh for the email. ++ ++2.1.2 ++ - added support for the vera and ldif filetypes. Thanks to Normandie ++ Azucena and Florian Apolloner for the emails. ++ ++2.1.1 ++ - added dummy support for SVNcommitlog and vcscommit. Thanks to John ++ O'Shea for the email. ++ - added support for Groovy. Thanks to Jason Mills for the email. ++2.1.0 ++ - now the script resets the delimiters when the filetype of the buffer ++ changes (thanks to James Hales for the patch) ++ - added formal support/doc for prepending a count to many of the ++ commenting maps so you can go, eg, 5,cc to comment 5 lines from normal ++ mode. Thanks again to James Hales for the patch. ++ - added support for the "gams" filetype that Jorge Rodrigues created. ++ - added support for the "objc" filetype, thanks to Rainer Müller for the ++ email. ++ - added support for the "sass" filetype that Dmitry Ilyashevich created. ++ ++2.0.7 ++ - Added support for eclass and ebuild filetypes. Thanks to Alex Tarkovsky ++ for the email. ++ ++2.0.6 ++ - Changed the default setting of NERDMapleader to ",c", meaning all the ++ maps now start with ,c instead of \c. This is to stop a major mapping ++ clash with the vcscommand plugin. Anyone wanting to keep the \c map ++ leader should read :help NERDMapleader. ++ - Added support for debcontrol and dummy support for debchangelog ++ filetypes, thanks to Stefano Zacchiroli for the email. ++ - Made it so that the NERDShutUp option now only controls the "Pleeease ++ email the delimiters..." requests. It no longer affects the general ++ output of the script. ++ - Simplified the names of the help tags. ++ ++2.0.5 ++ - Added support for autoit, autohotkey and docbk filetypes (thanks to ++ Michael Böhler) ++ - Added support for cmake (thanks to Aaron Small) ++ - Added support for htmldjango and django filetypes (thanks to Ramiro ++ Morales) ++ - Improved the delimiters for eruby again ++ - Applied a patch from Seth Mason to fix some pathing issues with the help ++ file installation. ++ ++2.0.4 ++ - Added support for verilog_systemverilog and systemverilog filetypes ++ (Thanks to Alexey for the email) ++ - Added support for fstab, thanks to Lizendir for the email. ++ - Added support for the smarty filetype. ++ - Improved the delimiters for eruby. ++ - Added dummy support for changelog filetype. ++ ++2.0.3 ++ - Added dummy support for the csv filetype (thx to Mark Woodward for the ++ email) ++ - Added dummy support for vo_base and otl filetypes (thanks to fREW for ++ the email) ++ ++2.0.2: ++ - Minor bug fix that was stopping nested comments from working ++ ++2.0.1: ++ - Fixed the visual bell for the |NERDComToEOLMap| map. ++ - Added another possible value to the NERDMenuMode option which causes the ++ menu to be displayed under 'Plugin -> Comment'. See :h NERDMenuMode. ++ This new menu mode is now the default. ++ - Added support for the occam filetype (thanks to Anders for emailing me) ++ - Made the main commenting function (NERDComment) available outside the ++ script. ++ - bug fixes and refactoring ++ ++2.0.0: ++ - NOTE: renamed the script to NERD_commenter.vim. When you install this ++ version you must delete the old files: NERD_comments.vim and ++ NERD_comments.txt. ++ - Reworked the mappings and main entry point function for the script to ++ avoid causing visual-bells and screen scrolling. ++ - Changes to the script options (see |NERD_com-Customisation| for ++ details): ++ - They are all camel case now instead of underscored. ++ - Converted all of the regular expression options into simple boolean ++ options for simplicity. ++ - All the options are now stated positively, eg. ++ NERD_dont_remove_spaces_regexp has become NERDRemoveExtraSpaces. ++ - Some of the option names have been changed (other than in the above ++ ways) ++ - Some have been removed altogether, namely: NERD_create_h_filetype ++ (why was a commenting script creating a filetype?!), ++ NERD_left_align_regexp, NERD_right_align_regexp, ++ ++ - Removed all the NERD_use_alt_style_XXX_coms options and replaced them ++ with a better system. Now if a filetype has alternative delims, the ++ script will check whether an option of the form ++ "NERD_<&filetype>_alt_style" exists, and if it does then alt delims will ++ be used. See |NERD_com-cust-delims| for details. ++ - The script no longer removes extra spaces for sexy comments for the ++ NERDRemoveExtraSpaces option (it will still remove spaces if ++ NERDSpaceDelims is set). ++ - Added dummy support for viminfo and rtf. ++ - Added support for the "gentoo-package-\(keywords\|mask\|use\)" ++ filetypes. ++ - Added '#' comments as an alternative for the asm filetype ++ ++Thanks to Markus Klinik and Anders for bug reports, and again to Anders ++for his patch. Thanks to John O'Shea and fREW for the filetype ++information. ++ ++============================================================================== ++8. Credits {{{2 *NERDComCredits* ++ ++Thanks and respect to the following people: ++ ++Thanks to Nick Brettell for his many ideas and criticisms. A bloody good ++bastard. ++:normal :.-2s/good// ++ ++Thanks to Matthew Hawkins for his awesome refactoring! ++ ++Thanks to the authors of the vimspell whose documentation ++installation function I stole :) ++ ++Thanks to Greg Searle for the idea of using place-holders for nested comments. ++ ++Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! ++Also, thanks for the idea of doing sexy comments as well as his suggestions ++relating to it :P ++Thanks again to Nguyen for complaining about the NERD_comments menu mapping ++(-c) interfering with another mapping of his... and thus the ++NERD_dont_create_menu_shortcut option was born :P ++(it was then replaced with NERD_menu_mode in version 1.67 :) ++ ++Thanks to Sam R for pointing out some filetypes that NERD_comments could support! ++ ++Cheers to Litchi for the idea of having a mapping that appends a comment to ++the current line :) ++ ++Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some ++problems with commenting in visual mode. Thanks again to Jorge for his ++continued suggestions on this matter :) ++ ++Thanks to Martin Stubenschrott for pointing out a bug with the mapping ++:) Ive gotta stop breaking this mapping! ++ ++Thanks to Markus Erlmann for pointing out a conflict that this script was ++having with the taglist plugin. ++ ++Thanks to Brent Rice for alerting me about, and helping me track down, a bug ++in the script when the "ignorecase" option in vim was set. ++ ++Thanks to Richard Willis for telling me about how line continuation was ++causing problems on cygwin. Also, thanks pointing out a bug in the help file ++and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI ++have mercy on your soul :) ++ ++Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". ++Also, thanks for his suggested improvements about toggle comments after i ++implemented them. ++ ++Thanks to harry for telling me that i broke the cn mapping in 1.53 :), ++and thanks again for telling me about a bug that occurred when editing a file ++in a new tab. ++ ++Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc ++install function and added support for ada comments with spaces as well as ++making a couple of other small changes. ++ ++Thanks to David Bourgeois for pointing out a bug with when commenting c files ++:)... [a few days later] ok i completely misunderstood what David was talking ++about and ended up fixing a completely different bug to what he was talking ++about :P ++ ++Thanks to David Bourgeois for pointing out a bug when changing buffers. ++ ++Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that ++was causing spaces to be added to the end of lines with single-part ++delimiters. It's nice when people do my work for me :D ++ ++Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting ++sexy comments. Sexy comments dont look so sexy when they are only half removed ++:P ++ ++Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping ++the NERD_space_delim_filetype_regexp option from working with left aligned ++toggle comments. And for pointing out a bug when initialising VB comments. ++ ++Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". ++And for suggested improvements to minimal comments. ++ ++Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. ++In 1.65 ++ ++Thanks to Jonathan Derque for alerting me to some filetypes that could be ++supported (Namely: context, plaintext and mail). ++ ++Thanks to Joseph Barker for the sugesting that the menu be an optional ++feature. ++ ++Thanks to Gary Church and Tim Carey-Smith for complaining about the ++keymappings and causing me to introduce the NERD_mapleader option :) ++ ++Thanks to Vigil for pointing out that the "fetchmail" filetype was not ++supported and emailing me the delimiters ++ ++Thanks to Michael Brunner for telling me about the kconfig filetype. ++ ++Thanks to Antono Vasiljev for telling me about the netdict filetype. ++ ++Thanks to Melissa Reid for telling me about the omlet filetype. ++ ++Thanks to Ilia N Ternovich for alerting me to the 'qf' (quickfix) filetype. ++ ++Thanks to Markus Klinik for emailing me about a bug for sexy comments where ++spaces were being eaten. ++ ++Thanks to John O'Shea for emailing me about the RTF filetype. Thanks again for ++the SVNcommitlog and vcscommit filetypes. ++ ++Thanks to Anders for emailing me a patch to help get rid of all the visual ++bells and screen scrolling, and for sending me the delimiters for the occam ++filetype. ++ ++Thanks to Anders and Markus Klinik for emailing me about the screen scrolling ++issues and finally getting me off my ass about them :P ++ ++Thanks to Mark Woodward for emailing me about the csv filetype. ++ ++Thanks to fREW for emailing me with the /gentoo-package-(mask|keywords|use)/ ++filetypes the vo_base filetype. ++ ++Thanks to Alexey for emailing me about the verilog_systemverilog/systemverilog ++filetypes. ++ ++Cheers to Lizendir for the email about the fstab filetype ++ ++Thanks to Michael Böhler for emailing me with the autoit, autohotkey and docbk ++filetypes. ++ ++Thanks to Aaron Small for emailing me about the cmake filetype. ++ ++Thanks to Ramiro for emailing me about the htmldjango and django filetypes. ++ ++Thanks to Seth Mason for sending me a patch to fix some pathing issues for the ++help doc installation. ++ ++Thanks to Stefano Zacchiroli for emailing me with the debcontrol and ++debchangelog filetypes. ++ ++Thanks to Alex Tarkovsky for emailing me about the ebuild and eclass ++filetypes. ++ ++Cheers to Jorge Rodrigues for emailing me about the gams filetype. ++ ++Cheers to James Hales for the patch that made the comment maps work better with ++counts, and made the script reset comment delims for a buffer when its ++filetype changes. ++ ++Thank to Rainer Müller for emailing me with the Objective C delimiters. ++ ++Thanks to Jason Mills for emailing me the Groovy filetype. ++ ++Thanks to Normandie Azucena for emailing me about the vera filetype. ++ ++Thanks to Florian Apolloner for emailing me about the ldif filetype. ++ ++Cheers to David Fishburn for emailing me with the lookupfile filetype. ++ ++Thanks to Niels Aan de Brugh for emailing me with the rst filetype. ++ ++Cheers to heptite on #vim for helping me track down some tab-space conversion ++bugs. ++ ++Cheers to Don Hatlestad for telling me about the ahk filetype ++ ++Thanks to Christophe Benz for emailing me with the Desktop and xsd filetypes. ++ ++Cheers to Cheng Fang for the bug reports :D ++ ++Cheers to myself for being the best looking man on Earth! ++=== END_DOC ++" vim: set foldmethod=marker : +diff -urN vim71/runtime/plugin/taglist.vim vim71_ada/runtime/plugin/taglist.vim +--- vim71/runtime/plugin/taglist.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/plugin/taglist.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,4524 @@ ++" File: taglist.vim ++" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) ++" 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 ++" 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. ++" ++" 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 ++" you to efficiently browse through source code files for different ++" programming languages. You can visit the taglist plugin home page for more ++" information: ++" ++" http://vim-taglist.sourceforge.net ++" ++" You can subscribe to the taglist mailing list to post your questions ++" or suggestions for improvement or to report bugs. Visit the following ++" page for subscribing to the mailing list: ++" ++" http://groups.yahoo.com/group/taglist/ ++" ++" For more information about using this plugin, after installing the ++" taglist plugin, use the ":help taglist" command. ++" ++" Installation ++" ------------ ++" 1. Download the taglist.zip file and unzip the files to the $HOME/.vim ++" or the $HOME/vimfiles or the $VIM/vimfiles directory. This should ++" unzip the following two files (the directory structure should be ++" preserved): ++" ++" 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. ++" 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. ++" 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 ++" utility (not to the directory) in the .vimrc file. ++" 4. If you are running a terminal/console version of Vim and the ++" terminal doesn't support changing the window width then set the ++" 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. ++" 5. Restart Vim. ++" 6. You can now use the ":TlistToggle" command to open/close the taglist ++" window. You can use the ":help taglist" command to get more ++" information about using the taglist plugin. ++" ++" ****************** Do not modify after this line ************************ ++ ++" Line continuation used here ++let s:cpo_save = &cpo ++set cpo&vim ++ ++if !exists('loaded_taglist') ++ " First time loading the taglist plugin ++ " ++ " To speed up the loading of Vim, the taglist plugin uses autoload ++ " mechanism to load the taglist functions. ++ " Only define the configuration variables, user commands and some ++ " auto-commands and finish sourcing the file ++ ++ " The taglist plugin requires the built-in Vim system() function. If this ++ " function is not available, then don't load the plugin. ++ if !exists('*system') ++ echomsg 'Taglist: Vim system() built-in function is not available. ' . ++ \ 'Plugin is not loaded.' ++ let loaded_taglist = 'no' ++ let &cpo = s:cpo_save ++ finish ++ endif ++ ++ " Location of the exuberant ctags tool ++ if !exists('Tlist_Ctags_Cmd') ++ if executable('exuberant-ctags') ++ " On Debian Linux, exuberant ctags is installed ++ " as exuberant-ctags ++ let Tlist_Ctags_Cmd = 'exuberant-ctags' ++ elseif executable(' exctags') ++ " On Free-BSD, exuberant ctags is installed as exctags ++ let Tlist_Ctags_ Cmd = 'exctags' ++ elseif executable('ctags') ++ let Tlist_Ctags_Cmd = 'ctags' ++ elseif executable('ctags.exe') ++ let Tlist_Ctags_Cmd = 'ctags.exe' ++ elseif executable('tags') ++ let Tlist_Ctags_Cmd = 'tags' ++ else ++ echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . ++ \ 'not found in PATH. Plugin is not loaded.' ++ " Skip loading the plugin ++ let loaded_taglist = 'no' ++ let &cpo = s:cpo_save ++ finish ++ endif ++ endif ++ ++ ++ " Automatically open the taglist window on Vim startup ++ if !exists('Tlist_Auto_Open') ++ 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 ++ endif ++ ++ if !exists('Tlist_Show_Menu') ++ let Tlist_Show_Menu = 0 ++ endif ++ ++ " Tag listing sort type - 'name' or 'order' ++ if !exists('Tlist_Sort_Type') ++ let Tlist_Sort_Type = 'order' ++ endif ++ ++ " Tag listing window split (horizontal/vertical) control ++ if !exists('Tlist_Use_Horiz_Window') ++ let Tlist_Use_Horiz_Window = 0 ++ endif ++ ++ " Open the vertically split taglist window on the left or on the right ++ " side. This setting is relevant only if Tlist_Use_Horiz_Window is set to ++ " zero (i.e. only for vertically split windows) ++ if !exists('Tlist_Use_Right_Window') ++ let Tlist_Use_Right_Window = 0 ++ endif ++ ++ " Increase Vim window width to display vertically split taglist window. ++ " For MS-Windows version of Vim running in a MS-DOS window, this must be ++ " set to 0 otherwise the system may hang due to a Vim limitation. ++ if !exists('Tlist_Inc_Winwidth') ++ if (has('win16') || has('win95')) && !has('gui_running') ++ let Tlist_Inc_Winwidth = 0 ++ else ++ let Tlist_Inc_Winwidth = 1 ++ endif ++ endif ++ ++ " Vertically split taglist window width setting ++ if !exists('Tlist_WinWidth') ++ let Tlist_WinWidth = 30 ++ endif ++ ++ " Horizontally split taglist window height setting ++ if !exists('Tlist_WinHeight') ++ let Tlist_WinHeight = 10 ++ endif ++ ++ " Display tag prototypes or tag names in the taglist window ++ if !exists('Tlist_Display_Prototype') ++ let Tlist_Display_Prototype = 0 ++ endif ++ ++ " Display tag scopes in the taglist window ++ if !exists('Tlist_Display_Tag_Scope') ++ let Tlist_Display_Tag_Scope = 1 ++ endif ++ ++ " Use single left mouse click to jump to a tag. By default this is disabled. ++ " Only double click using the mouse will be processed. ++ if !exists('Tlist_Use_SingleClick') ++ let Tlist_Use_SingleClick = 0 ++ endif ++ ++ " Control whether additional help is displayed as part of the taglist or ++ " not. Also, controls whether empty lines are used to separate the tag ++ " tree. ++ if !exists('Tlist_Compact_Format') ++ let Tlist_Compact_Format = 0 ++ endif ++ ++ " Exit Vim if only the taglist window is currently open. By default, this is ++ " set to zero. ++ if !exists('Tlist_Exit_OnlyWindow') ++ let Tlist_Exit_OnlyWindow = 0 ++ endif ++ ++ " Automatically close the folds for the non-active files in the taglist ++ " window ++ if !exists('Tlist_File_Fold_Auto_Close') ++ let Tlist_File_Fold_Auto_Close = 0 ++ endif ++ ++ " Close the taglist window when a tag is selected ++ if !exists('Tlist_Close_On_Select') ++ let Tlist_Close_On_Select = 0 ++ endif ++ ++ " Automatically update the taglist window to display tags for newly ++ " edited files ++ if !exists('Tlist_Auto_Update') ++ let Tlist_Auto_Update = 1 ++ endif ++ ++ " Automatically highlight the current tag ++ if !exists('Tlist_Auto_Highlight_Tag') ++ let Tlist_Auto_Highlight_Tag = 1 ++ endif ++ ++ " Automatically highlight the current tag on entering a buffer ++ if !exists('Tlist_Highlight_Tag_On_BufEnter') ++ let Tlist_Highlight_Tag_On_BufEnter = 1 ++ endif ++ ++ " Enable fold column to display the folding for the tag tree ++ if !exists('Tlist_Enable_Fold_Column') ++ let Tlist_Enable_Fold_Column = 1 ++ endif ++ ++ " Display the tags for only one file in the taglist window ++ if !exists('Tlist_Show_One_File') ++ let Tlist_Show_One_File = 0 ++ endif ++ ++ if !exists('Tlist_Max_Submenu_Items') ++ let Tlist_Max_Submenu_Items = 20 ++ endif ++ ++ if !exists('Tlist_Max_Tag_Length') ++ let Tlist_Max_Tag_Length = 10 ++ endif ++ ++ " Do not change the name of the taglist title variable. The winmanager ++ " plugin relies on this name to determine the title for the taglist ++ " plugin. ++ let TagList_title = "__Tag_List__" ++ ++ " Taglist debug messages ++ let s:tlist_msg = '' ++ ++ " Define the taglist autocommand to automatically open the taglist window ++ " on Vim startup ++ if g:Tlist_Auto_Open ++ autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open() ++ endif ++ ++ " Refresh the taglist ++ if g:Tlist_Process_File_Always ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ ++ if g:Tlist_Show_Menu ++ autocmd GUIEnter * call s:Tlist_Menu_Init() ++ endif ++ ++ " When the taglist buffer is created when loading a Vim session file, ++ " the taglist buffer needs to be initialized. The BufFilePost event ++ " is used to handle this case. ++ autocmd BufFilePost __Tag_List__ call s:Tlist_Vim_Session_Load() ++ ++ " Define the user commands to manage the taglist window ++ command! -nargs=0 -bar TlistToggle call s:Tlist_Window_Toggle() ++ command! -nargs=0 -bar TlistOpen call s:Tlist_Window_Open() ++ " For backwards compatiblity define the Tlist command ++ command! -nargs=0 -bar Tlist TlistToggle ++ command! -nargs=+ -complete=file TlistAddFiles ++ \ call s:Tlist_Add_Files() ++ command! -nargs=+ -complete=dir TlistAddFilesRecursive ++ \ call s:Tlist_Add_Files_Recursive() ++ command! -nargs=0 -bar TlistClose call s:Tlist_Window_Close() ++ command! -nargs=0 -bar TlistUpdate call s:Tlist_Update_Current_File() ++ command! -nargs=0 -bar TlistHighlightTag call s:Tlist_Window_Highlight_Tag( ++ \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1) ++ " For backwards compatiblity define the TlistSync command ++ command! -nargs=0 -bar TlistSync TlistHighlightTag ++ command! -nargs=* -complete=buffer TlistShowPrototype ++ \ echo Tlist_Get_Tag_Prototype_By_Line() ++ command! -nargs=* -complete=buffer TlistShowTag ++ \ echo Tlist_Get_Tagname_By_Line() ++ command! -nargs=* -complete=file TlistSessionLoad ++ \ call s:Tlist_Session_Load() ++ command! -nargs=* -complete=file TlistSessionSave ++ \ call s:Tlist_Session_Save() ++ command! -bar TlistLock let Tlist_Auto_Update=0 ++ command! -bar TlistUnlock let Tlist_Auto_Update=1 ++ ++ " Commands for enabling/disabling debug and to display debug messages ++ command! -nargs=? -complete=file -bar TlistDebug ++ \ call s:Tlist_Debug_Enable() ++ command! -nargs=0 -bar TlistUndebug call s:Tlist_Debug_Disable() ++ command! -nargs=0 -bar TlistMessages call s:Tlist_Debug_Show() ++ ++ " Define autocommands to autoload the taglist plugin when needed. ++ ++ " Trick to get the current script ID ++ map xx xx ++ let s:tlist_sid = substitute(maparg('xx'), '\(\d\+_\)xx$', ++ \ '\1', '') ++ unmap xx ++ ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Window_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Menu_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined Tlist_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined TagList_* source ' . ++ \ escape(expand(''), ' ') ++ ++ let loaded_taglist = 'fast_load_done' ++ ++ if g:Tlist_Show_Menu && has('gui_running') ++ call s:Tlist_Menu_Init() ++ endif ++ ++ " restore 'cpo' ++ let &cpo = s:cpo_save ++ finish ++endif ++ ++if !exists('s:tlist_sid') ++ " Two or more versions of taglist plugin are installed. Don't ++ " load this version of the plugin. ++ finish ++endif ++ ++unlet! s:tlist_sid ++ ++if loaded_taglist != 'fast_load_done' ++ " restore 'cpo' ++ let &cpo = s:cpo_save ++ finish ++endif ++ ++" Taglist plugin functionality is available ++let loaded_taglist = 'available' ++ ++"------------------- end of user configurable options -------------------- ++ ++" Default language specific settings for supported file types and tag types ++" ++" Variable name format: ++" ++" s:tlist_def_{vim_ftype}_settings ++" ++" vim_ftype - Filetype detected by Vim ++" ++" Value format: ++" ++" ;:;:;... ++" ++" ctags_ftype - File type supported by exuberant ctags ++" flag - Flag supported by exuberant ctags to generate a tag type ++" name - Name of the tag type used in the taglist window to display the ++" tags of this type ++" ++ ++" Ada language ++let s:tlist_def_ada_settings = 'ada;' . ++ \ 'P:package spec;' . ++ \ 'p:package body;' . ++ \ 'T:type spec;' . ++ \ 't:type;' . ++ \ 'U:subtype spec;' . ++ \ 'u:subtype;' . ++ \ 'c:component;' . ++ \ 'l:literal;' . ++ \ 'V:variable spec;' . ++ \ 'v:variable;' . ++ \ 'f:formal;' . ++ \ 'n:constant;' . ++ \ 'x:exception;' . ++ \ 'R:subprogram spec;' . ++ \ 'r:subprogram body;' . ++ \ 'K:task spec;' . ++ \ 'k:task body;' . ++ \ 'O:protected spec;' . ++ \ 'o:protected body;' . ++ \ 'E:entry spec;' . ++ \ 'e:entry body;' . ++ \ 'b:label;' . ++ \ 'i:identifier;' . ++ \ 'a:autovar;' . ++ \ 'y:annon' ++ ++" assembly language ++let s:tlist_def_asm_settings = 'asm;d:define;l:label;m:macro;t:type' ++ ++" aspperl language ++let s:tlist_def_aspperl_settings = 'asp;f:function;s:sub;v:variable' ++ ++" aspvbs language ++let s:tlist_def_aspvbs_settings = 'asp;f:function;s:sub;v:variable' ++ ++" awk language ++let s:tlist_def_awk_settings = 'awk;f:function' ++ ++" beta language ++let s:tlist_def_beta_settings = 'beta;f:fragment;s:slot;v:pattern' ++ ++" c language ++let s:tlist_def_c_settings = 'c;d:macro;g:enum;s:struct;u:union;t:typedef;' . ++ \ 'v:variable;f:function' ++ ++" c++ language ++let s:tlist_def_cpp_settings = 'c++;n:namespace;v:variable;d:macro;t:typedef;' . ++ \ 'c:class;g:enum;s:struct;u:union;f:function' ++ ++" c# language ++let s:tlist_def_cs_settings = 'c#;d:macro;t:typedef;n:namespace;c:class;' . ++ \ 'E:event;g:enum;s:struct;i:interface;' . ++ \ 'p:properties;m:method' ++ ++" cobol language ++let s:tlist_def_cobol_settings = 'cobol;d:data;f:file;g:group;p:paragraph;' . ++ \ 'P:program;s:section' ++ ++" eiffel language ++let s:tlist_def_eiffel_settings = 'eiffel;c:class;f:feature' ++ ++" erlang language ++let s:tlist_def_erlang_settings = 'erlang;d:macro;r:record;m:module;f:function' ++ ++" expect (same as tcl) language ++let s:tlist_def_expect_settings = 'tcl;c:class;f:method;p:procedure' ++ ++" fortran language ++let s:tlist_def_fortran_settings = 'fortran;p:program;b:block data;' . ++ \ 'c:common;e:entry;i:interface;k:type;l:label;m:module;' . ++ \ 'n:namelist;t:derived;v:variable;f:function;s:subroutine' ++ ++" HTML language ++let s:tlist_def_html_settings = 'html;a:anchor;f:javascript function' ++ ++" java language ++let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' . ++ \ 'f:field;m:method' ++ ++" javascript language ++let s:tlist_def_javascript_settings = 'javascript;f:function' ++ ++" lisp language ++let s:tlist_def_lisp_settings = 'lisp;f:function' ++ ++" lua language ++let s:tlist_def_lua_settings = 'lua;f:function' ++ ++" makefiles ++let s:tlist_def_make_settings = 'make;m:macro' ++ ++" pascal language ++let s:tlist_def_pascal_settings = 'pascal;f:function;p:procedure' ++ ++" perl language ++let s:tlist_def_perl_settings = 'perl;c:constant;l:label;p:package;s:subroutine' ++ ++" php language ++let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function' ++ ++" python language ++let s:tlist_def_python_settings = 'python;c:class;m:member;f:function' ++ ++" rexx language ++let s:tlist_def_rexx_settings = 'rexx;s:subroutine' ++ ++" ruby language ++let s:tlist_def_ruby_settings = 'ruby;c:class;f:method;F:function;' . ++ \ 'm:singleton method' ++ ++" scheme language ++let s:tlist_def_scheme_settings = 'scheme;s:set;f:function' ++ ++" shell language ++let s:tlist_def_sh_settings = 'sh;f:function' ++ ++" C shell language ++let s:tlist_def_csh_settings = 'sh;f:function' ++ ++" Z shell language ++let s:tlist_def_zsh_settings = 'sh;f:function' ++ ++" slang language ++let s:tlist_def_slang_settings = 'slang;n:namespace;f:function' ++ ++" sml language ++let s:tlist_def_sml_settings = 'sml;e:exception;c:functor;s:signature;' . ++ \ 'r:structure;t:type;v:value;f:function' ++ ++" sql language ++let s:tlist_def_sql_settings = 'sql;c:cursor;F:field;P:package;r:record;' . ++ \ 's:subtype;t:table;T:trigger;v:variable;f:function;p:procedure' ++ ++" tcl language ++let s:tlist_def_tcl_settings = 'tcl;c:class;f:method;m:method;p:procedure' ++ ++" vera language ++let s:tlist_def_vera_settings = 'vera;c:class;d:macro;e:enumerator;' . ++ \ 'f:function;g:enum;m:member;p:program;' . ++ \ 'P:prototype;t:task;T:typedef;v:variable;' . ++ \ 'x:externvar' ++ ++"verilog language ++let s:tlist_def_verilog_settings = 'verilog;m:module;c:constant;P:parameter;' . ++ \ 'e:event;r:register;t:task;w:write;p:port;v:variable;f:function' ++ ++" vim language ++let s:tlist_def_vim_settings = 'vim;a:autocmds;v:variable;f:function' ++ ++" yacc language ++let s:tlist_def_yacc_settings = 'yacc;l:label' ++ ++"------------------- end of language specific options -------------------- ++ ++" Vim window size is changed by the taglist plugin or not ++let s:tlist_winsize_chgd = -1 ++" Taglist window is maximized or not ++let s:tlist_win_maximized = 0 ++" Name of files in the taglist ++let s:tlist_file_names='' ++" Number of files in the taglist ++let s:tlist_file_count = 0 ++" Number of filetypes supported by taglist ++let s:tlist_ftype_count = 0 ++" Is taglist part of other plugins like winmanager or cream? ++let s:tlist_app_name = "none" ++" Are we displaying brief help text ++let s:tlist_brief_help = 1 ++" List of files removed on user request ++let s:tlist_removed_flist = "" ++" Index of current file displayed in the taglist window ++let s:tlist_cur_file_idx = -1 ++" Taglist menu is empty or not ++let s:tlist_menu_empty = 1 ++ ++" An autocommand is used to refresh the taglist window when entering any ++" buffer. We don't want to refresh the taglist window if we are entering the ++" file window from one of the taglist functions. The 'Tlist_Skip_Refresh' ++" variable is used to skip the refresh of the taglist window and is set ++" and cleared appropriately. ++let s:Tlist_Skip_Refresh = 0 ++ ++" 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 ++ call setline('$', ' ') ++ endif ++ ++ if s:tlist_brief_help ++ " Add the brief help ++ call append(0, '" Press to display help text') ++ else ++ " Add the extensive help ++ call append(0, '" : Jump to tag definition') ++ call append(1, '" o : Jump to tag definition in new window') ++ call append(2, '" p : Preview the tag definition') ++ call append(3, '" : Display tag prototype') ++ call append(4, '" u : Update tag list') ++ call append(5, '" s : Select sort field') ++ call append(6, '" d : Remove file from taglist') ++ call append(7, '" x : Zoom-out/Zoom-in taglist window') ++ call append(8, '" + : Open a fold') ++ call append(9, '" - : Close a fold') ++ call append(10, '" * : Open all folds') ++ call append(11, '" = : Close all folds') ++ 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') ++ endif ++endfunction ++ ++" Tlist_Window_Toggle_Help_Text() ++" Toggle taglist plugin help text between the full version and the brief ++" version ++function! s:Tlist_Window_Toggle_Help_Text() ++ if g:Tlist_Compact_Format ++ " In compact display mode, do not display help ++ return ++ endif ++ ++ " Include the empty line displayed after the help text ++ let brief_help_size = 1 ++ let full_help_size = 16 ++ ++ setlocal modifiable ++ ++ " Set report option to a huge value to prevent informational messages ++ " while deleting the lines ++ let old_report = &report ++ set report=99999 ++ ++ " Remove the currently highlighted tag. Otherwise, the help text ++ " might be highlighted by mistake ++ match none ++ ++ " Toggle between brief and full help text ++ if s:tlist_brief_help ++ let s:tlist_brief_help = 0 ++ ++ " Remove the previous help ++ exe '1,' . brief_help_size . ' delete _' ++ ++ " Adjust the start/end line numbers for the files ++ call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) ++ else ++ let s:tlist_brief_help = 1 ++ ++ " Remove the previous help ++ exe '1,' . full_help_size . ' delete _' ++ ++ " Adjust the start/end line numbers for the files ++ call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) ++ endif ++ ++ call s:Tlist_Window_Display_Help() ++ ++ " Restore the report option ++ let &report = old_report ++ ++ setlocal nomodifiable ++endfunction ++ ++" Taglist debug support ++let s:tlist_debug = 0 ++ ++" File for storing the debug messages ++let s:tlist_debug_file = '' ++ ++" Tlist_Debug_Enable ++" Enable logging of taglist debug messages. ++function! s:Tlist_Debug_Enable(...) ++ let s:tlist_debug = 1 ++ ++ " Check whether a valid file name is supplied. ++ if a:1 != '' ++ let s:tlist_debug_file = fnamemodify(a:1, ':p') ++ ++ " Empty the log file ++ exe 'redir! > ' . s:tlist_debug_file ++ redir END ++ ++ " Check whether the log file is present/created ++ if !filewritable(s:tlist_debug_file) ++ call s:Tlist_Warning_Msg('Taglist: Unable to create log file ' ++ \ . s:tlist_debug_file) ++ let s:tlist_debug_file = '' ++ endif ++ endif ++endfunction ++ ++" Tlist_Debug_Disable ++" Disable logging of taglist debug messages. ++function! s:Tlist_Debug_Disable(...) ++ let s:tlist_debug = 0 ++ let s:tlist_debug_file = '' ++endfunction ++ ++" Tlist_Debug_Show ++" Display the taglist debug messages in a new window ++function! s:Tlist_Debug_Show() ++ if s:tlist_msg == '' ++ call s:Tlist_Warning_Msg('Taglist: No debug messages') ++ return ++ endif ++ ++ " Open a new window to display the taglist debug messages ++ new taglist_debug.txt ++ " Delete all the lines (if the buffer already exists) ++ silent! %delete _ ++ " Add the messages ++ silent! put =s:tlist_msg ++ " Move the cursor to the first line ++ normal! gg ++endfunction ++ ++" Tlist_Log_Msg ++" Log the supplied debug message along with the time ++function! s:Tlist_Log_Msg(msg) ++ if s:tlist_debug ++ if s:tlist_debug_file != '' ++ exe 'redir >> ' . s:tlist_debug_file ++ silent echon strftime('%H:%M:%S') . ': ' . a:msg . "\n" ++ redir END ++ else ++ " Log the message into a variable ++ " Retain only the last 3000 characters ++ let len = strlen(s:tlist_msg) ++ if len > 3000 ++ let s:tlist_msg = strpart(s:tlist_msg, len - 3000) ++ endif ++ let s:tlist_msg = s:tlist_msg . strftime('%H:%M:%S') . ': ' . ++ \ a:msg . "\n" ++ endif ++ endif ++endfunction ++ ++" Tlist_Warning_Msg() ++" Display a message using WarningMsg highlight group ++function! s:Tlist_Warning_Msg(msg) ++ echohl WarningMsg ++ echomsg a:msg ++ echohl None ++endfunction ++ ++" Last returned file index for file name lookup. ++" Used to speed up file lookup ++let s:tlist_file_name_idx_cache = -1 ++ ++" Tlist_Get_File_Index() ++" Return the index of the specified filename ++function! s:Tlist_Get_File_Index(fname) ++ if s:tlist_file_count == 0 || a:fname == '' ++ return -1 ++ endif ++ ++ " If the new filename is same as the last accessed filename, then ++ " return that index ++ if s:tlist_file_name_idx_cache != -1 && ++ \ s:tlist_file_name_idx_cache < s:tlist_file_count ++ if s:tlist_{s:tlist_file_name_idx_cache}_filename == a:fname ++ " Same as the last accessed file ++ return s:tlist_file_name_idx_cache ++ endif ++ endif ++ ++ " First, check whether the filename is present ++ let s_fname = a:fname . "\n" ++ let i = stridx(s:tlist_file_names, s_fname) ++ if i == -1 ++ let s:tlist_file_name_idx_cache = -1 ++ return -1 ++ endif ++ ++ " Second, compute the file name index ++ let nl_txt = substitute(strpart(s:tlist_file_names, 0, i), "[^\n]", '', 'g') ++ let s:tlist_file_name_idx_cache = strlen(nl_txt) ++ return s:tlist_file_name_idx_cache ++endfunction ++ ++" Last returned file index for line number lookup. ++" Used to speed up file lookup ++let s:tlist_file_lnum_idx_cache = -1 ++ ++" 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_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 ++ if s:tlist_file_lnum_idx_cache != -1 && ++ \ s:tlist_file_lnum_idx_cache < s:tlist_file_count ++ if a:lnum >= s:tlist_{s:tlist_file_lnum_idx_cache}_start && ++ \ a:lnum <= s:tlist_{s:tlist_file_lnum_idx_cache}_end ++ return s:tlist_file_lnum_idx_cache ++ endif ++ endif ++ ++ let fidx = -1 ++ ++ 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 ++ ++ endif ++ else ++ " 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 ++ ++ return fidx ++endfunction ++ ++" Tlist_Exe_Cmd_No_Acmds ++" Execute the specified Ex command after disabling autocommands ++function! s:Tlist_Exe_Cmd_No_Acmds(cmd) ++ let old_eventignore = &eventignore ++ set eventignore=all ++ exe a:cmd ++ let &eventignore = old_eventignore ++endfunction ++ ++" Tlist_Skip_File() ++" Check whether tag listing is supported for the specified file ++function! s:Tlist_Skip_File(filename, ftype) ++ " Skip buffers with no names and buffers with filetype not set ++ if a:filename == '' || a:ftype == '' ++ return 1 ++ endif ++ ++ " Skip files which are not supported by exuberant ctags ++ " First check whether default settings for this filetype are available. ++ " If it is not available, then check whether user specified settings are ++ " available. If both are not available, then don't list the tags for this ++ " filetype ++ let var = 's:tlist_def_' . a:ftype . '_settings' ++ if !exists(var) ++ let var = 'g:tlist_' . a:ftype . '_settings' ++ if !exists(var) ++ return 1 ++ endif ++ endif ++ ++ " Skip files which are not readable or files which are not yet stored ++ " to the disk ++ if !filereadable(a:filename) ++ return 1 ++ endif ++ ++ return 0 ++endfunction ++ ++" Tlist_User_Removed_File ++" Returns 1 if a file is removed by a user from the taglist ++function! s:Tlist_User_Removed_File(filename) ++ return stridx(s:tlist_removed_flist, a:filename . "\n") != -1 ++endfunction ++ ++" Tlist_Update_Remove_List ++" Update the list of user removed files from the taglist ++" add == 1, add the file to the removed list ++" add == 0, delete the file from the removed list ++function! s:Tlist_Update_Remove_List(filename, add) ++ if a:add ++ let s:tlist_removed_flist = s:tlist_removed_flist . a:filename . "\n" ++ else ++ let idx = stridx(s:tlist_removed_flist, a:filename . "\n") ++ let text_before = strpart(s:tlist_removed_flist, 0, idx) ++ let rem_text = strpart(s:tlist_removed_flist, idx) ++ let next_idx = stridx(rem_text, "\n") ++ let text_after = strpart(rem_text, next_idx + 1) ++ ++ let s:tlist_removed_flist = text_before . text_after ++ endif ++endfunction ++ ++" Tlist_FileType_Init ++" Initialize the ctags arguments and tag variable for the specified ++" file type ++function! s:Tlist_FileType_Init(ftype) ++ call s:Tlist_Log_Msg('Tlist_FileType_Init (' . a:ftype . ')') ++ " If the user didn't specify any settings, then use the default ++ " ctags args. Otherwise, use the settings specified by the user ++ let var = 'g:tlist_' . a:ftype . '_settings' ++ if exists(var) ++ " User specified ctags arguments ++ let settings = {var} . ';' ++ else ++ " Default ctags arguments ++ let var = 's:tlist_def_' . a:ftype . '_settings' ++ if !exists(var) ++ " No default settings for this file type. This filetype is ++ " not supported ++ return 0 ++ endif ++ let settings = s:tlist_def_{a:ftype}_settings . ';' ++ endif ++ ++ let msg = 'Taglist: Invalid ctags option setting - ' . settings ++ ++ " Format of the option that specifies the filetype and ctags arugments: ++ " ++ " ;flag1:name1;flag2:name2;flag3:name3 ++ " ++ ++ " Extract the file type to pass to ctags. This may be different from the ++ " file type detected by Vim ++ let pos = stridx(settings, ';') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let ctags_ftype = strpart(settings, 0, pos) ++ if ctags_ftype == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ " Make sure a valid filetype is supplied. If the user didn't specify a ++ " valid filetype, then the ctags option settings may be treated as the ++ " filetype ++ if ctags_ftype =~ ':' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ ++ " Remove the file type from settings ++ let settings = strpart(settings, pos + 1) ++ if settings == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ ++ " Process all the specified ctags flags. The format is ++ " flag1:name1;flag2:name2;flag3:name3 ++ let ctags_flags = '' ++ let cnt = 0 ++ while settings != '' ++ " Extract the flag ++ let pos = stridx(settings, ':') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let flag = strpart(settings, 0, pos) ++ if flag == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ " Remove the flag from settings ++ let settings = strpart(settings, pos + 1) ++ ++ " Extract the tag type name ++ let pos = stridx(settings, ';') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let name = strpart(settings, 0, pos) ++ if name == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let settings = strpart(settings, pos + 1) ++ ++ let cnt = cnt + 1 ++ ++ let s:tlist_{a:ftype}_{cnt}_name = flag ++ let s:tlist_{a:ftype}_{cnt}_fullname = name ++ let ctags_flags = ctags_flags . flag ++ endwhile ++ ++ let s:tlist_{a:ftype}_ctags_args = '--language-force=' . ctags_ftype . ++ \ ' --' . ctags_ftype . '-types=' . ctags_flags ++ let s:tlist_{a:ftype}_count = cnt ++ let s:tlist_{a:ftype}_ctags_flags = ctags_flags ++ ++ " Save the filetype name ++ let s:tlist_ftype_{s:tlist_ftype_count}_name = a:ftype ++ let s:tlist_ftype_count = s:tlist_ftype_count + 1 ++ ++ return 1 ++endfunction ++ ++" Tlist_Get_Filetype ++" Determine the filetype for the specified file ++function! s:Tlist_Get_Filetype(fname) ++ " Ignore the filetype autocommands ++ let old_eventignore = &eventignore ++ set eventignore=FileType ++ ++ " Save the 'filetype', as this will be changed temporarily ++ let old_filetype = &filetype ++ ++ " Run the filetypedetect group of autocommands to determine ++ " the filetype ++ exe 'doautocmd filetypedetect BufRead ' . a:fname ++ ++ " Save the detected filetype ++ let ftype = &filetype ++ ++ " Restore the previous state ++ let &filetype = old_filetype ++ let &eventignore = old_eventignore ++ ++ return ftype ++endfunction ++ ++" Tlist_Get_Buffer_Filetype ++" Get the filetype for the specified buffer ++function! s:Tlist_Get_Buffer_Filetype(bnum) ++ if bufloaded(a:bnum) ++ " For loaded buffers, the 'filetype' is already determined ++ return getbufvar(a:bnum, '&filetype') ++ endif ++ ++ " For unloaded buffers, if the 'filetype' option is set, return it ++ let ftype = getbufvar(a:bnum, '&filetype') ++ if ftype != '' ++ return ftype ++ endif ++ ++ " Skip non-existent buffers ++ if !bufexists(a:bnum) ++ return '' ++ endif ++ ++ " For buffers whose filetype is not yet determined, try to determine ++ " the filetype ++ let bname = bufname(a:bnum) ++ ++ return s:Tlist_Get_Filetype(bname) ++endfunction ++ ++" Tlist_Discard_TagInfo ++" Discard the stored tag information for a file ++function! s:Tlist_Discard_TagInfo(fidx) ++ call s:Tlist_Log_Msg('Tlist_Discard_TagInfo (' . ++ \ s:tlist_{a:fidx}_filename . ')') ++ let ftype = s:tlist_{a:fidx}_filetype ++ ++ " Discard information about the tags defined in the file ++ let i = 1 ++ while i <= s:tlist_{a:fidx}_tag_count ++ let fidx_i = 's:tlist_' . a:fidx . '_' . i ++ unlet! {fidx_i}_tag ++ unlet! {fidx_i}_tag_name ++ unlet! {fidx_i}_tag_type ++ unlet! {fidx_i}_ttype_idx ++ unlet! {fidx_i}_tag_proto ++ unlet! {fidx_i}_tag_searchpat ++ unlet! {fidx_i}_tag_linenum ++ let i = i + 1 ++ endwhile ++ ++ let s:tlist_{a:fidx}_tag_count = 0 ++ ++ " Discard information about tag type groups ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ if s:tlist_{a:fidx}_{ttype} != '' ++ let fidx_ttype = 's:tlist_' . a:fidx . '_' . ttype ++ let {fidx_ttype} = '' ++ let {fidx_ttype}_offset = 0 ++ let cnt = {fidx_ttype}_count ++ let {fidx_ttype}_count = 0 ++ let j = 1 ++ while j <= cnt ++ unlet! {fidx_ttype}_{j} ++ let j = j + 1 ++ endwhile ++ endif ++ let i = i + 1 ++ endwhile ++ ++ " Discard the stored menu command also ++ let s:tlist_{a:fidx}_menu_cmd = '' ++endfunction ++ ++" 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_Window_Update_Line_Offsets(start_idx, increment, offset) ++ let i = a:start_idx ++ ++ while i < s:tlist_file_count ++ if s:tlist_{i}_visible ++ " Update the start/end line number only if the file is visible ++ if a:increment ++ let s:tlist_{i}_start = s:tlist_{i}_start + a:offset ++ let s:tlist_{i}_end = s:tlist_{i}_end + a:offset ++ else ++ let s:tlist_{i}_start = s:tlist_{i}_start - a:offset ++ let s:tlist_{i}_end = s:tlist_{i}_end - a:offset ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++endfunction ++ ++" Tlist_Discard_FileInfo ++" Discard the stored information for a file ++function! s:Tlist_Discard_FileInfo(fidx) ++ call s:Tlist_Log_Msg('Tlist_Discard_FileInfo (' . ++ \ s:tlist_{a:fidx}_filename . ')') ++ call s:Tlist_Discard_TagInfo(a:fidx) ++ ++ let ftype = s:tlist_{a:fidx}_filetype ++ ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ unlet! s:tlist_{a:fidx}_{ttype} ++ unlet! s:tlist_{a:fidx}_{ttype}_offset ++ unlet! s:tlist_{a:fidx}_{ttype}_count ++ let i = i + 1 ++ endwhile ++ ++ unlet! s:tlist_{a:fidx}_filename ++ unlet! s:tlist_{a:fidx}_sort_type ++ unlet! s:tlist_{a:fidx}_filetype ++ unlet! s:tlist_{a:fidx}_mtime ++ unlet! s:tlist_{a:fidx}_start ++ unlet! s:tlist_{a:fidx}_end ++ unlet! s:tlist_{a:fidx}_valid ++ unlet! s:tlist_{a:fidx}_visible ++ unlet! s:tlist_{a:fidx}_tag_count ++ unlet! s:tlist_{a:fidx}_menu_cmd ++endfunction ++ ++" Tlist_Window_Remove_File_From_Display ++" Remove the specified 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 ++ return ++ endif ++ ++ " Remove the tags displayed for the specified file from the window ++ let start = s:tlist_{a:fidx}_start ++ " Include the empty line after the last line also ++ if g:Tlist_Compact_Format ++ let end = s:tlist_{a:fidx}_end ++ else ++ let end = s:tlist_{a:fidx}_end + 1 ++ endif ++ ++ setlocal modifiable ++ exe 'silent! ' . start . ',' . end . 'delete _' ++ setlocal nomodifiable ++ ++ " 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_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) ++endfunction ++ ++" Tlist_Remove_File ++" Remove the file under the cursor or the specified file index ++" user_request - User requested to remove the file from taglist ++function! s:Tlist_Remove_File(file_idx, user_request) ++ let fidx = a:file_idx ++ ++ if fidx == -1 ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ endif ++ call s:Tlist_Log_Msg('Tlist_Remove_File (' . ++ \ s:tlist_{fidx}_filename . ', ' . a:user_request . ')') ++ ++ let save_winnr = winnr() ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Taglist window is open, remove the file from display ++ ++ if save_winnr != winnum ++ let old_eventignore = &eventignore ++ set eventignore=all ++ exe winnum . 'wincmd w' ++ endif ++ ++ call s:Tlist_Window_Remove_File_From_Display(fidx) ++ ++ if save_winnr != winnum ++ exe save_winnr . 'wincmd w' ++ let &eventignore = old_eventignore ++ endif ++ endif ++ ++ let fname = s:tlist_{fidx}_filename ++ ++ if a:user_request ++ " As the user requested to remove the file from taglist, ++ " add it to the removed list ++ call s:Tlist_Update_Remove_List(fname, 1) ++ endif ++ ++ " Remove the file name from the taglist list of filenames ++ let idx = stridx(s:tlist_file_names, fname . "\n") ++ let text_before = strpart(s:tlist_file_names, 0, idx) ++ let rem_text = strpart(s:tlist_file_names, idx) ++ let next_idx = stridx(rem_text, "\n") ++ let text_after = strpart(rem_text, next_idx + 1) ++ let s:tlist_file_names = text_before . text_after ++ ++ call s:Tlist_Discard_FileInfo(fidx) ++ ++ " Shift all the file variables by one index ++ let i = fidx + 1 ++ ++ while i < s:tlist_file_count ++ let j = i - 1 ++ ++ let s:tlist_{j}_filename = s:tlist_{i}_filename ++ let s:tlist_{j}_sort_type = s:tlist_{i}_sort_type ++ let s:tlist_{j}_filetype = s:tlist_{i}_filetype ++ let s:tlist_{j}_mtime = s:tlist_{i}_mtime ++ let s:tlist_{j}_start = s:tlist_{i}_start ++ let s:tlist_{j}_end = s:tlist_{i}_end ++ let s:tlist_{j}_valid = s:tlist_{i}_valid ++ let s:tlist_{j}_visible = s:tlist_{i}_visible ++ let s:tlist_{j}_tag_count = s:tlist_{i}_tag_count ++ let s:tlist_{j}_menu_cmd = s:tlist_{i}_menu_cmd ++ ++ let k = 1 ++ while k <= s:tlist_{j}_tag_count ++ let s:tlist_{j}_{k}_tag = s:tlist_{i}_{k}_tag ++ let s:tlist_{j}_{k}_tag_name = s:tlist_{i}_{k}_tag_name ++ let s:tlist_{j}_{k}_tag_type = s:Tlist_Get_Tag_Type_By_Tag(i, k) ++ let s:tlist_{j}_{k}_ttype_idx = s:tlist_{i}_{k}_ttype_idx ++ let s:tlist_{j}_{k}_tag_proto = s:Tlist_Get_Tag_Prototype(i, k) ++ let s:tlist_{j}_{k}_tag_searchpat = s:Tlist_Get_Tag_SearchPat(i, k) ++ let s:tlist_{j}_{k}_tag_linenum = s:Tlist_Get_Tag_Linenum(i, k) ++ let k = k + 1 ++ endwhile ++ ++ let ftype = s:tlist_{i}_filetype ++ ++ let k = 1 ++ while k <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{k}_name ++ let s:tlist_{j}_{ttype} = s:tlist_{i}_{ttype} ++ let s:tlist_{j}_{ttype}_offset = s:tlist_{i}_{ttype}_offset ++ let s:tlist_{j}_{ttype}_count = s:tlist_{i}_{ttype}_count ++ if s:tlist_{j}_{ttype} != '' ++ let l = 1 ++ while l <= s:tlist_{j}_{ttype}_count ++ let s:tlist_{j}_{ttype}_{l} = s:tlist_{i}_{ttype}_{l} ++ let l = l + 1 ++ endwhile ++ endif ++ let k = k + 1 ++ endwhile ++ ++ " As the file and tag information is copied to the new index, ++ " discard the previous information ++ call s:Tlist_Discard_FileInfo(i) ++ ++ let i = i + 1 ++ endwhile ++ ++ " Reduce the number of files displayed ++ let s:tlist_file_count = s:tlist_file_count - 1 ++ ++ if g:Tlist_Show_One_File ++ " If the tags for only one file is displayed and if we just ++ " now removed that file, then invalidate the current file idx ++ if s:tlist_cur_file_idx == fidx ++ let s:tlist_cur_file_idx = -1 ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Goto_Window ++" Goto the taglist window ++function! s:Tlist_Window_Goto_Window() ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ if winnr() != winnum ++ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Create ++" Create a new taglist window. If it is already open, jump to it ++function! s:Tlist_Window_Create() ++ call s:Tlist_Log_Msg('Tlist_Window_Create()') ++ " If the window is open, jump to it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Jump to the existing window ++ if winnr() != winnum ++ exe winnum . 'wincmd w' ++ endif ++ return ++ endif ++ ++ " If used with winmanager don't open windows. Winmanager will handle ++ " the window/buffer management ++ if s:tlist_app_name == "winmanager" ++ return ++ endif ++ ++ " Create a new window. If user prefers a horizontal window, then open ++ " a horizontally split window. Otherwise open a vertically split ++ " window ++ if g:Tlist_Use_Horiz_Window ++ " Open a horizontally split window ++ let win_dir = 'botright' ++ " Horizontal window height ++ let win_size = g:Tlist_WinHeight ++ else ++ if s:tlist_winsize_chgd == -1 ++ " Open a vertically split window. Increase the window size, if ++ " needed, to accomodate the new window ++ if g:Tlist_Inc_Winwidth && ++ \ &columns < (80 + g:Tlist_WinWidth) ++ " Save the original window position ++ let s:tlist_pre_winx = getwinposx() ++ let s:tlist_pre_winy = getwinposy() ++ ++ " one extra column is needed to include the vertical split ++ let &columns= &columns + g:Tlist_WinWidth + 1 ++ ++ let s:tlist_winsize_chgd = 1 ++ else ++ let s:tlist_winsize_chgd = 0 ++ endif ++ endif ++ ++ if g:Tlist_Use_Right_Window ++ " Open the window at the rightmost place ++ let win_dir = 'botright vertical' ++ else ++ " Open the window at the leftmost place ++ let win_dir = 'topleft vertical' ++ endif ++ let win_size = g:Tlist_WinWidth ++ endif ++ ++ " If the tag listing temporary buffer already exists, then reuse it. ++ " Otherwise create a new buffer ++ let bufnum = bufnr(g:TagList_title) ++ if bufnum == -1 ++ " Create a new buffer ++ let wcmd = g:TagList_title ++ else ++ " Edit the existing buffer ++ let wcmd = '+buffer' . bufnum ++ endif ++ ++ " Create the taglist window ++ exe 'silent! ' . win_dir . ' ' . win_size . 'split ' . wcmd ++ ++ " Save the new window position ++ let s:tlist_winx = getwinposx() ++ let s:tlist_winy = getwinposy() ++ ++ " Initialize the taglist window ++ call s:Tlist_Window_Init() ++endfunction ++ ++" Tlist_Window_Zoom ++" Zoom (maximize/minimize) the taglist window ++function! s:Tlist_Window_Zoom() ++ if s:tlist_win_maximized ++ " Restore the window back to the previous size ++ if g:Tlist_Use_Horiz_Window ++ exe 'resize ' . g:Tlist_WinHeight ++ else ++ exe 'vert resize ' . g:Tlist_WinWidth ++ endif ++ let s:tlist_win_maximized = 0 ++ else ++ " Set the window size to the maximum possible without closing other ++ " windows ++ if g:Tlist_Use_Horiz_Window ++ resize ++ else ++ vert resize ++ endif ++ let s:tlist_win_maximized = 1 ++ endif ++endfunction ++ ++" Tlist_Ballon_Expr ++" When the mouse cursor is over a tag in the taglist window, display the ++" tag prototype (balloon) ++function! Tlist_Ballon_Expr() ++ " Get the file index ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(v:beval_lnum) ++ if fidx == -1 ++ return '' ++ endif ++ ++ " Get the tag output line for the current tag ++ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, v:beval_lnum) ++ if tidx == 0 ++ return '' ++ endif ++ ++ " Get the tag search pattern and display it ++ return s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Window_Check_Width ++" Check the width of the taglist window. For horizontally split windows, the ++" 'winfixheight' option is used to fix the height of the window. For ++" vertically split windows, Vim doesn't support the 'winfixwidth' option. So ++" need to handle window width changes from this function. ++function! s:Tlist_Window_Check_Width() ++ let tlist_winnr = bufwinnr(g:TagList_title) ++ if tlist_winnr == -1 ++ return ++ endif ++ ++ let width = winwidth(tlist_winnr) ++ if width != g:Tlist_WinWidth ++ call s:Tlist_Log_Msg("Tlist_Window_Check_Width: Changing window " . ++ \ "width from " . width . " to " . g:Tlist_WinWidth) ++ let save_winnr = winnr() ++ if save_winnr != tlist_winnr ++ call s:Tlist_Exe_Cmd_No_Acmds(tlist_winnr . 'wincmd w') ++ endif ++ exe 'vert resize ' . g:Tlist_WinWidth ++ if save_winnr != tlist_winnr ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Exit_Only_Window ++" If the 'Tlist_Exit_OnlyWindow' option is set, then exit Vim if only the ++" taglist window is present. ++function! s:Tlist_Window_Exit_Only_Window() ++ " Before quitting Vim, delete the taglist buffer so that ++ " the '0 mark is correctly set to the previous buffer. ++ if v:version < 700 ++ if winbufnr(2) == -1 ++ bdelete ++ quit ++ endif ++ else ++ if winbufnr(2) == -1 ++ if tabpagenr('$') == 1 ++ " Only one tag page is present ++ bdelete ++ quit ++ else ++ " More than one tab page is present. Close only the current ++ " tab page ++ close ++ endif ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Init ++" Set the default options for the taglist window ++function! s:Tlist_Window_Init() ++ call s:Tlist_Log_Msg('Tlist_Window_Init()') ++ ++ " The 'readonly' option should not be set for the taglist buffer. ++ " If Vim is started as "view/gview" or if the ":view" command is ++ " used, then the 'readonly' option is set for all the buffers. ++ " Unset it for the taglist buffer ++ setlocal noreadonly ++ ++ " Set the taglist buffer filetype to taglist ++ setlocal filetype=taglist ++ ++ " Define taglist window element highlighting ++ syntax match TagListComment '^" .*' ++ syntax match TagListFileName '^[^" ].*$' ++ syntax match TagListTitle '^ \S.*$' ++ syntax match TagListTagScope '\s\[.\{-\}\]$' ++ ++ " Define the highlighting only if colors are supported ++ if has('gui_running') || &t_Co > 2 ++ " 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 default link TagListTagName Search ++ endif ++ " Colors to highlight comments and titles ++ if hlexists('MyTagListComment') ++ highlight link TagListComment MyTagListComment ++ else ++ highlight clear TagListComment ++ highlight default link TagListComment Comment ++ endif ++ if hlexists('MyTagListTitle') ++ highlight link TagListTitle MyTagListTitle ++ else ++ highlight clear TagListTitle ++ highlight default link TagListTitle Title ++ endif ++ if hlexists('MyTagListFileName') ++ highlight link TagListFileName MyTagListFileName ++ else ++ highlight clear TagListFileName ++ highlight default TagListFileName guibg=Grey ctermbg=darkgray ++ \ guifg=white ctermfg=white ++ endif ++ if hlexists('MyTagListTagScope') ++ highlight link TagListTagScope MyTagListTagScope ++ else ++ highlight clear TagListTagScope ++ highlight default link TagListTagScope Identifier ++ endif ++ else ++ highlight default TagListTagName term=reverse cterm=reverse ++ endif ++ ++ " Folding related settings ++ setlocal foldenable ++ setlocal foldminlines=0 ++ setlocal foldmethod=manual ++ setlocal foldlevel=9999 ++ if g:Tlist_Enable_Fold_Column ++ setlocal foldcolumn=3 ++ else ++ setlocal foldcolumn=0 ++ endif ++ setlocal foldtext=v:folddashes.getline(v:foldstart) ++ ++ if s:tlist_app_name != "winmanager" ++ " Mark buffer as scratch ++ silent! setlocal buftype=nofile ++ if s:tlist_app_name == "none" ++ silent! setlocal bufhidden=delete ++ endif ++ silent! setlocal noswapfile ++ " Due to a bug in Vim 6.0, the winbufnr() function fails for unlisted ++ " buffers. So if the taglist buffer is unlisted, multiple taglist ++ " windows will be opened. This bug is fixed in Vim 6.1 and above ++ if v:version >= 601 ++ silent! setlocal nobuflisted ++ endif ++ endif ++ ++ silent! setlocal nowrap ++ ++ " If the 'number' option is set in the source window, it will affect the ++ " taglist window. So forcefully disable 'number' option for the taglist ++ " window ++ silent! setlocal nonumber ++ ++ " Use fixed height when horizontally split window is used ++ if g:Tlist_Use_Horiz_Window ++ if v:version >= 602 ++ set winfixheight ++ endif ++ endif ++ if !g:Tlist_Use_Horiz_Window && v:version >= 700 ++ set winfixwidth ++ endif ++ ++ " Setup balloon evaluation to display tag prototype ++ if v:version >= 700 && has('balloon_eval') ++ setlocal balloonexpr=Tlist_Ballon_Expr() ++ set ballooneval ++ 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_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 ++ nnoremap - :silent! foldclose ++ nnoremap * :silent! %foldopen! ++ nnoremap = :silent! %foldclose ++ nnoremap :silent! foldopen ++ nnoremap :silent! foldclose ++ nnoremap :silent! %foldopen! ++ 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_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_Window_Jump_To_Tag('useopen') ++ " Windows needs return ++ 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 ++ inoremap - :silent! foldclose ++ inoremap * :silent! %foldopen! ++ inoremap = :silent! %foldclose ++ inoremap :silent! foldopen ++ inoremap :silent! foldclose ++ inoremap :silent! %foldopen! ++ inoremap :call ++ \ 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_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 ++ if g:Tlist_Use_SingleClick == 1 ++ " Contributed by Bindu Wavell ++ " attempt to perform single click mapping, it would be much ++ " nicer if we could nnoremap ... however vim does ++ " not fire the when you use the mouse ++ " to enter a buffer. ++ let clickmap = ':if bufname("%") =~ "__Tag_List__" ' . ++ \ 'call Tlist_Window_Jump_To_Tag("useopen") ' . ++ \ ' endif ' ++ if maparg('', 'n') == '' ++ " no mapping for leftmouse ++ exe ':nnoremap ' . clickmap ++ else ++ " we have a mapping ++ let mapcmd = ':nnoremap ' ++ let mapcmd = mapcmd . substitute(substitute( ++ \ maparg('', 'n'), '|', '', 'g'), ++ \ '\c^', '', '') ++ let mapcmd = mapcmd . clickmap ++ exe mapcmd ++ endif ++ endif ++ ++ " Define the taglist autocommands ++ augroup TagListAutoCmds ++ autocmd! ++ " Display the tag prototype for the tag under the cursor. ++ autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info() ++ " Highlight the current tag periodically ++ 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 ++ autocmd BufUnload __Tag_List__ call s:Tlist_Post_Close_Cleanup() ++ " 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('')) ++ endif ++ " Exit Vim itself if only the taglist window is present (optional) ++ if g:Tlist_Exit_OnlyWindow ++ autocmd BufEnter __Tag_List__ nested ++ \ call s:Tlist_Window_Exit_Only_Window() ++ endif ++ if s:tlist_app_name != "winmanager" && ++ \ !g:Tlist_Process_File_Always && ++ \ (!has('gui_running') || !g:Tlist_Show_Menu) ++ " Auto refresh the taglist window ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ ++ if !g:Tlist_Use_Horiz_Window ++ if v:version < 700 ++ autocmd WinEnter * call s:Tlist_Window_Check_Width() ++ endif ++ endif ++ augroup end ++ ++ " Restore the previous cpoptions settings ++ let &cpoptions = old_cpoptions ++endfunction ++ ++" Tlist_Window_Refresh ++" Display the tags for all the files in the taglist window ++function! s:Tlist_Window_Refresh() ++ call s:Tlist_Log_Msg('Tlist_Window_Refresh()') ++ " Set report option to a huge value to prevent informational messages ++ " while deleting the lines ++ let old_report = &report ++ set report=99999 ++ ++ " Mark the buffer as modifiable ++ setlocal modifiable ++ ++ " Delete the contents of the buffer to the black-hole register ++ silent! %delete _ ++ ++ " As we have cleared the taglist window, mark all the files ++ " as not visible ++ let i = 0 ++ while i < s:tlist_file_count ++ let s:tlist_{i}_visible = 0 ++ let i = i + 1 ++ endwhile ++ ++ if g:Tlist_Compact_Format == 0 ++ " Display help in non-compact mode ++ call s:Tlist_Window_Display_Help() ++ endif ++ ++ " Mark the buffer as not modifiable ++ setlocal nomodifiable ++ ++ " Restore the report option ++ let &report = old_report ++ ++ " If the tags for only one file should be displayed in the taglist ++ " window, then no need to add the tags here. The bufenter autocommand ++ " will add the tags for that file. ++ if g:Tlist_Show_One_File ++ return ++ endif ++ ++ " List all the tags for the previously processed files ++ " Do this only if taglist is configured to display tags for more than ++ " one file. Otherwise, when Tlist_Show_One_File is configured, ++ " tags for the wrong file will be displayed. ++ let i = 0 ++ while i < s:tlist_file_count ++ call s:Tlist_Window_Refresh_File(s:tlist_{i}_filename, ++ \ s:tlist_{i}_filetype) ++ let i = i + 1 ++ endwhile ++ ++ if g:Tlist_Auto_Update ++ " Add and list the tags for all buffers in the Vim buffer list ++ let i = 1 ++ let last_bufnum = bufnr('$') ++ while i <= last_bufnum ++ if buflisted(i) ++ let fname = fnamemodify(bufname(i), ':p') ++ let ftype = s:Tlist_Get_Buffer_Filetype(i) ++ " If the file doesn't support tag listing, skip it ++ if !s:Tlist_Skip_File(fname, ftype) ++ call s:Tlist_Window_Refresh_File(fname, ftype) ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++ endif ++ ++ " If Tlist_File_Fold_Auto_Close option is set, then close all the folds ++ if g:Tlist_File_Fold_Auto_Close ++ " Close all the folds ++ silent! %foldclose ++ endif ++ ++ " Move the cursor to the top of the taglist window ++ normal! gg ++endfunction ++ ++" Tlist_Post_Close_Cleanup() ++" Close the taglist window and adjust the Vim window width ++function! s:Tlist_Post_Close_Cleanup() ++ call s:Tlist_Log_Msg('Tlist_Post_Close_Cleanup()') ++ " Mark all the files as not visible ++ let i = 0 ++ while i < s:tlist_file_count ++ let s:tlist_{i}_visible = 0 ++ let i = i + 1 ++ endwhile ++ ++ " Remove the taglist autocommands ++ silent! autocmd! TagListAutoCmds ++ ++ " Clear all the highlights ++ match none ++ ++ silent! syntax clear TagListTitle ++ silent! syntax clear TagListComment ++ silent! syntax clear TagListTagScope ++ ++ " Remove the left mouse click mapping if it was setup initially ++ if g:Tlist_Use_SingleClick ++ if hasmapto('') ++ nunmap ++ endif ++ endif ++ ++ if s:tlist_app_name != "winmanager" ++ if g:Tlist_Use_Horiz_Window || g:Tlist_Inc_Winwidth == 0 || ++ \ s:tlist_winsize_chgd != 1 || ++ \ &columns < (80 + g:Tlist_WinWidth) ++ " No need to adjust window width if using horizontally split taglist ++ " window or if columns is less than 101 or if the user chose not to ++ " adjust the window width ++ else ++ " If the user didn't manually move the window, then restore the window ++ " position to the pre-taglist position ++ if s:tlist_pre_winx != -1 && s:tlist_pre_winy != -1 && ++ \ getwinposx() == s:tlist_winx && ++ \ getwinposy() == s:tlist_winy ++ exe 'winpos ' . s:tlist_pre_winx . ' ' . s:tlist_pre_winy ++ endif ++ ++ " Adjust the Vim window width ++ let &columns= &columns - (g:Tlist_WinWidth + 1) ++ endif ++ endif ++ ++ let s:tlist_winsize_chgd = -1 ++ ++ " Reset taglist state variables ++ if s:tlist_app_name == "winmanager" ++ let s:tlist_app_name = "none" ++ endif ++ let s:tlist_window_initialized = 0 ++endfunction ++ ++" Tlist_Window_Refresh_File() ++" List the tags defined in the specified file in a Vim window ++function! s:Tlist_Window_Refresh_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Window_Refresh_File (' . a:filename . ')') ++ " First check whether the file already exists ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx != -1 ++ let file_listed = 1 ++ else ++ let file_listed = 0 ++ endif ++ ++ if !file_listed ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(a:filename) ++ return ++ endif ++ endif ++ ++ if file_listed && s:tlist_{fidx}_visible ++ " Check whether the file tags are currently valid ++ if s:tlist_{fidx}_valid ++ " Goto the first line in the file ++ exe s:tlist_{fidx}_start ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ endif ++ return ++ endif ++ ++ " Discard and remove the tags for this file from display ++ call s:Tlist_Discard_TagInfo(fidx) ++ call s:Tlist_Window_Remove_File_From_Display(fidx) ++ endif ++ ++ " Process and generate a list of tags defined in the file ++ if !file_listed || !s:tlist_{fidx}_valid ++ let ret_fidx = s:Tlist_Process_File(a:filename, a:ftype) ++ if ret_fidx == -1 ++ return ++ endif ++ let fidx = ret_fidx ++ endif ++ ++ " Set report option to a huge value to prevent informational messages ++ " while adding lines to the taglist window ++ let old_report = &report ++ set report=99999 ++ ++ if g:Tlist_Show_One_File ++ " Remove the previous file ++ if s:tlist_cur_file_idx != -1 ++ 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 ++ endif ++ let s:tlist_cur_file_idx = fidx ++ endif ++ ++ " Mark the buffer as modifiable ++ setlocal modifiable ++ ++ " Add new files to the end of the window. For existing files, add them at ++ " the same line where they were previously present. If the file is not ++ " visible, then add it at the end ++ if s:tlist_{fidx}_start == 0 || !s:tlist_{fidx}_visible ++ if g:Tlist_Compact_Format ++ let s:tlist_{fidx}_start = line('$') ++ else ++ let s:tlist_{fidx}_start = line('$') + 1 ++ endif ++ endif ++ ++ let s:tlist_{fidx}_visible = 1 ++ ++ " Goto the line where this file should be placed ++ if g:Tlist_Compact_Format ++ exe s:tlist_{fidx}_start ++ else ++ exe s:tlist_{fidx}_start - 1 ++ endif ++ ++ let txt = fnamemodify(s:tlist_{fidx}_filename, ':t') . ' (' . ++ \ fnamemodify(s:tlist_{fidx}_filename, ':p:h') . ')' ++ if g:Tlist_Compact_Format == 0 ++ silent! put =txt ++ else ++ silent! put! =txt ++ " Move to the next line ++ exe line('.') + 1 ++ endif ++ let file_start = s:tlist_{fidx}_start ++ ++ " Add the tag names grouped by tag type to the buffer with a title ++ let i = 1 ++ let ttype_cnt = s:tlist_{a:ftype}_count ++ while i <= ttype_cnt ++ let ttype = s:tlist_{a:ftype}_{i}_name ++ " Add the tag type only if there are tags for that type ++ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype ++ let ttype_txt = {fidx_ttype} ++ if ttype_txt != '' ++ let txt = ' ' . s:tlist_{a:ftype}_{i}_fullname ++ if g:Tlist_Compact_Format == 0 ++ let ttype_start_lnum = line('.') + 1 ++ silent! put =txt ++ else ++ let ttype_start_lnum = line('.') ++ silent! put! =txt ++ endif ++ silent! put =ttype_txt ++ ++ let {fidx_ttype}_offset = ttype_start_lnum - file_start ++ ++ " create a fold for this tag type ++ let fold_start = ttype_start_lnum ++ let fold_end = fold_start + {fidx_ttype}_count ++ exe fold_start . ',' . fold_end . 'fold' ++ ++ " Adjust the cursor position ++ if g:Tlist_Compact_Format == 0 ++ exe ttype_start_lnum + {fidx_ttype}_count ++ else ++ exe ttype_start_lnum + {fidx_ttype}_count + 1 ++ endif ++ ++ if g:Tlist_Compact_Format == 0 ++ " Separate the tag types by a empty line ++ silent! put ='' ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++ ++ if s:tlist_{fidx}_tag_count == 0 ++ if g:Tlist_Compact_Format == 0 ++ silent! put ='' ++ endif ++ endif ++ ++ let s:tlist_{fidx}_end = line('.') - 1 ++ ++ " Create a fold for the entire file ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' ++ exe 'silent! ' . s:tlist_{fidx}_start . ',' . ++ \ s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Goto the starting line for this file, ++ exe s:tlist_{fidx}_start ++ ++ if s:tlist_app_name == "winmanager" ++ " To handle a bug in the winmanager plugin, add a space at the ++ " last line ++ call setline('$', ' ') ++ endif ++ ++ " Mark the buffer as not modifiable ++ setlocal nomodifiable ++ ++ " Restore the report option ++ let &report = old_report ++ ++ " Update the start and end line numbers for all the files following this ++ " file ++ let start = s:tlist_{fidx}_start ++ " include the empty line after the last line ++ if g:Tlist_Compact_Format ++ let end = s:tlist_{fidx}_end ++ else ++ let end = s:tlist_{fidx}_end + 1 ++ endif ++ 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) ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(1) ++ endif ++endfunction ++ ++" Tlist_Init_File ++" Initialize the variables for a new file ++function! s:Tlist_Init_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Init_File (' . a:filename . ')') ++ " Add new files at the end of the list ++ let fidx = s:tlist_file_count ++ let s:tlist_file_count = s:tlist_file_count + 1 ++ " Add the new file name to the taglist list of file names ++ let s:tlist_file_names = s:tlist_file_names . a:filename . "\n" ++ ++ " Initialize the file variables ++ let s:tlist_{fidx}_filename = a:filename ++ let s:tlist_{fidx}_sort_type = g:Tlist_Sort_Type ++ let s:tlist_{fidx}_filetype = a:ftype ++ let s:tlist_{fidx}_mtime = -1 ++ let s:tlist_{fidx}_start = 0 ++ let s:tlist_{fidx}_end = 0 ++ let s:tlist_{fidx}_valid = 0 ++ let s:tlist_{fidx}_visible = 0 ++ let s:tlist_{fidx}_tag_count = 0 ++ let s:tlist_{fidx}_menu_cmd = '' ++ ++ " Initialize the tag type variables ++ let i = 1 ++ while i <= s:tlist_{a:ftype}_count ++ let ttype = s:tlist_{a:ftype}_{i}_name ++ let s:tlist_{fidx}_{ttype} = '' ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = 0 ++ let i = i + 1 ++ endwhile ++ ++ return fidx ++endfunction ++ ++" Tlist_Get_Tag_Type_By_Tag ++" Return the tag type for the specified tag index ++function! s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) ++ let ttype_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_type' ++ ++ " Already parsed and have the tag name ++ if exists(ttype_var) ++ return {ttype_var} ++ endif ++ ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let {ttype_var} = s:Tlist_Extract_Tagtype(tag_line) ++ ++ return {ttype_var} ++endfunction ++ ++" Tlist_Get_Tag_Prototype ++function! s:Tlist_Get_Tag_Prototype(fidx, tidx) ++ let tproto_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_proto' ++ ++ " Already parsed and have the tag prototype ++ if exists(tproto_var) ++ return {tproto_var} ++ endif ++ ++ " Parse and extract the tag prototype ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = stridx(tag_line, '/^') + 2 ++ let end = stridx(tag_line, '/;"' . "\t") ++ if tag_line[end - 1] == '$' ++ let end = end -1 ++ endif ++ let tag_proto = strpart(tag_line, start, end - start) ++ let {tproto_var} = substitute(tag_proto, '\s*', '', '') ++ ++ return {tproto_var} ++endfunction ++ ++" Tlist_Get_Tag_SearchPat ++function! s:Tlist_Get_Tag_SearchPat(fidx, tidx) ++ let tpat_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_searchpat' ++ ++ " Already parsed and have the tag search pattern ++ if exists(tpat_var) ++ return {tpat_var} ++ endif ++ ++ " Parse and extract the tag search pattern ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = stridx(tag_line, '/^') + 2 ++ let end = stridx(tag_line, '/;"' . "\t") ++ if tag_line[end - 1] == '$' ++ let end = end -1 ++ endif ++ let {tpat_var} = '\V\^' . strpart(tag_line, start, end - start) . ++ \ (tag_line[end] == '$' ? '\$' : '') ++ ++ return {tpat_var} ++endfunction ++ ++" Tlist_Get_Tag_Linenum ++" Return the tag line number, given the tag index ++function! s:Tlist_Get_Tag_Linenum(fidx, tidx) ++ let tline_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_linenum' ++ ++ " Already parsed and have the tag line number ++ if exists(tline_var) ++ return {tline_var} ++ endif ++ ++ " Parse and extract the tag line number ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = strridx(tag_line, 'line:') + 5 ++ let end = strridx(tag_line, "\t") ++ if end < start ++ let {tline_var} = strpart(tag_line, start) + 0 ++ else ++ let {tline_var} = strpart(tag_line, start, end - start) + 0 ++ endif ++ ++ return {tline_var} ++endfunction ++ ++" Tlist_Parse_Tagline ++" Parse a tag line from the ctags output. Separate the tag output based on the ++" tag type and store it in the tag type variable. ++" The format of each line in the ctags output is: ++" ++" tag_namefile_nameex_cmd;"extension_fields ++" ++function! s:Tlist_Parse_Tagline(tag_line) ++ if a:tag_line == '' ++ " Skip empty lines ++ return ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Extract_Tagtype(a:tag_line) ++ ++ " 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 ++ ++ " Update the total tag count ++ let s:tidx = s:tidx + 1 ++ ++ " The following variables are used to optimize this code. Vim is slow in ++ " using curly brace names. To reduce the amount of processing needed, the ++ " curly brace variables are pre-processed here ++ let fidx_tidx = 's:tlist_' . s:fidx . '_' . s:tidx ++ let fidx_ttype = 's:tlist_' . s:fidx . '_' . ttype ++ ++ " Update the count of this tag type ++ let ttype_idx = {fidx_ttype}_count + 1 ++ let {fidx_ttype}_count = ttype_idx ++ ++ " Store the ctags output for this tag ++ let {fidx_tidx}_tag = a:tag_line ++ ++ " Store the tag index and the tag type index (back pointers) ++ let {fidx_ttype}_{ttype_idx} = s:tidx ++ let {fidx_tidx}_ttype_idx = ttype_idx ++ ++ " Extract the tag name ++ let tag_name = strpart(a:tag_line, 0, stridx(a:tag_line, "\t")) ++ ++ " Extract the tag scope/prototype ++ if g:Tlist_Display_Prototype ++ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(s:fidx, s:tidx) ++ else ++ let ttxt = ' ' . tag_name ++ ++ " Add the tag scope, if it is available and is configured. Tag ++ " scope is the last field after the 'line:\t' field ++ if g:Tlist_Display_Tag_Scope ++ let tag_scope = s:Tlist_Extract_Tag_Scope(a:tag_line) ++ if tag_scope != '' ++ let ttxt = ttxt . ' [' . tag_scope . ']' ++ endif ++ endif ++ endif ++ ++ " Add this tag to the tag type variable ++ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" ++ ++ " Save the tag name ++ let {fidx_tidx}_tag_name = tag_name ++endfunction ++ ++" Tlist_Process_File ++" Get the list of tags defined in the specified file and store them ++" in Vim variables. Returns the file index where the tags are stored. ++function! s:Tlist_Process_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Process_File (' . a:filename . ', ' . ++ \ a:ftype . ')') ++ " Check whether this file is supported ++ if s:Tlist_Skip_File(a:filename, a:ftype) ++ return -1 ++ endif ++ ++ " If the tag types for this filetype are not yet created, then create ++ " them now ++ let var = 's:tlist_' . a:ftype . '_count' ++ if !exists(var) ++ if s:Tlist_FileType_Init(a:ftype) == 0 ++ return -1 ++ endif ++ endif ++ ++ " If this file is already processed, then use the cached values ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ " First time, this file is loaded ++ let fidx = s:Tlist_Init_File(a:filename, a:ftype) ++ else ++ " File was previously processed. Discard the tag information ++ call s:Tlist_Discard_TagInfo(fidx) ++ endif ++ ++ let s:tlist_{fidx}_valid = 1 ++ ++ " Exuberant ctags arguments to generate a tag list ++ let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nks ' ++ ++ " Form the ctags argument depending on the sort type ++ if s:tlist_{fidx}_sort_type == 'name' ++ let ctags_args = ctags_args . '--sort=yes' ++ else ++ let ctags_args = ctags_args . '--sort=no' ++ endif ++ ++ " Add the filetype specific arguments ++ let ctags_args = ctags_args . ' ' . s:tlist_{a:ftype}_ctags_args ++ ++ " Ctags command to produce output with regexp for locating the tags ++ let ctags_cmd = g:Tlist_Ctags_Cmd . ctags_args ++ let ctags_cmd = ctags_cmd . ' "' . a:filename . '"' ++ ++ if &shellxquote == '"' ++ " Double-quotes within double-quotes will not work in the ++ " command-line.If the 'shellxquote' option is set to double-quotes, ++ " then escape the double-quotes in the ctags command-line. ++ let ctags_cmd = escape(ctags_cmd, '"') ++ endif ++ ++ " In Windows 95, if not using cygwin, disable the 'shellslash' ++ " option. Otherwise, this will cause problems when running the ++ " ctags command. ++ if has('win95') && !has('win32unix') ++ let old_shellslash = &shellslash ++ set noshellslash ++ endif ++ ++ if has('win32') && !has('win32unix') && !has('win95') ++ \ && (&shell =~ 'cmd.exe') ++ " Windows does not correctly deal with commands that have more than 1 ++ " set of double quotes. It will strip them all resulting in: ++ " 'C:\Program' is not recognized as an internal or external command ++ " operable program or batch file. To work around this, place the ++ " command inside a batch file and call the batch file. ++ " Do this only on Win2K, WinXP and above. ++ " Contributed by: David Fishburn. ++ let s:taglist_tempfile = fnamemodify(tempname(), ':h') . ++ \ '\taglist.cmd' ++ exe 'redir! > ' . s:taglist_tempfile ++ silent echo ctags_cmd ++ redir END ++ ++ call s:Tlist_Log_Msg('Cmd inside batch file: ' . ctags_cmd) ++ let ctags_cmd = '"' . s:taglist_tempfile . '"' ++ endif ++ ++ call s:Tlist_Log_Msg('Cmd: ' . ctags_cmd) ++ ++ " Run ctags and get the tag list ++ let cmd_output = system(ctags_cmd) ++ ++ " Restore the value of the 'shellslash' option. ++ if has('win95') && !has('win32unix') ++ let &shellslash = old_shellslash ++ endif ++ ++ if exists('s:taglist_tempfile') ++ " Delete the temporary cmd file created on MS-Windows ++ call delete(s:taglist_tempfile) ++ endif ++ ++ " Handle errors ++ if v:shell_error ++ let msg = "Taglist: Failed to generate tags for " . a:filename ++ call s:Tlist_Warning_Msg(msg) ++ if cmd_output != '' ++ call s:Tlist_Warning_Msg(cmd_output) ++ endif ++ return fidx ++ endif ++ ++ " Store the modification time for the file ++ let s:tlist_{fidx}_mtime = getftime(a:filename) ++ ++ " No tags for current file ++ if cmd_output == '' ++ call s:Tlist_Log_Msg('No tags defined in ' . a:filename) ++ return fidx ++ endif ++ ++ call s:Tlist_Log_Msg('Generated tags information for ' . a:filename) ++ ++ if v:version > 601 ++ " The following script local variables are used by the ++ " Tlist_Parse_Tagline() function. ++ let s:ctags_flags = s:tlist_{a:ftype}_ctags_flags ++ let s:fidx = fidx ++ let s:tidx = 0 ++ ++ " Process the ctags output one line at a time. The substitute() ++ " command is used to parse the tag lines instead of using the ++ " matchstr()/stridx()/strpart() functions for performance reason ++ call substitute(cmd_output, "\\([^\n]\\+\\)\n", ++ \ '\=s:Tlist_Parse_Tagline(submatch(1))', 'g') ++ ++ " Save the number of tags for this file ++ let s:tlist_{fidx}_tag_count = s:tidx ++ ++ " The following script local variables are no longer needed ++ unlet! s:ctags_flags ++ unlet! s:tidx ++ unlet! s:fidx ++ else ++ " Due to a bug in Vim earlier than version 6.1, ++ " we cannot use substitute() to parse the ctags output. ++ " Instead the slow str*() functions are used ++ let ctags_flags = s:tlist_{a:ftype}_ctags_flags ++ let tidx = 0 ++ ++ while cmd_output != '' ++ " Extract one line at a time ++ let idx = stridx(cmd_output, "\n") ++ let one_line = strpart(cmd_output, 0, idx) ++ " Remove the line from the tags output ++ let cmd_output = strpart(cmd_output, idx + 1) ++ ++ if one_line == '' ++ " Line is not in proper tags format ++ continue ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Extract_Tagtype(one_line) ++ ++ " Make sure the tag type is a valid and supported one ++ if ttype == '' || stridx(ctags_flags, ttype) == -1 ++ " Line is not in proper tags format or Tag type is not ++ " supported ++ continue ++ endif ++ ++ " Update the total tag count ++ let tidx = tidx + 1 ++ ++ " The following variables are used to optimize this code. Vim is ++ " slow in using curly brace names. To reduce the amount of ++ " processing needed, the curly brace variables are pre-processed ++ " here ++ let fidx_tidx = 's:tlist_' . fidx . '_' . tidx ++ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype ++ ++ " Update the count of this tag type ++ let ttype_idx = {fidx_ttype}_count + 1 ++ let {fidx_ttype}_count = ttype_idx ++ ++ " Store the ctags output for this tag ++ let {fidx_tidx}_tag = one_line ++ ++ " Store the tag index and the tag type index (back pointers) ++ let {fidx_ttype}_{ttype_idx} = tidx ++ let {fidx_tidx}_ttype_idx = ttype_idx ++ ++ " Extract the tag name ++ let tag_name = strpart(one_line, 0, stridx(one_line, "\t")) ++ ++ " Extract the tag scope/prototype ++ if g:Tlist_Display_Prototype ++ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(fidx, tidx) ++ else ++ let ttxt = ' ' . tag_name ++ ++ " Add the tag scope, if it is available and is configured. Tag ++ " scope is the last field after the 'line:\t' field ++ if g:Tlist_Display_Tag_Scope ++ let tag_scope = s:Tlist_Extract_Tag_Scope(one_line) ++ if tag_scope != '' ++ let ttxt = ttxt . ' [' . tag_scope . ']' ++ endif ++ endif ++ endif ++ ++ " Add this tag to the tag type variable ++ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" ++ ++ " Save the tag name ++ let {fidx_tidx}_tag_name = tag_name ++ endwhile ++ ++ " Save the number of tags for this file ++ let s:tlist_{fidx}_tag_count = tidx ++ endif ++ ++ call s:Tlist_Log_Msg('Processed ' . s:tlist_{fidx}_tag_count . ++ \ ' tags in ' . a:filename) ++ ++ return fidx ++endfunction ++ ++" Tlist_Update_File ++" Update the tags for a file (if needed) ++function! Tlist_Update_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Update_File (' . a:filename . ')') ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(a:filename, a:ftype) ++ return ++ endif ++ ++ " Convert the file name to a full path ++ let fname = fnamemodify(a:filename, ':p') ++ ++ " First check whether the file already exists ++ let fidx = s:Tlist_Get_File_Index(fname) ++ ++ if fidx != -1 && s:tlist_{fidx}_valid ++ " File exists and the tags are valid ++ " Check whether the file was modified after the last tags update ++ " If it is modified, then update the tags ++ if s:tlist_{fidx}_mtime == getftime(fname) ++ return ++ endif ++ else ++ " If the tags were removed previously based on a user request, ++ " as we are going to update the tags (based on the user request), ++ " remove the filename from the deleted list ++ call s:Tlist_Update_Remove_List(fname, 0) ++ endif ++ ++ " If the taglist window is opened, update it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum == -1 ++ " Taglist window is not present. Just update the taglist ++ " and return ++ call s:Tlist_Process_File(fname, a:ftype) ++ else ++ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != -1 ++ " If tags for only one file are displayed and we are not ++ " updating the tags for that file, then no need to ++ " refresh the taglist window. Otherwise, the taglist ++ " window should be updated. ++ if s:tlist_{s:tlist_cur_file_idx}_filename != fname ++ call s:Tlist_Process_File(fname, a:ftype) ++ return ++ endif ++ endif ++ ++ " Save the current window number ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ " Save the cursor position ++ let save_line = line('.') ++ let save_col = col('.') ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(fname, a:ftype) ++ ++ " Restore the cursor position ++ if v:version >= 601 ++ call cursor(save_line, save_col) ++ else ++ exe save_line ++ exe 'normal! ' . save_col . '|' ++ endif ++ ++ if winnr() != save_winnr ++ " Go back to the original window ++ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') ++ endif ++ endif ++ ++ " Update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(1) ++ endif ++endfunction ++ ++" Tlist_Window_Close ++" Close the taglist window ++function! s:Tlist_Window_Close() ++ call s:Tlist_Log_Msg('Tlist_Window_Close()') ++ " Make sure the taglist window exists ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum == -1 ++ call s:Tlist_Warning_Msg('Error: Taglist window is not open') ++ return ++ endif ++ ++ if winnr() == winnum ++ " Already in the taglist window. Close it and return ++ if winbufnr(2) != -1 ++ " If a window other than the taglist window is open, ++ " then only close the taglist window. ++ close ++ endif ++ else ++ " Goto the taglist window, close it and then come back to the ++ " original window ++ let curbufnr = bufnr('%') ++ exe winnum . '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 ++endfunction ++ ++" Tlist_Window_Mark_File_Window ++" Mark the current window as the file window to use when jumping to a tag. ++" Only if the current window is a non-plugin, non-preview and non-taglist ++" window ++function! s:Tlist_Window_Mark_File_Window() ++ if getbufvar('%', '&buftype') == '' && !&previewwindow ++ let w:tlist_file_window = "yes" ++ endif ++endfunction ++ ++" Tlist_Window_Open ++" Open and refresh the taglist window ++function! s:Tlist_Window_Open() ++ call s:Tlist_Log_Msg('Tlist_Window_Open()') ++ " If the window is open, jump to it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Jump to the existing window ++ if winnr() != winnum ++ exe winnum . 'wincmd w' ++ endif ++ return ++ endif ++ ++ if s:tlist_app_name == "winmanager" ++ " Taglist plugin is no longer part of the winmanager app ++ let s:tlist_app_name = "none" ++ endif ++ ++ " Get the filename and filetype for the specified buffer ++ let curbuf_name = fnamemodify(bufname('%'), ':p') ++ let curbuf_ftype = getbufvar('%', '&filetype') ++ let cur_lnum = line('.') ++ ++ " Mark the current window as the desired window to open a file when a tag ++ " is selected. ++ call s:Tlist_Window_Mark_File_Window() ++ ++ " Open the taglist window ++ call s:Tlist_Window_Create() ++ ++ call s:Tlist_Window_Refresh() ++ ++ if g:Tlist_Show_One_File ++ " Add only the current buffer and file ++ " ++ " If the file doesn't support tag listing, skip it ++ if !s:Tlist_Skip_File(curbuf_name, curbuf_ftype) ++ call s:Tlist_Window_Refresh_File(curbuf_name, curbuf_ftype) ++ endif ++ endif ++ ++ if g:Tlist_File_Fold_Auto_Close ++ " Open the fold for the current file, as all the folds in ++ " the taglist window are closed ++ let fidx = s:Tlist_Get_File_Index(curbuf_name) ++ if fidx != -1 ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ endif ++ endif ++ ++ " Highlight the current tag ++ call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) ++endfunction ++ ++" Tlist_Window_Toggle() ++" Open or close a taglist window ++function! s:Tlist_Window_Toggle() ++ call s:Tlist_Log_Msg('Tlist_Window_Toggle()') ++ " If taglist window is open then close it. ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ call s:Tlist_Window_Close() ++ return ++ endif ++ ++ call s:Tlist_Window_Open() ++ ++ " 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 ++ call s:Tlist_Menu_Update_File(0) ++ endif ++endfunction ++ ++" 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 ++ ++ " 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 ++ ++ " 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) ++ ++ let all_files = strpart(all_files, nl_idx + 1) ++ if one_file == '' ++ continue ++ endif ++ ++ " Skip non-directory names ++ if !isdirectory(one_file) ++ continue ++ endif ++ ++ 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 ++" Add files recursively from a directory ++function! s:Tlist_Add_Files_Recursive(dir, ...) ++ let dir_name = fnamemodify(a:dir, ':p') ++ if !isdirectory(dir_name) ++ call s:Tlist_Warning_Msg('Error: ' . dir_name . ' is not a directory') ++ return ++ endif ++ ++ if a:0 == 1 ++ " User specified file pattern ++ let pat = a:1 ++ else ++ " Default file pattern ++ let pat = '*' ++ endif ++ ++ echon "\r " ++ echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t') ++ let fcnt = s:Tlist_Process_Dir(dir_name, pat) ++ ++ echon "\rAdded " . fcnt . " files to the taglist" ++endfunction ++ ++" Tlist_Add_Files ++" Add the specified list of files to the taglist ++function! s:Tlist_Add_Files(...) ++ let flist = '' ++ let i = 1 ++ ++ " Get all the files matching the file patterns supplied as argument ++ while i <= a:0 ++ let flist = flist . glob(a:{i}) . "\n" ++ let i = i + 1 ++ endwhile ++ ++ if flist == '' ++ call s:Tlist_Warning_Msg('Error: No matching files are found') ++ return ++ endif ++ ++ let fcnt = s:Tlist_Process_Filelist(flist) ++ echon "\rAdded " . fcnt . " files to the taglist" ++endfunction ++ ++" Tlist_Extract_Tagtype ++" Extract the tag type from the tag text ++function! s:Tlist_Extract_Tagtype(tag_line) ++ " The tag type is after the tag prototype field. The prototype field ++ " ends with the /;"\t string. We add 4 at the end to skip the characters ++ " in this special string.. ++ let start = strridx(a:tag_line, '/;"' . "\t") + 4 ++ let end = strridx(a:tag_line, 'line:') - 1 ++ let ttype = strpart(a:tag_line, start, end - start) ++ ++ return ttype ++endfunction ++ ++" Tlist_Extract_Tag_Scope ++" Extract the tag scope from the tag text ++function! s:Tlist_Extract_Tag_Scope(tag_line) ++ let start = strridx(a:tag_line, 'line:') ++ let end = strridx(a:tag_line, "\t") ++ if end <= start ++ return '' ++ endif ++ ++ let tag_scope = strpart(a:tag_line, end + 1) ++ let tag_scope = strpart(tag_scope, stridx(tag_scope, ':') + 1) ++ ++ return tag_scope ++endfunction ++ ++" Tlist_Refresh() ++" Refresh the taglist ++function! s:Tlist_Refresh() ++ call s:Tlist_Log_Msg('Tlist_Refresh (Skip_Refresh = ' . ++ \ s:Tlist_Skip_Refresh . ', ' . bufname('%') . ')') ++ " If we are entering the buffer from one of the taglist functions, then ++ " no need to refresh the taglist window again. ++ if s:Tlist_Skip_Refresh ++ " We still need to update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(0) ++ endif ++ return ++ endif ++ ++ " If part of the winmanager plugin and not configured to process ++ " tags always and not configured to display the tags menu, then return ++ if (s:tlist_app_name == 'winmanager') && !g:Tlist_Process_File_Always ++ \ && !g:Tlist_Show_Menu ++ return ++ endif ++ ++ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help ++ if &buftype != '' ++ return ++ endif ++ ++ let filename = fnamemodify(bufname('%'), ':p') ++ let ftype = &filetype ++ ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(filename, ftype) ++ return ++ endif ++ ++ let tlist_win = bufwinnr(g:TagList_title) ++ ++ " If the taglist window is not opened and not configured to process ++ " tags always and not displaying the tags menu, then return ++ if tlist_win == -1 && !g:Tlist_Process_File_Always && !g:Tlist_Show_Menu ++ return ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(filename) ++ return ++ endif ++ ++ " If the taglist should not be auto updated, then return ++ if !g:Tlist_Auto_Update ++ return ++ endif ++ endif ++ ++ let cur_lnum = line('.') ++ ++ if fidx == -1 ++ " Update the tags for the file ++ let fidx = s:Tlist_Process_File(filename, ftype) ++ else ++ let mtime = getftime(filename) ++ if s:tlist_{fidx}_mtime != mtime ++ " Invalidate the tags listed for this file ++ let s:tlist_{fidx}_valid = 0 ++ ++ " Update the taglist and the window ++ call Tlist_Update_File(filename, ftype) ++ ++ " Store the new file modification time ++ let s:tlist_{fidx}_mtime = mtime ++ endif ++ endif ++ ++ " Update the taglist window ++ if tlist_win != -1 ++ " Disable screen updates ++ let old_lazyredraw = &lazyredraw ++ set nolazyredraw ++ ++ " Save the current window number ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter ++ " Save the cursor position ++ let save_line = line('.') ++ let save_col = col('.') ++ endif ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(filename, ftype) ++ ++ " Open the fold for the file ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ ++ if g:Tlist_Highlight_Tag_On_BufEnter && g:Tlist_Auto_Highlight_Tag ++ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != fidx ++ " If displaying tags for only one file in the taglist ++ " window and about to display the tags for a new file, ++ " then center the current tag line for the new file ++ let center_tag_line = 1 ++ else ++ let center_tag_line = 0 ++ endif ++ ++ " Highlight the current tag ++ call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) ++ else ++ " Restore the cursor position ++ if v:version >= 601 ++ call cursor(save_line, save_col) ++ else ++ exe save_line ++ exe 'normal! ' . save_col . '|' ++ endif ++ endif ++ ++ " Jump back to the original window ++ if save_winnr != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') ++ endif ++ ++ " Restore screen updates ++ let &lazyredraw = old_lazyredraw ++ endif ++ ++ " Update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(0) ++ endif ++endfunction ++ ++" Tlist_Change_Sort() ++" Change the sort order of the tag listing ++" caller == 'cmd', command used in the taglist window ++" caller == 'menu', taglist menu ++" action == 'toggle', toggle sort from name to order and vice versa ++" action == 'set', set the sort order to sort_type ++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 == 'cmd' ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ " Remove the previous highlighting ++ match none ++ elseif a:caller == 'menu' ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx == -1 ++ return ++ endif ++ endif ++ ++ if a:action == 'toggle' ++ let sort_type = s:tlist_{fidx}_sort_type ++ ++ " Toggle the sort order from 'name' to 'order' and vice versa ++ if sort_type == 'name' ++ let s:tlist_{fidx}_sort_type = 'order' ++ else ++ let s:tlist_{fidx}_sort_type = 'name' ++ endif ++ else ++ let s:tlist_{fidx}_sort_type = a:sort_type ++ endif ++ ++ " Invalidate the tags listed for this file ++ let s:tlist_{fidx}_valid = 0 ++ ++ if a:caller == 'cmd' ++ " Save the current line for later restoration ++ let curline = '\V\^' . getline('.') . '\$' ++ ++ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, ++ \ s:tlist_{fidx}_filetype) ++ ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Go back to the cursor line before the tag list is sorted ++ call search(curline, 'w') ++ ++ call s:Tlist_Menu_Update_File(1) ++ else ++ call s:Tlist_Menu_Remove_File() ++ ++ call s:Tlist_Refresh() ++ endif ++endfunction ++ ++" Tlist_Update_Current_File() ++" Update taglist for the current buffer by regenerating the tag list ++" Contributed by WEN Guopeng. ++function! s:Tlist_Update_Current_File() ++ call s:Tlist_Log_Msg('Tlist_Update_Current_File()') ++ if winnr() == bufwinnr(g:TagList_title) ++ " In the taglist window. Update the current file ++ call s:Tlist_Window_Update_File() ++ else ++ " Not in the taglist window. Update the current buffer ++ let filename = fnamemodify(bufname('%'), ':p') ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx != -1 ++ let s:tlist_{fidx}_valid = 0 ++ endif ++ call Tlist_Update_File(filename, &filetype) ++ endif ++endfunction ++ ++" Tlist_Window_Update_File() ++" 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_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ " Remove the previous highlighting ++ match none ++ ++ " Save the current line for later restoration ++ let curline = '\V\^' . getline('.') . '\$' ++ ++ let s:tlist_{fidx}_valid = 0 ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, ++ \ s:tlist_{fidx}_filetype) ++ ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Go back to the tag line before the list is updated ++ call search(curline, 'w') ++endfunction ++ ++" Tlist_Window_Get_Tag_Type_By_Linenum() ++" Return the tag type index for the specified line in the taglist window ++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 ++ " tag type start line number and the number of tags in a tag type ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ let start_lnum = ++ \ s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset ++ let end = start_lnum + s:tlist_{a:fidx}_{ttype}_count ++ if a:lnum >= start_lnum && a:lnum <= end ++ break ++ endif ++ let i = i + 1 ++ endwhile ++ ++ " Current line doesn't belong to any of the displayed tag types ++ if i > s:tlist_{ftype}_count ++ return '' ++ endif ++ ++ return ttype ++endfunction ++ ++" 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 == '' ++ return 0 ++ endif ++ ++ " Compute the index into the displayed tags for the tag type ++ let ttype_lnum = s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset ++ let tidx = a:lnum - ttype_lnum ++ if tidx == 0 ++ return 0 ++ endif ++ ++ " Get the corresponding tag line and return it ++ return s:tlist_{a:fidx}_{ttype}_{tidx} ++endfunction ++ ++" Tlist_Window_Highlight_Line ++" Highlight the current line ++function! s:Tlist_Window_Highlight_Line() ++ " Clear previously selected name ++ match none ++ ++ " Highlight the current line ++ if g:Tlist_Display_Prototype == 0 ++ let pat = '/\%' . line('.') . 'l\s\+\zs.*/' ++ else ++ let pat = '/\%' . line('.') . 'l.*/' ++ endif ++ ++ exe 'match TagListTagName ' . pat ++endfunction ++ ++" 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_Window_Open_File(win_ctrl, filename, tagpat) ++ 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 == '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 ++ 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 ++ let first_usable_win = 0 ++ ++ let i = 1 ++ let bnum = winbufnr(i) ++ while bnum != -1 ++ if getwinvar(i, 'tlist_file_window') == 'yes' ++ let fwin_num = i ++ break ++ endif ++ if first_usable_win == 0 && ++ \ getbufvar(bnum, '&buftype') == '' && ++ \ !getwinvar(i, '&previewwindow') ++ " First non-taglist, non-plugin and non-preview window ++ let first_usable_win = i ++ endif ++ let i = i + 1 ++ let bnum = winbufnr(i) ++ endwhile ++ ++ " If a previously used window is not found, then use the first ++ " non-taglist window ++ if fwin_num == 0 ++ let fwin_num = first_usable_win ++ endif ++ ++ if fwin_num != 0 ++ " Jump to the file window ++ exe fwin_num . "wincmd w" ++ ++ " If the user asked to jump to the tag in a new window, then split ++ " the existing window into two. ++ if a:win_ctrl == 'newwin' ++ split ++ endif ++ exe "edit " . escape(a:filename, ' ') ++ else ++ " Open a new window ++ if g:Tlist_Use_Horiz_Window ++ exe 'leftabove split ' . escape(a:filename, ' ') ++ else ++ if winbufnr(2) == -1 ++ " Only the taglist window is present ++ if g:Tlist_Use_Right_Window ++ exe 'leftabove vertical split ' . ++ \ escape(a:filename, ' ') ++ else ++ exe 'rightbelow vertical split ' . ++ \ escape(a:filename, ' ') ++ endif ++ ++ " Go to the taglist window to change the window size to ++ " the user configured value ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ if g:Tlist_Use_Horiz_Window ++ exe 'resize ' . g:Tlist_WinHeight ++ else ++ exe 'vertical resize ' . g:Tlist_WinWidth ++ endif ++ " Go back to the file window ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ else ++ " A plugin or help window is also present ++ wincmd w ++ exe 'leftabove split ' . escape(a:filename, ' ') ++ endif ++ endif ++ endif ++ " Mark the window, so that it can be reused. ++ call s:Tlist_Window_Mark_File_Window() ++ else ++ if v:version >= 700 ++ " If the file is opened in more than one window, then check ++ " whether the last accessed window has the selected file. ++ " If it does, then use that window. ++ let lastwin_bufnum = winbufnr(winnr('#')) ++ if bufnr(a:filename) == lastwin_bufnum ++ let winnum = winnr('#') ++ endif ++ endif ++ exe winnum . 'wincmd w' ++ ++ " If the user asked to jump to the tag in a new window, then split the ++ " existing window into two. ++ if a:win_ctrl == 'newwin' ++ split ++ endif ++ endif ++ endif ++ ++ " Jump to the tag ++ if a:tagpat != '' ++ " Add the current cursor position to the jump list, so that user can ++ " jump back using the ' and ` marks. ++ mark ' ++ silent call search(a:tagpat, 'w') ++ ++ " Bring the line to the middle of the window ++ normal! z. ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ endif ++ ++ " If the user selects to preview the tag then jump back to the ++ " taglist window ++ if a:win_ctrl == 'preview' ++ " Go back to the taglist window ++ let winnum = bufwinnr(g:TagList_title) ++ exe winnum . 'wincmd w' ++ else ++ " 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_Window_Goto_Window() ++ close ++ ++ " Go back to the window displaying the selected file ++ let wnum = bufwinnr(a:filename) ++ if wnum != -1 && wnum != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds(wnum . 'wincmd w') ++ endif ++ endif ++ endif ++ ++ let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh ++endfunction ++ ++" Tlist_Window_Jump_To_Tag() ++" Jump to the location of the current 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(' . a:win_ctrl . ')') ++ " Do not process comment lines and empty lines ++ let curline = getline('.') ++ if curline =~ '^\s*$' || curline[0] == '"' ++ return ++ endif ++ ++ " If inside a closed fold, then use the first line of the fold ++ " and jump to the file. ++ let lnum = foldclosed('.') ++ if lnum == -1 ++ " Jump to the selected tag or file ++ let lnum = line('.') ++ else ++ " Open the closed fold ++ .foldopen! ++ endif ++ ++ 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_Window_Get_Tag_Index(fidx, lnum) ++ if tidx != 0 ++ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx) ++ ++ " Highlight the tagline ++ call s:Tlist_Window_Highlight_Line() ++ else ++ " Selected a line which is not a tag name. Just edit the file ++ let tagpat = '' ++ endif ++ ++ call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) ++endfunction ++ ++" Tlist_Window_Show_Info() ++" Display information about the entry under the cursor ++function! s:Tlist_Window_Show_Info() ++ call s:Tlist_Log_Msg('Tlist_Window_Show_Info()') ++ ++ " Clear the previously displayed line ++ echo ++ ++ " Do not process comment lines and empty lines ++ let curline = getline('.') ++ if curline =~ '^\s*$' || curline[0] == '"' ++ return ++ endif ++ ++ " If inside a fold, then don't display the prototype ++ if foldclosed('.') != -1 ++ return ++ endif ++ ++ let lnum = line('.') ++ ++ " Get the file index ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) ++ if fidx == -1 ++ return ++ endif ++ ++ if lnum == s:tlist_{fidx}_start ++ " Cursor is on a file name ++ let fname = s:tlist_{fidx}_filename ++ if strlen(fname) > 50 ++ let fname = fnamemodify(fname, ':t') ++ endif ++ echo fname . ', Filetype=' . s:tlist_{fidx}_filetype . ++ \ ', Tag count=' . s:tlist_{fidx}_tag_count ++ return ++ endif ++ ++ " Get the tag output line for the current tag ++ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) ++ if tidx == 0 ++ " Cursor is on a tag type ++ let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) ++ if ttype == '' ++ return ++ endif ++ ++ let ttype_name = '' ++ ++ let ftype = s:tlist_{fidx}_filetype ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ if ttype == s:tlist_{ftype}_{i}_name ++ let ttype_name = s:tlist_{ftype}_{i}_fullname ++ break ++ endif ++ let i = i + 1 ++ endwhile ++ ++ echo 'Tag type=' . ttype_name . ++ \ ', Tag count=' . s:tlist_{fidx}_{ttype}_count ++ return ++ endif ++ ++ " Get the tag search pattern and display it ++ echo s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Find_Nearest_Tag_Idx ++" Find the tag idx nearest to the supplied line number ++" Returns -1, if a tag couldn't be found for the specified line number ++function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum) ++ let sort_type = s:tlist_{a:fidx}_sort_type ++ ++ let left = 1 ++ let right = s:tlist_{a:fidx}_tag_count ++ ++ if sort_type == 'order' ++ " Tags sorted by order, use a binary search. ++ " The idea behind this function is taken from the ctags.vim script (by ++ " Alexey Marinichev) available at the Vim online website. ++ ++ " If the current line is the less than the first tag, then no need to ++ " search ++ let first_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, 1) ++ ++ if a:linenum < first_lnum ++ return -1 ++ endif ++ ++ while left < right ++ let middle = (right + left + 1) / 2 ++ let middle_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, middle) ++ ++ if middle_lnum == a:linenum ++ let left = middle ++ break ++ endif ++ ++ if middle_lnum > a:linenum ++ let right = middle - 1 ++ else ++ let left = middle ++ endif ++ endwhile ++ else ++ " Tags sorted by name, use a linear search. (contributed by Dave ++ " Eggum). ++ " Look for a tag with a line number less than or equal to the supplied ++ " line number. If multiple tags are found, then use the tag with the ++ " line number closest to the supplied line number. IOW, use the tag ++ " with the highest line number. ++ let closest_lnum = 0 ++ let final_left = 0 ++ while left <= right ++ let lnum = s:Tlist_Get_Tag_Linenum(a:fidx, left) ++ ++ if lnum < a:linenum && lnum > closest_lnum ++ let closest_lnum = lnum ++ let final_left = left ++ elseif lnum == a:linenum ++ let closest_lnum = lnum ++ let final_left = left ++ break ++ else ++ let left = left + 1 ++ endif ++ endwhile ++ if closest_lnum == 0 ++ return -1 ++ endif ++ if left >= right ++ let left = final_left ++ endif ++ endif ++ ++ return left ++endfunction ++ ++" 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_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. ++ if !g:Tlist_Auto_Highlight_Tag && a:cntx == 1 ++ return ++ endif ++ ++ if a:filename == '' ++ return ++ endif ++ ++ " 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 ++ ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ return ++ endif ++ ++ " If the file is currently not displayed in the taglist window, then retrn ++ if !s:tlist_{fidx}_visible ++ return ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return ++ endif ++ ++ " Ignore all autocommands ++ let old_ei = &eventignore ++ set eventignore=all ++ ++ " Save the original window number ++ let org_winnr = winnr() ++ ++ if org_winnr == winnum ++ let in_taglist_window = 1 ++ else ++ let in_taglist_window = 0 ++ endif ++ ++ " Go to the taglist window ++ if !in_taglist_window ++ exe winnum . 'wincmd w' ++ endif ++ ++ " Clear previously selected name ++ match none ++ ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, a:cur_lnum) ++ if tidx == -1 ++ " Make sure the current tag line is visible in the taglist window. ++ " Calling the winline() function makes the line visible. Don't know ++ " of a better way to achieve this. ++ let lnum = line('.') ++ ++ if lnum < s:tlist_{fidx}_start || lnum > s:tlist_{fidx}_end ++ " Move the cursor to the beginning of the file ++ exe s:tlist_{fidx}_start ++ endif ++ ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ ++ call winline() ++ ++ if !in_taglist_window ++ exe org_winnr . 'wincmd w' ++ endif ++ ++ " Restore the autocommands ++ let &eventignore = old_ei ++ return ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) ++ ++ " Compute the line number ++ " Start of file + Start of tag type + offset ++ let lnum = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + ++ \ s:tlist_{fidx}_{tidx}_ttype_idx ++ ++ " Goto the line containing the tag ++ exe lnum ++ ++ " Open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ ++ if a:center ++ " Move the tag line to the center of the taglist window ++ normal! z. ++ else ++ " Make sure the current tag line is visible in the taglist window. ++ " Calling the winline() function makes the line visible. Don't know ++ " of a better way to achieve this. ++ call winline() ++ endif ++ ++ " Highlight the tag name ++ call s:Tlist_Window_Highlight_Line() ++ ++ " Go back to the original window ++ if !in_taglist_window ++ exe org_winnr . 'wincmd w' ++ endif ++ ++ " Restore the autocommands ++ let &eventignore = old_ei ++ return ++endfunction ++ ++" Tlist_Get_Tag_Prototype_By_Line ++" Get the prototype for the tag on or before the specified line number in the ++" current buffer ++function! Tlist_Get_Tag_Prototype_By_Line(...) ++ if a:0 == 0 ++ " Arguments are not supplied. Use the current buffer name ++ " and line number ++ let filename = bufname('%') ++ let linenr = line('.') ++ elseif a:0 == 2 ++ " Filename and line number are specified ++ let filename = a:1 ++ let linenr = a:2 ++ if linenr !~ '\d\+' ++ " Invalid line number ++ return "" ++ endif ++ else ++ " Sufficient arguments are not supplied ++ let msg = 'Usage: Tlist_Get_Tag_Prototype_By_Line ' . ++ \ '' ++ call s:Tlist_Warning_Msg(msg) ++ return "" ++ endif ++ ++ " Expand the file to a fully qualified name ++ let filename = fnamemodify(filename, ':p') ++ if filename == '' ++ return "" ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ return "" ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return "" ++ endif ++ ++ " Get the tag text using the line number ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) ++ if tidx == -1 ++ return "" ++ endif ++ ++ return s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Get_Tagname_By_Line ++" Get the tag name on or before the specified line number in the ++" current buffer ++function! Tlist_Get_Tagname_By_Line(...) ++ if a:0 == 0 ++ " Arguments are not supplied. Use the current buffer name ++ " and line number ++ let filename = bufname('%') ++ let linenr = line('.') ++ elseif a:0 == 2 ++ " Filename and line number are specified ++ let filename = a:1 ++ let linenr = a:2 ++ if linenr !~ '\d\+' ++ " Invalid line number ++ return "" ++ endif ++ else ++ " Sufficient arguments are not supplied ++ let msg = 'Usage: Tlist_Get_Tagname_By_Line ' ++ call s:Tlist_Warning_Msg(msg) ++ return "" ++ endif ++ ++ " Make sure the current file has a name ++ let filename = fnamemodify(filename, ':p') ++ if filename == '' ++ return "" ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ return "" ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return "" ++ endif ++ ++ " Get the tag name using the line number ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) ++ if tidx == -1 ++ return "" ++ endif ++ ++ return s:tlist_{fidx}_{tidx}_tag_name ++endfunction ++ ++" 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_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 ++ if a:dir == -1 ++ normal! zk ++ else ++ " While moving down to the start of the next fold, ++ " no need to do go to the start of the next file. ++ normal! zj ++ return ++ endif ++ endif ++ ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ let cur_lnum = line('.') ++ ++ if a:dir == -1 ++ if cur_lnum > s:tlist_{fidx}_start ++ " Move to the beginning of the current file ++ exe s:tlist_{fidx}_start ++ return ++ endif ++ ++ 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 ++ ++ 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 ++ " Cursor is at the last file, wrap around to the first file ++ let fidx = 0 ++ endif ++ ++ if s:tlist_{fidx}_start != 0 ++ exe s:tlist_{fidx}_start ++ endif ++ return ++ endif ++endfunction ++ ++" Tlist_Session_Load ++" Load a taglist session (information about all the displayed files ++" and the tags) from the specified file ++function! s:Tlist_Session_Load(...) ++ if a:0 == 0 || a:1 == '' ++ call s:Tlist_Warning_Msg('Usage: TlistSessionLoad ') ++ return ++ endif ++ ++ let sessionfile = a:1 ++ ++ if !filereadable(sessionfile) ++ let msg = 'Taglist: Error - Unable to open file ' . sessionfile ++ call s:Tlist_Warning_Msg(msg) ++ return ++ endif ++ ++ " Mark the current window as the file window ++ call s:Tlist_Window_Mark_File_Window() ++ ++ " Source the session file ++ exe 'source ' . sessionfile ++ ++ let new_file_count = g:tlist_file_count ++ unlet! g:tlist_file_count ++ ++ let i = 0 ++ while i < new_file_count ++ let ftype = g:tlist_{i}_filetype ++ unlet! g:tlist_{i}_filetype ++ ++ if !exists('s:tlist_' . ftype . '_count') ++ if s:Tlist_FileType_Init(ftype) == 0 ++ let i = i + 1 ++ continue ++ endif ++ endif ++ ++ let fname = g:tlist_{i}_filename ++ unlet! g:tlist_{i}_filename ++ ++ let fidx = s:Tlist_Get_File_Index(fname) ++ if fidx != -1 ++ let s:tlist_{fidx}_visible = 0 ++ let i = i + 1 ++ continue ++ else ++ " As we are loading the tags from the session file, if this ++ " file was previously deleted by the user, now we need to ++ " add it back. So remove the file from the deleted list. ++ call s:Tlist_Update_Remove_List(fname, 0) ++ endif ++ ++ let fidx = s:Tlist_Init_File(fname, ftype) ++ ++ let s:tlist_{fidx}_filename = fname ++ ++ let s:tlist_{fidx}_sort_type = g:tlist_{i}_sort_type ++ unlet! g:tlist_{i}_sort_type ++ ++ let s:tlist_{fidx}_filetype = ftype ++ let s:tlist_{fidx}_mtime = getftime(fname) ++ ++ let s:tlist_{fidx}_start = 0 ++ let s:tlist_{fidx}_end = 0 ++ ++ let s:tlist_{fidx}_valid = 1 ++ ++ let s:tlist_{fidx}_tag_count = g:tlist_{i}_tag_count ++ unlet! g:tlist_{i}_tag_count ++ ++ let j = 1 ++ while j <= s:tlist_{fidx}_tag_count ++ let s:tlist_{fidx}_{j}_tag = g:tlist_{i}_{j}_tag ++ let s:tlist_{fidx}_{j}_tag_name = g:tlist_{i}_{j}_tag_name ++ let s:tlist_{fidx}_{j}_ttype_idx = g:tlist_{i}_{j}_ttype_idx ++ unlet! g:tlist_{i}_{j}_tag ++ unlet! g:tlist_{i}_{j}_tag_name ++ unlet! g:tlist_{i}_{j}_ttype_idx ++ let j = j + 1 ++ endwhile ++ ++ let j = 1 ++ while j <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{j}_name ++ ++ if exists('g:tlist_' . i . '_' . ttype) ++ let s:tlist_{fidx}_{ttype} = g:tlist_{i}_{ttype} ++ unlet! g:tlist_{i}_{ttype} ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = g:tlist_{i}_{ttype}_count ++ unlet! g:tlist_{i}_{ttype}_count ++ ++ let k = 1 ++ while k <= s:tlist_{fidx}_{ttype}_count ++ let s:tlist_{fidx}_{ttype}_{k} = g:tlist_{i}_{ttype}_{k} ++ unlet! g:tlist_{i}_{ttype}_{k} ++ let k = k + 1 ++ endwhile ++ else ++ let s:tlist_{fidx}_{ttype} = '' ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = 0 ++ endif ++ ++ let j = j + 1 ++ endwhile ++ ++ let i = i + 1 ++ endwhile ++ ++ " If the taglist window is open, then update it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ " Refresh the taglist window ++ call s:Tlist_Window_Refresh() ++ ++ " Go back to the original window ++ if save_winnr != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ endif ++ endif ++endfunction ++ ++" Tlist_Session_Save ++" Save a taglist session (information about all the displayed files ++" and the tags) into the specified file ++function! s:Tlist_Session_Save(...) ++ if a:0 == 0 || a:1 == '' ++ call s:Tlist_Warning_Msg('Usage: TlistSessionSave ') ++ return ++ endif ++ ++ let sessionfile = a:1 ++ ++ if s:tlist_file_count == 0 ++ " There is nothing to save ++ call s:Tlist_Warning_Msg('Warning: Taglist is empty. Nothing to save.') ++ return ++ endif ++ ++ if filereadable(sessionfile) ++ let ans = input('Do you want to overwrite ' . sessionfile . ' (Y/N)?') ++ if ans !=? 'y' ++ return ++ endif ++ ++ echo "\n" ++ endif ++ ++ let old_verbose = &verbose ++ set verbose&vim ++ ++ exe 'redir! > ' . sessionfile ++ ++ silent! echo '" Taglist session file. This file is auto-generated.' ++ silent! echo '" File information' ++ silent! echo 'let tlist_file_count = ' . s:tlist_file_count ++ ++ let i = 0 ++ ++ while i < s:tlist_file_count ++ " Store information about the file ++ silent! echo 'let tlist_' . i . "_filename = '" . ++ \ s:tlist_{i}_filename . "'" ++ silent! echo 'let tlist_' . i . '_sort_type = "' . ++ \ s:tlist_{i}_sort_type . '"' ++ silent! echo 'let tlist_' . i . '_filetype = "' . ++ \ s:tlist_{i}_filetype . '"' ++ silent! echo 'let tlist_' . i . '_tag_count = ' . ++ \ s:tlist_{i}_tag_count ++ " Store information about all the tags ++ let j = 1 ++ while j <= s:tlist_{i}_tag_count ++ let txt = escape(s:tlist_{i}_{j}_tag, '"\\') ++ silent! echo 'let tlist_' . i . '_' . j . '_tag = "' . txt . '"' ++ silent! echo 'let tlist_' . i . '_' . j . '_tag_name = "' . ++ \ s:tlist_{i}_{j}_tag_name . '"' ++ silent! echo 'let tlist_' . i . '_' . j . '_ttype_idx' . ' = ' . ++ \ s:tlist_{i}_{j}_ttype_idx ++ let j = j + 1 ++ endwhile ++ ++ " Store information about all the tags grouped by their type ++ let ftype = s:tlist_{i}_filetype ++ let j = 1 ++ while j <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{j}_name ++ if s:tlist_{i}_{ttype}_count != 0 ++ let txt = substitute(s:tlist_{i}_{ttype}, "\n", "\\\\n", 'g') ++ silent! echo 'let tlist_' . i . '_' . ttype . ' = "' . ++ \ txt . '"' ++ silent! echo 'let tlist_' . i . '_' . ttype . '_count = ' . ++ \ s:tlist_{i}_{ttype}_count ++ let k = 1 ++ while k <= s:tlist_{i}_{ttype}_count ++ silent! echo 'let tlist_' . i . '_' . ttype . '_' . k . ++ \ ' = ' . s:tlist_{i}_{ttype}_{k} ++ let k = k + 1 ++ endwhile ++ endif ++ let j = j + 1 ++ endwhile ++ ++ silent! echo ++ ++ let i = i + 1 ++ endwhile ++ ++ redir END ++ ++ let &verbose = old_verbose ++endfunction ++ ++" Tlist_Buffer_Removed ++" 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 . ')') ++ ++ " Make sure a valid filename is supplied ++ if a:filename == '' ++ return ++ endif ++ ++ " Get tag list index of the specified file ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ " File not present in the taglist ++ return ++ endif ++ ++ " Remove the file from the list ++ call s:Tlist_Remove_File(fidx, 0) ++endfunction ++ ++" When a buffer is deleted, remove the file from the taglist ++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(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) ++ if winnum == -1 ++ call s:Tlist_Warning_Msg('Taglist: Error - Taglist window is not open') ++ return ++ endif ++ ++ " Save the original window number ++ let org_winnr = winnr() ++ if org_winnr == winnum ++ let in_taglist_window = 1 ++ else ++ let in_taglist_window = 0 ++ endif ++ ++ if in_taglist_window ++ " When entering the taglist window, no need to update the folds ++ return ++ endif ++ ++ " Go to the taglist window ++ if !in_taglist_window ++ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') ++ endif ++ ++ " Close all the folds ++ silent! %foldclose ++ ++ " Get tag list index of the specified file ++ 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 ++ if !in_taglist_window ++ call s:Tlist_Exe_Cmd_No_Acmds(org_winnr . 'wincmd w') ++ endif ++endfunction ++ ++" 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_Window_Check_Auto_Open() ++ let open_window = 0 ++ ++ let i = 1 ++ let buf_num = winbufnr(i) ++ while buf_num != -1 ++ let filename = fnamemodify(bufname(buf_num), ':p') ++ if !s:Tlist_Skip_File(filename, getbufvar(buf_num, '&filetype')) ++ let open_window = 1 ++ break ++ endif ++ let i = i + 1 ++ let buf_num = winbufnr(i) ++ endwhile ++ ++ if open_window ++ call s:Tlist_Window_Toggle() ++ endif ++endfunction ++ ++function! s:Tlist_Menu_Add_Base_Menu() ++ call s:Tlist_Log_Msg('Adding the base menu') ++ ++ " Add the menu ++ anoremenu T&ags.Refresh\ menu :call Tlist_Menu_Refresh() ++ anoremenu T&ags.Sort\ menu\ by.Name ++ \ :call Tlist_Change_Sort('menu', 'set', 'name') ++ anoremenu T&ags.Sort\ menu\ by.Order ++ \ :call Tlist_Change_Sort('menu', 'set', 'order') ++ anoremenu T&ags.-SEP1- : ++ ++ if &mousemodel =~ 'popup' ++ anoremenu PopUp.T&ags.Refresh\ menu ++ \ :call Tlist_Menu_Refresh() ++ anoremenu PopUp.T&ags.Sort\ menu\ by.Name ++ \ :call Tlist_Change_Sort('menu', 'set', 'name') ++ anoremenu PopUp.T&ags.Sort\ menu\ by.Order ++ \ :call Tlist_Change_Sort('menu', 'set', 'order') ++ anoremenu PopUp.T&ags.-SEP1- : ++ endif ++endfunction ++ ++let s:menu_char_prefix = ++ \ '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ++ ++" Tlist_Menu_Get_Tag_Type_Cmd ++" Get the menu command for the specified tag type ++" 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 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 ++ ++ " Number of tag entries for this tag type ++ let tcnt = s:tlist_{fidx_ttype}_count ++ if tcnt == 0 " No entries for this tag type ++ return '' ++ endif ++ ++ let mcmd = '' ++ ++ " Create the menu items for the tags. ++ " Depending on the number of tags of this type, split the menu into ++ " multiple sub-menus, if needed. ++ if tcnt > g:Tlist_Max_Submenu_Items ++ let j = 1 ++ while j <= tcnt ++ let final_index = j + g:Tlist_Max_Submenu_Items - 1 ++ if final_index > tcnt ++ let final_index = tcnt ++ endif ++ ++ " Extract the first and last tag name and form the ++ " sub-menu name ++ let tidx = s:tlist_{fidx_ttype}_{j} ++ let first_tag = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let tidx = s:tlist_{fidx_ttype}_{final_index} ++ let last_tag = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ " Truncate the names, if they are greater than the ++ " max length ++ let first_tag = strpart(first_tag, 0, g:Tlist_Max_Tag_Length) ++ let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length) ++ ++ " Form the menu command prefix ++ 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 ++ ++ while j <= final_index ++ let tidx = s:tlist_{fidx_ttype}_{j} ++ ++ let tname = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let mcmd = mcmd . m_prefix . '\&' . ++ \ s:menu_char_prefix[m_prefix_idx] . '\.' . ++ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . ++ \ tidx . ')|' ++ ++ let m_prefix_idx = m_prefix_idx + 1 ++ let j = j + 1 ++ endwhile ++ endwhile ++ else ++ " Character prefix used to number the menu items (hotkey) ++ let m_prefix_idx = 0 ++ ++ 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} ++ ++ let tname = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let mcmd = mcmd . m_prefix . '\&' . ++ \ s:menu_char_prefix[m_prefix_idx] . '\.' . ++ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . tidx ++ \ . ')|' ++ ++ let m_prefix_idx = m_prefix_idx + 1 ++ let j = j + 1 ++ endwhile ++ endif ++ ++ return mcmd ++endfunction ++ ++" Update the taglist menu with the tags for the specified file ++function! s:Tlist_Menu_File_Refresh(fidx) ++ call s:Tlist_Log_Msg('Refreshing the tag menu for ' . s:tlist_{a:fidx}_filename) ++ " The 'B' flag is needed in the 'cpoptions' option ++ let old_cpoptions = &cpoptions ++ set cpoptions&vim ++ ++ exe s:tlist_{a:fidx}_menu_cmd ++ ++ " Update the popup menu (if enabled) ++ if &mousemodel =~ 'popup' ++ let cmd = substitute(s:tlist_{a:fidx}_menu_cmd, ' T\\&ags\.', ++ \ ' PopUp.T\\\&ags.', "g") ++ exe cmd ++ endif ++ ++ " The taglist menu is not empty now ++ let s:tlist_menu_empty = 0 ++ ++ " Restore the 'cpoptions' settings ++ let &cpoptions = old_cpoptions ++endfunction ++ ++" Tlist_Menu_Update_File ++" Add the taglist menu ++function! s:Tlist_Menu_Update_File(clear_menu) ++ if !has('gui_running') ++ " Not running in GUI mode ++ return ++ endif ++ ++ call s:Tlist_Log_Msg('Updating the tag menu, clear_menu = ' . a:clear_menu) ++ ++ " Remove the tags menu ++ if a:clear_menu ++ call s:Tlist_Menu_Remove_File() ++ ++ endif ++ ++ let fname = escape(fnamemodify(bufname('%'), ':t'), '.') ++ if fname != '' ++ exe 'anoremenu T&ags.' . fname . ' ' ++ anoremenu T&ags.-SEP2- : ++ endif ++ ++ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help ++ if &buftype != '' ++ return ++ endif ++ ++ let filename = fnamemodify(bufname('%'), ':p') ++ let ftype = &filetype ++ ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(filename, ftype) ++ return ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 || !s:tlist_{fidx}_valid ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(filename) ++ return ++ endif ++ ++ " Process the tags for the file ++ let fidx = s:Tlist_Process_File(filename, ftype) ++ if fidx == -1 ++ return ++ endif ++ endif ++ ++ if !s:tlist_{fidx}_tag_count ++ return ++ endif ++ ++ if s:tlist_{fidx}_menu_cmd != '' ++ " Update the menu with the cached command ++ call s:Tlist_Menu_File_Refresh(fidx) ++ ++ return ++ endif ++ ++ " We are going to add entries to the tags menu, so the menu won't be ++ " empty ++ let s:tlist_menu_empty = 0 ++ ++ 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, add_ttype_name, i) ++ if mcmd != '' ++ let cmd = cmd . mcmd ++ endif ++ ++ let i = i + 1 ++ endwhile ++ ++ " Cache the menu command for reuse ++ let s:tlist_{fidx}_menu_cmd = cmd ++ ++ " Update the menu ++ call s:Tlist_Menu_File_Refresh(fidx) ++endfunction ++ ++" Tlist_Menu_Remove_File ++" Remove the tags displayed in the tags menu ++function! s:Tlist_Menu_Remove_File() ++ if !has('gui_running') || s:tlist_menu_empty ++ return ++ endif ++ ++ call s:Tlist_Log_Msg('Removing the tags menu for a file') ++ ++ " Cleanup the Tags menu ++ silent! unmenu T&ags ++ if &mousemodel =~ 'popup' ++ silent! unmenu PopUp.T&ags ++ endif ++ ++ " Add a dummy menu item to retain teared off menu ++ noremenu T&ags.Dummy l ++ ++ silent! unmenu! T&ags ++ if &mousemodel =~ 'popup' ++ silent! unmenu! PopUp.T&ags ++ endif ++ ++ call s:Tlist_Menu_Add_Base_Menu() ++ ++ " Remove the dummy menu item ++ unmenu T&ags.Dummy ++ ++ let s:tlist_menu_empty = 1 ++endfunction ++ ++" Tlist_Menu_Refresh ++" Refresh the taglist menu ++function! s:Tlist_Menu_Refresh() ++ call s:Tlist_Log_Msg('Refreshing the tags menu') ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx != -1 ++ " Invalidate the cached menu command ++ let s:tlist_{fidx}_menu_cmd = '' ++ endif ++ ++ " Update the taglist, menu and window ++ call s:Tlist_Update_Current_File() ++endfunction ++ ++" Tlist_Menu_Jump_To_Tag ++" Jump to the selected tag ++function! s:Tlist_Menu_Jump_To_Tag(tidx) ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx == -1 ++ return ++ endif ++ ++ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, a:tidx) ++ if tagpat == '' ++ return ++ endif ++ ++ " Add the current cursor position to the jump list, so that user can ++ " jump back using the ' and ` marks. ++ mark ' ++ ++ silent call search(tagpat, 'w') ++ ++ " Bring the line to the middle of the window ++ normal! z. ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++endfunction ++ ++" Tlist_Menu_Init ++" Initialize the taglist menu ++function! s:Tlist_Menu_Init() ++ call s:Tlist_Menu_Add_Base_Menu() ++ ++ " Automatically add the tags defined in the current file to the menu ++ augroup TagListMenuCmds ++ autocmd! ++ ++ if !g:Tlist_Process_File_Always ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ autocmd BufLeave * call s:Tlist_Menu_Remove_File() ++ augroup end ++ ++ call s:Tlist_Menu_Update_File(0) ++endfunction ++ ++" Tlist_Vim_Session_Load ++" Initialize the taglist window/buffer, which is created when loading ++" a Vim session file. ++function! s:Tlist_Vim_Session_Load() ++ call s:Tlist_Log_Msg('Tlist_Vim_Session_Load') ++ ++ " Initialize the taglist window ++ call s:Tlist_Window_Init() ++ ++ " Refresh the taglist window ++ call s:Tlist_Window_Refresh() ++endfunction ++ ++" Tlist_Set_App ++" Set the name of the external plugin/application to which taglist ++" belongs. ++" Taglist plugin is part of another plugin like cream or winmanager. ++function! Tlist_Set_App(name) ++ if a:name == "" ++ return ++ endif ++ ++ let s:tlist_app_name = a:name ++endfunction ++ ++" Winmanager integration ++ ++" Initialization required for integration with winmanager ++function! TagList_Start() ++ " If current buffer is not taglist buffer, then don't proceed ++ if bufname('%') != '__Tag_List__' ++ return ++ endif ++ ++ call Tlist_Set_App('winmanager') ++ ++ " Get the current filename from the winmanager plugin ++ let bufnum = WinManagerGetLastEditedFile() ++ if bufnum != -1 ++ let filename = fnamemodify(bufname(bufnum), ':p') ++ let ftype = getbufvar(bufnum, '&filetype') ++ endif ++ ++ " Initialize the taglist window, if it is not already initialized ++ if !exists('s:tlist_window_initialized') || !s:tlist_window_initialized ++ call s:Tlist_Window_Init() ++ call s:Tlist_Window_Refresh() ++ let s:tlist_window_initialized = 1 ++ endif ++ ++ " Update the taglist window ++ if bufnum != -1 ++ if !s:Tlist_Skip_File(filename, ftype) && g:Tlist_Auto_Update ++ call s:Tlist_Window_Refresh_File(filename, ftype) ++ endif ++ endif ++endfunction ++ ++function! TagList_IsValid() ++ return 0 ++endfunction ++ ++function! TagList_WrapUp() ++ return 0 ++endfunction ++ ++" restore 'cpo' ++let &cpo = s:cpo_save ++unlet s:cpo_save ++ +diff -urN vim71/runtime/syntax/ada.vim vim71_ada/runtime/syntax/ada.vim +--- vim71/runtime/syntax/ada.vim 2007-05-05 20:22:26.000000000 +0200 ++++ vim71_ada/runtime/syntax/ada.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -1,17 +1,17 @@ + "---------------------------------------------------------------------------- + " Description: Vim Ada syntax file + " Language: Ada (2005) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik + " Maintainer: Martin Krischik + " David A. Wheeler + " Simon Bradley + " Contributors: Preben Randhol. +-" $Author: karsten $ +-" $Date: 2008/01/16 15:58:14 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ ++" $Author: karsten $ ++" $Date: 2008/01/16 15:58:14 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ + " http://www.dwheeler.com/vim + " History: 24.05.2006 MK Unified Headers + " 26.05.2006 MK ' should not be in iskeyword. +@@ -98,7 +98,8 @@ + " + if exists("g:ada_rainbow_color") + syntax match adaSpecial "[:;.,]" +- runtime plugin/Rainbow_Parenthsis.vim ++ call rainbow_parenthsis#LoadRound () ++ call rainbow_parenthsis#Activate () + else + syntax match adaSpecial "[:;().,]" + endif +@@ -159,7 +160,7 @@ + " Section: end {{{1 + " Unless special ("end loop", "end if", etc.), "end" marks the end of a + " begin, package, task etc. Assiging it to adaEnd. +-syntax match adaEnd "\" ++syntax match adaEnd /\/ + + syntax keyword adaPreproc pragma + +diff -urN vim71/runtime/syntax/bush.vim vim71_ada/runtime/syntax/bush.vim +--- vim71/runtime/syntax/bush.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/syntax/bush.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,309 @@ ++" Vim syntax file ++" Language: BUSH / AdaScript ++" Maintainer: Ken O. Burtch ++" URL: http://www.pegasoft.ca/bush ++" Last Change: 2004-06-29 ++ ++" Former Maintainer: Simon Bradley ++" (was ) ++" Other contributors: Preben Randhol. ++" The formal spec of Ada95 (ARM) is the "Ada95 Reference Manual". ++" For more Ada95 info, see http://www.gnuada.org and http://www.adapower.com. ++ ++" This vim syntax file works on vim 5.6, 5.7, 5.8 and 6.x. ++" It implements Bram Moolenaar's April 25, 2001 recommendations to make ++" the syntax file maximally portable across different versions of vim. ++" If vim 6.0+ is available, ++" this syntax file takes advantage of the vim 6.0 advanced pattern-matching ++" functions to avoid highlighting uninteresting leading spaces in ++" some expressions containing "with" and "use". ++ ++" For version 5.x: Clear all syntax items ++" For version 6.x: Quit when a syntax file was already loaded ++if version < 600 ++ syntax clear ++elseif exists("b:current_syntax") ++ finish ++endif ++ ++" Ada is entirely case-insensitive. ++syn case ignore ++ ++" We don't need to look backwards to highlight correctly; ++" this speeds things up greatly. ++syn sync minlines=1 maxlines=1 ++ ++" Highlighting commands. There are 69 reserved words in total in Ada95. ++" Some keywords are used in more than one way. For example: ++" 1. "end" is a general keyword, but "end if" ends a Conditional. ++" 2. "then" is a conditional, but "and then" is an operator. ++ ++ ++" Standard Exceptions (including I/O). ++" We'll highlight the standard exceptions, similar to vim's Python mode. ++" It's possible to redefine the standard exceptions as something else, ++" but doing so is very bad practice, so simply highlighting them makes sense. ++syn keyword adaException Constraint_Error Program_Error Storage_Error ++syn keyword adaException Tasking_Error ++syn keyword adaException Status_Error Mode_Error Name_Error Use_Error ++syn keyword adaException Device_Error End_Error Data_Error Layout_Error ++syn keyword adaException Length_Error Pattern_Error Index_Error ++syn keyword adaException Translation_Error ++syn keyword adaException Time_Error Argument_Error ++syn keyword adaException Tag_Error ++syn keyword adaException Picture_Error ++" Interfaces ++syn keyword adaException Terminator_Error Conversion_Error ++syn keyword adaException Pointer_Error Dereference_Error Update_Error ++" This isn't in the Ada spec, but a GNAT extension. ++syn keyword adaException Assert_Failure ++" We don't list ALL exceptions defined in particular compilers (e.g., GNAT), ++" because it's quite reasonable to define those phrases as non-exceptions. ++ ++ ++" We don't normally highlight types in package Standard ++" (Integer, Character, Float, etc.). I don't think it looks good ++" with the other type keywords, and many Ada programs define ++" so many of their own types that it looks inconsistent. ++" However, if you want this highlighting, turn on "ada_standard_types". ++" For package Standard's definition, see ARM section A.1. ++ ++if exists("ada_standard_types") ++ syn keyword adaBuiltinType Boolean Integer Natural Positive Float ++ syn keyword adaBuiltinType Character Wide_Character ++ syn keyword adaBuiltinType String Wide_String ++ syn keyword adaBuiltinType Duration ++ " These aren't listed in ARM section A.1's code, but they're noted as ++ " options in ARM sections 3.5.4 and 3.5.7: ++ syn keyword adaBuiltinType Short_Integer Short_Short_Integer ++ syn keyword adaBuiltinType Long_Integer Long_Long_Integer ++ syn keyword adaBuiltinType Short_Float Short_Short_Float ++ syn keyword adaBuiltinType Long_Float Long_Long_Float ++ " BUSH-specific types ++ syn keyword adaBuiltinType command ++ syn keyword adaBuiltinType socket_type ++ syn keyword adaBuiltinType unbounded_string ++ syn keyword adaBuiltinType universal_typeless ++ syn keyword adaBuiltinType universal_string ++ syn keyword adaBuiltinType universal_numeric ++endif ++ ++" There are MANY other predefined types; they've not been added, because ++" determining when they're a type requires context in general. ++" One potential addition would be Unbounded_String. ++ ++ ++syn keyword adaLabel others ++ ++syn keyword adaOperator abs mod not rem xor ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "[-+*/<>&]" ++syn keyword adaOperator ** ++syn match adaOperator "[/<>]=" ++syn keyword adaOperator => ++syn match adaOperator "\.\." ++syn match adaOperator "=" ++ ++" We won't map "adaAssignment" by default, but we need to map ":=" to ++" something or the "=" inside it will be mislabelled as an operator. ++" Note that in Ada, assignment (:=) is not considered an operator. ++syn match adaAssignment ":=" ++ ++" Handle the box, <>, specially: ++syn keyword adaSpecial <> ++ ++" Numbers, including floating point, exponents, and alternate bases. ++syn match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" ++syn match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" ++ ++" Identify leading numeric signs. In "A-5" the "-" is an operator, ++" but in "A:=-5" the "-" is a sign. This handles "A3+-5" (etc.) correctly. ++" This assumes that if you put a don't put a space after +/- when it's used ++" as an operator, you won't put a space before it either -- which is true ++" in code I've seen. ++syn match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 ++ ++" Labels for the goto statement. ++syn region adaLabel start="<<" end=">>" ++ ++" Boolean Constants. ++syn keyword adaBoolean true false ++ ++" Warn people who try to use C/C++ notation erroneously: ++syn match adaError "//" ++syn match adaError "/\*" ++syn match adaError "==" ++ ++ ++if exists("ada_space_errors") ++ if !exists("ada_no_trail_space_error") ++ syn match adaSpaceError excludenl "\s\+$" ++ endif ++ if !exists("ada_no_tab_space_error") ++ syn match adaSpaceError " \+\t"me=e-1 ++ endif ++endif ++ ++" Unless special ("end loop", "end if", etc.), "end" marks the end of a ++" begin, package, task etc. Assiging it to adaEnd. ++syn match adaEnd "\" ++ ++syn keyword adaPreproc pragma ++ ++syn keyword adaRepeat exit for loop reverse while ++syn match adaRepeat "\" ++ ++syn keyword adaStatement accept delay goto raise requeue return ++syn keyword adaStatement terminate ++" BUSH-specific statements ++syn keyword adaStatement cd ++syn keyword adaStatement clear ++syn keyword adaStatement env ++syn keyword adaStatement inkey ++syn keyword adaStatement jobs ++syn keyword adaStatement logout ++syn keyword adaStatement pwd ++syn keyword adaStatement step ++syn keyword adaStatement trace ++syn keyword adaStatement typeset ++syn keyword adaStatement unset ++syn keyword adaStatement wait ++syn keyword adaStatement history ++syn keyword adaStatement "?" ++syn match adaStatement "\" ++ ++" Handle Ada's record keywords. ++" 'record' usually starts a structure, but "with null record;" does not, ++" and 'end record;' ends a structure. The ordering here is critical - ++" 'record;' matches a "with null record", so make it a keyword (this can ++" match when the 'with' or 'null' is on a previous line). ++" We see the "end" in "end record" before the word record, so we match that ++" pattern as adaStructure (and it won't match the "record;" pattern). ++syn match adaStructure "\" ++syn match adaStructure "\" ++syn match adaKeyword "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn keyword adaConditional if case select ++syn keyword adaConditional elsif when ++ ++syn keyword adaKeyword all do exception in is new null out ++syn keyword adaKeyword separate until ++ ++" These keywords begin various constructs, and you _might_ want to ++" highlight them differently. ++syn keyword adaBegin begin body declare entry function generic ++syn keyword adaBegin package procedure protected renames task ++ ++ ++if exists("ada_withuse_ordinary") ++" Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. ++ syn keyword adaKeyword with use ++else ++ " Highlight "with" and "use" clauses like C's "#include" when they're used ++ " to reference other compilation units; otherwise they're ordinary keywords. ++ " If we have vim 6.0 or later, we'll use its advanced pattern-matching ++ " capabilities so that we won't match leading spaces. ++ syn match adaKeyword "\" ++ syn match adaKeyword "\" ++ if version < 600 ++ syn match adaBeginWith "^\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syn match adaSemiWith ";\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>"lc=1 contains=adaInc ++ else ++ syn match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syn match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ endif ++ syn match adaInc "\" contained contains=NONE ++ syn match adaInc "\" contained contains=NONE ++ syn match adaInc "\" contained contains=NONE ++ " Recognize "with null record" as a keyword (even the "record"). ++ syn match adaKeyword "\" ++ " Consider generic formal parameters of subprograms and packages as keywords. ++ if version < 600 ++ syn match adaKeyword ";\s*with\s\+\(function\|procedure\|package\)\>" ++ syn match adaKeyword "^\s*with\s\+\(function\|procedure\|package\)\>" ++ else ++ syn match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>" ++ syn match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>" ++ endif ++endif ++ ++ ++" String and character constants. ++syn region adaString start=+"+ skip=+""+ end=+"+ ++syn match adaCharacter "'.'" ++ ++" Todo (only highlighted in comments) ++syn keyword adaTodo contained TODO FIXME XXX ++ ++" Comments. ++syn region adaComment oneline contains=adaTodo start="--" end="$" ++ ++ ++ ++" Define the default highlighting. ++" For version 5.7 and earlier: only when not done already ++" For version 5.8 and later: only when an item doesn't have highlighting yet ++if version >= 508 || !exists("did_ada_syn_inits") ++ if version < 508 ++ let did_ada_syn_inits = 1 ++ command -nargs=+ HiLink hi link ++ else ++ command -nargs=+ HiLink hi def link ++ endif ++ ++ " The default methods for highlighting. Can be overridden later. ++ HiLink adaCharacter Character ++ HiLink adaComment Comment ++ HiLink adaConditional Conditional ++ HiLink adaKeyword Keyword ++ HiLink adaLabel Label ++ HiLink adaNumber Number ++ HiLink adaSign Number ++ HiLink adaOperator Operator ++ HiLink adaPreproc PreProc ++ HiLink adaRepeat Repeat ++ HiLink adaSpecial Special ++ HiLink adaStatement Statement ++ HiLink adaString String ++ HiLink adaStructure Structure ++ HiLink adaTodo Todo ++ HiLink adaType Type ++ HiLink adaTypedef Typedef ++ HiLink adaStorageClass StorageClass ++ HiLink adaBoolean Boolean ++ HiLink adaException Exception ++ HiLink adaInc Include ++ HiLink adaError Error ++ HiLink adaSpaceError Error ++ HiLink adaBuiltinType Type ++ ++ if exists("ada_begin_preproc") ++ " This is the old default display: ++ HiLink adaBegin PreProc ++ HiLink adaEnd PreProc ++ else ++ " This is the new default display: ++ HiLink adaBegin Keyword ++ HiLink adaEnd Keyword ++ endif ++ ++ delcommand HiLink ++endif ++ ++let b:current_syntax = "ada" ++ ++" vim: ts=8 diff --git a/vim.spec b/vim.spec index c7aee3c4..d015a07f 100644 --- a/vim.spec +++ b/vim.spec @@ -23,7 +23,7 @@ Summary: The VIM editor URL: http://www.vim.org/ Name: vim Version: %{baseversion}.%{beta}%{patchlevel} -Release: 1%{?dist} +Release: 2%{?dist} License: Vim Group: Applications/Editors Source0: ftp://ftp.vim.org/pub/vim/unix/vim-%{baseversion}%{?beta}%{?CVSDATE}.tar.bz2 @@ -295,6 +295,8 @@ Patch3009: vim-7.0-warning.patch Patch3010: vim-7.0-syncolor.patch Patch3011: vim-7.0-vimspelltypo.patch Patch3012: vim-7.0-specedit.patch +# Remove this one when the runtime files get updated (#246378): +Patch3013: vim-7.1-ada.patch # Patch3100: vim-selinux.patch Patch3101: vim-selinux2.patch @@ -664,6 +666,7 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch3010 -p1 %patch3011 -p1 %patch3012 -p1 +%patch3013 -p1 %if %{WITH_SELINUX} %patch3100 -p1 @@ -1031,6 +1034,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Wed Jan 16 2008 Karsten Hopp 7.1.230-2 +- add newer ada runtime files to fix bugzilla #246378 + * Wed Jan 16 2008 Karsten Hopp 7.1.230-1 - patchlevel 230, fixes memory leak From 2ed001a95b55ed90ee1ea36affc4e08283bc437a Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Fri, 18 Jan 2008 13:52:03 +0000 Subject: [PATCH 02/71] - fix ada patch --- vim-7.1-ada.patch | 40465 +------------------------------------------- 1 file changed, 63 insertions(+), 40402 deletions(-) diff --git a/vim-7.1-ada.patch b/vim-7.1-ada.patch index c8c29324..d2c1f47c 100644 --- a/vim-7.1-ada.patch +++ b/vim-7.1-ada.patch @@ -1,34626 +1,3 @@ -diff -urN vim71/1/ada_options.vim vim71_ada/1/ada_options.vim ---- vim71/1/ada_options.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ada_options.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,105 @@ -+"------------------------------------------------------------------------------ -+" Description: Options setable by the Ada plugin -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ada_options.vim $ -+" History: 24.05.2006 MK Unified Headers -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 02.10.2006 MK Folding for "gnat pretty" -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested to save on spaces -+" Usage: copy content into your .vimrc and change options to your -+" likeing. -+" Help Page: ft-ada-options -+"------------------------------------------------------------------------------ -+ -+echoerr 'It is suggested to copy the content of ada_options into .vimrc!' -+finish " 1}}} -+ -+" Section: Ada options {{{1 -+ -+ let g:ada_abbrev = 1 -+ let g:ada_default_compiler = 'gnat' -+ let g:ada_extended_tagging = 'list' -+ let g:ada_folding = 'i' -+" let g:ada_folding = 'gibxp' -+" let g:ada_folding = 'spftc' -+ let g:ada_rainbow_color = 1 -+ let g:ada_space_errors = 1 -+ let g:ada_standard_types = 1 -+ let g:ada_with_gnat_project_files = 1 -+" let g:ada_extended_completion = 1 -+" let g:ada_line_errors = 1 -+" let g:ada_omni_with_keywords = 1 -+ -+ let g:Tlist_Exit_OnlyWindow = 1 -+ let g:Tlist_File_Fold_Auto_Close = 1 -+ let g:Tlist_Sort_Type = "name" -+ -+ let g:NERD_use_ada_with_spaces = 1 -+ -+ let g:backup_directory = '.backups' -+ let g:backup_purge = 10 -+ -+ let g:mapleader = "" -+ -+ if &diff -+ let g:Tlist_Auto_Open = 0 -+ else -+ let g:Tlist_Auto_Open = 1 -+ endif -+ -+ filetype plugin indent on -+ syntax enable -+ -+" }}}1 -+ -+" Section: Vimball options {{{1 -+:set expandtab fileformat=unix encoding=utf-8 -+:.+2,.+13 MkVimball ada-4.5.0 -+ -+ada_options.vim -+autoload/ada.vim -+autoload/adacomplete.vim -+autoload/decada.vim -+autoload/gnat.vim -+compiler/decada.vim -+compiler/gnat.vim -+doc/ft_ada.txt -+ftdetect/ada.vim -+ftplugin/ada.vim -+indent/ada.vim -+syntax/ada.vim -+ -+" }}}1 -+ -+" Section: Tar options {{{1 -+ -+tar --create --bzip2 \ -+ --file="ada-4.5.0.tar.bz2" \ -+ autoload/ada.vim \ -+ autoload/adacomplete.vim \ -+ autoload/decada.vim \ -+ autoload/gnat.vim \ -+ compiler/decada.vim \ -+ compiler/gnat.vim \ -+ doc/ft_ada.txt \ -+ ftdetect/ada.vim \ -+ ftplugin/ada.vim \ -+ indent/ada.vim \ -+ syntax/ada.vim ; -+ -+" }}}1 -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: textwidth=0 foldmethod=marker foldmethod=marker -diff -urN vim71/1/autoload/adacomplete.vim vim71_ada/1/autoload/adacomplete.vim ---- vim71/1/autoload/adacomplete.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/adacomplete.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,109 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada omnicompletion file -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ -+" History: 24.05.2006 MK Unified Headers -+" 26.05.2006 MK improved search for begin of word. -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested not to use include protection for -+" autoload -+" 05.11.2006 MK Bram suggested agaist using setlocal omnifunc -+" 05.11.2006 MK Bram suggested to save on spaces -+" Help Page: ft-ada-omni -+"------------------------------------------------------------------------------ -+ -+if version < 700 -+ finish -+endif -+ -+" Section: adacomplete#Complete () {{{1 -+" -+" This function is used for the 'omnifunc' option. -+" -+function! adacomplete#Complete (findstart, base) -+ if a:findstart == 1 -+ return ada#User_Complete (a:findstart, a:base) -+ else -+ " -+ " look up matches -+ " -+ if exists ("g:ada_omni_with_keywords") -+ call ada#User_Complete (a:findstart, a:base) -+ endif -+ " -+ " search tag file for matches -+ " -+ let l:Pattern = '^' . a:base . '.*$' -+ let l:Tag_List = taglist (l:Pattern) -+ " -+ " add symbols -+ " -+ for Tag_Item in l:Tag_List -+ if l:Tag_Item['kind'] == '' -+ " -+ " Tag created by gnat xref -+ " -+ let l:Match_Item = { -+ \ 'word': l:Tag_Item['name'], -+ \ 'menu': l:Tag_Item['filename'], -+ \ 'info': "Symbol from file " . l:Tag_Item['filename'] . " line " . l:Tag_Item['cmd'], -+ \ 'kind': 's', -+ \ 'icase': 1} -+ else -+ " -+ " Tag created by ctags -+ " -+ let l:Info = 'Symbol : ' . l:Tag_Item['name'] . "\n" -+ let l:Info .= 'Of type : ' . g:ada#Ctags_Kinds[l:Tag_Item['kind']][1] . "\n" -+ let l:Info .= 'Defined in File : ' . l:Tag_Item['filename'] . "\n" -+ -+ if has_key( l:Tag_Item, 'package') -+ let l:Info .= 'Package : ' . l:Tag_Item['package'] . "\n" -+ let l:Menu = l:Tag_Item['package'] -+ elseif has_key( l:Tag_Item, 'separate') -+ let l:Info .= 'Separate from Package : ' . l:Tag_Item['separate'] . "\n" -+ let l:Menu = l:Tag_Item['separate'] -+ elseif has_key( l:Tag_Item, 'packspec') -+ let l:Info .= 'Package Specification : ' . l:Tag_Item['packspec'] . "\n" -+ let l:Menu = l:Tag_Item['packspec'] -+ elseif has_key( l:Tag_Item, 'type') -+ let l:Info .= 'Datetype : ' . l:Tag_Item['type'] . "\n" -+ let l:Menu = l:Tag_Item['type'] -+ else -+ let l:Menu = l:Tag_Item['filename'] -+ endif -+ -+ let l:Match_Item = { -+ \ 'word': l:Tag_Item['name'], -+ \ 'menu': l:Menu, -+ \ 'info': l:Info, -+ \ 'kind': l:Tag_Item['kind'], -+ \ 'icase': 1} -+ endif -+ if complete_add (l:Match_Item) == 0 -+ return [] -+ endif -+ if complete_check () -+ return [] -+ endif -+ endfor -+ return [] -+ endif -+endfunction adacomplete#Complete -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/autoload/ada.vim vim71_ada/1/autoload/ada.vim ---- vim71/1/autoload/ada.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/ada.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,624 @@ -+"------------------------------------------------------------------------------ -+" Description: Perform Ada specific completion & tagging. -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Maintainer: Martin Krischik -+" Taylor Venable -+" Neil Bird -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ -+" History: 24.05.2006 MK Unified Headers -+" 26.05.2006 MK ' should not be in iskeyword. -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 02.10.2006 MK Better folding. -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested not to use include protection for -+" autoload -+" 05.11.2006 MK Bram suggested to save on spaces -+" 08.07.2007 TV fix mapleader problems. -+" 09.05.2007 MK Session just won't work no matter how much -+" tweaking is done -+" 19.09.2007 NO still some mapleader problems -+" Help Page: ft-ada-functions -+"------------------------------------------------------------------------------ -+ -+if version < 700 -+ finish -+endif -+ -+" Section: Constants {{{1 -+" -+let g:ada#DotWordRegex = '\a\w*\(\_s*\.\_s*\a\w*\)*' -+let g:ada#WordRegex = '\a\w*' -+let g:ada#Comment = "\\v^(\"[^\"]*\"|'.'|[^\"']){-}\\zs\\s*--.*" -+let g:ada#Keywords = [] -+ -+" Section: g:ada#Keywords {{{1 -+" -+" Section: add Ada keywords {{{2 -+" -+for Item in ['abort', 'else', 'new', 'return', 'abs', 'elsif', 'not', 'reverse', 'abstract', 'end', 'null', 'accept', 'entry', 'select', 'access', 'exception', 'of', 'separate', 'aliased', 'exit', 'or', 'subtype', 'all', 'others', 'synchronized', 'and', 'for', 'out', 'array', 'function', 'overriding', 'tagged', 'at', 'task', 'generic', 'package', 'terminate', 'begin', 'goto', 'pragma', 'then', 'body', 'private', 'type', 'if', 'procedure', 'case', 'in', 'protected', 'until', 'constant', 'interface', 'use', 'is', 'raise', 'declare', 'range', 'when', 'delay', 'limited', 'record', 'while', 'delta', 'loop', 'rem', 'with', 'digits', 'renames', 'do', 'mod', 'requeue', 'xor'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'keyword', -+ \ 'info': 'Ada keyword.', -+ \ 'kind': 'k', -+ \ 'icase': 1}] -+endfor -+ -+" Section: GNAT Project Files {{{3 -+" -+if exists ('g:ada_with_gnat_project_files') -+ for Item in ['project'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'keyword', -+ \ 'info': 'GNAT projectfile keyword.', -+ \ 'kind': 'k', -+ \ 'icase': 1}] -+ endfor -+endif -+ -+" Section: add standart exception {{{2 -+" -+for Item in ['Constraint_Error', 'Program_Error', 'Storage_Error', 'Tasking_Error', 'Status_Error', 'Mode_Error', 'Name_Error', 'Use_Error', 'Device_Error', 'End_Error', 'Data_Error', 'Layout_Error', 'Length_Error', 'Pattern_Error', 'Index_Error', 'Translation_Error', 'Time_Error', 'Argument_Error', 'Tag_Error', 'Picture_Error', 'Terminator_Error', 'Conversion_Error', 'Pointer_Error', 'Dereference_Error', 'Update_Error'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'exception', -+ \ 'info': 'Ada standart exception.', -+ \ 'kind': 'x', -+ \ 'icase': 1}] -+endfor -+ -+" Section: add GNAT exception {{{3 -+" -+if exists ('g:ada_gnat_extensions') -+ for Item in ['Assert_Failure'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'exception', -+ \ 'info': 'GNAT exception.', -+ \ 'kind': 'x', -+ \ 'icase': 1}] -+ endfor -+endif -+ -+" Section: add Ada buildin types {{{2 -+" -+for Item in ['Boolean', 'Integer', 'Natural', 'Positive', 'Float', 'Character', 'Wide_Character', 'Wide_Wide_Character', 'String', 'Wide_String', 'Wide_Wide_String', 'Duration'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'type', -+ \ 'info': 'Ada buildin type.', -+ \ 'kind': 't', -+ \ 'icase': 1}] -+endfor -+ -+" Section: add GNAT buildin types {{{3 -+" -+if exists ('g:ada_gnat_extensions') -+ for Item in ['Short_Integer', 'Short_Short_Integer', 'Long_Integer', 'Long_Long_Integer', 'Short_Float', 'Short_Short_Float', 'Long_Float', 'Long_Long_Float'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'type', -+ \ 'info': 'GNAT buildin type.', -+ \ 'kind': 't', -+ \ 'icase': 1}] -+ endfor -+endif -+ -+" Section: add Ada Attributes {{{2 -+" -+for Item in ['''Access', '''Address', '''Adjacent', '''Aft', '''Alignment', '''Base', '''Bit_Order', '''Body_Version', '''Callable', '''Caller', '''Ceiling', '''Class', '''Component_Size', '''Compose', '''Constrained', '''Copy_Sign', '''Count', '''Definite', '''Delta', '''Denorm', '''Digits', '''Emax', '''Exponent', '''External_Tag', '''Epsilon', '''First', '''First_Bit', '''Floor', '''Fore', '''Fraction', '''Identity', '''Image', '''Input', '''Large', '''Last', '''Last_Bit', '''Leading_Part', '''Length', '''Machine', '''Machine_Emax', '''Machine_Emin', '''Machine_Mantissa', '''Machine_Overflows', '''Machine_Radix', '''Machine_Rounding', '''Machine_Rounds', '''Mantissa', '''Max', '''Max_Size_In_Storage_Elements', '''Min', '''Mod', '''Model', '''Model_Emin', '''Model_Epsilon', '''Model_Mantissa', '''Model_Small', '''Modulus', '''Output', '''Partition_ID', '''Pos', '''Position', '''Pred', '''Priority', '''Range', '''Read', '''Remainder', '''Round', '''Rounding', '''Safe_Emax', '''Safe_First', '''Safe_Large', '''Safe_Last', '''Safe_Small', '''Scale', '''Scaling', '''Signed_Zeros', '''Size', '''Small', '''Storage_Pool', '''Storage_Size', '''Stream_Size', '''Succ', '''Tag', '''Terminated', '''Truncation', '''Unbiased_Rounding', '''Unchecked_Access', '''Val', '''Valid', '''Value', '''Version', '''Wide_Image', '''Wide_Value', '''Wide_Wide_Image', '''Wide_Wide_Value', '''Wide_Wide_Width', '''Wide_Width', '''Width', '''Write'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'attribute', -+ \ 'info': 'Ada attribute.', -+ \ 'kind': 'a', -+ \ 'icase': 1}] -+endfor -+ -+" Section: add GNAT Attributes {{{3 -+" -+if exists ('g:ada_gnat_extensions') -+ for Item in ['''Abort_Signal', '''Address_Size', '''Asm_Input', '''Asm_Output', '''AST_Entry', '''Bit', '''Bit_Position', '''Code_Address', '''Default_Bit_Order', '''Elaborated', '''Elab_Body', '''Elab_Spec', '''Emax', '''Enum_Rep', '''Epsilon', '''Fixed_Value', '''Has_Access_Values', '''Has_Discriminants', '''Img', '''Integer_Value', '''Machine_Size', '''Max_Interrupt_Priority', '''Max_Priority', '''Maximum_Alignment', '''Mechanism_Code', '''Null_Parameter', '''Object_Size', '''Passed_By_Reference', '''Range_Length', '''Storage_Unit', '''Target_Name', '''Tick', '''To_Address', '''Type_Class', '''UET_Address', '''Unconstrained_Array', '''Universal_Literal_String', '''Unrestricted_Access', '''VADS_Size', '''Value_Size', '''Wchar_T_Size', '''Word_Size'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'attribute', -+ \ 'info': 'GNAT attribute.', -+ \ 'kind': 'a', -+ \ 'icase': 1}] -+ endfor -+endif -+ -+" Section: add Ada Pragmas {{{2 -+" -+for Item in ['All_Calls_Remote', 'Assert', 'Assertion_Policy', 'Asynchronous', 'Atomic', 'Atomic_Components', 'Attach_Handler', 'Controlled', 'Convention', 'Detect_Blocking', 'Discard_Names', 'Elaborate', 'Elaborate_All', 'Elaborate_Body', 'Export', 'Import', 'Inline', 'Inspection_Point', 'Interface (Obsolescent)', 'Interrupt_Handler', 'Interrupt_Priority', 'Linker_Options', 'List', 'Locking_Policy', 'Memory_Size (Obsolescent)', 'No_Return', 'Normalize_Scalars', 'Optimize', 'Pack', 'Page', 'Partition_Elaboration_Policy', 'Preelaborable_Initialization', 'Preelaborate', 'Priority', 'Priority_Specific_Dispatching', 'Profile', 'Pure', 'Queueing_Policy', 'Relative_Deadline', 'Remote_Call_Interface', 'Remote_Types', 'Restrictions', 'Reviewable', 'Shared (Obsolescent)', 'Shared_Passive', 'Storage_Size', 'Storage_Unit (Obsolescent)', 'Suppress', 'System_Name (Obsolescent)', 'Task_Dispatching_Policy', 'Unchecked_Union', 'Unsuppress', 'Volatile', 'Volatile_Components'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'pragma', -+ \ 'info': 'Ada pragma.', -+ \ 'kind': 'p', -+ \ 'icase': 1}] -+endfor -+ -+" Section: add GNAT Pragmas {{{3 -+" -+if exists ('g:ada_gnat_extensions') -+ for Item in ['Abort_Defer', 'Ada_83', 'Ada_95', 'Ada_05', 'Annotate', 'Ast_Entry', 'C_Pass_By_Copy', 'Comment', 'Common_Object', 'Compile_Time_Warning', 'Complex_Representation', 'Component_Alignment', 'Convention_Identifier', 'CPP_Class', 'CPP_Constructor', 'CPP_Virtual', 'CPP_Vtable', 'Debug', 'Elaboration_Checks', 'Eliminate', 'Export_Exception', 'Export_Function', 'Export_Object', 'Export_Procedure', 'Export_Value', 'Export_Valued_Procedure', 'Extend_System', 'External', 'External_Name_Casing', 'Finalize_Storage_Only', 'Float_Representation', 'Ident', 'Import_Exception', 'Import_Function', 'Import_Object', 'Import_Procedure', 'Import_Valued_Procedure', 'Initialize_Scalars', 'Inline_Always', 'Inline_Generic', 'Interface_Name', 'Interrupt_State', 'Keep_Names', 'License', 'Link_With', 'Linker_Alias', 'Linker_Section', 'Long_Float', 'Machine_Attribute', 'Main_Storage', 'Obsolescent', 'Passive', 'Polling', 'Profile_Warnings', 'Propagate_Exceptions', 'Psect_Object', 'Pure_Function', 'Restriction_Warnings', 'Source_File_Name', 'Source_File_Name_Project', 'Source_Reference', 'Stream_Convert', 'Style_Checks', 'Subtitle', 'Suppress_All', 'Suppress_Exception_Locations', 'Suppress_Initialization', 'Task_Info', 'Task_Name', 'Task_Storage', 'Thread_Body', 'Time_Slice', 'Title', 'Unimplemented_Unit', 'Universal_Data', 'Unreferenced', 'Unreserve_All_Interrupts', 'Use_VADS_Size', 'Validity_Checks', 'Warnings', 'Weak_External'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'pragma', -+ \ 'info': 'GNAT pragma.', -+ \ 'kind': 'p', -+ \ 'icase': 1}] -+ endfor -+endif -+" 1}}} -+ -+" Section: g:ada#Ctags_Kinds {{{1 -+" -+let g:ada#Ctags_Kinds = { -+ \ 'P': ["packspec", "package specifications"], -+ \ 'p': ["package", "packages"], -+ \ 'T': ["typespec", "type specifications"], -+ \ 't': ["type", "types"], -+ \ 'U': ["subspec", "subtype specifications"], -+ \ 'u': ["subtype", "subtypes"], -+ \ 'c': ["component", "record type components"], -+ \ 'l': ["literal", "enum type literals"], -+ \ 'V': ["varspec", "variable specifications"], -+ \ 'v': ["variable", "variables"], -+ \ 'f': ["formal", "generic formal parameters"], -+ \ 'n': ["constant", "constants"], -+ \ 'x': ["exception", "user defined exceptions"], -+ \ 'R': ["subprogspec", "subprogram specifications"], -+ \ 'r': ["subprogram", "subprograms"], -+ \ 'K': ["taskspec", "task specifications"], -+ \ 'k': ["task", "tasks"], -+ \ 'O': ["protectspec", "protected data specifications"], -+ \ 'o': ["protected", "protected data"], -+ \ 'E': ["entryspec", "task/protected data entry specifications"], -+ \ 'e': ["entry", "task/protected data entries"], -+ \ 'b': ["label", "labels"], -+ \ 'i': ["identifier", "loop/declare identifiers"], -+ \ 'a': ["autovar", "automatic variables"], -+ \ 'y': ["annon", "loops and blocks with no identifier"]} -+ -+" Section: ada#Word (...) {{{1 -+" -+" Extract current Ada word across multiple lines -+" AdaWord ([line, column])\ -+" -+function ada#Word (...) -+ if a:0 > 1 -+ let l:Line_Nr = a:1 -+ let l:Column_Nr = a:2 - 1 -+ else -+ let l:Line_Nr = line('.') -+ let l:Column_Nr = col('.') - 1 -+ endif -+ -+ let l:Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' ) -+ -+ " Cope with tag searching for items in comments; if we are, don't loop -+ " backards looking for previous lines -+ if l:Column_Nr > strlen(l:Line) -+ " We were in a comment -+ let l:Line = getline(l:Line_Nr) -+ let l:Search_Prev_Lines = 0 -+ else -+ let l:Search_Prev_Lines = 1 -+ endif -+ -+ " Go backwards until we find a match (Ada ID) that *doesn't* include our -+ " location - i.e., the previous ID. This is because the current 'correct' -+ " match will toggle matching/not matching as we traverse characters -+ " backwards. Thus, we have to find the previous unrelated match, exclude -+ " it, then use the next full match (ours). -+ " Remember to convert vim column 'l:Column_Nr' [1..n] to string offset [0..(n-1)] -+ " ... but start, here, one after the required char. -+ let l:New_Column = l:Column_Nr + 1 -+ while 1 -+ let l:New_Column = l:New_Column - 1 -+ if l:New_Column < 0 -+ " Have to include previous l:Line from file -+ let l:Line_Nr = l:Line_Nr - 1 -+ if l:Line_Nr < 1 || !l:Search_Prev_Lines -+ " Start of file or matching in a comment -+ let l:Line_Nr = 1 -+ let l:New_Column = 0 -+ let l:Our_Match = match (l:Line, g:ada#WordRegex ) -+ break -+ endif -+ " Get previous l:Line, and prepend it to our search string -+ let l:New_Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' ) -+ let l:New_Column = strlen (l:New_Line) - 1 -+ let l:Column_Nr = l:Column_Nr + l:New_Column -+ let l:Line = l:New_Line . l:Line -+ endif -+ " Check to see if this is a match excluding 'us' -+ let l:Match_End = l:New_Column + -+ \ matchend (strpart (l:Line,l:New_Column), g:ada#WordRegex ) - 1 -+ if l:Match_End >= l:New_Column && -+ \ l:Match_End < l:Column_Nr -+ " Yes -+ let l:Our_Match = l:Match_End+1 + -+ \ match (strpart (l:Line,l:Match_End+1), g:ada#WordRegex ) -+ break -+ endif -+ endwhile -+ -+ " Got anything? -+ if l:Our_Match < 0 -+ return '' -+ else -+ let l:Line = strpart (l:Line, l:Our_Match) -+ endif -+ -+ " Now simply add further lines until the match gets no bigger -+ let l:Match_String = matchstr (l:Line, g:ada#WordRegex) -+ let l:Last_Line = line ('$') -+ let l:Line_Nr = line ('.') + 1 -+ while l:Line_Nr <= l:Last_Line -+ let l:Last_Match = l:Match_String -+ let l:Line = l:Line . -+ \ substitute (getline (l:Line_Nr), g:ada#Comment, '', '') -+ let l:Match_String = matchstr (l:Line, g:ada#WordRegex) -+ if l:Match_String == l:Last_Match -+ break -+ endif -+ endwhile -+ -+ " Strip whitespace & return -+ return substitute (l:Match_String, '\s\+', '', 'g') -+endfunction ada#Word -+ -+" Section: ada#List_Tag (...) {{{1 -+" -+" List tags in quickfix window -+" -+function ada#List_Tag (...) -+ if a:0 > 1 -+ let l:Tag_Word = ada#Word (a:1, a:2) -+ elseif a:0 > 0 -+ let l:Tag_Word = a:1 -+ else -+ let l:Tag_Word = ada#Word () -+ endif -+ -+ echo "Searching for" l:Tag_Word -+ -+ let l:Pattern = '^' . l:Tag_Word . '$' -+ let l:Tag_List = taglist (l:Pattern) -+ let l:Error_List = [] -+ " -+ " add symbols -+ " -+ for Tag_Item in l:Tag_List -+ if l:Tag_Item['kind'] == '' -+ let l:Tag_Item['kind'] = 's' -+ endif -+ -+ let l:Error_List += [ -+ \ l:Tag_Item['filename'] . '|' . -+ \ l:Tag_Item['cmd'] . '|' . -+ \ l:Tag_Item['kind'] . "\t" . -+ \ l:Tag_Item['name'] ] -+ endfor -+ set errorformat=%f\|%l\|%m -+ cexpr l:Error_List -+ cwindow -+endfunction ada#List_Tag -+ -+" Section: ada#Jump_Tag (Word, Mode) {{{1 -+" -+" Word tag - include '.' and if Ada make uppercase -+" -+function ada#Jump_Tag (Word, Mode) -+ if a:Word == '' -+ " Get current word -+ let l:Word = ada#Word() -+ if l:Word == '' -+ throw "NOT_FOUND: no identifier found." -+ endif -+ else -+ let l:Word = a:Word -+ endif -+ -+ echo "Searching for " . l:Word -+ -+ try -+ execute a:Mode l:Word -+ catch /.*:E426:.*/ -+ let ignorecase = &ignorecase -+ set ignorecase -+ execute a:Mode l:Word -+ let &ignorecase = ignorecase -+ endtry -+ -+ return -+endfunction ada#Jump_Tag -+ -+" Section: ada#Insert_Backspace () {{{1 -+" -+" Backspace at end of line after auto-inserted commentstring '-- ' wipes it -+" -+function ada#Insert_Backspace () -+ let l:Line = getline ('.') -+ if col ('.') > strlen (l:Line) && -+ \ match (l:Line, '-- $') != -1 && -+ \ match (&comments,'--') != -1 -+ return "\\\" -+ else -+ return "\" -+ endif -+ -+ return -+endfunction ada#InsertBackspace -+ -+" Section: Insert Completions {{{1 -+" -+" Section: ada#User_Complete(findstart, base) {{{2 -+" -+" This function is used for the 'complete' option. -+" -+function! ada#User_Complete(findstart, base) -+ if a:findstart == 1 -+ " -+ " locate the start of the word -+ " -+ let line = getline ('.') -+ let start = col ('.') - 1 -+ while start > 0 && line[start - 1] =~ '\i\|''' -+ let start -= 1 -+ endwhile -+ return start -+ else -+ " -+ " look up matches -+ " -+ let l:Pattern = '^' . a:base . '.*$' -+ " -+ " add keywords -+ " -+ for Tag_Item in g:ada#Keywords -+ if l:Tag_Item['word'] =~? l:Pattern -+ if complete_add (l:Tag_Item) == 0 -+ return [] -+ endif -+ if complete_check () -+ return [] -+ endif -+ endif -+ endfor -+ return [] -+ endif -+endfunction ada#User_Complete -+ -+" Section: ada#Completion (cmd) {{{2 -+" -+" Word completion (^N/^R/^X^]) - force '.' inclusion -+function ada#Completion (cmd) -+ set iskeyword+=46 -+ return a:cmd . "\=ada#Completion_End ()\" -+endfunction ada#Completion -+ -+" Section: ada#Completion_End () {{{2 -+" -+function ada#Completion_End () -+ set iskeyword-=46 -+ return '' -+endfunction ada#Completion_End -+ -+" Section: ada#Create_Tags {{{1 -+" -+function ada#Create_Tags (option) -+ if a:option == 'file' -+ let l:Filename = fnamemodify (bufname ('%'), ':p') -+ elseif a:option == 'dir' -+ let l:Filename = -+ \ fnamemodify (bufname ('%'), ':p:h') . "*.ada " . -+ \ fnamemodify (bufname ('%'), ':p:h') . "*.adb " . -+ \ fnamemodify (bufname ('%'), ':p:h') . "*.ads" -+ else -+ let l:Filename = a:option -+ endif -+ execute '!ctags --excmd=number ' . l:Filename -+endfunction ada#Create_Tags -+ -+" Section: ada#Switch_Session {{{1 -+" -+function ada#Switch_Session (New_Session) -+ " -+ " you should not save to much date into the seession since they will -+ " be sourced -+ " -+ set sessionoptions=buffers,curdir,folds,globals,resize,slash,tabpages,tabpages,unix,winpos,winsize -+ -+ if a:New_Session != v:this_session -+ " -+ " We actualy got a new session - otherwise there -+ " is nothing to do. -+ " -+ if strlen (v:this_session) > 0 -+ execute 'mksession! ' . v:this_session -+ endif -+ -+ let v:this_session = a:New_Session -+ -+ "if filereadable (v:this_session) -+ "execute 'source ' . v:this_session -+ "endif -+ -+ augroup ada_session -+ autocmd! -+ autocmd VimLeavePre * execute 'mksession! ' . v:this_session -+ augroup END -+ " -+ "if exists ("g:Tlist_Auto_Open") && g:Tlist_Auto_Open -+ "TlistOpen -+ "endif -+ -+ endif -+ -+ return -+endfunction ada#Switch_Session -+ -+" Section: GNAT Pretty Printer folding {{{1 -+" -+if exists('g:ada_folding') && g:ada_folding[0] == 'g' -+ " -+ " Lines consisting only of ')' ';' are due to a gnat pretty bug and -+ " have the same level as the line above (can't happen in the first -+ " line). -+ " -+ let s:Fold_Collate = '^\([;)]*$\|' -+ -+ " -+ " some lone statements are folded with the line above -+ " -+ if stridx (g:ada_folding, 'i') >= 0 -+ let s:Fold_Collate .= '\s\+\$\|' -+ endif -+ if stridx (g:ada_folding, 'b') >= 0 -+ let s:Fold_Collate .= '\s\+\$\|' -+ endif -+ if stridx (g:ada_folding, 'p') >= 0 -+ let s:Fold_Collate .= '\s\+\$\|' -+ endif -+ if stridx (g:ada_folding, 'x') >= 0 -+ let s:Fold_Collate .= '\s\+\$\|' -+ endif -+ -+ " We also handle empty lines and -+ " comments here. -+ let s:Fold_Collate .= '--\)' -+ -+ function ada#Pretty_Print_Folding (Line) " {{{2 -+ let l:Text = getline (a:Line) -+ -+ if l:Text =~ s:Fold_Collate -+ " -+ " fold with line above -+ " -+ let l:Level = "=" -+ elseif l:Text =~ '^\s\+(' -+ " -+ " gnat outdents a line which stards with a ( by one characters so -+ " that parameters which follow are aligned. -+ " -+ let l:Level = (indent (a:Line) + 1) / &shiftwidth -+ else -+ let l:Level = indent (a:Line) / &shiftwidth -+ endif -+ -+ return l:Level -+ endfunction ada#Pretty_Print_Folding " }}}2 -+endif -+ -+" Section: Options and Menus {{{1 -+" -+" Section: ada#Switch_Syntax_Options {{{2 -+" -+function ada#Switch_Syntax_Option (option) -+ syntax off -+ if exists ('g:ada_' . a:option) -+ unlet g:ada_{a:option} -+ echo a:option . 'now off' -+ else -+ let g:ada_{a:option}=1 -+ echo a:option . 'now on' -+ endif -+ syntax on -+endfunction ada#Switch_Syntax_Option -+ -+" Section: ada#Map_Menu {{{2 -+" -+function ada#Map_Menu (Text, Keys, Command) -+ if a:Keys[0] == ':' -+ execute -+ \ "50amenu " . -+ \ "Ada." . escape(a:Text, ' ') . -+ \ "" . a:Keys . -+ \ " :" . a:Command . "" -+ execute -+ \ "command -buffer " . -+ \ a:Keys[1:] . -+ \" :" . a:Command . "" -+ elseif a:Keys[0] == '<' -+ execute -+ \ "50amenu " . -+ \ "Ada." . escape(a:Text, ' ') . -+ \ "" . a:Keys . -+ \ " :" . a:Command . "" -+ execute -+ \ "nnoremap " . -+ \ a:Keys . -+ \" :" . a:Command . "" -+ execute -+ \ "inoremap " . -+ \ a:Keys . -+ \" :" . a:Command . "" -+ else -+ if exists("g:mapleader") -+ let l:leader = g:mapleader -+ else -+ let l:leader = '\' -+ endif -+ execute -+ \ "50amenu " . -+ \ "Ada." . escape(a:Text, ' ') . -+ \ "" . escape(l:leader . "a" . a:Keys , '\') . -+ \ " :" . a:Command . "" -+ execute -+ \ "nnoremap " . -+ \ escape(l:leader . "a" . a:Keys , '\') . -+ \" :" . a:Command -+ execute -+ \ "inoremap " . -+ \ escape(l:leader . "a" . a:Keys , '\') . -+ \" :" . a:Command -+ endif -+ return -+endfunction -+ -+" Section: ada#Map_Popup {{{2 -+" -+function ada#Map_Popup (Text, Keys, Command) -+ if exists("g:mapleader") -+ let l:leader = g:mapleader -+ else -+ let l:leader = '\' -+ endif -+ execute -+ \ "50amenu " . -+ \ "PopUp." . escape(a:Text, ' ') . -+ \ "" . escape(l:leader . "a" . a:Keys , '\') . -+ \ " :" . a:Command . "" -+ -+ call ada#Map_Menu (a:Text, a:Keys, a:Command) -+ return -+endfunction ada#Map_Popup -+ -+" }}}1 -+ -+lockvar g:ada#WordRegex -+lockvar g:ada#DotWordRegex -+lockvar g:ada#Comment -+lockvar! g:ada#Keywords -+lockvar! g:ada#Ctags_Kinds -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/autoload/decada.vim vim71_ada/1/autoload/decada.vim ---- vim71/1/autoload/decada.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/decada.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,75 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada/Dec Ada compiler file -+" Language: Ada (Dec Ada) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ -+" History: 21.07.2006 MK New Dec Ada -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested not to use include protection for -+" autoload -+" 05.11.2006 MK Bram suggested to save on spaces -+" Help Page: compiler-decada -+"------------------------------------------------------------------------------ -+ -+if version < 700 -+ finish -+endif -+ -+function decada#Unit_Name () dict " {{{1 -+ " Convert filename into acs unit: -+ " 1: remove the file extenstion. -+ " 2: replace all double '_' or '-' with an dot (which denotes a separate) -+ " 3: remove a trailing '_' (wich denotes a specification) -+ return substitute (substitute (expand ("%:t:r"), '__\|-', ".", "g"), '_$', "", '') -+endfunction decada#Unit_Name " }}}1 -+ -+function decada#Make () dict " {{{1 -+ let l:make_prg = substitute (g:self.Make_Command, '%<', self.Unit_Name(), '') -+ let &errorformat = g:self.Error_Format -+ let &makeprg = l:make_prg -+ wall -+ make -+ copen -+ set wrap -+ wincmd W -+endfunction decada#Build " }}}1 -+ -+function decada#Set_Session (...) dict " {{{1 -+ if a:0 > 0 -+ call ada#Switch_Session (a:1) -+ elseif argc() == 0 && strlen (v:servername) > 0 -+ call ada#Switch_Session ( -+ \ expand('~')[0:-2] . ".vimfiles.session]decada_" . -+ \ v:servername . ".vim") -+ endif -+ return -+endfunction decada#Set_Session " }}}1 -+ -+function decada#New () " }}}1 -+ let Retval = { -+ \ 'Make' : function ('decada#Make'), -+ \ 'Unit_Name' : function ('decada#Unit_Name'), -+ \ 'Set_Session' : function ('decada#Set_Session'), -+ \ 'Project_Dir' : '', -+ \ 'Make_Command' : 'ACS COMPILE /Wait /Log /NoPreLoad /Optimize=Development /Debug %<', -+ \ 'Error_Format' : '%+A%%ADAC-%t-%m,%C %#%m,%Zat line number %l in file %f,' . -+ \ '%+I%%ada-I-%m,%C %#%m,%Zat line number %l in file %f'} -+ -+ return Retval -+endfunction decada#New " }}}1 -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/autoload/gnat.vim vim71_ada/1/autoload/gnat.vim ---- vim71/1/autoload/gnat.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/gnat.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,147 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada/GNAT compiler file -+" Language: Ada (GNAT) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischi k -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ -+" History: 24.05.2006 MK Unified Headers -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 05.08.2006 MK Add session support -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested not to use include protection for -+" autoload -+" 05.11.2006 MK Bram suggested to save on spaces -+" 19.09.2007 NO use project file only when there is a project -+" Help Page: compiler-gnat -+"------------------------------------------------------------------------------ -+ -+if version < 700 -+ finish -+endif -+ -+function gnat#Make () dict " {{{1 -+ let &l:makeprg = self.Get_Command('Make') -+ let &l:errorformat = self.Error_Format -+ wall -+ make -+ copen -+ set wrap -+ wincmd W -+endfunction gnat#Make " }}}1 -+ -+function gnat#Pretty () dict " {{{1 -+ execute "!" . self.Get_Command('Pretty') -+endfunction gnat#Make " }}}1 -+ -+function gnat#Find () dict " {{{1 -+ execute "!" . self.Get_Command('Find') -+endfunction gnat#Find " }}}1 -+ -+function gnat#Tags () dict " {{{1 -+ execute "!" . self.Get_Command('Tags') -+ edit tags -+ call gnat#Insert_Tags_Header () -+ update -+ quit -+endfunction gnat#Tags " }}}1 -+ -+function gnat#Set_Project_File (...) dict " {{{1 -+ if a:0 > 0 -+ let self.Project_File = a:1 -+ -+ if ! filereadable (self.Project_File) -+ let self.Project_File = findfile ( -+ \ fnamemodify (self.Project_File, ':r'), -+ \ $ADA_PROJECT_PATH, -+ \ 1) -+ endif -+ elseif strlen (self.Project_File) > 0 -+ let self.Project_File = browse (0, 'GNAT Project File?', '', self.Project_File) -+ elseif expand ("%:e") == 'gpr' -+ let self.Project_File = browse (0, 'GNAT Project File?', '', expand ("%:e")) -+ else -+ let self.Project_File = browse (0, 'GNAT Project File?', '', 'default.gpr') -+ endif -+ -+ if strlen (v:this_session) > 0 -+ execute 'mksession! ' . v:this_session -+ endif -+ -+ "if strlen (self.Project_File) > 0 -+ "if has("vms") -+ "call ada#Switch_Session ( -+ "\ expand('~')[0:-2] . ".vimfiles.session]gnat_" . -+ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") -+ "else -+ "call ada#Switch_Session ( -+ "\ expand('~') . "/vimfiles/session/gnat_" . -+ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") -+ "endif -+ "else -+ "call ada#Switch_Session ('') -+ "endif -+ -+ return -+endfunction gnat#Set_Project_File " }}}1 -+ -+function gnat#Get_Command (Command) dict " {{{1 -+ let l:Command = eval ('self.' . a:Command . '_Command') -+ return eval (l:Command) -+endfunction gnat#Get_Command " }}}1 -+ -+function gnat#Set_Session (...) dict " {{{1 -+ if argc() == 1 && fnamemodify (argv(0), ':e') == 'gpr' -+ call self.Set_Project_File (argv(0)) -+ elseif strlen (v:servername) > 0 -+ call self.Set_Project_File (v:servername . '.gpr') -+ endif -+endfunction gnat#Set_Session " }}}1 -+ -+function gnat#New () " {{{1 -+ let l:Retval = { -+ \ 'Make' : function ('gnat#Make'), -+ \ 'Pretty' : function ('gnat#Pretty'), -+ \ 'Find' : function ('gnat#Find'), -+ \ 'Tags' : function ('gnat#Tags'), -+ \ 'Set_Project_File' : function ('gnat#Set_Project_File'), -+ \ 'Set_Session' : function ('gnat#Set_Session'), -+ \ 'Get_Command' : function ('gnat#Get_Command'), -+ \ 'Project_File' : '', -+ \ 'Make_Command' : '"gnat make -P " . self.Project_File . " -F -gnatef "', -+ \ 'Pretty_Command' : '"gnat pretty -P " . self.Project_File . " "', -+ \ 'Find_Program' : '"gnat find -P " . self.Project_File . " -F "', -+ \ 'Tags_Command' : '"gnat xref -P " . self.Project_File . " -v *.AD*"', -+ \ 'Error_Format' : '%f:%l:%c: %trror: %m,' . -+ \ '%f:%l:%c: %tarning: %m,' . -+ \ '%f:%l:%c: (%ttyle) %m'} -+ -+ return l:Retval -+endfunction gnat#New " }}}1 -+ -+function gnat#Insert_Tags_Header () " {{{1 -+ 1insert -+!_TAG_FILE_FORMAT 1 /extended format; --format=1 will not append ;" to lines/ -+!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ -+!_TAG_PROGRAM_AUTHOR AdaCore /info@adacore.com/ -+!_TAG_PROGRAM_NAME gnatxref // -+!_TAG_PROGRAM_URL http://www.adacore.com /official site/ -+!_TAG_PROGRAM_VERSION 5.05w // -+. -+ return -+endfunction gnat#Insert_Tags_Header " }}}1 -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=0 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/autoload/.svn/all-wcprops vim71_ada/1/autoload/.svn/all-wcprops ---- vim71/1/autoload/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,29 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 53 -+/svnroot/gnuada/!svn/ver/825/trunk/tools/vim/autoload -+END -+ada.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 61 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/autoload/ada.vim -+END -+gnat.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 62 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/autoload/gnat.vim -+END -+adacomplete.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 69 -+/svnroot/gnuada/!svn/ver/825/trunk/tools/vim/autoload/adacomplete.vim -+END -+decada.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 64 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/autoload/decada.vim -+END -diff -urN vim71/1/autoload/.svn/dir-prop-base vim71_ada/1/autoload/.svn/dir-prop-base ---- vim71/1/autoload/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,6 @@ -+K 10 -+svn:ignore -+V 9 -+.backups -+ -+END -diff -urN vim71/1/autoload/.svn/entries vim71_ada/1/autoload/.svn/entries ---- vim71/1/autoload/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/entries 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,80 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-12-09T13:34:03.484664Z -+825 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -+ada.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+d052f84bf31bdcf8b2f2e3ad61717ad6 -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -+gnat.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+e159890b42c4a6d597df518684074471 -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -+adacomplete.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+93cc71b15159672b98a58fafd628840f -+2007-12-09T13:34:03.484664Z -+825 -+krischik -+has-props -+ -+decada.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+4547173c4d23fb524fa6763408c928cf -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -diff -urN vim71/1/autoload/.svn/format vim71_ada/1/autoload/.svn/format ---- vim71/1/autoload/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/format 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/autoload/.svn/prop-base/adacomplete.vim.svn-base vim71_ada/1/autoload/.svn/prop-base/adacomplete.vim.svn-base ---- vim71/1/autoload/.svn/prop-base/adacomplete.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/prop-base/adacomplete.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/autoload/.svn/prop-base/ada.vim.svn-base vim71_ada/1/autoload/.svn/prop-base/ada.vim.svn-base ---- vim71/1/autoload/.svn/prop-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/prop-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/autoload/.svn/prop-base/decada.vim.svn-base vim71_ada/1/autoload/.svn/prop-base/decada.vim.svn-base ---- vim71/1/autoload/.svn/prop-base/decada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/prop-base/decada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/autoload/.svn/prop-base/gnat.vim.svn-base vim71_ada/1/autoload/.svn/prop-base/gnat.vim.svn-base ---- vim71/1/autoload/.svn/prop-base/gnat.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/prop-base/gnat.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/autoload/.svn/text-base/adacomplete.vim.svn-base vim71_ada/1/autoload/.svn/text-base/adacomplete.vim.svn-base ---- vim71/1/autoload/.svn/text-base/adacomplete.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/text-base/adacomplete.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,109 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada omnicompletion file -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL$ -+" History: 24.05.2006 MK Unified Headers -+" 26.05.2006 MK improved search for begin of word. -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested not to use include protection for -+" autoload -+" 05.11.2006 MK Bram suggested agaist using setlocal omnifunc -+" 05.11.2006 MK Bram suggested to save on spaces -+" Help Page: ft-ada-omni -+"------------------------------------------------------------------------------ -+ -+if version < 700 -+ finish -+endif -+ -+" Section: adacomplete#Complete () {{{1 -+" -+" This function is used for the 'omnifunc' option. -+" -+function! adacomplete#Complete (findstart, base) -+ if a:findstart == 1 -+ return ada#User_Complete (a:findstart, a:base) -+ else -+ " -+ " look up matches -+ " -+ if exists ("g:ada_omni_with_keywords") -+ call ada#User_Complete (a:findstart, a:base) -+ endif -+ " -+ " search tag file for matches -+ " -+ let l:Pattern = '^' . a:base . '.*$' -+ let l:Tag_List = taglist (l:Pattern) -+ " -+ " add symbols -+ " -+ for Tag_Item in l:Tag_List -+ if l:Tag_Item['kind'] == '' -+ " -+ " Tag created by gnat xref -+ " -+ let l:Match_Item = { -+ \ 'word': l:Tag_Item['name'], -+ \ 'menu': l:Tag_Item['filename'], -+ \ 'info': "Symbol from file " . l:Tag_Item['filename'] . " line " . l:Tag_Item['cmd'], -+ \ 'kind': 's', -+ \ 'icase': 1} -+ else -+ " -+ " Tag created by ctags -+ " -+ let l:Info = 'Symbol : ' . l:Tag_Item['name'] . "\n" -+ let l:Info .= 'Of type : ' . g:ada#Ctags_Kinds[l:Tag_Item['kind']][1] . "\n" -+ let l:Info .= 'Defined in File : ' . l:Tag_Item['filename'] . "\n" -+ -+ if has_key( l:Tag_Item, 'package') -+ let l:Info .= 'Package : ' . l:Tag_Item['package'] . "\n" -+ let l:Menu = l:Tag_Item['package'] -+ elseif has_key( l:Tag_Item, 'separate') -+ let l:Info .= 'Separate from Package : ' . l:Tag_Item['separate'] . "\n" -+ let l:Menu = l:Tag_Item['separate'] -+ elseif has_key( l:Tag_Item, 'packspec') -+ let l:Info .= 'Package Specification : ' . l:Tag_Item['packspec'] . "\n" -+ let l:Menu = l:Tag_Item['packspec'] -+ elseif has_key( l:Tag_Item, 'type') -+ let l:Info .= 'Datetype : ' . l:Tag_Item['type'] . "\n" -+ let l:Menu = l:Tag_Item['type'] -+ else -+ let l:Menu = l:Tag_Item['filename'] -+ endif -+ -+ let l:Match_Item = { -+ \ 'word': l:Tag_Item['name'], -+ \ 'menu': l:Menu, -+ \ 'info': l:Info, -+ \ 'kind': l:Tag_Item['kind'], -+ \ 'icase': 1} -+ endif -+ if complete_add (l:Match_Item) == 0 -+ return [] -+ endif -+ if complete_check () -+ return [] -+ endif -+ endfor -+ return [] -+ endif -+endfunction adacomplete#Complete -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/autoload/.svn/text-base/ada.vim.svn-base vim71_ada/1/autoload/.svn/text-base/ada.vim.svn-base ---- vim71/1/autoload/.svn/text-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/text-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,624 @@ -+"------------------------------------------------------------------------------ -+" Description: Perform Ada specific completion & tagging. -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Maintainer: Martin Krischik -+" Taylor Venable -+" Neil Bird -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL$ -+" History: 24.05.2006 MK Unified Headers -+" 26.05.2006 MK ' should not be in iskeyword. -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 02.10.2006 MK Better folding. -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested not to use include protection for -+" autoload -+" 05.11.2006 MK Bram suggested to save on spaces -+" 08.07.2007 TV fix mapleader problems. -+" 09.05.2007 MK Session just won't work no matter how much -+" tweaking is done -+" 19.09.2007 NO still some mapleader problems -+" Help Page: ft-ada-functions -+"------------------------------------------------------------------------------ -+ -+if version < 700 -+ finish -+endif -+ -+" Section: Constants {{{1 -+" -+let g:ada#DotWordRegex = '\a\w*\(\_s*\.\_s*\a\w*\)*' -+let g:ada#WordRegex = '\a\w*' -+let g:ada#Comment = "\\v^(\"[^\"]*\"|'.'|[^\"']){-}\\zs\\s*--.*" -+let g:ada#Keywords = [] -+ -+" Section: g:ada#Keywords {{{1 -+" -+" Section: add Ada keywords {{{2 -+" -+for Item in ['abort', 'else', 'new', 'return', 'abs', 'elsif', 'not', 'reverse', 'abstract', 'end', 'null', 'accept', 'entry', 'select', 'access', 'exception', 'of', 'separate', 'aliased', 'exit', 'or', 'subtype', 'all', 'others', 'synchronized', 'and', 'for', 'out', 'array', 'function', 'overriding', 'tagged', 'at', 'task', 'generic', 'package', 'terminate', 'begin', 'goto', 'pragma', 'then', 'body', 'private', 'type', 'if', 'procedure', 'case', 'in', 'protected', 'until', 'constant', 'interface', 'use', 'is', 'raise', 'declare', 'range', 'when', 'delay', 'limited', 'record', 'while', 'delta', 'loop', 'rem', 'with', 'digits', 'renames', 'do', 'mod', 'requeue', 'xor'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'keyword', -+ \ 'info': 'Ada keyword.', -+ \ 'kind': 'k', -+ \ 'icase': 1}] -+endfor -+ -+" Section: GNAT Project Files {{{3 -+" -+if exists ('g:ada_with_gnat_project_files') -+ for Item in ['project'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'keyword', -+ \ 'info': 'GNAT projectfile keyword.', -+ \ 'kind': 'k', -+ \ 'icase': 1}] -+ endfor -+endif -+ -+" Section: add standart exception {{{2 -+" -+for Item in ['Constraint_Error', 'Program_Error', 'Storage_Error', 'Tasking_Error', 'Status_Error', 'Mode_Error', 'Name_Error', 'Use_Error', 'Device_Error', 'End_Error', 'Data_Error', 'Layout_Error', 'Length_Error', 'Pattern_Error', 'Index_Error', 'Translation_Error', 'Time_Error', 'Argument_Error', 'Tag_Error', 'Picture_Error', 'Terminator_Error', 'Conversion_Error', 'Pointer_Error', 'Dereference_Error', 'Update_Error'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'exception', -+ \ 'info': 'Ada standart exception.', -+ \ 'kind': 'x', -+ \ 'icase': 1}] -+endfor -+ -+" Section: add GNAT exception {{{3 -+" -+if exists ('g:ada_gnat_extensions') -+ for Item in ['Assert_Failure'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'exception', -+ \ 'info': 'GNAT exception.', -+ \ 'kind': 'x', -+ \ 'icase': 1}] -+ endfor -+endif -+ -+" Section: add Ada buildin types {{{2 -+" -+for Item in ['Boolean', 'Integer', 'Natural', 'Positive', 'Float', 'Character', 'Wide_Character', 'Wide_Wide_Character', 'String', 'Wide_String', 'Wide_Wide_String', 'Duration'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'type', -+ \ 'info': 'Ada buildin type.', -+ \ 'kind': 't', -+ \ 'icase': 1}] -+endfor -+ -+" Section: add GNAT buildin types {{{3 -+" -+if exists ('g:ada_gnat_extensions') -+ for Item in ['Short_Integer', 'Short_Short_Integer', 'Long_Integer', 'Long_Long_Integer', 'Short_Float', 'Short_Short_Float', 'Long_Float', 'Long_Long_Float'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'type', -+ \ 'info': 'GNAT buildin type.', -+ \ 'kind': 't', -+ \ 'icase': 1}] -+ endfor -+endif -+ -+" Section: add Ada Attributes {{{2 -+" -+for Item in ['''Access', '''Address', '''Adjacent', '''Aft', '''Alignment', '''Base', '''Bit_Order', '''Body_Version', '''Callable', '''Caller', '''Ceiling', '''Class', '''Component_Size', '''Compose', '''Constrained', '''Copy_Sign', '''Count', '''Definite', '''Delta', '''Denorm', '''Digits', '''Emax', '''Exponent', '''External_Tag', '''Epsilon', '''First', '''First_Bit', '''Floor', '''Fore', '''Fraction', '''Identity', '''Image', '''Input', '''Large', '''Last', '''Last_Bit', '''Leading_Part', '''Length', '''Machine', '''Machine_Emax', '''Machine_Emin', '''Machine_Mantissa', '''Machine_Overflows', '''Machine_Radix', '''Machine_Rounding', '''Machine_Rounds', '''Mantissa', '''Max', '''Max_Size_In_Storage_Elements', '''Min', '''Mod', '''Model', '''Model_Emin', '''Model_Epsilon', '''Model_Mantissa', '''Model_Small', '''Modulus', '''Output', '''Partition_ID', '''Pos', '''Position', '''Pred', '''Priority', '''Range', '''Read', '''Remainder', '''Round', '''Rounding', '''Safe_Emax', '''Safe_First', '''Safe_Large', '''Safe_Last', '''Safe_Small', '''Scale', '''Scaling', '''Signed_Zeros', '''Size', '''Small', '''Storage_Pool', '''Storage_Size', '''Stream_Size', '''Succ', '''Tag', '''Terminated', '''Truncation', '''Unbiased_Rounding', '''Unchecked_Access', '''Val', '''Valid', '''Value', '''Version', '''Wide_Image', '''Wide_Value', '''Wide_Wide_Image', '''Wide_Wide_Value', '''Wide_Wide_Width', '''Wide_Width', '''Width', '''Write'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'attribute', -+ \ 'info': 'Ada attribute.', -+ \ 'kind': 'a', -+ \ 'icase': 1}] -+endfor -+ -+" Section: add GNAT Attributes {{{3 -+" -+if exists ('g:ada_gnat_extensions') -+ for Item in ['''Abort_Signal', '''Address_Size', '''Asm_Input', '''Asm_Output', '''AST_Entry', '''Bit', '''Bit_Position', '''Code_Address', '''Default_Bit_Order', '''Elaborated', '''Elab_Body', '''Elab_Spec', '''Emax', '''Enum_Rep', '''Epsilon', '''Fixed_Value', '''Has_Access_Values', '''Has_Discriminants', '''Img', '''Integer_Value', '''Machine_Size', '''Max_Interrupt_Priority', '''Max_Priority', '''Maximum_Alignment', '''Mechanism_Code', '''Null_Parameter', '''Object_Size', '''Passed_By_Reference', '''Range_Length', '''Storage_Unit', '''Target_Name', '''Tick', '''To_Address', '''Type_Class', '''UET_Address', '''Unconstrained_Array', '''Universal_Literal_String', '''Unrestricted_Access', '''VADS_Size', '''Value_Size', '''Wchar_T_Size', '''Word_Size'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'attribute', -+ \ 'info': 'GNAT attribute.', -+ \ 'kind': 'a', -+ \ 'icase': 1}] -+ endfor -+endif -+ -+" Section: add Ada Pragmas {{{2 -+" -+for Item in ['All_Calls_Remote', 'Assert', 'Assertion_Policy', 'Asynchronous', 'Atomic', 'Atomic_Components', 'Attach_Handler', 'Controlled', 'Convention', 'Detect_Blocking', 'Discard_Names', 'Elaborate', 'Elaborate_All', 'Elaborate_Body', 'Export', 'Import', 'Inline', 'Inspection_Point', 'Interface (Obsolescent)', 'Interrupt_Handler', 'Interrupt_Priority', 'Linker_Options', 'List', 'Locking_Policy', 'Memory_Size (Obsolescent)', 'No_Return', 'Normalize_Scalars', 'Optimize', 'Pack', 'Page', 'Partition_Elaboration_Policy', 'Preelaborable_Initialization', 'Preelaborate', 'Priority', 'Priority_Specific_Dispatching', 'Profile', 'Pure', 'Queueing_Policy', 'Relative_Deadline', 'Remote_Call_Interface', 'Remote_Types', 'Restrictions', 'Reviewable', 'Shared (Obsolescent)', 'Shared_Passive', 'Storage_Size', 'Storage_Unit (Obsolescent)', 'Suppress', 'System_Name (Obsolescent)', 'Task_Dispatching_Policy', 'Unchecked_Union', 'Unsuppress', 'Volatile', 'Volatile_Components'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'pragma', -+ \ 'info': 'Ada pragma.', -+ \ 'kind': 'p', -+ \ 'icase': 1}] -+endfor -+ -+" Section: add GNAT Pragmas {{{3 -+" -+if exists ('g:ada_gnat_extensions') -+ for Item in ['Abort_Defer', 'Ada_83', 'Ada_95', 'Ada_05', 'Annotate', 'Ast_Entry', 'C_Pass_By_Copy', 'Comment', 'Common_Object', 'Compile_Time_Warning', 'Complex_Representation', 'Component_Alignment', 'Convention_Identifier', 'CPP_Class', 'CPP_Constructor', 'CPP_Virtual', 'CPP_Vtable', 'Debug', 'Elaboration_Checks', 'Eliminate', 'Export_Exception', 'Export_Function', 'Export_Object', 'Export_Procedure', 'Export_Value', 'Export_Valued_Procedure', 'Extend_System', 'External', 'External_Name_Casing', 'Finalize_Storage_Only', 'Float_Representation', 'Ident', 'Import_Exception', 'Import_Function', 'Import_Object', 'Import_Procedure', 'Import_Valued_Procedure', 'Initialize_Scalars', 'Inline_Always', 'Inline_Generic', 'Interface_Name', 'Interrupt_State', 'Keep_Names', 'License', 'Link_With', 'Linker_Alias', 'Linker_Section', 'Long_Float', 'Machine_Attribute', 'Main_Storage', 'Obsolescent', 'Passive', 'Polling', 'Profile_Warnings', 'Propagate_Exceptions', 'Psect_Object', 'Pure_Function', 'Restriction_Warnings', 'Source_File_Name', 'Source_File_Name_Project', 'Source_Reference', 'Stream_Convert', 'Style_Checks', 'Subtitle', 'Suppress_All', 'Suppress_Exception_Locations', 'Suppress_Initialization', 'Task_Info', 'Task_Name', 'Task_Storage', 'Thread_Body', 'Time_Slice', 'Title', 'Unimplemented_Unit', 'Universal_Data', 'Unreferenced', 'Unreserve_All_Interrupts', 'Use_VADS_Size', 'Validity_Checks', 'Warnings', 'Weak_External'] -+ let g:ada#Keywords += [{ -+ \ 'word': Item, -+ \ 'menu': 'pragma', -+ \ 'info': 'GNAT pragma.', -+ \ 'kind': 'p', -+ \ 'icase': 1}] -+ endfor -+endif -+" 1}}} -+ -+" Section: g:ada#Ctags_Kinds {{{1 -+" -+let g:ada#Ctags_Kinds = { -+ \ 'P': ["packspec", "package specifications"], -+ \ 'p': ["package", "packages"], -+ \ 'T': ["typespec", "type specifications"], -+ \ 't': ["type", "types"], -+ \ 'U': ["subspec", "subtype specifications"], -+ \ 'u': ["subtype", "subtypes"], -+ \ 'c': ["component", "record type components"], -+ \ 'l': ["literal", "enum type literals"], -+ \ 'V': ["varspec", "variable specifications"], -+ \ 'v': ["variable", "variables"], -+ \ 'f': ["formal", "generic formal parameters"], -+ \ 'n': ["constant", "constants"], -+ \ 'x': ["exception", "user defined exceptions"], -+ \ 'R': ["subprogspec", "subprogram specifications"], -+ \ 'r': ["subprogram", "subprograms"], -+ \ 'K': ["taskspec", "task specifications"], -+ \ 'k': ["task", "tasks"], -+ \ 'O': ["protectspec", "protected data specifications"], -+ \ 'o': ["protected", "protected data"], -+ \ 'E': ["entryspec", "task/protected data entry specifications"], -+ \ 'e': ["entry", "task/protected data entries"], -+ \ 'b': ["label", "labels"], -+ \ 'i': ["identifier", "loop/declare identifiers"], -+ \ 'a': ["autovar", "automatic variables"], -+ \ 'y': ["annon", "loops and blocks with no identifier"]} -+ -+" Section: ada#Word (...) {{{1 -+" -+" Extract current Ada word across multiple lines -+" AdaWord ([line, column])\ -+" -+function ada#Word (...) -+ if a:0 > 1 -+ let l:Line_Nr = a:1 -+ let l:Column_Nr = a:2 - 1 -+ else -+ let l:Line_Nr = line('.') -+ let l:Column_Nr = col('.') - 1 -+ endif -+ -+ let l:Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' ) -+ -+ " Cope with tag searching for items in comments; if we are, don't loop -+ " backards looking for previous lines -+ if l:Column_Nr > strlen(l:Line) -+ " We were in a comment -+ let l:Line = getline(l:Line_Nr) -+ let l:Search_Prev_Lines = 0 -+ else -+ let l:Search_Prev_Lines = 1 -+ endif -+ -+ " Go backwards until we find a match (Ada ID) that *doesn't* include our -+ " location - i.e., the previous ID. This is because the current 'correct' -+ " match will toggle matching/not matching as we traverse characters -+ " backwards. Thus, we have to find the previous unrelated match, exclude -+ " it, then use the next full match (ours). -+ " Remember to convert vim column 'l:Column_Nr' [1..n] to string offset [0..(n-1)] -+ " ... but start, here, one after the required char. -+ let l:New_Column = l:Column_Nr + 1 -+ while 1 -+ let l:New_Column = l:New_Column - 1 -+ if l:New_Column < 0 -+ " Have to include previous l:Line from file -+ let l:Line_Nr = l:Line_Nr - 1 -+ if l:Line_Nr < 1 || !l:Search_Prev_Lines -+ " Start of file or matching in a comment -+ let l:Line_Nr = 1 -+ let l:New_Column = 0 -+ let l:Our_Match = match (l:Line, g:ada#WordRegex ) -+ break -+ endif -+ " Get previous l:Line, and prepend it to our search string -+ let l:New_Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' ) -+ let l:New_Column = strlen (l:New_Line) - 1 -+ let l:Column_Nr = l:Column_Nr + l:New_Column -+ let l:Line = l:New_Line . l:Line -+ endif -+ " Check to see if this is a match excluding 'us' -+ let l:Match_End = l:New_Column + -+ \ matchend (strpart (l:Line,l:New_Column), g:ada#WordRegex ) - 1 -+ if l:Match_End >= l:New_Column && -+ \ l:Match_End < l:Column_Nr -+ " Yes -+ let l:Our_Match = l:Match_End+1 + -+ \ match (strpart (l:Line,l:Match_End+1), g:ada#WordRegex ) -+ break -+ endif -+ endwhile -+ -+ " Got anything? -+ if l:Our_Match < 0 -+ return '' -+ else -+ let l:Line = strpart (l:Line, l:Our_Match) -+ endif -+ -+ " Now simply add further lines until the match gets no bigger -+ let l:Match_String = matchstr (l:Line, g:ada#WordRegex) -+ let l:Last_Line = line ('$') -+ let l:Line_Nr = line ('.') + 1 -+ while l:Line_Nr <= l:Last_Line -+ let l:Last_Match = l:Match_String -+ let l:Line = l:Line . -+ \ substitute (getline (l:Line_Nr), g:ada#Comment, '', '') -+ let l:Match_String = matchstr (l:Line, g:ada#WordRegex) -+ if l:Match_String == l:Last_Match -+ break -+ endif -+ endwhile -+ -+ " Strip whitespace & return -+ return substitute (l:Match_String, '\s\+', '', 'g') -+endfunction ada#Word -+ -+" Section: ada#List_Tag (...) {{{1 -+" -+" List tags in quickfix window -+" -+function ada#List_Tag (...) -+ if a:0 > 1 -+ let l:Tag_Word = ada#Word (a:1, a:2) -+ elseif a:0 > 0 -+ let l:Tag_Word = a:1 -+ else -+ let l:Tag_Word = ada#Word () -+ endif -+ -+ echo "Searching for" l:Tag_Word -+ -+ let l:Pattern = '^' . l:Tag_Word . '$' -+ let l:Tag_List = taglist (l:Pattern) -+ let l:Error_List = [] -+ " -+ " add symbols -+ " -+ for Tag_Item in l:Tag_List -+ if l:Tag_Item['kind'] == '' -+ let l:Tag_Item['kind'] = 's' -+ endif -+ -+ let l:Error_List += [ -+ \ l:Tag_Item['filename'] . '|' . -+ \ l:Tag_Item['cmd'] . '|' . -+ \ l:Tag_Item['kind'] . "\t" . -+ \ l:Tag_Item['name'] ] -+ endfor -+ set errorformat=%f\|%l\|%m -+ cexpr l:Error_List -+ cwindow -+endfunction ada#List_Tag -+ -+" Section: ada#Jump_Tag (Word, Mode) {{{1 -+" -+" Word tag - include '.' and if Ada make uppercase -+" -+function ada#Jump_Tag (Word, Mode) -+ if a:Word == '' -+ " Get current word -+ let l:Word = ada#Word() -+ if l:Word == '' -+ throw "NOT_FOUND: no identifier found." -+ endif -+ else -+ let l:Word = a:Word -+ endif -+ -+ echo "Searching for " . l:Word -+ -+ try -+ execute a:Mode l:Word -+ catch /.*:E426:.*/ -+ let ignorecase = &ignorecase -+ set ignorecase -+ execute a:Mode l:Word -+ let &ignorecase = ignorecase -+ endtry -+ -+ return -+endfunction ada#Jump_Tag -+ -+" Section: ada#Insert_Backspace () {{{1 -+" -+" Backspace at end of line after auto-inserted commentstring '-- ' wipes it -+" -+function ada#Insert_Backspace () -+ let l:Line = getline ('.') -+ if col ('.') > strlen (l:Line) && -+ \ match (l:Line, '-- $') != -1 && -+ \ match (&comments,'--') != -1 -+ return "\\\" -+ else -+ return "\" -+ endif -+ -+ return -+endfunction ada#InsertBackspace -+ -+" Section: Insert Completions {{{1 -+" -+" Section: ada#User_Complete(findstart, base) {{{2 -+" -+" This function is used for the 'complete' option. -+" -+function! ada#User_Complete(findstart, base) -+ if a:findstart == 1 -+ " -+ " locate the start of the word -+ " -+ let line = getline ('.') -+ let start = col ('.') - 1 -+ while start > 0 && line[start - 1] =~ '\i\|''' -+ let start -= 1 -+ endwhile -+ return start -+ else -+ " -+ " look up matches -+ " -+ let l:Pattern = '^' . a:base . '.*$' -+ " -+ " add keywords -+ " -+ for Tag_Item in g:ada#Keywords -+ if l:Tag_Item['word'] =~? l:Pattern -+ if complete_add (l:Tag_Item) == 0 -+ return [] -+ endif -+ if complete_check () -+ return [] -+ endif -+ endif -+ endfor -+ return [] -+ endif -+endfunction ada#User_Complete -+ -+" Section: ada#Completion (cmd) {{{2 -+" -+" Word completion (^N/^R/^X^]) - force '.' inclusion -+function ada#Completion (cmd) -+ set iskeyword+=46 -+ return a:cmd . "\=ada#Completion_End ()\" -+endfunction ada#Completion -+ -+" Section: ada#Completion_End () {{{2 -+" -+function ada#Completion_End () -+ set iskeyword-=46 -+ return '' -+endfunction ada#Completion_End -+ -+" Section: ada#Create_Tags {{{1 -+" -+function ada#Create_Tags (option) -+ if a:option == 'file' -+ let l:Filename = fnamemodify (bufname ('%'), ':p') -+ elseif a:option == 'dir' -+ let l:Filename = -+ \ fnamemodify (bufname ('%'), ':p:h') . "*.ada " . -+ \ fnamemodify (bufname ('%'), ':p:h') . "*.adb " . -+ \ fnamemodify (bufname ('%'), ':p:h') . "*.ads" -+ else -+ let l:Filename = a:option -+ endif -+ execute '!ctags --excmd=number ' . l:Filename -+endfunction ada#Create_Tags -+ -+" Section: ada#Switch_Session {{{1 -+" -+function ada#Switch_Session (New_Session) -+ " -+ " you should not save to much date into the seession since they will -+ " be sourced -+ " -+ set sessionoptions=buffers,curdir,folds,globals,resize,slash,tabpages,tabpages,unix,winpos,winsize -+ -+ if a:New_Session != v:this_session -+ " -+ " We actualy got a new session - otherwise there -+ " is nothing to do. -+ " -+ if strlen (v:this_session) > 0 -+ execute 'mksession! ' . v:this_session -+ endif -+ -+ let v:this_session = a:New_Session -+ -+ "if filereadable (v:this_session) -+ "execute 'source ' . v:this_session -+ "endif -+ -+ augroup ada_session -+ autocmd! -+ autocmd VimLeavePre * execute 'mksession! ' . v:this_session -+ augroup END -+ " -+ "if exists ("g:Tlist_Auto_Open") && g:Tlist_Auto_Open -+ "TlistOpen -+ "endif -+ -+ endif -+ -+ return -+endfunction ada#Switch_Session -+ -+" Section: GNAT Pretty Printer folding {{{1 -+" -+if exists('g:ada_folding') && g:ada_folding[0] == 'g' -+ " -+ " Lines consisting only of ')' ';' are due to a gnat pretty bug and -+ " have the same level as the line above (can't happen in the first -+ " line). -+ " -+ let s:Fold_Collate = '^\([;)]*$\|' -+ -+ " -+ " some lone statements are folded with the line above -+ " -+ if stridx (g:ada_folding, 'i') >= 0 -+ let s:Fold_Collate .= '\s\+\$\|' -+ endif -+ if stridx (g:ada_folding, 'b') >= 0 -+ let s:Fold_Collate .= '\s\+\$\|' -+ endif -+ if stridx (g:ada_folding, 'p') >= 0 -+ let s:Fold_Collate .= '\s\+\$\|' -+ endif -+ if stridx (g:ada_folding, 'x') >= 0 -+ let s:Fold_Collate .= '\s\+\$\|' -+ endif -+ -+ " We also handle empty lines and -+ " comments here. -+ let s:Fold_Collate .= '--\)' -+ -+ function ada#Pretty_Print_Folding (Line) " {{{2 -+ let l:Text = getline (a:Line) -+ -+ if l:Text =~ s:Fold_Collate -+ " -+ " fold with line above -+ " -+ let l:Level = "=" -+ elseif l:Text =~ '^\s\+(' -+ " -+ " gnat outdents a line which stards with a ( by one characters so -+ " that parameters which follow are aligned. -+ " -+ let l:Level = (indent (a:Line) + 1) / &shiftwidth -+ else -+ let l:Level = indent (a:Line) / &shiftwidth -+ endif -+ -+ return l:Level -+ endfunction ada#Pretty_Print_Folding " }}}2 -+endif -+ -+" Section: Options and Menus {{{1 -+" -+" Section: ada#Switch_Syntax_Options {{{2 -+" -+function ada#Switch_Syntax_Option (option) -+ syntax off -+ if exists ('g:ada_' . a:option) -+ unlet g:ada_{a:option} -+ echo a:option . 'now off' -+ else -+ let g:ada_{a:option}=1 -+ echo a:option . 'now on' -+ endif -+ syntax on -+endfunction ada#Switch_Syntax_Option -+ -+" Section: ada#Map_Menu {{{2 -+" -+function ada#Map_Menu (Text, Keys, Command) -+ if a:Keys[0] == ':' -+ execute -+ \ "50amenu " . -+ \ "Ada." . escape(a:Text, ' ') . -+ \ "" . a:Keys . -+ \ " :" . a:Command . "" -+ execute -+ \ "command -buffer " . -+ \ a:Keys[1:] . -+ \" :" . a:Command . "" -+ elseif a:Keys[0] == '<' -+ execute -+ \ "50amenu " . -+ \ "Ada." . escape(a:Text, ' ') . -+ \ "" . a:Keys . -+ \ " :" . a:Command . "" -+ execute -+ \ "nnoremap " . -+ \ a:Keys . -+ \" :" . a:Command . "" -+ execute -+ \ "inoremap " . -+ \ a:Keys . -+ \" :" . a:Command . "" -+ else -+ if exists("g:mapleader") -+ let l:leader = g:mapleader -+ else -+ let l:leader = '\' -+ endif -+ execute -+ \ "50amenu " . -+ \ "Ada." . escape(a:Text, ' ') . -+ \ "" . escape(l:leader . "a" . a:Keys , '\') . -+ \ " :" . a:Command . "" -+ execute -+ \ "nnoremap " . -+ \ escape(l:leader . "a" . a:Keys , '\') . -+ \" :" . a:Command -+ execute -+ \ "inoremap " . -+ \ escape(l:leader . "a" . a:Keys , '\') . -+ \" :" . a:Command -+ endif -+ return -+endfunction -+ -+" Section: ada#Map_Popup {{{2 -+" -+function ada#Map_Popup (Text, Keys, Command) -+ if exists("g:mapleader") -+ let l:leader = g:mapleader -+ else -+ let l:leader = '\' -+ endif -+ execute -+ \ "50amenu " . -+ \ "PopUp." . escape(a:Text, ' ') . -+ \ "" . escape(l:leader . "a" . a:Keys , '\') . -+ \ " :" . a:Command . "" -+ -+ call ada#Map_Menu (a:Text, a:Keys, a:Command) -+ return -+endfunction ada#Map_Popup -+ -+" }}}1 -+ -+lockvar g:ada#WordRegex -+lockvar g:ada#DotWordRegex -+lockvar g:ada#Comment -+lockvar! g:ada#Keywords -+lockvar! g:ada#Ctags_Kinds -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/autoload/.svn/text-base/decada.vim.svn-base vim71_ada/1/autoload/.svn/text-base/decada.vim.svn-base ---- vim71/1/autoload/.svn/text-base/decada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/text-base/decada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,75 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada/Dec Ada compiler file -+" Language: Ada (Dec Ada) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL$ -+" History: 21.07.2006 MK New Dec Ada -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested not to use include protection for -+" autoload -+" 05.11.2006 MK Bram suggested to save on spaces -+" Help Page: compiler-decada -+"------------------------------------------------------------------------------ -+ -+if version < 700 -+ finish -+endif -+ -+function decada#Unit_Name () dict " {{{1 -+ " Convert filename into acs unit: -+ " 1: remove the file extenstion. -+ " 2: replace all double '_' or '-' with an dot (which denotes a separate) -+ " 3: remove a trailing '_' (wich denotes a specification) -+ return substitute (substitute (expand ("%:t:r"), '__\|-', ".", "g"), '_$', "", '') -+endfunction decada#Unit_Name " }}}1 -+ -+function decada#Make () dict " {{{1 -+ let l:make_prg = substitute (g:self.Make_Command, '%<', self.Unit_Name(), '') -+ let &errorformat = g:self.Error_Format -+ let &makeprg = l:make_prg -+ wall -+ make -+ copen -+ set wrap -+ wincmd W -+endfunction decada#Build " }}}1 -+ -+function decada#Set_Session (...) dict " {{{1 -+ if a:0 > 0 -+ call ada#Switch_Session (a:1) -+ elseif argc() == 0 && strlen (v:servername) > 0 -+ call ada#Switch_Session ( -+ \ expand('~')[0:-2] . ".vimfiles.session]decada_" . -+ \ v:servername . ".vim") -+ endif -+ return -+endfunction decada#Set_Session " }}}1 -+ -+function decada#New () " }}}1 -+ let Retval = { -+ \ 'Make' : function ('decada#Make'), -+ \ 'Unit_Name' : function ('decada#Unit_Name'), -+ \ 'Set_Session' : function ('decada#Set_Session'), -+ \ 'Project_Dir' : '', -+ \ 'Make_Command' : 'ACS COMPILE /Wait /Log /NoPreLoad /Optimize=Development /Debug %<', -+ \ 'Error_Format' : '%+A%%ADAC-%t-%m,%C %#%m,%Zat line number %l in file %f,' . -+ \ '%+I%%ada-I-%m,%C %#%m,%Zat line number %l in file %f'} -+ -+ return Retval -+endfunction decada#New " }}}1 -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/autoload/.svn/text-base/gnat.vim.svn-base vim71_ada/1/autoload/.svn/text-base/gnat.vim.svn-base ---- vim71/1/autoload/.svn/text-base/gnat.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/autoload/.svn/text-base/gnat.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,147 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada/GNAT compiler file -+" Language: Ada (GNAT) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischi k -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL$ -+" History: 24.05.2006 MK Unified Headers -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 05.08.2006 MK Add session support -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested not to use include protection for -+" autoload -+" 05.11.2006 MK Bram suggested to save on spaces -+" 19.09.2007 NO use project file only when there is a project -+" Help Page: compiler-gnat -+"------------------------------------------------------------------------------ -+ -+if version < 700 -+ finish -+endif -+ -+function gnat#Make () dict " {{{1 -+ let &l:makeprg = self.Get_Command('Make') -+ let &l:errorformat = self.Error_Format -+ wall -+ make -+ copen -+ set wrap -+ wincmd W -+endfunction gnat#Make " }}}1 -+ -+function gnat#Pretty () dict " {{{1 -+ execute "!" . self.Get_Command('Pretty') -+endfunction gnat#Make " }}}1 -+ -+function gnat#Find () dict " {{{1 -+ execute "!" . self.Get_Command('Find') -+endfunction gnat#Find " }}}1 -+ -+function gnat#Tags () dict " {{{1 -+ execute "!" . self.Get_Command('Tags') -+ edit tags -+ call gnat#Insert_Tags_Header () -+ update -+ quit -+endfunction gnat#Tags " }}}1 -+ -+function gnat#Set_Project_File (...) dict " {{{1 -+ if a:0 > 0 -+ let self.Project_File = a:1 -+ -+ if ! filereadable (self.Project_File) -+ let self.Project_File = findfile ( -+ \ fnamemodify (self.Project_File, ':r'), -+ \ $ADA_PROJECT_PATH, -+ \ 1) -+ endif -+ elseif strlen (self.Project_File) > 0 -+ let self.Project_File = browse (0, 'GNAT Project File?', '', self.Project_File) -+ elseif expand ("%:e") == 'gpr' -+ let self.Project_File = browse (0, 'GNAT Project File?', '', expand ("%:e")) -+ else -+ let self.Project_File = browse (0, 'GNAT Project File?', '', 'default.gpr') -+ endif -+ -+ if strlen (v:this_session) > 0 -+ execute 'mksession! ' . v:this_session -+ endif -+ -+ "if strlen (self.Project_File) > 0 -+ "if has("vms") -+ "call ada#Switch_Session ( -+ "\ expand('~')[0:-2] . ".vimfiles.session]gnat_" . -+ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") -+ "else -+ "call ada#Switch_Session ( -+ "\ expand('~') . "/vimfiles/session/gnat_" . -+ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") -+ "endif -+ "else -+ "call ada#Switch_Session ('') -+ "endif -+ -+ return -+endfunction gnat#Set_Project_File " }}}1 -+ -+function gnat#Get_Command (Command) dict " {{{1 -+ let l:Command = eval ('self.' . a:Command . '_Command') -+ return eval (l:Command) -+endfunction gnat#Get_Command " }}}1 -+ -+function gnat#Set_Session (...) dict " {{{1 -+ if argc() == 1 && fnamemodify (argv(0), ':e') == 'gpr' -+ call self.Set_Project_File (argv(0)) -+ elseif strlen (v:servername) > 0 -+ call self.Set_Project_File (v:servername . '.gpr') -+ endif -+endfunction gnat#Set_Session " }}}1 -+ -+function gnat#New () " {{{1 -+ let l:Retval = { -+ \ 'Make' : function ('gnat#Make'), -+ \ 'Pretty' : function ('gnat#Pretty'), -+ \ 'Find' : function ('gnat#Find'), -+ \ 'Tags' : function ('gnat#Tags'), -+ \ 'Set_Project_File' : function ('gnat#Set_Project_File'), -+ \ 'Set_Session' : function ('gnat#Set_Session'), -+ \ 'Get_Command' : function ('gnat#Get_Command'), -+ \ 'Project_File' : '', -+ \ 'Make_Command' : '"gnat make -P " . self.Project_File . " -F -gnatef "', -+ \ 'Pretty_Command' : '"gnat pretty -P " . self.Project_File . " "', -+ \ 'Find_Program' : '"gnat find -P " . self.Project_File . " -F "', -+ \ 'Tags_Command' : '"gnat xref -P " . self.Project_File . " -v *.AD*"', -+ \ 'Error_Format' : '%f:%l:%c: %trror: %m,' . -+ \ '%f:%l:%c: %tarning: %m,' . -+ \ '%f:%l:%c: (%ttyle) %m'} -+ -+ return l:Retval -+endfunction gnat#New " }}}1 -+ -+function gnat#Insert_Tags_Header () " {{{1 -+ 1insert -+!_TAG_FILE_FORMAT 1 /extended format; --format=1 will not append ;" to lines/ -+!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ -+!_TAG_PROGRAM_AUTHOR AdaCore /info@adacore.com/ -+!_TAG_PROGRAM_NAME gnatxref // -+!_TAG_PROGRAM_URL http://www.adacore.com /official site/ -+!_TAG_PROGRAM_VERSION 5.05w // -+. -+ return -+endfunction gnat#Insert_Tags_Header " }}}1 -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=0 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/colors/.svn/all-wcprops vim71_ada/1/colors/.svn/all-wcprops ---- vim71/1/colors/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/colors/.svn/all-wcprops 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,5 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 51 -+/svnroot/gnuada/!svn/ver/818/trunk/tools/vim/colors -+END -diff -urN vim71/1/colors/.svn/dir-prop-base vim71_ada/1/colors/.svn/dir-prop-base ---- vim71/1/colors/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/colors/.svn/dir-prop-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,6 @@ -+K 10 -+svn:ignore -+V 9 -+.backups -+ -+END -diff -urN vim71/1/colors/.svn/entries vim71_ada/1/colors/.svn/entries ---- vim71/1/colors/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/colors/.svn/entries 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,28 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/colors -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-12-03T21:21:48.223203Z -+818 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -diff -urN vim71/1/colors/.svn/format vim71_ada/1/colors/.svn/format ---- vim71/1/colors/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/colors/.svn/format 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/compiler/decada.vim vim71_ada/1/compiler/decada.vim ---- vim71/1/compiler/decada.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/compiler/decada.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,55 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada/Dec Ada compiler file -+" Language: Ada (Dec Ada) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ -+" History: 21.07.2006 MK New Dec Ada -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 08.09.2006 MK Correct double load protection. -+" Help Page: compiler-decada -+"------------------------------------------------------------------------------ -+ -+if (exists("current_compiler") && -+ \ current_compiler == "decada") || -+ \ version < 700 -+ finish -+endif -+ -+let current_compiler = "decada" -+ -+if !exists("g:decada") -+ let g:decada = decada#New () -+ -+ call ada#Map_Menu ( -+ \'Dec Ada.Build', -+ \'', -+ \'call decada.Make ()') -+ -+ call g:decada.Set_Session () -+endif -+ -+if exists(":CompilerSet") != 2 -+ " -+ " plugin loaded by other means then the "compiler" command -+ " -+ command -nargs=* CompilerSet setlocal -+endif -+ -+execute "CompilerSet makeprg=" . escape (g:decada.Make_Command, ' ') -+execute "CompilerSet errorformat=" . escape (g:decada.Error_Format, ' ') -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/compiler/gnat.vim vim71_ada/1/compiler/gnat.vim ---- vim71/1/compiler/gnat.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/compiler/gnat.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,73 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada/GNAT compiler file -+" Language: Ada (GNAT) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischi k -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ -+" History: 24.05.2006 MK Unified Headers -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 19.09.2007 NO use project file only when there is a project -+" Help Page: compiler-gnat -+"------------------------------------------------------------------------------ -+ -+if (exists("current_compiler") && -+ \ current_compiler == "gnat") || -+ \ version < 700 -+ finish -+endif -+ -+let current_compiler = "gnat" -+ -+if !exists("g:gnat") -+ let g:gnat = gnat#New () -+ -+ call ada#Map_Menu ( -+ \ 'GNAT.Build', -+ \ '', -+ \ 'call gnat.Make ()') -+ call ada#Map_Menu ( -+ \ 'GNAT.Pretty Print', -+ \ ':GnatPretty', -+ \ 'call gnat.Pretty ()') -+ call ada#Map_Menu ( -+ \ 'GNAT.Tags', -+ \ ':GnatTags', -+ \ 'call gnat.Tags ()') -+ call ada#Map_Menu ( -+ \ 'GNAT.Find', -+ \ ':GnatFind', -+ \ 'call gnat.Find ()') -+ call ada#Map_Menu ( -+ \ 'GNAT.Set Projectfile\.\.\.', -+ \ ':SetProject', -+ \ 'call gnat.Set_Project_File ()') -+ -+ call g:gnat.Set_Session () -+endif -+ -+if exists(":CompilerSet") != 2 -+ " -+ " plugin loaded by other means then the "compiler" command -+ " -+ command -nargs=* CompilerSet setlocal -+endif -+ -+execute "CompilerSet makeprg=" . escape (g:gnat.Get_Command('Make'), ' ') -+execute "CompilerSet errorformat=" . escape (g:gnat.Error_Format, ' ') -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=0 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/compiler/.svn/all-wcprops vim71_ada/1/compiler/.svn/all-wcprops ---- vim71/1/compiler/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/compiler/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 53 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/compiler -+END -+gnat.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 62 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/compiler/gnat.vim -+END -+decada.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 64 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/compiler/decada.vim -+END -diff -urN vim71/1/compiler/.svn/dir-prop-base vim71_ada/1/compiler/.svn/dir-prop-base ---- vim71/1/compiler/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/compiler/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,6 @@ -+K 10 -+svn:ignore -+V 9 -+.backups -+ -+END -diff -urN vim71/1/compiler/.svn/entries vim71_ada/1/compiler/.svn/entries ---- vim71/1/compiler/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/compiler/.svn/entries 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,54 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -+gnat.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+1429fc395240f10289ac4836746ac1ba -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -+decada.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+5c01783740adbd6492b7197377e85d74 -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -diff -urN vim71/1/compiler/.svn/format vim71_ada/1/compiler/.svn/format ---- vim71/1/compiler/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/compiler/.svn/format 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/compiler/.svn/prop-base/decada.vim.svn-base vim71_ada/1/compiler/.svn/prop-base/decada.vim.svn-base ---- vim71/1/compiler/.svn/prop-base/decada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/compiler/.svn/prop-base/decada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/compiler/.svn/prop-base/gnat.vim.svn-base vim71_ada/1/compiler/.svn/prop-base/gnat.vim.svn-base ---- vim71/1/compiler/.svn/prop-base/gnat.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/compiler/.svn/prop-base/gnat.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/compiler/.svn/text-base/decada.vim.svn-base vim71_ada/1/compiler/.svn/text-base/decada.vim.svn-base ---- vim71/1/compiler/.svn/text-base/decada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/compiler/.svn/text-base/decada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,55 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada/Dec Ada compiler file -+" Language: Ada (Dec Ada) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL$ -+" History: 21.07.2006 MK New Dec Ada -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 08.09.2006 MK Correct double load protection. -+" Help Page: compiler-decada -+"------------------------------------------------------------------------------ -+ -+if (exists("current_compiler") && -+ \ current_compiler == "decada") || -+ \ version < 700 -+ finish -+endif -+ -+let current_compiler = "decada" -+ -+if !exists("g:decada") -+ let g:decada = decada#New () -+ -+ call ada#Map_Menu ( -+ \'Dec Ada.Build', -+ \'', -+ \'call decada.Make ()') -+ -+ call g:decada.Set_Session () -+endif -+ -+if exists(":CompilerSet") != 2 -+ " -+ " plugin loaded by other means then the "compiler" command -+ " -+ command -nargs=* CompilerSet setlocal -+endif -+ -+execute "CompilerSet makeprg=" . escape (g:decada.Make_Command, ' ') -+execute "CompilerSet errorformat=" . escape (g:decada.Error_Format, ' ') -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/compiler/.svn/text-base/gnat.vim.svn-base vim71_ada/1/compiler/.svn/text-base/gnat.vim.svn-base ---- vim71/1/compiler/.svn/text-base/gnat.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/compiler/.svn/text-base/gnat.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,73 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada/GNAT compiler file -+" Language: Ada (GNAT) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischi k -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL$ -+" History: 24.05.2006 MK Unified Headers -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 19.09.2007 NO use project file only when there is a project -+" Help Page: compiler-gnat -+"------------------------------------------------------------------------------ -+ -+if (exists("current_compiler") && -+ \ current_compiler == "gnat") || -+ \ version < 700 -+ finish -+endif -+ -+let current_compiler = "gnat" -+ -+if !exists("g:gnat") -+ let g:gnat = gnat#New () -+ -+ call ada#Map_Menu ( -+ \ 'GNAT.Build', -+ \ '', -+ \ 'call gnat.Make ()') -+ call ada#Map_Menu ( -+ \ 'GNAT.Pretty Print', -+ \ ':GnatPretty', -+ \ 'call gnat.Pretty ()') -+ call ada#Map_Menu ( -+ \ 'GNAT.Tags', -+ \ ':GnatTags', -+ \ 'call gnat.Tags ()') -+ call ada#Map_Menu ( -+ \ 'GNAT.Find', -+ \ ':GnatFind', -+ \ 'call gnat.Find ()') -+ call ada#Map_Menu ( -+ \ 'GNAT.Set Projectfile\.\.\.', -+ \ ':SetProject', -+ \ 'call gnat.Set_Project_File ()') -+ -+ call g:gnat.Set_Session () -+endif -+ -+if exists(":CompilerSet") != 2 -+ " -+ " plugin loaded by other means then the "compiler" command -+ " -+ command -nargs=* CompilerSet setlocal -+endif -+ -+execute "CompilerSet makeprg=" . escape (g:gnat.Get_Command('Make'), ' ') -+execute "CompilerSet errorformat=" . escape (g:gnat.Error_Format, ' ') -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=0 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/doc/ft_ada.txt vim71_ada/1/doc/ft_ada.txt ---- vim71/1/doc/ft_ada.txt 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/ft_ada.txt 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,516 @@ -+*ft_ada.txt* Ada File type Plug-ins Last change: 2007 Seb 17 -+ -+ -+ ADA FILE TYPE PLUG-INS REFERENCE MANUAL~ -+ -+ADA *ada.vim* -+ -+1. Syntax Highlighting |ft-ada-syntax| -+2. Plug-in |ft-ada-plugin| -+3. Omni Completion |ft-ada-omni| -+ 3.1 Omni Completion with "gnat xref" |gnat-xref| -+ 3.2 Omni Completion with "ctags" |ada-ctags| -+4. Compiler Support |ada-compiler| -+ 4.1 GNAT |compiler-gnat| -+ 4.1 Dec Ada |compiler-decada| -+5. References |ada-reference| -+ 5.1 Options |ft-ada-options| -+ 5.2 Functions |ft-ada-functions| -+ 5.3 Commands |ft-ada-commands| -+ 5.4 Variables |ft-ada-variables| -+ 5.5 Constants |ft-ada-contstants| -+8. Extra Plug-ins |ada-extra-plugins| -+ -+============================================================================== -+1. Syntax Highlighting ~ -+ *ft-ada-syntax* -+ -+This mode is designed for the 2005 edition of Ada ("Ada 2005"), which includes -+support for objected-programming, protected types, and so on. It handles code -+written for the original Ada language ("Ada83", "Ada87", "Ada95") as well, -+though code which uses Ada 2005-only keywords will be wrongly colored (such -+code should be fixed anyway). For more information about Ada, see -+http://www.adapower.com. -+ -+The Ada mode handles a number of situations cleanly. -+ -+For example, it knows that the "-" in "-5" is a number, but the same character -+in "A-5" is an operator. Normally, a "with" or "use" clause referencing -+another compilation unit is coloured the same way as C's "#include" is coloured. -+If you have "Conditional" or "Repeat" groups coloured differently, then "end -+if" and "end loop" will be coloured as part of those respective groups. -+ -+You can set these to different colours using vim's "highlight" command (e.g., -+to change how loops are displayed, enter the command ":hi Repeat" followed by -+the colour specification; on simple terminals the colour specification -+ctermfg=White often shows well). -+ -+There are several options you can select in this Ada mode. See|ft-ada-options| -+for a complete list. -+ -+To enable them, assign a value to the option. For example, to turn one on: -+ > -+ > let g:ada_standard_types = 1 -+> -+To disable them use ":unlet". Example: -+> -+ > unlet g:ada_standard_types -+ -+You can just use ":" and type these into the command line to set these -+temporarily before loading an Ada file. You can make these option settings -+permanent by adding the "let" command(s), without a colon, to your "~/.vimrc" -+file. -+ -+Even on a slow (90Mhz) PC this mode works quickly, but if you find the -+performance unacceptable, turn on |g:ada_withuse_ordinary|. -+ -+Syntax folding instructions (|fold-syntax|) are added when |g:ada_folding| is -+set. -+ -+============================================================================== -+2. File type Plug-in ~ -+ *ft-ada-indent* *ft-ada-plugin* -+ -+The Ada plug-in provides support for: -+ -+ - auto indenting (|indent.txt|) -+ - insert completion (|i_CTRL-N|) -+ - user completion (|i_CTRL-X_CTRL-U|) -+ - tag searches (|tagsrch.txt|) -+ - Quick Fix (|quickfix.txt|) -+ - backspace handling (|'backspace'|) -+ - comment handling (|'comments'|, |'commentstring'|) -+ -+The plug-in only activates the features of the Ada mode whenever an Ada -+files is opened and add adds Ada related entries to the main and pop-up menu. -+ -+============================================================================== -+3. Omni Completion ~ -+ *ft-ada-omni* -+ -+The Ada omni-completions (|i_CTRL-X_CTRL-O|) uses tags database created either -+by "gnat xref -v" or the "exuberant Ctags (http://ctags.sourceforge.net). The -+complete function will automatically detect which tool was used to create the -+tags file. -+ -+------------------------------------------------------------------------------ -+3.1 Omni Completion with "gnat xref" ~ -+ *gnat-xref* -+ -+GNAT XREF uses the compiler internal information (ali-files) to produce the -+tags file. This has the advantage to be 100% correct and the option of deep -+nested analysis. However the code must compile, the generator is quite -+slow and the created tags file contains only the basic Ctags information for -+each entry - not enough for some of the more advanced Vim code browser -+plug-ins. -+ -+NOTE: "gnat xref -v" is very tricky to use as it has almost no diagnostic -+ output - If nothing is printed then usually the parameters are wrong. -+ Here some important tips: -+ -+1) You need to compile your code first and use the "-aO" option to point to -+ your .ali files. -+2) "gnat xref -v ../Include/adacl.ads" won't work - use the "gnat xref -v -+ -aI../Include adacl.ads" instead. -+3) "gnat xref -v -aI../Include *.ad?" won't work - use "cd ../Include" and -+ then "gnat xref -v *.ad?" -+4) Project manager support is completely broken - don't even try "gnat xref -+ -Padacl.gpr". -+5) VIM is faster when the tags file is sorted - use "sort --unique -+ --ignore-case --output=tags tags" . -+6) Remember to insert "!_TAG_FILE_SORTED 2 %sort ui" as first line to mark -+ the file assorted. -+ -+------------------------------------------------------------------------------ -+3.2 Omni Completion with "ctags"~ -+ *ada-ctags* -+ -+Exuberant Ctags uses it's own multi-language code parser. The parser is quite -+fast, produces a lot of extra informations (hence the name "Exuberant Ctags") -+and can run on files which currently do not compile. -+ -+There are also lots of other Vim-tools which use exuberant Ctags. -+ -+You will need to install a version of the Exuberant Ctags which has Ada -+support patched in. Such a version is available from the GNU Ada Project -+(http://gnuada.sourceforge.net). -+ -+The Ada parser for Exuberant Ctags is fairly new - don't expect complete -+support yet. -+ -+============================================================================== -+4. Compiler Support ~ -+ *ada-compiler* -+ -+The Ada mode supports more then one Ada compiler and will automatically load the -+compiler set in|g:ada_default_compiler|whenever an Ada source is opened. The -+provided compiler plug-ins are split into the actual compiler plug-in and a -+collection of support functions and variables. This allows the easy -+development of specialized compiler plug-ins fine tuned to your development -+environment. -+ -+------------------------------------------------------------------------------ -+4.1 GNAT ~ -+ *compiler-gnat* -+ -+GNAT is the only free (beer and speech) Ada compiler available. There are -+several version available which differentiate in the licence terms used. -+ -+The GNAT compiler plug-in will perform a compile on pressing and then -+immediately shows the result. You can set the project file to be used by -+setting: -+ > -+ > call g:gnat.Set_Project_File ('my_project.gpr') -+ -+Setting a project file will also create a Vim session (|views-sessions|) so - -+like with the GPS - opened files, window positions etc. will remembered -+separately for all projects. -+ -+ *gnat_members* -+GNAT OBJECT ~ -+ -+ *g:gnat.Make()* -+g:gnat.Make() -+ Calls|g:gnat.Make_Command|and displays the result inside a -+ |quickfix| window. -+ -+ *g:gnat.Pretty()* -+g:gnat.Pretty() -+ Calls|g:gnat.Pretty_Command| -+ -+ *g:gnat.Find()* -+g:gnat.Find() -+ Calls|g:gnat.Find_Command| -+ -+ *g:gnat.Tags()* -+g:gnat.Tags() -+ Calls|g:gnat.Tags_Command| -+ -+ *g:gnat.Set_Project_File()* -+g:gnat.Set_Project_File([{file}]) -+ Set gnat project file and load associated session. An open -+ project will be closed and the session written. If called -+ without file name the file selector opens for selection of a -+ project file. If called with an empty string then the project -+ and associated session are closed. -+ -+ *g:gnat.Project_File* -+g:gnat.Project_File string -+ Current project file. -+ -+ *g:gnat.Make_Command* -+g:gnat.Make_Command string -+ External command used for|g:gnat.Make()| (|'makeprg'|). -+ -+ *g:gnat.Pretty_Program* -+g:gnat.Pretty_Program string -+ External command used for|g:gnat.Pretty()| -+ -+ *g:gnat.Find_Program* -+g:gnat.Find_Program string -+ External command used for|g:gnat.Find()| -+ -+ *g:gnat.Tags_Command* -+g:gnat.Tags_Command string -+ External command used for|g:gnat.Tags()| -+ -+ *g:gnat.Error_Format* -+g:gnat.Error_Format string -+ Error format (|'errorformat'|) -+ -+------------------------------------------------------------------------------ -+4.2 Dec Ada ~ -+ *compiler-hpada* *compiler-decada* -+ *compiler-vaxada* *compiler-compaqada* -+ -+Dec Ada (also known by - in chronological order - VAX Ada, Dec Ada, Compaq Ada -+and HP Ada) is a fairly dated Ada 83 compiler. Support is basic: will -+compile the current unit. -+ -+The Dec Ada compiler expects the package name and not the file name to be -+passed a parameter. The compiler plug-in supports the usual file name -+convention to convert the file into a unit name. For separates both '-' and -+'__' are allowed. -+ -+ *decada_members* -+DEC ADA OBJECT ~ -+ -+ *g:decada.Make()* -+g:decada.Make() function -+ Calls|g:decada.Make_Command|and displays the result inside a -+ |quickfix| window. -+ -+ *g:decada.Unit_Name()* -+g:decada.Unit_Name() function -+ Get the Unit name for the current file. -+ -+ *g:decada.Make_Command* -+g:decada.Make_Command string -+ External command used for|g:decadat.Make()| (|'makeprg'|). -+ -+ *g:decada.Error_Format* -+g:decada.Error_Format| string -+ Error format (|'errorformat'|). -+ -+============================================================================== -+5. References ~ -+ *ada-reference* -+ -+------------------------------------------------------------------------------ -+5.1 Options ~ -+ *ft-ada-options* -+ -+ *g:ada_standard_types* -+g:ada_standard_types bool (true when exists) -+ Highlight types in package Standard (e.g., "Float") -+ -+ *g:ada_space_errors* -+ *g:ada_no_trail_space_error* -+ *g:ada_no_tab_space_error* -+ *g:ada_all_tab_usage* -+g:ada_space_errors bool (true when exists) -+ Highlight extraneous errors in spaces ... -+ g:ada_no_trail_space_error -+ - but ignore trailing spaces at the end of a line -+ g:ada_no_tab_space_error -+ - but ignore tabs after spaces -+ g:ada_all_tab_usage -+ - highlight all tab use -+ -+ *g:ada_line_errors* -+g:ada_line_errors bool (true when exists) -+ Highlight lines which are to long. Note: This highlighting -+ option is quite CPU intensive. -+ -+ *g:ada_rainbow_color* -+g:ada_rainbow_color bool (true when exists) -+ Use rainbow colours for '(' and ')'. You need the -+ rainbow_parenthesis for this to work -+ -+ *g:ada_folding* -+g:ada_folding set ('sigpft') -+ Use folding for Ada sources. -+ 's': activate syntax folding on load -+ 'p': fold packages -+ 'f': fold functions and procedures -+ 't': fold types -+ 'c': fold conditionals -+ 'g': activate gnat pretty print folding on load -+ 'i': lone 'is' folded with line above -+ 'b': lone 'begin' folded with line above -+ 'p': lone 'private' folded with line above -+ 'x': lone 'exception' folded with line above -+ 'i': activate indent folding on load -+ -+ Note: Syntax folding is in an early (unuseable) stage and -+ indent or gnat pretty folding is suggested. -+ -+ For gnat pretty folding to work the following settings are -+ suggested: -cl3 -M79 -c2 -c3 -c4 -A1 -A2 -A3 -A4 -A5 -+ -+ For indent folding to work the following settings are -+ suggested: shiftwidth=3 softtabstop=3 -+ -+ *g:ada_abbrev* -+g:ada_abbrev bool (true when exists) -+ Add some abbreviations. This feature more or less superseded -+ by the various completion methods. -+ -+ *g:ada_withuse_ordinary* -+g:ada_withuse_ordinary bool (true when exists) -+ Show "with" and "use" as ordinary keywords (when used to -+ reference other compilation units they're normally highlighted -+ specially). -+ -+ *g:ada_begin_preproc* -+g:ada_begin_preproc bool (true when exists) -+ Show all begin-like keywords using the colouring of C -+ preprocessor commands. -+ -+ *g:ada_omni_with_keywords* -+g:ada_omni_with_keywords -+ Add Keywords, Pragmas, Attributes to omni-completions -+ (|compl-omni|). Note: You can always complete then with user -+ completion (|i_CTRL-X_CTRL-U|). -+ -+ *g:ada_extended_tagging* -+g:ada_extended_tagging enum ('jump', 'list') -+ use extended tagging, two options are available -+ 'jump': use tjump to jump. -+ 'list': add tags quick fix list. -+ Normal tagging does not support function or operator -+ overloading as these features are not available in C and -+ tagging was originally developed for C. -+ -+ *g:ada_extended_completion* -+g:ada_extended_completion -+ Uses extended completion for and completions -+ (|i_CTRL-N|). In this mode the '.' is used as part of the -+ identifier so that 'Object.Method' or 'Package.Procedure' are -+ completed together. -+ -+ *g:ada_gnat_extensions* -+g:ada_gnat_extensions bool (true when exists) -+ Support GNAT extensions. -+ -+ *g:ada_with_gnat_project_files* -+g:ada_with_gnat_project_files bool (true when exists) -+ Add gnat project file keywords and Attributes. -+ -+ *g:ada_default_compiler* -+g:ada_default_compiler string -+ set default compiler. Currently supported is 'gnat' and -+ 'decada'. -+ -+An "exists" type is a boolean is considered true when the variable is defined -+and false when the variable is undefined. The value which the variable is -+set makes no difference. -+ -+------------------------------------------------------------------------------ -+5.3 Commands ~ -+ *ft-ada-commands* -+ -+:AdaRainbow *:AdaRainbow* -+ Toggles rainbow colour (|g:ada_rainbow_color|) mode for -+ '(' and ')' -+ -+:AdaLines *:AdaLines* -+ Toggles line error (|g:ada_line_errors|) display -+ -+:AdaSpaces *:AdaSpaces* -+ Toggles space error (|g:ada_space_errors|) display. -+ -+:AdaTagDir *:AdaTagDir* -+ Creates tags file for the directory of the current file. -+ -+:AdaTagFile *:AdaTagFile* -+ Creates tags file for the current file. -+ -+:AdaTypes *:AdaTypes* -+ Toggles standard types (|g:ada_standard_types|) colour. -+ -+:GnatFind *:GnatFind* -+ Calls |g:gnat.Find()| -+ -+:GnatPretty *:GnatPretty* -+ Calls |g:gnat.Pretty()| -+ -+:GnatTags *:GnatTags* -+ Calls |g:gnat.Tags()| -+ -+------------------------------------------------------------------------------ -+5.3 Variables ~ -+ *ft-ada-variables* -+ -+ *g:gnat* -+g:gnat object -+ Control object which manages GNAT compiles. The object -+ is created when the first Ada source code is loaded provided -+ that |g:ada_default_compiler|is set to 'gnat'. See|gnat_members| -+ for details. -+ -+ *g:decada* -+g:decada object -+ Control object which manages Dec Ada compiles. The object -+ is created when the first Ada source code is loaded provided -+ that |g:ada_default_compiler|is set to 'decada'. See -+ |decada_members|for details. -+ -+------------------------------------------------------------------------------ -+5.4 Constants ~ -+ *ft-ada-constants* -+ ft-ada-constants -+ -+All constants are locked. See |:lockvar| for details. -+ -+ *g:ada#WordRegex* -+g:ada#WordRegex string -+ Regular expression to search for Ada words -+ -+ *g:ada#DotWordRegex* -+g:ada#DotWordRegex string -+ Regular expression to search for Ada words separated by dots. -+ -+ *g:ada#Comment* -+g:ada#Comment string -+ Regular expression to search for Ada comments -+ -+ *g:ada#Keywords* -+g:ada#Keywords list of dictionaries -+ List of keywords, attributes etc. pp. in the format used by -+ omni completion. See |complete-items| for details. -+ -+ *g:ada#Ctags_Kinds* -+g:ada#Ctags_Kinds dictionary of lists -+ Dictionary of the various kinds of items which the Ada support -+ for Ctags generates. -+ -+------------------------------------------------------------------------------ -+5.2 Functions ~ -+ *ft-ada-functions* -+ -+ada#Word([{line}, {col}]) *ada#Word()* -+ Return full name of Ada entity under the cursor (or at given -+ line/column), stripping white space/newlines as necessary. -+ -+ada#List_Tag([{line}, {col}]) *ada#Listtags()* -+ List all occurrences of the Ada entity under the cursor (or at -+ given line/column) inside the quick-fix window -+ -+ada#Jump_Tag ({ident}, {mode}) *ada#Jump_Tag()* -+ List all occurrences of the Ada entity under the cursor (or at -+ given line/column) in the tag jump list. Mode can either be -+ 'tjump' or 'stjump'. -+ -+ada#Create_Tags ({option}) *ada#Create_Tags()* -+ Creates tag file using Ctags. The option can either be 'file' -+ for the current file, 'dir' for the directory of the current -+ file or a file name. -+ -+gnat#Insert_Tags_Header() *gnat#Insert_Tags_Header()* -+ Adds the tag file header (!_TAG_) information to the current -+ file which are missing from the GNAT XREF output. -+ -+ada#Switch_Syntax_Option ({option}) *ada#Switch_Syntax_Option()* -+ Toggles highlighting options on or off. Used for the Ada menu. -+ -+ *gnat#New()* -+gnat#New () -+ Create a new gnat object. See |g:gnat| for details. -+ -+ -+============================================================================== -+8. Extra Plugins ~ -+ *ada-extra-plugins* -+ -+You can optionally install the following extra plug-in. They work well with Ada -+and enhance the ability of the Ada mode.: -+ -+backup.vim -+ http://www.vim.org/scripts/script.php?script_id=1537 -+ Keeps as many backups as you like so you don't have to. -+ -+rainbow_parenthsis.vim -+ http://www.vim.org/scripts/script.php?script_id=1561 -+ Very helpful since Ada uses only '(' and ')'. -+ -+nerd_comments.vim -+ http://www.vim.org/scripts/script.php?script_id=1218 -+ Excellent commenting and uncommenting support for almost any -+ programming language. -+ -+matchit.vim -+ http://www.vim.org/scripts/script.php?script_id=39 -+ '%' jumping for any language. The normal '%' jump only works for '{}' -+ style languages. The Ada mode will set the needed search patters. -+ -+taglist.vim -+ http://www.vim.org/scripts/script.php?script_id=273 -+ Source code explorer sidebar. There is a patch for Ada available. -+ -+The GNU Ada Project distribution (http://gnuada.sourceforge.net) of Vim -+contains all of the above. -+ -+============================================================================== -+vim: textwidth=78 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+vim: filetype=help -diff -urN vim71/1/doc/matchit.txt vim71_ada/1/doc/matchit.txt ---- vim71/1/doc/matchit.txt 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/matchit.txt 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,405 @@ -+*matchit.txt* Extended "%" matching -+ -+For instructions on installing this file, type -+ :help matchit-install -+inside Vim. -+ -+For Vim version 6.3. Last change: 2006 Feb 23 -+ -+ -+ VIM REFERENCE MANUAL by Benji Fisher -+ -+*matchit* *matchit.vim* -+ -+1. Extended matching with "%" |matchit-intro| -+2. Activation |matchit-activate| -+3. Configuration |matchit-configure| -+4. Supporting a New Language |matchit-newlang| -+5. Known Bugs and Limitations |matchit-bugs| -+ -+The functionality mentioned here is a plugin, see |add-plugin|. -+This plugin is only available if 'compatible' is not set. -+You can avoid loading this plugin by setting the "loaded_matchit" variable -+in your |vimrc| file: > -+ :let loaded_matchit = 1 -+ -+{Vi does not have any of this} -+ -+============================================================================== -+1. Extended matching with "%" *matchit-intro* -+ -+ *matchit-%* -+% Cycle forward through matching groups, such as "if", "else", "endif", -+ as specified by |b:match_words|. -+ -+ *g%* *v_g%* *o_g%* -+g% Cycle backwards through matching groups, as specified by -+ |b:match_words|. For example, go from "endif" to "else" to "if". -+ -+ *[%* *v_[%* *o_[%* -+[% Go to [count] previous unmatched group, as specified by -+ |b:match_words|. Similar to |[{|. -+ -+ *]%* *v_]%* *o_]%* -+]% Go to [count] next unmatched group, as specified by -+ |b:match_words|. Similar to |]}|. -+ -+ *v_a%* -+a% In Visual mode, select the matching group, as specified by -+ |b:match_words|, containing the cursor. Similar to |v_a[|. -+ A [count] is ignored, and only the first character of the closing -+ pattern is selected. -+ -+In Vim, as in plain vi, the percent key, |%|, jumps the cursor from a brace, -+bracket, or paren to its match. This can be configured with the 'matchpairs' -+option. The matchit plugin extends this in several ways: -+ -+ You can match whole words, such as "if" and "endif", not just -+ single characters. You can also specify a |regular-expression|. -+ You can define groups with more than two words, such as "if", -+ "else", "endif". Banging on the "%" key will cycle from the "if" to -+ the first "else", the next "else", ..., the closing "endif", and back -+ to the opening "if". Nested structures are skipped. Using |g%| goes -+ in the reverse direction. -+ By default, words inside comments and strings are ignored, unless -+ the cursor is inside a comment or string when you type "%". If the -+ only thing you want to do is modify the behavior of "%" so that it -+ behaves this way, you can > -+ :let b:match_words = &matchpairs -+< -+See |matchit-details| for details on what the script does, and |b:match_words| -+for how to specify matching patterns. -+ -+MODES: *matchit-modes* *matchit-v_%* *matchit-o_%* -+ -+Mostly, % and related motions (|g%| and |[%| and |]%|) work just like built-in -+|motion| commands in |Operator-pending| and |Visual| modes. However, you -+cannot make these motions |linewise| or |characterwise|, since the |:omap|s -+that define them start with "v" in order to make the default behavior -+inclusive. (See |o_v|.) In other words, "dV%" will not work. The -+work-around is to go through Visual mode: "V%d" will work. -+ -+LANGUAGES: *matchit-languages* -+ -+Currently, the following languages are supported: Ada, ASP with VBS, Csh, -+DTD, Entity, Essbase, Fortran, HTML, JSP (same as HTML), LaTeX, Lua, Pascal, -+SGML, Shell, Tcsh, Vim, XML. Other languages may already have support via -+|filetype-plugin|s. -+ -+To support a new language, see |matchit-newlang| below. -+ -+DETAILS: *matchit-details* *matchit-parse* -+ -+Here is an outline of what matchit.vim does each time you hit the "%" key. If -+there are |backref|s in |b:match_words| then the first step is to produce a -+version in which these back references have been eliminated; if there are no -+|backref|s then this step is skipped. This step is called parsing. For -+example, "\(foo\|bar\):end\1" is parsed to yield -+"\(foo\|bar\):end\(foo\|bar\)". This can get tricky, especially if there are -+nested groups. If debugging is turned on, the parsed version is saved as -+|b:match_pat|. -+ -+ *matchit-choose* -+Next, the script looks for a word on the current line that matches the pattern -+just constructed. It includes the patterns from the 'matchpairs' option. -+The goal is to do what you expect, which turns out to be a little complicated. -+The script follows these rules: -+ -+ Insist on a match that ends on or after the cursor. -+ Prefer a match that includes the cursor position (that is, one that -+ starts on or before the cursor). -+ Prefer a match that starts as close to the cursor as possible. -+ Prefer a match in |b:match_words| to a match in 'matchpairs'. -+ If more than one pattern in |b:match_words| matches, choose the one -+ that is listed first. -+ -+Examples: -+ -+ Suppose you > -+ :let b:match_words = '<:>,:' -+< and hit "%" with the cursor on or before the "<" in "a is born". -+ The pattern '<' comes first, so it is preferred over '', which -+ also matches. If the cursor is on the "t", however, then '' is -+ preferred, because this matches a bit of text containing the cursor. -+ If the two groups of patterns were reversed then '<' would never be -+ preferred. -+ -+ Suppose you > -+ :let b:match_words = 'if:end if' -+< (Note the space!) and hit "%" with the cursor at the end of "end if". -+ Then "if" matches, which is probably not what you want, but if the -+ cursor starts on the "end " then "end if" is chosen. (You can avoid -+ this problem by using a more complicated pattern.) -+ -+If there is no match, the script falls back on the usual behavior of |%|. If -+debugging is turned on, the matched bit of text is saved as |b:match_match| -+and the cursor column of the start of the match is saved as |b:match_col|. -+ -+Next, the script looks through |b:match_words| (original and parsed versions) -+for the group and pattern that match. If debugging is turned on, the group is -+saved as |b:match_ini| (the first pattern) and |b:match_tail| (the rest). If -+there are |backref|s then, in addition, the matching pattern is saved as -+|b:match_word| and a table of translations is saved as |b:match_table|. If -+there are |backref|s, these are determined from the matching pattern and -+|b:match_match| and substituted into each pattern in the matching group. -+ -+The script decides whether to search forwards or backwards and chooses -+arguments for the |searchpair()| function. Then, the cursor is moved to the -+start of the match, and |searchpair()| is called. By default, matching -+structures inside strings and comments are ignored. This can be changed by -+setting |b:match_skip|. -+ -+============================================================================== -+2. Activation *matchit-activate* -+ -+You can use this script as a plugin, by copying it to your plugin directory. -+See |add-global-plugin| for instructions. You can also add a line to your -+|vimrc| file, such as > -+ :source $VIMRUNTIME/macros/matchit.vim -+or > -+ :runtime macros/matchit.vim -+Either way, the script should start working the next time you start up Vim. -+ -+The script does nothing unless it finds a |buffer-variable| named -+|b:match_words|. The script contains autocommands that set this variable for -+various file types: see |matchit-languages| above. For a new language, you -+can add autocommands to the script or to your vimrc file, but the recommended -+method is to add a line such as > -+ let b:match_words = '\:\' -+to the |filetype-plugin| for your language. See |b:match_words| below for how -+this variable is interpreted. -+ -+TROUBLESHOOTING *matchit-troubleshoot* -+ -+The script should work in most installations of Vim. It may not work if Vim -+was compiled with a minimal feature set, for example if the |+syntax| option -+was not enabled. If your Vim has support for syntax compiled in, but you do -+not have |syntax| highlighting turned on, matchit.vim should work, but it may -+fail to skip matching groups in comments and strings. If the |filetype| -+mechanism is turned off, the |b:match_words| variable will probably not be -+defined automatically. -+ -+============================================================================== -+3. Configuration *matchit-configure* -+ -+There are several variables that govern the behavior of matchit.vim. Note -+that these are variables local to the buffer, not options, so use |:let| to -+define them, not |:set|. Some of these variables have values that matter; for -+others, it only matters whether the variable has been defined. All of these -+can be defined in the |filetype-plugin| or autocommand that defines -+|b:match_words| or "on the fly." -+ -+The main variable is |b:match_words|. It is described in the section below on -+supporting a new language. -+ -+ *MatchError* *matchit-hl* *matchit-highlight* -+MatchError is the highlight group for error messages from the script. By -+default, it is linked to WarningMsg. If you do not want to be bothered by -+error messages, you can define this to be something invisible. For example, -+if you use the GUI version of Vim and your command line is normally white, you -+can do > -+ :hi MatchError guifg=white guibg=white -+< -+ *b:match_ignorecase* -+If you > -+ :let b:match_ignorecase = 1 -+then matchit.vim acts as if 'ignorecase' is set: for example, "end" and "END" -+are equivalent. If you > -+ :let b:match_ignorecase = 0 -+then matchit.vim treats "end" and "END" differently. (There will be no -+b:match_infercase option unless someone requests it.) -+ -+ *b:match_debug* -+Define b:match_debug if you want debugging information to be saved. See -+|matchit-debug|, below. -+ -+ *b:match_skip* -+If b:match_skip is defined, it is passed as the skip argument to -+|searchpair()|. This controls when matching structures are skipped, or -+ignored. By default, they are ignored inside comments and strings, as -+determined by the |syntax| mechanism. (If syntax highlighting is turned off, -+nothing is skipped.) You can set b:match_skip to a string, which evaluates to -+a non-zero, numerical value if the match is to be skipped or zero if the match -+should not be skipped. In addition, the following special values are -+supported by matchit.vim: -+ s:foo becomes (current syntax item) =~ foo -+ S:foo becomes (current syntax item) !~ foo -+ r:foo becomes (line before cursor) =~ foo -+ R:foo becomes (line before cursor) !~ foo -+(The "s" is meant to suggest "syntax", and the "r" is meant to suggest -+"regular expression".) -+ -+Examples: -+ -+ You can get the default behavior with > -+ :let b:match_skip = 's:comment\|string' -+< -+ If you want to skip matching structures unless they are at the start -+ of the line (ignoring whitespace) then you can > -+ :let b:match_skip = 'R:^\s*' -+< Do not do this if strings or comments can span several lines, since -+ the normal syntax checking will not be done if you set b:match_skip. -+ -+ In LaTeX, since "%" is used as the comment character, you can > -+ :let b:match_skip = 'r:%' -+< Unfortunately, this will skip anything after "\%", an escaped "%". To -+ allow for this, and also "\\%" (an excaped backslash followed by the -+ comment character) you can > -+ :let b:match_skip = 'r:\(^\|[^\\]\)\(\\\\\)*%' -+< -+ See the $VIMRUNTIME/ftplugin/vim.vim for an example that uses both -+ syntax and a regular expression. -+ -+============================================================================== -+4. Supporting a New Language *matchit-newlang* -+ *b:match_words* -+In order for matchit.vim to support a new language, you must define a suitable -+pattern for |b:match_words|. You may also want to set some of the -+|matchit-configure| variables, as described above. If your language has a -+complicated syntax, or many keywords, you will need to know something about -+Vim's |regular-expression|s. -+ -+The format for |b:match_words| is similar to that of the 'matchpairs' option: -+it is a comma (,)-separated list of groups; each group is a colon(:)-separated -+list of patterns (regular expressions). Commas and backslashes that are part -+of a pattern should be escaped with backslashes ('\:' and '\,'). It is OK to -+have only one group; the effect is undefined if a group has only one pattern. -+A simple example is > -+ :let b:match_words = '\:\,' -+ \ . '\:\:\:\' -+(In Vim regular expressions, |\<| and |\>| denote word boundaries. Thus "if" -+matches the end of "endif" but "\" does not.) Then banging on the "%" -+key will bounce the cursor between "if" and the matching "endif"; and from -+"while" to any matching "continue" or "break", then to the matching "endwhile" -+and back to the "while". It is almost always easier to use |literal-string|s -+(single quotes) as above: '\' rather than "\\" and so on. -+ -+Exception: If the ":" character does not appear in b:match_words, then it is -+treated as an expression to be evaluated. For example, > -+ :let b:match_words = 'GetMatchWords()' -+allows you to define a function. This can return a different string depending -+on the current syntax, for example. -+ -+Once you have defined the appropriate value of |b:match_words|, you will -+probably want to have this set automatically each time you edit the -+appropriate file type. The recommended way to do this is by adding the -+definition to a |filetype-plugin| file. -+ -+Tips: Be careful that your initial pattern does not match your final pattern. -+See the example above for the use of word-boundary expressions. It is usually -+better to use ".\{-}" (as many as necessary) instead of ".*" (as many as -+possible). See |\{-|. For example, in the string "label", "<.*>" -+matches the whole string whereas "<.\{-}>" and "<[^>]*>" match "" and -+"". -+ -+ *matchit-spaces* *matchit-s:notend* -+If "if" is to be paired with "end if" (Note the space!) then word boundaries -+are not enough. Instead, define a regular expression s:notend that will match -+anything but "end" and use it as follows: > -+ :let s:notend = '\%(\:\' -+< *matchit-s:sol* -+This is a simplified version of what is done for Ada. The s:notend is a -+|script-variable|. Similarly, you may want to define a start-of-line regular -+expression > -+ :let s:sol = '\%(^\|;\)\s*' -+if keywords are only recognized after the start of a line or after a -+semicolon (;), with optional white space. -+ -+ *matchit-backref* *matchit-\1* -+In any group, the expressions |\1|, |\2|, ..., |\9| refer to parts of the -+INITIAL pattern enclosed in |\(|escaped parentheses|\)|. These are referred -+to as back references, or backrefs. For example, > -+ :let b:match_words = '\:\(h\)\1\>' -+means that "bo" pairs with "ho" and "boo" pairs with "hoo" and so on. Note -+that "\1" does not refer to the "\(h\)" in this example. If you have -+"\(nested \(parentheses\)\) then "\d" refers to the d-th "\(" and everything -+up to and including the matching "\)": in "\(nested\(parentheses\)\)", "\1" -+refers to everything and "\2" refers to "\(parentheses\)". If you use a -+variable such as |s:notend| or |s:sol| in the previous paragraph then remember -+to count any "\(" patterns in this variable. You do not have to count groups -+defined by |\%(\)|. -+ -+It should be possible to resolve back references from any pattern in the -+group. For example, > -+ :let b:match_words = '\(foo\)\(bar\):more\1:and\2:end\1\2' -+would not work because "\2" cannot be determined from "morefoo" and "\1" -+cannot be determined from "andbar". On the other hand, > -+ :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1' -+should work (and have the same effect as "foobar:barfoo:endfoobar"), although -+this has not been thoroughly tested. -+ -+You can use |zero-width| patterns such as |\@<=| and |\zs|. (The latter has -+not been thouroughly tested in matchit.vim.) For example, if the keyword "if" -+must occur at the start of the line, with optional white space, you might use -+the pattern "\(^\s*\)\@<=if" so that the cursor will end on the "i" instead of -+at the start of the line. For another example, if HTML had only one tag then -+one could > -+ :let b:match_words = '<:>,<\@<=tag>:<\@<=/tag>' -+so that "%" can bounce between matching "<" and ">" pairs or (starting on -+"tag" or "/tag") between matching tags. Without the |\@<=|, the script would -+bounce from "tag" to the "<" in "", and another "%" would not take you -+back to where you started. -+ -+DEBUGGING *matchit-debug* *:MatchDebug* -+ -+If you are having trouble figuring out the appropriate definition of -+|b:match_words| then you can take advantage of the same information I use when -+debugging the script. This is especially true if you are not sure whether -+your patterns or my script are at fault! To make this more convenient, I have -+made the command :MatchDebug, which defines the variable |b:match_debug| and -+creates a Matchit menu. This menu makes it convenient to check the values of -+the variables described below. You will probably also want to read -+|matchit-details| above. -+ -+Defining the variable |b:match_debug| causes the script to set the following -+variables, each time you hit the "%" key. Several of these are only defined -+if |b:match_words| includes |backref|s. -+ -+ *b:match_pat* -+The b:match_pat variable is set to |b:match_words| with |backref|s parsed. -+ *b:match_match* -+The b:match_match variable is set to the bit of text that is recognized as a -+match. -+ *b:match_col* -+The b:match_col variable is set to the cursor column of the start of the -+matching text. -+ *b:match_wholeBR* -+The b:match_wholeBR variable is set to the comma-separated group of patterns -+that matches, with |backref|s unparsed. -+ *b:match_iniBR* -+The b:match_iniBR variable is set to the first pattern in |b:match_wholeBR|. -+ *b:match_ini* -+The b:match_ini variable is set to the first pattern in |b:match_wholeBR|, -+with |backref|s resolved from |b:match_match|. -+ *b:match_tail* -+The b:match_tail variable is set to the remaining patterns in -+|b:match_wholeBR|, with |backref|s resolved from |b:match_match|. -+ *b:match_word* -+The b:match_word variable is set to the pattern from |b:match_wholeBR| that -+matches |b:match_match|. -+ *b:match_table* -+The back reference '\'.d refers to the same thing as '\'.b:match_table[d] in -+|b:match_word|. -+ -+============================================================================== -+5. Known Bugs and Limitations *matchit-bugs* -+ -+Just because I know about a bug does not mean that it is on my todo list. I -+try to respond to reports of bugs that cause real problems. If it does not -+cause serious problems, or if there is a work-around, a bug may sit there for -+a while. Moral: if a bug (known or not) bothers you, let me know. -+ -+The various |:vmap|s defined in the script (%, |g%|, |[%|, |]%|, |a%|) may -+have undesired effects in Select mode |Select-mode-mapping|. At least, if you -+want to replace the selection with any character in "ag%[]" there will be a -+pause of |'updatetime'| first. -+ -+It would be nice if "\0" were recognized as the entire pattern. That is, it -+would be nice if "foo:\end\0" had the same effect as "\(foo\):\end\1". I may -+try to implement this in a future version. (This is not so easy to arrange as -+you might think!) -+ -+============================================================================== -+vim: filetype=help -+vim:tw=78:fo=tcq2: -diff -urN vim71/1/doc/NERD_commenter.txt vim71_ada/1/doc/NERD_commenter.txt ---- vim71/1/doc/NERD_commenter.txt 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/NERD_commenter.txt 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,1155 @@ -+*NERD_comments.txt* Plugin for commenting code v169 -+ -+ -+ NERD_COMMENTS REFERENCE MANUAL~ -+ -+ -+ -+ -+ -+============================================================================== -+CONTENTS {{{2 *NERD_comments-contents* -+ -+ 1.Intro...................................|NERD_comments| -+ 2.Functionality provided..................|NERD_com-functionality| -+ 2.1 Functionality Summary.............|NERD_com-functionality-summary| -+ 2.2 Functionality Details.............|NERD_com-functionality-details| -+ 2.2.1 Comment map.................|NERD_com-comment| -+ 2.2.2 Nested comment map..........|NERD_com-nested-comment| -+ 2.2.3 Toggle comment map..........|NERD_com-toggle-comment| -+ 2.2.4 Minimal comment map.........|NERD_com-minimal-comment| -+ 2.2.5 Invert comment map..........|NERD_com-invert-comment| -+ 2.2.6 Sexy comment map............|NERD_com-sexy-comment| -+ 2.2.7 Yank comment map............|NERD_com-yank-comment| -+ 2.2.8 Comment to EOL map..........|NERD_com-EOL-comment| -+ 2.2.9 Append com to line map......|NERD_com-append-comment| -+ 2.2.10 Prepend com to line map....|NERD_com-prepend-comment| -+ 2.2.11 Insert comment map.........|NERD_com-insert-comment| -+ 2.2.12 Use alternate delims map...|NERD_com-alt-delim| -+ 2.2.13 Comment aligned maps.......|NERD_com-aligned-comment| -+ 2.2.14 Uncomment line map.........|NERD_com-uncomment-line| -+ 2.3 Supported filetypes...............|NERD_com-filetypes| -+ 2.4 Sexy Comments.....................|NERD_com_sexy_comments| -+ 3.Customisation...........................|NERD_com-customisation| -+ 3.1 Customisation summary.............|NERD_com-cust-summary| -+ 3.2 Customisation details.............|NERD_com-cust-details| -+ 3.3 Default delimiter customisation...|NERD_com-cust-delims| -+ 3.4 Key mapping customisation.........|NERD_com-cust-keys| -+ 3.5 Sample regular expressions........|NERD_com-reg-exps| -+ 4.Issues with the script..................|NERD_com-issues| -+ 4.1 Delimiter detection heuristics....|NERD_com-heuristics| -+ 4.2 Nesting issues....................|NERD_com-nesting| -+ 4.3 Nesting issues....................|NERD_com-nesting| -+ 4.3 Mark clobbering...................|NERD_com-mark-clobbering| -+ 5.TODO list...............................|NERD_com-todo| -+ 6.Credits.................................|NERD_com-credits| -+ -+============================================================================== -+1. Intro {{{2 *NERD_comments* -+ -+NERD_comments provides a set of handy key mappings for commenting code. These -+mappings are consistent across all supported filetypes. -+ -+When writing NERD_comments I have tried to give it as many features/options as -+possible while keeping it so that the plugin can still be used with little or -+no knowledge of these. The average user need only know about a few key -+mappings to use NERD_comments while there are plenty of other features for the -+l33t nerd take advantage of. -+ -+Enjoy :D -+ -+============================================================================== -+2. Functionality provided {{{2 *NERD_com-functionality* -+ -+------------------------------------------------------------------------------ -+2.1 Functionality summary {{{3 *NERD_com-functionality-summary* -+ -+The following key mappings are provided by default (there is also a menu -+provided that contains menu items corresponding to all the below mappings): -+ -+Note: is a user defined key that is used to start keymappings and -+defaults to \. Check out || for details. -+ -+Most of the following mappings are for normal/visual mode only. The -+|NERD_com-insert-comment| mapping is for insert mode only. -+ -+cc |NERD_com-comment-map| -+Comments out the current line or text selected in visual mode. -+ -+ -+cn |NERD_com-nested-comment| -+Same as |NERD_com-comment-map| but enforces nesting. -+ -+ -+c |NERD_com-toggle-comment| -+Toggles the comment state of the selected line(s). If the topmost selected -+line is commented, all selected lines are uncommented and vice versa. -+ -+ -+cm |NERD_com-minimal-comment| -+Comments the given lines using only one set of multipart delimiters if -+possible. -+ -+ -+ci |NERD_com-invert-comment| -+Toggles the comment state of the selected line(s) individually. Each selected -+line that is commented is uncommented and vice versa. -+ -+ -+cs |NERD_com-sexy-comment| -+Comments out the selected lines ``sexually'' -+ -+ -+cy |NERD_com-yank-comment| -+Same as |NERD_com-comment-map| except that the commented line(s) are yanked -+before commenting. -+ -+ -+c$ |NERD_com-EOL-comment| -+Comments the current line from the cursor to the end of line. -+ -+ -+cA |NERD_com-append-comment| -+Adds comment delimiters to the end of line and goes into insert mode between -+them. -+ -+ -+cI |NERD_com-prepend-comment| -+Adds comment delimiters to the start of line and goes into insert mode between -+them. -+ -+ -+ |NERD_com-insert-comment| -+Adds comment delimiters at the current cursor position and inserts between. -+ -+ -+ca |NERD_com-alt-delim| -+Switches to the alternative set of delimiters. -+ -+ -+cl OR cr OR cb |NERD_com-aligned-comment| -+Same as |NERD_com-comment| except that the delimiters are aligned down the -+left side (cl), the right side (cr) or both sides -+(cb). -+ -+ -+cu |NERD_com-uncomment-line| -+Uncomments the selected line(s). -+ -+------------------------------------------------------------------------------ -+2.2 Functionality details {{{3 *NERD_com-functionality-details* -+ -+------------------------------------------------------------------------------ -+2.2.1 Comment map *NERD_com-comment* -+cc -+Comments out the current line. If multiple lines are selected in visual-line -+mode, they are all commented out. If some text is selected in visual or -+visual-block mode then NERD_comments will try to comment out the exact text -+that is selected using multi-part delimiters if they are available. -+ -+Works in normal, visual, visual-line and visual-block mode. -+ -+Change the mapping with: |NERD_com_line_map|. -+ -+Relevant options: -+|NERD_allow_any_visual_delims_regexp| -+|NERD_comment_whole_lines_in_v_mode| -+|NERD_block_com_after_right| -+|NERD_left_align_regexp| -+|NERD_place_holder_regexp| -+|NERD_right_align_regexp| -+|NERD_space_delim_filetype_regexp| -+|NERD_use_nested_comments_default| -+ -+------------------------------------------------------------------------------ -+2.2.2 Nested comment map *NERD_com-nested-comment* -+cn -+Performs nested commenting. Works the same as cc except that if a -+line is already commented then it will be commented again. -+ -+If the filetype is covered by the |NERD_place_holder_regexp| option -+then the previous comment delimiters will be replaced by place-holder -+delimiters if needed. Otherwise the nested comment will only be added if the -+current commenting delimiters have no right delimiter (to avoid compiler -+errors) -+ -+Works in normal, visual, visual-line, visual-block modes. -+ -+Change the mapping with: |NERD_com_line_nest_map|. -+ -+Relevant options: -+|NERD_allow_any_visual_delims_regexp| -+|NERD_comment_whole_lines_in_v_mode| -+|NERD_block_com_after_right| -+|NERD_left_align_regexp| -+|NERD_place_holder_regexp| -+|NERD_right_align_regexp| -+|NERD_space_delim_filetype_regexp| -+|NERD_use_nested_comments_default| -+ -+ -+------------------------------------------------------------------------------ -+2.2.3 Toggle comment map *NERD_com-toggle-comment* -+c -+Toggles commenting of the lines selected. The behaviour of this mapping -+depends on whether the first line selected is commented or not. If so, all -+selected lines are uncommented and vice versa. -+ -+With this mapping, lines are only considered to be commented if a left comment -+delimiter is the first non-space/tab char on the line. -+ -+Works in normal, visual-line, modes. -+Using this mapping in visual or visual-block modes will cause it to work like -+|NERD_com-comment| -+ -+Change the mapping with: |NERD_com_line_toggle_map|. -+ -+Relevant options: -+|NERD_left_align_regexp| -+|NERD_right_align_regexp| -+|NERD_space_delim_filetype_regexp| -+|NERD_use_nested_comments_default| -+ -+------------------------------------------------------------------------------ -+2.2.4 Minimal comment map *NERD_com-minimal-comment* -+cm -+Comments the selected lines using one set of multipart delimiters if possible. -+ -+For example: if you are programming in c and you select 5 lines and press -+cm then a '/*' will be placed at the start of the top line and a '*/' -+will be placed at the end of the last line. -+ -+Sets of multipart comment delimiters that are between the top and bottom -+selected lines are replaced with place holders (see |NERD_lPlace|) if -+NERD_place_holder_regexp is set for the current filetype. If it is not, then -+the comment will be aborted if place holders are required to prevent illegal -+syntax. -+ -+------------------------------------------------------------------------------ -+2.2.5 Invert comment map *NERD_com-invert-comment* -+ci -+Inverts the commented state of each selected line. If the a selected line is -+commented then it is uncommented and vice versa. Each line is examined and -+commented/uncommented individually. -+ -+With this mapping, lines are only considered to be commented if a left comment -+delimiter is the first non-space/tab char on the line. -+ -+Works in normal, visual-line, modes. -+ -+Change the mapping with: |NERD_com_line_invert_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.6 Sexy comment map *NERD_com-sexy-comment* -+cs -+Comments the selected line(s) ``sexily''... see |NERD_com_sexy_commenting| for -+a description of what sexy comments are. Can only be done on filetypes for -+which there is at least one set of multipart comment delimiters specified. -+ -+Sexy comments cannot be nested and lines inside a sexy comment cannot be -+commented again. -+ -+Works in normal, visual-line. -+ -+Change the mapping with: |NERD_com_line_sexy_map| -+ -+Relevant options: -+|NERD_use_compact_sexy_com_regexp| -+ -+------------------------------------------------------------------------------ -+2.2.7 Yank comment map *NERD_com-yank-comment* -+cy -+Same as cc except that it yanks the line(s) that are commented first. -+ -+Works in normal, visual, visual-line, visual-block modes. -+ -+Change the mapping with: |NERD_com_line_yank_map| -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.8 Comment to EOL map *NERD_com-EOL-comment* -+c$ -+Comments the current line from the current cursor position up to the end of -+the line. -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_com_to_end_of_line_map| -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.9 Append com to line map *NERD_com-append-comment* -+cA -+Appends comment delimiters to the end of the current line and goes -+to insert mode between the new delimiters. -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_append_com_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.10 Prepend com to line map *NERD_com-prepend-comment* -+cI -+Prepends comment delimiters to the start of the current line and goes to -+insert mode between the new delimiters. -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_prepend_com_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.11 Insert comment map *NERD_com-insert-comment* -+ -+Adds comment delimiters at the current cursor position and inserts -+between them. -+ -+Works in insert mode. -+ -+Change the mapping with: |NERD_com_in_insert_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.12 Use alternate delims map *NERD_com-alt-delim* -+ca -+Changes to the alternative commenting style if one is available. For example, -+if the user is editing a c++ file using // comments and they hit ca -+then they will be switched over to /**/ comments. -+keys for this mappings can be overridden with the -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_alt_com_map| -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.13 Comment aligned maps *NERD_com-aligned-comment* -+cl cr cb -+Same as cc except that the comment delimiters are aligned on the left -+side, right side or both sides respectively. These comments are always nested -+if the line(s) are already commented. -+ -+Works in normal, visual-line. -+ -+Change the mappings with: |NERD_com_align_left_map|, |NERD_com_align_right_map| -+and |NERD_com_align_both_map|. -+ -+Relevant options: -+|NERD_left_align_regexp| -+|NERD_right_align_regexp| -+ -+ -+------------------------------------------------------------------------------ -+2.2.14 Uncomment line map *NERD_com-uncomment-line* -+cu -+Uncomments the current line. If multiple lines are selected in -+visual mode then they are all uncommented. -+ -+When uncommenting, if the line contains multiple sets of delimiters then the -+``outtermost'' pair of delimiters will be removed. -+ -+The script uses a set of heurisics to distinguish ``real'' delimiters from -+``fake'' ones when uncommenting. See |NERD_com-issues| for details. -+ -+Works in normal, visual, visual-line, visual-block. -+ -+Change the mapping with: |NERD_uncom_line_map|. -+ -+Relevant options: -+|NERD_dont_remove_alt_coms| -+|NERD_dont_remove_spaces_regexp| -+ -+ -+------------------------------------------------------------------------------ -+2.3 Supported filetypes *NERD_com-filetypes* -+ -+Files that can be commented by this plugin: -+abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asm -+asn aspvbs atlas automake ave awk basic b bc bdf bib bindzone btm caos catalog -+c cfg cg ch cl clean clipper conf config cpp crontab cs csc csp css cterm cupl -+cvs dcl def diff dns dosbatch dosini dot dracula dsl dtd dtml dylan ecd eiffel -+elf elmfilt erlang eruby eterm expect exports fgl focexec form fortran foxpro -+fvwm fx gdb gdmo gnuplot gtkrc haskell hb h help hercules hog html htmlos ia64 -+icon idlang idl indent inform inittab ishd iss ist jam java javascript jess -+jgraph jproperties jproperties jsp kix kscript lace lex lftp lifelines lilo -+lisp lite lotos lout lprolog lscript lss lua lynx m4 make maple masm master -+matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc named -+nasm nastran natural ncf netrw nqc nsis ocaml omnimark openroad opl ora ox -+pascal pcap pccts perl pfmain php phtml pic pike pilrc pine plm plsql po -+postscr pov povini ppd ppwiz procmail progress prolog psf ptcap python python -+radiance ratpoison r rc readline rebol registry remind rexx robots rpl ruby sa -+samba sas sather scheme scilab screen scsh sdl sed sgml sgmldecl sgmllnx sicad -+simula sinda skill slang sl slrnrc sm smil smith sml snnsnet snnspat snnsres -+snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp strace svn tads -+taglist tags tak tasm tcl terminfo tex texinfo texmf tf tidy tli trasys tsalt -+tsscl tssgm uc uil vb verilog vgrindefs vhdl vim virata vrml vsejcl webmacro -+wget winbatch wml sh wvdial xdefaults xf86conf xhtml xkb xmath xml xmodmap -+xpm2 xpm xslt yacc yaml z8a -+ -+If a language is not in the list of hardcoded supported filetypes then the -+&commentstring vim option is used. -+ -+ -+------------------------------------------------------------------------------ -+2.4 Sexy Comments *NERD_com_sexy_comments* -+These are comments that use one set of multipart comment delimiters as well as -+one other marker symbol. For example: > -+ /* -+ * This is a c style sexy comment -+ * So there! -+ */ -+ -+ /* This is a c style sexy comment -+ * So there! -+ * But this one is ``compact'' style */ -+< -+Here the multipart delimiters are /* and */ and the marker is *. NERD_comments -+is capable of adding and removing comments of this type. -+ -+ -+============================================================================== -+3. Customisation {{{2 *NERD_com-customisation* -+ -+------------------------------------------------------------------------------ -+3.1 Customisation summary *NERD_com-cust-summary* -+ -+|loaded_nerd_comments| Turns off the script. -+|NERD_allow_any_visual_delims_regexp| Allows multipart alternative delims to -+ be used when commenting in -+ visual/visual-block mode. -+|NERD_block_com_after_right| Forces right delims to be placed when -+ doing visual-block comments. -+|NERD_comment_whole_lines_in_v_mode| Changes behaviour of visual comments. -+|NERD_menu_mode| Determines if a NERD comment menu will -+ be made and whether the menu will have a -+ keyboard shortcut. -+|NERD_dont_remove_alt_coms| Causes alternative comments not to be -+ removed when uncommenting. -+|NERD_dont_remove_spaces_regexp| Causes spaces not to be removed when -+ uncommenting if the filetype doesnt -+ match |NERD_space_delim_filetype_regexp| -+|NERD_create_h_filetype| Creates a new filetype for .h files. -+|NERD_lPlace| Specifies what to use as the left -+ delimiter placeholder when nesting -+ comments. -+|NERD_left_align_regexp| Specifies which filetypes to align left -+ delimiters for. -+|NERD_mapleader| Specifies what all the commenting key -+ mappings will begin with. -+|NERD_place_holder_regexp| Specifies which filetypes may use -+ placeholders when nesting comments. -+|NERD_right_align_regexp| Specifies which filetypes to align right -+ delimiters for. -+|NERD_rPlace| Specifies what to use as the right -+ delimiter placeholder when nesting -+ comments. -+|NERD_shut_up| Stops all output from the script. -+|NERD_space_delim_filetype_regexp| Specifies which filetypes to add spaces -+ around the delimiters for. -+|NERD_use_compact_sexy_com_regexp| Specifies which filetypes to use compact -+ sexy comments for. -+|NERD_use_nested_comments_default| Tells the script to use nested comments -+ by default. -+ -+----------------------------------------------------------------------------- -+3.3 Customisation details *NERD_com-cust-details* -+ -+To enable any of the below options you should put the given line in your -+~/.vimrc -+ -+ *loaded_nerd_comments* -+If this script is driving you insane you can turn it off by setting this -+option > -+ let loaded_nerd_comments=1 -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_allow_any_visual_delims_regexp* -+This option is set to a regular expression that is used to specify which -+filetypes this option should be turned on for. If this covers the current -+filetype then, when NERD_comments is doing a visual or visual-block comment -+(but not a visual-line comment) it will choose the right delimiters to use for -+the comment. This normally means using the current delimiters if they are -+multipart or using the alternative delimiters if THEY are multipart and the -+current delims are not. For example if we are editing the following java -+code: > -+ float foo = 1221; -+ float bar = 324; -+ System.out.println(foo * bar); -+< -+If we are using // comments and select the "foo" and "bar" in visual-block -+mode, as shown left below (where '|'s are used to represent the visual-block -+boundary), and comment it then it will use the alternative delims as shown on -+the right: > -+ float |foo| = 1221; float /*foo*/ = 1221; -+ float |bar| = 324; float /*bar*/ = 324; -+ System.out.println(foo * bar); System.out.println(foo * bar); -+< -+By default this option is set to '.*' i.e is turned on for all filetypes. -+ -+----------------------------------------------------------------------------- -+ *NERD_block_com_after_right* -+This option affects commenting when it is done in visual-block mode. If this -+option is turned on, lines that begin outside the right boundary of the -+selection block will be commented. Enable this option with: > -+ let NERD_block_com_after_right=1 -+< -+For example, if you are commenting this chunk of c code in visual-block mode -+(where the '|'s are used to represent the visual-block boundary) > -+ #include -+ #include -+ #include -+ |int| main(){ -+ | | printf("SUCK THIS\n"); -+ | | while(1){ -+ | | fork(); -+ | | } -+ |} | -+< -+If NERD_block_com_after_right=1 then this code will become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ /* */ printf("SUCK THIS\n"); -+ /* */ while(1){ -+ /* */ fork(); -+ /* */ } -+ /*} */ -+< -+Otherwise, the code block would become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ printf("SUCK THIS\n"); -+ while(1){ -+ fork(); -+ } -+ /*} */ -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_comment_whole_lines_in_v_mode* -+This option can take 2 values. By default NERD_comments tries to comment out -+exactly what is selected in visual mode (v). For example if you select and -+comment the following c code (using | to represent the visual boundary): > -+ in|t foo = 3; -+ int bar =| 9; -+ int baz = foo + bar; -+< -+This will result in: > -+ in/*t foo = 3;*/ -+ /*int bar =*/ 9; -+ int baz = foo + bar; -+< -+But some people prefer it if the whole lines are commented like: > -+ /*int foo = 3;*/ -+ /*int bar = 9;*/ -+ int baz = foo + bar; -+< -+If you prefer the second option then stick this line in your .vimrc: > -+ let NERD_comment_whole_lines_in_v_mode=1 -+< -+ -+If the filetype you are editing only has no multipart delimiters (for example -+a shell script) and you hadnt set this option then the above would become > -+ in#t foo = 3; -+ #int bar = 9; -+< -+(where # is the comment delimiter) as this is the closest NERD_comments can -+come to commenting out exactly what was selected. If you prefer for whole -+lines to be commented out when there is no multipart delimiters but the EXACT -+text that was selected to be commented out if there IS multipart delimiters -+then stick the following line in your .vimrc: > -+ let NERD_comment_whole_lines_in_v_mode=2 -+< -+ -+Note that this option does not affect the behaviour of visual-block mode (). -+ -+----------------------------------------------------------------------------- -+ *NERD_dont_remove_alt_coms* -+When uncommenting a line when there is an alternative commenting style for the -+current filetype, this option tells the script not to look for, and remove, -+comments delimiters of the alternative style. > -+ let NERD_dont_remove_alt_coms=1 -+< -+For example, if you are editing a c++ file using // style comments and you go -+cu on this line: > -+ /* This is a c++ comment baby! */ -+< -+It will not be uncommented if the NERD_dont_remove_alt_coms is set to 1. -+ -+----------------------------------------------------------------------------- -+ *NERD_dont_remove_spaces_regexp* -+By default, the NERD commenter will remove spaces around comment delimiters if -+either: -+1. The current filetype matches the |NERD_space_delim_filetype_regexp| option -+ (which is a regular expression). -+2. The current filtype doesnt match NERD_dont_remove_spaces_regexp option -+ (which is also a reg exp) -+ -+This means that if we have the following lines in a c code file: > -+ /* int foo = 5; */ -+ /* int bar = 10; */ -+ int baz = foo + bar -+< -+If either of the above conditions hold then if these lines are uncommented -+they will become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+Otherwise they would become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+If you want the spaces to be removed only if the current filetype matches -+|NERD_space_delim_filetype_regexp| then set the -+NERD_dont_remove_spaces_regexp option in your vimrc so that it matches the -+desired filetypes. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+Defaults to "^python$" -+ -+----------------------------------------------------------------------------- -+ *NERD_create_h_filetype* -+If this option is set then NERD_comments will create a seperate filetype for h -+files. This could be needed because some versions of vim treat h files as cpp -+files which can be dodgy for commenting because if you are using // to comment -+cpp files then this is invalid when you are commenting h files for a c -+project (unless you arent adhering to the ANSI standard... naughty naughty). -+To enable this option, stick the following line in your .vimrc: > -+ let NERD_create_h_filetype = 1 -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_lPlace* -+ *NERD_rPlace* -+These options are used to control the strings used as place-holder delimiters. -+Place holder delimiters are used when performing nested commenting when the -+filetype supports commenting styles with both left and right delimiters. -+To set these options use lines like: > -+ let NERD_lPlace="FOO" -+ let NERD_rPlace="BAR" -+< -+Following the above example, if we have line of c code: > -+ /* int horse */ -+< -+and we comment it with cn it will be changed to: > -+ /*FOO int horse BAR*/ -+< -+When we uncomment this line it will go back to what it was. -+NERD_lPlace defaults to '[>', NERD_rPlace defaults to '<]'. -+ -+----------------------------------------------------------------------------- -+ *NERD_left_align_regexp* -+This option is a regular expression which is used to specify which filetypes -+should have their left delimiters aligned when commenting multiple lines. -+ -+For example, consider this chunk of c code: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 while(foo < 50){ -+ 4 foo = foo + bar; -+ 5 printf("i am just making up this code\n"); -+ 6 printf("i have no idea what im writing\n"); -+ 7 } -+< -+If the NERD_left_align_regexp regexp covers c files then if we select lines -+3-7 in visual mode and hit cc the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /*while(foo < 50){*/ -+ 4 /* foo = foo + bar;*/ -+ 5 /* printf("i am just making up this code\n");*/ -+ 6 /* printf("i have no idea what im writing\n");*/ -+ 7 /*}*/ -+< -+If NERD_left_align_regexp doesnt cover c files then the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /* while(foo < 50){ */ -+ 4 /* foo = foo + bar; */ -+ 5 /* printf("i am just making up this code\n"); */ -+ 6 /* printf("i have no idea what im writing\n"); */ -+ 7 /* } */ -+< -+NERD_left_align_regexp defaults to '^$' meaning no filetypes have their left -+delims aligned. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_mapleader* -+NERD_mapleader is used to specify what all the NERD commenter key mappings -+begin with. -+ -+Assuming that == '\', the default key mappings will look like this: > -+ \cc -+ \cu -+ \ca -+ \ci -+ \cs -+ ... -+< -+However, if this line: > -+ let NERD_mapleader = ',x' -+< -+were present in your vimrc then the default mappings would look like this: > -+ ,xc -+ ,xu -+ ,xa -+ ,xi -+ ,xs -+ ... -+< -+This option only affects the mappings that have not been explicitly set -+manually (see |NERD_com-cust-keys|). -+ -+Default is c. -+ -+----------------------------------------------------------------------------- -+ *NERD_menu_mode* -+This option can take 3 values: -+ "0": Turns the NERD commenter menu off completely. -+ "1": Turns the NERD commenter menu on with no menu shortcut. -+ "2": Turns the NERD commenter menu on with -c as the menu shortcut. -+ -+Default is "2". -+ -+----------------------------------------------------------------------------- -+ *NERD_place_holder_regexp* -+This option is a regular expression which is used to specify which filetypes -+place-holder delimiters should be used for when adding nested comments. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_right_align_regexp* -+This option is a regular expression which is used to specify which filetypes -+should have their right delimiters aligned when commenting multiple lines. -+ -+For example, consider this chunk of c code: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 while(foo < 50){ -+ 4 foo = foo + bar; -+ 5 printf("i am just making up this code\n"); -+ 6 printf("i have no idea what im writing\n"); -+ 7 } -+< -+If the NERD_right_align_regexp regexp covers c files then if we select lines -+3-7 in visual mode and hit cc the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /*while(foo < 50){ */ -+ 4 /*foo = foo + bar; */ -+ 5 /*printf("i am just making up this code\n"); */ -+ 6 /*printf("i have no idea what im writing\n");*/ -+ 7 /*} */ -+< -+If NERD_right_align_regexp doesnt cover c files then the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /* while(foo < 50){ */ -+ 4 /* foo = foo + bar; */ -+ 5 /* printf("i am just making up this code\n"); */ -+ 6 /* printf("i have no idea what im writing\n"); */ -+ 7 /* } */ -+< -+NERD_right_align_regexp defaults to '^$' meaning no filetypes have their right -+delims aligned. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_shut_up* -+This option is used to prevent NERD_comments from echoing anything. -+Stick this line in your .vimrc: > -+ let NERD_shut_up=1 -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_space_delim_filetype_regexp* -+Some people prefer a space after the left delimiter and before the right -+delimiter like this: > -+ /* int foo=2; */ -+< -+as opposed to this: > -+ /*int foo=2;*/ -+< -+This option is a regular expression that is used to specify which filetypes -+NERD_comments should use spaces for (as in the first eg above). -+NERD_space_delim_filetype_regexp defaults to '^$'. -+ -+See also |NERD_dont_remove_spaces_regexp|. -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_use_compact_sexy_com_regexp* -+Some people may want their sexy comments to be like this: > -+ /* Hi There! -+ * This is a sexy comment -+ * in c */ -+< -+As opposed to like this: > -+ /* -+ * Hi There! -+ * This is a sexy comment -+ * in c -+ */ -+< -+The option NERD_use_compact_sexy_com_regexp is a regular expression. If the -+filetype that the user is commenting matches this regular expression then when -+they do sexy comments they will look like the first comment above. -+ -+----------------------------------------------------------------------------- -+ *NERD_use_nested_comments_default* -+When this option is turned on comments are nested automatically. That is, if -+you hit cc on a line that is already commented, or contains comments, -+it will be commented again. > -+ let NERD_use_nested_comments_default=1 -+< -+ -+----------------------------------------------------------------------------- -+3.3 Default delimiter customisation *NERD_com-cust-delims* -+These options are used to tell NERD_comments which delimiters to use for a -+given filetype when it first loads up. To set one of these options just stick -+the corresponding line in your .vimrc. For example: if i want to use /* */ to -+delimit comments in java files instead of // (which is the default) then I -+would stick this line in my .vimrc: > -+ let NERD_use_c_style_java_comments=1 -+< -+ -+Note that if filetype has two commenting styles, which are both supported, you -+can switch between them with ca. See |NERD_com-alt-delim|. These -+options only change which style is used when the script is initialsed. -+ -+NERD_use_ada_with_spaces: use -- instead of -- for ada files. -+NERD_use_c_style_acedb_comments: use /**/ instead of // for acedb files. -+NERD_use_c_style_ch_comments: use /**/ instead of // for ch files. -+NERD_use_c_style_clean_comments: use /**/ instead of // for clean files. -+NERD_use_c_style_clipper_comments: use /**/ instead of // for clipper files. -+NERD_use_c_style_cpp_comments: use /**/ instead of // for c++ files. -+NERD_use_c_style_cs_comments: use /**/ instead of // for c# files. -+NERD_use_c_style_dot_comments: use /**/ instead of // for dot files. -+NERD_use_c_style_dylan_comments: use /**/ instead of // for dylan files. -+NERD_use_c_style_h_comments: use /**/ instead of // for h files. -+NERD_use_c_style_hercules_comments: use /**/ instead of // for hercules files. -+NERD_use_c_style_idl_comments: use /**/ instead of // for idl files. -+NERD_use_c_style_ishd_comments: use /**/ instead of // for ishd files. -+NERD_use_c_style_java_comments: use /**/ instead of // for java files. -+NERD_use_c_style_javascript_comments: use /**/ instead of // for javascript files. -+NERD_use_c_style_kscript_comments: use /**/ instead of // for kscript files. -+NERD_use_c_style_mel_comments: use /**/ instead of // for mel files. -+NERD_use_c_style_named_comments: use /**/ instead of // for named files. -+NERD_use_c_style_pccts_comments: use /**/ instead of // for pccts files. -+NERD_use_c_style_php_comments: use /* */ instead of // for php files. -+NERD_use_c_style_pike_comments: use /**/ instead of // for pike files. -+NERD_use_c_style_pilrc_comments: use /**/ instead of // for pilrc files. -+NERD_use_c_style_plm_comments: use /**/ instead of // for plm files. -+NERD_use_c_style_pov_comments: use /**/ instead of // for pov files. -+NERD_use_c_style_prolog_comments: use /**/ instead of % for prolog files. -+NERD_use_c_style_rc_comments: use /**/ instead of // for rc files. -+NERD_use_c_style_tads_comments: use /**/ instead of // for tads files. -+NERD_use_c_style_tsalt_comments: use /**/ instead of // for tsalt files. -+NERD_use_c_style_uc_comments: use /**/ instead of // for uc files. -+NERD_use_c_style_verilog_comments: use /**/ instead of // for verilog files. -+NERD_use_dash_dash_simula_comments: use -- instead of % for simula files. -+NERD_use_dnl_style_automake_comments: use dnl instead of # for automake files. -+NERD_use_hash_samba_comments: use # instead of ; for samba files. -+NERD_use_long_haskell_comments: use {--} instead of -- for haskell files. -+NERD_use_long_lisp_comments: use #||# instead of ; for lisp files. -+NERD_use_long_lua_comments: use --[[]] instead of -- for lua files. -+NERD_use_paren_star_pascal_comments: use (**) instead of {} for pascal files. -+NERD_use_REM_basic_comments: use REM instead of ' for basic files. -+NERD_use_single_part_c_comments: use // instead of /* */ for c files. -+ -+ -+----------------------------------------------------------------------------- -+3.4 Key mapping customisation *NERD_com-cust-keys* -+ -+These options are used to override the default keys that are used for the -+commenting mappings. Their values must be set to strings. As an example: if -+you wanted to use the mapping foo to uncomment lines of code then -+you would place this line in your vimrc > -+ let NERD_uncom_line_map="foo" -+< -+ -+Check out |NERD_com-functionality| for details about what the following -+mappings do. -+ -+ *NERD_alt_com_map* -+To override the ca mapping, set this option > -+ let NERD_alt_com_map="" -+< -+ *NERD_append_com_map* -+To override the ce mapping, set this option > -+ let NERD_append_com_map="" -+< -+ *NERD_com_align_left_map* -+To override the cl mapping, set this option > -+ let NERD_com_align_left_map="" -+< -+ *NERD_com_align_both_map* -+To override the cb mapping, set this option > -+ let NERD_com_align_both_map="" -+< -+ *NERD_com_align_right_map* -+To override the cr mapping, set this option > -+ let NERD_com_align_right_map="" -+< -+ *NERD_com_in_insert_map* -+To override the mapping, set this option > -+ let NERD_com_in_insert_map="" -+< -+ *NERD_com_line_invert_map* -+To override the ci mapping, set this option > -+ let NERD_com_line_invert_map="" -+< -+ *NERD_com_line_map* -+To override the cc mapping, set this option > -+ let NERD_com_line_map="" -+< -+ *NERD_com_line_nest_map* -+To override the cn mapping, set this option > -+ let NERD_com_line_nest_map="" -+< -+ *NERD_com_line_sexy_map* -+To override the cs mapping, set this option > -+ let NERD_com_line_sexy_map="" -+< -+ *NERD_com_line_toggle_map* -+To override the c mapping, set this option > -+ let NERD_com_line_toggle_map="" -+< -+ *NERD_com_line_minimal_map* -+To override the cm mapping, set this option > -+ let NERD_com_line_minimal_map="" -+< -+ *NERD_com_to_end_of_line_map* -+To override the c$ mapping, set this option > -+ let NERD_com_to_end_of_line_map="" -+< -+ *NERD_com_line_yank_map* -+To override the cy mapping, set this option > -+ let NERD_com_line_yank_map="" -+< -+ *NERD_uncom_line_map* -+To override the cu mapping, set this option > -+ let NERD_uncom_line_map="" -+< -+ -+------------------------------------------------------------------------------ -+3.5 Sample regular expressions *NERD_com-reg-exps* -+ -+Many of the options in the NERD commenter must be set to regular -+expressions... regular expressions can be a bit confusing so i have provided -+some template ones here that you can start from: -+ -+Regexp1: '.*' -+Matches any filetype. This is useful for turning an option on for all files. -+ -+Regexp2: '^$' -+Matches no filetypes. This is useful for turning an option off for all files. -+ -+Regexp3: '^\(java\)$' -+Matches only the java filetype. -+ -+Regexp4: '^\(c\|vim\)$' -+Matches only c and vim filetypes. -+ -+Regexp5: '^\(c.*\|vim\)$' -+Matches filetypes beginning with c (eg c, cpp, cs, etc) as well -+as vim files. -+ -+Regexp6: '^\(c.*\|java\|tex\)$' -+Matches filetypes beginning with c (eg c, cpp, cs, etc) as well as java and -+tex filetypes. -+ -+Regexp7: '^\(python\)\@!' -+Matches anything other than 'python'. -+ -+Regexp8: '^c\(s\)\@!' -+Matches 'c' followed by anything accept an 's'. -+ -+Regexp9: '^\(foo$\|bar$\|baz$\)\@!' -+Matches any strings except 'foo', 'bar' and 'baz'. -+ -+============================================================================== -+4. Issues with the script{{{2 *NERD_com-issues* -+ -+ -+------------------------------------------------------------------------------ -+4.1 Delimiter detection heuristics *NERD_com-heuristics* -+ -+Heuristics are used to distinguish the real comment delimiters -+ -+Because we have comment mappings that place delimiters in the middle of lines, -+removing comment delimiters is a bit tricky. This is because if comment -+delimiters appear in a line doesnt mean they really ARE delimiters. For -+example, Java uses // comments but the line > -+ System.out.println("//"); -+< -+clearly contains no real comment delimiters. -+ -+To distinguish between ``real'' comment delimiters and ``fake'' ones we use a -+set of heuristics. For example, one such heuristic states that any comment -+delimiter that has an odd number of non-escaped " characters both preceding -+and following it on the line is not a comment because it is probably part of a -+string. These heuristics, while usually pretty accurate, will not work for all -+cases. -+ -+------------------------------------------------------------------------------ -+4.2 Nesting issues *NERD_com-nesting* -+ -+If we have some line of code like this: > -+ /*int foo */ = /*5 + 9;*/ -+< -+This will not be uncommented legally. The NERD commenter will remove the -+"outter most" delimiters so the line will become: > -+ int foo */ = /*5 + 9; -+< -+which almost certainly will not be what you want. Nested sets of comments will -+uncomment fine though. Eg: > -+ /*int/* foo =*/ 5 + 9;*/ -+< -+will become: > -+ int/* foo =*/ 5 + 9; -+< -+(Note that in the above examples I have deliberately not used place holders -+for simplicity) -+ -+------------------------------------------------------------------------------ -+4.3 Mark clobbering *NERD_com-mark-clobbering* -+ -+The script clobbers the s and t marks when doing most comments. Im not sure -+how to save and restore the marks yet. -+ -+ -+ -+============================================================================== -+5. TODO list {{{2 *NERD_com-todo* -+ -+Uncommenting of minimal comments needs to be more robust. Currently it is easy -+to get illegal syntax when uncommenting them. -+ -+ -+ -+============================================================================== -+6. Credits {{{2 *NERD_com-credits* -+ -+Thanks and respect to the following people: -+ -+Thanks to Nick Brettell for his many ideas and criticisms. A bloody good -+bastard. -+:normal :.-2s/good// -+ -+Thanks to Matthew Hawkins for his awesome refactoring! -+ -+Thanks to the authors of the vimspell whose documentation -+installation function I stole :) -+ -+Thanks to Greg Searle for the idea of using place-holders for nested comments. -+ -+Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! -+Also, thanks for the idea of doing sexy comments as well as his suggestions -+relating to it :P -+Thanks again to Nguyen for complaining about the NERD_comments menu mapping -+(-c) interfering with another mapping of his... and thus the -+NERD_dont_create_menu_shortcut option was born :P -+(it was then replaced with NERD_menu_mode in version 1.67 :) -+ -+Thanks to Sam R for pointing out some filetypes that NERD_comments could support! -+ -+Cheers to Litchi for the idea of having a mapping that appends a comment to -+the current line :) -+ -+Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some -+problems with commenting in visual mode. Thanks again to Jorge for his -+continued suggestions on this matter :) -+ -+Thanks to Martin Stubenschrott for pointing out a bug with the mapping -+:) Ive gotta stop breaking this mapping! -+ -+Thanks to Markus Erlmann for pointing out a conflict that this script was -+having with the taglist plugin. -+ -+Thanks to Brent Rice for alerting me about, and helping me track down, a bug -+in the script when the "ignorecase" option in vim was set. -+ -+Thanks to Richard Willis for telling me about how line continuation was -+causing problems on cygwin. Also, thanks pointing out a bug in the help file -+and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI -+have mercy on your soul :) -+ -+Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". -+Also, thanks for his suggested improvements about toggle comments after i -+implemented them. -+ -+Thanks to harry for telling me that i broke the cn mapping in 1.53 :), -+and thanks again for telling me about a bug that occurred when editing a file -+in a new tab. -+ -+Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc -+install function and added support for ada comments with spaces as well as -+making a couple of other small changes. -+ -+Thanks to David Bourgeois for pointing out a bug with when commenting c files -+:)... [a few days later] ok i completely misunderstood what David was talking -+about and ended up fixing a completely different bug to what he was talking -+about :P -+ -+Thanks to David Bourgeois for pointing out a bug when changing buffers. -+ -+Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that -+was causing spaces to be added to the end of lines with single-part -+delimiters. It's nice when people do my work for me :D -+ -+Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting -+sexy comments. Sexy comments dont look so sexy when they are only half removed -+:P -+ -+Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping -+the NERD_space_delim_filetype_regexp option from working with left aligned -+toggle comments. And for pointing out a bug when initialising VB comments. -+ -+Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". -+And for suggested improvements to minimal comments. -+ -+Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. -+In 1.65 -+ -+Thanks to Jonathan Derque for alerting me to some filetypes that could be -+supported (Namely: context, plaintext and mail). -+ -+Thanks to Joseph Barker for the sugesting that the menu be an optional -+feature. -+ -+Thanks to Gary Church and Tim Carey-Smith for complaining about the -+keymappings and causing me to introduce the NERD_mapleader option :) -+ -+ -+Cheers to myself for being the best looking man on Earth! -+ -+ -+ vim:tw=78:ts=8:ft=help:norl: -diff -urN vim71/1/doc/.svn/all-wcprops vim71_ada/1/doc/.svn/all-wcprops ---- vim71/1/doc/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,29 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 48 -+/svnroot/gnuada/!svn/ver/788/trunk/tools/vim/doc -+END -+NERD_commenter.txt -+K 25 -+svn:wc:ra_dav:version-url -+V 67 -+/svnroot/gnuada/!svn/ver/695/trunk/tools/vim/doc/NERD_commenter.txt -+END -+taglist.txt -+K 25 -+svn:wc:ra_dav:version-url -+V 60 -+/svnroot/gnuada/!svn/ver/695/trunk/tools/vim/doc/taglist.txt -+END -+matchit.txt -+K 25 -+svn:wc:ra_dav:version-url -+V 60 -+/svnroot/gnuada/!svn/ver/637/trunk/tools/vim/doc/matchit.txt -+END -+ft_ada.txt -+K 25 -+svn:wc:ra_dav:version-url -+V 59 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/doc/ft_ada.txt -+END -diff -urN vim71/1/doc/.svn/dir-prop-base vim71_ada/1/doc/.svn/dir-prop-base ---- vim71/1/doc/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,6 @@ -+K 10 -+svn:ignore -+V 9 -+.backups -+ -+END -diff -urN vim71/1/doc/.svn/entries vim71_ada/1/doc/.svn/entries ---- vim71/1/doc/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/entries 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,80 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/doc -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-10-20T15:07:17.667304Z -+788 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -+NERD_commenter.txt -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+67487d5a77170782f3bad494085dedfb -+2007-04-27T17:57:11.151403Z -+695 -+krischik -+has-props -+ -+taglist.txt -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+33a058766478d752e8d1dfe9071a08f3 -+2007-04-27T17:57:11.151403Z -+695 -+krischik -+has-props -+ -+matchit.txt -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+7ee1544d0c37d7a8d699cf0baf0b70f7 -+2007-03-12T16:56:27.566705Z -+637 -+krischik -+has-props -+ -+ft_ada.txt -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+0e59f93e383b93e67cd824c362123989 -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -diff -urN vim71/1/doc/.svn/format vim71_ada/1/doc/.svn/format ---- vim71/1/doc/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/format 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/doc/.svn/prop-base/ft_ada.txt.svn-base vim71_ada/1/doc/.svn/prop-base/ft_ada.txt.svn-base ---- vim71/1/doc/.svn/prop-base/ft_ada.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/prop-base/ft_ada.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,5 @@ -+K 13 -+svn:mime-type -+V 10 -+text/plain -+END -diff -urN vim71/1/doc/.svn/prop-base/matchit.txt.svn-base vim71_ada/1/doc/.svn/prop-base/matchit.txt.svn-base ---- vim71/1/doc/.svn/prop-base/matchit.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/prop-base/matchit.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,5 @@ -+K 13 -+svn:mime-type -+V 10 -+text/plain -+END -diff -urN vim71/1/doc/.svn/prop-base/NERD_commenter.txt.svn-base vim71_ada/1/doc/.svn/prop-base/NERD_commenter.txt.svn-base ---- vim71/1/doc/.svn/prop-base/NERD_commenter.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/prop-base/NERD_commenter.txt.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,5 @@ -+K 13 -+svn:mime-type -+V 10 -+text/plain -+END -diff -urN vim71/1/doc/.svn/prop-base/taglist.txt.svn-base vim71_ada/1/doc/.svn/prop-base/taglist.txt.svn-base ---- vim71/1/doc/.svn/prop-base/taglist.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/prop-base/taglist.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,5 @@ -+K 13 -+svn:mime-type -+V 10 -+text/plain -+END -diff -urN vim71/1/doc/.svn/text-base/ft_ada.txt.svn-base vim71_ada/1/doc/.svn/text-base/ft_ada.txt.svn-base ---- vim71/1/doc/.svn/text-base/ft_ada.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/text-base/ft_ada.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,516 @@ -+*ft_ada.txt* Ada File type Plug-ins Last change: 2007 Seb 17 -+ -+ -+ ADA FILE TYPE PLUG-INS REFERENCE MANUAL~ -+ -+ADA *ada.vim* -+ -+1. Syntax Highlighting |ft-ada-syntax| -+2. Plug-in |ft-ada-plugin| -+3. Omni Completion |ft-ada-omni| -+ 3.1 Omni Completion with "gnat xref" |gnat-xref| -+ 3.2 Omni Completion with "ctags" |ada-ctags| -+4. Compiler Support |ada-compiler| -+ 4.1 GNAT |compiler-gnat| -+ 4.1 Dec Ada |compiler-decada| -+5. References |ada-reference| -+ 5.1 Options |ft-ada-options| -+ 5.2 Functions |ft-ada-functions| -+ 5.3 Commands |ft-ada-commands| -+ 5.4 Variables |ft-ada-variables| -+ 5.5 Constants |ft-ada-contstants| -+8. Extra Plug-ins |ada-extra-plugins| -+ -+============================================================================== -+1. Syntax Highlighting ~ -+ *ft-ada-syntax* -+ -+This mode is designed for the 2005 edition of Ada ("Ada 2005"), which includes -+support for objected-programming, protected types, and so on. It handles code -+written for the original Ada language ("Ada83", "Ada87", "Ada95") as well, -+though code which uses Ada 2005-only keywords will be wrongly colored (such -+code should be fixed anyway). For more information about Ada, see -+http://www.adapower.com. -+ -+The Ada mode handles a number of situations cleanly. -+ -+For example, it knows that the "-" in "-5" is a number, but the same character -+in "A-5" is an operator. Normally, a "with" or "use" clause referencing -+another compilation unit is coloured the same way as C's "#include" is coloured. -+If you have "Conditional" or "Repeat" groups coloured differently, then "end -+if" and "end loop" will be coloured as part of those respective groups. -+ -+You can set these to different colours using vim's "highlight" command (e.g., -+to change how loops are displayed, enter the command ":hi Repeat" followed by -+the colour specification; on simple terminals the colour specification -+ctermfg=White often shows well). -+ -+There are several options you can select in this Ada mode. See|ft-ada-options| -+for a complete list. -+ -+To enable them, assign a value to the option. For example, to turn one on: -+ > -+ > let g:ada_standard_types = 1 -+> -+To disable them use ":unlet". Example: -+> -+ > unlet g:ada_standard_types -+ -+You can just use ":" and type these into the command line to set these -+temporarily before loading an Ada file. You can make these option settings -+permanent by adding the "let" command(s), without a colon, to your "~/.vimrc" -+file. -+ -+Even on a slow (90Mhz) PC this mode works quickly, but if you find the -+performance unacceptable, turn on |g:ada_withuse_ordinary|. -+ -+Syntax folding instructions (|fold-syntax|) are added when |g:ada_folding| is -+set. -+ -+============================================================================== -+2. File type Plug-in ~ -+ *ft-ada-indent* *ft-ada-plugin* -+ -+The Ada plug-in provides support for: -+ -+ - auto indenting (|indent.txt|) -+ - insert completion (|i_CTRL-N|) -+ - user completion (|i_CTRL-X_CTRL-U|) -+ - tag searches (|tagsrch.txt|) -+ - Quick Fix (|quickfix.txt|) -+ - backspace handling (|'backspace'|) -+ - comment handling (|'comments'|, |'commentstring'|) -+ -+The plug-in only activates the features of the Ada mode whenever an Ada -+files is opened and add adds Ada related entries to the main and pop-up menu. -+ -+============================================================================== -+3. Omni Completion ~ -+ *ft-ada-omni* -+ -+The Ada omni-completions (|i_CTRL-X_CTRL-O|) uses tags database created either -+by "gnat xref -v" or the "exuberant Ctags (http://ctags.sourceforge.net). The -+complete function will automatically detect which tool was used to create the -+tags file. -+ -+------------------------------------------------------------------------------ -+3.1 Omni Completion with "gnat xref" ~ -+ *gnat-xref* -+ -+GNAT XREF uses the compiler internal information (ali-files) to produce the -+tags file. This has the advantage to be 100% correct and the option of deep -+nested analysis. However the code must compile, the generator is quite -+slow and the created tags file contains only the basic Ctags information for -+each entry - not enough for some of the more advanced Vim code browser -+plug-ins. -+ -+NOTE: "gnat xref -v" is very tricky to use as it has almost no diagnostic -+ output - If nothing is printed then usually the parameters are wrong. -+ Here some important tips: -+ -+1) You need to compile your code first and use the "-aO" option to point to -+ your .ali files. -+2) "gnat xref -v ../Include/adacl.ads" won't work - use the "gnat xref -v -+ -aI../Include adacl.ads" instead. -+3) "gnat xref -v -aI../Include *.ad?" won't work - use "cd ../Include" and -+ then "gnat xref -v *.ad?" -+4) Project manager support is completely broken - don't even try "gnat xref -+ -Padacl.gpr". -+5) VIM is faster when the tags file is sorted - use "sort --unique -+ --ignore-case --output=tags tags" . -+6) Remember to insert "!_TAG_FILE_SORTED 2 %sort ui" as first line to mark -+ the file assorted. -+ -+------------------------------------------------------------------------------ -+3.2 Omni Completion with "ctags"~ -+ *ada-ctags* -+ -+Exuberant Ctags uses it's own multi-language code parser. The parser is quite -+fast, produces a lot of extra informations (hence the name "Exuberant Ctags") -+and can run on files which currently do not compile. -+ -+There are also lots of other Vim-tools which use exuberant Ctags. -+ -+You will need to install a version of the Exuberant Ctags which has Ada -+support patched in. Such a version is available from the GNU Ada Project -+(http://gnuada.sourceforge.net). -+ -+The Ada parser for Exuberant Ctags is fairly new - don't expect complete -+support yet. -+ -+============================================================================== -+4. Compiler Support ~ -+ *ada-compiler* -+ -+The Ada mode supports more then one Ada compiler and will automatically load the -+compiler set in|g:ada_default_compiler|whenever an Ada source is opened. The -+provided compiler plug-ins are split into the actual compiler plug-in and a -+collection of support functions and variables. This allows the easy -+development of specialized compiler plug-ins fine tuned to your development -+environment. -+ -+------------------------------------------------------------------------------ -+4.1 GNAT ~ -+ *compiler-gnat* -+ -+GNAT is the only free (beer and speech) Ada compiler available. There are -+several version available which differentiate in the licence terms used. -+ -+The GNAT compiler plug-in will perform a compile on pressing and then -+immediately shows the result. You can set the project file to be used by -+setting: -+ > -+ > call g:gnat.Set_Project_File ('my_project.gpr') -+ -+Setting a project file will also create a Vim session (|views-sessions|) so - -+like with the GPS - opened files, window positions etc. will remembered -+separately for all projects. -+ -+ *gnat_members* -+GNAT OBJECT ~ -+ -+ *g:gnat.Make()* -+g:gnat.Make() -+ Calls|g:gnat.Make_Command|and displays the result inside a -+ |quickfix| window. -+ -+ *g:gnat.Pretty()* -+g:gnat.Pretty() -+ Calls|g:gnat.Pretty_Command| -+ -+ *g:gnat.Find()* -+g:gnat.Find() -+ Calls|g:gnat.Find_Command| -+ -+ *g:gnat.Tags()* -+g:gnat.Tags() -+ Calls|g:gnat.Tags_Command| -+ -+ *g:gnat.Set_Project_File()* -+g:gnat.Set_Project_File([{file}]) -+ Set gnat project file and load associated session. An open -+ project will be closed and the session written. If called -+ without file name the file selector opens for selection of a -+ project file. If called with an empty string then the project -+ and associated session are closed. -+ -+ *g:gnat.Project_File* -+g:gnat.Project_File string -+ Current project file. -+ -+ *g:gnat.Make_Command* -+g:gnat.Make_Command string -+ External command used for|g:gnat.Make()| (|'makeprg'|). -+ -+ *g:gnat.Pretty_Program* -+g:gnat.Pretty_Program string -+ External command used for|g:gnat.Pretty()| -+ -+ *g:gnat.Find_Program* -+g:gnat.Find_Program string -+ External command used for|g:gnat.Find()| -+ -+ *g:gnat.Tags_Command* -+g:gnat.Tags_Command string -+ External command used for|g:gnat.Tags()| -+ -+ *g:gnat.Error_Format* -+g:gnat.Error_Format string -+ Error format (|'errorformat'|) -+ -+------------------------------------------------------------------------------ -+4.2 Dec Ada ~ -+ *compiler-hpada* *compiler-decada* -+ *compiler-vaxada* *compiler-compaqada* -+ -+Dec Ada (also known by - in chronological order - VAX Ada, Dec Ada, Compaq Ada -+and HP Ada) is a fairly dated Ada 83 compiler. Support is basic: will -+compile the current unit. -+ -+The Dec Ada compiler expects the package name and not the file name to be -+passed a parameter. The compiler plug-in supports the usual file name -+convention to convert the file into a unit name. For separates both '-' and -+'__' are allowed. -+ -+ *decada_members* -+DEC ADA OBJECT ~ -+ -+ *g:decada.Make()* -+g:decada.Make() function -+ Calls|g:decada.Make_Command|and displays the result inside a -+ |quickfix| window. -+ -+ *g:decada.Unit_Name()* -+g:decada.Unit_Name() function -+ Get the Unit name for the current file. -+ -+ *g:decada.Make_Command* -+g:decada.Make_Command string -+ External command used for|g:decadat.Make()| (|'makeprg'|). -+ -+ *g:decada.Error_Format* -+g:decada.Error_Format| string -+ Error format (|'errorformat'|). -+ -+============================================================================== -+5. References ~ -+ *ada-reference* -+ -+------------------------------------------------------------------------------ -+5.1 Options ~ -+ *ft-ada-options* -+ -+ *g:ada_standard_types* -+g:ada_standard_types bool (true when exists) -+ Highlight types in package Standard (e.g., "Float") -+ -+ *g:ada_space_errors* -+ *g:ada_no_trail_space_error* -+ *g:ada_no_tab_space_error* -+ *g:ada_all_tab_usage* -+g:ada_space_errors bool (true when exists) -+ Highlight extraneous errors in spaces ... -+ g:ada_no_trail_space_error -+ - but ignore trailing spaces at the end of a line -+ g:ada_no_tab_space_error -+ - but ignore tabs after spaces -+ g:ada_all_tab_usage -+ - highlight all tab use -+ -+ *g:ada_line_errors* -+g:ada_line_errors bool (true when exists) -+ Highlight lines which are to long. Note: This highlighting -+ option is quite CPU intensive. -+ -+ *g:ada_rainbow_color* -+g:ada_rainbow_color bool (true when exists) -+ Use rainbow colours for '(' and ')'. You need the -+ rainbow_parenthesis for this to work -+ -+ *g:ada_folding* -+g:ada_folding set ('sigpft') -+ Use folding for Ada sources. -+ 's': activate syntax folding on load -+ 'p': fold packages -+ 'f': fold functions and procedures -+ 't': fold types -+ 'c': fold conditionals -+ 'g': activate gnat pretty print folding on load -+ 'i': lone 'is' folded with line above -+ 'b': lone 'begin' folded with line above -+ 'p': lone 'private' folded with line above -+ 'x': lone 'exception' folded with line above -+ 'i': activate indent folding on load -+ -+ Note: Syntax folding is in an early (unuseable) stage and -+ indent or gnat pretty folding is suggested. -+ -+ For gnat pretty folding to work the following settings are -+ suggested: -cl3 -M79 -c2 -c3 -c4 -A1 -A2 -A3 -A4 -A5 -+ -+ For indent folding to work the following settings are -+ suggested: shiftwidth=3 softtabstop=3 -+ -+ *g:ada_abbrev* -+g:ada_abbrev bool (true when exists) -+ Add some abbreviations. This feature more or less superseded -+ by the various completion methods. -+ -+ *g:ada_withuse_ordinary* -+g:ada_withuse_ordinary bool (true when exists) -+ Show "with" and "use" as ordinary keywords (when used to -+ reference other compilation units they're normally highlighted -+ specially). -+ -+ *g:ada_begin_preproc* -+g:ada_begin_preproc bool (true when exists) -+ Show all begin-like keywords using the colouring of C -+ preprocessor commands. -+ -+ *g:ada_omni_with_keywords* -+g:ada_omni_with_keywords -+ Add Keywords, Pragmas, Attributes to omni-completions -+ (|compl-omni|). Note: You can always complete then with user -+ completion (|i_CTRL-X_CTRL-U|). -+ -+ *g:ada_extended_tagging* -+g:ada_extended_tagging enum ('jump', 'list') -+ use extended tagging, two options are available -+ 'jump': use tjump to jump. -+ 'list': add tags quick fix list. -+ Normal tagging does not support function or operator -+ overloading as these features are not available in C and -+ tagging was originally developed for C. -+ -+ *g:ada_extended_completion* -+g:ada_extended_completion -+ Uses extended completion for and completions -+ (|i_CTRL-N|). In this mode the '.' is used as part of the -+ identifier so that 'Object.Method' or 'Package.Procedure' are -+ completed together. -+ -+ *g:ada_gnat_extensions* -+g:ada_gnat_extensions bool (true when exists) -+ Support GNAT extensions. -+ -+ *g:ada_with_gnat_project_files* -+g:ada_with_gnat_project_files bool (true when exists) -+ Add gnat project file keywords and Attributes. -+ -+ *g:ada_default_compiler* -+g:ada_default_compiler string -+ set default compiler. Currently supported is 'gnat' and -+ 'decada'. -+ -+An "exists" type is a boolean is considered true when the variable is defined -+and false when the variable is undefined. The value which the variable is -+set makes no difference. -+ -+------------------------------------------------------------------------------ -+5.3 Commands ~ -+ *ft-ada-commands* -+ -+:AdaRainbow *:AdaRainbow* -+ Toggles rainbow colour (|g:ada_rainbow_color|) mode for -+ '(' and ')' -+ -+:AdaLines *:AdaLines* -+ Toggles line error (|g:ada_line_errors|) display -+ -+:AdaSpaces *:AdaSpaces* -+ Toggles space error (|g:ada_space_errors|) display. -+ -+:AdaTagDir *:AdaTagDir* -+ Creates tags file for the directory of the current file. -+ -+:AdaTagFile *:AdaTagFile* -+ Creates tags file for the current file. -+ -+:AdaTypes *:AdaTypes* -+ Toggles standard types (|g:ada_standard_types|) colour. -+ -+:GnatFind *:GnatFind* -+ Calls |g:gnat.Find()| -+ -+:GnatPretty *:GnatPretty* -+ Calls |g:gnat.Pretty()| -+ -+:GnatTags *:GnatTags* -+ Calls |g:gnat.Tags()| -+ -+------------------------------------------------------------------------------ -+5.3 Variables ~ -+ *ft-ada-variables* -+ -+ *g:gnat* -+g:gnat object -+ Control object which manages GNAT compiles. The object -+ is created when the first Ada source code is loaded provided -+ that |g:ada_default_compiler|is set to 'gnat'. See|gnat_members| -+ for details. -+ -+ *g:decada* -+g:decada object -+ Control object which manages Dec Ada compiles. The object -+ is created when the first Ada source code is loaded provided -+ that |g:ada_default_compiler|is set to 'decada'. See -+ |decada_members|for details. -+ -+------------------------------------------------------------------------------ -+5.4 Constants ~ -+ *ft-ada-constants* -+ ft-ada-constants -+ -+All constants are locked. See |:lockvar| for details. -+ -+ *g:ada#WordRegex* -+g:ada#WordRegex string -+ Regular expression to search for Ada words -+ -+ *g:ada#DotWordRegex* -+g:ada#DotWordRegex string -+ Regular expression to search for Ada words separated by dots. -+ -+ *g:ada#Comment* -+g:ada#Comment string -+ Regular expression to search for Ada comments -+ -+ *g:ada#Keywords* -+g:ada#Keywords list of dictionaries -+ List of keywords, attributes etc. pp. in the format used by -+ omni completion. See |complete-items| for details. -+ -+ *g:ada#Ctags_Kinds* -+g:ada#Ctags_Kinds dictionary of lists -+ Dictionary of the various kinds of items which the Ada support -+ for Ctags generates. -+ -+------------------------------------------------------------------------------ -+5.2 Functions ~ -+ *ft-ada-functions* -+ -+ada#Word([{line}, {col}]) *ada#Word()* -+ Return full name of Ada entity under the cursor (or at given -+ line/column), stripping white space/newlines as necessary. -+ -+ada#List_Tag([{line}, {col}]) *ada#Listtags()* -+ List all occurrences of the Ada entity under the cursor (or at -+ given line/column) inside the quick-fix window -+ -+ada#Jump_Tag ({ident}, {mode}) *ada#Jump_Tag()* -+ List all occurrences of the Ada entity under the cursor (or at -+ given line/column) in the tag jump list. Mode can either be -+ 'tjump' or 'stjump'. -+ -+ada#Create_Tags ({option}) *ada#Create_Tags()* -+ Creates tag file using Ctags. The option can either be 'file' -+ for the current file, 'dir' for the directory of the current -+ file or a file name. -+ -+gnat#Insert_Tags_Header() *gnat#Insert_Tags_Header()* -+ Adds the tag file header (!_TAG_) information to the current -+ file which are missing from the GNAT XREF output. -+ -+ada#Switch_Syntax_Option ({option}) *ada#Switch_Syntax_Option()* -+ Toggles highlighting options on or off. Used for the Ada menu. -+ -+ *gnat#New()* -+gnat#New () -+ Create a new gnat object. See |g:gnat| for details. -+ -+ -+============================================================================== -+8. Extra Plugins ~ -+ *ada-extra-plugins* -+ -+You can optionally install the following extra plug-in. They work well with Ada -+and enhance the ability of the Ada mode.: -+ -+backup.vim -+ http://www.vim.org/scripts/script.php?script_id=1537 -+ Keeps as many backups as you like so you don't have to. -+ -+rainbow_parenthsis.vim -+ http://www.vim.org/scripts/script.php?script_id=1561 -+ Very helpful since Ada uses only '(' and ')'. -+ -+nerd_comments.vim -+ http://www.vim.org/scripts/script.php?script_id=1218 -+ Excellent commenting and uncommenting support for almost any -+ programming language. -+ -+matchit.vim -+ http://www.vim.org/scripts/script.php?script_id=39 -+ '%' jumping for any language. The normal '%' jump only works for '{}' -+ style languages. The Ada mode will set the needed search patters. -+ -+taglist.vim -+ http://www.vim.org/scripts/script.php?script_id=273 -+ Source code explorer sidebar. There is a patch for Ada available. -+ -+The GNU Ada Project distribution (http://gnuada.sourceforge.net) of Vim -+contains all of the above. -+ -+============================================================================== -+vim: textwidth=78 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+vim: filetype=help -diff -urN vim71/1/doc/.svn/text-base/matchit.txt.svn-base vim71_ada/1/doc/.svn/text-base/matchit.txt.svn-base ---- vim71/1/doc/.svn/text-base/matchit.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/text-base/matchit.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,405 @@ -+*matchit.txt* Extended "%" matching -+ -+For instructions on installing this file, type -+ :help matchit-install -+inside Vim. -+ -+For Vim version 6.3. Last change: 2006 Feb 23 -+ -+ -+ VIM REFERENCE MANUAL by Benji Fisher -+ -+*matchit* *matchit.vim* -+ -+1. Extended matching with "%" |matchit-intro| -+2. Activation |matchit-activate| -+3. Configuration |matchit-configure| -+4. Supporting a New Language |matchit-newlang| -+5. Known Bugs and Limitations |matchit-bugs| -+ -+The functionality mentioned here is a plugin, see |add-plugin|. -+This plugin is only available if 'compatible' is not set. -+You can avoid loading this plugin by setting the "loaded_matchit" variable -+in your |vimrc| file: > -+ :let loaded_matchit = 1 -+ -+{Vi does not have any of this} -+ -+============================================================================== -+1. Extended matching with "%" *matchit-intro* -+ -+ *matchit-%* -+% Cycle forward through matching groups, such as "if", "else", "endif", -+ as specified by |b:match_words|. -+ -+ *g%* *v_g%* *o_g%* -+g% Cycle backwards through matching groups, as specified by -+ |b:match_words|. For example, go from "endif" to "else" to "if". -+ -+ *[%* *v_[%* *o_[%* -+[% Go to [count] previous unmatched group, as specified by -+ |b:match_words|. Similar to |[{|. -+ -+ *]%* *v_]%* *o_]%* -+]% Go to [count] next unmatched group, as specified by -+ |b:match_words|. Similar to |]}|. -+ -+ *v_a%* -+a% In Visual mode, select the matching group, as specified by -+ |b:match_words|, containing the cursor. Similar to |v_a[|. -+ A [count] is ignored, and only the first character of the closing -+ pattern is selected. -+ -+In Vim, as in plain vi, the percent key, |%|, jumps the cursor from a brace, -+bracket, or paren to its match. This can be configured with the 'matchpairs' -+option. The matchit plugin extends this in several ways: -+ -+ You can match whole words, such as "if" and "endif", not just -+ single characters. You can also specify a |regular-expression|. -+ You can define groups with more than two words, such as "if", -+ "else", "endif". Banging on the "%" key will cycle from the "if" to -+ the first "else", the next "else", ..., the closing "endif", and back -+ to the opening "if". Nested structures are skipped. Using |g%| goes -+ in the reverse direction. -+ By default, words inside comments and strings are ignored, unless -+ the cursor is inside a comment or string when you type "%". If the -+ only thing you want to do is modify the behavior of "%" so that it -+ behaves this way, you can > -+ :let b:match_words = &matchpairs -+< -+See |matchit-details| for details on what the script does, and |b:match_words| -+for how to specify matching patterns. -+ -+MODES: *matchit-modes* *matchit-v_%* *matchit-o_%* -+ -+Mostly, % and related motions (|g%| and |[%| and |]%|) work just like built-in -+|motion| commands in |Operator-pending| and |Visual| modes. However, you -+cannot make these motions |linewise| or |characterwise|, since the |:omap|s -+that define them start with "v" in order to make the default behavior -+inclusive. (See |o_v|.) In other words, "dV%" will not work. The -+work-around is to go through Visual mode: "V%d" will work. -+ -+LANGUAGES: *matchit-languages* -+ -+Currently, the following languages are supported: Ada, ASP with VBS, Csh, -+DTD, Entity, Essbase, Fortran, HTML, JSP (same as HTML), LaTeX, Lua, Pascal, -+SGML, Shell, Tcsh, Vim, XML. Other languages may already have support via -+|filetype-plugin|s. -+ -+To support a new language, see |matchit-newlang| below. -+ -+DETAILS: *matchit-details* *matchit-parse* -+ -+Here is an outline of what matchit.vim does each time you hit the "%" key. If -+there are |backref|s in |b:match_words| then the first step is to produce a -+version in which these back references have been eliminated; if there are no -+|backref|s then this step is skipped. This step is called parsing. For -+example, "\(foo\|bar\):end\1" is parsed to yield -+"\(foo\|bar\):end\(foo\|bar\)". This can get tricky, especially if there are -+nested groups. If debugging is turned on, the parsed version is saved as -+|b:match_pat|. -+ -+ *matchit-choose* -+Next, the script looks for a word on the current line that matches the pattern -+just constructed. It includes the patterns from the 'matchpairs' option. -+The goal is to do what you expect, which turns out to be a little complicated. -+The script follows these rules: -+ -+ Insist on a match that ends on or after the cursor. -+ Prefer a match that includes the cursor position (that is, one that -+ starts on or before the cursor). -+ Prefer a match that starts as close to the cursor as possible. -+ Prefer a match in |b:match_words| to a match in 'matchpairs'. -+ If more than one pattern in |b:match_words| matches, choose the one -+ that is listed first. -+ -+Examples: -+ -+ Suppose you > -+ :let b:match_words = '<:>,:' -+< and hit "%" with the cursor on or before the "<" in "a is born". -+ The pattern '<' comes first, so it is preferred over '', which -+ also matches. If the cursor is on the "t", however, then '' is -+ preferred, because this matches a bit of text containing the cursor. -+ If the two groups of patterns were reversed then '<' would never be -+ preferred. -+ -+ Suppose you > -+ :let b:match_words = 'if:end if' -+< (Note the space!) and hit "%" with the cursor at the end of "end if". -+ Then "if" matches, which is probably not what you want, but if the -+ cursor starts on the "end " then "end if" is chosen. (You can avoid -+ this problem by using a more complicated pattern.) -+ -+If there is no match, the script falls back on the usual behavior of |%|. If -+debugging is turned on, the matched bit of text is saved as |b:match_match| -+and the cursor column of the start of the match is saved as |b:match_col|. -+ -+Next, the script looks through |b:match_words| (original and parsed versions) -+for the group and pattern that match. If debugging is turned on, the group is -+saved as |b:match_ini| (the first pattern) and |b:match_tail| (the rest). If -+there are |backref|s then, in addition, the matching pattern is saved as -+|b:match_word| and a table of translations is saved as |b:match_table|. If -+there are |backref|s, these are determined from the matching pattern and -+|b:match_match| and substituted into each pattern in the matching group. -+ -+The script decides whether to search forwards or backwards and chooses -+arguments for the |searchpair()| function. Then, the cursor is moved to the -+start of the match, and |searchpair()| is called. By default, matching -+structures inside strings and comments are ignored. This can be changed by -+setting |b:match_skip|. -+ -+============================================================================== -+2. Activation *matchit-activate* -+ -+You can use this script as a plugin, by copying it to your plugin directory. -+See |add-global-plugin| for instructions. You can also add a line to your -+|vimrc| file, such as > -+ :source $VIMRUNTIME/macros/matchit.vim -+or > -+ :runtime macros/matchit.vim -+Either way, the script should start working the next time you start up Vim. -+ -+The script does nothing unless it finds a |buffer-variable| named -+|b:match_words|. The script contains autocommands that set this variable for -+various file types: see |matchit-languages| above. For a new language, you -+can add autocommands to the script or to your vimrc file, but the recommended -+method is to add a line such as > -+ let b:match_words = '\:\' -+to the |filetype-plugin| for your language. See |b:match_words| below for how -+this variable is interpreted. -+ -+TROUBLESHOOTING *matchit-troubleshoot* -+ -+The script should work in most installations of Vim. It may not work if Vim -+was compiled with a minimal feature set, for example if the |+syntax| option -+was not enabled. If your Vim has support for syntax compiled in, but you do -+not have |syntax| highlighting turned on, matchit.vim should work, but it may -+fail to skip matching groups in comments and strings. If the |filetype| -+mechanism is turned off, the |b:match_words| variable will probably not be -+defined automatically. -+ -+============================================================================== -+3. Configuration *matchit-configure* -+ -+There are several variables that govern the behavior of matchit.vim. Note -+that these are variables local to the buffer, not options, so use |:let| to -+define them, not |:set|. Some of these variables have values that matter; for -+others, it only matters whether the variable has been defined. All of these -+can be defined in the |filetype-plugin| or autocommand that defines -+|b:match_words| or "on the fly." -+ -+The main variable is |b:match_words|. It is described in the section below on -+supporting a new language. -+ -+ *MatchError* *matchit-hl* *matchit-highlight* -+MatchError is the highlight group for error messages from the script. By -+default, it is linked to WarningMsg. If you do not want to be bothered by -+error messages, you can define this to be something invisible. For example, -+if you use the GUI version of Vim and your command line is normally white, you -+can do > -+ :hi MatchError guifg=white guibg=white -+< -+ *b:match_ignorecase* -+If you > -+ :let b:match_ignorecase = 1 -+then matchit.vim acts as if 'ignorecase' is set: for example, "end" and "END" -+are equivalent. If you > -+ :let b:match_ignorecase = 0 -+then matchit.vim treats "end" and "END" differently. (There will be no -+b:match_infercase option unless someone requests it.) -+ -+ *b:match_debug* -+Define b:match_debug if you want debugging information to be saved. See -+|matchit-debug|, below. -+ -+ *b:match_skip* -+If b:match_skip is defined, it is passed as the skip argument to -+|searchpair()|. This controls when matching structures are skipped, or -+ignored. By default, they are ignored inside comments and strings, as -+determined by the |syntax| mechanism. (If syntax highlighting is turned off, -+nothing is skipped.) You can set b:match_skip to a string, which evaluates to -+a non-zero, numerical value if the match is to be skipped or zero if the match -+should not be skipped. In addition, the following special values are -+supported by matchit.vim: -+ s:foo becomes (current syntax item) =~ foo -+ S:foo becomes (current syntax item) !~ foo -+ r:foo becomes (line before cursor) =~ foo -+ R:foo becomes (line before cursor) !~ foo -+(The "s" is meant to suggest "syntax", and the "r" is meant to suggest -+"regular expression".) -+ -+Examples: -+ -+ You can get the default behavior with > -+ :let b:match_skip = 's:comment\|string' -+< -+ If you want to skip matching structures unless they are at the start -+ of the line (ignoring whitespace) then you can > -+ :let b:match_skip = 'R:^\s*' -+< Do not do this if strings or comments can span several lines, since -+ the normal syntax checking will not be done if you set b:match_skip. -+ -+ In LaTeX, since "%" is used as the comment character, you can > -+ :let b:match_skip = 'r:%' -+< Unfortunately, this will skip anything after "\%", an escaped "%". To -+ allow for this, and also "\\%" (an excaped backslash followed by the -+ comment character) you can > -+ :let b:match_skip = 'r:\(^\|[^\\]\)\(\\\\\)*%' -+< -+ See the $VIMRUNTIME/ftplugin/vim.vim for an example that uses both -+ syntax and a regular expression. -+ -+============================================================================== -+4. Supporting a New Language *matchit-newlang* -+ *b:match_words* -+In order for matchit.vim to support a new language, you must define a suitable -+pattern for |b:match_words|. You may also want to set some of the -+|matchit-configure| variables, as described above. If your language has a -+complicated syntax, or many keywords, you will need to know something about -+Vim's |regular-expression|s. -+ -+The format for |b:match_words| is similar to that of the 'matchpairs' option: -+it is a comma (,)-separated list of groups; each group is a colon(:)-separated -+list of patterns (regular expressions). Commas and backslashes that are part -+of a pattern should be escaped with backslashes ('\:' and '\,'). It is OK to -+have only one group; the effect is undefined if a group has only one pattern. -+A simple example is > -+ :let b:match_words = '\:\,' -+ \ . '\:\:\:\' -+(In Vim regular expressions, |\<| and |\>| denote word boundaries. Thus "if" -+matches the end of "endif" but "\" does not.) Then banging on the "%" -+key will bounce the cursor between "if" and the matching "endif"; and from -+"while" to any matching "continue" or "break", then to the matching "endwhile" -+and back to the "while". It is almost always easier to use |literal-string|s -+(single quotes) as above: '\' rather than "\\" and so on. -+ -+Exception: If the ":" character does not appear in b:match_words, then it is -+treated as an expression to be evaluated. For example, > -+ :let b:match_words = 'GetMatchWords()' -+allows you to define a function. This can return a different string depending -+on the current syntax, for example. -+ -+Once you have defined the appropriate value of |b:match_words|, you will -+probably want to have this set automatically each time you edit the -+appropriate file type. The recommended way to do this is by adding the -+definition to a |filetype-plugin| file. -+ -+Tips: Be careful that your initial pattern does not match your final pattern. -+See the example above for the use of word-boundary expressions. It is usually -+better to use ".\{-}" (as many as necessary) instead of ".*" (as many as -+possible). See |\{-|. For example, in the string "label", "<.*>" -+matches the whole string whereas "<.\{-}>" and "<[^>]*>" match "" and -+"". -+ -+ *matchit-spaces* *matchit-s:notend* -+If "if" is to be paired with "end if" (Note the space!) then word boundaries -+are not enough. Instead, define a regular expression s:notend that will match -+anything but "end" and use it as follows: > -+ :let s:notend = '\%(\:\' -+< *matchit-s:sol* -+This is a simplified version of what is done for Ada. The s:notend is a -+|script-variable|. Similarly, you may want to define a start-of-line regular -+expression > -+ :let s:sol = '\%(^\|;\)\s*' -+if keywords are only recognized after the start of a line or after a -+semicolon (;), with optional white space. -+ -+ *matchit-backref* *matchit-\1* -+In any group, the expressions |\1|, |\2|, ..., |\9| refer to parts of the -+INITIAL pattern enclosed in |\(|escaped parentheses|\)|. These are referred -+to as back references, or backrefs. For example, > -+ :let b:match_words = '\:\(h\)\1\>' -+means that "bo" pairs with "ho" and "boo" pairs with "hoo" and so on. Note -+that "\1" does not refer to the "\(h\)" in this example. If you have -+"\(nested \(parentheses\)\) then "\d" refers to the d-th "\(" and everything -+up to and including the matching "\)": in "\(nested\(parentheses\)\)", "\1" -+refers to everything and "\2" refers to "\(parentheses\)". If you use a -+variable such as |s:notend| or |s:sol| in the previous paragraph then remember -+to count any "\(" patterns in this variable. You do not have to count groups -+defined by |\%(\)|. -+ -+It should be possible to resolve back references from any pattern in the -+group. For example, > -+ :let b:match_words = '\(foo\)\(bar\):more\1:and\2:end\1\2' -+would not work because "\2" cannot be determined from "morefoo" and "\1" -+cannot be determined from "andbar". On the other hand, > -+ :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1' -+should work (and have the same effect as "foobar:barfoo:endfoobar"), although -+this has not been thoroughly tested. -+ -+You can use |zero-width| patterns such as |\@<=| and |\zs|. (The latter has -+not been thouroughly tested in matchit.vim.) For example, if the keyword "if" -+must occur at the start of the line, with optional white space, you might use -+the pattern "\(^\s*\)\@<=if" so that the cursor will end on the "i" instead of -+at the start of the line. For another example, if HTML had only one tag then -+one could > -+ :let b:match_words = '<:>,<\@<=tag>:<\@<=/tag>' -+so that "%" can bounce between matching "<" and ">" pairs or (starting on -+"tag" or "/tag") between matching tags. Without the |\@<=|, the script would -+bounce from "tag" to the "<" in "", and another "%" would not take you -+back to where you started. -+ -+DEBUGGING *matchit-debug* *:MatchDebug* -+ -+If you are having trouble figuring out the appropriate definition of -+|b:match_words| then you can take advantage of the same information I use when -+debugging the script. This is especially true if you are not sure whether -+your patterns or my script are at fault! To make this more convenient, I have -+made the command :MatchDebug, which defines the variable |b:match_debug| and -+creates a Matchit menu. This menu makes it convenient to check the values of -+the variables described below. You will probably also want to read -+|matchit-details| above. -+ -+Defining the variable |b:match_debug| causes the script to set the following -+variables, each time you hit the "%" key. Several of these are only defined -+if |b:match_words| includes |backref|s. -+ -+ *b:match_pat* -+The b:match_pat variable is set to |b:match_words| with |backref|s parsed. -+ *b:match_match* -+The b:match_match variable is set to the bit of text that is recognized as a -+match. -+ *b:match_col* -+The b:match_col variable is set to the cursor column of the start of the -+matching text. -+ *b:match_wholeBR* -+The b:match_wholeBR variable is set to the comma-separated group of patterns -+that matches, with |backref|s unparsed. -+ *b:match_iniBR* -+The b:match_iniBR variable is set to the first pattern in |b:match_wholeBR|. -+ *b:match_ini* -+The b:match_ini variable is set to the first pattern in |b:match_wholeBR|, -+with |backref|s resolved from |b:match_match|. -+ *b:match_tail* -+The b:match_tail variable is set to the remaining patterns in -+|b:match_wholeBR|, with |backref|s resolved from |b:match_match|. -+ *b:match_word* -+The b:match_word variable is set to the pattern from |b:match_wholeBR| that -+matches |b:match_match|. -+ *b:match_table* -+The back reference '\'.d refers to the same thing as '\'.b:match_table[d] in -+|b:match_word|. -+ -+============================================================================== -+5. Known Bugs and Limitations *matchit-bugs* -+ -+Just because I know about a bug does not mean that it is on my todo list. I -+try to respond to reports of bugs that cause real problems. If it does not -+cause serious problems, or if there is a work-around, a bug may sit there for -+a while. Moral: if a bug (known or not) bothers you, let me know. -+ -+The various |:vmap|s defined in the script (%, |g%|, |[%|, |]%|, |a%|) may -+have undesired effects in Select mode |Select-mode-mapping|. At least, if you -+want to replace the selection with any character in "ag%[]" there will be a -+pause of |'updatetime'| first. -+ -+It would be nice if "\0" were recognized as the entire pattern. That is, it -+would be nice if "foo:\end\0" had the same effect as "\(foo\):\end\1". I may -+try to implement this in a future version. (This is not so easy to arrange as -+you might think!) -+ -+============================================================================== -+vim: filetype=help -+vim:tw=78:fo=tcq2: -diff -urN vim71/1/doc/.svn/text-base/NERD_commenter.txt.svn-base vim71_ada/1/doc/.svn/text-base/NERD_commenter.txt.svn-base ---- vim71/1/doc/.svn/text-base/NERD_commenter.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/text-base/NERD_commenter.txt.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,1155 @@ -+*NERD_comments.txt* Plugin for commenting code v169 -+ -+ -+ NERD_COMMENTS REFERENCE MANUAL~ -+ -+ -+ -+ -+ -+============================================================================== -+CONTENTS {{{2 *NERD_comments-contents* -+ -+ 1.Intro...................................|NERD_comments| -+ 2.Functionality provided..................|NERD_com-functionality| -+ 2.1 Functionality Summary.............|NERD_com-functionality-summary| -+ 2.2 Functionality Details.............|NERD_com-functionality-details| -+ 2.2.1 Comment map.................|NERD_com-comment| -+ 2.2.2 Nested comment map..........|NERD_com-nested-comment| -+ 2.2.3 Toggle comment map..........|NERD_com-toggle-comment| -+ 2.2.4 Minimal comment map.........|NERD_com-minimal-comment| -+ 2.2.5 Invert comment map..........|NERD_com-invert-comment| -+ 2.2.6 Sexy comment map............|NERD_com-sexy-comment| -+ 2.2.7 Yank comment map............|NERD_com-yank-comment| -+ 2.2.8 Comment to EOL map..........|NERD_com-EOL-comment| -+ 2.2.9 Append com to line map......|NERD_com-append-comment| -+ 2.2.10 Prepend com to line map....|NERD_com-prepend-comment| -+ 2.2.11 Insert comment map.........|NERD_com-insert-comment| -+ 2.2.12 Use alternate delims map...|NERD_com-alt-delim| -+ 2.2.13 Comment aligned maps.......|NERD_com-aligned-comment| -+ 2.2.14 Uncomment line map.........|NERD_com-uncomment-line| -+ 2.3 Supported filetypes...............|NERD_com-filetypes| -+ 2.4 Sexy Comments.....................|NERD_com_sexy_comments| -+ 3.Customisation...........................|NERD_com-customisation| -+ 3.1 Customisation summary.............|NERD_com-cust-summary| -+ 3.2 Customisation details.............|NERD_com-cust-details| -+ 3.3 Default delimiter customisation...|NERD_com-cust-delims| -+ 3.4 Key mapping customisation.........|NERD_com-cust-keys| -+ 3.5 Sample regular expressions........|NERD_com-reg-exps| -+ 4.Issues with the script..................|NERD_com-issues| -+ 4.1 Delimiter detection heuristics....|NERD_com-heuristics| -+ 4.2 Nesting issues....................|NERD_com-nesting| -+ 4.3 Nesting issues....................|NERD_com-nesting| -+ 4.3 Mark clobbering...................|NERD_com-mark-clobbering| -+ 5.TODO list...............................|NERD_com-todo| -+ 6.Credits.................................|NERD_com-credits| -+ -+============================================================================== -+1. Intro {{{2 *NERD_comments* -+ -+NERD_comments provides a set of handy key mappings for commenting code. These -+mappings are consistent across all supported filetypes. -+ -+When writing NERD_comments I have tried to give it as many features/options as -+possible while keeping it so that the plugin can still be used with little or -+no knowledge of these. The average user need only know about a few key -+mappings to use NERD_comments while there are plenty of other features for the -+l33t nerd take advantage of. -+ -+Enjoy :D -+ -+============================================================================== -+2. Functionality provided {{{2 *NERD_com-functionality* -+ -+------------------------------------------------------------------------------ -+2.1 Functionality summary {{{3 *NERD_com-functionality-summary* -+ -+The following key mappings are provided by default (there is also a menu -+provided that contains menu items corresponding to all the below mappings): -+ -+Note: is a user defined key that is used to start keymappings and -+defaults to \. Check out || for details. -+ -+Most of the following mappings are for normal/visual mode only. The -+|NERD_com-insert-comment| mapping is for insert mode only. -+ -+cc |NERD_com-comment-map| -+Comments out the current line or text selected in visual mode. -+ -+ -+cn |NERD_com-nested-comment| -+Same as |NERD_com-comment-map| but enforces nesting. -+ -+ -+c |NERD_com-toggle-comment| -+Toggles the comment state of the selected line(s). If the topmost selected -+line is commented, all selected lines are uncommented and vice versa. -+ -+ -+cm |NERD_com-minimal-comment| -+Comments the given lines using only one set of multipart delimiters if -+possible. -+ -+ -+ci |NERD_com-invert-comment| -+Toggles the comment state of the selected line(s) individually. Each selected -+line that is commented is uncommented and vice versa. -+ -+ -+cs |NERD_com-sexy-comment| -+Comments out the selected lines ``sexually'' -+ -+ -+cy |NERD_com-yank-comment| -+Same as |NERD_com-comment-map| except that the commented line(s) are yanked -+before commenting. -+ -+ -+c$ |NERD_com-EOL-comment| -+Comments the current line from the cursor to the end of line. -+ -+ -+cA |NERD_com-append-comment| -+Adds comment delimiters to the end of line and goes into insert mode between -+them. -+ -+ -+cI |NERD_com-prepend-comment| -+Adds comment delimiters to the start of line and goes into insert mode between -+them. -+ -+ -+ |NERD_com-insert-comment| -+Adds comment delimiters at the current cursor position and inserts between. -+ -+ -+ca |NERD_com-alt-delim| -+Switches to the alternative set of delimiters. -+ -+ -+cl OR cr OR cb |NERD_com-aligned-comment| -+Same as |NERD_com-comment| except that the delimiters are aligned down the -+left side (cl), the right side (cr) or both sides -+(cb). -+ -+ -+cu |NERD_com-uncomment-line| -+Uncomments the selected line(s). -+ -+------------------------------------------------------------------------------ -+2.2 Functionality details {{{3 *NERD_com-functionality-details* -+ -+------------------------------------------------------------------------------ -+2.2.1 Comment map *NERD_com-comment* -+cc -+Comments out the current line. If multiple lines are selected in visual-line -+mode, they are all commented out. If some text is selected in visual or -+visual-block mode then NERD_comments will try to comment out the exact text -+that is selected using multi-part delimiters if they are available. -+ -+Works in normal, visual, visual-line and visual-block mode. -+ -+Change the mapping with: |NERD_com_line_map|. -+ -+Relevant options: -+|NERD_allow_any_visual_delims_regexp| -+|NERD_comment_whole_lines_in_v_mode| -+|NERD_block_com_after_right| -+|NERD_left_align_regexp| -+|NERD_place_holder_regexp| -+|NERD_right_align_regexp| -+|NERD_space_delim_filetype_regexp| -+|NERD_use_nested_comments_default| -+ -+------------------------------------------------------------------------------ -+2.2.2 Nested comment map *NERD_com-nested-comment* -+cn -+Performs nested commenting. Works the same as cc except that if a -+line is already commented then it will be commented again. -+ -+If the filetype is covered by the |NERD_place_holder_regexp| option -+then the previous comment delimiters will be replaced by place-holder -+delimiters if needed. Otherwise the nested comment will only be added if the -+current commenting delimiters have no right delimiter (to avoid compiler -+errors) -+ -+Works in normal, visual, visual-line, visual-block modes. -+ -+Change the mapping with: |NERD_com_line_nest_map|. -+ -+Relevant options: -+|NERD_allow_any_visual_delims_regexp| -+|NERD_comment_whole_lines_in_v_mode| -+|NERD_block_com_after_right| -+|NERD_left_align_regexp| -+|NERD_place_holder_regexp| -+|NERD_right_align_regexp| -+|NERD_space_delim_filetype_regexp| -+|NERD_use_nested_comments_default| -+ -+ -+------------------------------------------------------------------------------ -+2.2.3 Toggle comment map *NERD_com-toggle-comment* -+c -+Toggles commenting of the lines selected. The behaviour of this mapping -+depends on whether the first line selected is commented or not. If so, all -+selected lines are uncommented and vice versa. -+ -+With this mapping, lines are only considered to be commented if a left comment -+delimiter is the first non-space/tab char on the line. -+ -+Works in normal, visual-line, modes. -+Using this mapping in visual or visual-block modes will cause it to work like -+|NERD_com-comment| -+ -+Change the mapping with: |NERD_com_line_toggle_map|. -+ -+Relevant options: -+|NERD_left_align_regexp| -+|NERD_right_align_regexp| -+|NERD_space_delim_filetype_regexp| -+|NERD_use_nested_comments_default| -+ -+------------------------------------------------------------------------------ -+2.2.4 Minimal comment map *NERD_com-minimal-comment* -+cm -+Comments the selected lines using one set of multipart delimiters if possible. -+ -+For example: if you are programming in c and you select 5 lines and press -+cm then a '/*' will be placed at the start of the top line and a '*/' -+will be placed at the end of the last line. -+ -+Sets of multipart comment delimiters that are between the top and bottom -+selected lines are replaced with place holders (see |NERD_lPlace|) if -+NERD_place_holder_regexp is set for the current filetype. If it is not, then -+the comment will be aborted if place holders are required to prevent illegal -+syntax. -+ -+------------------------------------------------------------------------------ -+2.2.5 Invert comment map *NERD_com-invert-comment* -+ci -+Inverts the commented state of each selected line. If the a selected line is -+commented then it is uncommented and vice versa. Each line is examined and -+commented/uncommented individually. -+ -+With this mapping, lines are only considered to be commented if a left comment -+delimiter is the first non-space/tab char on the line. -+ -+Works in normal, visual-line, modes. -+ -+Change the mapping with: |NERD_com_line_invert_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.6 Sexy comment map *NERD_com-sexy-comment* -+cs -+Comments the selected line(s) ``sexily''... see |NERD_com_sexy_commenting| for -+a description of what sexy comments are. Can only be done on filetypes for -+which there is at least one set of multipart comment delimiters specified. -+ -+Sexy comments cannot be nested and lines inside a sexy comment cannot be -+commented again. -+ -+Works in normal, visual-line. -+ -+Change the mapping with: |NERD_com_line_sexy_map| -+ -+Relevant options: -+|NERD_use_compact_sexy_com_regexp| -+ -+------------------------------------------------------------------------------ -+2.2.7 Yank comment map *NERD_com-yank-comment* -+cy -+Same as cc except that it yanks the line(s) that are commented first. -+ -+Works in normal, visual, visual-line, visual-block modes. -+ -+Change the mapping with: |NERD_com_line_yank_map| -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.8 Comment to EOL map *NERD_com-EOL-comment* -+c$ -+Comments the current line from the current cursor position up to the end of -+the line. -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_com_to_end_of_line_map| -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.9 Append com to line map *NERD_com-append-comment* -+cA -+Appends comment delimiters to the end of the current line and goes -+to insert mode between the new delimiters. -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_append_com_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.10 Prepend com to line map *NERD_com-prepend-comment* -+cI -+Prepends comment delimiters to the start of the current line and goes to -+insert mode between the new delimiters. -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_prepend_com_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.11 Insert comment map *NERD_com-insert-comment* -+ -+Adds comment delimiters at the current cursor position and inserts -+between them. -+ -+Works in insert mode. -+ -+Change the mapping with: |NERD_com_in_insert_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.12 Use alternate delims map *NERD_com-alt-delim* -+ca -+Changes to the alternative commenting style if one is available. For example, -+if the user is editing a c++ file using // comments and they hit ca -+then they will be switched over to /**/ comments. -+keys for this mappings can be overridden with the -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_alt_com_map| -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.13 Comment aligned maps *NERD_com-aligned-comment* -+cl cr cb -+Same as cc except that the comment delimiters are aligned on the left -+side, right side or both sides respectively. These comments are always nested -+if the line(s) are already commented. -+ -+Works in normal, visual-line. -+ -+Change the mappings with: |NERD_com_align_left_map|, |NERD_com_align_right_map| -+and |NERD_com_align_both_map|. -+ -+Relevant options: -+|NERD_left_align_regexp| -+|NERD_right_align_regexp| -+ -+ -+------------------------------------------------------------------------------ -+2.2.14 Uncomment line map *NERD_com-uncomment-line* -+cu -+Uncomments the current line. If multiple lines are selected in -+visual mode then they are all uncommented. -+ -+When uncommenting, if the line contains multiple sets of delimiters then the -+``outtermost'' pair of delimiters will be removed. -+ -+The script uses a set of heurisics to distinguish ``real'' delimiters from -+``fake'' ones when uncommenting. See |NERD_com-issues| for details. -+ -+Works in normal, visual, visual-line, visual-block. -+ -+Change the mapping with: |NERD_uncom_line_map|. -+ -+Relevant options: -+|NERD_dont_remove_alt_coms| -+|NERD_dont_remove_spaces_regexp| -+ -+ -+------------------------------------------------------------------------------ -+2.3 Supported filetypes *NERD_com-filetypes* -+ -+Files that can be commented by this plugin: -+abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asm -+asn aspvbs atlas automake ave awk basic b bc bdf bib bindzone btm caos catalog -+c cfg cg ch cl clean clipper conf config cpp crontab cs csc csp css cterm cupl -+cvs dcl def diff dns dosbatch dosini dot dracula dsl dtd dtml dylan ecd eiffel -+elf elmfilt erlang eruby eterm expect exports fgl focexec form fortran foxpro -+fvwm fx gdb gdmo gnuplot gtkrc haskell hb h help hercules hog html htmlos ia64 -+icon idlang idl indent inform inittab ishd iss ist jam java javascript jess -+jgraph jproperties jproperties jsp kix kscript lace lex lftp lifelines lilo -+lisp lite lotos lout lprolog lscript lss lua lynx m4 make maple masm master -+matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc named -+nasm nastran natural ncf netrw nqc nsis ocaml omnimark openroad opl ora ox -+pascal pcap pccts perl pfmain php phtml pic pike pilrc pine plm plsql po -+postscr pov povini ppd ppwiz procmail progress prolog psf ptcap python python -+radiance ratpoison r rc readline rebol registry remind rexx robots rpl ruby sa -+samba sas sather scheme scilab screen scsh sdl sed sgml sgmldecl sgmllnx sicad -+simula sinda skill slang sl slrnrc sm smil smith sml snnsnet snnspat snnsres -+snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp strace svn tads -+taglist tags tak tasm tcl terminfo tex texinfo texmf tf tidy tli trasys tsalt -+tsscl tssgm uc uil vb verilog vgrindefs vhdl vim virata vrml vsejcl webmacro -+wget winbatch wml sh wvdial xdefaults xf86conf xhtml xkb xmath xml xmodmap -+xpm2 xpm xslt yacc yaml z8a -+ -+If a language is not in the list of hardcoded supported filetypes then the -+&commentstring vim option is used. -+ -+ -+------------------------------------------------------------------------------ -+2.4 Sexy Comments *NERD_com_sexy_comments* -+These are comments that use one set of multipart comment delimiters as well as -+one other marker symbol. For example: > -+ /* -+ * This is a c style sexy comment -+ * So there! -+ */ -+ -+ /* This is a c style sexy comment -+ * So there! -+ * But this one is ``compact'' style */ -+< -+Here the multipart delimiters are /* and */ and the marker is *. NERD_comments -+is capable of adding and removing comments of this type. -+ -+ -+============================================================================== -+3. Customisation {{{2 *NERD_com-customisation* -+ -+------------------------------------------------------------------------------ -+3.1 Customisation summary *NERD_com-cust-summary* -+ -+|loaded_nerd_comments| Turns off the script. -+|NERD_allow_any_visual_delims_regexp| Allows multipart alternative delims to -+ be used when commenting in -+ visual/visual-block mode. -+|NERD_block_com_after_right| Forces right delims to be placed when -+ doing visual-block comments. -+|NERD_comment_whole_lines_in_v_mode| Changes behaviour of visual comments. -+|NERD_menu_mode| Determines if a NERD comment menu will -+ be made and whether the menu will have a -+ keyboard shortcut. -+|NERD_dont_remove_alt_coms| Causes alternative comments not to be -+ removed when uncommenting. -+|NERD_dont_remove_spaces_regexp| Causes spaces not to be removed when -+ uncommenting if the filetype doesnt -+ match |NERD_space_delim_filetype_regexp| -+|NERD_create_h_filetype| Creates a new filetype for .h files. -+|NERD_lPlace| Specifies what to use as the left -+ delimiter placeholder when nesting -+ comments. -+|NERD_left_align_regexp| Specifies which filetypes to align left -+ delimiters for. -+|NERD_mapleader| Specifies what all the commenting key -+ mappings will begin with. -+|NERD_place_holder_regexp| Specifies which filetypes may use -+ placeholders when nesting comments. -+|NERD_right_align_regexp| Specifies which filetypes to align right -+ delimiters for. -+|NERD_rPlace| Specifies what to use as the right -+ delimiter placeholder when nesting -+ comments. -+|NERD_shut_up| Stops all output from the script. -+|NERD_space_delim_filetype_regexp| Specifies which filetypes to add spaces -+ around the delimiters for. -+|NERD_use_compact_sexy_com_regexp| Specifies which filetypes to use compact -+ sexy comments for. -+|NERD_use_nested_comments_default| Tells the script to use nested comments -+ by default. -+ -+----------------------------------------------------------------------------- -+3.3 Customisation details *NERD_com-cust-details* -+ -+To enable any of the below options you should put the given line in your -+~/.vimrc -+ -+ *loaded_nerd_comments* -+If this script is driving you insane you can turn it off by setting this -+option > -+ let loaded_nerd_comments=1 -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_allow_any_visual_delims_regexp* -+This option is set to a regular expression that is used to specify which -+filetypes this option should be turned on for. If this covers the current -+filetype then, when NERD_comments is doing a visual or visual-block comment -+(but not a visual-line comment) it will choose the right delimiters to use for -+the comment. This normally means using the current delimiters if they are -+multipart or using the alternative delimiters if THEY are multipart and the -+current delims are not. For example if we are editing the following java -+code: > -+ float foo = 1221; -+ float bar = 324; -+ System.out.println(foo * bar); -+< -+If we are using // comments and select the "foo" and "bar" in visual-block -+mode, as shown left below (where '|'s are used to represent the visual-block -+boundary), and comment it then it will use the alternative delims as shown on -+the right: > -+ float |foo| = 1221; float /*foo*/ = 1221; -+ float |bar| = 324; float /*bar*/ = 324; -+ System.out.println(foo * bar); System.out.println(foo * bar); -+< -+By default this option is set to '.*' i.e is turned on for all filetypes. -+ -+----------------------------------------------------------------------------- -+ *NERD_block_com_after_right* -+This option affects commenting when it is done in visual-block mode. If this -+option is turned on, lines that begin outside the right boundary of the -+selection block will be commented. Enable this option with: > -+ let NERD_block_com_after_right=1 -+< -+For example, if you are commenting this chunk of c code in visual-block mode -+(where the '|'s are used to represent the visual-block boundary) > -+ #include -+ #include -+ #include -+ |int| main(){ -+ | | printf("SUCK THIS\n"); -+ | | while(1){ -+ | | fork(); -+ | | } -+ |} | -+< -+If NERD_block_com_after_right=1 then this code will become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ /* */ printf("SUCK THIS\n"); -+ /* */ while(1){ -+ /* */ fork(); -+ /* */ } -+ /*} */ -+< -+Otherwise, the code block would become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ printf("SUCK THIS\n"); -+ while(1){ -+ fork(); -+ } -+ /*} */ -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_comment_whole_lines_in_v_mode* -+This option can take 2 values. By default NERD_comments tries to comment out -+exactly what is selected in visual mode (v). For example if you select and -+comment the following c code (using | to represent the visual boundary): > -+ in|t foo = 3; -+ int bar =| 9; -+ int baz = foo + bar; -+< -+This will result in: > -+ in/*t foo = 3;*/ -+ /*int bar =*/ 9; -+ int baz = foo + bar; -+< -+But some people prefer it if the whole lines are commented like: > -+ /*int foo = 3;*/ -+ /*int bar = 9;*/ -+ int baz = foo + bar; -+< -+If you prefer the second option then stick this line in your .vimrc: > -+ let NERD_comment_whole_lines_in_v_mode=1 -+< -+ -+If the filetype you are editing only has no multipart delimiters (for example -+a shell script) and you hadnt set this option then the above would become > -+ in#t foo = 3; -+ #int bar = 9; -+< -+(where # is the comment delimiter) as this is the closest NERD_comments can -+come to commenting out exactly what was selected. If you prefer for whole -+lines to be commented out when there is no multipart delimiters but the EXACT -+text that was selected to be commented out if there IS multipart delimiters -+then stick the following line in your .vimrc: > -+ let NERD_comment_whole_lines_in_v_mode=2 -+< -+ -+Note that this option does not affect the behaviour of visual-block mode (). -+ -+----------------------------------------------------------------------------- -+ *NERD_dont_remove_alt_coms* -+When uncommenting a line when there is an alternative commenting style for the -+current filetype, this option tells the script not to look for, and remove, -+comments delimiters of the alternative style. > -+ let NERD_dont_remove_alt_coms=1 -+< -+For example, if you are editing a c++ file using // style comments and you go -+cu on this line: > -+ /* This is a c++ comment baby! */ -+< -+It will not be uncommented if the NERD_dont_remove_alt_coms is set to 1. -+ -+----------------------------------------------------------------------------- -+ *NERD_dont_remove_spaces_regexp* -+By default, the NERD commenter will remove spaces around comment delimiters if -+either: -+1. The current filetype matches the |NERD_space_delim_filetype_regexp| option -+ (which is a regular expression). -+2. The current filtype doesnt match NERD_dont_remove_spaces_regexp option -+ (which is also a reg exp) -+ -+This means that if we have the following lines in a c code file: > -+ /* int foo = 5; */ -+ /* int bar = 10; */ -+ int baz = foo + bar -+< -+If either of the above conditions hold then if these lines are uncommented -+they will become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+Otherwise they would become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+If you want the spaces to be removed only if the current filetype matches -+|NERD_space_delim_filetype_regexp| then set the -+NERD_dont_remove_spaces_regexp option in your vimrc so that it matches the -+desired filetypes. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+Defaults to "^python$" -+ -+----------------------------------------------------------------------------- -+ *NERD_create_h_filetype* -+If this option is set then NERD_comments will create a seperate filetype for h -+files. This could be needed because some versions of vim treat h files as cpp -+files which can be dodgy for commenting because if you are using // to comment -+cpp files then this is invalid when you are commenting h files for a c -+project (unless you arent adhering to the ANSI standard... naughty naughty). -+To enable this option, stick the following line in your .vimrc: > -+ let NERD_create_h_filetype = 1 -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_lPlace* -+ *NERD_rPlace* -+These options are used to control the strings used as place-holder delimiters. -+Place holder delimiters are used when performing nested commenting when the -+filetype supports commenting styles with both left and right delimiters. -+To set these options use lines like: > -+ let NERD_lPlace="FOO" -+ let NERD_rPlace="BAR" -+< -+Following the above example, if we have line of c code: > -+ /* int horse */ -+< -+and we comment it with cn it will be changed to: > -+ /*FOO int horse BAR*/ -+< -+When we uncomment this line it will go back to what it was. -+NERD_lPlace defaults to '[>', NERD_rPlace defaults to '<]'. -+ -+----------------------------------------------------------------------------- -+ *NERD_left_align_regexp* -+This option is a regular expression which is used to specify which filetypes -+should have their left delimiters aligned when commenting multiple lines. -+ -+For example, consider this chunk of c code: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 while(foo < 50){ -+ 4 foo = foo + bar; -+ 5 printf("i am just making up this code\n"); -+ 6 printf("i have no idea what im writing\n"); -+ 7 } -+< -+If the NERD_left_align_regexp regexp covers c files then if we select lines -+3-7 in visual mode and hit cc the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /*while(foo < 50){*/ -+ 4 /* foo = foo + bar;*/ -+ 5 /* printf("i am just making up this code\n");*/ -+ 6 /* printf("i have no idea what im writing\n");*/ -+ 7 /*}*/ -+< -+If NERD_left_align_regexp doesnt cover c files then the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /* while(foo < 50){ */ -+ 4 /* foo = foo + bar; */ -+ 5 /* printf("i am just making up this code\n"); */ -+ 6 /* printf("i have no idea what im writing\n"); */ -+ 7 /* } */ -+< -+NERD_left_align_regexp defaults to '^$' meaning no filetypes have their left -+delims aligned. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_mapleader* -+NERD_mapleader is used to specify what all the NERD commenter key mappings -+begin with. -+ -+Assuming that == '\', the default key mappings will look like this: > -+ \cc -+ \cu -+ \ca -+ \ci -+ \cs -+ ... -+< -+However, if this line: > -+ let NERD_mapleader = ',x' -+< -+were present in your vimrc then the default mappings would look like this: > -+ ,xc -+ ,xu -+ ,xa -+ ,xi -+ ,xs -+ ... -+< -+This option only affects the mappings that have not been explicitly set -+manually (see |NERD_com-cust-keys|). -+ -+Default is c. -+ -+----------------------------------------------------------------------------- -+ *NERD_menu_mode* -+This option can take 3 values: -+ "0": Turns the NERD commenter menu off completely. -+ "1": Turns the NERD commenter menu on with no menu shortcut. -+ "2": Turns the NERD commenter menu on with -c as the menu shortcut. -+ -+Default is "2". -+ -+----------------------------------------------------------------------------- -+ *NERD_place_holder_regexp* -+This option is a regular expression which is used to specify which filetypes -+place-holder delimiters should be used for when adding nested comments. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_right_align_regexp* -+This option is a regular expression which is used to specify which filetypes -+should have their right delimiters aligned when commenting multiple lines. -+ -+For example, consider this chunk of c code: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 while(foo < 50){ -+ 4 foo = foo + bar; -+ 5 printf("i am just making up this code\n"); -+ 6 printf("i have no idea what im writing\n"); -+ 7 } -+< -+If the NERD_right_align_regexp regexp covers c files then if we select lines -+3-7 in visual mode and hit cc the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /*while(foo < 50){ */ -+ 4 /*foo = foo + bar; */ -+ 5 /*printf("i am just making up this code\n"); */ -+ 6 /*printf("i have no idea what im writing\n");*/ -+ 7 /*} */ -+< -+If NERD_right_align_regexp doesnt cover c files then the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /* while(foo < 50){ */ -+ 4 /* foo = foo + bar; */ -+ 5 /* printf("i am just making up this code\n"); */ -+ 6 /* printf("i have no idea what im writing\n"); */ -+ 7 /* } */ -+< -+NERD_right_align_regexp defaults to '^$' meaning no filetypes have their right -+delims aligned. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_shut_up* -+This option is used to prevent NERD_comments from echoing anything. -+Stick this line in your .vimrc: > -+ let NERD_shut_up=1 -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_space_delim_filetype_regexp* -+Some people prefer a space after the left delimiter and before the right -+delimiter like this: > -+ /* int foo=2; */ -+< -+as opposed to this: > -+ /*int foo=2;*/ -+< -+This option is a regular expression that is used to specify which filetypes -+NERD_comments should use spaces for (as in the first eg above). -+NERD_space_delim_filetype_regexp defaults to '^$'. -+ -+See also |NERD_dont_remove_spaces_regexp|. -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_use_compact_sexy_com_regexp* -+Some people may want their sexy comments to be like this: > -+ /* Hi There! -+ * This is a sexy comment -+ * in c */ -+< -+As opposed to like this: > -+ /* -+ * Hi There! -+ * This is a sexy comment -+ * in c -+ */ -+< -+The option NERD_use_compact_sexy_com_regexp is a regular expression. If the -+filetype that the user is commenting matches this regular expression then when -+they do sexy comments they will look like the first comment above. -+ -+----------------------------------------------------------------------------- -+ *NERD_use_nested_comments_default* -+When this option is turned on comments are nested automatically. That is, if -+you hit cc on a line that is already commented, or contains comments, -+it will be commented again. > -+ let NERD_use_nested_comments_default=1 -+< -+ -+----------------------------------------------------------------------------- -+3.3 Default delimiter customisation *NERD_com-cust-delims* -+These options are used to tell NERD_comments which delimiters to use for a -+given filetype when it first loads up. To set one of these options just stick -+the corresponding line in your .vimrc. For example: if i want to use /* */ to -+delimit comments in java files instead of // (which is the default) then I -+would stick this line in my .vimrc: > -+ let NERD_use_c_style_java_comments=1 -+< -+ -+Note that if filetype has two commenting styles, which are both supported, you -+can switch between them with ca. See |NERD_com-alt-delim|. These -+options only change which style is used when the script is initialsed. -+ -+NERD_use_ada_with_spaces: use -- instead of -- for ada files. -+NERD_use_c_style_acedb_comments: use /**/ instead of // for acedb files. -+NERD_use_c_style_ch_comments: use /**/ instead of // for ch files. -+NERD_use_c_style_clean_comments: use /**/ instead of // for clean files. -+NERD_use_c_style_clipper_comments: use /**/ instead of // for clipper files. -+NERD_use_c_style_cpp_comments: use /**/ instead of // for c++ files. -+NERD_use_c_style_cs_comments: use /**/ instead of // for c# files. -+NERD_use_c_style_dot_comments: use /**/ instead of // for dot files. -+NERD_use_c_style_dylan_comments: use /**/ instead of // for dylan files. -+NERD_use_c_style_h_comments: use /**/ instead of // for h files. -+NERD_use_c_style_hercules_comments: use /**/ instead of // for hercules files. -+NERD_use_c_style_idl_comments: use /**/ instead of // for idl files. -+NERD_use_c_style_ishd_comments: use /**/ instead of // for ishd files. -+NERD_use_c_style_java_comments: use /**/ instead of // for java files. -+NERD_use_c_style_javascript_comments: use /**/ instead of // for javascript files. -+NERD_use_c_style_kscript_comments: use /**/ instead of // for kscript files. -+NERD_use_c_style_mel_comments: use /**/ instead of // for mel files. -+NERD_use_c_style_named_comments: use /**/ instead of // for named files. -+NERD_use_c_style_pccts_comments: use /**/ instead of // for pccts files. -+NERD_use_c_style_php_comments: use /* */ instead of // for php files. -+NERD_use_c_style_pike_comments: use /**/ instead of // for pike files. -+NERD_use_c_style_pilrc_comments: use /**/ instead of // for pilrc files. -+NERD_use_c_style_plm_comments: use /**/ instead of // for plm files. -+NERD_use_c_style_pov_comments: use /**/ instead of // for pov files. -+NERD_use_c_style_prolog_comments: use /**/ instead of % for prolog files. -+NERD_use_c_style_rc_comments: use /**/ instead of // for rc files. -+NERD_use_c_style_tads_comments: use /**/ instead of // for tads files. -+NERD_use_c_style_tsalt_comments: use /**/ instead of // for tsalt files. -+NERD_use_c_style_uc_comments: use /**/ instead of // for uc files. -+NERD_use_c_style_verilog_comments: use /**/ instead of // for verilog files. -+NERD_use_dash_dash_simula_comments: use -- instead of % for simula files. -+NERD_use_dnl_style_automake_comments: use dnl instead of # for automake files. -+NERD_use_hash_samba_comments: use # instead of ; for samba files. -+NERD_use_long_haskell_comments: use {--} instead of -- for haskell files. -+NERD_use_long_lisp_comments: use #||# instead of ; for lisp files. -+NERD_use_long_lua_comments: use --[[]] instead of -- for lua files. -+NERD_use_paren_star_pascal_comments: use (**) instead of {} for pascal files. -+NERD_use_REM_basic_comments: use REM instead of ' for basic files. -+NERD_use_single_part_c_comments: use // instead of /* */ for c files. -+ -+ -+----------------------------------------------------------------------------- -+3.4 Key mapping customisation *NERD_com-cust-keys* -+ -+These options are used to override the default keys that are used for the -+commenting mappings. Their values must be set to strings. As an example: if -+you wanted to use the mapping foo to uncomment lines of code then -+you would place this line in your vimrc > -+ let NERD_uncom_line_map="foo" -+< -+ -+Check out |NERD_com-functionality| for details about what the following -+mappings do. -+ -+ *NERD_alt_com_map* -+To override the ca mapping, set this option > -+ let NERD_alt_com_map="" -+< -+ *NERD_append_com_map* -+To override the ce mapping, set this option > -+ let NERD_append_com_map="" -+< -+ *NERD_com_align_left_map* -+To override the cl mapping, set this option > -+ let NERD_com_align_left_map="" -+< -+ *NERD_com_align_both_map* -+To override the cb mapping, set this option > -+ let NERD_com_align_both_map="" -+< -+ *NERD_com_align_right_map* -+To override the cr mapping, set this option > -+ let NERD_com_align_right_map="" -+< -+ *NERD_com_in_insert_map* -+To override the mapping, set this option > -+ let NERD_com_in_insert_map="" -+< -+ *NERD_com_line_invert_map* -+To override the ci mapping, set this option > -+ let NERD_com_line_invert_map="" -+< -+ *NERD_com_line_map* -+To override the cc mapping, set this option > -+ let NERD_com_line_map="" -+< -+ *NERD_com_line_nest_map* -+To override the cn mapping, set this option > -+ let NERD_com_line_nest_map="" -+< -+ *NERD_com_line_sexy_map* -+To override the cs mapping, set this option > -+ let NERD_com_line_sexy_map="" -+< -+ *NERD_com_line_toggle_map* -+To override the c mapping, set this option > -+ let NERD_com_line_toggle_map="" -+< -+ *NERD_com_line_minimal_map* -+To override the cm mapping, set this option > -+ let NERD_com_line_minimal_map="" -+< -+ *NERD_com_to_end_of_line_map* -+To override the c$ mapping, set this option > -+ let NERD_com_to_end_of_line_map="" -+< -+ *NERD_com_line_yank_map* -+To override the cy mapping, set this option > -+ let NERD_com_line_yank_map="" -+< -+ *NERD_uncom_line_map* -+To override the cu mapping, set this option > -+ let NERD_uncom_line_map="" -+< -+ -+------------------------------------------------------------------------------ -+3.5 Sample regular expressions *NERD_com-reg-exps* -+ -+Many of the options in the NERD commenter must be set to regular -+expressions... regular expressions can be a bit confusing so i have provided -+some template ones here that you can start from: -+ -+Regexp1: '.*' -+Matches any filetype. This is useful for turning an option on for all files. -+ -+Regexp2: '^$' -+Matches no filetypes. This is useful for turning an option off for all files. -+ -+Regexp3: '^\(java\)$' -+Matches only the java filetype. -+ -+Regexp4: '^\(c\|vim\)$' -+Matches only c and vim filetypes. -+ -+Regexp5: '^\(c.*\|vim\)$' -+Matches filetypes beginning with c (eg c, cpp, cs, etc) as well -+as vim files. -+ -+Regexp6: '^\(c.*\|java\|tex\)$' -+Matches filetypes beginning with c (eg c, cpp, cs, etc) as well as java and -+tex filetypes. -+ -+Regexp7: '^\(python\)\@!' -+Matches anything other than 'python'. -+ -+Regexp8: '^c\(s\)\@!' -+Matches 'c' followed by anything accept an 's'. -+ -+Regexp9: '^\(foo$\|bar$\|baz$\)\@!' -+Matches any strings except 'foo', 'bar' and 'baz'. -+ -+============================================================================== -+4. Issues with the script{{{2 *NERD_com-issues* -+ -+ -+------------------------------------------------------------------------------ -+4.1 Delimiter detection heuristics *NERD_com-heuristics* -+ -+Heuristics are used to distinguish the real comment delimiters -+ -+Because we have comment mappings that place delimiters in the middle of lines, -+removing comment delimiters is a bit tricky. This is because if comment -+delimiters appear in a line doesnt mean they really ARE delimiters. For -+example, Java uses // comments but the line > -+ System.out.println("//"); -+< -+clearly contains no real comment delimiters. -+ -+To distinguish between ``real'' comment delimiters and ``fake'' ones we use a -+set of heuristics. For example, one such heuristic states that any comment -+delimiter that has an odd number of non-escaped " characters both preceding -+and following it on the line is not a comment because it is probably part of a -+string. These heuristics, while usually pretty accurate, will not work for all -+cases. -+ -+------------------------------------------------------------------------------ -+4.2 Nesting issues *NERD_com-nesting* -+ -+If we have some line of code like this: > -+ /*int foo */ = /*5 + 9;*/ -+< -+This will not be uncommented legally. The NERD commenter will remove the -+"outter most" delimiters so the line will become: > -+ int foo */ = /*5 + 9; -+< -+which almost certainly will not be what you want. Nested sets of comments will -+uncomment fine though. Eg: > -+ /*int/* foo =*/ 5 + 9;*/ -+< -+will become: > -+ int/* foo =*/ 5 + 9; -+< -+(Note that in the above examples I have deliberately not used place holders -+for simplicity) -+ -+------------------------------------------------------------------------------ -+4.3 Mark clobbering *NERD_com-mark-clobbering* -+ -+The script clobbers the s and t marks when doing most comments. Im not sure -+how to save and restore the marks yet. -+ -+ -+ -+============================================================================== -+5. TODO list {{{2 *NERD_com-todo* -+ -+Uncommenting of minimal comments needs to be more robust. Currently it is easy -+to get illegal syntax when uncommenting them. -+ -+ -+ -+============================================================================== -+6. Credits {{{2 *NERD_com-credits* -+ -+Thanks and respect to the following people: -+ -+Thanks to Nick Brettell for his many ideas and criticisms. A bloody good -+bastard. -+:normal :.-2s/good// -+ -+Thanks to Matthew Hawkins for his awesome refactoring! -+ -+Thanks to the authors of the vimspell whose documentation -+installation function I stole :) -+ -+Thanks to Greg Searle for the idea of using place-holders for nested comments. -+ -+Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! -+Also, thanks for the idea of doing sexy comments as well as his suggestions -+relating to it :P -+Thanks again to Nguyen for complaining about the NERD_comments menu mapping -+(-c) interfering with another mapping of his... and thus the -+NERD_dont_create_menu_shortcut option was born :P -+(it was then replaced with NERD_menu_mode in version 1.67 :) -+ -+Thanks to Sam R for pointing out some filetypes that NERD_comments could support! -+ -+Cheers to Litchi for the idea of having a mapping that appends a comment to -+the current line :) -+ -+Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some -+problems with commenting in visual mode. Thanks again to Jorge for his -+continued suggestions on this matter :) -+ -+Thanks to Martin Stubenschrott for pointing out a bug with the mapping -+:) Ive gotta stop breaking this mapping! -+ -+Thanks to Markus Erlmann for pointing out a conflict that this script was -+having with the taglist plugin. -+ -+Thanks to Brent Rice for alerting me about, and helping me track down, a bug -+in the script when the "ignorecase" option in vim was set. -+ -+Thanks to Richard Willis for telling me about how line continuation was -+causing problems on cygwin. Also, thanks pointing out a bug in the help file -+and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI -+have mercy on your soul :) -+ -+Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". -+Also, thanks for his suggested improvements about toggle comments after i -+implemented them. -+ -+Thanks to harry for telling me that i broke the cn mapping in 1.53 :), -+and thanks again for telling me about a bug that occurred when editing a file -+in a new tab. -+ -+Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc -+install function and added support for ada comments with spaces as well as -+making a couple of other small changes. -+ -+Thanks to David Bourgeois for pointing out a bug with when commenting c files -+:)... [a few days later] ok i completely misunderstood what David was talking -+about and ended up fixing a completely different bug to what he was talking -+about :P -+ -+Thanks to David Bourgeois for pointing out a bug when changing buffers. -+ -+Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that -+was causing spaces to be added to the end of lines with single-part -+delimiters. It's nice when people do my work for me :D -+ -+Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting -+sexy comments. Sexy comments dont look so sexy when they are only half removed -+:P -+ -+Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping -+the NERD_space_delim_filetype_regexp option from working with left aligned -+toggle comments. And for pointing out a bug when initialising VB comments. -+ -+Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". -+And for suggested improvements to minimal comments. -+ -+Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. -+In 1.65 -+ -+Thanks to Jonathan Derque for alerting me to some filetypes that could be -+supported (Namely: context, plaintext and mail). -+ -+Thanks to Joseph Barker for the sugesting that the menu be an optional -+feature. -+ -+Thanks to Gary Church and Tim Carey-Smith for complaining about the -+keymappings and causing me to introduce the NERD_mapleader option :) -+ -+ -+Cheers to myself for being the best looking man on Earth! -+ -+ -+ vim:tw=78:ts=8:ft=help:norl: -diff -urN vim71/1/doc/.svn/text-base/taglist.txt.svn-base vim71_ada/1/doc/.svn/text-base/taglist.txt.svn-base ---- vim71/1/doc/.svn/text-base/taglist.txt.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/.svn/text-base/taglist.txt.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,1494 @@ -+*taglist.txt* Plugin for browsing source code -+ -+Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) -+For Vim version 6.0 and above -+Last change: 2007 February 18 -+ -+1. Overview |taglist-intro| -+2. Taglist on the internet |taglist-internet| -+3. Requirements |taglist-requirements| -+4. Installation |taglist-install| -+5. Usage |taglist-using| -+6. Options |taglist-options| -+7. Commands |taglist-commands| -+8. Global functions |taglist-functions| -+9. Extending |taglist-extend| -+10. FAQ |taglist-faq| -+11. License |taglist-license| -+12. Todo |taglist-todo| -+ -+============================================================================== -+ *taglist-intro* -+1. Overview~ -+ -+The "Tag List" plugin is a source code browser plugin for Vim. This plugin -+allows you to efficiently browse through source code files for different -+programming languages. The "Tag List" plugin provides the following features: -+ -+ * Displays the tags (functions, classes, structures, variables, etc.) -+ defined in a file in a vertically or horizontally split Vim window. -+ * In GUI Vim, optionally displays the tags in the Tags drop-down menu and -+ in the popup menu. -+ * Automatically updates the taglist window as you switch between -+ files/buffers. As you open new files, the tags defined in the new files -+ are added to the existing file list and the tags defined in all the -+ files are displayed grouped by the filename. -+ * When a tag name is selected from the taglist window, positions the -+ cursor at the definition of the tag in the source file. -+ * Automatically highlights the current tag name. -+ * Groups the tags by their type and displays them in a foldable tree. -+ * Can display the prototype and scope of a tag. -+ * Can optionally display the tag prototype instead of the tag name in the -+ taglist window. -+ * The tag list can be sorted either by name or by chronological order. -+ * Supports the following language files: Assembly, ASP, Awk, Beta, C, -+ 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. -+ * Can be easily extended to support new languages. Support for -+ existing languages can be modified easily. -+ * Provides functions to display the current tag name in the Vim status -+ line or the window title bar. -+ * The list of tags and files in the taglist can be saved and -+ restored across Vim sessions. -+ * Provides commands to get the name and prototype of the current tag. -+ * Runs in both console/terminal and GUI versions of Vim. -+ * Works with the winmanager plugin. Using the winmanager plugin, you -+ can use Vim plugins like the file explorer, buffer explorer and the -+ taglist plugin at the same time like an IDE. -+ * Can be used in both Unix and MS-Windows systems. -+ -+============================================================================== -+ *taglist-internet* -+2. Taglist on the internet~ -+ -+The home page of the taglist plugin is at: -+> -+ http://vim-taglist.sourceforge.net/ -+< -+You can subscribe to the taglist mailing list to post your questions or -+suggestions for improvement or to send bug reports. Visit the following page -+for subscribing to the mailing list: -+> -+ http://groups.yahoo.com/group/taglist -+< -+============================================================================== -+ *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 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. The exuberant ctags utility is shipped with -+most of the Linux distributions. You can download the exuberant ctags utility -+from -+> -+ http://ctags.sourceforge.net -+< -+The taglist plugin doesn't use or create a tags file and there is no need to -+create a tags file to use this plugin. The taglist plugin will not work with -+the GNU ctags or the Unix ctags utility. -+ -+This plugin relies on the Vim "filetype" detection mechanism to determine the -+type of the current file. You have to turn on the Vim filetype detection by -+adding the following line to your .vimrc file: -+> -+ filetype on -+< -+The taglist plugin will not work if you run Vim in the restricted mode (using -+the -Z command-line argument). -+ -+The taglist plugin uses the Vim system() function to invoke the exuberant -+ctags utility. If Vim is compiled without the system() function then you -+cannot use the taglist plugin. Some of the Linux distributions (Suse) compile -+Vim without the system() function for security reasons. -+ -+============================================================================== -+ *taglist-install* -+4. Installation~ -+ -+1. Download the taglist.zip file and unzip the files to the $HOME/.vim or the -+ $HOME/vimfiles or the $VIM/vimfiles directory. After this step, you should -+ have the following two files (the directory structure should be preserved): -+ -+ plugin/taglist.vim - main taglist plugin file -+ doc/taglist.txt - documentation (help) file -+ -+ 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 -+ topics. -+3. If the exuberant ctags utility is not present in one of the directories in -+ the PATH environment variable, then set the 'Tlist_Ctags_Cmd' variable to -+ point to the location of the exuberant ctags utility (not to the directory) -+ in the .vimrc file. -+4. If you are running a terminal/console version of Vim and the terminal -+ doesn't support changing the window width then set the -+ 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. -+5. Restart Vim. -+6. You can now use the ":TlistToggle" command to open/close the taglist -+ window. You can use the ":help taglist" command to get more information -+ about using the taglist plugin. -+ -+To uninstall the taglist plugin, remove the plugin/taglist.vim and -+doc/taglist.txt files from the $HOME/.vim or $HOME/vimfiles directory. -+ -+============================================================================== -+ *taglist-using* -+5. Usage~ -+ -+The taglist plugin can be used in several different ways. -+ -+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 -+ processes the tags defined in newly edited files. You can then open the -+ taglist window only when you need to select a tag and then automatically -+ close the taglist window after selecting the tag. -+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 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 -+ plugin to process the tags defined in a file always. -+6. You can save the tags defined in multiple files to a taglist session file -+ and load it when needed. You can also configure the taglist plugin to not -+ update the taglist window when editing new files. You can then manually add -+ files to the taglist window. -+ -+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. 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. -+> -+ nnoremap :TlistToggle -+< -+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: -+> -+ $ vim +TlistOpen -+< -+Closing the taglist window~ -+You can close the taglist window from the taglist window by pressing 'q' or -+using the Vim ":q" command. You can also use any of the Vim window commands to -+close the taglist window. Invoking the ":TlistToggle" command when the taglist -+window is opened, closes the taglist window. You can also use the -+":TlistClose" command to close the taglist window. -+ -+To automatically close the taglist window when a tag or file is selected, you -+can set the 'Tlist_Close_On_Select' variable to 1. To exit Vim when only the -+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. -+ -+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 -+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 -+taglist window. The Vim |CursorHold| autocmd event is used for this. If the -+current tag name is not visible in the taglist window, then the taglist window -+contents are scrolled to make that tag name visible. You can also use the -+":TlistHighlightTag" command to force the highlighting of the current tag. -+ -+The tag name is highlighted if no activity is performed for |'updatetime'| -+milliseconds. The default value for this Vim option is 4 seconds. To avoid -+unexpected problems, you should not set the |'updatetime'| option to a very -+low value. -+ -+To disable the automatic highlighting of the current tag name in the taglist -+window, set the 'Tlist_Auto_Highlight_Tag' variable to zero. -+ -+When entering a Vim buffer/window, the taglist plugin automatically highlights -+the current tag in that buffer/window. If you like to disable the automatic -+highlighting of the current tag when entering a buffer, set the -+'Tlist_Highlight_Tag_On_BufEnter' variable to zero. -+ -+Adding files to the taglist~ -+When the taglist window is opened, all the files in the Vim buffer list are -+processed and the supported files are added to the taglist. When you edit a -+file in Vim, the taglist plugin automatically processes this file and adds it -+to the taglist. If you close the taglist window, the tag information in the -+taglist is retained. -+ -+To process files even when the taglist window is not open, set the -+'Tlist_Process_File_Always' variable to 1. -+ -+You can manually add multiple files to the taglist without opening them using -+the ":TlistAddFiles" and the ":TlistAddFilesRecursive" commands. -+ -+For example, to add all the C files in the /my/project/dir directory to the -+taglist, you can use the following command: -+> -+ :TlistAddFiles /my/project/dir/*.c -+< -+Note that when adding several files with a large number of tags or a large -+number of files, it will take several seconds to several minutes for the -+taglist plugin to process all the files. You should not interrupt the taglist -+plugin by pressing . -+ -+You can recursively add multiple files from a directory tree using the -+":TlistAddFilesRecursive" command: -+> -+ :TlistAddFilesRecursive /my/project/dir *.c -+< -+This command takes two arguments. The first argument specifies the directory -+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 -+removed file will no longer be displayed in the taglist window in the current -+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 -+":bwipeout" command, the taglist is updated to remove the stored information -+for this buffer. -+ -+Updating the tags displayed for a file~ -+The taglist plugin keeps track of the modification time of a file. When the -+modification time changes (the file is modified), the taglist plugin -+automatically updates the tags listed for that file. The modification time of -+a file is checked when you enter a window containing that file or when you -+load that file. -+ -+You can also update or refresh the tags displayed for a file by pressing the -+"u" key in the taglist window. If an existing file is modified, after the file -+is saved, the taglist plugin automatically updates the tags displayed for the -+file. -+ -+You can also use the ":TlistUpdate" command to update the tags for the current -+buffer after you made some changes to it. You should save the modified buffer -+before you update the taglist window. Otherwise the listed tags will not -+include the new tags created in the buffer. -+ -+If you have deleted the tags displayed for a file in the taglist window using -+the 'd' key, you can again display the tags for that file using the -+":TlistUpdate" command. -+ -+Controlling the taglist updates~ -+To disable the automatic processing of new files or modified files, you can -+set the 'Tlist_Auto_Update' variable to zero. When this variable is set to -+zero, the taglist is updated only when you use the ":TlistUpdate" command or -+the ":TlistAddFiles" or the ":TlistAddFilesRecursive" commands. You can use -+this option to control which files are added to the taglist. -+ -+You can use the ":TlistLock" command to lock the taglist contents. After this -+command is executed, new files are not automatically added to the taglist. -+When the taglist is locked, you can use the ":TlistUpdate" command to add the -+current file or the ":TlistAddFiles" or ":TlistAddFilesRecursive" commands to -+add new files to the taglist. To unlock the taglist, use the ":TlistUnlock" -+command. -+ -+Displaying the tag prototype~ -+To display the prototype of the tag under the cursor in the taglist window, -+press the space bar. If you place the cursor on a tag name in the taglist -+window, then the tag prototype is displayed at the Vim status line after -+|'updatetime'| milliseconds. The default value for the |'updatetime'| Vim -+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. 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 -+line number are not supplied, then this command will display the name of the -+current tag. For example, -+> -+ :TlistShowTag -+ :TlistShowTag myfile.java 100 -+< -+You can use the ":TlistShowPrototype" command to display the prototype of the -+tag at or before the specified line number in the specified file. If the file -+name and the line number are not supplied, then this command will display the -+prototype of the current tag. For example, -+> -+ :TlistShowPrototype -+ :TlistShowPrototype myfile.c 50 -+< -+In the taglist window, when the mouse is moved over a tag name, the tag -+prototype is displayed in a balloon. This works only in GUI versions where -+balloon evaluation is supported. -+ -+Taglist window contents~ -+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 -+|'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 -+the Vim folding support. You can collapse the tree using the '-' key or using -+the Vim |zc| fold command. You can open the tree using the '+' key or using -+the Vim |zo| fold command. You can open all the folds using the '*' key or -+using the Vim |zR| fold command. You can also use the mouse to open/close the -+folds. You can close all the folds using the '=' key. You should not manually -+create or delete the folds in the taglist window. -+ -+To automatically close the fold for the inactive files/buffers and open only -+the fold for the current buffer in the taglist window, set the -+'Tlist_File_Fold_Auto_Close' variable to 1. -+ -+Sorting the tags for a file~ -+The tags displayed in the taglist window can be sorted either by their name or -+by their chronological order. The default sorting method is by the order in -+which the tags appear in a file. You can change the default sort method by -+setting the 'Tlist_Sort_Type' variable to either "name" or "order". You can -+sort the tags by their name by pressing the "s" key in the taglist window. You -+can again sort the tags by their chronological order using the "s" key. Each -+file in the taglist window can be sorted using different order. -+ -+Zooming in and out of the taglist window~ -+You can press the 'x' key in the taglist window to maximize the taglist -+window width/height. The window will be maximized to the maximum possible -+width/height without closing the other existing windows. You can again press -+'x' to restore the taglist window to the default width/height. -+ -+ *taglist-session* -+Taglist Session~ -+A taglist session refers to the group of files and their tags stored in the -+taglist in a Vim session. -+ -+You can save and restore a taglist session (and all the displayed tags) using -+the ":TlistSessionSave" and ":TlistSessionLoad" commands. -+ -+To save the information about the tags and files in the taglist to a file, use -+the ":TlistSessionSave" command and specify the filename: -+> -+ :TlistSessionSave -+< -+To load a saved taglist session, use the ":TlistSessionLoad" command: > -+ -+ :TlistSessionLoad -+< -+When you load a taglist session file, the tags stored in the file will be -+added to the tags already stored in the taglist. -+ -+The taglist session feature can be used to save the tags for large files or a -+group of frequently used files (like a project). By using the taglist session -+file, you can minimize the amount to time it takes to load/refresh the taglist -+for multiple files. -+ -+You can create more than one taglist session file for multiple groups of -+files. -+ -+Displaying the tag name in the Vim status line or the window title bar~ -+You can use the Tlist_Get_Tagname_By_Line() function provided by the taglist -+plugin to display the current tag name in the Vim status line or the window -+title bar. Similarly, you can use the Tlist_Get_Tag_Prototype_By_Line() -+function to display the current tag prototype in the Vim status line or the -+window title bar. -+ -+For example, the following command can be used to display the current tag name -+in the status line: -+> -+ :set statusline=%<%f%=%([%{Tlist_Get_Tagname_By_Line()}]%) -+< -+The following command can be used to display the current tag name in the -+window title bar: -+> -+ :set title titlestring=%<%f\ %([%{Tlist_Get_Tagname_By_Line()}]%) -+< -+Note that the current tag name can be displayed only after the file is -+processed by the taglist plugin. For this, you have to either set the -+'Tlist_Process_File_Always' variable to 1 or open the taglist window or use -+the taglist menu. For more information about configuring the Vim status line, -+refer to the documentation for the Vim |'statusline'| option. -+ -+Changing the taglist window highlighting~ -+The following Vim 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 -+ 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, -+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 MyTagListTagName guifg=blue ctermfg=blue -+< -+Controlling the taglist window~ -+To use a horizontally split taglist window, instead of a vertically split -+window, set the 'Tlist_Use_Horiz_Window' variable to 1. -+ -+To use a vertically split taglist window on the rightmost side of the Vim -+window, set the 'Tlist_Use_Right_Window' variable to 1. -+ -+You can specify the width of the vertically split taglist window, by setting -+the 'Tlist_WinWidth' variable. You can specify the height of the horizontally -+split taglist window, by setting the 'Tlist_WinHeight' variable. -+ -+When opening a vertically split taglist window, the Vim window width is -+increased to accommodate the new taglist window. When the taglist window is -+closed, the Vim window is reduced. To disable this, set the -+'Tlist_Inc_Winwidth' variable to zero. -+ -+To reduce the number of empty lines in the taglist window, set the -+'Tlist_Compact_Format' variable to 1. -+ -+To not display the Vim fold column in the taglist window, set the -+'Tlist_Enable_Fold_Column' variable to zero. -+ -+To display the tag prototypes instead of the tag names in the taglist window, -+set the 'Tlist_Display_Prototype' variable to 1. -+ -+To not display the scope of the tags next to the tag names, set the -+'Tlist_Display_Tag_Scope' variable to zero. -+ -+ *taglist-keys* -+Taglist window key list~ -+The following table lists the description of the keys that can be used -+in the taglist window. -+ -+ Key Description~ -+ -+ Jump to the location where the tag under cursor is -+ 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 -+ tag type and the number of tags. -+ u Update the tags listed in the taglist window -+ s Change the sort order of the tags (by name or by order) -+ d Remove the tags for the file under the cursor -+ x Zoom-in or Zoom-out the taglist window -+ + Open a fold -+ - Close a fold -+ * Open all folds -+ = Close all folds -+ [[ Jump to the beginning of the previous file -+ Jump to the beginning of the previous file -+ ]] Jump to the beginning of the next file -+ Jump to the beginning of the next file -+ q Close the taglist window -+ Display help -+ -+The above keys will work in both the normal mode and the insert mode. -+ -+ *taglist-menu* -+Taglist menu~ -+When using GUI Vim, the taglist plugin can display the tags defined in the -+current file in the drop-down menu and the popup menu. By default, this -+feature is turned off. To turn on this feature, set the 'Tlist_Show_Menu' -+variable to 1. -+ -+You can jump to a tag by selecting the tag name from the menu. You can use the -+taglist menu independent of the taglist window i.e. you don't need to open the -+taglist window to get the taglist menu. -+ -+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. 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 -+multiple submenus. The default setting for 'Tlist_Max_Submenu_Items' is 25. -+The first and last tag names in the submenu are used to form the submenu name. -+The menu items are prefixed by alpha-numeric characters for easy selection by -+keyboard. -+ -+If the popup menu support is enabled (the |'mousemodel'| option contains -+"popup"), then the tags menu is added to the popup menu. You can access -+the popup menu by right clicking on the GUI window. -+ -+You can regenerate the tags menu by selecting the 'Tags->Refresh menu' entry. -+You can sort the tags listed in the menu either by name or by order by -+selecting the 'Tags->Sort menu by->Name/Order' menu entry. -+ -+You can tear-off the Tags menu and keep it on the side of the Vim window -+for quickly locating the tags. -+ -+Using the taglist plugin with the winmanager plugin~ -+You can use the taglist plugin with the winmanager plugin. This will allow you -+to use the file explorer, buffer explorer and the taglist plugin at the same -+time in different windows. To use the taglist plugin with the winmanager -+plugin, set 'TagList' in the 'winManagerWindowLayout' variable. For example, -+to use the file explorer plugin and the taglist plugin at the same time, use -+the following setting: > -+ -+ let winManagerWindowLayout = 'FileExplorer|TagList' -+< -+Getting help~ -+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, -+the help information is removed from the taglist window. -+ -+ *taglist-debug* -+Debugging the taglist plugin~ -+You can use the ":TlistDebug" command to enable logging of the debug messages -+from the taglist plugin. To display the logged debug messages, you can use the -+":TlistMessages" command. To disable the logging of the debug messages, use -+the ":TlistUndebug" command. -+ -+You can specify a file name to the ":TlistDebug" command to log the debug -+messages to a file. Otherwise, the debug messages are stored in a script-local -+variable. In the later case, to minimize memory usage, only the last 3000 -+characters from the debug messages are stored. -+ -+============================================================================== -+ *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 -+can change the behavior of the taglist plugin. You need to change these -+settings only if you want to change the behavior of the taglist plugin. You -+should use the |:let| command in your .vimrc file to change the setting of any -+of these variables. -+ -+The configurable taglist variables are listed below. For a detailed -+description of these variables refer to the text below this table. -+ -+|'Tlist_Auto_Highlight_Tag'| Automatically highlight the current tag in the -+ taglist. -+|'Tlist_Auto_Open'| Open the taglist window when Vim starts. -+|'Tlist_Auto_Update'| Automatically update the taglist to include -+ newly edited files. -+|'Tlist_Close_On_Select'| Close the taglist window when a file or tag is -+ selected. -+|'Tlist_Compact_Format'| Remove extra information and blank lines from -+ the taglist window. -+|'Tlist_Ctags_Cmd'| Specifies the path to the ctags utility. -+|'Tlist_Display_Prototype'| Show prototypes and not tags in the taglist -+ window. -+|'Tlist_Display_Tag_Scope'| Show tag scope next to the tag name. -+|'Tlist_Enable_Fold_Column'| Show the fold indicator column in the taglist -+ 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. -+|'Tlist_Inc_Winwidth'| Increase the Vim window width to accommodate -+ the taglist window. -+|'Tlist_Max_Submenu_Items'| Maximum number of items in a tags sub-menu. -+|'Tlist_Max_Tag_Length'| Maximum tag length used in a tag menu entry. -+|'Tlist_Process_File_Always'| Process files even when the taglist window is -+ closed. -+|'Tlist_Show_Menu'| Display the tags menu. -+|'Tlist_Show_One_File'| Show tags for the current buffer only. -+|'Tlist_Sort_Type'| Sort method used for arranging the tags. -+|'Tlist_Use_Horiz_Window'| Use a horizontally split window for the -+ taglist window. -+|'Tlist_Use_Right_Window'| Place the taglist window on the right side. -+|'Tlist_Use_SingleClick'| Single click on a tag jumps to it. -+|'Tlist_WinHeight'| Horizontally split taglist window height. -+|'Tlist_WinWidth'| Vertically split taglist window width. -+ -+ *'Tlist_Auto_Highlight_Tag'* -+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 -+tag highlighting is disabled, the tags for a new file will still be added to -+the taglist window. -+> -+ let Tlist_Auto_Highlight_Tag = 0 -+< -+With the above variable set to 1, you can use the ":TlistHighlightTag" command -+to highlight the current tag. -+ -+ *'Tlist_Auto_Open'* -+Tlist_Auto_Open~ -+To automatically open the taglist window, when you start Vim, you can set the -+'Tlist_Auto_Open' variable to 1. By default, this variable is set to zero and -+the taglist window will not be opened automatically on Vim startup. -+> -+ let Tlist_Auto_Open = 1 -+< -+The taglist window is opened only when a supported type of file is opened on -+Vim startup. For example, if you open text files, then the taglist window will -+not be opened. -+ -+ *'Tlist_Auto_Update'* -+Tlist_Auto_Update~ -+When a new file is edited, the tags defined in the file are automatically -+processed and added to the taglist. To stop adding new files to the taglist, -+set the 'Tlist_Auto_Update' variable to zero. By default, this variable is set -+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 -+is not closed. -+> -+ let Tlist_Close_On_Select = 1 -+< -+ *'Tlist_Compact_Format'* -+Tlist_Compact_Format~ -+By default, empty lines are used to separate different tag types displayed for -+a file and the tags displayed for different files in the taglist window. If -+you want to display as many tags as possible in the taglist window, you can -+set the 'Tlist_Compact_Format' variable to 1 to get a compact display. -+> -+ let Tlist_Compact_Format = 1 -+< -+ *'Tlist_Ctags_Cmd'* -+Tlist_Ctags_Cmd~ -+The 'Tlist_Ctags_Cmd' variable specifies the location (path) of the exuberant -+ctags utility. If exuberant ctags is present in any one of the directories in -+the PATH environment variable, then there is no need to set this variable. -+ -+The exuberant ctags tool can be installed under different names. When the -+taglist plugin starts up, if the 'Tlist_Ctags_Cmd' variable is not set, it -+checks for the names exuberant-ctags, exctags, ctags, ctags.exe and tags in -+the PATH environment variable. If any one of the named executable is found, -+then the Tlist_Ctags_Cmd variable is set to that name. -+ -+If exuberant ctags is not present in one of the directories specified in the -+PATH environment variable, then set this variable to point to the location of -+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. Examples: -+> -+ let Tlist_Ctags_Cmd = 'd:\tools\ctags.exe' -+ let Tlist_Ctags_Cmd = '/usr/local/bin/ctags' -+< -+ *'Tlist_Display_Prototype'* -+Tlist_Display_Prototype~ -+By default, only the tag name will be displayed in the taglist window. If you -+like to see tag prototypes instead of names, set the 'Tlist_Display_Prototype' -+variable to 1. By default, this variable is set to zero and only tag names -+will be displayed. -+> -+ let Tlist_Display_Prototype = 1 -+< -+ *'Tlist_Display_Tag_Scope'* -+Tlist_Display_Tag_Scope~ -+By default, the scope of a tag (like a C++ class) will be displayed in -+square brackets next to the tag name. If you don't want the tag scopes -+to be displayed, then set the 'Tlist_Display_Tag_Scope' to zero. By default, -+this variable is set to 1 and the tag scopes will be displayed. -+> -+ let Tlist_Display_Tag_Scope = 0 -+< -+ *'Tlist_Enable_Fold_Column'* -+Tlist_Enable_Fold_Column~ -+By default, the Vim fold column is enabled and displayed in the taglist -+window. If you wish to disable this (for example, when you are working with a -+narrow Vim window or terminal), you can set the 'Tlist_Enable_Fold_Column' -+variable to zero. -+> -+ let Tlist_Enable_Fold_Column = 1 -+< -+ *'Tlist_Exit_OnlyWindow'* -+Tlist_Exit_OnlyWindow~ -+If you want to exit Vim if only the taglist window is currently opened, then -+set the 'Tlist_Exit_OnlyWindow' variable to 1. By default, this variable is -+set to zero and the Vim instance will not be closed if only the taglist window -+is present. -+> -+ let Tlist_Exit_OnlyWindow = 1 -+< -+ *'Tlist_File_Fold_Auto_Close'* -+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 -+other buffers is closed. -+> -+ 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~ -+When you enter a Vim buffer/window, the current tag in that buffer/window is -+automatically highlighted in the taglist window. If the current tag name is -+not visible in the taglist window, then the taglist window contents are -+scrolled to make that tag name visible. If you like to disable the automatic -+highlighting of the current tag when entering a buffer, you can set the -+'Tlist_Highlight_Tag_On_BufEnter' variable to zero. The default setting for -+this variable is 1. -+> -+ let Tlist_Highlight_Tag_On_BufEnter = 0 -+< -+ *'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 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 -+the screen due to the change in the window width or if you prefer not to -+adjust the window width then set the 'Tlist_Inc_Winwidth' variable to zero. -+CAUTION: If you are using the MS-Windows version of Vim in a MS-DOS command -+window then you must set this variable to zero, otherwise the system may hang -+due to a Vim limitation (explained in :help win32-problems) -+> -+ let Tlist_Inc_Winwidth = 0 -+< -+ *'Tlist_Max_Submenu_Items'* -+Tlist_Max_Submenu_Items~ -+If a file contains too many tags of a particular type (function, variable, -+class, etc.), greater than that specified by the 'Tlist_Max_Submenu_Items' -+variable, then the menu for that tag type will be split into multiple -+sub-menus. The default setting for the 'Tlist_Max_Submenu_Items' variable is -+25. This can be changed by setting the 'Tlist_Max_Submenu_Items' variable: -+> -+ let Tlist_Max_Submenu_Items = 20 -+< -+The name of the submenu is formed using the names of the first and the last -+tag entries in that submenu. -+ -+ *'Tlist_Max_Tag_Length'* -+Tlist_Max_Tag_Length~ -+Only the first 'Tlist_Max_Tag_Length' characters from the tag names will be -+used to form the tag type submenu name. The default value for this variable is -+10. Change the 'Tlist_Max_Tag_Length' setting if you want to include more or -+less characters: -+> -+ let Tlist_Max_Tag_Length = 10 -+< -+ *'Tlist_Process_File_Always'* -+Tlist_Process_File_Always~ -+By default, the taglist plugin will generate and process the tags defined in -+the newly opened files only when the taglist window is opened or when the -+taglist menu is enabled. When the taglist window is closed, the taglist plugin -+will stop processing the tags for newly opened files. -+ -+You can set the 'Tlist_Process_File_Always' variable to 1 to generate the list -+of tags for new files even when the taglist window is closed and the taglist -+menu is disabled. -+> -+ let Tlist_Process_File_Always = 1 -+< -+To use the ":TlistShowTag" and the ":TlistShowPrototype" commands without the -+taglist window and the taglist menu, you should set this variable to 1. -+ -+ *'Tlist_Show_Menu'* -+Tlist_Show_Menu~ -+When using GUI Vim, you can display the tags defined in the current file in a -+menu named "Tags". By default, this feature is turned off. To turn on this -+feature, set the 'Tlist_Show_Menu' variable to 1: -+> -+ let Tlist_Show_Menu = 1 -+< -+ *'Tlist_Show_One_File'* -+Tlist_Show_One_File~ -+By default, the taglist plugin will display the tags defined in all the loaded -+buffers in the taglist window. If you prefer to display the tags defined only -+in the current buffer, then you can set the 'Tlist_Show_One_File' to 1. When -+this variable is set to 1, as you switch between buffers, the taglist window -+will be refreshed to display the tags for the current buffer and the tags for -+the previous buffer will be removed. -+> -+ let Tlist_Show_One_File = 1 -+< -+ *'Tlist_Sort_Type'* -+Tlist_Sort_Type~ -+The 'Tlist_Sort_Type' variable specifies the sort order for the tags in the -+taglist window. The tags can be sorted either alphabetically by their name or -+by the order of their appearance in the file (chronological order). By -+default, the tag names will be listed by the order in which they are defined -+in the file. You can change the sort type (from name to order or from order to -+name) by pressing the "s" key in the taglist window. You can also change the -+default sort order by setting 'Tlist_Sort_Type' to "name" or "order": -+> -+ let Tlist_Sort_Type = "name" -+< -+ *'Tlist_Use_Horiz_Window'* -+Tlist_Use_Horiz_Window~ -+Be default, the tag names are displayed in a vertically split window. If you -+prefer a horizontally split window, then set the 'Tlist_Use_Horiz_Window' -+variable to 1. If you are running MS-Windows version of Vim in a MS-DOS -+command window, then you should use a horizontally split window instead of a -+vertically split window. Also, if you are using an older version of xterm in a -+Unix system that doesn't support changing the xterm window width, you should -+use a horizontally split window. -+> -+ let Tlist_Use_Horiz_Window = 1 -+< -+ *'Tlist_Use_Right_Window'* -+Tlist_Use_Right_Window~ -+By default, the vertically split taglist window will appear on the left hand -+side. If you prefer to open the window on the right hand side, you can set the -+'Tlist_Use_Right_Window' variable to 1: -+> -+ let Tlist_Use_Right_Window = 1 -+< -+ *'Tlist_Use_SingleClick'* -+Tlist_Use_SingleClick~ -+By default, when you double click on the tag name using the left mouse -+button, the cursor will be positioned at the definition of the tag. You -+can set the 'Tlist_Use_SingleClick' variable to 1 to jump to a tag when -+you single click on the tag name using the mouse. By default this variable -+is set to zero. -+> -+ let Tlist_Use_SingleClick = 1 -+< -+Due to a bug in Vim, if you set 'Tlist_Use_SingleClick' to 1 and try to resize -+the taglist window using the mouse, then Vim will crash. This problem is fixed -+in Vim 6.3 and above. In the meantime, instead of resizing the taglist window -+using the mouse, you can use normal Vim window resizing commands to resize the -+taglist window. -+ -+ *'Tlist_WinHeight'* -+Tlist_WinHeight~ -+The default height of the horizontally split taglist window is 10. This can be -+changed by modifying the 'Tlist_WinHeight' variable: -+> -+ let Tlist_WinHeight = 20 -+< -+The |'winfixheight'| option is set for the taglist window, to maintain the -+height of the taglist window, when new Vim windows are opened and existing -+windows are closed. -+ -+ *'Tlist_WinWidth'* -+Tlist_WinWidth~ -+The default width of the vertically split taglist window is 30. This can be -+changed by modifying the 'Tlist_WinWidth' variable: -+> -+ let Tlist_WinWidth = 20 -+< -+Note that the value of the |'winwidth'| option setting determines the minimum -+width of the current window. If you set the 'Tlist_WinWidth' variable to a -+value less than that of the |'winwidth'| option setting, then Vim will use the -+value of the |'winwidth'| option. -+ -+When new Vim windows are opened and existing windows are closed, the taglist -+plugin will try to maintain the width of the taglist window to the size -+specified by the 'Tlist_WinWidth' variable. -+ -+============================================================================== -+ *taglist-commands* -+7. Commands~ -+ -+The taglist plugin provides the following ex-mode commands: -+ -+|:TlistAddFiles| Add multiple files to the taglist. -+|:TlistAddFilesRecursive| -+ Add files recursively to the taglist. -+|:TlistClose| Close the taglist window. -+|:TlistDebug| Start logging of taglist debug messages. -+|:TlistLock| Stop adding new files to the taglist. -+|:TlistMessages| Display the logged taglist plugin debug messages. -+|:TlistOpen| Open and jump to the taglist window. -+|:TlistSessionSave| Save the information about files and tags in the -+ taglist to a session file. -+|:TlistSessionLoad| Load the information about files and tags stored -+ in a session file to taglist. -+|:TlistShowPrototype| Display the prototype of the tag at or before the -+ specified line number. -+|:TlistShowTag| Display the name of the tag defined at or before the -+ specified line number. -+|:TlistHighlightTag| Highlight the current tag in the taglist window. -+|:TlistToggle| Open or close (toggle) the taglist window. -+|:TlistUndebug| Stop logging of taglist debug messages. -+|:TlistUnlock| Start adding new files to the taglist. -+|:TlistUpdate| Update the tags for the current buffer. -+ -+ *:TlistAddFiles* -+:TlistAddFiles {file(s)} [file(s) ...] -+ Add one or more specified files to the taglist. You can -+ specify multiple filenames using wildcards. To specify a -+ file name with space character, you should escape the space -+ character with a backslash. -+ Examples: -+> -+ :TlistAddFiles *.c *.cpp -+ :TlistAddFiles file1.html file2.html -+< -+ If you specify a large number of files, then it will take some -+ time for the taglist plugin to process all of them. The -+ specified files will not be edited in a Vim window and will -+ not be added to the Vim buffer list. -+ -+ *:TlistAddFilesRecursive* -+:TlistAddFilesRecursive {directory} [ {pattern} ] -+ Add files matching {pattern} recursively from the specified -+ {directory} to the taglist. If {pattern} is not specified, -+ then '*' is assumed. To specify the current directory, use "." -+ for {directory}. To specify a directory name with space -+ character, you should escape the space character with a -+ backslash. -+ Examples: -+> -+ :TlistAddFilesRecursive myproject *.java -+ :TlistAddFilesRecursive smallproject -+< -+ If large number of files are present in the specified -+ directory tree, then it will take some time for the taglist -+ plugin to process all of them. -+ -+ *:TlistClose* -+:TlistClose Close the taglist window. This command can be used from any -+ one of the Vim windows. -+ -+ *:TlistDebug* -+:TlistDebug [filename] -+ Start logging of debug messages from the taglist plugin. -+ If {filename} is specified, then the debug messages are stored -+ in the specified file. Otherwise, the debug messages are -+ stored in a script local variable. If the file {filename} is -+ already present, then it is overwritten. -+ -+ *:TlistLock* -+:TlistLock -+ Lock the taglist and don't process new files. After this -+ command is executed, newly edited files will not be added to -+ the taglist. -+ -+ *:TlistMessages* -+:TlistMessages -+ Display the logged debug messages from the taglist plugin -+ in a window. This command works only when logging to a -+ script-local variable. -+ -+ *:TlistOpen* -+:TlistOpen Open and jump to the taglist window. Creates the taglist -+ window, if the window is not opened currently. After executing -+ this command, the cursor is moved to the taglist window. When -+ the taglist window is opened for the first time, all the files -+ in the buffer list are processed and the tags defined in them -+ are displayed in the taglist window. -+ -+ *:TlistSessionSave* -+:TlistSessionSave {filename} -+ Saves the information about files and tags in the taglist to -+ the specified file. This command can be used to save and -+ restore the taglist contents across Vim sessions. -+ -+ *:TlistSessionLoad* -+:TlistSessionLoad {filename} -+ Load the information about files and tags stored in the -+ specified session file to the taglist. -+ -+ *:TlistShowPrototype* -+:TlistShowPrototype [filename] [linenumber] -+ Display the prototype of the tag at or before the specified -+ line number. If the file name and the line number are not -+ specified, then the current file name and line number are -+ used. A tag spans multiple lines starting from the line where -+ it is defined to the line before the next tag. This command -+ displays the prototype for the tag for any line number in this -+ range. -+ -+ *:TlistShowTag* -+:TlistShowTag [filename] [linenumber] -+ Display the name of the tag defined at or before the specified -+ line number. If the file name and the line number are not -+ specified, then the current file name and line number are -+ used. A tag spans multiple lines starting from the line where -+ it is defined to the line before the next tag. This command -+ displays the tag name for any line number in this range. -+ -+ *:TlistHighlightTag* -+:TlistHighlightTag -+ Highlight the current tag in the taglist window. By default, -+ the taglist plugin periodically updates the taglist window to -+ highlight the current tag. This command can be used to force -+ the taglist plugin to highlight the current tag. -+ -+ *:TlistToggle* -+:TlistToggle Open or close (toggle) the taglist window. Opens the taglist -+ window, if the window is not opened currently. Closes the -+ taglist window, if the taglist window is already opened. When -+ the taglist window is opened for the first time, all the files -+ in the buffer list are processed and the tags are displayed in -+ the taglist window. After executing this command, the cursor -+ is not moved from the current window to the taglist window. -+ -+ *:TlistUndebug* -+:TlistUndebug -+ Stop logging of debug messages from the taglist plugin. -+ -+ *:TlistUnlock* -+:TlistUnlock -+ Unlock the taglist and start processing newly edited files. -+ -+ *:TlistUpdate* -+:TlistUpdate Update the tags information for the current buffer. This -+ command can be used to re-process the current file/buffer and -+ get the tags information. As the taglist plugin uses the file -+ saved in the disk (instead of the file displayed in a Vim -+ buffer), you should save a modified buffer before you update -+ the taglist. Otherwise the listed tags will not include the -+ new tags created in the buffer. You can use this command even -+ when the taglist window is not opened. -+ -+============================================================================== -+ *taglist-functions* -+8. Global functions~ -+ -+The taglist plugin provides several global functions that can be used from -+other Vim plugins to interact with the taglist plugin. These functions are -+described below. -+ -+|Tlist_Update_File_Tags()| Update the tags for the specified file -+|Tlist_Get_Tag_Prototype_By_Line()| Return the prototype of the tag at or -+ before the specified line number in the -+ specified file. -+|Tlist_Get_Tagname_By_Line()| Return the name of the tag at or -+ before the specified line number in -+ the specified file. -+|Tlist_Set_App()| Set the name of the application -+ controlling the taglist window. -+ -+ *Tlist_Update_File_Tags()* -+Tlist_Update_File_Tags({filename}, {filetype}) -+ Update the tags for the file {filename}. The second argument -+ specifies the Vim filetype for the file. If the taglist plugin -+ has not processed the file previously, then the exuberant -+ ctags tool is invoked to generate the tags for the file. -+ -+ *Tlist_Get_Tag_Prototype_By_Line()* -+Tlist_Get_Tag_Prototype_By_Line([{filename}, {linenumber}]) -+ Return the prototype of the tag at or before the specified -+ line number in the specified file. If the filename and line -+ number are not specified, then the current buffer name and the -+ current line number are used. -+ -+ *Tlist_Get_Tagname_By_Line()* -+Tlist_Get_Tagname_By_Line([{filename}, {linenumber}]) -+ Return the name of the tag at or before the specified line -+ number in the specified file. If the filename and line number -+ are not specified, then the current buffer name and the -+ current line number are used. -+ -+ *Tlist_Set_App()* -+Tlist_Set_App({appname}) -+ Set the name of the plugin that controls the taglist plugin -+ window and buffer. This can be used to integrate the taglist -+ plugin with other Vim plugins. -+ -+ For example, the winmanager plugin and the Cream package use -+ this function and specify the appname as "winmanager" and -+ "cream" respectively. -+ -+ By default, the taglist plugin is a stand-alone plugin and -+ controls the taglist window and buffer. If the taglist window -+ is controlled by an external plugin, then the appname should -+ be set appropriately. -+ -+============================================================================== -+ *taglist-extend* -+9. Extending~ -+ -+The taglist plugin supports all the languages supported by the exuberant ctags -+tool, which includes the following languages: Assembly, ASP, Awk, Beta, C, -+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 extend the taglist plugin to add support for new languages and also -+modify the support for the above listed languages. -+ -+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 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 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 -+ -+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 -+ -+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 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. 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: -+ -+ 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 -+used for the class tags and 'function' is the title used for the function tags -+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. 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. -+ -+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): -+ -+ 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', -+'command' and 'label' will be used in the taglist window for the tags which -+are generated for the flags b, c and l respectively. -+ -+============================================================================== -+ *taglist-faq* -+10. Frequently Asked Questions~ -+ -+Q. The taglist plugin doesn't work. The taglist window is empty and the tags -+ defined in a file are not displayed. -+A. Are you using Vim version 6.0 and above? The taglist plugin relies on the -+ features supported by Vim version 6.0 and above. You can use the following -+ command to get the Vim version: -+> -+ $ vim --version -+< -+ Are you using exuberant ctags version 5.0 and above? The taglist plugin -+ relies on the features supported by exuberant ctags and will not work with -+ GNU ctags or the Unix ctags utility. You can use the following command to -+ determine whether the ctags installed in your system is exuberant ctags: -+> -+ $ 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: -+> -+ :filetype -+< -+ The output of the above command should contain "filetype detection:ON". -+ To turn on the filetype detection, add the following line to the .vimrc or -+ _vimrc file: -+> -+ filetype on -+< -+ Is your version of Vim compiled with the support for the system() function? -+ The following Vim command should display 1: -+> -+ :echo exists('*system') -+< -+ In some Linux distributions (particularly Suse Linux), the default Vim -+ installation is built without the support for the system() function. The -+ taglist plugin uses the system() function to invoke the exuberant ctags -+ utility. You need to rebuild Vim after enabling the support for the -+ system() function. If you use the default build options, the system() -+ function will be supported. -+ -+ Do you have the |'shellslash'| option set? You can try disabling the -+ |'shellslash'| option. When the taglist plugin invokes the exuberant ctags -+ utility with the path to the file, if the incorrect slashes are used, then -+ you will see errors. -+ -+ Check the shell related Vim options values using the following command: -+> -+ :set shell? shellcmdflag? shellpipe? -+ :set shellquote? shellredir? shellxquote? -+< -+ If these options are set in your .vimrc or _vimrc file, try removing those -+ lines. -+ -+ Are you using a Unix shell in a MS-Windows environment? For example, -+ the Unix shell from the MKS-toolkit. Do you have the SHELL environment -+ set to point to this shell? You can try resetting the SHELL environment -+ variable. -+ -+ If you are using a Unix shell on MS-Windows, you should try to use -+ exuberant ctags that is compiled for Unix-like environments so that -+ exuberant ctags will understand path names with forward slash characters. -+ -+ Is your filetype supported by the exuberant ctags utility? The file types -+ supported by the exuberant ctags utility are listed in the ctags help. If a -+ file type is not supported, you have to extend exuberant ctags. You can use -+ the following command to list the filetypes supported by exuberant ctags: -+> -+ ctags --list-languages -+< -+ Run the following command from the shell prompt and check whether the tags -+ defined in your file are listed in the output from exuberant ctags: -+> -+ ctags -f - --format=2 --excmd=pattern --fields=nks -+< -+ If you see your tags in the output from the above command, then the -+ exuberant ctags utility is properly parsing your file. -+ -+ Do you have the .ctags or _ctags or the ctags.cnf file in your home -+ directory for specifying default options or for extending exuberant ctags? -+ If you do have this file, check the options in this file and make sure -+ these options are not interfering with the operation of the taglist plugin. -+ -+ If you are using MS-Windows, check the value of the TEMP and TMP -+ environment variables. If these environment variables are set to a path -+ with space characters in the name, then try using the DOS 8.3 short name -+ for the path or set them to a path without the space characters in the -+ name. For example, if the temporary directory name is "C:\Documents and -+ Settings\xyz\Local Settings\Temp", then try setting the TEMP variable to -+ the following: -+> -+ set TEMP=C:\DOCUMEN~1\xyz\LOCALS~1\Temp -+< -+ If exuberant ctags is installed in a directory with space characters in the -+ name, then try adding the directory to the PATH environment variable or try -+ setting the 'Tlist_Ctags_Cmd' variable to the shortest path name to ctags -+ or try copying the exuberant ctags to a path without space characters in -+ the name. For example, if exuberant ctags is installed in the directory -+ "C:\Program Files\Ctags", then try setting the 'Tlist_Ctags_Cmd' variable -+ as below: -+> -+ let Tlist_Ctags_Cmd='C:\Progra~1\Ctags\ctags.exe' -+< -+Q. When I try to open the taglist window, I am seeing the following error -+ message. How do I fix this problem? -+ -+ Taglist: Failed to generate tags for /my/path/to/file -+ ctags: illegal option -- -^@usage: ctags [-BFadtuwvx] [-f tagsfile] file ... -+ -+A. The taglist plugin will work only with the exuberant ctags tool. You -+ cannot use the GNU ctags or the Unix ctags program with the taglist plugin. -+ You will see an error message similar to the one shown above, if you try -+ use a non-exuberant ctags program with Vim. To fix this problem, either add -+ the exuberant ctags tool location to the PATH environment variable or set -+ the 'Tlist_Ctags_Cmd' variable. -+ -+Q. A file has more than one tag with the same name. When I select a tag name -+ from the taglist window, the cursor is positioned at the incorrect tag -+ location. -+A. The taglist plugin uses the search pattern generated by the exuberant ctags -+ utility to position the cursor at the location of a tag definition. If a -+ file has more than one tag with the same name and same prototype, then the -+ search pattern will be the same. In this case, when searching for the tag -+ pattern, the cursor may be positioned at the incorrect location. -+ -+Q. I have made some modifications to my file and introduced new -+ functions/classes/variables. I have not yet saved my file. The taglist -+ plugin is not displaying the new tags when I update the taglist window. -+A. The exuberant ctags utility will process only files that are present in the -+ disk. To list the tags defined in a file, you have to save the file and -+ then update the taglist window. -+ -+Q. I have created a ctags file using the exuberant ctags utility for my source -+ tree. How do I configure the taglist plugin to use this tags file? -+A. The taglist plugin doesn't use a tags file stored in disk. For every opened -+ file, the taglist plugin invokes the exuberant ctags utility to get the -+ list of tags dynamically. The Vim system() function is used to invoke -+ exuberant ctags and get the ctags output. This function internally uses a -+ temporary file to store the output. This file is deleted after the output -+ from the command is read. So you will never see the file that contains the -+ output of exuberant ctags. -+ -+Q. When I set the |'updatetime'| option to a low value (less than 1000) and if -+ I keep pressing a key with the taglist window open, the current buffer -+ contents are changed. Why is this? -+A. The taglist plugin uses the |CursorHold| autocmd to highlight the current -+ tag. The CursorHold autocmd triggers for every |'updatetime'| milliseconds. -+ If the |'updatetime'| option is set to a low value, then the CursorHold -+ autocmd will be triggered frequently. As the taglist plugin changes -+ the focus to the taglist window to highlight the current tag, this could -+ interfere with the key movement resulting in changing the contents of -+ 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* -+12. Todo~ -+ -+1. Group tags according to the scope and display them. For example, -+ group all the tags belonging to a C++/Java class -+2. Support for displaying tags in a modified (not-yet-saved) file. -+3. Automatically open the taglist window only for selected filetypes. -+ For other filetypes, close the taglist window. -+4. When using the shell from the MKS toolkit, the taglist plugin -+ doesn't work. -+5. The taglist plugin doesn't work with files edited remotely using the -+ netrw plugin. The exuberant ctags utility cannot process files over -+ scp/rcp/ftp, etc. -+ -+============================================================================== -+ -+vim:tw=78:ts=8:noet:ft=help: -diff -urN vim71/1/doc/taglist.txt vim71_ada/1/doc/taglist.txt ---- vim71/1/doc/taglist.txt 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/doc/taglist.txt 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,1494 @@ -+*taglist.txt* Plugin for browsing source code -+ -+Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) -+For Vim version 6.0 and above -+Last change: 2007 February 18 -+ -+1. Overview |taglist-intro| -+2. Taglist on the internet |taglist-internet| -+3. Requirements |taglist-requirements| -+4. Installation |taglist-install| -+5. Usage |taglist-using| -+6. Options |taglist-options| -+7. Commands |taglist-commands| -+8. Global functions |taglist-functions| -+9. Extending |taglist-extend| -+10. FAQ |taglist-faq| -+11. License |taglist-license| -+12. Todo |taglist-todo| -+ -+============================================================================== -+ *taglist-intro* -+1. Overview~ -+ -+The "Tag List" plugin is a source code browser plugin for Vim. This plugin -+allows you to efficiently browse through source code files for different -+programming languages. The "Tag List" plugin provides the following features: -+ -+ * Displays the tags (functions, classes, structures, variables, etc.) -+ defined in a file in a vertically or horizontally split Vim window. -+ * In GUI Vim, optionally displays the tags in the Tags drop-down menu and -+ in the popup menu. -+ * Automatically updates the taglist window as you switch between -+ files/buffers. As you open new files, the tags defined in the new files -+ are added to the existing file list and the tags defined in all the -+ files are displayed grouped by the filename. -+ * When a tag name is selected from the taglist window, positions the -+ cursor at the definition of the tag in the source file. -+ * Automatically highlights the current tag name. -+ * Groups the tags by their type and displays them in a foldable tree. -+ * Can display the prototype and scope of a tag. -+ * Can optionally display the tag prototype instead of the tag name in the -+ taglist window. -+ * The tag list can be sorted either by name or by chronological order. -+ * Supports the following language files: Assembly, ASP, Awk, Beta, C, -+ 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. -+ * Can be easily extended to support new languages. Support for -+ existing languages can be modified easily. -+ * Provides functions to display the current tag name in the Vim status -+ line or the window title bar. -+ * The list of tags and files in the taglist can be saved and -+ restored across Vim sessions. -+ * Provides commands to get the name and prototype of the current tag. -+ * Runs in both console/terminal and GUI versions of Vim. -+ * Works with the winmanager plugin. Using the winmanager plugin, you -+ can use Vim plugins like the file explorer, buffer explorer and the -+ taglist plugin at the same time like an IDE. -+ * Can be used in both Unix and MS-Windows systems. -+ -+============================================================================== -+ *taglist-internet* -+2. Taglist on the internet~ -+ -+The home page of the taglist plugin is at: -+> -+ http://vim-taglist.sourceforge.net/ -+< -+You can subscribe to the taglist mailing list to post your questions or -+suggestions for improvement or to send bug reports. Visit the following page -+for subscribing to the mailing list: -+> -+ http://groups.yahoo.com/group/taglist -+< -+============================================================================== -+ *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 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. The exuberant ctags utility is shipped with -+most of the Linux distributions. You can download the exuberant ctags utility -+from -+> -+ http://ctags.sourceforge.net -+< -+The taglist plugin doesn't use or create a tags file and there is no need to -+create a tags file to use this plugin. The taglist plugin will not work with -+the GNU ctags or the Unix ctags utility. -+ -+This plugin relies on the Vim "filetype" detection mechanism to determine the -+type of the current file. You have to turn on the Vim filetype detection by -+adding the following line to your .vimrc file: -+> -+ filetype on -+< -+The taglist plugin will not work if you run Vim in the restricted mode (using -+the -Z command-line argument). -+ -+The taglist plugin uses the Vim system() function to invoke the exuberant -+ctags utility. If Vim is compiled without the system() function then you -+cannot use the taglist plugin. Some of the Linux distributions (Suse) compile -+Vim without the system() function for security reasons. -+ -+============================================================================== -+ *taglist-install* -+4. Installation~ -+ -+1. Download the taglist.zip file and unzip the files to the $HOME/.vim or the -+ $HOME/vimfiles or the $VIM/vimfiles directory. After this step, you should -+ have the following two files (the directory structure should be preserved): -+ -+ plugin/taglist.vim - main taglist plugin file -+ doc/taglist.txt - documentation (help) file -+ -+ 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 -+ topics. -+3. If the exuberant ctags utility is not present in one of the directories in -+ the PATH environment variable, then set the 'Tlist_Ctags_Cmd' variable to -+ point to the location of the exuberant ctags utility (not to the directory) -+ in the .vimrc file. -+4. If you are running a terminal/console version of Vim and the terminal -+ doesn't support changing the window width then set the -+ 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. -+5. Restart Vim. -+6. You can now use the ":TlistToggle" command to open/close the taglist -+ window. You can use the ":help taglist" command to get more information -+ about using the taglist plugin. -+ -+To uninstall the taglist plugin, remove the plugin/taglist.vim and -+doc/taglist.txt files from the $HOME/.vim or $HOME/vimfiles directory. -+ -+============================================================================== -+ *taglist-using* -+5. Usage~ -+ -+The taglist plugin can be used in several different ways. -+ -+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 -+ processes the tags defined in newly edited files. You can then open the -+ taglist window only when you need to select a tag and then automatically -+ close the taglist window after selecting the tag. -+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 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 -+ plugin to process the tags defined in a file always. -+6. You can save the tags defined in multiple files to a taglist session file -+ and load it when needed. You can also configure the taglist plugin to not -+ update the taglist window when editing new files. You can then manually add -+ files to the taglist window. -+ -+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. 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. -+> -+ nnoremap :TlistToggle -+< -+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: -+> -+ $ vim +TlistOpen -+< -+Closing the taglist window~ -+You can close the taglist window from the taglist window by pressing 'q' or -+using the Vim ":q" command. You can also use any of the Vim window commands to -+close the taglist window. Invoking the ":TlistToggle" command when the taglist -+window is opened, closes the taglist window. You can also use the -+":TlistClose" command to close the taglist window. -+ -+To automatically close the taglist window when a tag or file is selected, you -+can set the 'Tlist_Close_On_Select' variable to 1. To exit Vim when only the -+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. -+ -+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 -+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 -+taglist window. The Vim |CursorHold| autocmd event is used for this. If the -+current tag name is not visible in the taglist window, then the taglist window -+contents are scrolled to make that tag name visible. You can also use the -+":TlistHighlightTag" command to force the highlighting of the current tag. -+ -+The tag name is highlighted if no activity is performed for |'updatetime'| -+milliseconds. The default value for this Vim option is 4 seconds. To avoid -+unexpected problems, you should not set the |'updatetime'| option to a very -+low value. -+ -+To disable the automatic highlighting of the current tag name in the taglist -+window, set the 'Tlist_Auto_Highlight_Tag' variable to zero. -+ -+When entering a Vim buffer/window, the taglist plugin automatically highlights -+the current tag in that buffer/window. If you like to disable the automatic -+highlighting of the current tag when entering a buffer, set the -+'Tlist_Highlight_Tag_On_BufEnter' variable to zero. -+ -+Adding files to the taglist~ -+When the taglist window is opened, all the files in the Vim buffer list are -+processed and the supported files are added to the taglist. When you edit a -+file in Vim, the taglist plugin automatically processes this file and adds it -+to the taglist. If you close the taglist window, the tag information in the -+taglist is retained. -+ -+To process files even when the taglist window is not open, set the -+'Tlist_Process_File_Always' variable to 1. -+ -+You can manually add multiple files to the taglist without opening them using -+the ":TlistAddFiles" and the ":TlistAddFilesRecursive" commands. -+ -+For example, to add all the C files in the /my/project/dir directory to the -+taglist, you can use the following command: -+> -+ :TlistAddFiles /my/project/dir/*.c -+< -+Note that when adding several files with a large number of tags or a large -+number of files, it will take several seconds to several minutes for the -+taglist plugin to process all the files. You should not interrupt the taglist -+plugin by pressing . -+ -+You can recursively add multiple files from a directory tree using the -+":TlistAddFilesRecursive" command: -+> -+ :TlistAddFilesRecursive /my/project/dir *.c -+< -+This command takes two arguments. The first argument specifies the directory -+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 -+removed file will no longer be displayed in the taglist window in the current -+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 -+":bwipeout" command, the taglist is updated to remove the stored information -+for this buffer. -+ -+Updating the tags displayed for a file~ -+The taglist plugin keeps track of the modification time of a file. When the -+modification time changes (the file is modified), the taglist plugin -+automatically updates the tags listed for that file. The modification time of -+a file is checked when you enter a window containing that file or when you -+load that file. -+ -+You can also update or refresh the tags displayed for a file by pressing the -+"u" key in the taglist window. If an existing file is modified, after the file -+is saved, the taglist plugin automatically updates the tags displayed for the -+file. -+ -+You can also use the ":TlistUpdate" command to update the tags for the current -+buffer after you made some changes to it. You should save the modified buffer -+before you update the taglist window. Otherwise the listed tags will not -+include the new tags created in the buffer. -+ -+If you have deleted the tags displayed for a file in the taglist window using -+the 'd' key, you can again display the tags for that file using the -+":TlistUpdate" command. -+ -+Controlling the taglist updates~ -+To disable the automatic processing of new files or modified files, you can -+set the 'Tlist_Auto_Update' variable to zero. When this variable is set to -+zero, the taglist is updated only when you use the ":TlistUpdate" command or -+the ":TlistAddFiles" or the ":TlistAddFilesRecursive" commands. You can use -+this option to control which files are added to the taglist. -+ -+You can use the ":TlistLock" command to lock the taglist contents. After this -+command is executed, new files are not automatically added to the taglist. -+When the taglist is locked, you can use the ":TlistUpdate" command to add the -+current file or the ":TlistAddFiles" or ":TlistAddFilesRecursive" commands to -+add new files to the taglist. To unlock the taglist, use the ":TlistUnlock" -+command. -+ -+Displaying the tag prototype~ -+To display the prototype of the tag under the cursor in the taglist window, -+press the space bar. If you place the cursor on a tag name in the taglist -+window, then the tag prototype is displayed at the Vim status line after -+|'updatetime'| milliseconds. The default value for the |'updatetime'| Vim -+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. 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 -+line number are not supplied, then this command will display the name of the -+current tag. For example, -+> -+ :TlistShowTag -+ :TlistShowTag myfile.java 100 -+< -+You can use the ":TlistShowPrototype" command to display the prototype of the -+tag at or before the specified line number in the specified file. If the file -+name and the line number are not supplied, then this command will display the -+prototype of the current tag. For example, -+> -+ :TlistShowPrototype -+ :TlistShowPrototype myfile.c 50 -+< -+In the taglist window, when the mouse is moved over a tag name, the tag -+prototype is displayed in a balloon. This works only in GUI versions where -+balloon evaluation is supported. -+ -+Taglist window contents~ -+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 -+|'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 -+the Vim folding support. You can collapse the tree using the '-' key or using -+the Vim |zc| fold command. You can open the tree using the '+' key or using -+the Vim |zo| fold command. You can open all the folds using the '*' key or -+using the Vim |zR| fold command. You can also use the mouse to open/close the -+folds. You can close all the folds using the '=' key. You should not manually -+create or delete the folds in the taglist window. -+ -+To automatically close the fold for the inactive files/buffers and open only -+the fold for the current buffer in the taglist window, set the -+'Tlist_File_Fold_Auto_Close' variable to 1. -+ -+Sorting the tags for a file~ -+The tags displayed in the taglist window can be sorted either by their name or -+by their chronological order. The default sorting method is by the order in -+which the tags appear in a file. You can change the default sort method by -+setting the 'Tlist_Sort_Type' variable to either "name" or "order". You can -+sort the tags by their name by pressing the "s" key in the taglist window. You -+can again sort the tags by their chronological order using the "s" key. Each -+file in the taglist window can be sorted using different order. -+ -+Zooming in and out of the taglist window~ -+You can press the 'x' key in the taglist window to maximize the taglist -+window width/height. The window will be maximized to the maximum possible -+width/height without closing the other existing windows. You can again press -+'x' to restore the taglist window to the default width/height. -+ -+ *taglist-session* -+Taglist Session~ -+A taglist session refers to the group of files and their tags stored in the -+taglist in a Vim session. -+ -+You can save and restore a taglist session (and all the displayed tags) using -+the ":TlistSessionSave" and ":TlistSessionLoad" commands. -+ -+To save the information about the tags and files in the taglist to a file, use -+the ":TlistSessionSave" command and specify the filename: -+> -+ :TlistSessionSave -+< -+To load a saved taglist session, use the ":TlistSessionLoad" command: > -+ -+ :TlistSessionLoad -+< -+When you load a taglist session file, the tags stored in the file will be -+added to the tags already stored in the taglist. -+ -+The taglist session feature can be used to save the tags for large files or a -+group of frequently used files (like a project). By using the taglist session -+file, you can minimize the amount to time it takes to load/refresh the taglist -+for multiple files. -+ -+You can create more than one taglist session file for multiple groups of -+files. -+ -+Displaying the tag name in the Vim status line or the window title bar~ -+You can use the Tlist_Get_Tagname_By_Line() function provided by the taglist -+plugin to display the current tag name in the Vim status line or the window -+title bar. Similarly, you can use the Tlist_Get_Tag_Prototype_By_Line() -+function to display the current tag prototype in the Vim status line or the -+window title bar. -+ -+For example, the following command can be used to display the current tag name -+in the status line: -+> -+ :set statusline=%<%f%=%([%{Tlist_Get_Tagname_By_Line()}]%) -+< -+The following command can be used to display the current tag name in the -+window title bar: -+> -+ :set title titlestring=%<%f\ %([%{Tlist_Get_Tagname_By_Line()}]%) -+< -+Note that the current tag name can be displayed only after the file is -+processed by the taglist plugin. For this, you have to either set the -+'Tlist_Process_File_Always' variable to 1 or open the taglist window or use -+the taglist menu. For more information about configuring the Vim status line, -+refer to the documentation for the Vim |'statusline'| option. -+ -+Changing the taglist window highlighting~ -+The following Vim 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 -+ 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, -+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 MyTagListTagName guifg=blue ctermfg=blue -+< -+Controlling the taglist window~ -+To use a horizontally split taglist window, instead of a vertically split -+window, set the 'Tlist_Use_Horiz_Window' variable to 1. -+ -+To use a vertically split taglist window on the rightmost side of the Vim -+window, set the 'Tlist_Use_Right_Window' variable to 1. -+ -+You can specify the width of the vertically split taglist window, by setting -+the 'Tlist_WinWidth' variable. You can specify the height of the horizontally -+split taglist window, by setting the 'Tlist_WinHeight' variable. -+ -+When opening a vertically split taglist window, the Vim window width is -+increased to accommodate the new taglist window. When the taglist window is -+closed, the Vim window is reduced. To disable this, set the -+'Tlist_Inc_Winwidth' variable to zero. -+ -+To reduce the number of empty lines in the taglist window, set the -+'Tlist_Compact_Format' variable to 1. -+ -+To not display the Vim fold column in the taglist window, set the -+'Tlist_Enable_Fold_Column' variable to zero. -+ -+To display the tag prototypes instead of the tag names in the taglist window, -+set the 'Tlist_Display_Prototype' variable to 1. -+ -+To not display the scope of the tags next to the tag names, set the -+'Tlist_Display_Tag_Scope' variable to zero. -+ -+ *taglist-keys* -+Taglist window key list~ -+The following table lists the description of the keys that can be used -+in the taglist window. -+ -+ Key Description~ -+ -+ Jump to the location where the tag under cursor is -+ 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 -+ tag type and the number of tags. -+ u Update the tags listed in the taglist window -+ s Change the sort order of the tags (by name or by order) -+ d Remove the tags for the file under the cursor -+ x Zoom-in or Zoom-out the taglist window -+ + Open a fold -+ - Close a fold -+ * Open all folds -+ = Close all folds -+ [[ Jump to the beginning of the previous file -+ Jump to the beginning of the previous file -+ ]] Jump to the beginning of the next file -+ Jump to the beginning of the next file -+ q Close the taglist window -+ Display help -+ -+The above keys will work in both the normal mode and the insert mode. -+ -+ *taglist-menu* -+Taglist menu~ -+When using GUI Vim, the taglist plugin can display the tags defined in the -+current file in the drop-down menu and the popup menu. By default, this -+feature is turned off. To turn on this feature, set the 'Tlist_Show_Menu' -+variable to 1. -+ -+You can jump to a tag by selecting the tag name from the menu. You can use the -+taglist menu independent of the taglist window i.e. you don't need to open the -+taglist window to get the taglist menu. -+ -+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. 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 -+multiple submenus. The default setting for 'Tlist_Max_Submenu_Items' is 25. -+The first and last tag names in the submenu are used to form the submenu name. -+The menu items are prefixed by alpha-numeric characters for easy selection by -+keyboard. -+ -+If the popup menu support is enabled (the |'mousemodel'| option contains -+"popup"), then the tags menu is added to the popup menu. You can access -+the popup menu by right clicking on the GUI window. -+ -+You can regenerate the tags menu by selecting the 'Tags->Refresh menu' entry. -+You can sort the tags listed in the menu either by name or by order by -+selecting the 'Tags->Sort menu by->Name/Order' menu entry. -+ -+You can tear-off the Tags menu and keep it on the side of the Vim window -+for quickly locating the tags. -+ -+Using the taglist plugin with the winmanager plugin~ -+You can use the taglist plugin with the winmanager plugin. This will allow you -+to use the file explorer, buffer explorer and the taglist plugin at the same -+time in different windows. To use the taglist plugin with the winmanager -+plugin, set 'TagList' in the 'winManagerWindowLayout' variable. For example, -+to use the file explorer plugin and the taglist plugin at the same time, use -+the following setting: > -+ -+ let winManagerWindowLayout = 'FileExplorer|TagList' -+< -+Getting help~ -+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, -+the help information is removed from the taglist window. -+ -+ *taglist-debug* -+Debugging the taglist plugin~ -+You can use the ":TlistDebug" command to enable logging of the debug messages -+from the taglist plugin. To display the logged debug messages, you can use the -+":TlistMessages" command. To disable the logging of the debug messages, use -+the ":TlistUndebug" command. -+ -+You can specify a file name to the ":TlistDebug" command to log the debug -+messages to a file. Otherwise, the debug messages are stored in a script-local -+variable. In the later case, to minimize memory usage, only the last 3000 -+characters from the debug messages are stored. -+ -+============================================================================== -+ *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 -+can change the behavior of the taglist plugin. You need to change these -+settings only if you want to change the behavior of the taglist plugin. You -+should use the |:let| command in your .vimrc file to change the setting of any -+of these variables. -+ -+The configurable taglist variables are listed below. For a detailed -+description of these variables refer to the text below this table. -+ -+|'Tlist_Auto_Highlight_Tag'| Automatically highlight the current tag in the -+ taglist. -+|'Tlist_Auto_Open'| Open the taglist window when Vim starts. -+|'Tlist_Auto_Update'| Automatically update the taglist to include -+ newly edited files. -+|'Tlist_Close_On_Select'| Close the taglist window when a file or tag is -+ selected. -+|'Tlist_Compact_Format'| Remove extra information and blank lines from -+ the taglist window. -+|'Tlist_Ctags_Cmd'| Specifies the path to the ctags utility. -+|'Tlist_Display_Prototype'| Show prototypes and not tags in the taglist -+ window. -+|'Tlist_Display_Tag_Scope'| Show tag scope next to the tag name. -+|'Tlist_Enable_Fold_Column'| Show the fold indicator column in the taglist -+ 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. -+|'Tlist_Inc_Winwidth'| Increase the Vim window width to accommodate -+ the taglist window. -+|'Tlist_Max_Submenu_Items'| Maximum number of items in a tags sub-menu. -+|'Tlist_Max_Tag_Length'| Maximum tag length used in a tag menu entry. -+|'Tlist_Process_File_Always'| Process files even when the taglist window is -+ closed. -+|'Tlist_Show_Menu'| Display the tags menu. -+|'Tlist_Show_One_File'| Show tags for the current buffer only. -+|'Tlist_Sort_Type'| Sort method used for arranging the tags. -+|'Tlist_Use_Horiz_Window'| Use a horizontally split window for the -+ taglist window. -+|'Tlist_Use_Right_Window'| Place the taglist window on the right side. -+|'Tlist_Use_SingleClick'| Single click on a tag jumps to it. -+|'Tlist_WinHeight'| Horizontally split taglist window height. -+|'Tlist_WinWidth'| Vertically split taglist window width. -+ -+ *'Tlist_Auto_Highlight_Tag'* -+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 -+tag highlighting is disabled, the tags for a new file will still be added to -+the taglist window. -+> -+ let Tlist_Auto_Highlight_Tag = 0 -+< -+With the above variable set to 1, you can use the ":TlistHighlightTag" command -+to highlight the current tag. -+ -+ *'Tlist_Auto_Open'* -+Tlist_Auto_Open~ -+To automatically open the taglist window, when you start Vim, you can set the -+'Tlist_Auto_Open' variable to 1. By default, this variable is set to zero and -+the taglist window will not be opened automatically on Vim startup. -+> -+ let Tlist_Auto_Open = 1 -+< -+The taglist window is opened only when a supported type of file is opened on -+Vim startup. For example, if you open text files, then the taglist window will -+not be opened. -+ -+ *'Tlist_Auto_Update'* -+Tlist_Auto_Update~ -+When a new file is edited, the tags defined in the file are automatically -+processed and added to the taglist. To stop adding new files to the taglist, -+set the 'Tlist_Auto_Update' variable to zero. By default, this variable is set -+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 -+is not closed. -+> -+ let Tlist_Close_On_Select = 1 -+< -+ *'Tlist_Compact_Format'* -+Tlist_Compact_Format~ -+By default, empty lines are used to separate different tag types displayed for -+a file and the tags displayed for different files in the taglist window. If -+you want to display as many tags as possible in the taglist window, you can -+set the 'Tlist_Compact_Format' variable to 1 to get a compact display. -+> -+ let Tlist_Compact_Format = 1 -+< -+ *'Tlist_Ctags_Cmd'* -+Tlist_Ctags_Cmd~ -+The 'Tlist_Ctags_Cmd' variable specifies the location (path) of the exuberant -+ctags utility. If exuberant ctags is present in any one of the directories in -+the PATH environment variable, then there is no need to set this variable. -+ -+The exuberant ctags tool can be installed under different names. When the -+taglist plugin starts up, if the 'Tlist_Ctags_Cmd' variable is not set, it -+checks for the names exuberant-ctags, exctags, ctags, ctags.exe and tags in -+the PATH environment variable. If any one of the named executable is found, -+then the Tlist_Ctags_Cmd variable is set to that name. -+ -+If exuberant ctags is not present in one of the directories specified in the -+PATH environment variable, then set this variable to point to the location of -+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. Examples: -+> -+ let Tlist_Ctags_Cmd = 'd:\tools\ctags.exe' -+ let Tlist_Ctags_Cmd = '/usr/local/bin/ctags' -+< -+ *'Tlist_Display_Prototype'* -+Tlist_Display_Prototype~ -+By default, only the tag name will be displayed in the taglist window. If you -+like to see tag prototypes instead of names, set the 'Tlist_Display_Prototype' -+variable to 1. By default, this variable is set to zero and only tag names -+will be displayed. -+> -+ let Tlist_Display_Prototype = 1 -+< -+ *'Tlist_Display_Tag_Scope'* -+Tlist_Display_Tag_Scope~ -+By default, the scope of a tag (like a C++ class) will be displayed in -+square brackets next to the tag name. If you don't want the tag scopes -+to be displayed, then set the 'Tlist_Display_Tag_Scope' to zero. By default, -+this variable is set to 1 and the tag scopes will be displayed. -+> -+ let Tlist_Display_Tag_Scope = 0 -+< -+ *'Tlist_Enable_Fold_Column'* -+Tlist_Enable_Fold_Column~ -+By default, the Vim fold column is enabled and displayed in the taglist -+window. If you wish to disable this (for example, when you are working with a -+narrow Vim window or terminal), you can set the 'Tlist_Enable_Fold_Column' -+variable to zero. -+> -+ let Tlist_Enable_Fold_Column = 1 -+< -+ *'Tlist_Exit_OnlyWindow'* -+Tlist_Exit_OnlyWindow~ -+If you want to exit Vim if only the taglist window is currently opened, then -+set the 'Tlist_Exit_OnlyWindow' variable to 1. By default, this variable is -+set to zero and the Vim instance will not be closed if only the taglist window -+is present. -+> -+ let Tlist_Exit_OnlyWindow = 1 -+< -+ *'Tlist_File_Fold_Auto_Close'* -+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 -+other buffers is closed. -+> -+ 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~ -+When you enter a Vim buffer/window, the current tag in that buffer/window is -+automatically highlighted in the taglist window. If the current tag name is -+not visible in the taglist window, then the taglist window contents are -+scrolled to make that tag name visible. If you like to disable the automatic -+highlighting of the current tag when entering a buffer, you can set the -+'Tlist_Highlight_Tag_On_BufEnter' variable to zero. The default setting for -+this variable is 1. -+> -+ let Tlist_Highlight_Tag_On_BufEnter = 0 -+< -+ *'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 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 -+the screen due to the change in the window width or if you prefer not to -+adjust the window width then set the 'Tlist_Inc_Winwidth' variable to zero. -+CAUTION: If you are using the MS-Windows version of Vim in a MS-DOS command -+window then you must set this variable to zero, otherwise the system may hang -+due to a Vim limitation (explained in :help win32-problems) -+> -+ let Tlist_Inc_Winwidth = 0 -+< -+ *'Tlist_Max_Submenu_Items'* -+Tlist_Max_Submenu_Items~ -+If a file contains too many tags of a particular type (function, variable, -+class, etc.), greater than that specified by the 'Tlist_Max_Submenu_Items' -+variable, then the menu for that tag type will be split into multiple -+sub-menus. The default setting for the 'Tlist_Max_Submenu_Items' variable is -+25. This can be changed by setting the 'Tlist_Max_Submenu_Items' variable: -+> -+ let Tlist_Max_Submenu_Items = 20 -+< -+The name of the submenu is formed using the names of the first and the last -+tag entries in that submenu. -+ -+ *'Tlist_Max_Tag_Length'* -+Tlist_Max_Tag_Length~ -+Only the first 'Tlist_Max_Tag_Length' characters from the tag names will be -+used to form the tag type submenu name. The default value for this variable is -+10. Change the 'Tlist_Max_Tag_Length' setting if you want to include more or -+less characters: -+> -+ let Tlist_Max_Tag_Length = 10 -+< -+ *'Tlist_Process_File_Always'* -+Tlist_Process_File_Always~ -+By default, the taglist plugin will generate and process the tags defined in -+the newly opened files only when the taglist window is opened or when the -+taglist menu is enabled. When the taglist window is closed, the taglist plugin -+will stop processing the tags for newly opened files. -+ -+You can set the 'Tlist_Process_File_Always' variable to 1 to generate the list -+of tags for new files even when the taglist window is closed and the taglist -+menu is disabled. -+> -+ let Tlist_Process_File_Always = 1 -+< -+To use the ":TlistShowTag" and the ":TlistShowPrototype" commands without the -+taglist window and the taglist menu, you should set this variable to 1. -+ -+ *'Tlist_Show_Menu'* -+Tlist_Show_Menu~ -+When using GUI Vim, you can display the tags defined in the current file in a -+menu named "Tags". By default, this feature is turned off. To turn on this -+feature, set the 'Tlist_Show_Menu' variable to 1: -+> -+ let Tlist_Show_Menu = 1 -+< -+ *'Tlist_Show_One_File'* -+Tlist_Show_One_File~ -+By default, the taglist plugin will display the tags defined in all the loaded -+buffers in the taglist window. If you prefer to display the tags defined only -+in the current buffer, then you can set the 'Tlist_Show_One_File' to 1. When -+this variable is set to 1, as you switch between buffers, the taglist window -+will be refreshed to display the tags for the current buffer and the tags for -+the previous buffer will be removed. -+> -+ let Tlist_Show_One_File = 1 -+< -+ *'Tlist_Sort_Type'* -+Tlist_Sort_Type~ -+The 'Tlist_Sort_Type' variable specifies the sort order for the tags in the -+taglist window. The tags can be sorted either alphabetically by their name or -+by the order of their appearance in the file (chronological order). By -+default, the tag names will be listed by the order in which they are defined -+in the file. You can change the sort type (from name to order or from order to -+name) by pressing the "s" key in the taglist window. You can also change the -+default sort order by setting 'Tlist_Sort_Type' to "name" or "order": -+> -+ let Tlist_Sort_Type = "name" -+< -+ *'Tlist_Use_Horiz_Window'* -+Tlist_Use_Horiz_Window~ -+Be default, the tag names are displayed in a vertically split window. If you -+prefer a horizontally split window, then set the 'Tlist_Use_Horiz_Window' -+variable to 1. If you are running MS-Windows version of Vim in a MS-DOS -+command window, then you should use a horizontally split window instead of a -+vertically split window. Also, if you are using an older version of xterm in a -+Unix system that doesn't support changing the xterm window width, you should -+use a horizontally split window. -+> -+ let Tlist_Use_Horiz_Window = 1 -+< -+ *'Tlist_Use_Right_Window'* -+Tlist_Use_Right_Window~ -+By default, the vertically split taglist window will appear on the left hand -+side. If you prefer to open the window on the right hand side, you can set the -+'Tlist_Use_Right_Window' variable to 1: -+> -+ let Tlist_Use_Right_Window = 1 -+< -+ *'Tlist_Use_SingleClick'* -+Tlist_Use_SingleClick~ -+By default, when you double click on the tag name using the left mouse -+button, the cursor will be positioned at the definition of the tag. You -+can set the 'Tlist_Use_SingleClick' variable to 1 to jump to a tag when -+you single click on the tag name using the mouse. By default this variable -+is set to zero. -+> -+ let Tlist_Use_SingleClick = 1 -+< -+Due to a bug in Vim, if you set 'Tlist_Use_SingleClick' to 1 and try to resize -+the taglist window using the mouse, then Vim will crash. This problem is fixed -+in Vim 6.3 and above. In the meantime, instead of resizing the taglist window -+using the mouse, you can use normal Vim window resizing commands to resize the -+taglist window. -+ -+ *'Tlist_WinHeight'* -+Tlist_WinHeight~ -+The default height of the horizontally split taglist window is 10. This can be -+changed by modifying the 'Tlist_WinHeight' variable: -+> -+ let Tlist_WinHeight = 20 -+< -+The |'winfixheight'| option is set for the taglist window, to maintain the -+height of the taglist window, when new Vim windows are opened and existing -+windows are closed. -+ -+ *'Tlist_WinWidth'* -+Tlist_WinWidth~ -+The default width of the vertically split taglist window is 30. This can be -+changed by modifying the 'Tlist_WinWidth' variable: -+> -+ let Tlist_WinWidth = 20 -+< -+Note that the value of the |'winwidth'| option setting determines the minimum -+width of the current window. If you set the 'Tlist_WinWidth' variable to a -+value less than that of the |'winwidth'| option setting, then Vim will use the -+value of the |'winwidth'| option. -+ -+When new Vim windows are opened and existing windows are closed, the taglist -+plugin will try to maintain the width of the taglist window to the size -+specified by the 'Tlist_WinWidth' variable. -+ -+============================================================================== -+ *taglist-commands* -+7. Commands~ -+ -+The taglist plugin provides the following ex-mode commands: -+ -+|:TlistAddFiles| Add multiple files to the taglist. -+|:TlistAddFilesRecursive| -+ Add files recursively to the taglist. -+|:TlistClose| Close the taglist window. -+|:TlistDebug| Start logging of taglist debug messages. -+|:TlistLock| Stop adding new files to the taglist. -+|:TlistMessages| Display the logged taglist plugin debug messages. -+|:TlistOpen| Open and jump to the taglist window. -+|:TlistSessionSave| Save the information about files and tags in the -+ taglist to a session file. -+|:TlistSessionLoad| Load the information about files and tags stored -+ in a session file to taglist. -+|:TlistShowPrototype| Display the prototype of the tag at or before the -+ specified line number. -+|:TlistShowTag| Display the name of the tag defined at or before the -+ specified line number. -+|:TlistHighlightTag| Highlight the current tag in the taglist window. -+|:TlistToggle| Open or close (toggle) the taglist window. -+|:TlistUndebug| Stop logging of taglist debug messages. -+|:TlistUnlock| Start adding new files to the taglist. -+|:TlistUpdate| Update the tags for the current buffer. -+ -+ *:TlistAddFiles* -+:TlistAddFiles {file(s)} [file(s) ...] -+ Add one or more specified files to the taglist. You can -+ specify multiple filenames using wildcards. To specify a -+ file name with space character, you should escape the space -+ character with a backslash. -+ Examples: -+> -+ :TlistAddFiles *.c *.cpp -+ :TlistAddFiles file1.html file2.html -+< -+ If you specify a large number of files, then it will take some -+ time for the taglist plugin to process all of them. The -+ specified files will not be edited in a Vim window and will -+ not be added to the Vim buffer list. -+ -+ *:TlistAddFilesRecursive* -+:TlistAddFilesRecursive {directory} [ {pattern} ] -+ Add files matching {pattern} recursively from the specified -+ {directory} to the taglist. If {pattern} is not specified, -+ then '*' is assumed. To specify the current directory, use "." -+ for {directory}. To specify a directory name with space -+ character, you should escape the space character with a -+ backslash. -+ Examples: -+> -+ :TlistAddFilesRecursive myproject *.java -+ :TlistAddFilesRecursive smallproject -+< -+ If large number of files are present in the specified -+ directory tree, then it will take some time for the taglist -+ plugin to process all of them. -+ -+ *:TlistClose* -+:TlistClose Close the taglist window. This command can be used from any -+ one of the Vim windows. -+ -+ *:TlistDebug* -+:TlistDebug [filename] -+ Start logging of debug messages from the taglist plugin. -+ If {filename} is specified, then the debug messages are stored -+ in the specified file. Otherwise, the debug messages are -+ stored in a script local variable. If the file {filename} is -+ already present, then it is overwritten. -+ -+ *:TlistLock* -+:TlistLock -+ Lock the taglist and don't process new files. After this -+ command is executed, newly edited files will not be added to -+ the taglist. -+ -+ *:TlistMessages* -+:TlistMessages -+ Display the logged debug messages from the taglist plugin -+ in a window. This command works only when logging to a -+ script-local variable. -+ -+ *:TlistOpen* -+:TlistOpen Open and jump to the taglist window. Creates the taglist -+ window, if the window is not opened currently. After executing -+ this command, the cursor is moved to the taglist window. When -+ the taglist window is opened for the first time, all the files -+ in the buffer list are processed and the tags defined in them -+ are displayed in the taglist window. -+ -+ *:TlistSessionSave* -+:TlistSessionSave {filename} -+ Saves the information about files and tags in the taglist to -+ the specified file. This command can be used to save and -+ restore the taglist contents across Vim sessions. -+ -+ *:TlistSessionLoad* -+:TlistSessionLoad {filename} -+ Load the information about files and tags stored in the -+ specified session file to the taglist. -+ -+ *:TlistShowPrototype* -+:TlistShowPrototype [filename] [linenumber] -+ Display the prototype of the tag at or before the specified -+ line number. If the file name and the line number are not -+ specified, then the current file name and line number are -+ used. A tag spans multiple lines starting from the line where -+ it is defined to the line before the next tag. This command -+ displays the prototype for the tag for any line number in this -+ range. -+ -+ *:TlistShowTag* -+:TlistShowTag [filename] [linenumber] -+ Display the name of the tag defined at or before the specified -+ line number. If the file name and the line number are not -+ specified, then the current file name and line number are -+ used. A tag spans multiple lines starting from the line where -+ it is defined to the line before the next tag. This command -+ displays the tag name for any line number in this range. -+ -+ *:TlistHighlightTag* -+:TlistHighlightTag -+ Highlight the current tag in the taglist window. By default, -+ the taglist plugin periodically updates the taglist window to -+ highlight the current tag. This command can be used to force -+ the taglist plugin to highlight the current tag. -+ -+ *:TlistToggle* -+:TlistToggle Open or close (toggle) the taglist window. Opens the taglist -+ window, if the window is not opened currently. Closes the -+ taglist window, if the taglist window is already opened. When -+ the taglist window is opened for the first time, all the files -+ in the buffer list are processed and the tags are displayed in -+ the taglist window. After executing this command, the cursor -+ is not moved from the current window to the taglist window. -+ -+ *:TlistUndebug* -+:TlistUndebug -+ Stop logging of debug messages from the taglist plugin. -+ -+ *:TlistUnlock* -+:TlistUnlock -+ Unlock the taglist and start processing newly edited files. -+ -+ *:TlistUpdate* -+:TlistUpdate Update the tags information for the current buffer. This -+ command can be used to re-process the current file/buffer and -+ get the tags information. As the taglist plugin uses the file -+ saved in the disk (instead of the file displayed in a Vim -+ buffer), you should save a modified buffer before you update -+ the taglist. Otherwise the listed tags will not include the -+ new tags created in the buffer. You can use this command even -+ when the taglist window is not opened. -+ -+============================================================================== -+ *taglist-functions* -+8. Global functions~ -+ -+The taglist plugin provides several global functions that can be used from -+other Vim plugins to interact with the taglist plugin. These functions are -+described below. -+ -+|Tlist_Update_File_Tags()| Update the tags for the specified file -+|Tlist_Get_Tag_Prototype_By_Line()| Return the prototype of the tag at or -+ before the specified line number in the -+ specified file. -+|Tlist_Get_Tagname_By_Line()| Return the name of the tag at or -+ before the specified line number in -+ the specified file. -+|Tlist_Set_App()| Set the name of the application -+ controlling the taglist window. -+ -+ *Tlist_Update_File_Tags()* -+Tlist_Update_File_Tags({filename}, {filetype}) -+ Update the tags for the file {filename}. The second argument -+ specifies the Vim filetype for the file. If the taglist plugin -+ has not processed the file previously, then the exuberant -+ ctags tool is invoked to generate the tags for the file. -+ -+ *Tlist_Get_Tag_Prototype_By_Line()* -+Tlist_Get_Tag_Prototype_By_Line([{filename}, {linenumber}]) -+ Return the prototype of the tag at or before the specified -+ line number in the specified file. If the filename and line -+ number are not specified, then the current buffer name and the -+ current line number are used. -+ -+ *Tlist_Get_Tagname_By_Line()* -+Tlist_Get_Tagname_By_Line([{filename}, {linenumber}]) -+ Return the name of the tag at or before the specified line -+ number in the specified file. If the filename and line number -+ are not specified, then the current buffer name and the -+ current line number are used. -+ -+ *Tlist_Set_App()* -+Tlist_Set_App({appname}) -+ Set the name of the plugin that controls the taglist plugin -+ window and buffer. This can be used to integrate the taglist -+ plugin with other Vim plugins. -+ -+ For example, the winmanager plugin and the Cream package use -+ this function and specify the appname as "winmanager" and -+ "cream" respectively. -+ -+ By default, the taglist plugin is a stand-alone plugin and -+ controls the taglist window and buffer. If the taglist window -+ is controlled by an external plugin, then the appname should -+ be set appropriately. -+ -+============================================================================== -+ *taglist-extend* -+9. Extending~ -+ -+The taglist plugin supports all the languages supported by the exuberant ctags -+tool, which includes the following languages: Assembly, ASP, Awk, Beta, C, -+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 extend the taglist plugin to add support for new languages and also -+modify the support for the above listed languages. -+ -+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 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 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 -+ -+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 -+ -+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 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. 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: -+ -+ 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 -+used for the class tags and 'function' is the title used for the function tags -+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. 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. -+ -+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): -+ -+ 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', -+'command' and 'label' will be used in the taglist window for the tags which -+are generated for the flags b, c and l respectively. -+ -+============================================================================== -+ *taglist-faq* -+10. Frequently Asked Questions~ -+ -+Q. The taglist plugin doesn't work. The taglist window is empty and the tags -+ defined in a file are not displayed. -+A. Are you using Vim version 6.0 and above? The taglist plugin relies on the -+ features supported by Vim version 6.0 and above. You can use the following -+ command to get the Vim version: -+> -+ $ vim --version -+< -+ Are you using exuberant ctags version 5.0 and above? The taglist plugin -+ relies on the features supported by exuberant ctags and will not work with -+ GNU ctags or the Unix ctags utility. You can use the following command to -+ determine whether the ctags installed in your system is exuberant ctags: -+> -+ $ 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: -+> -+ :filetype -+< -+ The output of the above command should contain "filetype detection:ON". -+ To turn on the filetype detection, add the following line to the .vimrc or -+ _vimrc file: -+> -+ filetype on -+< -+ Is your version of Vim compiled with the support for the system() function? -+ The following Vim command should display 1: -+> -+ :echo exists('*system') -+< -+ In some Linux distributions (particularly Suse Linux), the default Vim -+ installation is built without the support for the system() function. The -+ taglist plugin uses the system() function to invoke the exuberant ctags -+ utility. You need to rebuild Vim after enabling the support for the -+ system() function. If you use the default build options, the system() -+ function will be supported. -+ -+ Do you have the |'shellslash'| option set? You can try disabling the -+ |'shellslash'| option. When the taglist plugin invokes the exuberant ctags -+ utility with the path to the file, if the incorrect slashes are used, then -+ you will see errors. -+ -+ Check the shell related Vim options values using the following command: -+> -+ :set shell? shellcmdflag? shellpipe? -+ :set shellquote? shellredir? shellxquote? -+< -+ If these options are set in your .vimrc or _vimrc file, try removing those -+ lines. -+ -+ Are you using a Unix shell in a MS-Windows environment? For example, -+ the Unix shell from the MKS-toolkit. Do you have the SHELL environment -+ set to point to this shell? You can try resetting the SHELL environment -+ variable. -+ -+ If you are using a Unix shell on MS-Windows, you should try to use -+ exuberant ctags that is compiled for Unix-like environments so that -+ exuberant ctags will understand path names with forward slash characters. -+ -+ Is your filetype supported by the exuberant ctags utility? The file types -+ supported by the exuberant ctags utility are listed in the ctags help. If a -+ file type is not supported, you have to extend exuberant ctags. You can use -+ the following command to list the filetypes supported by exuberant ctags: -+> -+ ctags --list-languages -+< -+ Run the following command from the shell prompt and check whether the tags -+ defined in your file are listed in the output from exuberant ctags: -+> -+ ctags -f - --format=2 --excmd=pattern --fields=nks -+< -+ If you see your tags in the output from the above command, then the -+ exuberant ctags utility is properly parsing your file. -+ -+ Do you have the .ctags or _ctags or the ctags.cnf file in your home -+ directory for specifying default options or for extending exuberant ctags? -+ If you do have this file, check the options in this file and make sure -+ these options are not interfering with the operation of the taglist plugin. -+ -+ If you are using MS-Windows, check the value of the TEMP and TMP -+ environment variables. If these environment variables are set to a path -+ with space characters in the name, then try using the DOS 8.3 short name -+ for the path or set them to a path without the space characters in the -+ name. For example, if the temporary directory name is "C:\Documents and -+ Settings\xyz\Local Settings\Temp", then try setting the TEMP variable to -+ the following: -+> -+ set TEMP=C:\DOCUMEN~1\xyz\LOCALS~1\Temp -+< -+ If exuberant ctags is installed in a directory with space characters in the -+ name, then try adding the directory to the PATH environment variable or try -+ setting the 'Tlist_Ctags_Cmd' variable to the shortest path name to ctags -+ or try copying the exuberant ctags to a path without space characters in -+ the name. For example, if exuberant ctags is installed in the directory -+ "C:\Program Files\Ctags", then try setting the 'Tlist_Ctags_Cmd' variable -+ as below: -+> -+ let Tlist_Ctags_Cmd='C:\Progra~1\Ctags\ctags.exe' -+< -+Q. When I try to open the taglist window, I am seeing the following error -+ message. How do I fix this problem? -+ -+ Taglist: Failed to generate tags for /my/path/to/file -+ ctags: illegal option -- -^@usage: ctags [-BFadtuwvx] [-f tagsfile] file ... -+ -+A. The taglist plugin will work only with the exuberant ctags tool. You -+ cannot use the GNU ctags or the Unix ctags program with the taglist plugin. -+ You will see an error message similar to the one shown above, if you try -+ use a non-exuberant ctags program with Vim. To fix this problem, either add -+ the exuberant ctags tool location to the PATH environment variable or set -+ the 'Tlist_Ctags_Cmd' variable. -+ -+Q. A file has more than one tag with the same name. When I select a tag name -+ from the taglist window, the cursor is positioned at the incorrect tag -+ location. -+A. The taglist plugin uses the search pattern generated by the exuberant ctags -+ utility to position the cursor at the location of a tag definition. If a -+ file has more than one tag with the same name and same prototype, then the -+ search pattern will be the same. In this case, when searching for the tag -+ pattern, the cursor may be positioned at the incorrect location. -+ -+Q. I have made some modifications to my file and introduced new -+ functions/classes/variables. I have not yet saved my file. The taglist -+ plugin is not displaying the new tags when I update the taglist window. -+A. The exuberant ctags utility will process only files that are present in the -+ disk. To list the tags defined in a file, you have to save the file and -+ then update the taglist window. -+ -+Q. I have created a ctags file using the exuberant ctags utility for my source -+ tree. How do I configure the taglist plugin to use this tags file? -+A. The taglist plugin doesn't use a tags file stored in disk. For every opened -+ file, the taglist plugin invokes the exuberant ctags utility to get the -+ list of tags dynamically. The Vim system() function is used to invoke -+ exuberant ctags and get the ctags output. This function internally uses a -+ temporary file to store the output. This file is deleted after the output -+ from the command is read. So you will never see the file that contains the -+ output of exuberant ctags. -+ -+Q. When I set the |'updatetime'| option to a low value (less than 1000) and if -+ I keep pressing a key with the taglist window open, the current buffer -+ contents are changed. Why is this? -+A. The taglist plugin uses the |CursorHold| autocmd to highlight the current -+ tag. The CursorHold autocmd triggers for every |'updatetime'| milliseconds. -+ If the |'updatetime'| option is set to a low value, then the CursorHold -+ autocmd will be triggered frequently. As the taglist plugin changes -+ the focus to the taglist window to highlight the current tag, this could -+ interfere with the key movement resulting in changing the contents of -+ 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* -+12. Todo~ -+ -+1. Group tags according to the scope and display them. For example, -+ group all the tags belonging to a C++/Java class -+2. Support for displaying tags in a modified (not-yet-saved) file. -+3. Automatically open the taglist window only for selected filetypes. -+ For other filetypes, close the taglist window. -+4. When using the shell from the MKS toolkit, the taglist plugin -+ doesn't work. -+5. The taglist plugin doesn't work with files edited remotely using the -+ netrw plugin. The exuberant ctags utility cannot process files over -+ scp/rcp/ftp, etc. -+ -+============================================================================== -+ -+vim:tw=78:ts=8:noet:ft=help: -diff -urN vim71/1/ftdetect/ada.vim vim71_ada/1/ftdetect/ada.vim ---- vim71/1/ftdetect/ada.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftdetect/ada.vim 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,39 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada detection file -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftdetect/ada.vim $ -+" History: 24.05.2006 MK Unified Headers -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested to save on spaces -+" Help Page: ft-ada-plugin -+"------------------------------------------------------------------------------ -+ -+if exists("s:loaded_ftdetect_ada") -+ finish -+endif -+ -+let s:loaded_ftdetect_ada=45 -+ -+if has("vms") -+ autocmd BufNewFile,BufRead *.gpr,*.ada_m,*.adc setfiletype ada -+else -+ autocmd BufNewFile,BufRead *.gpr setfiletype ada -+endif -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/ftdetect/.svn/all-wcprops vim71_ada/1/ftdetect/.svn/all-wcprops ---- vim71/1/ftdetect/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftdetect/.svn/all-wcprops 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,11 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 53 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/ftdetect -+END -+ada.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 61 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/ftdetect/ada.vim -+END -diff -urN vim71/1/ftdetect/.svn/dir-prop-base vim71_ada/1/ftdetect/.svn/dir-prop-base ---- vim71/1/ftdetect/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftdetect/.svn/dir-prop-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,12 @@ -+K 10 -+svn:ignore -+V 52 -+*.Backup -+*.tgz -+*.tar.bz2 -+*.rpm -+*.swp -+*.log -+.backups -+ -+END -diff -urN vim71/1/ftdetect/.svn/entries vim71_ada/1/ftdetect/.svn/entries ---- vim71/1/ftdetect/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftdetect/.svn/entries 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,41 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftdetect -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -+ada.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:02.000000Z -+3cc0764c406db398377e8d9214445c63 -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -diff -urN vim71/1/ftdetect/.svn/format vim71_ada/1/ftdetect/.svn/format ---- vim71/1/ftdetect/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftdetect/.svn/format 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/ftdetect/.svn/prop-base/ada.vim.svn-base vim71_ada/1/ftdetect/.svn/prop-base/ada.vim.svn-base ---- vim71/1/ftdetect/.svn/prop-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftdetect/.svn/prop-base/ada.vim.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/ftdetect/.svn/text-base/ada.vim.svn-base vim71_ada/1/ftdetect/.svn/text-base/ada.vim.svn-base ---- vim71/1/ftdetect/.svn/text-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftdetect/.svn/text-base/ada.vim.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,39 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada detection file -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL$ -+" History: 24.05.2006 MK Unified Headers -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested to save on spaces -+" Help Page: ft-ada-plugin -+"------------------------------------------------------------------------------ -+ -+if exists("s:loaded_ftdetect_ada") -+ finish -+endif -+ -+let s:loaded_ftdetect_ada=45 -+ -+if has("vms") -+ autocmd BufNewFile,BufRead *.gpr,*.ada_m,*.adc setfiletype ada -+else -+ autocmd BufNewFile,BufRead *.gpr setfiletype ada -+endif -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/ftplugin/ada.vim vim71_ada/1/ftplugin/ada.vim ---- vim71/1/ftplugin/ada.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftplugin/ada.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,201 @@ -+"------------------------------------------------------------------------------ -+" Description: Perform Ada specific completion & tagging. -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Maintainer: Martin Krischik -+" Taylor Venable -+" Neil Bird -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ -+" History: 24.05.2006 MK Unified Headers -+" 26.05.2006 MK ' should not be in iskeyword. -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 02.10.2006 MK Better folding. -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested not to use include protection for -+" autoload -+" 05.11.2006 MK Bram suggested to save on spaces -+" 08.07.2007 TV fix default compiler problems. -+" Help Page: ft-ada-plugin -+"------------------------------------------------------------------------------ -+" Provides mapping overrides for tag jumping that figure out the current -+" Ada object and tag jump to that, not the 'simple' vim word. -+" Similarly allows matching of full-length ada entities from tags. -+"------------------------------------------------------------------------------ -+ -+" Only do this when not done yet for this buffer -+if exists ("b:did_ftplugin") || version < 700 -+ finish -+endif -+ -+" Don't load another plugin for this buffer -+let b:did_ftplugin = 45 -+ -+" -+" Temporarily set cpoptions to ensure the script loads OK -+" -+let s:cpoptions = &cpoptions -+set cpoptions-=C -+ -+" Section: Comments {{{1 -+" -+setlocal comments=O:--,:--\ \ -+setlocal commentstring=--\ \ %s -+setlocal complete=.,w,b,u,t,i -+ -+" Section: Tagging {{{1 -+" -+if exists ("g:ada_extended_tagging") -+ " Make local tag mappings for this buffer (if not already set) -+ if g:ada_extended_tagging == 'jump' -+ if mapcheck('','n') == '' -+ nnoremap :call ada#Jump_Tag ('', 'tjump') -+ endif -+ if mapcheck('g','n') == '' -+ nnoremap g :call ada#Jump_Tag ('','stjump') -+ endif -+ elseif g:ada_extended_tagging == 'list' -+ if mapcheck('','n') == '' -+ nnoremap :call ada#List_Tag () -+ endif -+ if mapcheck('g','n') == '' -+ nnoremap g :call ada#List_Tag () -+ endif -+ endif -+endif -+ -+" Section: Completion {{{1 -+" -+setlocal completefunc=ada#User_Complete -+setlocal omnifunc=adacomplete#Complete -+ -+if exists ("g:ada_extended_completion") -+ if mapcheck ('','i') == '' -+ inoremap =ada#Completion("\C-N>") -+ endif -+ if mapcheck ('','i') == '' -+ inoremap =ada#Completion("\C-P>") -+ endif -+ if mapcheck ('','i') == '' -+ inoremap =ada#Completion("\C-X>\C-]>") -+ endif -+ if mapcheck ('','i') == '' -+ inoremap =ada#Insert_Backspace () -+ endif -+endif -+ -+" Section: Matchit {{{1 -+" -+" Only do this when not done yet for this buffer & matchit is used -+" -+if !exists ("b:match_words") && -+ \ exists ("loaded_matchit") -+ " -+ " The following lines enable the macros/matchit.vim plugin for -+ " Ada-specific extended matching with the % key. -+ " -+ let s:notend = '\%(\:\:\:\\s\+\,' . -+ \ s:notend . '\:\:\\s\+\,' . -+ \ '\%(\.*\|\.*\|'.s:notend.'\)\:\\s\+\,' . -+ \ '\%(\\|\\):\:\\s*\%($\|[;A-Z]\),' . -+ \ s:notend . '\:\\s\+\' -+endif -+ -+ -+" Section: Compiler {{{1 -+" -+if ! exists("g:ada_default_compiler") -+ if has("vms") -+ let g:ada_default_compiler = 'decada' -+ else -+ let g:ada_default_compiler = 'gnat' -+ endif -+endif -+ -+if ! exists("current_compiler") || -+ \ current_compiler != g:ada_default_compiler -+ execute "compiler " . g:ada_default_compiler -+endif -+ -+" Section: Folding {{{1 -+" -+if exists("g:ada_folding") -+ if g:ada_folding[0] == 'i' -+ setlocal foldmethod=indent -+ setlocal foldignore=-- -+ setlocal foldnestmax=5 -+ elseif g:ada_folding[0] == 'g' -+ setlocal foldmethod=expr -+ setlocal foldexpr=ada#Pretty_Print_Folding(v:lnum) -+ elseif g:ada_folding[0] == 's' -+ setlocal foldmethod=syntax -+ endif -+ setlocal tabstop=8 -+ setlocal softtabstop=3 -+ setlocal shiftwidth=3 -+endif -+ -+" Section: Abbrev {{{1 -+" -+if exists("g:ada_abbrev") -+ iabbrev ret return -+ iabbrev proc procedure -+ iabbrev pack package -+ iabbrev func function -+endif -+ -+" Section: Commands, Mapping, Menus {{{1 -+" -+call ada#Map_Popup ( -+ \ 'Tag.List', -+ \ 'l', -+ \ 'call ada#List_Tag ()') -+call ada#Map_Popup ( -+ \'Tag.Jump', -+ \'j', -+ \'call ada#Jump_Tag ()') -+call ada#Map_Menu ( -+ \'Tag.Create File', -+ \':AdaTagFile', -+ \'call ada#Create_Tags (''file'')') -+call ada#Map_Menu ( -+ \'Tag.Create Dir', -+ \':AdaTagDir', -+ \'call ada#Create_Tags (''dir'')') -+ -+call ada#Map_Menu ( -+ \'Highlight.Toggle Space Errors', -+ \ ':AdaSpaces', -+ \'call ada#Switch_Syntax_Option (''space_errors'')') -+call ada#Map_Menu ( -+ \'Highlight.Toggle Lines Errors', -+ \ ':AdaLines', -+ \'call ada#Switch_Syntax_Option (''line_errors'')') -+call ada#Map_Menu ( -+ \'Highlight.Toggle Rainbow Color', -+ \ ':AdaRainbow', -+ \'call ada#Switch_Syntax_Option (''rainbow_color'')') -+call ada#Map_Menu ( -+ \'Highlight.Toggle Standard Types', -+ \ ':AdaTypes', -+ \'call ada#Switch_Syntax_Option (''standard_types'')') -+ -+" 1}}} -+" Reset cpoptions -+let &cpoptions = s:cpoptions -+unlet s:cpoptions -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/ftplugin/.svn/all-wcprops vim71_ada/1/ftplugin/.svn/all-wcprops ---- vim71/1/ftplugin/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftplugin/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,11 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 53 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/ftplugin -+END -+ada.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 61 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/ftplugin/ada.vim -+END -diff -urN vim71/1/ftplugin/.svn/dir-prop-base vim71_ada/1/ftplugin/.svn/dir-prop-base ---- vim71/1/ftplugin/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftplugin/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,6 @@ -+K 10 -+svn:ignore -+V 9 -+.backups -+ -+END -diff -urN vim71/1/ftplugin/.svn/entries vim71_ada/1/ftplugin/.svn/entries ---- vim71/1/ftplugin/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftplugin/.svn/entries 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,41 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -+ada.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+271552b843be34dd99efdb2e180aa4ec -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -diff -urN vim71/1/ftplugin/.svn/format vim71_ada/1/ftplugin/.svn/format ---- vim71/1/ftplugin/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftplugin/.svn/format 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/ftplugin/.svn/prop-base/ada.vim.svn-base vim71_ada/1/ftplugin/.svn/prop-base/ada.vim.svn-base ---- vim71/1/ftplugin/.svn/prop-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftplugin/.svn/prop-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/ftplugin/.svn/text-base/ada.vim.svn-base vim71_ada/1/ftplugin/.svn/text-base/ada.vim.svn-base ---- vim71/1/ftplugin/.svn/text-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/ftplugin/.svn/text-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,201 @@ -+"------------------------------------------------------------------------------ -+" Description: Perform Ada specific completion & tagging. -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Maintainer: Martin Krischik -+" Taylor Venable -+" Neil Bird -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL$ -+" History: 24.05.2006 MK Unified Headers -+" 26.05.2006 MK ' should not be in iskeyword. -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 02.10.2006 MK Better folding. -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested not to use include protection for -+" autoload -+" 05.11.2006 MK Bram suggested to save on spaces -+" 08.07.2007 TV fix default compiler problems. -+" Help Page: ft-ada-plugin -+"------------------------------------------------------------------------------ -+" Provides mapping overrides for tag jumping that figure out the current -+" Ada object and tag jump to that, not the 'simple' vim word. -+" Similarly allows matching of full-length ada entities from tags. -+"------------------------------------------------------------------------------ -+ -+" Only do this when not done yet for this buffer -+if exists ("b:did_ftplugin") || version < 700 -+ finish -+endif -+ -+" Don't load another plugin for this buffer -+let b:did_ftplugin = 45 -+ -+" -+" Temporarily set cpoptions to ensure the script loads OK -+" -+let s:cpoptions = &cpoptions -+set cpoptions-=C -+ -+" Section: Comments {{{1 -+" -+setlocal comments=O:--,:--\ \ -+setlocal commentstring=--\ \ %s -+setlocal complete=.,w,b,u,t,i -+ -+" Section: Tagging {{{1 -+" -+if exists ("g:ada_extended_tagging") -+ " Make local tag mappings for this buffer (if not already set) -+ if g:ada_extended_tagging == 'jump' -+ if mapcheck('','n') == '' -+ nnoremap :call ada#Jump_Tag ('', 'tjump') -+ endif -+ if mapcheck('g','n') == '' -+ nnoremap g :call ada#Jump_Tag ('','stjump') -+ endif -+ elseif g:ada_extended_tagging == 'list' -+ if mapcheck('','n') == '' -+ nnoremap :call ada#List_Tag () -+ endif -+ if mapcheck('g','n') == '' -+ nnoremap g :call ada#List_Tag () -+ endif -+ endif -+endif -+ -+" Section: Completion {{{1 -+" -+setlocal completefunc=ada#User_Complete -+setlocal omnifunc=adacomplete#Complete -+ -+if exists ("g:ada_extended_completion") -+ if mapcheck ('','i') == '' -+ inoremap =ada#Completion("\C-N>") -+ endif -+ if mapcheck ('','i') == '' -+ inoremap =ada#Completion("\C-P>") -+ endif -+ if mapcheck ('','i') == '' -+ inoremap =ada#Completion("\C-X>\C-]>") -+ endif -+ if mapcheck ('','i') == '' -+ inoremap =ada#Insert_Backspace () -+ endif -+endif -+ -+" Section: Matchit {{{1 -+" -+" Only do this when not done yet for this buffer & matchit is used -+" -+if !exists ("b:match_words") && -+ \ exists ("loaded_matchit") -+ " -+ " The following lines enable the macros/matchit.vim plugin for -+ " Ada-specific extended matching with the % key. -+ " -+ let s:notend = '\%(\:\:\:\\s\+\,' . -+ \ s:notend . '\:\:\\s\+\,' . -+ \ '\%(\.*\|\.*\|'.s:notend.'\)\:\\s\+\,' . -+ \ '\%(\\|\\):\:\\s*\%($\|[;A-Z]\),' . -+ \ s:notend . '\:\\s\+\' -+endif -+ -+ -+" Section: Compiler {{{1 -+" -+if ! exists("g:ada_default_compiler") -+ if has("vms") -+ let g:ada_default_compiler = 'decada' -+ else -+ let g:ada_default_compiler = 'gnat' -+ endif -+endif -+ -+if ! exists("current_compiler") || -+ \ current_compiler != g:ada_default_compiler -+ execute "compiler " . g:ada_default_compiler -+endif -+ -+" Section: Folding {{{1 -+" -+if exists("g:ada_folding") -+ if g:ada_folding[0] == 'i' -+ setlocal foldmethod=indent -+ setlocal foldignore=-- -+ setlocal foldnestmax=5 -+ elseif g:ada_folding[0] == 'g' -+ setlocal foldmethod=expr -+ setlocal foldexpr=ada#Pretty_Print_Folding(v:lnum) -+ elseif g:ada_folding[0] == 's' -+ setlocal foldmethod=syntax -+ endif -+ setlocal tabstop=8 -+ setlocal softtabstop=3 -+ setlocal shiftwidth=3 -+endif -+ -+" Section: Abbrev {{{1 -+" -+if exists("g:ada_abbrev") -+ iabbrev ret return -+ iabbrev proc procedure -+ iabbrev pack package -+ iabbrev func function -+endif -+ -+" Section: Commands, Mapping, Menus {{{1 -+" -+call ada#Map_Popup ( -+ \ 'Tag.List', -+ \ 'l', -+ \ 'call ada#List_Tag ()') -+call ada#Map_Popup ( -+ \'Tag.Jump', -+ \'j', -+ \'call ada#Jump_Tag ()') -+call ada#Map_Menu ( -+ \'Tag.Create File', -+ \':AdaTagFile', -+ \'call ada#Create_Tags (''file'')') -+call ada#Map_Menu ( -+ \'Tag.Create Dir', -+ \':AdaTagDir', -+ \'call ada#Create_Tags (''dir'')') -+ -+call ada#Map_Menu ( -+ \'Highlight.Toggle Space Errors', -+ \ ':AdaSpaces', -+ \'call ada#Switch_Syntax_Option (''space_errors'')') -+call ada#Map_Menu ( -+ \'Highlight.Toggle Lines Errors', -+ \ ':AdaLines', -+ \'call ada#Switch_Syntax_Option (''line_errors'')') -+call ada#Map_Menu ( -+ \'Highlight.Toggle Rainbow Color', -+ \ ':AdaRainbow', -+ \'call ada#Switch_Syntax_Option (''rainbow_color'')') -+call ada#Map_Menu ( -+ \'Highlight.Toggle Standard Types', -+ \ ':AdaTypes', -+ \'call ada#Switch_Syntax_Option (''standard_types'')') -+ -+" 1}}} -+" Reset cpoptions -+let &cpoptions = s:cpoptions -+unlet s:cpoptions -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/indent/ada.vim vim71_ada/1/indent/ada.vim ---- vim71/1/indent/ada.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/indent/ada.vim 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,303 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada indent file -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" Neil Bird -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ -+" History: 24.05.2006 MK Unified Headers -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested to save on spaces -+" 19.09.2007 NO g: missing before ada#Comment -+" Help Page: ft-vim-indent -+"------------------------------------------------------------------------------ -+" ToDo: -+" Verify handling of multi-line exprs. and recovery upon the final ';'. -+" Correctly find comments given '"' and "" ==> " syntax. -+" Combine the two large block-indent functions into one? -+"------------------------------------------------------------------------------ -+ -+" Only load this indent file when no other was loaded. -+if exists("b:did_indent") || version < 700 -+ finish -+endif -+ -+let b:did_indent = 45 -+ -+setlocal indentexpr=GetAdaIndent() -+setlocal indentkeys-=0{,0} -+setlocal indentkeys+=0=~then,0=~end,0=~elsif,0=~when,0=~exception,0=~begin,0=~is,0=~record -+ -+" Only define the functions once. -+if exists("*GetAdaIndent") -+ finish -+endif -+ -+if exists("g:ada_with_gnat_project_files") -+ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\[^;]*$\|\(type\>.*\)\=\\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|project\>\|then\>\|when\>\|is\>\)' -+else -+ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\[^;]*$\|\(type\>.*\)\=\\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|then\>\|when\>\|is\>\)' -+endif -+ -+" Section: s:MainBlockIndent {{{1 -+" -+" Try to find indent of the block we're in -+" prev_indent = the previous line's indent -+" prev_lnum = previous line (to start looking on) -+" blockstart = expr. that indicates a possible start of this block -+" stop_at = if non-null, if a matching line is found, gives up! -+" No recursive previous block analysis: simply look for a valid line -+" with a lesser or equal indent than we currently (on prev_lnum) have. -+" This shouldn't work as well as it appears to with lines that are currently -+" nowhere near the correct indent (e.g., start of line)! -+" Seems to work OK as it 'starts' with the indent of the /previous/ line. -+function s:MainBlockIndent (prev_indent, prev_lnum, blockstart, stop_at) -+ let lnum = a:prev_lnum -+ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) -+ while lnum > 1 -+ if a:stop_at != '' && line =~ '^\s*' . a:stop_at && indent(lnum) < a:prev_indent -+ return a:prev_indent -+ elseif line =~ '^\s*' . a:blockstart -+ let ind = indent(lnum) -+ if ind < a:prev_indent -+ return ind -+ endif -+ endif -+ -+ let lnum = prevnonblank(lnum - 1) -+ " Get previous non-blank/non-comment-only line -+ while 1 -+ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) -+ if line !~ '^\s*$' && line !~ '^\s*#' -+ break -+ endif -+ let lnum = prevnonblank(lnum - 1) -+ if lnum <= 0 -+ return a:prev_indent -+ endif -+ endwhile -+ endwhile -+ " Fallback - just move back one -+ return a:prev_indent - &sw -+endfunction MainBlockIndent -+ -+" Section: s:EndBlockIndent {{{1 -+" -+" Try to find indent of the block we're in (and about to complete), -+" including handling of nested blocks. Works on the 'end' of a block. -+" prev_indent = the previous line's indent -+" prev_lnum = previous line (to start looking on) -+" blockstart = expr. that indicates a possible start of this block -+" blockend = expr. that indicates a possible end of this block -+function s:EndBlockIndent( prev_indent, prev_lnum, blockstart, blockend ) -+ let lnum = a:prev_lnum -+ let line = getline(lnum) -+ let ends = 0 -+ while lnum > 1 -+ if getline(lnum) =~ '^\s*' . a:blockstart -+ let ind = indent(lnum) -+ if ends <= 0 -+ if ind < a:prev_indent -+ return ind -+ endif -+ else -+ let ends = ends - 1 -+ endif -+ elseif getline(lnum) =~ '^\s*' . a:blockend -+ let ends = ends + 1 -+ endif -+ -+ let lnum = prevnonblank(lnum - 1) -+ " Get previous non-blank/non-comment-only line -+ while 1 -+ let line = getline(lnum) -+ let line = substitute( line, g:ada#Comment, '', '' ) -+ if line !~ '^\s*$' -+ break -+ endif -+ let lnum = prevnonblank(lnum - 1) -+ if lnum <= 0 -+ return a:prev_indent -+ endif -+ endwhile -+ endwhile -+ " Fallback - just move back one -+ return a:prev_indent - &sw -+endfunction EndBlockIndent -+ -+" Section: s:StatementIndent {{{1 -+" -+" Return indent of previous statement-start -+" (after we've indented due to multi-line statements). -+" This time, we start searching on the line *before* the one given (which is -+" the end of a statement - we want the previous beginning). -+function s:StatementIndent( current_indent, prev_lnum ) -+ let lnum = a:prev_lnum -+ while lnum > 0 -+ let prev_lnum = lnum -+ let lnum = prevnonblank(lnum - 1) -+ " Get previous non-blank/non-comment-only line -+ while 1 -+ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) -+ -+ if line !~ '^\s*$' && line !~ '^\s*#' -+ break -+ endif -+ let lnum = prevnonblank(lnum - 1) -+ if lnum <= 0 -+ return a:current_indent -+ endif -+ endwhile -+ " Leave indent alone if our ';' line is part of a ';'-delineated -+ " aggregate (e.g., procedure args.) or first line after a block start. -+ if line =~ s:AdaBlockStart || line =~ '(\s*$' -+ return a:current_indent -+ endif -+ if line !~ '[.=(]\s*$' -+ let ind = indent(prev_lnum) -+ if ind < a:current_indent -+ return ind -+ endif -+ endif -+ endwhile -+ " Fallback - just use current one -+ return a:current_indent -+endfunction StatementIndent -+ -+ -+" Section: GetAdaIndent {{{1 -+" -+" Find correct indent of a new line based upon what went before -+" -+function GetAdaIndent() -+ " Find a non-blank line above the current line. -+ let lnum = prevnonblank(v:lnum - 1) -+ let ind = indent(lnum) -+ let package_line = 0 -+ -+ " Get previous non-blank/non-comment-only/non-cpp line -+ while 1 -+ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) -+ if line !~ '^\s*$' && line !~ '^\s*#' -+ break -+ endif -+ let lnum = prevnonblank(lnum - 1) -+ if lnum <= 0 -+ return ind -+ endif -+ endwhile -+ -+ " Get default indent (from prev. line) -+ let ind = indent(lnum) -+ let initind = ind -+ -+ " Now check what's on the previous line -+ if line =~ s:AdaBlockStart || line =~ '(\s*$' -+ " Check for false matches to AdaBlockStart -+ let false_match = 0 -+ if line =~ '^\s*\(procedure\|function\|package\)\>.*\' -+ " Generic instantiation -+ let false_match = 1 -+ elseif line =~ ')\s*;\s*$' || line =~ '^\([^(]*([^)]*)\)*[^(]*;\s*$' -+ " forward declaration -+ let false_match = 1 -+ endif -+ " Move indent in -+ if ! false_match -+ let ind = ind + &sw -+ endif -+ elseif line =~ '^\s*\(case\|exception\)\>' -+ " Move indent in twice (next 'when' will move back) -+ let ind = ind + 2 * &sw -+ elseif line =~ '^\s*end\s*record\>' -+ " Move indent back to tallying 'type' preceeding the 'record'. -+ " Allow indent to be equal to 'end record's. -+ let ind = s:MainBlockIndent( ind+&sw, lnum, 'type\>', '' ) -+ elseif line =~ '\(^\s*new\>.*\)\@' -+ " Multiple line generic instantiation ('package blah is\nnew thingy') -+ let ind = s:StatementIndent( ind - &sw, lnum ) -+ elseif line =~ ';\s*$' -+ " Statement end (but not 'end' ) - try to find current statement-start indent -+ let ind = s:StatementIndent( ind, lnum ) -+ endif -+ -+ " Check for potential argument list on next line -+ let continuation = (line =~ '[A-Za-z0-9_]\s*$') -+ -+ -+ " Check current line; search for simplistic matching start-of-block -+ let line = getline(v:lnum) -+ if line =~ '^\s*#' -+ " Start of line for ada-pp -+ let ind = 0 -+ elseif continuation && line =~ '^\s*(' -+ " Don't do this if we've already indented due to the previous line -+ if ind == initind -+ let ind = ind + &sw -+ endif -+ elseif line =~ '^\s*\(begin\|is\)\>' -+ let ind = s:MainBlockIndent( ind, lnum, '\(procedure\|function\|declare\|package\|task\)\>', 'begin\>' ) -+ elseif line =~ '^\s*record\>' -+ let ind = s:MainBlockIndent( ind, lnum, 'type\>\|for\>.*\', '' ) + &sw -+ elseif line =~ '^\s*\(else\|elsif\)\>' -+ let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' ) -+ elseif line =~ '^\s*when\>' -+ " Align 'when' one /in/ from matching block start -+ let ind = s:MainBlockIndent( ind, lnum, '\(case\|exception\)\>', '' ) + &sw -+ elseif line =~ '^\s*end\>\s*\' -+ " End of if statements -+ let ind = s:EndBlockIndent( ind, lnum, 'if\>', 'end\>\s*\' ) -+ elseif line =~ '^\s*end\>\s*\' -+ " End of loops -+ let ind = s:EndBlockIndent( ind, lnum, '\(\(while\|for\)\>.*\)\?\', 'end\>\s*\' ) -+ elseif line =~ '^\s*end\>\s*\' -+ " End of records -+ let ind = s:EndBlockIndent( ind, lnum, '\(type\>.*\)\=\', 'end\>\s*\' ) -+ elseif line =~ '^\s*end\>\s*\' -+ " End of procedures -+ let ind = s:EndBlockIndent( ind, lnum, 'procedure\>.*\', 'end\>\s*\' ) -+ elseif line =~ '^\s*end\>\s*\' -+ " End of case statement -+ let ind = s:EndBlockIndent( ind, lnum, 'case\>.*\', 'end\>\s*\' ) -+ elseif line =~ '^\s*end\>' -+ " General case for end -+ let ind = s:MainBlockIndent( ind, lnum, '\(if\|while\|for\|loop\|accept\|begin\|record\|case\|exception\|package\)\>', '' ) -+ elseif line =~ '^\s*exception\>' -+ let ind = s:MainBlockIndent( ind, lnum, 'begin\>', '' ) -+ elseif line =~ '^\s*then\>' -+ let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' ) -+ endif -+ -+ return ind -+endfunction GetAdaIndent -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/indent/.svn/all-wcprops vim71_ada/1/indent/.svn/all-wcprops ---- vim71/1/indent/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/indent/.svn/all-wcprops 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,11 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 51 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/indent -+END -+ada.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 59 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/indent/ada.vim -+END -diff -urN vim71/1/indent/.svn/dir-prop-base vim71_ada/1/indent/.svn/dir-prop-base ---- vim71/1/indent/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/indent/.svn/dir-prop-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,6 @@ -+K 10 -+svn:ignore -+V 9 -+.backups -+ -+END -diff -urN vim71/1/indent/.svn/entries vim71_ada/1/indent/.svn/entries ---- vim71/1/indent/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/indent/.svn/entries 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,41 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -+ada.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:02.000000Z -+0c3e48d95515e29fbb4a8bef5d6d97dc -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -diff -urN vim71/1/indent/.svn/format vim71_ada/1/indent/.svn/format ---- vim71/1/indent/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/indent/.svn/format 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/indent/.svn/prop-base/ada.vim.svn-base vim71_ada/1/indent/.svn/prop-base/ada.vim.svn-base ---- vim71/1/indent/.svn/prop-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/indent/.svn/prop-base/ada.vim.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/indent/.svn/text-base/ada.vim.svn-base vim71_ada/1/indent/.svn/text-base/ada.vim.svn-base ---- vim71/1/indent/.svn/text-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/indent/.svn/text-base/ada.vim.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,303 @@ -+"------------------------------------------------------------------------------ -+" Description: Vim Ada indent file -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" Neil Bird -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL$ -+" History: 24.05.2006 MK Unified Headers -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested to save on spaces -+" 19.09.2007 NO g: missing before ada#Comment -+" Help Page: ft-vim-indent -+"------------------------------------------------------------------------------ -+" ToDo: -+" Verify handling of multi-line exprs. and recovery upon the final ';'. -+" Correctly find comments given '"' and "" ==> " syntax. -+" Combine the two large block-indent functions into one? -+"------------------------------------------------------------------------------ -+ -+" Only load this indent file when no other was loaded. -+if exists("b:did_indent") || version < 700 -+ finish -+endif -+ -+let b:did_indent = 45 -+ -+setlocal indentexpr=GetAdaIndent() -+setlocal indentkeys-=0{,0} -+setlocal indentkeys+=0=~then,0=~end,0=~elsif,0=~when,0=~exception,0=~begin,0=~is,0=~record -+ -+" Only define the functions once. -+if exists("*GetAdaIndent") -+ finish -+endif -+ -+if exists("g:ada_with_gnat_project_files") -+ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\[^;]*$\|\(type\>.*\)\=\\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|project\>\|then\>\|when\>\|is\>\)' -+else -+ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\[^;]*$\|\(type\>.*\)\=\\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|then\>\|when\>\|is\>\)' -+endif -+ -+" Section: s:MainBlockIndent {{{1 -+" -+" Try to find indent of the block we're in -+" prev_indent = the previous line's indent -+" prev_lnum = previous line (to start looking on) -+" blockstart = expr. that indicates a possible start of this block -+" stop_at = if non-null, if a matching line is found, gives up! -+" No recursive previous block analysis: simply look for a valid line -+" with a lesser or equal indent than we currently (on prev_lnum) have. -+" This shouldn't work as well as it appears to with lines that are currently -+" nowhere near the correct indent (e.g., start of line)! -+" Seems to work OK as it 'starts' with the indent of the /previous/ line. -+function s:MainBlockIndent (prev_indent, prev_lnum, blockstart, stop_at) -+ let lnum = a:prev_lnum -+ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) -+ while lnum > 1 -+ if a:stop_at != '' && line =~ '^\s*' . a:stop_at && indent(lnum) < a:prev_indent -+ return a:prev_indent -+ elseif line =~ '^\s*' . a:blockstart -+ let ind = indent(lnum) -+ if ind < a:prev_indent -+ return ind -+ endif -+ endif -+ -+ let lnum = prevnonblank(lnum - 1) -+ " Get previous non-blank/non-comment-only line -+ while 1 -+ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) -+ if line !~ '^\s*$' && line !~ '^\s*#' -+ break -+ endif -+ let lnum = prevnonblank(lnum - 1) -+ if lnum <= 0 -+ return a:prev_indent -+ endif -+ endwhile -+ endwhile -+ " Fallback - just move back one -+ return a:prev_indent - &sw -+endfunction MainBlockIndent -+ -+" Section: s:EndBlockIndent {{{1 -+" -+" Try to find indent of the block we're in (and about to complete), -+" including handling of nested blocks. Works on the 'end' of a block. -+" prev_indent = the previous line's indent -+" prev_lnum = previous line (to start looking on) -+" blockstart = expr. that indicates a possible start of this block -+" blockend = expr. that indicates a possible end of this block -+function s:EndBlockIndent( prev_indent, prev_lnum, blockstart, blockend ) -+ let lnum = a:prev_lnum -+ let line = getline(lnum) -+ let ends = 0 -+ while lnum > 1 -+ if getline(lnum) =~ '^\s*' . a:blockstart -+ let ind = indent(lnum) -+ if ends <= 0 -+ if ind < a:prev_indent -+ return ind -+ endif -+ else -+ let ends = ends - 1 -+ endif -+ elseif getline(lnum) =~ '^\s*' . a:blockend -+ let ends = ends + 1 -+ endif -+ -+ let lnum = prevnonblank(lnum - 1) -+ " Get previous non-blank/non-comment-only line -+ while 1 -+ let line = getline(lnum) -+ let line = substitute( line, g:ada#Comment, '', '' ) -+ if line !~ '^\s*$' -+ break -+ endif -+ let lnum = prevnonblank(lnum - 1) -+ if lnum <= 0 -+ return a:prev_indent -+ endif -+ endwhile -+ endwhile -+ " Fallback - just move back one -+ return a:prev_indent - &sw -+endfunction EndBlockIndent -+ -+" Section: s:StatementIndent {{{1 -+" -+" Return indent of previous statement-start -+" (after we've indented due to multi-line statements). -+" This time, we start searching on the line *before* the one given (which is -+" the end of a statement - we want the previous beginning). -+function s:StatementIndent( current_indent, prev_lnum ) -+ let lnum = a:prev_lnum -+ while lnum > 0 -+ let prev_lnum = lnum -+ let lnum = prevnonblank(lnum - 1) -+ " Get previous non-blank/non-comment-only line -+ while 1 -+ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) -+ -+ if line !~ '^\s*$' && line !~ '^\s*#' -+ break -+ endif -+ let lnum = prevnonblank(lnum - 1) -+ if lnum <= 0 -+ return a:current_indent -+ endif -+ endwhile -+ " Leave indent alone if our ';' line is part of a ';'-delineated -+ " aggregate (e.g., procedure args.) or first line after a block start. -+ if line =~ s:AdaBlockStart || line =~ '(\s*$' -+ return a:current_indent -+ endif -+ if line !~ '[.=(]\s*$' -+ let ind = indent(prev_lnum) -+ if ind < a:current_indent -+ return ind -+ endif -+ endif -+ endwhile -+ " Fallback - just use current one -+ return a:current_indent -+endfunction StatementIndent -+ -+ -+" Section: GetAdaIndent {{{1 -+" -+" Find correct indent of a new line based upon what went before -+" -+function GetAdaIndent() -+ " Find a non-blank line above the current line. -+ let lnum = prevnonblank(v:lnum - 1) -+ let ind = indent(lnum) -+ let package_line = 0 -+ -+ " Get previous non-blank/non-comment-only/non-cpp line -+ while 1 -+ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) -+ if line !~ '^\s*$' && line !~ '^\s*#' -+ break -+ endif -+ let lnum = prevnonblank(lnum - 1) -+ if lnum <= 0 -+ return ind -+ endif -+ endwhile -+ -+ " Get default indent (from prev. line) -+ let ind = indent(lnum) -+ let initind = ind -+ -+ " Now check what's on the previous line -+ if line =~ s:AdaBlockStart || line =~ '(\s*$' -+ " Check for false matches to AdaBlockStart -+ let false_match = 0 -+ if line =~ '^\s*\(procedure\|function\|package\)\>.*\' -+ " Generic instantiation -+ let false_match = 1 -+ elseif line =~ ')\s*;\s*$' || line =~ '^\([^(]*([^)]*)\)*[^(]*;\s*$' -+ " forward declaration -+ let false_match = 1 -+ endif -+ " Move indent in -+ if ! false_match -+ let ind = ind + &sw -+ endif -+ elseif line =~ '^\s*\(case\|exception\)\>' -+ " Move indent in twice (next 'when' will move back) -+ let ind = ind + 2 * &sw -+ elseif line =~ '^\s*end\s*record\>' -+ " Move indent back to tallying 'type' preceeding the 'record'. -+ " Allow indent to be equal to 'end record's. -+ let ind = s:MainBlockIndent( ind+&sw, lnum, 'type\>', '' ) -+ elseif line =~ '\(^\s*new\>.*\)\@' -+ " Multiple line generic instantiation ('package blah is\nnew thingy') -+ let ind = s:StatementIndent( ind - &sw, lnum ) -+ elseif line =~ ';\s*$' -+ " Statement end (but not 'end' ) - try to find current statement-start indent -+ let ind = s:StatementIndent( ind, lnum ) -+ endif -+ -+ " Check for potential argument list on next line -+ let continuation = (line =~ '[A-Za-z0-9_]\s*$') -+ -+ -+ " Check current line; search for simplistic matching start-of-block -+ let line = getline(v:lnum) -+ if line =~ '^\s*#' -+ " Start of line for ada-pp -+ let ind = 0 -+ elseif continuation && line =~ '^\s*(' -+ " Don't do this if we've already indented due to the previous line -+ if ind == initind -+ let ind = ind + &sw -+ endif -+ elseif line =~ '^\s*\(begin\|is\)\>' -+ let ind = s:MainBlockIndent( ind, lnum, '\(procedure\|function\|declare\|package\|task\)\>', 'begin\>' ) -+ elseif line =~ '^\s*record\>' -+ let ind = s:MainBlockIndent( ind, lnum, 'type\>\|for\>.*\', '' ) + &sw -+ elseif line =~ '^\s*\(else\|elsif\)\>' -+ let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' ) -+ elseif line =~ '^\s*when\>' -+ " Align 'when' one /in/ from matching block start -+ let ind = s:MainBlockIndent( ind, lnum, '\(case\|exception\)\>', '' ) + &sw -+ elseif line =~ '^\s*end\>\s*\' -+ " End of if statements -+ let ind = s:EndBlockIndent( ind, lnum, 'if\>', 'end\>\s*\' ) -+ elseif line =~ '^\s*end\>\s*\' -+ " End of loops -+ let ind = s:EndBlockIndent( ind, lnum, '\(\(while\|for\)\>.*\)\?\', 'end\>\s*\' ) -+ elseif line =~ '^\s*end\>\s*\' -+ " End of records -+ let ind = s:EndBlockIndent( ind, lnum, '\(type\>.*\)\=\', 'end\>\s*\' ) -+ elseif line =~ '^\s*end\>\s*\' -+ " End of procedures -+ let ind = s:EndBlockIndent( ind, lnum, 'procedure\>.*\', 'end\>\s*\' ) -+ elseif line =~ '^\s*end\>\s*\' -+ " End of case statement -+ let ind = s:EndBlockIndent( ind, lnum, 'case\>.*\', 'end\>\s*\' ) -+ elseif line =~ '^\s*end\>' -+ " General case for end -+ let ind = s:MainBlockIndent( ind, lnum, '\(if\|while\|for\|loop\|accept\|begin\|record\|case\|exception\|package\)\>', '' ) -+ elseif line =~ '^\s*exception\>' -+ let ind = s:MainBlockIndent( ind, lnum, 'begin\>', '' ) -+ elseif line =~ '^\s*then\>' -+ let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' ) -+ endif -+ -+ return ind -+endfunction GetAdaIndent -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: foldmethod=marker -diff -urN vim71/1/macros/.svn/all-wcprops vim71_ada/1/macros/.svn/all-wcprops ---- vim71/1/macros/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/all-wcprops 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,35 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 51 -+/svnroot/gnuada/!svn/ver/820/trunk/tools/vim/macros -+END -+svnignore.bash -+K 25 -+svn:wc:ra_dav:version-url -+V 66 -+/svnroot/gnuada/!svn/ver/467/trunk/tools/vim/macros/svnignore.bash -+END -+vim.bash -+K 25 -+svn:wc:ra_dav:version-url -+V 60 -+/svnroot/gnuada/!svn/ver/820/trunk/tools/vim/macros/vim.bash -+END -+svnignore.btm -+K 25 -+svn:wc:ra_dav:version-url -+V 65 -+/svnroot/gnuada/!svn/ver/806/trunk/tools/vim/macros/svnignore.btm -+END -+svnignore.zsh -+K 25 -+svn:wc:ra_dav:version-url -+V 65 -+/svnroot/gnuada/!svn/ver/818/trunk/tools/vim/macros/svnignore.zsh -+END -+vim.zsh -+K 25 -+svn:wc:ra_dav:version-url -+V 59 -+/svnroot/gnuada/!svn/ver/820/trunk/tools/vim/macros/vim.zsh -+END -diff -urN vim71/1/macros/.svn/dir-prop-base vim71_ada/1/macros/.svn/dir-prop-base ---- vim71/1/macros/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/dir-prop-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,6 @@ -+K 10 -+svn:ignore -+V 9 -+.backups -+ -+END -diff -urN vim71/1/macros/.svn/entries vim71_ada/1/macros/.svn/entries ---- vim71/1/macros/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/entries 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,93 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-12-08T11:05:30.504500Z -+820 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -+svnignore.bash -+file -+ -+ -+ -+ -+2008-01-16T15:37:02.000000Z -+c642481322f646fd974e97b84ada8dd1 -+2006-11-23T19:22:39.181709Z -+467 -+krischik -+has-props -+ -+vim.bash -+file -+ -+ -+ -+ -+2008-01-16T15:37:02.000000Z -+b727d059d581444336f20c5a98cb38f4 -+2007-12-08T11:05:30.504500Z -+820 -+krischik -+has-props -+ -+svnignore.btm -+file -+ -+ -+ -+ -+2008-01-16T15:37:02.000000Z -+d80c852daa65bf28d8e6f77aa176dcf5 -+2007-11-21T09:35:26.131421Z -+806 -+krischik -+has-props -+ -+svnignore.zsh -+file -+ -+ -+ -+ -+2008-01-16T15:37:02.000000Z -+6eea8120eb524add32e145b4ae2fcd78 -+2007-12-03T21:21:48.223203Z -+818 -+krischik -+has-props -+ -+vim.zsh -+file -+ -+ -+ -+ -+2008-01-16T15:37:02.000000Z -+07a5ffc95ea930774810e3d04144cbff -+2007-12-08T11:05:30.504500Z -+820 -+krischik -+has-props -+ -diff -urN vim71/1/macros/.svn/format vim71_ada/1/macros/.svn/format ---- vim71/1/macros/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/format 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/macros/.svn/prop-base/svnignore.bash.svn-base vim71_ada/1/macros/.svn/prop-base/svnignore.bash.svn-base ---- vim71/1/macros/.svn/prop-base/svnignore.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/prop-base/svnignore.bash.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 14 -+svn:executable -+V 1 -+* -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 9 -+text/x-sh -+END -diff -urN vim71/1/macros/.svn/prop-base/svnignore.btm.svn-base vim71_ada/1/macros/.svn/prop-base/svnignore.btm.svn-base ---- vim71/1/macros/.svn/prop-base/svnignore.btm.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/prop-base/svnignore.btm.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 14 -+svn:executable -+V 1 -+* -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 15 -+text/x-dosbatch -+END -diff -urN vim71/1/macros/.svn/prop-base/svnignore.zsh.svn-base vim71_ada/1/macros/.svn/prop-base/svnignore.zsh.svn-base ---- vim71/1/macros/.svn/prop-base/svnignore.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/prop-base/svnignore.zsh.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 14 -+svn:executable -+V 1 -+* -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 9 -+text/x-sh -+END -diff -urN vim71/1/macros/.svn/prop-base/vim.bash.svn-base vim71_ada/1/macros/.svn/prop-base/vim.bash.svn-base ---- vim71/1/macros/.svn/prop-base/vim.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/prop-base/vim.bash.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 14 -+svn:executable -+V 1 -+* -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 9 -+text/x-sh -+END -diff -urN vim71/1/macros/.svn/prop-base/vim.zsh.svn-base vim71_ada/1/macros/.svn/prop-base/vim.zsh.svn-base ---- vim71/1/macros/.svn/prop-base/vim.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/prop-base/vim.zsh.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 14 -+svn:executable -+V 1 -+* -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 9 -+text/x-sh -+END -diff -urN vim71/1/macros/.svn/text-base/svnignore.bash.svn-base vim71_ada/1/macros/.svn/text-base/svnignore.bash.svn-base ---- vim71/1/macros/.svn/text-base/svnignore.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/text-base/svnignore.bash.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,9 @@ -+#!/bin/bash -+ -+svn propedit \ -+ --editor-cmd="gvim -f" \ -+ svn:ignore \ -+ "${@}" ; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/1/macros/.svn/text-base/svnignore.btm.svn-base vim71_ada/1/macros/.svn/text-base/svnignore.btm.svn-base ---- vim71/1/macros/.svn/text-base/svnignore.btm.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/text-base/svnignore.btm.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,27 @@ -+::!C:\Bin\4Portable\App\4\4nt.EXE -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+:: Description: Works like "tail -f" . -+:: $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+:: Maintainer: Martin Krischik -+:: Jason Heddings (vim at heddway dot com) -+:: $Author: karsten $ -+:: $Date: 2008/01/16 15:58:14 $ -+:: Version: 3.0 -+:: $Revision: 1.1 $ -+:: $HeadURL$ -+:: History: 17.11.2007 Edit svn:ignore data -+:: Help Page: tail.txt -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+ -+svn propedit ^ -+ --editor-cmd="gvim -f" ^ -+ svn:ignore ^ -+ "%[$]" -+ -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+:: Copyright (C) 2006 Martin Krischik -+:: -+:: Vim is Charityware - see ":help license" or uganda.txt for licence details. -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+:: vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+:: vim: filetype=btm encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/1/macros/.svn/text-base/svnignore.zsh.svn-base vim71_ada/1/macros/.svn/text-base/svnignore.zsh.svn-base ---- vim71/1/macros/.svn/text-base/svnignore.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/text-base/svnignore.zsh.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,29 @@ -+#!/bin/zsh -+#------------------------------------------------------------------------------ -+# Description: Works like "tail -f" . -+# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+# Maintainer: Martin Krischik -+# Jason Heddings (vim at heddway dot com) -+# $Author: karsten $ -+# $Date: 2008/01/16 15:58:14 $ -+# Version: 3.0 -+# $Revision: 1.1 $ -+# $HeadURL$ -+# History: 17.11.2007 Edit svn:ignore data -+# Help Page: tail.txt -+#------------------------------------------------------------------------------ -+ -+setopt No_X_Trace; -+ -+svn propedit \ -+ --editor-cmd="gvim -f" \ -+ svn:ignore \ -+ "${=@}" ; -+ -+#------------------------------------------------------------------------------ -+# Copyright (C) 2006 Martin Krischik -+# -+# Vim is Charityware - see ":help license" or uganda.txt for licence details. -+#------------------------------------------------------------------------------ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/1/macros/.svn/text-base/vim.bash.svn-base vim71_ada/1/macros/.svn/text-base/vim.bash.svn-base ---- vim71/1/macros/.svn/text-base/vim.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/text-base/vim.bash.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,191 @@ -+#!/bin/echo usage: source -+########################################################### {{{1 ########### -+# Description: Set alias names for a custom installed vim/ctags. -+# Language: Bash Shell Script -+# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+# Maintainer: Martin Krischik -+# $Author: karsten $ -+# $Date: 2008/01/16 15:58:14 $ -+# Version: 3.6 -+# $Revision: 1.1 $ -+# $HeadURL$ -+# History: 26.07.2006 MK pretty new -+# Usage: copy to /etc/profile.d and make world executable -+########################################################### }}}1 ########### -+ -+ -+if ! type lxpm 2>/dev/null 1>/dev/null; then -+ -+ # Variablen -+ UName=$(uname) -+ -+ case "${UName}" in # {{{1 -+ (Linux*) # {{{2 -+ if test -x "/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; -+ else -+ unset VIM 1>/dev/null 2>/dev/null; -+ unset VIMRUNTIME 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}2 -+ (CYGWIN*) # {{{2 -+ if test -x "/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" -+ else -+ unset VIM 1>/dev/null 2>/dev/null; -+ unset VIMRUNTIME 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}2 -+ (SunOS) # {{{2 -+ if test -x "/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; -+ elif test -x "${HOME}/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="${HOME}/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" -+ PATH="${VIM}/bin:${PATH}" -+ else -+ unset VIM 1>/dev/null 2>/dev/null; -+ unset VIMRUNTIME 1>/dev/null 2>/dev/null; -+ fi -+ ;; # }}}2 -+ (*) # {{{2 -+ ;; # }}}2 -+ esac; # }}}1 -+ -+ # Simple Functions -+ -+ for i in ctags etags eview evim ex gview gvim gvimdiff rgview rgvim rview rvim view vim vimdiff vimtutor xxd; do # {{{1 -+ -+ case "${UName}" in # {{{2 -+ (MINGW*) # {{{3 -+ if test -n "${VIM}"; then -+ declare -x -f ${i}; -+ -+ eval "function ${i} () -+ { -+ ${VIM}/vim71/gvim.exe \"\${@}\" -+ return; -+ }" -+ else -+ unset -f ${i} 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}3 -+ (Linux|CYGWIN*) # {{{3 -+ if test -n "${VIM}"; then -+ declare -x -f ${i}; -+ -+ eval "function ${i} () -+ { -+ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ -+ \"${VIM}/bin/${i}\" \"\${@}\" ; -+ return; -+ }" -+ else -+ unset -f ${i} 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}3 -+ (*) # {{{3 -+ ;; # }}}3 -+ esac; # }}}2 -+ done; # }}}1 -+ -+ # Server Functions -+ -+ for i in lxpm med epm; do # {{{1 -+ declare -x -f ${i} -+ -+ case "${UName}" in # {{{2 -+ (MINGW*) # {{{3 -+ if test -n "${VIM}"; then -+ eval "function ${i} () -+ { -+ if test -z "\${1}"; then -+ ${VIM}/vim71/gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & -+ else -+ ${VIM}/vim71/gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & -+ fi; -+ return; -+ }" -+ else -+ eval "function ${i} () -+ { -+ if test -z "\${1}"; then -+ gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & -+ else -+ gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & -+ fi; -+ return; -+ }" -+ fi; -+ ;; # }}}3 -+ (Linux|CYGWIN*|SunOS) # {{{3 -+ if test -n "${VIM}"; then -+ eval "function ${i} () -+ { -+ if test -z \"\${1}\"; then -+ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ -+ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" \"\${@}\" \ -+ >/dev/null 2>/dev/null & -+ else -+ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ -+ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" \ -+ >/dev/null 2>/dev/null & -+ fi -+ return; -+ }" -+ else -+ eval "function ${i} () -+ { -+ if test -z \"\${1}\"; then -+ gvim --servername \"${i} ${HOSTNAME}\" >/dev/null 2>/dev/null & -+ else -+ gvim --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" >/dev/null 2>/dev/null & -+ fi -+ return; -+ }" -+ fi; -+ ;; # }}}3 -+ (*) # {{{3 -+ ;; # }}}3 -+ esac; # }}}2 -+ done; # }}}1 -+ -+ # Some applications read the EDITOR variable to determine your favourite text -+ # editor. So uncomment the line below and enter the editor of your choice :-) -+ if test -n "${VIM}"; then -+ declare -x EDITOR="${VIM}/bin/gvim -f"; -+ declare -x VISUAL="${VIM}/bin/gvim -f"; -+ else -+ declare -x EDITOR="$(which gvim) -f"; -+ declare -x VISUAL="$(which gvim) -f"; -+ fi; -+ # Unset local Variablen -+ -+ unset UName -+ -+ printf "\e[42m%-30.30s : \e[43m %-40.40s \e[m\n" "$(basename ${BASH_SOURCE:-${0}})" "VIM 7.0 symbols set." -+ -+fi; -+ -+########################################################### {{{1 ########### -+# Copyright (C) 2006 Martin Krischik -+# -+# This program is free software; you can redistribute it and/or -+# modify it under the terms of the GNU General Public License -+# as published by the Free Software Foundation; either version 2 -+# of the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -+########################################################### }}}1 ########### -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker -diff -urN vim71/1/macros/.svn/text-base/vim.zsh.svn-base vim71_ada/1/macros/.svn/text-base/vim.zsh.svn-base ---- vim71/1/macros/.svn/text-base/vim.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/.svn/text-base/vim.zsh.svn-base 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,17 @@ -+#!/bin/echo usage: source -+ -+setopt No_Verbose -+setopt No_X_Trace -+setopt Typeset_Silent; -+ -+# -+# Bash script is zsh compatible -+# -+HOSTNAME="${HOSTNAME:-${HOST}}" -+BASH_SOURCE="$(basename ${0} .zsh).bash" -+source "$(dirname ${0})/${BASH_SOURCE}" -+unset BASH_SOURCE; -+ -+############################################################# {{{1 ########### -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab -+# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/1/macros/svnignore.bash vim71_ada/1/macros/svnignore.bash ---- vim71/1/macros/svnignore.bash 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/svnignore.bash 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,9 @@ -+#!/bin/bash -+ -+svn propedit \ -+ --editor-cmd="gvim -f" \ -+ svn:ignore \ -+ "${@}" ; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/1/macros/svnignore.btm vim71_ada/1/macros/svnignore.btm ---- vim71/1/macros/svnignore.btm 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/svnignore.btm 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,27 @@ -+::!C:\Bin\4Portable\App\4\4nt.EXE -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+:: Description: Works like "tail -f" . -+:: $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+:: Maintainer: Martin Krischik -+:: Jason Heddings (vim at heddway dot com) -+:: $Author: karsten $ -+:: $Date: 2008/01/16 15:58:14 $ -+:: Version: 3.0 -+:: $Revision: 1.1 $ -+:: $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.btm $ -+:: History: 17.11.2007 Edit svn:ignore data -+:: Help Page: tail.txt -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+ -+svn propedit ^ -+ --editor-cmd="gvim -f" ^ -+ svn:ignore ^ -+ "%[$]" -+ -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+:: Copyright (C) 2006 Martin Krischik -+:: -+:: Vim is Charityware - see ":help license" or uganda.txt for licence details. -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+:: vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+:: vim: filetype=btm encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/1/macros/svnignore.zsh vim71_ada/1/macros/svnignore.zsh ---- vim71/1/macros/svnignore.zsh 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/svnignore.zsh 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,29 @@ -+#!/bin/zsh -+#------------------------------------------------------------------------------ -+# Description: Works like "tail -f" . -+# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+# Maintainer: Martin Krischik -+# Jason Heddings (vim at heddway dot com) -+# $Author: karsten $ -+# $Date: 2008/01/16 15:58:14 $ -+# Version: 3.0 -+# $Revision: 1.1 $ -+# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.zsh $ -+# History: 17.11.2007 Edit svn:ignore data -+# Help Page: tail.txt -+#------------------------------------------------------------------------------ -+ -+setopt No_X_Trace; -+ -+svn propedit \ -+ --editor-cmd="gvim -f" \ -+ svn:ignore \ -+ "${=@}" ; -+ -+#------------------------------------------------------------------------------ -+# Copyright (C) 2006 Martin Krischik -+# -+# Vim is Charityware - see ":help license" or uganda.txt for licence details. -+#------------------------------------------------------------------------------ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/1/macros/vim.bash vim71_ada/1/macros/vim.bash ---- vim71/1/macros/vim.bash 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/vim.bash 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,191 @@ -+#!/bin/echo usage: source -+########################################################### {{{1 ########### -+# Description: Set alias names for a custom installed vim/ctags. -+# Language: Bash Shell Script -+# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+# Maintainer: Martin Krischik -+# $Author: karsten $ -+# $Date: 2008/01/16 15:58:14 $ -+# Version: 3.6 -+# $Revision: 1.1 $ -+# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/vim.bash $ -+# History: 26.07.2006 MK pretty new -+# Usage: copy to /etc/profile.d and make world executable -+########################################################### }}}1 ########### -+ -+ -+if ! type lxpm 2>/dev/null 1>/dev/null; then -+ -+ # Variablen -+ UName=$(uname) -+ -+ case "${UName}" in # {{{1 -+ (Linux*) # {{{2 -+ if test -x "/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; -+ else -+ unset VIM 1>/dev/null 2>/dev/null; -+ unset VIMRUNTIME 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}2 -+ (CYGWIN*) # {{{2 -+ if test -x "/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" -+ else -+ unset VIM 1>/dev/null 2>/dev/null; -+ unset VIMRUNTIME 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}2 -+ (SunOS) # {{{2 -+ if test -x "/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; -+ elif test -x "${HOME}/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="${HOME}/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" -+ PATH="${VIM}/bin:${PATH}" -+ else -+ unset VIM 1>/dev/null 2>/dev/null; -+ unset VIMRUNTIME 1>/dev/null 2>/dev/null; -+ fi -+ ;; # }}}2 -+ (*) # {{{2 -+ ;; # }}}2 -+ esac; # }}}1 -+ -+ # Simple Functions -+ -+ for i in ctags etags eview evim ex gview gvim gvimdiff rgview rgvim rview rvim view vim vimdiff vimtutor xxd; do # {{{1 -+ -+ case "${UName}" in # {{{2 -+ (MINGW*) # {{{3 -+ if test -n "${VIM}"; then -+ declare -x -f ${i}; -+ -+ eval "function ${i} () -+ { -+ ${VIM}/vim71/gvim.exe \"\${@}\" -+ return; -+ }" -+ else -+ unset -f ${i} 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}3 -+ (Linux|CYGWIN*) # {{{3 -+ if test -n "${VIM}"; then -+ declare -x -f ${i}; -+ -+ eval "function ${i} () -+ { -+ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ -+ \"${VIM}/bin/${i}\" \"\${@}\" ; -+ return; -+ }" -+ else -+ unset -f ${i} 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}3 -+ (*) # {{{3 -+ ;; # }}}3 -+ esac; # }}}2 -+ done; # }}}1 -+ -+ # Server Functions -+ -+ for i in lxpm med epm; do # {{{1 -+ declare -x -f ${i} -+ -+ case "${UName}" in # {{{2 -+ (MINGW*) # {{{3 -+ if test -n "${VIM}"; then -+ eval "function ${i} () -+ { -+ if test -z "\${1}"; then -+ ${VIM}/vim71/gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & -+ else -+ ${VIM}/vim71/gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & -+ fi; -+ return; -+ }" -+ else -+ eval "function ${i} () -+ { -+ if test -z "\${1}"; then -+ gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & -+ else -+ gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & -+ fi; -+ return; -+ }" -+ fi; -+ ;; # }}}3 -+ (Linux|CYGWIN*|SunOS) # {{{3 -+ if test -n "${VIM}"; then -+ eval "function ${i} () -+ { -+ if test -z \"\${1}\"; then -+ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ -+ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" \"\${@}\" \ -+ >/dev/null 2>/dev/null & -+ else -+ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ -+ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" \ -+ >/dev/null 2>/dev/null & -+ fi -+ return; -+ }" -+ else -+ eval "function ${i} () -+ { -+ if test -z \"\${1}\"; then -+ gvim --servername \"${i} ${HOSTNAME}\" >/dev/null 2>/dev/null & -+ else -+ gvim --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" >/dev/null 2>/dev/null & -+ fi -+ return; -+ }" -+ fi; -+ ;; # }}}3 -+ (*) # {{{3 -+ ;; # }}}3 -+ esac; # }}}2 -+ done; # }}}1 -+ -+ # Some applications read the EDITOR variable to determine your favourite text -+ # editor. So uncomment the line below and enter the editor of your choice :-) -+ if test -n "${VIM}"; then -+ declare -x EDITOR="${VIM}/bin/gvim -f"; -+ declare -x VISUAL="${VIM}/bin/gvim -f"; -+ else -+ declare -x EDITOR="$(which gvim) -f"; -+ declare -x VISUAL="$(which gvim) -f"; -+ fi; -+ # Unset local Variablen -+ -+ unset UName -+ -+ printf "\e[42m%-30.30s : \e[43m %-40.40s \e[m\n" "$(basename ${BASH_SOURCE:-${0}})" "VIM 7.0 symbols set." -+ -+fi; -+ -+########################################################### {{{1 ########### -+# Copyright (C) 2006 Martin Krischik -+# -+# This program is free software; you can redistribute it and/or -+# modify it under the terms of the GNU General Public License -+# as published by the Free Software Foundation; either version 2 -+# of the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -+########################################################### }}}1 ########### -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker -diff -urN vim71/1/macros/vim.zsh vim71_ada/1/macros/vim.zsh ---- vim71/1/macros/vim.zsh 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/macros/vim.zsh 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,17 @@ -+#!/bin/echo usage: source -+ -+setopt No_Verbose -+setopt No_X_Trace -+setopt Typeset_Silent; -+ -+# -+# Bash script is zsh compatible -+# -+HOSTNAME="${HOSTNAME:-${HOST}}" -+BASH_SOURCE="$(basename ${0} .zsh).bash" -+source "$(dirname ${0})/${BASH_SOURCE}" -+unset BASH_SOURCE; -+ -+############################################################# {{{1 ########### -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab -+# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/1/plugin/matchit.vim vim71_ada/1/plugin/matchit.vim ---- vim71/1/plugin/matchit.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/matchit.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,814 @@ -+" matchit.vim: (global plugin) Extended "%" matching -+" Last Change: Tue Oct 24 11:00 AM 2006 EDT -+" Maintainer: Benji Fisher PhD -+" Version: 1.12, for Vim 6.3+ -+" URL: http://www.vim.org/script.php?script_id=39 -+ -+" Documentation: -+" The documentation is in a separate file, matchit.txt . -+ -+" Credits: -+" Vim editor by Bram Moolenaar (Thanks, Bram!) -+" Original script and design by Raul Segura Acevedo -+" Support for comments by Douglas Potts -+" Support for back references and other improvements by Benji Fisher -+" Support for many languages by Johannes Zellner -+" Suggestions for improvement, bug reports, and support for additional -+" languages by Jordi-Albert Batalla, Neil Bird, Servatius Brandt, Mark -+" Collett, Stephen Wall, Dany St-Amant, Yuheng Xie, and Johannes Zellner. -+ -+" Debugging: -+" If you'd like to try the built-in debugging commands... -+" :MatchDebug to activate debugging for the current buffer -+" This saves the values of several key script variables as buffer-local -+" variables. See the MatchDebug() function, below, for details. -+ -+" TODO: I should think about multi-line patterns for b:match_words. -+" This would require an option: how many lines to scan (default 1). -+" This would be useful for Python, maybe also for *ML. -+" TODO: Maybe I should add a menu so that people will actually use some of -+" the features that I have implemented. -+" TODO: Eliminate the MultiMatch function. Add yet another argument to -+" Match_wrapper() instead. -+" TODO: Allow :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1' -+" TODO: Make backrefs safer by using '\V' (very no-magic). -+" TODO: Add a level of indirection, so that custom % scripts can use my -+" work but extend it. -+ -+" allow user to prevent loading -+" and prevent duplicate loading -+if exists("loaded_matchit") || &cp -+ finish -+endif -+let loaded_matchit = 1 -+let s:last_mps = "" -+let s:last_words = "" -+ -+let s:save_cpo = &cpo -+set cpo&vim -+ -+nnoremap % :call Match_wrapper('',1,'n') -+nnoremap g% :call Match_wrapper('',0,'n') -+vnoremap % :call Match_wrapper('',1,'v') m'gv`` -+vnoremap g% :call Match_wrapper('',0,'v') m'gv`` -+onoremap % v:call Match_wrapper('',1,'o') -+onoremap g% v:call Match_wrapper('',0,'o') -+ -+" Analogues of [{ and ]} using matching patterns: -+nnoremap [% :call MultiMatch("bW", "n") -+nnoremap ]% :call MultiMatch("W", "n") -+vmap [% [%m'gv`` -+vmap ]% ]%m'gv`` -+" vnoremap [% :call MultiMatch("bW", "v") m'gv`` -+" vnoremap ]% :call MultiMatch("W", "v") m'gv`` -+onoremap [% v:call MultiMatch("bW", "o") -+onoremap ]% v:call MultiMatch("W", "o") -+ -+" text object: -+vmap a% [%v]% -+ -+" Auto-complete mappings: (not yet "ready for prime time") -+" TODO Read :help write-plugin for the "right" way to let the user -+" specify a key binding. -+" let g:match_auto = '' -+" let g:match_autoCR = '' -+" if exists("g:match_auto") -+" execute "inoremap " . g:match_auto . ' x"=Autocomplete()Pls' -+" endif -+" if exists("g:match_autoCR") -+" execute "inoremap " . g:match_autoCR . ' =Autocomplete()' -+" endif -+" if exists("g:match_gthhoh") -+" execute "inoremap " . g:match_gthhoh . ' :call Gthhoh()' -+" endif " gthhoh = "Get the heck out of here!" -+ -+let s:notslash = '\\\@" -+ endif -+ " In s:CleanUp(), we may need to check whether the cursor moved forward. -+ let startline = line(".") -+ let startcol = col(".") -+ " Use default behavior if called with a count or if no patterns are defined. -+ if v:count -+ exe "normal! " . v:count . "%" -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ elseif !exists("b:match_words") || b:match_words == "" -+ silent! normal! % -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ end -+ -+ " First step: if not already done, set the script variables -+ " s:do_BR flag for whether there are backrefs -+ " s:pat parsed version of b:match_words -+ " s:all regexp based on s:pat and the default groups -+ " -+ " Allow b:match_words = "GetVimMatchWords()" . -+ if b:match_words =~ ":" -+ let match_words = b:match_words -+ else -+ execute "let match_words =" b:match_words -+ endif -+" Thanks to Preben "Peppe" Guldberg and Bram Moolenaar for this suggestion! -+ if (match_words != s:last_words) || (&mps != s:last_mps) || -+ \ exists("b:match_debug") -+ let s:last_words = match_words -+ let s:last_mps = &mps -+ if match_words !~ s:notslash . '\\\d' -+ let s:do_BR = 0 -+ let s:pat = match_words -+ else -+ let s:do_BR = 1 -+ let s:pat = s:ParseWords(match_words) -+ endif -+ " The next several lines were here before -+ " BF started messing with this script. -+ " quote the special chars in 'matchpairs', replace [,:] with \| and then -+ " append the builtin pairs (/*, */, #if, #ifdef, #else, #elif, #endif) -+ " let default = substitute(escape(&mps, '[$^.*~\\/?]'), '[,:]\+', -+ " \ '\\|', 'g').'\|\/\*\|\*\/\|#if\>\|#ifdef\>\|#else\>\|#elif\>\|#endif\>' -+ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . -+ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' -+ " s:all = pattern with all the keywords -+ let s:all = s:pat . (strlen(s:pat) ? "," : "") . default -+ let s:all = substitute(s:all, s:notslash . '\zs[,:]\+', '\\|', 'g') -+ let s:all = '\%(' . s:all . '\)' -+ " let s:all = '\%(' . substitute(s:all, '\\\ze[,:]', '', 'g') . '\)' -+ if exists("b:match_debug") -+ let b:match_pat = s:pat -+ endif -+ endif -+ -+ " Second step: set the following local variables: -+ " matchline = line on which the cursor started -+ " curcol = number of characters before match -+ " prefix = regexp for start of line to start of match -+ " suffix = regexp for end of match to end of line -+ " Require match to end on or after the cursor and prefer it to -+ " start on or before the cursor. -+ let matchline = getline(startline) -+ if a:word != '' -+ " word given -+ if a:word !~ s:all -+ echohl WarningMsg|echo 'Missing rule for word:"'.a:word.'"'|echohl NONE -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ endif -+ let matchline = a:word -+ let curcol = 0 -+ let prefix = '^\%(' -+ let suffix = '\)$' -+ " Now the case when "word" is not given -+ else " Find the match that ends on or after the cursor and set curcol. -+ let regexp = s:Wholematch(matchline, s:all, startcol-1) -+ let curcol = match(matchline, regexp) -+ let endcol = matchend(matchline, regexp) -+ let suf = strlen(matchline) - endcol -+ let prefix = (curcol ? '^.*\%' . (curcol + 1) . 'c\%(' : '^\%(') -+ let suffix = (suf ? '\)\%' . (endcol + 1) . 'c.*$' : '\)$') -+ " If the match comes from the defaults, bail out. -+ if matchline !~ prefix . -+ \ substitute(s:pat, s:notslash.'\zs[,:]\+', '\\|', 'g') . suffix -+ silent! norm! % -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ endif -+ endif -+ if exists("b:match_debug") -+ let b:match_match = matchstr(matchline, regexp) -+ let b:match_col = curcol+1 -+ endif -+ -+ " Third step: Find the group and single word that match, and the original -+ " (backref) versions of these. Then, resolve the backrefs. -+ " Set the following local variable: -+ " group = colon-separated list of patterns, one of which matches -+ " = ini:mid:fin or ini:fin -+ " -+ " Reconstruct the version with unresolved backrefs. -+ let patBR = substitute(match_words.',', -+ \ s:notslash.'\zs[,:]*,[,:]*', ',', 'g') -+ let patBR = substitute(patBR, s:notslash.'\zs:\{2,}', ':', 'g') -+ " Now, set group and groupBR to the matching group: 'if:endif' or -+ " 'while:endwhile' or whatever. A bit of a kluge: s:Choose() returns -+ " group . "," . groupBR, and we pick it apart. -+ let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) -+ let i = matchend(group, s:notslash . ",") -+ let groupBR = strpart(group, i) -+ let group = strpart(group, 0, i-1) -+ " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix -+ if s:do_BR " Do the hard part: resolve those backrefs! -+ let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) -+ endif -+ if exists("b:match_debug") -+ let b:match_wholeBR = groupBR -+ let i = matchend(groupBR, s:notslash . ":") -+ let b:match_iniBR = strpart(groupBR, 0, i-1) -+ endif -+ -+ " Fourth step: Set the arguments for searchpair(). -+ let i = matchend(group, s:notslash . ":") -+ let j = matchend(group, '.*' . s:notslash . ":") -+ let ini = strpart(group, 0, i-1) -+ let mid = substitute(strpart(group, i,j-i-1), s:notslash.'\zs:', '\\|', 'g') -+ let fin = strpart(group, j) -+ "Un-escape the remaining , and : characters. -+ let ini = substitute(ini, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') -+ let mid = substitute(mid, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') -+ let fin = substitute(fin, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') -+ " searchpair() requires that these patterns avoid \(\) groups. -+ let ini = substitute(ini, s:notslash . '\zs\\(', '\\%(', 'g') -+ let mid = substitute(mid, s:notslash . '\zs\\(', '\\%(', 'g') -+ let fin = substitute(fin, s:notslash . '\zs\\(', '\\%(', 'g') -+ " Set mid. This is optimized for readability, not micro-efficiency! -+ if a:forward && matchline =~ prefix . fin . suffix -+ \ || !a:forward && matchline =~ prefix . ini . suffix -+ let mid = "" -+ endif -+ " Set flag. This is optimized for readability, not micro-efficiency! -+ if a:forward && matchline =~ prefix . fin . suffix -+ \ || !a:forward && matchline !~ prefix . ini . suffix -+ let flag = "bW" -+ else -+ let flag = "W" -+ endif -+ " Set skip. -+ if exists("b:match_skip") -+ let skip = b:match_skip -+ elseif exists("b:match_comment") " backwards compatibility and testing! -+ let skip = "r:" . b:match_comment -+ else -+ let skip = 's:comment\|string' -+ endif -+ let skip = s:ParseSkip(skip) -+ if exists("b:match_debug") -+ let b:match_ini = ini -+ let b:match_tail = (strlen(mid) ? mid.'\|' : '') . fin -+ endif -+ -+ " Fifth step: actually start moving the cursor and call searchpair(). -+ " Later, :execute restore_cursor to get to the original screen. -+ let restore_cursor = virtcol(".") . "|" -+ normal! g0 -+ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor -+ normal! H -+ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor -+ execute restore_cursor -+ call cursor(0, curcol + 1) -+ " normal! 0 -+ " if curcol -+ " execute "normal!" . curcol . "l" -+ " endif -+ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on")) -+ let skip = "0" -+ else -+ execute "if " . skip . "| let skip = '0' | endif" -+ endif -+ let sp_return = searchpair(ini, mid, fin, flag, skip) -+ let final_position = "call cursor(" . line(".") . "," . col(".") . ")" -+ " Restore cursor position and original screen. -+ execute restore_cursor -+ normal! m' -+ if sp_return > 0 -+ execute final_position -+ endif -+ return s:CleanUp(restore_options, a:mode, startline, startcol, mid.'\|'.fin) -+endfun -+ -+" Restore options and do some special handling for Operator-pending mode. -+" The optional argument is the tail of the matching group. -+fun! s:CleanUp(options, mode, startline, startcol, ...) -+ execute "set" a:options -+ " Open folds, if appropriate. -+ if a:mode != "o" -+ if &foldopen =~ "percent" -+ normal! zv -+ endif -+ " In Operator-pending mode, we want to include the whole match -+ " (for example, d%). -+ " This is only a problem if we end up moving in the forward direction. -+ elseif (a:startline < line(".")) || -+ \ (a:startline == line(".") && a:startcol < col(".")) -+ if a:0 -+ " Check whether the match is a single character. If not, move to the -+ " end of the match. -+ let matchline = getline(".") -+ let currcol = col(".") -+ let regexp = s:Wholematch(matchline, a:1, currcol-1) -+ let endcol = matchend(matchline, regexp) -+ if endcol > currcol " This is NOT off by one! -+ execute "normal!" . (endcol - currcol) . "l" -+ endif -+ endif " a:0 -+ endif " a:mode != "o" && etc. -+ return 0 -+endfun -+ -+" Example (simplified HTML patterns): if -+" a:groupBR = '<\(\k\+\)>:' -+" a:prefix = '^.\{3}\(' -+" a:group = '<\(\k\+\)>:' -+" a:suffix = '\).\{2}$' -+" a:matchline = "12312" or "12312" -+" then extract "tag" from a:matchline and return ":" . -+fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline) -+ if a:matchline !~ a:prefix . -+ \ substitute(a:group, s:notslash . '\zs:', '\\|', 'g') . a:suffix -+ return a:group -+ endif -+ let i = matchend(a:groupBR, s:notslash . ':') -+ let ini = strpart(a:groupBR, 0, i-1) -+ let tailBR = strpart(a:groupBR, i) -+ let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix, -+ \ a:groupBR) -+ let i = matchend(word, s:notslash . ":") -+ let wordBR = strpart(word, i) -+ let word = strpart(word, 0, i-1) -+ " Now, a:matchline =~ a:prefix . word . a:suffix -+ if wordBR != ini -+ let table = s:Resolve(ini, wordBR, "table") -+ else -+ " let table = "----------" -+ let table = "" -+ let d = 0 -+ while d < 10 -+ if tailBR =~ s:notslash . '\\' . d -+ " let table[d] = d -+ let table = table . d -+ else -+ let table = table . "-" -+ endif -+ let d = d + 1 -+ endwhile -+ endif -+ let d = 9 -+ while d -+ if table[d] != "-" -+ let backref = substitute(a:matchline, a:prefix.word.a:suffix, -+ \ '\'.table[d], "") -+ " Are there any other characters that should be escaped? -+ let backref = escape(backref, '*,:') -+ execute s:Ref(ini, d, "start", "len") -+ let ini = strpart(ini, 0, start) . backref . strpart(ini, start+len) -+ let tailBR = substitute(tailBR, s:notslash . '\zs\\' . d, -+ \ escape(backref, '\\'), 'g') -+ endif -+ let d = d-1 -+ endwhile -+ if exists("b:match_debug") -+ if s:do_BR -+ let b:match_table = table -+ let b:match_word = word -+ else -+ let b:match_table = "" -+ let b:match_word = "" -+ endif -+ endif -+ return ini . ":" . tailBR -+endfun -+ -+" Input a comma-separated list of groups with backrefs, such as -+" a:groups = '\(foo\):end\1,\(bar\):end\1' -+" and return a comma-separated list of groups with backrefs replaced: -+" return '\(foo\):end\(foo\),\(bar\):end\(bar\)' -+fun! s:ParseWords(groups) -+ let groups = substitute(a:groups.",", s:notslash.'\zs[,:]*,[,:]*', ',', 'g') -+ let groups = substitute(groups, s:notslash . '\zs:\{2,}', ':', 'g') -+ let parsed = "" -+ while groups =~ '[^,:]' -+ let i = matchend(groups, s:notslash . ':') -+ let j = matchend(groups, s:notslash . ',') -+ let ini = strpart(groups, 0, i-1) -+ let tail = strpart(groups, i, j-i-1) . ":" -+ let groups = strpart(groups, j) -+ let parsed = parsed . ini -+ let i = matchend(tail, s:notslash . ':') -+ while i != -1 -+ " In 'if:else:endif', ini='if' and word='else' and then word='endif'. -+ let word = strpart(tail, 0, i-1) -+ let tail = strpart(tail, i) -+ let i = matchend(tail, s:notslash . ':') -+ let parsed = parsed . ":" . s:Resolve(ini, word, "word") -+ endwhile " Now, tail has been used up. -+ let parsed = parsed . "," -+ endwhile " groups =~ '[^,:]' -+ return parsed -+endfun -+ -+" TODO I think this can be simplified and/or made more efficient. -+" TODO What should I do if a:start is out of range? -+" Return a regexp that matches all of a:string, such that -+" matchstr(a:string, regexp) represents the match for a:pat that starts -+" as close to a:start as possible, before being preferred to after, and -+" ends after a:start . -+" Usage: -+" let regexp = s:Wholematch(getline("."), 'foo\|bar', col(".")-1) -+" let i = match(getline("."), regexp) -+" let j = matchend(getline("."), regexp) -+" let match = matchstr(getline("."), regexp) -+fun! s:Wholematch(string, pat, start) -+ let group = '\%(' . a:pat . '\)' -+ let prefix = (a:start ? '\(^.*\%<' . (a:start + 2) . 'c\)\zs' : '^') -+ let len = strlen(a:string) -+ let suffix = (a:start+1 < len ? '\(\%>'.(a:start+1).'c.*$\)\@=' : '$') -+ if a:string !~ prefix . group . suffix -+ let prefix = '' -+ endif -+ return prefix . group . suffix -+endfun -+ -+" No extra arguments: s:Ref(string, d) will -+" find the d'th occurrence of '\(' and return it, along with everything up -+" to and including the matching '\)'. -+" One argument: s:Ref(string, d, "start") returns the index of the start -+" of the d'th '\(' and any other argument returns the length of the group. -+" Two arguments: s:Ref(string, d, "foo", "bar") returns a string to be -+" executed, having the effect of -+" :let foo = s:Ref(string, d, "start") -+" :let bar = s:Ref(string, d, "len") -+fun! s:Ref(string, d, ...) -+ let len = strlen(a:string) -+ if a:d == 0 -+ let start = 0 -+ else -+ let cnt = a:d -+ let match = a:string -+ while cnt -+ let cnt = cnt - 1 -+ let index = matchend(match, s:notslash . '\\(') -+ if index == -1 -+ return "" -+ endif -+ let match = strpart(match, index) -+ endwhile -+ let start = len - strlen(match) -+ if a:0 == 1 && a:1 == "start" -+ return start - 2 -+ endif -+ let cnt = 1 -+ while cnt -+ let index = matchend(match, s:notslash . '\\(\|\\)') - 1 -+ if index == -2 -+ return "" -+ endif -+ " Increment if an open, decrement if a ')': -+ let cnt = cnt + (match[index]=="(" ? 1 : -1) " ')' -+ " let cnt = stridx('0(', match[index]) + cnt -+ let match = strpart(match, index+1) -+ endwhile -+ let start = start - 2 -+ let len = len - start - strlen(match) -+ endif -+ if a:0 == 1 -+ return len -+ elseif a:0 == 2 -+ return "let " . a:1 . "=" . start . "| let " . a:2 . "=" . len -+ else -+ return strpart(a:string, start, len) -+ endif -+endfun -+ -+" Count the number of disjoint copies of pattern in string. -+" If the pattern is a literal string and contains no '0' or '1' characters -+" then s:Count(string, pattern, '0', '1') should be faster than -+" s:Count(string, pattern). -+fun! s:Count(string, pattern, ...) -+ let pat = escape(a:pattern, '\\') -+ if a:0 > 1 -+ let foo = substitute(a:string, '[^'.a:pattern.']', "a:1", "g") -+ let foo = substitute(a:string, pat, a:2, "g") -+ let foo = substitute(foo, '[^' . a:2 . ']', "", "g") -+ return strlen(foo) -+ endif -+ let result = 0 -+ let foo = a:string -+ let index = matchend(foo, pat) -+ while index != -1 -+ let result = result + 1 -+ let foo = strpart(foo, index) -+ let index = matchend(foo, pat) -+ endwhile -+ return result -+endfun -+ -+" s:Resolve('\(a\)\(b\)', '\(c\)\2\1\1\2') should return table.word, where -+" word = '\(c\)\(b\)\(a\)\3\2' and table = '-32-------'. That is, the first -+" '\1' in target is replaced by '\(a\)' in word, table[1] = 3, and this -+" indicates that all other instances of '\1' in target are to be replaced -+" by '\3'. The hard part is dealing with nesting... -+" Note that ":" is an illegal character for source and target, -+" unless it is preceded by "\". -+fun! s:Resolve(source, target, output) -+ let word = a:target -+ let i = matchend(word, s:notslash . '\\\d') - 1 -+ let table = "----------" -+ while i != -2 " There are back references to be replaced. -+ let d = word[i] -+ let backref = s:Ref(a:source, d) -+ " The idea is to replace '\d' with backref. Before we do this, -+ " replace any \(\) groups in backref with :1, :2, ... if they -+ " correspond to the first, second, ... group already inserted -+ " into backref. Later, replace :1 with \1 and so on. The group -+ " number w+b within backref corresponds to the group number -+ " s within a:source. -+ " w = number of '\(' in word before the current one -+ let w = s:Count( -+ \ substitute(strpart(word, 0, i-1), '\\\\', '', 'g'), '\(', '1') -+ let b = 1 " number of the current '\(' in backref -+ let s = d " number of the current '\(' in a:source -+ while b <= s:Count(substitute(backref, '\\\\', '', 'g'), '\(', '1') -+ \ && s < 10 -+ if table[s] == "-" -+ if w + b < 10 -+ " let table[s] = w + b -+ let table = strpart(table, 0, s) . (w+b) . strpart(table, s+1) -+ endif -+ let b = b + 1 -+ let s = s + 1 -+ else -+ execute s:Ref(backref, b, "start", "len") -+ let ref = strpart(backref, start, len) -+ let backref = strpart(backref, 0, start) . ":". table[s] -+ \ . strpart(backref, start+len) -+ let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1') -+ endif -+ endwhile -+ let word = strpart(word, 0, i-1) . backref . strpart(word, i+1) -+ let i = matchend(word, s:notslash . '\\\d') - 1 -+ endwhile -+ let word = substitute(word, s:notslash . '\zs:', '\\', 'g') -+ if a:output == "table" -+ return table -+ elseif a:output == "word" -+ return word -+ else -+ return table . word -+ endif -+endfun -+ -+" Assume a:comma = ",". Then the format for a:patterns and a:1 is -+" a:patterns = ",,..." -+" a:1 = ",,..." -+" If is the first pattern that matches a:string then return -+" if no optional arguments are given; return , if a:1 is given. -+fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...) -+ let tail = (a:patterns =~ a:comma."$" ? a:patterns : a:patterns . a:comma) -+ let i = matchend(tail, s:notslash . a:comma) -+ if a:0 -+ let alttail = (a:1 =~ a:comma."$" ? a:1 : a:1 . a:comma) -+ let j = matchend(alttail, s:notslash . a:comma) -+ endif -+ let current = strpart(tail, 0, i-1) -+ if a:branch == "" -+ let currpat = current -+ else -+ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') -+ endif -+ while a:string !~ a:prefix . currpat . a:suffix -+ let tail = strpart(tail, i) -+ let i = matchend(tail, s:notslash . a:comma) -+ if i == -1 -+ return -1 -+ endif -+ let current = strpart(tail, 0, i-1) -+ if a:branch == "" -+ let currpat = current -+ else -+ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') -+ endif -+ if a:0 -+ let alttail = strpart(alttail, j) -+ let j = matchend(alttail, s:notslash . a:comma) -+ endif -+ endwhile -+ if a:0 -+ let current = current . a:comma . strpart(alttail, 0, j-1) -+ endif -+ return current -+endfun -+ -+" Call this function to turn on debugging information. Every time the main -+" script is run, buffer variables will be saved. These can be used directly -+" or viewed using the menu items below. -+if !exists(":MatchDebug") -+ command! -nargs=0 MatchDebug call s:Match_debug() -+endif -+ -+fun! s:Match_debug() -+ let b:match_debug = 1 " Save debugging information. -+ " pat = all of b:match_words with backrefs parsed -+ amenu &Matchit.&pat :echo b:match_pat -+ " match = bit of text that is recognized as a match -+ amenu &Matchit.&match :echo b:match_match -+ " curcol = cursor column of the start of the matching text -+ amenu &Matchit.&curcol :echo b:match_col -+ " wholeBR = matching group, original version -+ amenu &Matchit.wh&oleBR :echo b:match_wholeBR -+ " iniBR = 'if' piece, original version -+ amenu &Matchit.ini&BR :echo b:match_iniBR -+ " ini = 'if' piece, with all backrefs resolved from match -+ amenu &Matchit.&ini :echo b:match_ini -+ " tail = 'else\|endif' piece, with all backrefs resolved from match -+ amenu &Matchit.&tail :echo b:match_tail -+ " fin = 'endif' piece, with all backrefs resolved from match -+ amenu &Matchit.&word :echo b:match_word -+ " '\'.d in ini refers to the same thing as '\'.table[d] in word. -+ amenu &Matchit.t&able :echo '0:' . b:match_table . ':9' -+endfun -+ -+" Jump to the nearest unmatched "(" or "if" or "" if a:spflag == "bW" -+" or the nearest unmatched "" or "endif" or ")" if a:spflag == "W". -+" Return a "mark" for the original position, so that -+" let m = MultiMatch("bW", "n") ... execute m -+" will return to the original position. If there is a problem, do not -+" move the cursor and return "", unless a count is given, in which case -+" go up or down as many levels as possible and again return "". -+" TODO This relies on the same patterns as % matching. It might be a good -+" idea to give it its own matching patterns. -+fun! s:MultiMatch(spflag, mode) -+ if !exists("b:match_words") || b:match_words == "" -+ return "" -+ end -+ let restore_options = (&ic ? "" : "no") . "ignorecase" -+ if exists("b:match_ignorecase") -+ let &ignorecase = b:match_ignorecase -+ endif -+ let startline = line(".") -+ let startcol = col(".") -+ -+ " First step: if not already done, set the script variables -+ " s:do_BR flag for whether there are backrefs -+ " s:pat parsed version of b:match_words -+ " s:all regexp based on s:pat and the default groups -+ " This part is copied and slightly modified from s:Match_wrapper(). -+ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . -+ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' -+ " Allow b:match_words = "GetVimMatchWords()" . -+ if b:match_words =~ ":" -+ let match_words = b:match_words -+ else -+ execute "let match_words =" b:match_words -+ endif -+ if (match_words != s:last_words) || (&mps != s:last_mps) || -+ \ exists("b:match_debug") -+ let s:last_words = match_words -+ let s:last_mps = &mps -+ if match_words !~ s:notslash . '\\\d' -+ let s:do_BR = 0 -+ let s:pat = match_words -+ else -+ let s:do_BR = 1 -+ let s:pat = s:ParseWords(match_words) -+ endif -+ let s:all = '\%(' . substitute(s:pat . (strlen(s:pat)?",":"") . default, -+ \ '[,:]\+','\\|','g') . '\)' -+ if exists("b:match_debug") -+ let b:match_pat = s:pat -+ endif -+ endif -+ -+ " Second step: figure out the patterns for searchpair() -+ " and save the screen, cursor position, and 'ignorecase'. -+ " - TODO: A lot of this is copied from s:Match_wrapper(). -+ " - maybe even more functionality should be split off -+ " - into separate functions! -+ let cdefault = (s:pat =~ '[^,]$' ? "," : "") . default -+ let open = substitute(s:pat . cdefault, -+ \ s:notslash . '\zs:.\{-}' . s:notslash . ',', '\\),\\(', 'g') -+ let open = '\(' . substitute(open, s:notslash . '\zs:.*$', '\\)', '') -+ let close = substitute(s:pat . cdefault, -+ \ s:notslash . '\zs,.\{-}' . s:notslash . ':', '\\),\\(', 'g') -+ let close = substitute(close, '^.\{-}' . s:notslash . ':', '\\(', '') . '\)' -+ if exists("b:match_skip") -+ let skip = b:match_skip -+ elseif exists("b:match_comment") " backwards compatibility and testing! -+ let skip = "r:" . b:match_comment -+ else -+ let skip = 's:comment\|string' -+ endif -+ let skip = s:ParseSkip(skip) -+ " let restore_cursor = line(".") . "G" . virtcol(".") . "|" -+ " normal! H -+ " let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor -+ let restore_cursor = virtcol(".") . "|" -+ normal! g0 -+ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor -+ normal! H -+ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor -+ execute restore_cursor -+ -+ " Third step: call searchpair(). -+ " Replace '\('--but not '\\('--with '\%(' and ',' with '\|'. -+ let openpat = substitute(open, '\(\\\@" or ... -+" and return "endif" or "endwhile" or "" or ... . -+" For now, this uses b:match_words and the same script variables -+" as s:Match_wrapper() . Later, it may get its own patterns, -+" either from a buffer variable or passed as arguments. -+" fun! s:Autocomplete() -+" echo "autocomplete not yet implemented :-(" -+" if !exists("b:match_words") || b:match_words == "" -+" return "" -+" end -+" let startpos = s:MultiMatch("bW") -+" -+" if startpos == "" -+" return "" -+" endif -+" " - TODO: figure out whether 'if' or '' matched, and construct -+" " - the appropriate closing. -+" let matchline = getline(".") -+" let curcol = col(".") - 1 -+" " - TODO: Change the s:all argument if there is a new set of match pats. -+" let regexp = s:Wholematch(matchline, s:all, curcol) -+" let suf = strlen(matchline) - matchend(matchline, regexp) -+" let prefix = (curcol ? '^.\{' . curcol . '}\%(' : '^\%(') -+" let suffix = (suf ? '\).\{' . suf . '}$' : '\)$') -+" " Reconstruct the version with unresolved backrefs. -+" let patBR = substitute(b:match_words.',', '[,:]*,[,:]*', ',', 'g') -+" let patBR = substitute(patBR, ':\{2,}', ':', "g") -+" " Now, set group and groupBR to the matching group: 'if:endif' or -+" " 'while:endwhile' or whatever. -+" let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) -+" let i = matchend(group, s:notslash . ",") -+" let groupBR = strpart(group, i) -+" let group = strpart(group, 0, i-1) -+" " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix -+" if s:do_BR -+" let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) -+" endif -+" " let g:group = group -+" -+" " - TODO: Construct the closing from group. -+" let fake = "end" . expand("") -+" execute startpos -+" return fake -+" endfun -+ -+" Close all open structures. "Get the heck out of here!" -+" fun! s:Gthhoh() -+" let close = s:Autocomplete() -+" while strlen(close) -+" put=close -+" let close = s:Autocomplete() -+" endwhile -+" endfun -+ -+" Parse special strings as typical skip arguments for searchpair(): -+" s:foo becomes (current syntax item) =~ foo -+" S:foo becomes (current syntax item) !~ foo -+" r:foo becomes (line before cursor) =~ foo -+" R:foo becomes (line before cursor) !~ foo -+fun! s:ParseSkip(str) -+ let skip = a:str -+ if skip[1] == ":" -+ if skip[0] == "s" -+ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" . -+ \ strpart(skip,2) . "'" -+ elseif skip[0] == "S" -+ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" . -+ \ strpart(skip,2) . "'" -+ elseif skip[0] == "r" -+ let skip = "strpart(getline('.'),0,col('.'))=~'" . strpart(skip,2). "'" -+ elseif skip[0] == "R" -+ let skip = "strpart(getline('.'),0,col('.'))!~'" . strpart(skip,2). "'" -+ endif -+ endif -+ return skip -+endfun -+ -+let &cpo = s:save_cpo -+ -+" vim:sts=2:sw=2: -diff -urN vim71/1/plugin/NERD_commenter.vim vim71_ada/1/plugin/NERD_commenter.vim ---- vim71/1/plugin/NERD_commenter.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/NERD_commenter.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,4553 @@ -+" vim global plugin that provides easy code commenting for various file types -+" Last Change: 29 sep 2007 -+" Maintainer: Martin Grenfell -+let s:NERD_commenter_version = 2.1.4 -+ -+" For help documentation type :help NERDCommenter. If this fails, Restart vim -+" and try again. If it sill doesnt work... the help page is at the bottom -+" of this file. -+ -+" Section: script init stuff {{{1 -+if exists("loaded_nerd_comments") -+ finish -+endif -+if v:version < 700 -+ echoerr "NERDCommenter: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!" -+ finish -+endif -+let loaded_nerd_comments = 1 -+ -+" Section: spaces init {{{2 -+" Occasionally we need to grab a string of spaces so just make one here -+let s:spaces = "" -+while strlen(s:spaces) < 100 -+ let s:spaces = s:spaces . " " -+endwhile -+ -+" Function: s:InitVariable() function {{{2 -+" This function is used to initialise a given variable to a given value. The -+" variable is only initialised if it does not exist prior -+" -+" Args: -+" -var: the name of the var to be initialised -+" -value: the value to initialise var to -+" -+" Returns: -+" 1 if the var is set, 0 otherwise -+function s:InitVariable(var, value) -+ if !exists(a:var) -+ exec 'let ' . a:var . ' = ' . "'" . a:value . "'" -+ return 1 -+ endif -+ return 0 -+endfunction -+ -+" Section: space string init{{{2 -+" When putting spaces after the left delim and before the right we use -+" s:spaceStr for the space char. This way we can make it add anything after -+" the left and before the right by modifying this variable -+let s:spaceStr = ' ' -+let s:lenSpaceStr = strlen(s:spaceStr) -+ -+" Section: variable init calls {{{2 -+call s:InitVariable("g:NERDAllowAnyVisualDelims", 1) -+call s:InitVariable("g:NERDBlockComIgnoreEmpty", 0) -+call s:InitVariable("g:NERDCommentWholeLinesInVMode", 0) -+call s:InitVariable("g:NERDCompactSexyComs", 0) -+call s:InitVariable("g:NERDDefaultNesting", 0) -+call s:InitVariable("g:NERDMenuMode", 3) -+call s:InitVariable("g:NERDLPlace", "[>") -+call s:InitVariable("g:NERDUsePlaceHolders", 1) -+call s:InitVariable("g:NERDRemoveAltComs", 1) -+call s:InitVariable("g:NERDRemoveExtraSpaces", 0) -+call s:InitVariable("g:NERDRPlace", "<]") -+call s:InitVariable("g:NERDShutUp", '0') -+call s:InitVariable("g:NERDSpaceDelims", 0) -+call s:InitVariable("g:NERDDelimiterRequests", 1) -+ -+call s:InitVariable("g:NERDMapleader", ',c') -+ -+call s:InitVariable("g:NERDAltComMap", g:NERDMapleader . 'a') -+call s:InitVariable("g:NERDAppendComMap", g:NERDMapleader . 'A') -+call s:InitVariable("g:NERDComAlignBothMap", g:NERDMapleader . 'b') -+call s:InitVariable("g:NERDComAlignLeftMap", g:NERDMapleader . 'l') -+call s:InitVariable("g:NERDComAlignRightMap", g:NERDMapleader . 'r') -+call s:InitVariable("g:NERDComInInsertMap", '') -+call s:InitVariable("g:NERDComLineInvertMap", g:NERDMapleader . 'i') -+call s:InitVariable("g:NERDComLineMap", g:NERDMapleader . 'c') -+call s:InitVariable("g:NERDComLineNestMap", g:NERDMapleader . 'n') -+call s:InitVariable("g:NERDComLineSexyMap", g:NERDMapleader . 's') -+call s:InitVariable("g:NERDComLineToggleMap", g:NERDMapleader . '') -+call s:InitVariable("g:NERDComLineMinimalMap", g:NERDMapleader . 'm') -+call s:InitVariable("g:NERDComLineYankMap", g:NERDMapleader . 'y') -+call s:InitVariable("g:NERDComToEOLMap", g:NERDMapleader . '$') -+call s:InitVariable("g:NERDPrependComMap", g:NERDMapleader . 'I') -+call s:InitVariable("g:NERDUncomLineMap", g:NERDMapleader . 'u') -+let s:NERDFileNameEscape="[]#*$%'\" ?`!&();<>\\" -+ -+" Section: Comment mapping functions, autocommands and commands {{{1 -+" ============================================================================ -+" Section: Comment enabler autocommands {{{2 -+" ============================================================================ -+ -+if !exists("nerd_autocmds_loaded") -+ let nerd_autocmds_loaded=1 -+ -+ augroup commentEnablers -+ -+ "if the user enters a buffer or reads a buffer then we gotta set up -+ "the comment delimiters for that new filetype -+ autocmd BufEnter,BufRead * :call s:SetUpForNewFiletype(&filetype, 0) -+ -+ "if the filetype of a buffer changes, force the script to reset the -+ "delims for the buffer -+ autocmd Filetype * :call s:SetUpForNewFiletype(&filetype, 1) -+ augroup END -+ -+endif -+ -+ -+" Function: s:SetUpForNewFiletype(filetype) function {{{2 -+" This function is responsible for setting up buffer scoped variables for the -+" given filetype. -+" -+" These variables include the comment delimiters for the given filetype and calls -+" MapDelimiters or MapDelimitersWithAlternative passing in these delimiters. -+" -+" Args: -+" -filetype: the filetype to set delimiters for -+" -forceReset: 1 if the delimiters should be reset if they have already be -+" set for this buffer. -+" -+function s:SetUpForNewFiletype(filetype, forceReset) -+ "if we have already set the delimiters for this buffer then dont go thru -+ "it again -+ if !a:forceReset && exists("b:left") && b:left != '' -+ return -+ endif -+ -+ let b:sexyComMarker = '' -+ -+ "check the filetype against all known filetypes to see if we have -+ "hardcoded the comment delimiters to use -+ if a:filetype == "" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "abaqus" -+ call s:MapDelimiters('**', '') -+ elseif a:filetype == "abc" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "acedb" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "ada" -+ call s:MapDelimitersWithAlternative('--','', '-- ', '') -+ elseif a:filetype == "ahdl" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "ahk" -+ call s:MapDelimitersWithAlternative(';', '', '/*', '*/') -+ elseif a:filetype == "amiga" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "aml" -+ call s:MapDelimiters('/*', '') -+ elseif a:filetype == "ampl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ant" -+ call s:MapDelimiters('') -+ elseif a:filetype == "apache" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "apachestyle" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "asm68k" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "asm" -+ call s:MapDelimitersWithAlternative(';', '', '#', '') -+ elseif a:filetype == "asn" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "aspvbs" -+ call s:MapDelimiters('''', '') -+ elseif a:filetype == "atlas" -+ call s:MapDelimiters('C','$') -+ elseif a:filetype == "autohotkey" -+ call s:MapDelimiters(';','') -+ elseif a:filetype == "autoit" -+ call s:MapDelimiters(';','') -+ elseif a:filetype == "automake" -+ call s:MapDelimitersWithAlternative('#','', 'dnl ', '') -+ elseif a:filetype == "ave" -+ call s:MapDelimiters("'",'') -+ elseif a:filetype == "awk" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "basic" -+ call s:MapDelimitersWithAlternative("'",'', 'REM ', '') -+ elseif a:filetype == "b" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "bc" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "bdf" -+ call s:MapDelimiters('COMMENT ', '') -+ elseif a:filetype == "bib" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "bindzone" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "bst" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "btm" -+ call s:MapDelimiters('::', '') -+ elseif a:filetype == "caos" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "catalog" -+ call s:MapDelimiters('--','--') -+ elseif a:filetype == "c" -+ call s:MapDelimitersWithAlternative('/*','*/', '//', '') -+ elseif a:filetype == "cfg" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "cg" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "ch" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "changelog" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "cl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "clean" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "clipper" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "cmake" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "conf" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "config" -+ call s:MapDelimiters('dnl ', '') -+ elseif a:filetype == "context" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "cpp" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "crontab" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "cs" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "csc" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "csp" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "css" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "cterm" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "cupl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "csv" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "cvs" -+ call s:MapDelimiters('CVS:','') -+ elseif a:filetype == "dcl" -+ call s:MapDelimiters('$!', '') -+ elseif a:filetype == "debchangelog" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "debcontrol" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "debsources" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "def" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "desktop" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "diff" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "django" -+ call s:MapDelimitersWithAlternative('', '{#', '#}') -+ elseif a:filetype == "docbk" -+ call s:MapDelimiters('') -+ elseif a:filetype == "dns" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dosbatch" -+ call s:MapDelimiters('REM ','') -+ elseif a:filetype == "dosini" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dot" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "dracula" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dsl" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dtd" -+ call s:MapDelimiters('') -+ elseif a:filetype == "dtml" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "dylan" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == 'ebuild' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ecd" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == 'eclass' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "eiffel" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "elf" -+ call s:MapDelimiters("'", '') -+ elseif a:filetype == "elmfilt" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "erlang" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "eruby" -+ call s:MapDelimitersWithAlternative('', '<%#', '%>') -+ elseif a:filetype == "eterm" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "expect" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "exports" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fetchmail" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fgl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "focexec" -+ call s:MapDelimiters('-*', '') -+ elseif a:filetype == "form" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "fortran" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "foxpro" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "fstab" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fvwm" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fx" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "gams" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "gdb" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "gdmo" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "geek" -+ call s:MapDelimiters('GEEK_COMMENT:', '') -+ elseif a:filetype == 'gentoo-package-keywords' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == 'gentoo-package-mask' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == 'gentoo-package-use' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "gnuplot" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "groovy" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "gtkrc" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "haskell" -+ call s:MapDelimitersWithAlternative('--','', '{-', '-}') -+ elseif a:filetype == "hb" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "h" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "help" -+ call s:MapDelimiters('"','') -+ elseif a:filetype == "hercules" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "hog" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "html" -+ call s:MapDelimitersWithAlternative('', '//', '') -+ elseif a:filetype == "htmldjango" -+ call s:MapDelimitersWithAlternative('', '{#', '#}') -+ elseif a:filetype == "htmlos" -+ call s:MapDelimiters('#','/#') -+ elseif a:filetype == "ia64" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "icon" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "idlang" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "idl" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "indent" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "inform" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "inittab" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ishd" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "iss" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "ist" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "jam" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "java" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "javascript" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "jess" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "jgraph" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "jproperties" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "jsp" -+ call s:MapDelimiters('<%--', '--%>') -+ elseif a:filetype == "kconfig" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "kix" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "kscript" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "lace" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "ldif" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lex" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "lftp" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lifelines" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "lilo" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lisp" -+ call s:MapDelimitersWithAlternative(';','', '#|', '|#') -+ elseif a:filetype == "lite" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "lookupfile" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "lotos" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "lout" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lprolog" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "lscript" -+ call s:MapDelimiters("'", '') -+ elseif a:filetype == "lss" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lua" -+ call s:MapDelimitersWithAlternative('--','', '--[[', ']]') -+ elseif a:filetype == "lynx" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "m4" -+ call s:MapDelimiters('dnl ', '') -+ elseif a:filetype == "mail" -+ call s:MapDelimiters('> ','') -+ elseif a:filetype == "make" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "maple" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "masm" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "master" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "matlab" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "mel" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "mf" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "mib" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "mma" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "model" -+ call s:MapDelimiters('$','$') -+ elseif a:filetype =~ "moduala." -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "modula2" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "modula3" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "monk" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "mush" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "muttrc" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "named" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "nasm" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "nastran" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "natural" -+ call s:MapDelimiters('/*', '') -+ elseif a:filetype == "ncf" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "netdict" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "netrw" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "nqc" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "nroff" -+ call s:MapDelimiters('\"', '') -+ elseif a:filetype == "nsis" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "objc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "ocaml" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "occam" -+ call s:MapDelimiters('--','') -+ elseif a:filetype == "omlet" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "omnimark" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "openroad" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "opl" -+ call s:MapDelimiters("REM", "") -+ elseif a:filetype == "ora" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "otl" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "ox" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "pascal" -+ call s:MapDelimitersWithAlternative('{','}', '(*', '*)') -+ elseif a:filetype == "passwd" -+ call s:MapDelimitersWith('','') -+ elseif a:filetype == "pcap" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "pccts" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "perl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "pfmain" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "php" -+ call s:MapDelimitersWithAlternative('//','','/*', '*/') -+ elseif a:filetype == "phtml" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "pic" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "pike" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "pilrc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "pine" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "plaintex" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "plm" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "plsql" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "po" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "postscr" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "pov" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "povini" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "ppd" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "ppwiz" -+ call s:MapDelimiters(';;', '') -+ elseif a:filetype == "procmail" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "progress" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "prolog" -+ call s:MapDelimitersWithAlternative('%','','/*','*/') -+ elseif a:filetype == "psf" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ptcap" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "python" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "qf" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "radiance" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "Rails-log" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "ratpoison" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "r" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "readline" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rebol" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "registry" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "remind" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rexx" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "robots" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rpl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "rst" -+ call s:MapDelimiters('..', '') -+ elseif a:filetype == "rtf" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "ruby" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "sa" -+ call s:MapDelimiters('--','') -+ elseif a:filetype == "samba" -+ call s:MapDelimitersWithAlternative(';','', '#', '') -+ elseif a:filetype == "sas" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "sass" -+ call s:MapDelimitersWithAlternative('//','', '/*', '') -+ elseif a:filetype == "sather" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "scheme" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "scilab" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "screen" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "scsh" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "sdl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "sed" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "selectbuf" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "sgml" -+ call s:MapDelimiters('') -+ elseif a:filetype == "sgmldecl" -+ call s:MapDelimiters('--','--') -+ elseif a:filetype == "sgmllnx" -+ call s:MapDelimiters('') -+ elseif a:filetype == "sicad" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "simula" -+ call s:MapDelimitersWithAlternative('%', '', '--', '') -+ elseif a:filetype == "sinda" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "skill" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "slang" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "sl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "slrnrc" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "sm" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "smarty" -+ call s:MapDelimiters('{*', '*}') -+ elseif a:filetype == "smil" -+ call s:MapDelimiters('') -+ elseif a:filetype == "smith" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "sml" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "snnsnet" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "snnspat" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "snnsres" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "snobol4" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "spec" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "specman" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "spice" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "sql" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "sqlforms" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "sqlj" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "sqr" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "squid" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "st" -+ call s:MapDelimiters('"','') -+ elseif a:filetype == "stp" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "strace" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "svn" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "SVNcommitlog" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "systemverilog" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "tads" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "taglist" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "tags" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "tak" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "tasm" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "tcl" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "terminfo" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "tex" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "text" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "texinfo" -+ call s:MapDelimiters("@c ", "") -+ elseif a:filetype == "texmf" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "tf" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "tidy" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "tli" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "trasys" -+ call s:MapDelimiters("$", "") -+ elseif a:filetype == "tsalt" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "tsscl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "tssgm" -+ call s:MapDelimiters("comment = '","'") -+ elseif a:filetype == "uc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "uil" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "vb" -+ call s:MapDelimiters("'","") -+ elseif a:filetype == "vcscommit" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "vera" -+ call s:MapDelimitersWithAlternative('/*','*/','//','') -+ elseif a:filetype == "verilog" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "verilog_systemverilog" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "vgrindefs" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "vhdl" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "vim" -+ call s:MapDelimiters('"','') -+ elseif a:filetype == "viminfo" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "virata" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "vo_base" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "vrml" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "vsejcl" -+ call s:MapDelimiters('/*', '') -+ elseif a:filetype == "webmacro" -+ call s:MapDelimiters('##', '') -+ elseif a:filetype == "wget" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "winbatch" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "wml" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype =~ "[^w]*sh" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "wvdial" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "xdefaults" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "xf86conf" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "xhtml" -+ call s:MapDelimiters('') -+ elseif a:filetype == "xkb" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "xmath" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "xml" -+ call s:MapDelimiters('') -+ elseif a:filetype == "xmodmap" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "xpm2" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "xpm" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "xsd" -+ call s:MapDelimiters('') -+ elseif a:filetype == "xslt" -+ call s:MapDelimiters('') -+ elseif a:filetype == "yacc" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "yaml" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "z8a" -+ call s:MapDelimiters(';', '') -+ -+ elseif a:filetype == "" -+ call s:MapDelimitersWithAlternative("","", "", "") -+ -+ "we have not hardcoded the comment delimiters to use for this filetype so -+ "get them from &commentstring. -+ else -+ "print a disclaimer to the user :) -+ if !g:NERDShutUp -+ call s:NerdEcho("Unknown filetype '".a:filetype."', setting delimiters by &commentstring.\nPleeeeease email the author of the NERD commenter with this filetype\nand its delimiters!", 0) -+ endif -+ -+ "extract the delims from &commentstring -+ let left= substitute(&commentstring, '\(.*\)%s.*', '\1', '') -+ let right= substitute(&commentstring, '.*%s\(.*\)', '\1', 'g') -+ -+ call s:MapDelimiters(left,right) -+ endif -+endfunction -+ -+" Function: s:MapDelimiters(left, right) function {{{2 -+" This function is a wrapper for s:MapDelimiters(left, right, leftAlt, rightAlt, useAlt) and is called when there -+" is no alternative comment delimiters for the current filetype -+" -+" Args: -+" -left: the left comment delimiter -+" -right: the right comment delimiter -+function s:MapDelimiters(left, right) -+ call s:MapDelimitersWithAlternative(a:left, a:right, "", "") -+endfunction -+ -+" Function: s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) function {{{2 -+" this function sets up the comment delimiter buffer variables -+" -+" Args: -+" -left: the string defining the comment start delimiter -+" -right: the string defining the comment end delimiter -+" -leftAlt: the string for the alternative comment style defining the comment start delimiter -+" -rightAlt: the string for the alternative comment style defining the comment end delimiter -+function s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) -+ if !exists('g:NERD_' . &filetype . '_alt_style') -+ let b:left = a:left -+ let b:right = a:right -+ let b:leftAlt = a:leftAlt -+ let b:rightAlt = a:rightAlt -+ else -+ let b:left = a:leftAlt -+ let b:right = a:rightAlt -+ let b:leftAlt = a:left -+ let b:rightAlt = a:right -+ endif -+endfunction -+ -+" Function: s:SwitchToAlternativeDelimiters(printMsgs) function {{{2 -+" This function is used to swap the delimiters that are being used to the -+" alternative delimiters for that filetype. For example, if a c++ file is -+" being edited and // comments are being used, after this function is called -+" /**/ comments will be used. -+" -+" Args: -+" -printMsgs: if this is 1 then a message is echoed to the user telling them -+" if this function changed the delimiters or not -+function s:SwitchToAlternativeDelimiters(printMsgs) -+ "if both of the alternative delimiters are empty then there is no -+ "alternative comment style so bail out -+ if !s:HasMultipartDelims() -+ if a:printMsgs -+ call s:NerdEcho("Cannot use alternative delimiters, none are specified", 0) -+ endif -+ return 0 -+ endif -+ -+ "save the current delimiters -+ let tempLeft = b:left -+ let tempRight = b:right -+ -+ "swap current delimiters for alternative -+ let b:left = b:leftAlt -+ let b:right = b:rightAlt -+ -+ "set the previously current delimiters to be the new alternative ones -+ let b:leftAlt = tempLeft -+ let b:rightAlt = tempRight -+ -+ "tell the user what comment delimiters they are now using -+ if a:printMsgs -+ let leftNoEsc = b:left -+ let rightNoEsc = b:right -+ call s:NerdEcho("Now using " . leftNoEsc . " " . rightNoEsc . " to delimit comments", 1) -+ endif -+ -+ return 1 -+endfunction -+ -+" Section: Comment delimiter add/removal functions {{{1 -+" ============================================================================ -+" Function: s:AppendCommentToLine(){{{2 -+" This function appends comment delimiters at the EOL and places the cursor in -+" position to start typing the comment -+function s:AppendCommentToLine() -+ let left = s:GetLeft(0,1,0) -+ let right = s:GetRight(0,1,0) -+ -+ " get the len of the right delim -+ let lenRight = strlen(right) -+ -+ let isLineEmpty = strlen(getline(".")) == 0 -+ let insOrApp = (isLineEmpty==1 ? 'i' : 'A') -+ -+ "stick the delimiters down at the end of the line. We have to format the -+ "comment with spaces as appropriate -+ execute ":normal " . insOrApp . (isLineEmpty ? '' : ' ') . left . right . " " -+ -+ " if there is a right delimiter then we gotta move the cursor left -+ " by the len of the right delimiter so we insert between the delimiters -+ if lenRight > 0 -+ let leftMoveAmount = lenRight -+ execute ":normal " . leftMoveAmount . "h" -+ endif -+ startinsert -+endfunction -+ -+" Function: s:CommentBlock(top, bottom, lSide, rSide, forceNested ) {{{2 -+" This function is used to comment out a region of code. This region is -+" specified as a bounding box by arguments to the function. -+" -+" Args: -+" -top: the line number for the top line of code in the region -+" -bottom: the line number for the bottom line of code in the region -+" -lSide: the column number for the left most column in the region -+" -rSide: the column number for the right most column in the region -+" -forceNested: a flag indicating whether comments should be nested -+function s:CommentBlock(top, bottom, lSide, rSide, forceNested ) -+ " we need to create local copies of these arguments so we can modify them -+ let top = a:top -+ let bottom = a:bottom -+ let lSide = a:lSide -+ let rSide = a:rSide -+ -+ "if the top or bottom line starts with tabs we have to adjust the left and -+ "right boundaries so that they are set as though the tabs were spaces -+ let topline = getline(top) -+ let bottomline = getline(bottom) -+ if s:HasLeadingTabs(topline, bottomline) -+ -+ "find out how many tabs are in the top line and adjust the left -+ "boundary accordingly -+ let numTabs = s:NumberOfLeadingTabs(topline) -+ if lSide < numTabs -+ let lSide = &ts * lSide -+ else -+ let lSide = (lSide - numTabs) + (&ts * numTabs) -+ endif -+ -+ "find out how many tabs are in the bottom line and adjust the right -+ "boundary accordingly -+ let numTabs = s:NumberOfLeadingTabs(bottomline) -+ let rSide = (rSide - numTabs) + (&ts * numTabs) -+ endif -+ -+ "we must check that bottom IS actually below top, if it is not then we -+ "swap top and bottom. Similarly for left and right. -+ if bottom < top -+ let temp = top -+ let top = bottom -+ let bottom = top -+ endif -+ if rSide < lSide -+ let temp = lSide -+ let lSide = rSide -+ let rSide = temp -+ endif -+ -+ "if the current delimiters arent multipart then we will switch to the -+ "alternative delims (if THEY are) as the comment will be better and more -+ "accurate with multipart delims -+ let switchedDelims = 0 -+ if !s:Multipart() && g:NERDAllowAnyVisualDelims && s:AltMultipart() -+ let switchedDelims = 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+ -+ "start the commenting from the top and keep commenting till we reach the -+ "bottom -+ let currentLine=top -+ while currentLine <= bottom -+ -+ "check if we are allowed to comment this line -+ if s:CanCommentLine(a:forceNested, currentLine) -+ -+ "convert the leading tabs into spaces -+ let theLine = getline(currentLine) -+ let lineHasLeadTabs = s:HasLeadingTabs(theLine) -+ if lineHasLeadTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ -+ "dont comment lines that begin after the right boundary of the -+ "block unless the user has specified to do so -+ if theLine !~ '^ \{' . rSide . '\}' || !g:NERDBlockComIgnoreEmpty -+ -+ "attempt to place the cursor in on the left of the boundary box, -+ "then check if we were successful, if not then we cant comment this -+ "line -+ call setline(currentLine, theLine) -+ if s:CanPlaceCursor(currentLine, lSide) -+ -+ let leftSpaced = s:GetLeft(0,1,0) -+ let rightSpaced = s:GetRight(0,1,0) -+ -+ "stick the left delimiter down -+ let theLine = strpart(theLine, 0, lSide-1) . leftSpaced . strpart(theLine, lSide-1) -+ -+ if s:Multipart() -+ "stick the right delimiter down -+ let theLine = strpart(theLine, 0, rSide+strlen(leftSpaced)) . rightSpaced . strpart(theLine, rSide+strlen(rightSpaced)) -+ -+ let firstLeftDelim = s:FindDelimiterIndex(b:left, theLine) -+ let lastRightDelim = s:LastIndexOfDelim(b:right, theLine) -+ -+ if firstLeftDelim != -1 && lastRightDelim != -1 -+ let searchStr = strpart(theLine, 0, lastRightDelim) -+ let searchStr = strpart(searchStr, firstLeftDelim+strlen(b:left)) -+ -+ "replace the outter most delims in searchStr with -+ "place-holders -+ let theLineWithPlaceHolders = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, searchStr) -+ -+ "add the right delimiter onto the line -+ let theLine = strpart(theLine, 0, firstLeftDelim+strlen(b:left)) . theLineWithPlaceHolders . strpart(theLine, lastRightDelim) -+ endif -+ endif -+ endif -+ endif -+ -+ "restore tabs if needed -+ if lineHasLeadTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ call setline(currentLine, theLine) -+ endif -+ -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ "if we switched delims then we gotta go back to what they were before -+ if switchedDelims == 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+endfunction -+ -+" Function: s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) {{{2 -+" This function comments a range of lines. -+" -+" Args: -+" -forceNested: a flag indicating whether the called is requesting the comment -+" to be nested if need be -+" -alignRight/alignLeft: 0/1 if the comments delimiters should/shouldnt be -+" aligned left/right -+" -firstLine/lastLine: the top and bottom lines to comment -+function s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) -+ " we need to get the left and right indexes of the leftmost char in the -+ " block of of lines and the right most char so that we can do alignment of -+ " the delimiters if the user has specified -+ let leftAlignIndx = s:LeftMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) -+ let rightAlignIndx = s:RightMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) -+ -+ " gotta add the length of the left delimiter onto the rightAlignIndx cos -+ " we'll be adding a left delim to the line -+ let rightAlignIndx = rightAlignIndx + strlen(s:GetLeft(0,1,0)) -+ -+ " now we actually comment the lines. Do it line by line -+ let currentLine = a:firstLine -+ while currentLine <= a:lastLine -+ -+ " get the next line, check commentability and convert spaces to tabs -+ let theLine = getline(currentLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ if s:CanCommentLine(a:forceNested, currentLine) -+ "if the user has specified forceNesting then we check to see if we -+ "need to switch delimiters for place-holders -+ if a:forceNested && g:NERDUsePlaceHolders -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ endif -+ -+ " find out if the line is commented using normal delims and/or -+ " alternate ones -+ let isCommented = s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) -+ -+ " check if we can comment this line -+ if !isCommented || g:NERDUsePlaceHolders || s:Multipart() -+ if a:alignLeft -+ let theLine = s:AddLeftDelimAligned(b:left, theLine, leftAlignIndx) -+ else -+ let theLine = s:AddLeftDelim(s:GetLeft(0,1,0), theLine) -+ endif -+ if a:alignRight -+ let theLine = s:AddRightDelimAligned(b:right, theLine, rightAlignIndx) -+ else -+ let theLine = s:AddRightDelim(s:GetRight(0,1,0), theLine) -+ endif -+ endif -+ endif -+ -+ " restore leading tabs if appropriate -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ " we are done with this line -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+endfunction -+ -+" Function: s:CommentLinesMinimal(firstLine, lastLine) {{{2 -+" This function comments a range of lines in a minimal style. I -+" -+" Args: -+" -firstLine/lastLine: the top and bottom lines to comment -+function s:CommentLinesMinimal(firstLine, lastLine) -+ "check that minimal comments can be done on this filetype -+ if !s:HasMultipartDelims() -+ throw 'NERDCommenter.Delimiters exception: Minimal comments can only be used for filetypes that have multipart delimiters' -+ endif -+ -+ "if we need to use place holders for the comment, make sure they are -+ "enabled for this filetype -+ if !g:NERDUsePlaceHolders && s:DoesBlockHaveMultipartDelim(a:firstLine, a:lastLine) -+ throw 'NERDCommenter.Settings exception: Placeoholders are required but disabled.' -+ endif -+ -+ "get the left and right delims to smack on -+ let left = s:GetSexyComLeft(g:NERDSpaceDelims,0) -+ let right = s:GetSexyComRight(g:NERDSpaceDelims,0) -+ -+ "make sure all multipart delims on the lines are replaced with -+ "placeholders to prevent illegal syntax -+ let currentLine = a:firstLine -+ while(currentLine <= a:lastLine) -+ let theLine = getline(currentLine) -+ let theLine = s:ReplaceDelims(left, right, g:NERDLPlace, g:NERDRPlace, theLine) -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ "add the delim to the top line -+ let theLine = getline(a:firstLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let theLine = s:AddLeftDelim(left, theLine) -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:firstLine, theLine) -+ -+ "add the delim to the bottom line -+ let theLine = getline(a:lastLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let theLine = s:AddRightDelim(right, theLine) -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:lastLine, theLine) -+endfunction -+ -+" Function: s:CommentLinesSexy(topline, bottomline) function {{{2 -+" This function is used to comment lines in the 'Sexy' style. eg in c: -+" /* -+" * This is a sexy comment -+" */ -+" Args: -+" -topline: the line num of the top line in the sexy comment -+" -bottomline: the line num of the bottom line in the sexy comment -+function s:CommentLinesSexy(topline, bottomline) -+ let left = s:GetSexyComLeft(0, 0) -+ let right = s:GetSexyComRight(0, 0) -+ -+ "check if we can do a sexy comment with the available delimiters -+ if left == -1 || right == -1 -+ throw 'NERDCommenter.Delimiters exception: cannot perform sexy comments with available delimiters.' -+ endif -+ -+ "make sure the lines arent already commented sexually -+ if !s:CanSexyCommentLines(a:topline, a:bottomline) -+ throw 'NERDCommenter.Nesting exception: cannot nest sexy comments' -+ endif -+ -+ -+ let sexyComMarker = s:GetSexyComMarker(0,0) -+ let sexyComMarkerSpaced = s:GetSexyComMarker(1,0) -+ -+ -+ " we jam the comment as far to the right as possible -+ let leftAlignIndx = s:LeftMostIndx(1, 1, a:topline, a:bottomline) -+ -+ "check if we should use the compact style i.e that the left/right -+ "delimiters should appear on the first and last lines of the code and not -+ "on separate lines above/below the first/last lines of code -+ if g:NERDCompactSexyComs -+ let spaceString = (g:NERDSpaceDelims ? s:spaceStr : '') -+ -+ "comment the top line -+ let theLine = getline(a:topline) -+ let lineHasTabs = s:HasLeadingTabs(theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ let theLine = s:AddLeftDelimAligned(left . spaceString, theLine, leftAlignIndx) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:topline, theLine) -+ -+ "comment the bottom line -+ let theLine = getline(a:bottomline) -+ let lineHasTabs = s:HasLeadingTabs(theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ let theLine = s:AddRightDelim(spaceString . right, theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:bottomline, theLine) -+ else -+ -+ " add the left delimiter one line above the lines that are to be commented -+ call cursor(a:topline, 1) -+ execute 'normal! O' -+ call setline(a:topline, strpart(s:spaces, 0, leftAlignIndx) . left ) -+ -+ " add the right delimiter after bottom line (we have to add 1 cos we moved -+ " the lines down when we added the left delim -+ call cursor(a:bottomline+1, 1) -+ execute 'normal! o' -+ call setline(a:bottomline+2, strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . right ) -+ -+ endif -+ -+ " go thru each line adding the sexyComMarker marker to the start of each -+ " line in the appropriate place to align them with the comment delims -+ let currentLine = a:topline+1 -+ while currentLine <= a:bottomline + !g:NERDCompactSexyComs -+ " get the line and convert the tabs to spaces -+ let theLine = getline(currentLine) -+ let lineHasTabs = s:HasLeadingTabs(theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ -+ " add the sexyComMarker -+ let theLine = strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . sexyComMarkerSpaced . strpart(theLine, leftAlignIndx) -+ -+ if lineHasTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ -+ " set the line and move onto the next one -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+endfunction -+ -+" Function: s:CommentLinesToggle(forceNested, firstLine, lastLine) {{{2 -+" Applies "toggle" commenting to the given range of lines -+" -+" Args: -+" -forceNested: a flag indicating whether the called is requesting the comment -+" to be nested if need be -+" -firstLine/lastLine: the top and bottom lines to comment -+function s:CommentLinesToggle(forceNested, firstLine, lastLine) -+ let currentLine = a:firstLine -+ while currentLine <= a:lastLine -+ -+ " get the next line, check commentability and convert spaces to tabs -+ let theLine = getline(currentLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ if s:CanToggleCommentLine(a:forceNested, currentLine) -+ -+ "if the user has specified forceNesting then we check to see if we -+ "need to switch delimiters for place-holders -+ if g:NERDUsePlaceHolders -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ endif -+ -+ let theLine = s:AddLeftDelim(s:GetLeft(0, 1, 0), theLine) -+ let theLine = s:AddRightDelim(s:GetRight(0, 1, 0), theLine) -+ endif -+ -+ " restore leading tabs if appropriate -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ " we are done with this line -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+endfunction -+ -+" Function: s:CommentRegion(topline, topCol, bottomLine, bottomCol) function {{{2 -+" This function comments chunks of text selected in visual mode. -+" It will comment exactly the text that they have selected. -+" Args: -+" -topLine: the line num of the top line in the sexy comment -+" -topCol: top left col for this comment -+" -bottomline: the line num of the bottom line in the sexy comment -+" -bottomCol: the bottom right col for this comment -+" -forceNested: whether the caller wants comments to be nested if the -+" line(s) are already commented -+function s:CommentRegion(topLine, topCol, bottomLine, bottomCol, forceNested) -+ -+ "switch delims (if we can) if the current set isnt multipart -+ let switchedDelims = 0 -+ if !s:Multipart() && s:AltMultipart() && !g:NERDAllowAnyVisualDelims -+ let switchedDelims = 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+ -+ "if there is only one line in the comment then just do it -+ if a:topLine == a:bottomLine -+ call s:CommentBlock(a:topLine, a:bottomLine, a:topCol, a:bottomCol, a:forceNested) -+ -+ "there are multiple lines in the comment -+ else -+ "comment the top line -+ call s:CommentBlock(a:topLine, a:topLine, a:topCol, strlen(getline(a:topLine)), a:forceNested) -+ -+ "comment out all the lines in the middle of the comment -+ let topOfRange = a:topLine+1 -+ let bottomOfRange = a:bottomLine-1 -+ if topOfRange <= bottomOfRange -+ call s:CommentLines(a:forceNested, 0, 0, topOfRange, bottomOfRange) -+ endif -+ -+ "comment the bottom line -+ let bottom = getline(a:bottomLine) -+ let numLeadingSpacesTabs = strlen(substitute(bottom, '^\([ \t]*\).*$', '\1', '')) -+ call s:CommentBlock(a:bottomLine, a:bottomLine, numLeadingSpacesTabs+1, a:bottomCol, a:forceNested) -+ -+ endif -+ -+ "stick the cursor back on the char it was on before the comment -+ call cursor(a:topLine, a:topCol + strlen(b:left) + g:NERDSpaceDelims) -+ -+ "if we switched delims then we gotta go back to what they were before -+ if switchedDelims == 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+ -+endfunction -+ -+" Function: s:InvertComment(firstLine, lastLine) function {{{2 -+" Inverts the comments on the lines between and including the given line -+" numbers i.e all commented lines are uncommented and vice versa -+" Args: -+" -firstLine: the top of the range of lines to be inverted -+" -lastLine: the bottom of the range of lines to be inverted -+function s:InvertComment(firstLine, lastLine) -+ -+ " go thru all lines in the given range -+ let currentLine = a:firstLine -+ while currentLine <= a:lastLine -+ let theLine = getline(currentLine) -+ -+ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) -+ -+ " if the line is commented normally, uncomment it -+ if s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) -+ call s:UncommentLines(1, currentLine, currentLine) -+ let currentLine = currentLine + 1 -+ -+ " check if the line is commented sexually -+ elseif !empty(sexyComBounds) -+ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() -+ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) -+ -+ "move to the line after last line of the sexy comment -+ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() -+ let currentLine = bottomBound - (numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved) + 1 -+ -+ " the line isnt commented -+ else -+ call s:CommentLinesToggle(1, currentLine, currentLine) -+ let currentLine = currentLine + 1 -+ endif -+ -+ endwhile -+endfunction -+ -+" Function: NERDComment(isVisual, alignLeft, alignRight, type) function {{{2 -+" This function is a Wrapper for the main commenting functions -+" -+" Args: -+" -isVisual: a flag indicating whether the comment is requested in visual -+" mode or not -+" -type: the type of commenting requested. Can be 'sexy', 'invert', -+" 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', -+" 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' -+function! NERDComment(isVisual, type) range -+ " we want case sensitivity when commenting -+ let prevIgnoreCase = &ignorecase -+ set noignorecase -+ -+ if a:isVisual -+ let firstLine = line("'<") -+ let lastLine = line("'>") -+ let firstCol = col("'<") -+ let lastCol = col("'>") -+ else -+ let firstLine = a:firstline -+ let lastLine = a:lastline -+ endif -+ -+ let countWasGiven = (a:isVisual == 0 && firstLine != lastLine) -+ -+ let forceNested = (a:type == 'nested' || g:NERDDefaultNesting) -+ -+ if a:type == 'norm' || a:type == 'nested' -+ if a:isVisual && visualmode() == "" -+ call s:CommentBlock(firstLine, lastLine, firstCol, lastCol, forceNested) -+ elseif a:isVisual && visualmode() == "v" && (g:NERDCommentWholeLinesInVMode==0 || (g:NERDCommentWholeLinesInVMode==2 && s:HasMultipartDelims())) -+ call s:CommentRegion(firstLine, firstCol, lastLine, lastCol, forceNested) -+ else -+ call s:CommentLines(forceNested, 0, 0, firstLine, lastLine) -+ endif -+ -+ elseif a:type == 'alignLeft' || a:type == 'alignRight' || a:type == 'alignBoth' -+ let alignLeft = (a:type == 'alignLeft' || a:type == 'alignBoth') -+ let alignRight = (a:type == 'alignRight' || a:type == 'alignBoth') -+ call s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) -+ -+ elseif a:type == 'invert' -+ call s:InvertComment(firstLine, lastLine) -+ -+ elseif a:type == 'sexy' -+ try -+ call s:CommentLinesSexy(firstLine, lastLine) -+ catch /NERDCommenter.Delimiters/ -+ call s:NerdEcho("Sexy comments cannot be done with the available delimiters", 0) -+ catch /NERDCommenter.Nesting/ -+ call s:NerdEcho("Sexy comment aborted. Nested sexy cannot be nested", 0) -+ endtry -+ -+ elseif a:type == 'toggle' -+ let theLine = getline(firstLine) -+ -+ if s:IsInSexyComment(firstLine) || s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) -+ call s:UncommentLines(1, firstLine, lastLine) -+ else -+ call s:CommentLinesToggle(forceNested, firstLine, lastLine) -+ endif -+ -+ elseif a:type == 'minimal' -+ try -+ call s:CommentLinesMinimal(firstLine, lastLine) -+ catch /NERDCommenter.Delimiters/ -+ call s:NerdEcho("Minimal comments can only be used for filetypes that have multipart delimiters.", 0) -+ catch /NERDCommenter.Settings/ -+ call s:NerdEcho("Place holders are required but disabled.", 0) -+ endtry -+ -+ elseif a:type == 'toEOL' -+ call s:SaveScreenState() -+ call s:CommentBlock(firstLine, firstLine, col("."), col("$")-1, 1) -+ call s:RestoreScreenState() -+ -+ elseif a:type == 'prepend' -+ call s:PrependCommentToLine() -+ -+ elseif a:type == 'append' -+ call s:AppendCommentToLine() -+ -+ elseif a:type == 'insert' -+ call s:PlaceDelimitersAndInsBetween() -+ -+ elseif a:type == 'uncomment' -+ call s:UncommentLines(0, firstLine, lastLine) -+ -+ elseif a:type == 'yank' -+ if a:isVisual -+ normal gvy -+ elseif countWasGiven -+ execute firstLine .','. lastLine .'yank' -+ else -+ normal Y -+ endif -+ execute firstLine .','. lastLine .'call NERDComment('. a:isVisual .', "norm")' -+ endif -+ -+ let &ignorecase = prevIgnoreCase -+endfunction -+ -+" Function: s:PlaceDelimitersAndInsBetween() function {{{2 -+" This is function is called to place comment delimiters down and place the -+" cursor between them -+function s:PlaceDelimitersAndInsBetween() -+ " get the left and right delimiters without any escape chars in them -+ let left = s:GetLeft(0, 1, 0) -+ let right = s:GetRight(0, 1, 0) -+ -+ let theLine = getline(".") -+ let lineHasLeadTabs = s:HasLeadingTabs(theLine) || (theLine =~ '^ *$' && !&expandtab) -+ -+ "convert tabs to spaces and adjust the cursors column to take this into -+ "account -+ let untabbedCol = s:UntabbedCol(theLine, col(".")) -+ call setline(line("."), s:ConvertLeadingTabsToSpaces(theLine)) -+ call cursor(line("."), untabbedCol) -+ -+ " get the len of the right delim -+ let lenRight = strlen(right) -+ -+ let isDelimOnEOL = col(".") >= strlen(getline(".")) -+ -+ " if the cursor is in the first col then we gotta insert rather than -+ " append the comment delimiters here -+ let insOrApp = (col(".")==1 ? 'i' : 'a') -+ -+ " place the delimiters down. We do it differently depending on whether -+ " there is a left AND right delimiter -+ if lenRight > 0 -+ execute ":normal " . insOrApp . left . right -+ execute ":normal " . lenRight . "h" -+ else -+ execute ":normal " . insOrApp . left -+ -+ " if we are tacking the delim on the EOL then we gotta add a space -+ " after it cos when we go out of insert mode the cursor will move back -+ " one and the user wont be in position to type the comment. -+ if isDelimOnEOL -+ execute 'normal a ' -+ endif -+ endif -+ normal l -+ -+ "if needed convert spaces back to tabs and adjust the cursors col -+ "accordingly -+ if lineHasLeadTabs -+ let tabbedCol = s:TabbedCol(getline("."), col(".")) -+ call setline(line("."), s:ConvertLeadingSpacesToTabs(getline("."))) -+ call cursor(line("."), tabbedCol) -+ endif -+ -+ startinsert -+endfunction -+ -+" Function: s:PrependCommentToLine(){{{2 -+" This function prepends comment delimiters to the start of line and places -+" the cursor in position to start typing the comment -+function s:PrependCommentToLine() -+ " get the left and right delimiters without any escape chars in them -+ let left = s:GetLeft(0, 1, 0) -+ let right = s:GetRight(0, 1, 0) -+ -+ " get the len of the right delim -+ let lenRight = strlen(right) -+ -+ -+ "if the line is empty then we need to know about this later on -+ let isLineEmpty = strlen(getline(".")) == 0 -+ -+ "stick the delimiters down at the start of the line. We have to format the -+ "comment with spaces as appropriate -+ if lenRight > 0 -+ execute ":normal I" . left . right -+ else -+ execute ":normal I" . left -+ endif -+ -+ " if there is a right delimiter then we gotta move the cursor left -+ " by the len of the right delimiter so we insert between the delimiters -+ if lenRight > 0 -+ let leftMoveAmount = lenRight -+ execute ":normal " . leftMoveAmount . "h" -+ endif -+ normal l -+ -+ "if the line was empty then we gotta add an extra space on the end because -+ "the cursor will move back one more at the end of the last "execute" -+ "command -+ if isLineEmpty && lenRight == 0 -+ execute ":normal a " -+ endif -+ -+ startinsert -+endfunction -+" Function: s:RemoveDelimiters(left, right, line) {{{2 -+" this function is called to remove the first left comment delimiter and the -+" last right delimiter of the given line. -+" -+" The args left and right must be strings. If there is no right delimiter (as -+" is the case for e.g vim file comments) them the arg right should be "" -+" -+" Args: -+" -left: the left comment delimiter -+" -right: the right comment delimiter -+" -line: the line to remove the delimiters from -+function s:RemoveDelimiters(left, right, line) -+ -+ let l:left = a:left -+ let l:right = a:right -+ let lenLeft = strlen(left) -+ let lenRight = strlen(right) -+ -+ let delimsSpaced = (g:NERDSpaceDelims || g:NERDRemoveExtraSpaces) -+ -+ let line = a:line -+ -+ "look for the left delimiter, if we find it, remove it. -+ let leftIndx = s:FindDelimiterIndex(a:left, line) -+ if leftIndx != -1 -+ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+lenLeft) -+ -+ "if the user has specified that there is a space after the left delim -+ "then check for the space and remove it if it is there -+ if delimsSpaced && strpart(line, leftIndx, s:lenSpaceStr) == s:spaceStr -+ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+s:lenSpaceStr) -+ endif -+ endif -+ -+ "look for the right delimiter, if we find it, remove it -+ let rightIndx = s:FindDelimiterIndex(a:right, line) -+ if rightIndx != -1 -+ let line = strpart(line, 0, rightIndx) . strpart(line, rightIndx+lenRight) -+ -+ "if the user has specified that there is a space before the right delim -+ "then check for the space and remove it if it is there -+ if delimsSpaced && strpart(line, rightIndx-s:lenSpaceStr, s:lenSpaceStr) == s:spaceStr && s:Multipart() -+ let line = strpart(line, 0, rightIndx-s:lenSpaceStr) . strpart(line, rightIndx) -+ endif -+ endif -+ -+ return line -+endfunction -+ -+" Function: s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) {{{2 -+" This function uncomments the given lines -+" -+" Args: -+" onlyWholeLineComs: should be 1 for toggle style uncommenting -+" topLine: the top line of the visual selection to uncomment -+" bottomLine: the bottom line of the visual selection to uncomment -+function s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) -+ "make local copies of a:firstline and a:lastline and, if need be, swap -+ "them around if the top line is below the bottom -+ let l:firstline = a:topLine -+ let l:lastline = a:bottomLine -+ if firstline > lastline -+ let firstline = lastline -+ let lastline = a:topLine -+ endif -+ -+ "go thru each line uncommenting each line removing sexy comments -+ let currentLine = firstline -+ while currentLine <= lastline -+ -+ "check the current line to see if it is part of a sexy comment -+ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) -+ if !empty(sexyComBounds) -+ -+ "we need to store the num lines in the buf before the comment is -+ "removed so we know how many lines were removed when the sexy com -+ "was removed -+ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() -+ -+ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) -+ -+ "move to the line after last line of the sexy comment -+ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() -+ let numLinesRemoved = numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved -+ let currentLine = sexyComBounds[1] - numLinesRemoved + 1 -+ let lastline = lastline - numLinesRemoved -+ -+ "no sexy com was detected so uncomment the line as normal -+ else -+ let theLine = getline(currentLine) -+ if a:onlyWholeLineComs && (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) -+ call s:UncommentLinesNormal(currentLine, currentLine) -+ elseif !a:onlyWholeLineComs -+ call s:UncommentLinesNormal(currentLine, currentLine) -+ endif -+ let currentLine = currentLine + 1 -+ endif -+ endwhile -+ -+endfunction -+ -+" Function: s:UncommentLinesSexy(topline, bottomline) {{{2 -+" This function removes all the comment characters associated with the sexy -+" comment spanning the given lines -+" Args: -+" -topline/bottomline: the top/bottom lines of the sexy comment -+function s:UncommentLinesSexy(topline, bottomline) -+ let left = s:GetSexyComLeft(0,1) -+ let right = s:GetSexyComRight(0,1) -+ -+ -+ "check if it is even possible for sexy comments to exist with the -+ "available delimiters -+ if left == -1 || right == -1 -+ throw 'NERDCommenter.Delimiters exception: cannot uncomment sexy comments with available delimiters.' -+ endif -+ -+ let leftUnEsc = s:GetSexyComLeft(0,0) -+ let rightUnEsc = s:GetSexyComRight(0,0) -+ -+ let sexyComMarker = s:GetSexyComMarker(0, 1) -+ let sexyComMarkerUnEsc = s:GetSexyComMarker(0, 0) -+ -+ "the markerOffset is how far right we need to move the sexyComMarker to -+ "line it up with the end of the left delim -+ let markerOffset = strlen(leftUnEsc)-strlen(sexyComMarkerUnEsc) -+ -+ " go thru the intermediate lines of the sexy comment and remove the -+ " sexy comment markers (eg the '*'s on the start of line in a c sexy -+ " comment) -+ let currentLine = a:topline+1 -+ while currentLine < a:bottomline -+ let theLine = getline(currentLine) -+ -+ " remove the sexy comment marker from the line. We also remove the -+ " space after it if there is one and if appropriate options are set -+ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) -+ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) -+ endif -+ -+ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) -+ -+ let theLine = s:ConvertLeadingWhiteSpace(theLine) -+ -+ " move onto the next line -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ " gotta make a copy of a:bottomline cos we modify the position of the -+ " last line it if we remove the topline -+ let bottomline = a:bottomline -+ -+ " get the first line so we can remove the left delim from it -+ let theLine = getline(a:topline) -+ -+ " if the first line contains only the left delim then just delete it -+ if theLine =~ '^[ \t]*' . left . '[ \t]*$' && !g:NERDCompactSexyComs -+ call cursor(a:topline, 1) -+ normal dd -+ let bottomline = bottomline - 1 -+ -+ " topline contains more than just the left delim -+ else -+ -+ " remove the delim. If there is a space after it -+ " then remove this too if appropriate -+ let delimIndx = stridx(theLine, leftUnEsc) -+ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)) -+ endif -+ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) -+ call setline(a:topline, theLine) -+ endif -+ -+ " get the last line so we can remove the right delim -+ let theLine = getline(bottomline) -+ -+ " if the bottomline contains only the right delim then just delete it -+ if theLine =~ '^[ \t]*' . right . '[ \t]*$' -+ call cursor(bottomline, 1) -+ normal dd -+ -+ " the last line contains more than the right delim -+ else -+ " remove the right delim. If there is a space after it and -+ " if the appropriate options are set then remove this too. -+ let delimIndx = s:LastIndexOfDelim(rightUnEsc, theLine) -+ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)) -+ endif -+ -+ " if the last line also starts with a sexy comment marker then we -+ " remove this as well -+ if theLine =~ '^[ \t]*' . sexyComMarker -+ -+ " remove the sexyComMarker. If there is a space after it then -+ " remove that too -+ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) -+ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) -+ endif -+ endif -+ -+ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) -+ call setline(bottomline, theLine) -+ endif -+endfunction -+ -+" Function: s:UncommentLineNormal(line) {{{2 -+" uncomments the given line and returns the result -+" Args: -+" -line: the line to uncomment -+function s:UncommentLineNormal(line) -+ let line = a:line -+ -+ "get the comment status on the line so we know how it is commented -+ let lineCommentStatus = s:IsCommentedOuttermost(b:leftAlt, b:rightAlt, b:left, b:right, line) -+ -+ "it is commented with b:left and b:right so remove these delims -+ if lineCommentStatus == 1 -+ let line = s:RemoveDelimiters(b:leftAlt, b:rightAlt, line) -+ -+ "it is commented with b:leftAlt and b:rightAlt so remove these delims -+ elseif lineCommentStatus == 2 && g:NERDRemoveAltComs -+ let line = s:RemoveDelimiters(b:left, b:right, line) -+ -+ "it is not properly commented with any delims so we check if it has -+ "any random left or right delims on it and remove the outtermost ones -+ else -+ "get the positions of all delim types on the line -+ let indxLeft = s:FindDelimiterIndex(b:left, line) -+ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) -+ let indxRight = s:FindDelimiterIndex(b:right, line) -+ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) -+ -+ "remove the outter most left comment delim -+ if indxLeft != -1 && (indxLeft < indxLeftAlt || indxLeftAlt == -1) -+ let line = s:ReplaceLeftMostDelim(b:left, '', line) -+ elseif indxLeftAlt != -1 -+ let line = s:ReplaceLeftMostDelim(b:leftAlt, '', line) -+ endif -+ -+ "remove the outter most right comment delim -+ if indxRight != -1 && (indxRight < indxRightAlt || indxRightAlt == -1) -+ let line = s:ReplaceRightMostDelim(b:right, '', line) -+ elseif indxRightAlt != -1 -+ let line = s:ReplaceRightMostDelim(b:rightAlt, '', line) -+ endif -+ endif -+ -+ -+ let indxLeft = s:FindDelimiterIndex(b:left, line) -+ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) -+ let indxLeftPlace = s:FindDelimiterIndex(g:NERDLPlace, line) -+ -+ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) -+ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) -+ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) -+ -+ let right = b:right -+ let left = b:left -+ if !s:Multipart() -+ let right = b:rightAlt -+ let left = b:leftAlt -+ endif -+ -+ -+ "if there are place-holders on the line then we check to see if they are -+ "the outtermost delimiters on the line. If so then we replace them with -+ "real delimiters -+ if indxLeftPlace != -1 -+ if (indxLeftPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) -+ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) -+ endif -+ elseif indxRightPlace != -1 -+ if (indxRightPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) -+ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) -+ endif -+ -+ endif -+ -+ let line = s:ConvertLeadingWhiteSpace(line) -+ -+ return line -+endfunction -+ -+" Function: s:UncommentLinesNormal(topline, bottomline) {{{2 -+" This function is called to uncomment lines that arent a sexy comment -+" Args: -+" -topline/bottomline: the top/bottom line numbers of the comment -+function s:UncommentLinesNormal(topline, bottomline) -+ let currentLine = a:topline -+ while currentLine <= a:bottomline -+ let line = getline(currentLine) -+ call setline(currentLine, s:UncommentLineNormal(line)) -+ let currentLine = currentLine + 1 -+ endwhile -+endfunction -+ -+ -+" Section: Other helper functions {{{1 -+" ============================================================================ -+ -+" Function: s:AddLeftDelim(delim, theLine) {{{2 -+" Args: -+function s:AddLeftDelim(delim, theLine) -+ return substitute(a:theLine, '^\([ \t]*\)', '\1' . a:delim, '') -+endfunction -+ -+" Function: s:AddLeftDelimAligned(delim, theLine) {{{2 -+" Args: -+function s:AddLeftDelimAligned(delim, theLine, alignIndx) -+ -+ "if the line is not long enough then bung some extra spaces on the front -+ "so we can align the delim properly -+ let theLine = a:theLine -+ if strlen(theLine) < a:alignIndx -+ let theLine = strpart(s:spaces, 0, a:alignIndx - strlen(theLine)) -+ endif -+ -+ return strpart(theLine, 0, a:alignIndx) . a:delim . strpart(theLine, a:alignIndx) -+endfunction -+ -+" Function: s:AddRightDelim(delim, theLine) {{{2 -+" Args: -+function s:AddRightDelim(delim, theLine) -+ if a:delim == '' -+ return a:theLine -+ else -+ return substitute(a:theLine, '$', a:delim, '') -+ endif -+endfunction -+ -+" Function: s:AddRightDelimAligned(delim, theLine, alignIndx) {{{2 -+" Args: -+function s:AddRightDelimAligned(delim, theLine, alignIndx) -+ if a:delim == "" -+ return a:theLine -+ else -+ -+ " when we align the right delim we are just adding spaces -+ " so we get a string containing the needed spaces (it -+ " could be empty) -+ let extraSpaces = '' -+ let extraSpaces = strpart(s:spaces, 0, a:alignIndx-strlen(a:theLine)) -+ -+ " add the right delim -+ return substitute(a:theLine, '$', extraSpaces . a:delim, '') -+ endif -+endfunction -+ -+" Function: s:AltMultipart() {{{2 -+" returns 1 if the alternative delims are multipart -+function s:AltMultipart() -+ return b:rightAlt != '' -+endfunction -+ -+" Function: s:CanCommentLine(forceNested, line) {{{2 -+"This function is used to determine whether the given line can be commented. -+"It returns 1 if it can be and 0 otherwise -+" -+" Args: -+" -forceNested: a flag indicating whether the caller wants comments to be nested -+" if the current line is already commented -+" -lineNum: the line num of the line to check for commentability -+function s:CanCommentLine(forceNested, lineNum) -+ let theLine = getline(a:lineNum) -+ -+ " make sure we don't comment lines that are just spaces or tabs or empty. -+ if theLine =~ "^[ \t]*$" -+ return 0 -+ endif -+ -+ "if the line is part of a sexy comment then just flag it... -+ if s:IsInSexyComment(a:lineNum) -+ return 0 -+ endif -+ -+ let isCommented = s:IsCommentedNormOrSexy(a:lineNum) -+ -+ "if the line isnt commented return true -+ if !isCommented -+ return 1 -+ endif -+ -+ "if the line is commented but nesting is allowed then return true -+ if a:forceNested && (!s:Multipart() || g:NERDUsePlaceHolders) -+ return 1 -+ endif -+ -+ return 0 -+endfunction -+ -+" Function: s:CanPlaceCursor(line, col) {{{2 -+" returns 1 if the cursor can be placed exactly in the given position -+function s:CanPlaceCursor(line, col) -+ let c = col(".") -+ let l = line(".") -+ call cursor(a:line, a:col) -+ let success = (line(".") == a:line && col(".") == a:col) -+ call cursor(l,c) -+ return success -+endfunction -+ -+" Function: s:CanSexyCommentLines(topline, bottomline) {{{2 -+" Return: 1 if the given lines can be commented sexually, 0 otherwise -+function s:CanSexyCommentLines(topline, bottomline) -+ " see if the selected regions have any sexy comments -+ let currentLine = a:topline -+ while(currentLine <= a:bottomline) -+ if s:IsInSexyComment(currentLine) -+ return 0 -+ endif -+ let currentLine = currentLine + 1 -+ endwhile -+ return 1 -+endfunction -+" Function: s:CanToggleCommentLine(forceNested, line) {{{2 -+"This function is used to determine whether the given line can be toggle commented. -+"It returns 1 if it can be and 0 otherwise -+" -+" Args: -+" -lineNum: the line num of the line to check for commentability -+function s:CanToggleCommentLine(forceNested, lineNum) -+ let theLine = getline(a:lineNum) -+ if (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) && !a:forceNested -+ return 0 -+ endif -+ -+ " make sure we don't comment lines that are just spaces or tabs or empty. -+ if theLine =~ "^[ \t]*$" -+ return 0 -+ endif -+ -+ "if the line is part of a sexy comment then just flag it... -+ if s:IsInSexyComment(a:lineNum) -+ return 0 -+ endif -+ -+ return 1 -+endfunction -+ -+" Function: s:ConvertLeadingSpacesToTabs(line) {{{2 -+" This function takes a line and converts all leading tabs on that line into -+" spaces -+" -+" Args: -+" -line: the line whose leading tabs will be converted -+function s:ConvertLeadingSpacesToTabs(line) -+ let toReturn = a:line -+ while toReturn =~ '^\t*' . s:TabSpace() . '\(.*\)$' -+ let toReturn = substitute(toReturn, '^\(\t*\)' . s:TabSpace() . '\(.*\)$' , '\1\t\2' , "") -+ endwhile -+ -+ return toReturn -+endfunction -+ -+ -+" Function: s:ConvertLeadingTabsToSpaces(line) {{{2 -+" This function takes a line and converts all leading spaces on that line into -+" tabs -+" -+" Args: -+" -line: the line whose leading spaces will be converted -+function s:ConvertLeadingTabsToSpaces(line) -+ let toReturn = a:line -+ while toReturn =~ '^\( *\)\t' -+ let toReturn = substitute(toReturn, '^\( *\)\t', '\1' . s:TabSpace() , "") -+ endwhile -+ -+ return toReturn -+endfunction -+ -+" Function: s:ConvertLeadingWhiteSpace(line) {{{2 -+" Converts the leading white space to tabs/spaces depending on &ts -+" -+" Args: -+" -line: the line to convert -+function s:ConvertLeadingWhiteSpace(line) -+ let toReturn = a:line -+ while toReturn =~ '^ *\t' -+ let toReturn = substitute(toReturn, '^ *\zs\t\ze', s:TabSpace(), "g") -+ endwhile -+ -+ if !&expandtab -+ let toReturn = s:ConvertLeadingSpacesToTabs(toReturn) -+ endif -+ -+ return toReturn -+endfunction -+ -+ -+" Function: s:CountNonESCedOccurances(str, searchstr, escChar) {{{2 -+" This function counts the number of substrings contained in another string. -+" These substrings are only counted if they are not escaped with escChar -+" Args: -+" -str: the string to look for searchstr in -+" -searchstr: the substring to search for in str -+" -escChar: the escape character which, when preceding an instance of -+" searchstr, will cause it not to be counted -+function s:CountNonESCedOccurances(str, searchstr, escChar) -+ "get the index of the first occurrence of searchstr -+ let indx = stridx(a:str, a:searchstr) -+ -+ "if there is an instance of searchstr in str process it -+ if indx != -1 -+ "get the remainder of str after this instance of searchstr is removed -+ let lensearchstr = strlen(a:searchstr) -+ let strLeft = strpart(a:str, indx+lensearchstr) -+ -+ "if this instance of searchstr is not escaped, add one to the count -+ "and recurse. If it is escaped, just recurse -+ if !s:IsEscaped(a:str, indx, a:escChar) -+ return 1 + s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) -+ else -+ return s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) -+ endif -+ endif -+endfunction -+" Function: s:DoesBlockHaveDelim(delim, top, bottom) {{{2 -+" Returns 1 if the given block of lines has a delimiter (a:delim) in it -+" Args: -+" -delim: the comment delimiter to check the block for -+" -top: the top line number of the block -+" -bottom: the bottom line number of the block -+function s:DoesBlockHaveDelim(delim, top, bottom) -+ let currentLine = a:top -+ while currentLine < a:bottom -+ let theline = getline(currentLine) -+ if s:FindDelimiterIndex(a:delim, theline) != -1 -+ return 1 -+ endif -+ let currentLine = currentLine + 1 -+ endwhile -+ return 0 -+endfunction -+ -+" Function: s:DoesBlockHaveMultipartDelim(top, bottom) {{{2 -+" Returns 1 if the given block has a >= 1 multipart delimiter in it -+" Args: -+" -top: the top line number of the block -+" -bottom: the bottom line number of the block -+function s:DoesBlockHaveMultipartDelim(top, bottom) -+ if s:HasMultipartDelims() -+ if s:Multipart() -+ return s:DoesBlockHaveDelim(b:left, a:top, a:bottom) || s:DoesBlockHaveDelim(b:right, a:top, a:bottom) -+ else -+ return s:DoesBlockHaveDelim(b:leftAlt, a:top, a:bottom) || s:DoesBlockHaveDelim(b:rightAlt, a:top, a:bottom) -+ endif -+ endif -+ return 0 -+endfunction -+ -+ -+" Function: s:Esc(str) {{{2 -+" Escapes all the tricky chars in the given string -+function s:Esc(str) -+ let charsToEsc = '*/\."&$+' -+ return escape(a:str, charsToEsc) -+endfunction -+ -+" Function: s:FindDelimiterIndex(delimiter, line) {{{2 -+" This function is used to get the string index of the input comment delimiter -+" on the input line. If no valid comment delimiter is found in the line then -+" -1 is returned -+" Args: -+" -delimiter: the delimiter we are looking to find the index of -+" -line: the line we are looking for delimiter on -+function s:FindDelimiterIndex(delimiter, line) -+ -+ "make sure the delimiter isnt empty otherwise we go into an infinite loop. -+ if a:delimiter == "" -+ return -1 -+ endif -+ -+ -+ let l:delimiter = a:delimiter -+ let lenDel = strlen(l:delimiter) -+ -+ "get the index of the first occurrence of the delimiter -+ let delIndx = stridx(a:line, l:delimiter) -+ -+ "keep looping thru the line till we either find a real comment delimiter -+ "or run off the EOL -+ while delIndx != -1 -+ -+ "if we are not off the EOL get the str before the possible delimiter -+ "in question and check if it really is a delimiter. If it is, return -+ "its position -+ if delIndx != -1 -+ if s:IsDelimValid(l:delimiter, delIndx, a:line) -+ return delIndx -+ endif -+ endif -+ -+ "we have not yet found a real comment delimiter so move past the -+ "current one we are lookin at -+ let restOfLine = strpart(a:line, delIndx + lenDel) -+ let distToNextDelim = stridx(restOfLine , l:delimiter) -+ -+ "if distToNextDelim is -1 then there is no more potential delimiters -+ "on the line so set delIndx to -1. Otherwise, move along the line by -+ "distToNextDelim -+ if distToNextDelim == -1 -+ let delIndx = -1 -+ else -+ let delIndx = delIndx + lenDel + distToNextDelim -+ endif -+ endwhile -+ -+ "there is no comment delimiter on this line -+ return -1 -+endfunction -+ -+" Function: s:FindBoundingLinesOfSexyCom(lineNum) {{{2 -+" This function takes in a line number and tests whether this line number is -+" the top/bottom/middle line of a sexy comment. If it is then the top/bottom -+" lines of the sexy comment are returned -+" Args: -+" -lineNum: the line number that is to be tested whether it is the -+" top/bottom/middle line of a sexy com -+" Returns: -+" A string that has the top/bottom lines of the sexy comment encoded in it. -+" The format is 'topline,bottomline'. If a:lineNum turns out not to be the -+" top/bottom/middle of a sexy comment then -1 is returned -+function s:FindBoundingLinesOfSexyCom(lineNum) -+ -+ "find which delimiters to look for as the start/end delims of the comment -+ let left = '' -+ let right = '' -+ if s:Multipart() -+ let left = s:GetLeft(0,0,1) -+ let right = s:GetRight(0,0,1) -+ elseif s:AltMultipart() -+ let left = s:GetLeft(1,0,1) -+ let right = s:GetRight(1,0,1) -+ else -+ return [] -+ endif -+ -+ let sexyComMarker = s:GetSexyComMarker(0, 1) -+ -+ "initialise the top/bottom line numbers of the sexy comment to -1 -+ let top = -1 -+ let bottom = -1 -+ -+ let currentLine = a:lineNum -+ while top == -1 || bottom == -1 -+ let theLine = getline(currentLine) -+ -+ "check if the current line is the top of the sexy comment -+ if theLine =~ '^[ \t]*' . left && theLine !~ '.*' . right -+ let top = currentLine -+ let currentLine = a:lineNum -+ -+ "check if the current line is the bottom of the sexy comment -+ elseif theLine =~ '^[ \t]*' . right && theLine !~ '.*' . left -+ let bottom = currentLine -+ -+ "the right delimiter is on the same line as the last sexyComMarker -+ elseif theLine =~ '^[ \t]*' . sexyComMarker . '.*' . right -+ let bottom = currentLine -+ -+ "we have not found the top or bottom line so we assume currentLine is an -+ "intermediate line and look to prove otherwise -+ else -+ -+ "if the line doesnt start with a sexyComMarker then it is not a sexy -+ "comment -+ if theLine !~ '^[ \t]*' . sexyComMarker -+ return [] -+ endif -+ -+ endif -+ -+ "if top is -1 then we havent found the top yet so keep looking up -+ if top == -1 -+ let currentLine = currentLine - 1 -+ "if we have found the top line then go down looking for the bottom -+ else -+ let currentLine = currentLine + 1 -+ endif -+ -+ endwhile -+ -+ return [top, bottom] -+endfunction -+ -+ -+" Function: s:GetLeft(alt, space, esc) {{{2 -+" returns the left/left-alternative delimiter -+" Args: -+" -alt: specifies whether to get left or left-alternative delim -+" -space: specifies whether the delim should be spaced or not -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the delim should be ESCed -+function s:GetLeft(alt, space, esc) -+ let delim = b:left -+ -+ if a:alt -+ if b:leftAlt == '' -+ return '' -+ else -+ let delim = b:leftAlt -+ endif -+ endif -+ if delim == '' -+ return '' -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let delim = delim . s:spaceStr -+ endif -+ -+ if a:esc -+ let delim = s:Esc(delim) -+ endif -+ -+ return delim -+endfunction -+ -+" Function: s:GetRight(alt, space, esc) {{{2 -+" returns the right/right-alternative delimiter -+" Args: -+" -alt: specifies whether to get right or right-alternative delim -+" -space: specifies whether the delim should be spaced or not -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the delim should be ESCed -+function s:GetRight(alt, space, esc) -+ let delim = b:right -+ -+ if a:alt -+ if !s:AltMultipart() -+ return '' -+ else -+ let delim = b:rightAlt -+ endif -+ endif -+ if delim == '' -+ return '' -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let delim = s:spaceStr . delim -+ endif -+ -+ if a:esc -+ let delim = s:Esc(delim) -+ endif -+ -+ return delim -+endfunction -+ -+ -+" Function: s:GetSexyComMarker() {{{2 -+" Returns the sexy comment marker for the current filetype. -+" -+" C style sexy comments are assumed if possible. If not then the sexy comment -+" marker is the last char of the delimiter pair that has both left and right -+" delims and has the longest left delim -+" -+" Args: -+" -space: specifies whether the marker is to have a space string after it -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the marker are to be ESCed -+function s:GetSexyComMarker(space, esc) -+ let sexyComMarker = b:sexyComMarker -+ -+ "if there is no hardcoded marker then we find one -+ if sexyComMarker == '' -+ -+ "if the filetype has c style comments then use standard c sexy -+ "comments -+ if s:HasCStyleComments() -+ let sexyComMarker = '*' -+ else -+ "find a comment marker by getting the longest available left delim -+ "(that has a corresponding right delim) and taking the last char -+ let lenLeft = strlen(b:left) -+ let lenLeftAlt = strlen(b:leftAlt) -+ let left = '' -+ let right = '' -+ if s:Multipart() && lenLeft >= lenLeftAlt -+ let left = b:left -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ else -+ return -1 -+ endif -+ -+ "get the last char of left -+ let sexyComMarker = strpart(left, strlen(left)-1) -+ endif -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let sexyComMarker = sexyComMarker . s:spaceStr -+ endif -+ -+ if a:esc -+ let sexyComMarker = s:Esc(sexyComMarker) -+ endif -+ -+ return sexyComMarker -+endfunction -+ -+" Function: s:GetSexyComLeft(space, esc) {{{2 -+" Returns the left delimiter for sexy comments for this filetype or -1 if -+" there is none. C style sexy comments are used if possible -+" Args: -+" -space: specifies if the delim has a space string on the end -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the string are ESCed -+function s:GetSexyComLeft(space, esc) -+ let lenLeft = strlen(b:left) -+ let lenLeftAlt = strlen(b:leftAlt) -+ let left = '' -+ -+ "assume c style sexy comments if possible -+ if s:HasCStyleComments() -+ let left = '/*' -+ else -+ "grab the longest left delim that has a right -+ if s:Multipart() && lenLeft >= lenLeftAlt -+ let left = b:left -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ else -+ return -1 -+ endif -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let left = left . s:spaceStr -+ endif -+ -+ if a:esc -+ let left = s:Esc(left) -+ endif -+ -+ return left -+endfunction -+ -+" Function: s:GetSexyComRight(space, esc) {{{2 -+" Returns the right delimiter for sexy comments for this filetype or -1 if -+" there is none. C style sexy comments are used if possible. -+" Args: -+" -space: specifies if the delim has a space string on the start -+" (the space string will only be added if NERDSpaceDelims -+" is specified for the current filetype) -+" -esc: specifies whether the tricky chars in the string are ESCed -+function s:GetSexyComRight(space, esc) -+ let lenLeft = strlen(b:left) -+ let lenLeftAlt = strlen(b:leftAlt) -+ let right = '' -+ -+ "assume c style sexy comments if possible -+ if s:HasCStyleComments() -+ let right = '*/' -+ else -+ "grab the right delim that pairs with the longest left delim -+ if s:Multipart() && lenLeft >= lenLeftAlt -+ let right = b:right -+ elseif s:AltMultipart() -+ let right = b:rightAlt -+ else -+ return -1 -+ endif -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let right = s:spaceStr . right -+ endif -+ -+ if a:esc -+ let right = s:Esc(right) -+ endif -+ -+ return right -+endfunction -+ -+" Function: s:HasMultipartDelims() {{{2 -+" Returns 1 iff the current filetype has at least one set of multipart delims -+function s:HasMultipartDelims() -+ return s:Multipart() || s:AltMultipart() -+endfunction -+ -+" Function: s:HasLeadingTabs(...) {{{2 -+" Returns 1 if any of the given strings have leading tabs -+function s:HasLeadingTabs(...) -+ for s in a:000 -+ if s =~ '^\t.*' -+ return 1 -+ end -+ endfor -+ return 0 -+endfunction -+" Function: s:HasCStyleComments() {{{2 -+" Returns 1 iff the current filetype has c style comment delimiters -+function s:HasCStyleComments() -+ return (b:left == '/*' && b:right == '*/') || (b:leftAlt == '/*' && b:rightAlt == '*/') -+endfunction -+ -+" Function: s:InstallDocumentation(full_name, revision) {{{2 -+" Install help documentation. -+" Arguments: -+" full_name: Full name of this vim plugin script, including path name. -+" revision: Revision of the vim script. #version# mark in the document file -+" will be replaced with this string with 'v' prefix. -+" Return: -+" 1 if new document installed, 0 otherwise. -+" Note: Cleaned and generalized by guo-peng Wen. -+" -+" Note about authorship: this function was taken from the vimspell plugin -+" which can be found at http://www.vim.org/scripts/script.php?script_id=465 -+" -+function s:InstallDocumentation(full_name, revision) -+ " Name of the document path based on the system we use: -+ if has("vms") -+ " No chance that this script will work with -+ " VMS - to much pathname juggling here. -+ return 1 -+ elseif (has("unix")) -+ " On UNIX like system, using forward slash: -+ let l:slash_char = '/' -+ let l:mkdir_cmd = ':silent !mkdir -p ' -+ else -+ " On M$ system, use backslash. Also mkdir syntax is different. -+ " This should only work on W2K and up. -+ let l:slash_char = '\' -+ let l:mkdir_cmd = ':silent !mkdir ' -+ endif -+ -+ let l:doc_path = l:slash_char . 'doc' -+ let l:doc_home = l:slash_char . '.vim' . l:slash_char . 'doc' -+ -+ " Figure out document path based on full name of this script: -+ let l:vim_plugin_path = fnamemodify(a:full_name, ':h') -+ let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . l:doc_path -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ "Doc path: " . l:vim_doc_path -+ call s:NerdEcho("Doc path: " . l:vim_doc_path, 0) -+ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ " Try a default configuration in user home: -+ let l:vim_doc_path = expand("~") . l:doc_home -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ " Put a warning: -+ call s:NerdEcho("Unable to open documentation directory \ntype :help add-local-help for more information.", 0) -+ echo l:vim_doc_path -+ return 0 -+ endif -+ endif -+ endif -+ endif -+ -+ " Exit if we have problem to access the document directory: -+ if (!isdirectory(l:vim_plugin_path) || !isdirectory(l:vim_doc_path) || filewritable(l:vim_doc_path) != 2) -+ return 0 -+ endif -+ -+ " Full name of script and documentation file: -+ let l:script_name = fnamemodify(a:full_name, ':t') -+ let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' -+ let l:plugin_file = l:vim_plugin_path . l:slash_char . l:script_name -+ let l:doc_file = l:vim_doc_path . l:slash_char . l:doc_name -+ -+ " Bail out if document file is still up to date: -+ if (filereadable(l:doc_file) && getftime(l:plugin_file) < getftime(l:doc_file)) -+ return 0 -+ endif -+ -+ " Prepare window position restoring command: -+ if (strlen(@%)) -+ let l:go_back = 'b ' . bufnr("%") -+ else -+ let l:go_back = 'enew!' -+ endif -+ -+ " Create a new buffer & read in the plugin file (me): -+ setl nomodeline -+ exe 'enew!' -+ exe 'r ' . escape(l:plugin_file,s:NERDFileNameEscape) -+ -+ setl modeline -+ let l:buf = bufnr("%") -+ setl noswapfile modifiable -+ -+ norm zR -+ norm gg -+ -+ " Delete from first line to a line starts with -+ " === START_DOC -+ 1,/^=\{3,}\s\+START_DOC\C/ d -+ -+ " Delete from a line starts with -+ " === END_DOC -+ " to the end of the documents: -+ /^=\{3,}\s\+END_DOC\C/,$ d -+ -+ " Remove fold marks: -+ :%s/{\{3}[1-9]/ / -+ -+ " Add modeline for help doc: the modeline string is mangled intentionally -+ " to avoid it be recognized by VIM: -+ call append(line('$'), '') -+ call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') -+ -+ " Replace revision: -+ "exe "normal :1s/#version#/ v" . a:revision . "/\" -+ exe "normal :%s/#version#/ v" . a:revision . "/\" -+ -+ " Save the help document: -+ exe 'w! ' . escape(l:doc_file,s:NERDFileNameEscape) -+ exe l:go_back -+ exe 'bw ' . l:buf -+ -+ " Build help tags: -+ exe 'helptags ' . escape(l:vim_doc_path,s:NERDFileNameEscape) -+ -+ return 1 -+endfunction -+ -+ -+" Function: s:IsCommentedNormOrSexy(lineNum) {{{2 -+"This function is used to determine whether the given line is commented with -+"either set of delimiters or if it is part of a sexy comment -+" -+" Args: -+" -lineNum: the line number of the line to check -+function s:IsCommentedNormOrSexy(lineNum) -+ let theLine = getline(a:lineNum) -+ -+ "if the line is commented normally return 1 -+ if s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) -+ return 1 -+ endif -+ -+ "if the line is part of a sexy comment return 1 -+ if s:IsInSexyComment(a:lineNum) -+ return 1 -+ endif -+ return 0 -+endfunction -+ -+" Function: s:IsCommented(left, right, line) {{{2 -+"This function is used to determine whether the given line is commented with -+"the given delimiters -+" -+" Args: -+" -line: the line that to check if commented -+" -left/right: the left and right delimiters to check for -+function s:IsCommented(left, right, line) -+ "if the line isnt commented return true -+ if s:FindDelimiterIndex(a:left, a:line) != -1 && (s:FindDelimiterIndex(a:right, a:line) != -1 || !s:Multipart()) -+ return 1 -+ endif -+ return 0 -+endfunction -+ -+" Function: s:IsCommentedFromStartOfLine(left, line) {{{2 -+"This function is used to determine whether the given line is commented with -+"the given delimiters at the start of the line i.e the left delimiter is the -+"first thing on the line (apart from spaces\tabs) -+" -+" Args: -+" -line: the line that to check if commented -+" -left: the left delimiter to check for -+function s:IsCommentedFromStartOfLine(left, line) -+ let theLine = s:ConvertLeadingTabsToSpaces(a:line) -+ let numSpaces = strlen(substitute(theLine, '^\( *\).*$', '\1', '')) -+ let delimIndx = s:FindDelimiterIndex(a:left, theLine) -+ return delimIndx == numSpaces -+endfunction -+ -+" Function: s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) {{{2 -+" Finds the type of the outtermost delims on the line -+" -+" Args: -+" -line: the line that to check if the outtermost comments on it are -+" left/right -+" -left/right: the left and right delimiters to check for -+" -leftAlt/rightAlt: the left and right alternative delimiters to check for -+" -+" Returns: -+" 0 if the line is not commented with either set of delims -+" 1 if the line is commented with the left/right delim set -+" 2 if the line is commented with the leftAlt/rightAlt delim set -+function s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) -+ "get the first positions of the left delims and the last positions of the -+ "right delims -+ let indxLeft = s:FindDelimiterIndex(a:left, a:line) -+ let indxLeftAlt = s:FindDelimiterIndex(a:leftAlt, a:line) -+ let indxRight = s:LastIndexOfDelim(a:right, a:line) -+ let indxRightAlt = s:LastIndexOfDelim(a:rightAlt, a:line) -+ -+ "check if the line has a left delim before a leftAlt delim -+ if (indxLeft <= indxLeftAlt || indxLeftAlt == -1) && indxLeft != -1 -+ "check if the line has a right delim after any rightAlt delim -+ if (indxRight > indxRightAlt && indxRight > indxLeft) || !s:Multipart() -+ return 1 -+ endif -+ -+ "check if the line has a leftAlt delim before a left delim -+ elseif (indxLeftAlt <= indxLeft || indxLeft == -1) && indxLeftAlt != -1 -+ "check if the line has a rightAlt delim after any right delim -+ if (indxRightAlt > indxRight && indxRightAlt > indxLeftAlt) || !s:AltMultipart() -+ return 2 -+ endif -+ else -+ return 0 -+ endif -+ -+ return 0 -+ -+endfunction -+ -+ -+" Function: s:IsDelimValid(delimiter, delIndx, line) {{{2 -+" This function is responsible for determining whether a given instance of a -+" comment delimiter is a real delimiter or not. For example, in java the -+" // string is a comment delimiter but in the line: -+" System.out.println("//"); -+" it does not count as a comment delimiter. This function is responsible for -+" distinguishing between such cases. It does so by applying a set of -+" heuristics that are not fool proof but should work most of the time. -+" -+" Args: -+" -delimiter: the delimiter we are validating -+" -delIndx: the position of delimiter in line -+" -line: the line that delimiter occurs in -+" -+" Returns: -+" 0 if the given delimiter is not a real delimiter (as far as we can tell) , -+" 1 otherwise -+function s:IsDelimValid(delimiter, delIndx, line) -+ "get the delimiter without the escchars -+ let l:delimiter = a:delimiter -+ -+ "get the strings before and after the delimiter -+ let preComStr = strpart(a:line, 0, a:delIndx) -+ let postComStr = strpart(a:line, a:delIndx+strlen(delimiter)) -+ -+ "to check if the delimiter is real, make sure it isnt preceded by -+ "an odd number of quotes and followed by the same (which would indicate -+ "that it is part of a string and therefore is not a comment) -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, '"', "\\")) -+ return 0 -+ endif -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "'", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "'", "\\")) -+ return 0 -+ endif -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "`", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "`", "\\")) -+ return 0 -+ endif -+ -+ -+ "if the comment delimiter is escaped, assume it isnt a real delimiter -+ if s:IsEscaped(a:line, a:delIndx, "\\") -+ return 0 -+ endif -+ -+ "vim comments are so fuckin stupid!! Why the hell do they have comment -+ "delimiters that are used elsewhere in the syntax?!?! We need to check -+ "some conditions especially for vim -+ if &filetype == "vim" -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) -+ return 0 -+ endif -+ -+ "if the delimiter is on the very first char of the line or is the -+ "first non-tab/space char on the line then it is a valid comment delimiter -+ if a:delIndx == 0 || a:line =~ "^[ \t]\\{" . a:delIndx . "\\}\".*$" -+ return 1 -+ endif -+ -+ let numLeftParen =s:CountNonESCedOccurances(preComStr, "(", "\\") -+ let numRightParen =s:CountNonESCedOccurances(preComStr, ")", "\\") -+ -+ "if the quote is inside brackets then assume it isnt a comment -+ if numLeftParen > numRightParen -+ return 0 -+ endif -+ -+ "if the line has an even num of unescaped "'s then we can assume that -+ "any given " is not a comment delimiter -+ if s:IsNumEven(s:CountNonESCedOccurances(a:line, "\"", "\\")) -+ return 0 -+ endif -+ endif -+ -+ return 1 -+ -+endfunction -+ -+" Function: s:IsNumEven(num) {{{2 -+" A small function the returns 1 if the input number is even and 0 otherwise -+" Args: -+" -num: the number to check -+function s:IsNumEven(num) -+ return (a:num % 2) == 0 -+endfunction -+ -+" Function: s:IsEscaped(str, indx, escChar) {{{2 -+" This function takes a string, an index into that string and an esc char and -+" returns 1 if the char at the index is escaped (i.e if it is preceded by an -+" odd number of esc chars) -+" Args: -+" -str: the string to check -+" -indx: the index into str that we want to check -+" -escChar: the escape char the char at indx may be ESCed with -+function s:IsEscaped(str, indx, escChar) -+ "initialise numEscChars to 0 and look at the char before indx -+ let numEscChars = 0 -+ let curIndx = a:indx-1 -+ -+ "keep going back thru str until we either reach the start of the str or -+ "run out of esc chars -+ while curIndx >= 0 && strpart(a:str, curIndx, 1) == a:escChar -+ -+ "we have found another esc char so add one to the count and move left -+ "one char -+ let numEscChars = numEscChars + 1 -+ let curIndx = curIndx - 1 -+ -+ endwhile -+ -+ "if there is an odd num of esc chars directly before the char at indx then -+ "the char at indx is escaped -+ return !s:IsNumEven(numEscChars) -+endfunction -+ -+" Function: s:IsInSexyComment(line) {{{2 -+" returns 1 if the given line number is part of a sexy comment -+function s:IsInSexyComment(line) -+ return !empty(s:FindBoundingLinesOfSexyCom(a:line)) -+endfunction -+ -+" Function: s:IsSexyComment(topline, bottomline) {{{2 -+" This function takes in 2 line numbers and returns 1 if the lines between and -+" including the given line numbers are a sexy comment. It returns 0 otherwise. -+" Args: -+" -topline: the line that the possible sexy comment starts on -+" -bottomline: the line that the possible sexy comment stops on -+function s:IsSexyComment(topline, bottomline) -+ -+ "get the delim set that would be used for a sexy comment -+ let left = '' -+ let right = '' -+ if s:Multipart() -+ let left = b:left -+ let right = b:right -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ let right = b:rightAlt -+ else -+ return 0 -+ endif -+ -+ "swap the top and bottom line numbers around if need be -+ let topline = a:topline -+ let bottomline = a:bottomline -+ if bottomline < topline -+ topline = bottomline -+ bottomline = a:topline -+ endif -+ -+ "if there is < 2 lines in the comment it cannot be sexy -+ if (bottomline - topline) <= 0 -+ return 0 -+ endif -+ -+ "if the top line doesnt begin with a left delim then the comment isnt sexy -+ if getline(a:topline) !~ '^[ \t]*' . left -+ return 0 -+ endif -+ -+ "if there is a right delim on the top line then this isnt a sexy comment -+ if s:FindDelimiterIndex(right, getline(a:topline)) != -1 -+ return 0 -+ endif -+ -+ "if there is a left delim on the bottom line then this isnt a sexy comment -+ if s:FindDelimiterIndex(left, getline(a:bottomline)) != -1 -+ return 0 -+ endif -+ -+ "if the bottom line doesnt begin with a right delim then the comment isnt -+ "sexy -+ if getline(a:bottomline) !~ '^.*' . right . '$' -+ return 0 -+ endif -+ -+ let sexyComMarker = s:GetSexyComMarker(0, 1) -+ -+ "check each of the intermediate lines to make sure they start with a -+ "sexyComMarker -+ let currentLine = a:topline+1 -+ while currentLine < a:bottomline -+ let theLine = getline(currentLine) -+ -+ if theLine !~ '^[ \t]*' . sexyComMarker -+ return 0 -+ endif -+ -+ "if there is a right delim in an intermediate line then the block isnt -+ "a sexy comment -+ if s:FindDelimiterIndex(right, theLine) != -1 -+ return 0 -+ endif -+ -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ "we have not found anything to suggest that this isnt a sexy comment so -+ return 1 -+ -+endfunction -+ -+" Function: s:LastIndexOfDelim(delim, str) {{{2 -+" This function takes a string and a delimiter and returns the last index of -+" that delimiter in string -+" Args: -+" -delim: the delimiter to look for -+" -str: the string to look for delim in -+function s:LastIndexOfDelim(delim, str) -+ let delim = a:delim -+ let lenDelim = strlen(delim) -+ -+ "set index to the first occurrence of delim. If there is no occurrence then -+ "bail -+ let indx = s:FindDelimiterIndex(delim, a:str) -+ if indx == -1 -+ return -1 -+ endif -+ -+ "keep moving to the next instance of delim in str till there is none left -+ while 1 -+ -+ "search for the next delim after the previous one -+ let searchStr = strpart(a:str, indx+lenDelim) -+ let indx2 = s:FindDelimiterIndex(delim, searchStr) -+ -+ "if we find a delim update indx to record the position of it, if we -+ "dont find another delim then indx is the last one so break out of -+ "this loop -+ if indx2 != -1 -+ let indx = indx + indx2 + lenDelim -+ else -+ break -+ endif -+ endwhile -+ -+ return indx -+ -+endfunction -+ -+" Function: s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 -+" This function takes in 2 line numbers and returns the index of the left most -+" char (that is not a space or a tab) on all of these lines. -+" Args: -+" -countCommentedLines: 1 if lines that are commented are to be checked as -+" well. 0 otherwise -+" -countEmptyLines: 1 if empty lines are to be counted in the search -+" -topline: the top line to be checked -+" -bottomline: the bottom line to be checked -+function s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) -+ -+ " declare the left most index as an extreme value -+ let leftMostIndx = 1000 -+ -+ " go thru the block line by line updating leftMostIndx -+ let currentLine = a:topline -+ while currentLine <= a:bottomline -+ -+ " get the next line and if it is allowed to be commented, or is not -+ " commented, check it -+ let theLine = getline(currentLine) -+ if a:countEmptyLines || theLine !~ '^[ \t]*$' -+ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) -+ " convert spaces to tabs and get the number of leading spaces for -+ " this line and update leftMostIndx if need be -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let leadSpaceOfLine = strlen( substitute(theLine, '\(^[ \t]*\).*$','\1','') ) -+ if leadSpaceOfLine < leftMostIndx -+ let leftMostIndx = leadSpaceOfLine -+ endif -+ endif -+ endif -+ -+ " move on to the next line -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ if leftMostIndx == 1000 -+ return 0 -+ else -+ return leftMostIndx -+ endif -+endfunction -+ -+" Function: s:Multipart() {{{2 -+" returns 1 if the current delims are multipart -+function s:Multipart() -+ return b:right != '' -+endfunction -+ -+" Function: s:NerdEcho(msg, typeOfMsg) {{{2 -+" Args: -+" -msg: the message to echo -+" -typeOfMsg: 0 = warning message -+" 1 = normal message -+function s:NerdEcho(msg, typeOfMsg) -+ if a:typeOfMsg == 0 -+ echohl WarningMsg -+ echo 'NERDCommenter:' . a:msg -+ echohl None -+ elseif a:typeOfMsg == 1 -+ echo 'NERDCommenter:' . a:msg -+ endif -+endfunction -+ -+" Function: s:NumberOfLeadingTabs(s) {{{2 -+" returns the number of leading tabs in the given string -+function s:NumberOfLeadingTabs(s) -+ return strlen(substitute(a:s, '^\(\t*\).*$', '\1', "")) -+endfunction -+ -+" Function: s:NumLinesInBuf() {{{2 -+" Returns the number of lines in the current buffer -+function s:NumLinesInBuf() -+ return line('$') -+endfunction -+ -+" Function: s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) {{{2 -+" This function takes in a string, 2 delimiters in that string and 2 strings -+" to replace these delimiters with. -+" -+" Args: -+" -toReplace1: the first delimiter to replace -+" -toReplace2: the second delimiter to replace -+" -replacor1: the string to replace toReplace1 with -+" -replacor2: the string to replace toReplace2 with -+" -str: the string that the delimiters to be replaced are in -+function s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) -+ let line = s:ReplaceLeftMostDelim(a:toReplace1, a:replacor1, a:str) -+ let line = s:ReplaceRightMostDelim(a:toReplace2, a:replacor2, line) -+ return line -+endfunction -+ -+" Function: s:ReplaceLeftMostDelim(toReplace, replacor, str) {{{2 -+" This function takes a string and a delimiter and replaces the left most -+" occurrence of this delimiter in the string with a given string -+" -+" Args: -+" -toReplace: the delimiter in str that is to be replaced -+" -replacor: the string to replace toReplace with -+" -str: the string that contains toReplace -+function s:ReplaceLeftMostDelim(toReplace, replacor, str) -+ let toReplace = a:toReplace -+ let replacor = a:replacor -+ "get the left most occurrence of toReplace -+ let indxToReplace = s:FindDelimiterIndex(toReplace, a:str) -+ -+ "if there IS an occurrence of toReplace in str then replace it and return -+ "the resulting string -+ if indxToReplace != -1 -+ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) -+ return line -+ endif -+ -+ return a:str -+endfunction -+ -+" Function: s:ReplaceRightMostDelim(toReplace, replacor, str) {{{2 -+" This function takes a string and a delimiter and replaces the right most -+" occurrence of this delimiter in the string with a given string -+" -+" Args: -+" -toReplace: the delimiter in str that is to be replaced -+" -replacor: the string to replace toReplace with -+" -str: the string that contains toReplace -+" -+function s:ReplaceRightMostDelim(toReplace, replacor, str) -+ let toReplace = a:toReplace -+ let replacor = a:replacor -+ let lenToReplace = strlen(toReplace) -+ -+ "get the index of the last delim in str -+ let indxToReplace = s:LastIndexOfDelim(toReplace, a:str) -+ -+ "if there IS a delimiter in str, replace it and return the result -+ let line = a:str -+ if indxToReplace != -1 -+ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) -+ endif -+ return line -+endfunction -+ -+"FUNCTION: s:RestoreScreenState() {{{2 -+" -+"Sets the screen state back to what it was when s:SaveScreenState was last -+"called. -+" -+function s:RestoreScreenState() -+ if !exists("t:NERDComOldTopLine") || !exists("t:NERDComOldPos") -+ throw 'NERDCommenter exception: cannot restore screen' -+ endif -+ -+ call cursor(t:NERDComOldTopLine, 0) -+ normal zt -+ call setpos(".", t:NERDComOldPos) -+endfunction -+ -+" Function: s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 -+" This function takes in 2 line numbers and returns the index of the right most -+" char on all of these lines. -+" Args: -+" -countCommentedLines: 1 if lines that are commented are to be checked as -+" well. 0 otherwise -+" -countEmptyLines: 1 if empty lines are to be counted in the search -+" -topline: the top line to be checked -+" -bottomline: the bottom line to be checked -+function s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) -+ let rightMostIndx = -1 -+ -+ " go thru the block line by line updating rightMostIndx -+ let currentLine = a:topline -+ while currentLine <= a:bottomline -+ -+ " get the next line and see if it is commentable, otherwise it doesnt -+ " count -+ let theLine = getline(currentLine) -+ if a:countEmptyLines || theLine !~ '^[ \t]*$' -+ -+ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) -+ -+ " update rightMostIndx if need be -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let lineLen = strlen(theLine) -+ if lineLen > rightMostIndx -+ let rightMostIndx = lineLen -+ endif -+ endif -+ endif -+ -+ " move on to the next line -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ return rightMostIndx -+endfunction -+ -+"FUNCTION: s:SaveScreenState() {{{2 -+"Saves the current cursor position in the current buffer and the window -+"scroll position -+function s:SaveScreenState() -+ let t:NERDComOldPos = getpos(".") -+ let t:NERDComOldTopLine = line("w0") -+endfunction -+ -+" Function: s:SwapOutterMultiPartDelimsForPlaceHolders(line) {{{2 -+" This function takes a line and swaps the outter most multi-part delims for -+" place holders -+" Args: -+" -line: the line to swap the delims in -+" -+function s:SwapOutterMultiPartDelimsForPlaceHolders(line) -+ " find out if the line is commented using normal delims and/or -+ " alternate ones -+ let isCommented = s:IsCommented(b:left, b:right, a:line) -+ let isCommentedAlt = s:IsCommented(b:leftAlt, b:rightAlt, a:line) -+ -+ let line2 = a:line -+ -+ "if the line is commented and there is a right delimiter, replace -+ "the delims with place-holders -+ if isCommented && s:Multipart() -+ let line2 = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, a:line) -+ -+ "similarly if the line is commented with the alternative -+ "delimiters -+ elseif isCommentedAlt && s:AltMultipart() -+ let line2 = s:ReplaceDelims(b:leftAlt, b:rightAlt, g:NERDLPlace, g:NERDRPlace, a:line) -+ endif -+ -+ return line2 -+endfunction -+ -+" Function: s:SwapOutterPlaceHoldersForMultiPartDelims(line) {{{2 -+" This function takes a line and swaps the outtermost place holders for -+" multi-part delims -+" Args: -+" -line: the line to swap the delims in -+" -+function s:SwapOutterPlaceHoldersForMultiPartDelims(line) -+ let left = '' -+ let right = '' -+ if s:Multipart() -+ let left = b:left -+ let right = b:right -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ let right = b:rightAlt -+ endif -+ -+ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, a:line) -+ return line -+endfunction -+" Function: s:TabbedCol(line, col) {{{2 -+" Gets the col number for given line and existing col number. The new col -+" number is the col number when all leading spaces are converted to tabs -+" Args: -+" -line:the line to get the rel col for -+" -col: the abs col -+function s:TabbedCol(line, col) -+ let lineTruncated = strpart(a:line, 0, a:col) -+ let lineSpacesToTabs = substitute(lineTruncated, s:TabSpace(), '\t', 'g') -+ return strlen(lineSpacesToTabs) -+endfunction -+"FUNCTION: s:TabSpace() {{{2 -+"returns a string of spaces equal in length to &tabstop -+function s:TabSpace() -+ let tabSpace = "" -+ let spacesPerTab = &tabstop -+ while spacesPerTab > 0 -+ let tabSpace = tabSpace . " " -+ let spacesPerTab = spacesPerTab - 1 -+ endwhile -+ return tabSpace -+endfunction -+ -+" Function: s:UnEsc(str, escChar) {{{2 -+" This function removes all the escape chars from a string -+" Args: -+" -str: the string to remove esc chars from -+" -escChar: the escape char to be removed -+function s:UnEsc(str, escChar) -+ return substitute(a:str, a:escChar, "", "g") -+endfunction -+ -+" Function: s:UntabbedCol(line, col) {{{2 -+" Takes a line and a col and returns the absolute column of col taking into -+" account that a tab is worth 3 or 4 (or whatever) spaces. -+" Args: -+" -line:the line to get the abs col for -+" -col: the col that doesnt take into account tabs -+function s:UntabbedCol(line, col) -+ let lineTruncated = strpart(a:line, 0, a:col) -+ let lineTabsToSpaces = substitute(lineTruncated, '\t', s:TabSpace(), 'g') -+ return strlen(lineTabsToSpaces) -+endfunction -+" Section: Comment mapping setup {{{1 -+" =========================================================================== -+" This is where the mappings calls are made that set up the commenting key -+" mappings. -+ -+" set up the mapping to switch to/from alternative delimiters -+execute 'nnoremap ' . g:NERDAltComMap . ' :call SwitchToAlternativeDelimiters(1)' -+ -+" set up the mappings to comment out lines -+execute 'nnoremap ' . g:NERDComLineMap . ' :call NERDComment(0, "norm")' -+execute 'vnoremap ' . g:NERDComLineMap . ' :call NERDComment(1, "norm")' -+ -+" set up the mappings to do toggle comments -+execute 'nnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(0, "toggle")' -+execute 'vnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(1, "toggle")' -+ -+" set up the mapp to do minimal comments -+execute 'nnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(0, "minimal")' -+execute 'vnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(1, "minimal")' -+ -+" set up the mappings to comment out lines sexily -+execute 'nnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(0, "sexy")' -+execute 'vnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(1, "sexy")' -+ -+" set up the mappings to do invert comments -+execute 'nnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(0, "invert")' -+execute 'vnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(1, "invert")' -+ -+" set up the mappings to yank then comment out lines -+execute 'nmap ' . g:NERDComLineYankMap . ' :call NERDComment(0, "yank")' -+execute 'vmap ' . g:NERDComLineYankMap . ' :call NERDComment(1, "yank")' -+ -+" set up the mappings for left aligned comments -+execute 'nnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(0, "alignLeft")' -+execute 'vnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(1, "alignLeft")' -+ -+" set up the mappings for right aligned comments -+execute 'nnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(0, "alignRight")' -+execute 'vnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(1, "alignRight")' -+ -+" set up the mappings for left and right aligned comments -+execute 'nnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(0, "alignBoth")' -+execute 'vnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(1, "alignBoth")' -+ -+" set up the mappings to do nested comments -+execute 'nnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(0, "nested")' -+execute 'vnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(1, "nested")' -+ -+" set up the mapping to uncomment a line -+execute 'nnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(0, "uncomment")' -+execute 'vnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(1, "uncomment")' -+ -+" set up the mapping to comment out to the end of the line -+execute 'nnoremap ' . g:NERDComToEOLMap . ' :call NERDComment(0, "toEOL")' -+ -+" set up the mappings to append comments to the line -+execute 'nmap ' . g:NERDAppendComMap . ' :call NERDComment(0, "append")' -+ -+" set up the mappings to append comments to the line -+execute 'nmap ' . g:NERDPrependComMap . ' :call NERDComment(0, "prepend")' -+ -+" set up the mapping to insert comment delims at the cursor position in insert mode -+execute 'inoremap ' . g:NERDComInInsertMap . ' ' . ':call NERDComment(0, "insert")' -+ -+" Section: Menu item setup {{{1 -+" =========================================================================== -+"check if the user wants the menu to be displayed -+if g:NERDMenuMode != 0 -+ -+ let menuRoot = "" -+ if g:NERDMenuMode == 1 -+ let menuRoot = 'comment' -+ elseif g:NERDMenuMode == 2 -+ let menuRoot = '&comment' -+ elseif g:NERDMenuMode == 3 -+ let menuRoot = '&Plugin.&comment' -+ endif -+ -+ execute 'nmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(0, "norm")' -+ execute 'vmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(1, "norm")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(0, "toggle")' -+ execute 'vmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(1, "toggle")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(0, "minimal")' -+ execute 'vmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(1, "minimal")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(0, "nested")' -+ execute 'vmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(1, "nested")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ To\ EOL' . escape(g:NERDComToEOLMap, '\') . ' :call NERDComment(0, "toEOL")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(0,"invert")' -+ execute 'vmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(1,"invert")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(0,"sexy")' -+ execute 'vmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(1,"sexy")' -+ -+ execute 'nmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0Y' . g:NERDComLineMap -+ execute 'vmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0ygv' . g:NERDComLineMap -+ -+ execute 'nmenu '. menuRoot .'.Append\ Comment\ to\ Line' . escape(g:NERDAppendComMap, '\') . ' :call NERDComment(0, "append")' -+ execute 'nmenu '. menuRoot .'.Prepend\ Comment\ to\ Line' . escape(g:NERDPrependComMap, '\') . ' :call NERDComment(0, "prepend")' -+ -+ execute 'menu '. menuRoot .'.-Sep- :' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(0, "alignLeft")' -+ execute 'vmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(1, "alignLeft")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(0, "alignRight")' -+ execute 'vmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(1, "alignRight")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(0, "alignBoth")' -+ execute 'vmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(1, "alignBoth")' -+ -+ execute 'menu '. menuRoot .'.-Sep2- :' -+ -+ execute 'menu '. menuRoot .'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(0, "uncomment")' -+ execute 'vmenu ' . menuRoot.'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(1, "uncomment")' -+ -+ execute 'menu '. menuRoot .'.-Sep3- :' -+ -+ execute 'nmenu '. menuRoot .'.Use\ Alternative\ Delimiters' . escape(g:NERDAltComMap, '\') . ' :call SwitchToAlternativeDelimiters(1)' -+ -+ -+ execute 'imenu '. menuRoot .'.Insert\ Delims' . escape(g:NERDComInInsertMap, '\') . ' :call NERDComment(0, "insert")' -+ -+ execute 'menu '. menuRoot .'.-Sep4- :' -+ -+ execute 'menu '. menuRoot .'.Help:help\ NERDCommenterContents :help NERDCommenterContents' -+endif -+ -+" Section: Doc installation call {{{1 -+silent call s:InstallDocumentation(expand(':p'), s:NERD_commenter_version) -+ -+finish -+"============================================================================= -+" Section: The help file {{{1 -+" Title {{{2 -+" ============================================================================ -+=== START_DOC -+*NERD_commenter.txt* Plugin for commenting code #version# -+ -+ -+ NERD COMMENTER REFERENCE MANUAL~ -+ -+ -+ -+ -+ -+============================================================================== -+CONTENTS {{{2 *NERDCommenterContents* -+ -+ 1.Intro...................................|NERDCommenter| -+ 2.Functionality provided..................|NERDComFunctionality| -+ 2.1 Functionality Summary.............|NERDComFunctionalitySummary| -+ 2.2 Functionality Details.............|NERDComFunctionalityDetails| -+ 2.2.1 Comment map.................|NERDComComment| -+ 2.2.2 Nested comment map..........|NERDComNestedComment| -+ 2.2.3 Toggle comment map..........|NERDComToggleComment| -+ 2.2.4 Minimal comment map.........|NERDComMinimalComment| -+ 2.2.5 Invert comment map..........|NERDComInvertComment| -+ 2.2.6 Sexy comment map............|NERDComSexyComment| -+ 2.2.7 Yank comment map............|NERDComYankComment| -+ 2.2.8 Comment to EOL map..........|NERDComEOLComment| -+ 2.2.9 Append com to line map......|NERDComAppendComment| -+ 2.2.10 Prepend com to line map....|NERDComPrependComment| -+ 2.2.11 Insert comment map.........|NERDComInsertComment| -+ 2.2.12 Use alternate delims map...|NERDComAltDelim| -+ 2.2.13 Comment aligned maps.......|NERDComAlignedComment| -+ 2.2.14 Uncomment line map.........|NERDComUncommentLine| -+ 2.3 Supported filetypes...............|NERDComFiletypes| -+ 2.4 Sexy Comments.....................|NERDComSexyComments| -+ 2.5 The NERDComment function..........|NERDComNERDComment| -+ 3.Options.................................|NERDComOptions| -+ 3.1 Options summary...................|NERDComOptionsSummary| -+ 3.2 Options details...................|NERDComOptionsDetails| -+ 3.3 Default delimiter Options.........|NERDComDefaultDelims| -+ 3.4 Key mapping Options...............|NERDComMappings| -+ 4.Issues with the script..................|NERDComIssues| -+ 4.1 Delimiter detection heuristics....|NERDComHeuristics| -+ 4.2 Nesting issues....................|NERDComNesting| -+ 5.The author..............................|NERDComAuthor| -+ 6.TODO list...............................|NERDComTodo| -+ 7.Changelog...............................|NERDComChangelog| -+ 8.Credits.................................|NERDComCredits| -+ -+============================================================================== -+1. Intro {{{2 *NERDCommenter* -+ -+The NERD commenter provides many different commenting operations and styles -+which may be invoked via key mappings and a commenting menu. These operations -+are available for most filetypes. -+ -+There are also options available that allow you to tweak the commenting engine -+to you taste. -+ -+============================================================================== -+2. Functionality provided {{{2 *NERDComFunctionality* -+ -+------------------------------------------------------------------------------ -+2.1 Functionality summary {{{3 *NERDComFunctionalitySummary* -+ -+The following key mappings are provided by default (there is also a menu -+provided that contains menu items corresponding to all the below mappings): -+ -+Most of the following mappings are for normal/visual mode only. The -+|NERDComInsertComment| mapping is for insert mode only. -+ -+[count],cc |NERDComComment| -+Comments out the current line or text selected in visual mode. -+ -+ -+[count],cn |NERDComNestedComment| -+Same as |NERDComComment| but forces nesting. -+ -+ -+[count],c |NERDComToggleComment| -+Toggles the comment state of the selected line(s). If the topmost selected -+line is commented, all selected lines are uncommented and vice versa. -+ -+ -+[count],cm |NERDComMinimalComment| -+Comments the given lines using only one set of multipart delimiters if -+possible. -+ -+ -+[count],ci |NERDComInvertComment| -+Toggles the comment state of the selected line(s) individually. Each selected -+line that is commented is uncommented and vice versa. -+ -+ -+[count],cs |NERDComSexyComment| -+Comments out the selected lines ``sexually'' -+ -+ -+[count],cy |NERDComYankComment| -+Same as |NERDComComment| except that the commented line(s) are yanked -+before commenting. -+ -+ -+,c$ |NERDComEOLComment| -+Comments the current line from the cursor to the end of line. -+ -+ -+,cA |NERDComAppendComment| -+Adds comment delimiters to the end of line and goes into insert mode between -+them. -+ -+ -+,cI |NERDComPrependComment| -+Adds comment delimiters to the start of line and goes into insert mode between -+them. -+ -+ -+ |NERDComInsertComment| -+Adds comment delimiters at the current cursor position and inserts between. -+ -+ -+,ca |NERDComAltDelim| -+Switches to the alternative set of delimiters. -+ -+ -+[count],cl -+[count],cr -+[count],cb |NERDComAlignedComment| -+Same as |NERDComComment| except that the delimiters are aligned down the -+left side (,cl), the right side (,cr) or both sides -+(,cb). -+ -+ -+[count],cu |NERDComUncommentLine| -+Uncomments the selected line(s). -+ -+------------------------------------------------------------------------------ -+2.2 Functionality details {{{3 *NERDComFunctionalityDetails* -+ -+------------------------------------------------------------------------------ -+2.2.1 Comment map *NERDComComment* -+ -+Default mapping: [count],cc -+Change the mapping with: NERDComLineMap. -+Applicable modes: normal visual visual-line visual-block. -+ -+ -+Comments out the current line. If multiple lines are selected in visual-line -+mode, they are all commented out. If some text is selected in visual or -+visual-block mode then the script will try to comment out the exact text that -+is selected using multi-part delimiters if they are available. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.2 Nested comment map *NERDComNestedComment* -+ -+Default mapping: [count],cn -+Change the mapping with: NERDComLineNestMap. -+Applicable modes: normal visual visual-line visual-block. -+ -+Performs nested commenting. Works the same as ,cc except that if a -+line is already commented then it will be commented again. -+ -+If |NERDUsePlaceHolders| is set then the previous comment delimiters will -+be replaced by place-holder delimiters if needed. Otherwise the nested -+comment will only be added if the current commenting delimiters have no right -+delimiter (to avoid syntax errors) -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+Related options: -+|NERDDefaultNesting| -+ -+------------------------------------------------------------------------------ -+2.2.3 Toggle comment map *NERDComToggleComment* -+ -+Default mapping: [count],c -+Change the mapping with: NERDComLineToggleMap. -+Applicable modes: normal visual-line. -+ -+Toggles commenting of the lines selected. The behaviour of this mapping -+depends on whether the first line selected is commented or not. If so, all -+selected lines are uncommented and vice versa. -+ -+With this mapping, a line is only considered to be commented if it starts with -+a left delimiter. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.4 Minimal comment map *NERDComMinimalComment* -+ -+Default mapping: [count],cm -+Change the mapping with: NERDComLineMinimalMap -+Applicable modes: normal visual-line. -+ -+Comments the selected lines using one set of multipart delimiters if possible. -+ -+For example: if you are programming in c and you select 5 lines and press -+,cm then a '/*' will be placed at the start of the top line and a '*/' -+will be placed at the end of the last line. -+ -+Sets of multipart comment delimiters that are between the top and bottom -+selected lines are replaced with place holders (see |NERDLPlace|) if -+|NERDUsePlaceHolders| is set for the current filetype. If it is not, then -+the comment will be aborted if place holders are required to prevent illegal -+syntax. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.5 Invert comment map *NERDComInvertComment* -+ -+Default mapping: ,ci -+Change the mapping with: NERDComLineInvertMap. -+Applicable modes: normal visual-line. -+ -+Inverts the commented state of each selected line. If the a selected line is -+commented then it is uncommented and vice versa. Each line is examined and -+commented/uncommented individually. -+ -+With this mapping, a line is only considered to be commented if it starts with -+a left delimiter. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.6 Sexy comment map *NERDComSexyComment* -+ -+Default mapping: [count],cs -+Change the mapping with: NERDComLineSexyMap -+Applicable modes: normal, visual-line. -+ -+Comments the selected line(s) ``sexily''... see |NERDComSexyComments| for -+a description of what sexy comments are. Can only be done on filetypes for -+which there is at least one set of multipart comment delimiters specified. -+ -+Sexy comments cannot be nested and lines inside a sexy comment cannot be -+commented again. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+Related options: -+|NERDCompactSexyComs| -+ -+------------------------------------------------------------------------------ -+2.2.7 Yank comment map *NERDComYankComment* -+ -+Default mapping: [count],cy -+Change the mapping with: NERDComLineYankMap -+Applicable modes: normal visual visual-line visual-block. -+ -+Same as ,cc except that it yanks the line(s) that are commented first. -+ -+------------------------------------------------------------------------------ -+2.2.8 Comment to EOL map *NERDComEOLComment* -+ -+Default mapping: ,c$ -+Change the mapping with: NERDComToEOLMap -+Applicable modes: normal. -+ -+Comments the current line from the current cursor position up to the end of -+the line. -+ -+------------------------------------------------------------------------------ -+2.2.9 Append com to line map *NERDComAppendComment* -+ -+Default mapping: ,cA -+Change the mapping with: NERDAppendComMap. -+Applicable modes: normal. -+ -+Appends comment delimiters to the end of the current line and goes -+to insert mode between the new delimiters. -+ -+------------------------------------------------------------------------------ -+2.2.10 Prepend com to line map *NERDComPrependComment* -+ -+Default mapping: ,cI -+Change the mapping with: NERDPrependComMap. -+Applicable modes: normal. -+ -+Prepends comment delimiters to the start of the current line and goes to -+insert mode between the new delimiters. -+ -+------------------------------------------------------------------------------ -+2.2.11 Insert comment map *NERDComInsertComment* -+ -+Default mapping: -+Change the mapping with: NERDComInInsertMap. -+Applicable modes: insert. -+ -+Adds comment delimiters at the current cursor position and inserts -+between them. -+ -+------------------------------------------------------------------------------ -+2.2.12 Use alternate delims map *NERDComAltDelim* -+ -+Default mapping: ,ca -+Change the mapping with: NERDAltComMap -+Applicable modes: normal. -+ -+Changes to the alternative commenting style if one is available. For example, -+if the user is editing a c++ file using // comments and they hit ,ca -+then they will be switched over to /**/ comments. -+ -+See also |NERDComDefaultDelims| -+ -+------------------------------------------------------------------------------ -+2.2.13 Comment aligned maps *NERDComAlignedComment* -+ -+Default mappings: [count],cl [count],cr [count],cb -+Change the mappings with: NERDComAlignLeftMap, NERDComAlignRightMap and -+NERDComAlignBothMap. -+Applicable modes: normal visual-line. -+ -+Same as ,cc except that the comment delimiters are aligned on the left -+side, right side or both sides respectively. These comments are always nested -+if the line(s) are already commented. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.14 Uncomment line map *NERDComUncommentLine* -+ -+Default mapping: [count],cu -+Change the mapping with: NERDUncomLineMap. -+Applicable modes: normal visual visual-line visual-block. -+ -+Uncomments the current line. If multiple lines are selected in -+visual mode then they are all uncommented. -+ -+When uncommenting, if the line contains multiple sets of delimiters then the -+``outtermost'' pair of delimiters will be removed. -+ -+The script uses a set of heurisics to distinguish ``real'' delimiters from -+``fake'' ones when uncommenting. See |NERDComIssues| for details. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+Related options: -+|NERDRemoveAltComs| -+|NERDRemoveExtraSpaces| -+ -+------------------------------------------------------------------------------ -+2.3 Supported filetypes {{{3 *NERDComFiletypes* -+ -+Filetypes that can be commented by this plugin: -+abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asn -+aspvbs atlas autohotkey autoit automake ave awk basic b bc bdf bib bindzone -+bst btm caos catalog c cfg cg ch changelog cl clean clipper cmake conf config -+context cpp crontab cs csc csp css cterm cupl csv cvs dcl debchangelog -+debcontrol debsources def diff django docbk dns dosbatch dosini dot dracula -+dsl dtd dtml dylan ecd eiffel elf elmfilt erlang eruby eterm expect exports -+fetchmail fgl focexec form fortran foxpro fstab fvwm fx gdb gdmo geek -+gentoo-package-keywords' gentoo-package-mask' gentoo-package-use' gnuplot -+gtkrc haskell hb h help hercules hog html htmldjango htmlos ia64 icon idlang -+idl indent inform inittab ishd iss ist jam java javascript jess jgraph -+jproperties jproperties jsp kconfig kix kscript lace lex lftp lifelines lilo -+lisp lite lotos lout lprolog lscript lss lua lynx m4 mail make maple masm -+master matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc -+named nasm nastran natural ncf netdict netrw nqc nroff nsis objc ocaml occam -+omlet omnimark openroad opl ora otl ox pascal passwd pcap pccts perl pfmain -+php phtml pic pike pilrc pine plaintex plm plsql po postscr pov povini ppd -+ppwiz procmail progress prolog psf ptcap python python qf radiance ratpoison r -+rc readline rebol registry remind rexx robots rpl rtf ruby sa samba sas sass -+sather scheme scilab screen scsh sdl sed selectbuf sgml sgmldecl sgmllnx sh -+sicad simula sinda skill slang sl slrnrc sm smarty smil smith sml snnsnet -+snnspat snnsres snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp -+strace svn systemverilog tads taglist tags tak tasm tcl terminfo tex text -+plaintex texinfo texmf tf tidy tli trasys tsalt tsscl tssgm uc uil vb verilog -+verilog_systemverilog vgrindefs vhdl vim viminfo virata vo_base vrml vsejcl -+webmacro wget winbatch wml wvdial xdefaults xf86conf xhtml xkb xmath xml -+xmodmap xpm2 xpm xslt yacc yaml z8a -+ -+If a language is not in the list of hardcoded supported filetypes then the -+&commentstring vim option is used. -+ -+------------------------------------------------------------------------------ -+2.4 Sexy Comments {{{3 *NERDComSexyComments* -+These are comments that use one set of multipart comment delimiters as well as -+one other marker symbol. For example: > -+ /* -+ * This is a c style sexy comment -+ * So there! -+ */ -+ -+ /* This is a c style sexy comment -+ * So there! -+ * But this one is ``compact'' style */ -+< -+Here the multipart delimiters are /* and */ and the marker is *. The NERD -+commenter is capable of adding and removing comments of this type. -+ -+------------------------------------------------------------------------------ -+2.5 The NERDComment function {{{3 *NERDComNERDComment* -+ -+All of the NERD commenter mappings and menu items invoke a single function -+which delegates the commenting work to other functions. This function is -+public and has the prototype: > -+ function! NERDComment(isVisual, type) -+< -+The arguments to this function are simple: -+ - isVisual: if you wish to do any kind of visual comment then set this to -+ 1 and the function will use the '< and '> marks to find the comment -+ boundries. If set to 0 then the function will operate on the current -+ line. -+ - type: is used to specify what type of commenting operation is to be -+ performed, and it can be one of the following: 'sexy', 'invert', -+ 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', -+ 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' -+ -+For example, if you typed > -+ :call NERDComment(1, 'sexy') -+< -+then the script would do a sexy comment on the last visual selection. -+ -+ -+============================================================================== -+3. Options {{{2 *NERDComOptions* -+ -+------------------------------------------------------------------------------ -+3.1 Options summary *NERDComOptionsSummary* -+ -+|loaded_nerd_comments| Turns off the script. -+|NERDAllowAnyVisualDelims| Allows multipart alternative delims to -+ be used when commenting in -+ visual/visual-block mode. -+|NERDBlockComIgnoreEmpty| Forces right delims to be placed when -+ doing visual-block comments. -+|NERDCommentWholeLinesInVMode| Changes behaviour of visual comments. -+|NERDDefaultNesting| Tells the script to use nested comments -+ by default. -+|NERDMenuMode| Specifies how the NERD commenter menu -+ will appear (if at all). -+|NERDLPlace| Specifies what to use as the left -+ delimiter placeholder when nesting -+ comments. -+|NERDMapleader| Specifies what all the commenting key -+ mappings will begin with. -+|NERDUsePlaceHolders| Specifies which filetypes may use -+ placeholders when nesting comments. -+|NERDRemoveAltComs| Tells the script whether to remove -+ alternative comment delimiters when -+ uncommenting. -+|NERDRemoveExtraSpaces| Tells the script to always remove the -+ extra spaces when uncommenting -+ (regardless of whether NERDSpaceDelims -+ is set) -+|NERDRPlace| Specifies what to use as the right -+ delimiter placeholder when nesting -+ comments. -+|NERDShutUp| Stops "Unknown filetype" output from the -+ script -+|NERDSpaceDelims| Specifies whether to add extra spaces -+ around delimiters when commenting, and -+ whether to remove them when -+ uncommenting. -+|NERDCompactSexyComs| Specifies whether to use the compact -+ style sexy comments. -+ -+------------------------------------------------------------------------------ -+3.3 Options details *NERDComOptionsDetails* -+ -+To enable any of the below options you should put the given line in your -+~/.vimrc -+ -+ *loaded_nerd_comments* -+If this script is driving you insane you can turn it off by setting this -+option > -+ let loaded_nerd_comments=1 -+< -+------------------------------------------------------------------------------ -+ *NERDAllowAnyVisualDelims* -+Values: 0 or 1. -+Default: 1. -+ -+If set to 1 then, when doing a visual or visual-block comment (but not a -+visual-line comment), the script will choose the right delimiters to use for -+the comment. This means either using the current delimiters if they are -+multipart or using the alternative delimiters if THEY are multipart. For -+example if we are editing the following java code: > -+ float foo = 1221; -+ float bar = 324; -+ System.out.println(foo * bar); -+< -+If we are using // comments and select the "foo" and "bar" in visual-block -+mode, as shown left below (where '|'s are used to represent the visual-block -+boundary), and comment it then the script will use the alternative delims as -+shown on the right: > -+ -+ float |foo| = 1221; float /*foo*/ = 1221; -+ float |bar| = 324; float /*bar*/ = 324; -+ System.out.println(foo * bar); System.out.println(foo * bar); -+< -+------------------------------------------------------------------------------ -+ *NERDBlockComIgnoreEmpty* -+Values: 0 or 1. -+Default: 1. -+ -+This option affects visual-block mode commenting. If this option is turned -+on, lines that begin outside the right boundary of the selection block will be -+ignored. -+ -+For example, if you are commenting this chunk of c code in visual-block mode -+(where the '|'s are used to represent the visual-block boundary) > -+ #include -+ #include -+ #include -+ |int| main(){ -+ | | printf("SUCK THIS\n"); -+ | | while(1){ -+ | | fork(); -+ | | } -+ |} | -+< -+If NERDBlockComIgnoreEmpty=0 then this code will become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ /* */ printf("SUCK THIS\n"); -+ /* */ while(1){ -+ /* */ fork(); -+ /* */ } -+ /*} */ -+< -+Otherwise, the code block would become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ printf("SUCK THIS\n"); -+ while(1){ -+ fork(); -+ } -+ /*} */ -+< -+------------------------------------------------------------------------------ -+ *NERDCommentWholeLinesInVMode* -+Values: 0, 1 or 2. -+Default: 0. -+ -+By default the script tries to comment out exactly what is selected in visual -+mode (v). For example if you select and comment the following c code (using | -+to represent the visual boundary): > -+ in|t foo = 3; -+ int bar =| 9; -+ int baz = foo + bar; -+< -+This will result in: > -+ in/*t foo = 3;*/ -+ /*int bar =*/ 9; -+ int baz = foo + bar; -+< -+But some people prefer it if the whole lines are commented like: > -+ /*int foo = 3;*/ -+ /*int bar = 9;*/ -+ int baz = foo + bar; -+< -+If you prefer the second option then stick this line in your vimrc: > -+ let NERDCommentWholeLinesInVMode=1 -+< -+ -+If the filetype you are editing only has no multipart delimiters (for example -+a shell script) and you hadnt set this option then the above would become > -+ in#t foo = 3; -+ #int bar = 9; -+< -+(where # is the comment delimiter) as this is the closest the script can -+come to commenting out exactly what was selected. If you prefer for whole -+lines to be commented out when there is no multipart delimiters but the EXACT -+text that was selected to be commented out if there IS multipart delimiters -+then stick the following line in your vimrc: > -+ let NERDCommentWholeLinesInVMode=2 -+< -+ -+Note that this option does not affect the behaviour of |visual-block| mode. -+ -+------------------------------------------------------------------------------ -+ *NERDRemoveAltComs* -+Values: 0 or 1. -+Default: 1. -+ -+When uncommenting a line (for a filetype with an alternative commenting style) -+this option tells the script whether to look for, and remove, comments -+delimiters of the alternative style. -+ -+For example, if you are editing a c++ file using // style comments and you go -+,cu on this line: > -+ /* This is a c++ comment baby! */ -+< -+It will not be uncommented if the NERDRemoveAltComs is set to 0. -+ -+------------------------------------------------------------------------------ -+ *NERDRemoveExtraSpaces* -+Values: 0 or 1. -+Default: 1. -+ -+By default, the NERD commenter will remove spaces around comment delimiters if -+either: -+1. |NERDSpaceDelims| is set to 1. -+2. NERDRemoveExtraSpaces is set to 1. -+ -+This means that if we have the following lines in a c code file: > -+ /* int foo = 5; */ -+ /* int bar = 10; */ -+ int baz = foo + bar -+< -+If either of the above conditions hold then if these lines are uncommented -+they will become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+Otherwise they would become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+If you want the spaces to be removed only if |NERDSpaceDelims| is set then -+set NERDRemoveExtraSpaces to 0. -+ -+------------------------------------------------------------------------------ -+ *NERDLPlace* -+ *NERDRPlace* -+Values: arbitrary string. -+Default: -+ NERDLPlace: "[>" -+ NERDRPlace: "<]" -+ -+These options are used to control the strings used as place-holder delimiters. -+Place holder delimiters are used when performing nested commenting when the -+filetype supports commenting styles with both left and right delimiters. -+To set these options use lines like: > -+ let NERDLPlace="FOO" -+ let NERDRPlace="BAR" -+< -+Following the above example, if we have line of c code: > -+ /* int horse */ -+< -+and we comment it with ,cn it will be changed to: > -+ /*FOO int horse BAR*/ -+< -+When we uncomment this line it will go back to what it was. -+ -+------------------------------------------------------------------------------ -+ *NERDMapleader* -+Values: arbitrary string. -+Default: \c -+ -+NERDMapleader is used to specify what all the NERD commenter key mappings -+begin with. -+ -+The default key mappings will look like this: > -+ \cc -+ \cu -+ \ca -+ \ci -+ \cs -+ ... -+< -+However, if this line: > -+ let NERDMapleader = ',x' -+< -+were present in your vimrc then the default mappings would look like this: > -+ ,xc -+ ,xu -+ ,xa -+ ,xi -+ ,xs -+ ... -+< -+This option only affects the mappings that have not been explicitly set -+manually (see |NERDComMappings|). -+ -+------------------------------------------------------------------------------ -+ *NERDMenuMode* -+Values: 0, 1, 2, 3. -+Default: 3 -+ -+This option can take 4 values: -+ "0": Turns the menu off. -+ "1": Turns the 'comment' menu on with no menu shortcut. -+ "2": Turns the 'comment 'menu on with -c as the shortcut. -+ "3": Turns the 'Plugin -> comment' menu on with -c as the shortcut. -+ -+------------------------------------------------------------------------------ -+ *NERDUsePlaceHolders* -+Values: 0 or 1. -+Default 1. -+ -+This option is used to specify whether place-holder delimiters should be used -+when adding nested comments. -+ -+------------------------------------------------------------------------------ -+ *NERDShutUp* -+Values: 0 or 1. -+Default 1. -+ -+This option is used to prevent the script from echoing "Unknown filetype" -+messages. Stick this line in your vimrc: > -+ let NERDShutUp=1 -+< -+------------------------------------------------------------------------------ -+ *NERDSpaceDelims* -+Values: 0 or 1. -+Default 0. -+ -+Some people prefer a space after the left delimiter and before the right -+delimiter like this: > -+ /* int foo=2; */ -+< -+as opposed to this: > -+ /*int foo=2;*/ -+< -+If you want spaces to be added then set NERDSpaceDelims to 1 in your vimrc. -+ -+See also |NERDRemoveExtraSpaces|. -+ -+------------------------------------------------------------------------------ -+ *NERDCompactSexyComs* -+Values: 0 or 1. -+Default 0. -+ -+Some people may want their sexy comments to be like this: > -+ /* Hi There! -+ * This is a sexy comment -+ * in c */ -+< -+As opposed to like this: > -+ /* -+ * Hi There! -+ * This is a sexy comment -+ * in c -+ */ -+< -+If this option is set to 1 then the top style will be used. -+ -+------------------------------------------------------------------------------ -+ *NERDDefaultNesting* -+Values: 0 or 1. -+Default 0. -+ -+When this option is set to 1, comments are nested automatically. That is, if -+you hit ,cc on a line that is already commented it will be commented -+again -+ -+------------------------------------------------------------------------------ -+3.3 Default delimiter customisation *NERDComDefaultDelims* -+ -+If you want the NERD commenter to use the alternative delimiters for a -+specific filetype by default then put a line of this form into your vimrc: > -+ let NERD_<&filetype>_alt_style=1 -+< -+Example: java uses // style comments by default, but you want it to default to -+/* */ style comments instead. You would put this line in your vimrc: > -+ let NERD_java_alt_style=1 -+< -+ -+See |NERDComAltDelim| for switching commenting styles at runtime. -+ -+------------------------------------------------------------------------------ -+3.4 Key mapping customisation *NERDComMappings* -+ -+These options are used to override the default keys that are used for the -+commenting mappings. Their values must be set to strings. As an example: if -+you wanted to use the mapping ,foo to uncomment lines of code then -+you would place this line in your vimrc > -+ let NERDUncomLineMap=",foo" -+< -+Check out |NERDComFunctionality| for details about what the following -+mappings do. -+ -+Default Mapping Option to override~ -+ -+,ca NERDAltComMap -+,ce NERDAppendComMap -+,cl NERDComAlignLeftMap -+,cb NERDComAlignBothMap -+,cr NERDComAlignRightMap -+ NERDComInInsertMap -+,ci NERDComLineInvertMap -+,cc NERDComLineMap -+,cn NERDComLineNestMap -+,cs NERDComLineSexyMap -+,c NERDComLineToggleMap -+,cm NERDComLineMinimalMap -+,c$ NERDComToEOLMap -+,cy NERDComLineYankMap -+,cu NERDUncomLineMap -+ -+============================================================================== -+4. Issues with the script{{{2 *NERDComIssues* -+ -+ -+------------------------------------------------------------------------------ -+4.1 Delimiter detection heuristics *NERDComHeuristics* -+ -+Heuristics are used to distinguish the real comment delimiters -+ -+Because we have comment mappings that place delimiters in the middle of lines, -+removing comment delimiters is a bit tricky. This is because if comment -+delimiters appear in a line doesnt mean they really ARE delimiters. For -+example, Java uses // comments but the line > -+ System.out.println("//"); -+< -+clearly contains no real comment delimiters. -+ -+To distinguish between ``real'' comment delimiters and ``fake'' ones we use a -+set of heuristics. For example, one such heuristic states that any comment -+delimiter that has an odd number of non-escaped " characters both preceding -+and following it on the line is not a comment because it is probably part of a -+string. These heuristics, while usually pretty accurate, will not work for all -+cases. -+ -+------------------------------------------------------------------------------ -+4.2 Nesting issues *NERDComNesting* -+ -+If we have some line of code like this: > -+ /*int foo */ = /*5 + 9;*/ -+< -+This will not be uncommented legally. The NERD commenter will remove the -+"outter most" delimiters so the line will become: > -+ int foo */ = /*5 + 9; -+< -+which almost certainly will not be what you want. Nested sets of comments will -+uncomment fine though. Eg: > -+ /*int/* foo =*/ 5 + 9;*/ -+< -+will become: > -+ int/* foo =*/ 5 + 9; -+< -+(Note that in the above examples I have deliberately not used place holders -+for simplicity) -+ -+============================================================================== -+6. The author {{{2 *NERDComAuthor* -+ -+The author of the NERD commenter is Martyzillatron --- the half robot, half -+dinosaur bastard son of Megatron and Godzilla. He enjoys destroying -+metropolises and eating tourist busses. -+ -+Drop him a line at martin_grenfell at msn.com. He would love to hear from you. -+its a lonely life being the worlds premier terror machine. How would you feel -+if your face looked like a toaster and a t-rex put together? :( -+ -+============================================================================== -+7. TODO list {{{2 *NERDComTodo* -+ -+Uncommenting of minimal comments needs to be more robust. Currently it is easy -+to get illegal syntax when uncommenting them. -+ -+ -+ -+============================================================================== -+8. Changelog {{{2 *NERDComChangelog* -+ -+2.1.4 -+ - added support for the ahk filetype. Cheers to Don Hatlestad for the -+ email. -+ - added support for desktop and xsd filetypes. Thanks to Christophe Benz. -+ - added dummy support for Rails-log -+ - fixed a bunch of bugs in the comment delimiter setup process, thanks to -+ Cheng Fang for the email :D -+ - hardcore refactoring and removal of seldomly used, overly-complex -+ functionality. -+ - the script now requires vim 7 -+2.1.3 -+ - fixed numerous bugs that were causing tabs to permanently be converted -+ to spaces, even if noexpandtab was set. Thanks to Heptite on #vim for -+ working with me to track them down :) -+ - added dummy support for "lookupfile". Thanks to David Fishburn for the -+ email. -+ - added support for "rst", thanks to Niels Aan de Brugh for the email. -+ -+2.1.2 -+ - added support for the vera and ldif filetypes. Thanks to Normandie -+ Azucena and Florian Apolloner for the emails. -+ -+2.1.1 -+ - added dummy support for SVNcommitlog and vcscommit. Thanks to John -+ O'Shea for the email. -+ - added support for Groovy. Thanks to Jason Mills for the email. -+2.1.0 -+ - now the script resets the delimiters when the filetype of the buffer -+ changes (thanks to James Hales for the patch) -+ - added formal support/doc for prepending a count to many of the -+ commenting maps so you can go, eg, 5,cc to comment 5 lines from normal -+ mode. Thanks again to James Hales for the patch. -+ - added support for the "gams" filetype that Jorge Rodrigues created. -+ - added support for the "objc" filetype, thanks to Rainer Müller for the -+ email. -+ - added support for the "sass" filetype that Dmitry Ilyashevich created. -+ -+2.0.7 -+ - Added support for eclass and ebuild filetypes. Thanks to Alex Tarkovsky -+ for the email. -+ -+2.0.6 -+ - Changed the default setting of NERDMapleader to ",c", meaning all the -+ maps now start with ,c instead of \c. This is to stop a major mapping -+ clash with the vcscommand plugin. Anyone wanting to keep the \c map -+ leader should read :help NERDMapleader. -+ - Added support for debcontrol and dummy support for debchangelog -+ filetypes, thanks to Stefano Zacchiroli for the email. -+ - Made it so that the NERDShutUp option now only controls the "Pleeease -+ email the delimiters..." requests. It no longer affects the general -+ output of the script. -+ - Simplified the names of the help tags. -+ -+2.0.5 -+ - Added support for autoit, autohotkey and docbk filetypes (thanks to -+ Michael Böhler) -+ - Added support for cmake (thanks to Aaron Small) -+ - Added support for htmldjango and django filetypes (thanks to Ramiro -+ Morales) -+ - Improved the delimiters for eruby again -+ - Applied a patch from Seth Mason to fix some pathing issues with the help -+ file installation. -+ -+2.0.4 -+ - Added support for verilog_systemverilog and systemverilog filetypes -+ (Thanks to Alexey for the email) -+ - Added support for fstab, thanks to Lizendir for the email. -+ - Added support for the smarty filetype. -+ - Improved the delimiters for eruby. -+ - Added dummy support for changelog filetype. -+ -+2.0.3 -+ - Added dummy support for the csv filetype (thx to Mark Woodward for the -+ email) -+ - Added dummy support for vo_base and otl filetypes (thanks to fREW for -+ the email) -+ -+2.0.2: -+ - Minor bug fix that was stopping nested comments from working -+ -+2.0.1: -+ - Fixed the visual bell for the |NERDComToEOLMap| map. -+ - Added another possible value to the NERDMenuMode option which causes the -+ menu to be displayed under 'Plugin -> Comment'. See :h NERDMenuMode. -+ This new menu mode is now the default. -+ - Added support for the occam filetype (thanks to Anders for emailing me) -+ - Made the main commenting function (NERDComment) available outside the -+ script. -+ - bug fixes and refactoring -+ -+2.0.0: -+ - NOTE: renamed the script to NERD_commenter.vim. When you install this -+ version you must delete the old files: NERD_comments.vim and -+ NERD_comments.txt. -+ - Reworked the mappings and main entry point function for the script to -+ avoid causing visual-bells and screen scrolling. -+ - Changes to the script options (see |NERD_com-Customisation| for -+ details): -+ - They are all camel case now instead of underscored. -+ - Converted all of the regular expression options into simple boolean -+ options for simplicity. -+ - All the options are now stated positively, eg. -+ NERD_dont_remove_spaces_regexp has become NERDRemoveExtraSpaces. -+ - Some of the option names have been changed (other than in the above -+ ways) -+ - Some have been removed altogether, namely: NERD_create_h_filetype -+ (why was a commenting script creating a filetype?!), -+ NERD_left_align_regexp, NERD_right_align_regexp, -+ -+ - Removed all the NERD_use_alt_style_XXX_coms options and replaced them -+ with a better system. Now if a filetype has alternative delims, the -+ script will check whether an option of the form -+ "NERD_<&filetype>_alt_style" exists, and if it does then alt delims will -+ be used. See |NERD_com-cust-delims| for details. -+ - The script no longer removes extra spaces for sexy comments for the -+ NERDRemoveExtraSpaces option (it will still remove spaces if -+ NERDSpaceDelims is set). -+ - Added dummy support for viminfo and rtf. -+ - Added support for the "gentoo-package-\(keywords\|mask\|use\)" -+ filetypes. -+ - Added '#' comments as an alternative for the asm filetype -+ -+Thanks to Markus Klinik and Anders for bug reports, and again to Anders -+for his patch. Thanks to John O'Shea and fREW for the filetype -+information. -+ -+============================================================================== -+8. Credits {{{2 *NERDComCredits* -+ -+Thanks and respect to the following people: -+ -+Thanks to Nick Brettell for his many ideas and criticisms. A bloody good -+bastard. -+:normal :.-2s/good// -+ -+Thanks to Matthew Hawkins for his awesome refactoring! -+ -+Thanks to the authors of the vimspell whose documentation -+installation function I stole :) -+ -+Thanks to Greg Searle for the idea of using place-holders for nested comments. -+ -+Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! -+Also, thanks for the idea of doing sexy comments as well as his suggestions -+relating to it :P -+Thanks again to Nguyen for complaining about the NERD_comments menu mapping -+(-c) interfering with another mapping of his... and thus the -+NERD_dont_create_menu_shortcut option was born :P -+(it was then replaced with NERD_menu_mode in version 1.67 :) -+ -+Thanks to Sam R for pointing out some filetypes that NERD_comments could support! -+ -+Cheers to Litchi for the idea of having a mapping that appends a comment to -+the current line :) -+ -+Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some -+problems with commenting in visual mode. Thanks again to Jorge for his -+continued suggestions on this matter :) -+ -+Thanks to Martin Stubenschrott for pointing out a bug with the mapping -+:) Ive gotta stop breaking this mapping! -+ -+Thanks to Markus Erlmann for pointing out a conflict that this script was -+having with the taglist plugin. -+ -+Thanks to Brent Rice for alerting me about, and helping me track down, a bug -+in the script when the "ignorecase" option in vim was set. -+ -+Thanks to Richard Willis for telling me about how line continuation was -+causing problems on cygwin. Also, thanks pointing out a bug in the help file -+and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI -+have mercy on your soul :) -+ -+Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". -+Also, thanks for his suggested improvements about toggle comments after i -+implemented them. -+ -+Thanks to harry for telling me that i broke the cn mapping in 1.53 :), -+and thanks again for telling me about a bug that occurred when editing a file -+in a new tab. -+ -+Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc -+install function and added support for ada comments with spaces as well as -+making a couple of other small changes. -+ -+Thanks to David Bourgeois for pointing out a bug with when commenting c files -+:)... [a few days later] ok i completely misunderstood what David was talking -+about and ended up fixing a completely different bug to what he was talking -+about :P -+ -+Thanks to David Bourgeois for pointing out a bug when changing buffers. -+ -+Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that -+was causing spaces to be added to the end of lines with single-part -+delimiters. It's nice when people do my work for me :D -+ -+Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting -+sexy comments. Sexy comments dont look so sexy when they are only half removed -+:P -+ -+Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping -+the NERD_space_delim_filetype_regexp option from working with left aligned -+toggle comments. And for pointing out a bug when initialising VB comments. -+ -+Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". -+And for suggested improvements to minimal comments. -+ -+Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. -+In 1.65 -+ -+Thanks to Jonathan Derque for alerting me to some filetypes that could be -+supported (Namely: context, plaintext and mail). -+ -+Thanks to Joseph Barker for the sugesting that the menu be an optional -+feature. -+ -+Thanks to Gary Church and Tim Carey-Smith for complaining about the -+keymappings and causing me to introduce the NERD_mapleader option :) -+ -+Thanks to Vigil for pointing out that the "fetchmail" filetype was not -+supported and emailing me the delimiters -+ -+Thanks to Michael Brunner for telling me about the kconfig filetype. -+ -+Thanks to Antono Vasiljev for telling me about the netdict filetype. -+ -+Thanks to Melissa Reid for telling me about the omlet filetype. -+ -+Thanks to Ilia N Ternovich for alerting me to the 'qf' (quickfix) filetype. -+ -+Thanks to Markus Klinik for emailing me about a bug for sexy comments where -+spaces were being eaten. -+ -+Thanks to John O'Shea for emailing me about the RTF filetype. Thanks again for -+the SVNcommitlog and vcscommit filetypes. -+ -+Thanks to Anders for emailing me a patch to help get rid of all the visual -+bells and screen scrolling, and for sending me the delimiters for the occam -+filetype. -+ -+Thanks to Anders and Markus Klinik for emailing me about the screen scrolling -+issues and finally getting me off my ass about them :P -+ -+Thanks to Mark Woodward for emailing me about the csv filetype. -+ -+Thanks to fREW for emailing me with the /gentoo-package-(mask|keywords|use)/ -+filetypes the vo_base filetype. -+ -+Thanks to Alexey for emailing me about the verilog_systemverilog/systemverilog -+filetypes. -+ -+Cheers to Lizendir for the email about the fstab filetype -+ -+Thanks to Michael Böhler for emailing me with the autoit, autohotkey and docbk -+filetypes. -+ -+Thanks to Aaron Small for emailing me about the cmake filetype. -+ -+Thanks to Ramiro for emailing me about the htmldjango and django filetypes. -+ -+Thanks to Seth Mason for sending me a patch to fix some pathing issues for the -+help doc installation. -+ -+Thanks to Stefano Zacchiroli for emailing me with the debcontrol and -+debchangelog filetypes. -+ -+Thanks to Alex Tarkovsky for emailing me about the ebuild and eclass -+filetypes. -+ -+Cheers to Jorge Rodrigues for emailing me about the gams filetype. -+ -+Cheers to James Hales for the patch that made the comment maps work better with -+counts, and made the script reset comment delims for a buffer when its -+filetype changes. -+ -+Thank to Rainer Müller for emailing me with the Objective C delimiters. -+ -+Thanks to Jason Mills for emailing me the Groovy filetype. -+ -+Thanks to Normandie Azucena for emailing me about the vera filetype. -+ -+Thanks to Florian Apolloner for emailing me about the ldif filetype. -+ -+Cheers to David Fishburn for emailing me with the lookupfile filetype. -+ -+Thanks to Niels Aan de Brugh for emailing me with the rst filetype. -+ -+Cheers to heptite on #vim for helping me track down some tab-space conversion -+bugs. -+ -+Cheers to Don Hatlestad for telling me about the ahk filetype -+ -+Thanks to Christophe Benz for emailing me with the Desktop and xsd filetypes. -+ -+Cheers to Cheng Fang for the bug reports :D -+ -+Cheers to myself for being the best looking man on Earth! -+=== END_DOC -+" vim: set foldmethod=marker : -diff -urN vim71/1/plugin/.svn/all-wcprops vim71_ada/1/plugin/.svn/all-wcprops ---- vim71/1/plugin/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,23 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 51 -+/svnroot/gnuada/!svn/ver/818/trunk/tools/vim/plugin -+END -+taglist.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 63 -+/svnroot/gnuada/!svn/ver/695/trunk/tools/vim/plugin/taglist.vim -+END -+matchit.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 63 -+/svnroot/gnuada/!svn/ver/695/trunk/tools/vim/plugin/matchit.vim -+END -+NERD_commenter.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 70 -+/svnroot/gnuada/!svn/ver/782/trunk/tools/vim/plugin/NERD_commenter.vim -+END -diff -urN vim71/1/plugin/.svn/dir-prop-base vim71_ada/1/plugin/.svn/dir-prop-base ---- vim71/1/plugin/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,6 @@ -+K 10 -+svn:ignore -+V 9 -+.backups -+ -+END -diff -urN vim71/1/plugin/.svn/entries vim71_ada/1/plugin/.svn/entries ---- vim71/1/plugin/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/.svn/entries 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,67 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/plugin -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-12-03T21:21:48.223203Z -+818 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -+taglist.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+2b4bbfd48d8655d77f21de415fbc444e -+2007-04-27T17:57:11.151403Z -+695 -+krischik -+has-props -+ -+matchit.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+e632c123b83638c701624d105b6dfebf -+2007-04-27T17:57:11.151403Z -+695 -+krischik -+has-props -+ -+NERD_commenter.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+a26e65639bda5a42c1f3e5661839739b -+2007-10-18T14:36:32.640792Z -+782 -+krischik -+has-props -+ -diff -urN vim71/1/plugin/.svn/format vim71_ada/1/plugin/.svn/format ---- vim71/1/plugin/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/.svn/format 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/plugin/.svn/prop-base/matchit.vim.svn-base vim71_ada/1/plugin/.svn/prop-base/matchit.vim.svn-base ---- vim71/1/plugin/.svn/prop-base/matchit.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/.svn/prop-base/matchit.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/plugin/.svn/prop-base/NERD_commenter.vim.svn-base vim71_ada/1/plugin/.svn/prop-base/NERD_commenter.vim.svn-base ---- vim71/1/plugin/.svn/prop-base/NERD_commenter.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/.svn/prop-base/NERD_commenter.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/plugin/.svn/prop-base/taglist.vim.svn-base vim71_ada/1/plugin/.svn/prop-base/taglist.vim.svn-base ---- vim71/1/plugin/.svn/prop-base/taglist.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/.svn/prop-base/taglist.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/plugin/.svn/text-base/matchit.vim.svn-base vim71_ada/1/plugin/.svn/text-base/matchit.vim.svn-base ---- vim71/1/plugin/.svn/text-base/matchit.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/.svn/text-base/matchit.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,814 @@ -+" matchit.vim: (global plugin) Extended "%" matching -+" Last Change: Tue Oct 24 11:00 AM 2006 EDT -+" Maintainer: Benji Fisher PhD -+" Version: 1.12, for Vim 6.3+ -+" URL: http://www.vim.org/script.php?script_id=39 -+ -+" Documentation: -+" The documentation is in a separate file, matchit.txt . -+ -+" Credits: -+" Vim editor by Bram Moolenaar (Thanks, Bram!) -+" Original script and design by Raul Segura Acevedo -+" Support for comments by Douglas Potts -+" Support for back references and other improvements by Benji Fisher -+" Support for many languages by Johannes Zellner -+" Suggestions for improvement, bug reports, and support for additional -+" languages by Jordi-Albert Batalla, Neil Bird, Servatius Brandt, Mark -+" Collett, Stephen Wall, Dany St-Amant, Yuheng Xie, and Johannes Zellner. -+ -+" Debugging: -+" If you'd like to try the built-in debugging commands... -+" :MatchDebug to activate debugging for the current buffer -+" This saves the values of several key script variables as buffer-local -+" variables. See the MatchDebug() function, below, for details. -+ -+" TODO: I should think about multi-line patterns for b:match_words. -+" This would require an option: how many lines to scan (default 1). -+" This would be useful for Python, maybe also for *ML. -+" TODO: Maybe I should add a menu so that people will actually use some of -+" the features that I have implemented. -+" TODO: Eliminate the MultiMatch function. Add yet another argument to -+" Match_wrapper() instead. -+" TODO: Allow :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1' -+" TODO: Make backrefs safer by using '\V' (very no-magic). -+" TODO: Add a level of indirection, so that custom % scripts can use my -+" work but extend it. -+ -+" allow user to prevent loading -+" and prevent duplicate loading -+if exists("loaded_matchit") || &cp -+ finish -+endif -+let loaded_matchit = 1 -+let s:last_mps = "" -+let s:last_words = "" -+ -+let s:save_cpo = &cpo -+set cpo&vim -+ -+nnoremap % :call Match_wrapper('',1,'n') -+nnoremap g% :call Match_wrapper('',0,'n') -+vnoremap % :call Match_wrapper('',1,'v') m'gv`` -+vnoremap g% :call Match_wrapper('',0,'v') m'gv`` -+onoremap % v:call Match_wrapper('',1,'o') -+onoremap g% v:call Match_wrapper('',0,'o') -+ -+" Analogues of [{ and ]} using matching patterns: -+nnoremap [% :call MultiMatch("bW", "n") -+nnoremap ]% :call MultiMatch("W", "n") -+vmap [% [%m'gv`` -+vmap ]% ]%m'gv`` -+" vnoremap [% :call MultiMatch("bW", "v") m'gv`` -+" vnoremap ]% :call MultiMatch("W", "v") m'gv`` -+onoremap [% v:call MultiMatch("bW", "o") -+onoremap ]% v:call MultiMatch("W", "o") -+ -+" text object: -+vmap a% [%v]% -+ -+" Auto-complete mappings: (not yet "ready for prime time") -+" TODO Read :help write-plugin for the "right" way to let the user -+" specify a key binding. -+" let g:match_auto = '' -+" let g:match_autoCR = '' -+" if exists("g:match_auto") -+" execute "inoremap " . g:match_auto . ' x"=Autocomplete()Pls' -+" endif -+" if exists("g:match_autoCR") -+" execute "inoremap " . g:match_autoCR . ' =Autocomplete()' -+" endif -+" if exists("g:match_gthhoh") -+" execute "inoremap " . g:match_gthhoh . ' :call Gthhoh()' -+" endif " gthhoh = "Get the heck out of here!" -+ -+let s:notslash = '\\\@" -+ endif -+ " In s:CleanUp(), we may need to check whether the cursor moved forward. -+ let startline = line(".") -+ let startcol = col(".") -+ " Use default behavior if called with a count or if no patterns are defined. -+ if v:count -+ exe "normal! " . v:count . "%" -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ elseif !exists("b:match_words") || b:match_words == "" -+ silent! normal! % -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ end -+ -+ " First step: if not already done, set the script variables -+ " s:do_BR flag for whether there are backrefs -+ " s:pat parsed version of b:match_words -+ " s:all regexp based on s:pat and the default groups -+ " -+ " Allow b:match_words = "GetVimMatchWords()" . -+ if b:match_words =~ ":" -+ let match_words = b:match_words -+ else -+ execute "let match_words =" b:match_words -+ endif -+" Thanks to Preben "Peppe" Guldberg and Bram Moolenaar for this suggestion! -+ if (match_words != s:last_words) || (&mps != s:last_mps) || -+ \ exists("b:match_debug") -+ let s:last_words = match_words -+ let s:last_mps = &mps -+ if match_words !~ s:notslash . '\\\d' -+ let s:do_BR = 0 -+ let s:pat = match_words -+ else -+ let s:do_BR = 1 -+ let s:pat = s:ParseWords(match_words) -+ endif -+ " The next several lines were here before -+ " BF started messing with this script. -+ " quote the special chars in 'matchpairs', replace [,:] with \| and then -+ " append the builtin pairs (/*, */, #if, #ifdef, #else, #elif, #endif) -+ " let default = substitute(escape(&mps, '[$^.*~\\/?]'), '[,:]\+', -+ " \ '\\|', 'g').'\|\/\*\|\*\/\|#if\>\|#ifdef\>\|#else\>\|#elif\>\|#endif\>' -+ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . -+ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' -+ " s:all = pattern with all the keywords -+ let s:all = s:pat . (strlen(s:pat) ? "," : "") . default -+ let s:all = substitute(s:all, s:notslash . '\zs[,:]\+', '\\|', 'g') -+ let s:all = '\%(' . s:all . '\)' -+ " let s:all = '\%(' . substitute(s:all, '\\\ze[,:]', '', 'g') . '\)' -+ if exists("b:match_debug") -+ let b:match_pat = s:pat -+ endif -+ endif -+ -+ " Second step: set the following local variables: -+ " matchline = line on which the cursor started -+ " curcol = number of characters before match -+ " prefix = regexp for start of line to start of match -+ " suffix = regexp for end of match to end of line -+ " Require match to end on or after the cursor and prefer it to -+ " start on or before the cursor. -+ let matchline = getline(startline) -+ if a:word != '' -+ " word given -+ if a:word !~ s:all -+ echohl WarningMsg|echo 'Missing rule for word:"'.a:word.'"'|echohl NONE -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ endif -+ let matchline = a:word -+ let curcol = 0 -+ let prefix = '^\%(' -+ let suffix = '\)$' -+ " Now the case when "word" is not given -+ else " Find the match that ends on or after the cursor and set curcol. -+ let regexp = s:Wholematch(matchline, s:all, startcol-1) -+ let curcol = match(matchline, regexp) -+ let endcol = matchend(matchline, regexp) -+ let suf = strlen(matchline) - endcol -+ let prefix = (curcol ? '^.*\%' . (curcol + 1) . 'c\%(' : '^\%(') -+ let suffix = (suf ? '\)\%' . (endcol + 1) . 'c.*$' : '\)$') -+ " If the match comes from the defaults, bail out. -+ if matchline !~ prefix . -+ \ substitute(s:pat, s:notslash.'\zs[,:]\+', '\\|', 'g') . suffix -+ silent! norm! % -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ endif -+ endif -+ if exists("b:match_debug") -+ let b:match_match = matchstr(matchline, regexp) -+ let b:match_col = curcol+1 -+ endif -+ -+ " Third step: Find the group and single word that match, and the original -+ " (backref) versions of these. Then, resolve the backrefs. -+ " Set the following local variable: -+ " group = colon-separated list of patterns, one of which matches -+ " = ini:mid:fin or ini:fin -+ " -+ " Reconstruct the version with unresolved backrefs. -+ let patBR = substitute(match_words.',', -+ \ s:notslash.'\zs[,:]*,[,:]*', ',', 'g') -+ let patBR = substitute(patBR, s:notslash.'\zs:\{2,}', ':', 'g') -+ " Now, set group and groupBR to the matching group: 'if:endif' or -+ " 'while:endwhile' or whatever. A bit of a kluge: s:Choose() returns -+ " group . "," . groupBR, and we pick it apart. -+ let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) -+ let i = matchend(group, s:notslash . ",") -+ let groupBR = strpart(group, i) -+ let group = strpart(group, 0, i-1) -+ " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix -+ if s:do_BR " Do the hard part: resolve those backrefs! -+ let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) -+ endif -+ if exists("b:match_debug") -+ let b:match_wholeBR = groupBR -+ let i = matchend(groupBR, s:notslash . ":") -+ let b:match_iniBR = strpart(groupBR, 0, i-1) -+ endif -+ -+ " Fourth step: Set the arguments for searchpair(). -+ let i = matchend(group, s:notslash . ":") -+ let j = matchend(group, '.*' . s:notslash . ":") -+ let ini = strpart(group, 0, i-1) -+ let mid = substitute(strpart(group, i,j-i-1), s:notslash.'\zs:', '\\|', 'g') -+ let fin = strpart(group, j) -+ "Un-escape the remaining , and : characters. -+ let ini = substitute(ini, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') -+ let mid = substitute(mid, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') -+ let fin = substitute(fin, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') -+ " searchpair() requires that these patterns avoid \(\) groups. -+ let ini = substitute(ini, s:notslash . '\zs\\(', '\\%(', 'g') -+ let mid = substitute(mid, s:notslash . '\zs\\(', '\\%(', 'g') -+ let fin = substitute(fin, s:notslash . '\zs\\(', '\\%(', 'g') -+ " Set mid. This is optimized for readability, not micro-efficiency! -+ if a:forward && matchline =~ prefix . fin . suffix -+ \ || !a:forward && matchline =~ prefix . ini . suffix -+ let mid = "" -+ endif -+ " Set flag. This is optimized for readability, not micro-efficiency! -+ if a:forward && matchline =~ prefix . fin . suffix -+ \ || !a:forward && matchline !~ prefix . ini . suffix -+ let flag = "bW" -+ else -+ let flag = "W" -+ endif -+ " Set skip. -+ if exists("b:match_skip") -+ let skip = b:match_skip -+ elseif exists("b:match_comment") " backwards compatibility and testing! -+ let skip = "r:" . b:match_comment -+ else -+ let skip = 's:comment\|string' -+ endif -+ let skip = s:ParseSkip(skip) -+ if exists("b:match_debug") -+ let b:match_ini = ini -+ let b:match_tail = (strlen(mid) ? mid.'\|' : '') . fin -+ endif -+ -+ " Fifth step: actually start moving the cursor and call searchpair(). -+ " Later, :execute restore_cursor to get to the original screen. -+ let restore_cursor = virtcol(".") . "|" -+ normal! g0 -+ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor -+ normal! H -+ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor -+ execute restore_cursor -+ call cursor(0, curcol + 1) -+ " normal! 0 -+ " if curcol -+ " execute "normal!" . curcol . "l" -+ " endif -+ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on")) -+ let skip = "0" -+ else -+ execute "if " . skip . "| let skip = '0' | endif" -+ endif -+ let sp_return = searchpair(ini, mid, fin, flag, skip) -+ let final_position = "call cursor(" . line(".") . "," . col(".") . ")" -+ " Restore cursor position and original screen. -+ execute restore_cursor -+ normal! m' -+ if sp_return > 0 -+ execute final_position -+ endif -+ return s:CleanUp(restore_options, a:mode, startline, startcol, mid.'\|'.fin) -+endfun -+ -+" Restore options and do some special handling for Operator-pending mode. -+" The optional argument is the tail of the matching group. -+fun! s:CleanUp(options, mode, startline, startcol, ...) -+ execute "set" a:options -+ " Open folds, if appropriate. -+ if a:mode != "o" -+ if &foldopen =~ "percent" -+ normal! zv -+ endif -+ " In Operator-pending mode, we want to include the whole match -+ " (for example, d%). -+ " This is only a problem if we end up moving in the forward direction. -+ elseif (a:startline < line(".")) || -+ \ (a:startline == line(".") && a:startcol < col(".")) -+ if a:0 -+ " Check whether the match is a single character. If not, move to the -+ " end of the match. -+ let matchline = getline(".") -+ let currcol = col(".") -+ let regexp = s:Wholematch(matchline, a:1, currcol-1) -+ let endcol = matchend(matchline, regexp) -+ if endcol > currcol " This is NOT off by one! -+ execute "normal!" . (endcol - currcol) . "l" -+ endif -+ endif " a:0 -+ endif " a:mode != "o" && etc. -+ return 0 -+endfun -+ -+" Example (simplified HTML patterns): if -+" a:groupBR = '<\(\k\+\)>:' -+" a:prefix = '^.\{3}\(' -+" a:group = '<\(\k\+\)>:' -+" a:suffix = '\).\{2}$' -+" a:matchline = "12312" or "12312" -+" then extract "tag" from a:matchline and return ":" . -+fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline) -+ if a:matchline !~ a:prefix . -+ \ substitute(a:group, s:notslash . '\zs:', '\\|', 'g') . a:suffix -+ return a:group -+ endif -+ let i = matchend(a:groupBR, s:notslash . ':') -+ let ini = strpart(a:groupBR, 0, i-1) -+ let tailBR = strpart(a:groupBR, i) -+ let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix, -+ \ a:groupBR) -+ let i = matchend(word, s:notslash . ":") -+ let wordBR = strpart(word, i) -+ let word = strpart(word, 0, i-1) -+ " Now, a:matchline =~ a:prefix . word . a:suffix -+ if wordBR != ini -+ let table = s:Resolve(ini, wordBR, "table") -+ else -+ " let table = "----------" -+ let table = "" -+ let d = 0 -+ while d < 10 -+ if tailBR =~ s:notslash . '\\' . d -+ " let table[d] = d -+ let table = table . d -+ else -+ let table = table . "-" -+ endif -+ let d = d + 1 -+ endwhile -+ endif -+ let d = 9 -+ while d -+ if table[d] != "-" -+ let backref = substitute(a:matchline, a:prefix.word.a:suffix, -+ \ '\'.table[d], "") -+ " Are there any other characters that should be escaped? -+ let backref = escape(backref, '*,:') -+ execute s:Ref(ini, d, "start", "len") -+ let ini = strpart(ini, 0, start) . backref . strpart(ini, start+len) -+ let tailBR = substitute(tailBR, s:notslash . '\zs\\' . d, -+ \ escape(backref, '\\'), 'g') -+ endif -+ let d = d-1 -+ endwhile -+ if exists("b:match_debug") -+ if s:do_BR -+ let b:match_table = table -+ let b:match_word = word -+ else -+ let b:match_table = "" -+ let b:match_word = "" -+ endif -+ endif -+ return ini . ":" . tailBR -+endfun -+ -+" Input a comma-separated list of groups with backrefs, such as -+" a:groups = '\(foo\):end\1,\(bar\):end\1' -+" and return a comma-separated list of groups with backrefs replaced: -+" return '\(foo\):end\(foo\),\(bar\):end\(bar\)' -+fun! s:ParseWords(groups) -+ let groups = substitute(a:groups.",", s:notslash.'\zs[,:]*,[,:]*', ',', 'g') -+ let groups = substitute(groups, s:notslash . '\zs:\{2,}', ':', 'g') -+ let parsed = "" -+ while groups =~ '[^,:]' -+ let i = matchend(groups, s:notslash . ':') -+ let j = matchend(groups, s:notslash . ',') -+ let ini = strpart(groups, 0, i-1) -+ let tail = strpart(groups, i, j-i-1) . ":" -+ let groups = strpart(groups, j) -+ let parsed = parsed . ini -+ let i = matchend(tail, s:notslash . ':') -+ while i != -1 -+ " In 'if:else:endif', ini='if' and word='else' and then word='endif'. -+ let word = strpart(tail, 0, i-1) -+ let tail = strpart(tail, i) -+ let i = matchend(tail, s:notslash . ':') -+ let parsed = parsed . ":" . s:Resolve(ini, word, "word") -+ endwhile " Now, tail has been used up. -+ let parsed = parsed . "," -+ endwhile " groups =~ '[^,:]' -+ return parsed -+endfun -+ -+" TODO I think this can be simplified and/or made more efficient. -+" TODO What should I do if a:start is out of range? -+" Return a regexp that matches all of a:string, such that -+" matchstr(a:string, regexp) represents the match for a:pat that starts -+" as close to a:start as possible, before being preferred to after, and -+" ends after a:start . -+" Usage: -+" let regexp = s:Wholematch(getline("."), 'foo\|bar', col(".")-1) -+" let i = match(getline("."), regexp) -+" let j = matchend(getline("."), regexp) -+" let match = matchstr(getline("."), regexp) -+fun! s:Wholematch(string, pat, start) -+ let group = '\%(' . a:pat . '\)' -+ let prefix = (a:start ? '\(^.*\%<' . (a:start + 2) . 'c\)\zs' : '^') -+ let len = strlen(a:string) -+ let suffix = (a:start+1 < len ? '\(\%>'.(a:start+1).'c.*$\)\@=' : '$') -+ if a:string !~ prefix . group . suffix -+ let prefix = '' -+ endif -+ return prefix . group . suffix -+endfun -+ -+" No extra arguments: s:Ref(string, d) will -+" find the d'th occurrence of '\(' and return it, along with everything up -+" to and including the matching '\)'. -+" One argument: s:Ref(string, d, "start") returns the index of the start -+" of the d'th '\(' and any other argument returns the length of the group. -+" Two arguments: s:Ref(string, d, "foo", "bar") returns a string to be -+" executed, having the effect of -+" :let foo = s:Ref(string, d, "start") -+" :let bar = s:Ref(string, d, "len") -+fun! s:Ref(string, d, ...) -+ let len = strlen(a:string) -+ if a:d == 0 -+ let start = 0 -+ else -+ let cnt = a:d -+ let match = a:string -+ while cnt -+ let cnt = cnt - 1 -+ let index = matchend(match, s:notslash . '\\(') -+ if index == -1 -+ return "" -+ endif -+ let match = strpart(match, index) -+ endwhile -+ let start = len - strlen(match) -+ if a:0 == 1 && a:1 == "start" -+ return start - 2 -+ endif -+ let cnt = 1 -+ while cnt -+ let index = matchend(match, s:notslash . '\\(\|\\)') - 1 -+ if index == -2 -+ return "" -+ endif -+ " Increment if an open, decrement if a ')': -+ let cnt = cnt + (match[index]=="(" ? 1 : -1) " ')' -+ " let cnt = stridx('0(', match[index]) + cnt -+ let match = strpart(match, index+1) -+ endwhile -+ let start = start - 2 -+ let len = len - start - strlen(match) -+ endif -+ if a:0 == 1 -+ return len -+ elseif a:0 == 2 -+ return "let " . a:1 . "=" . start . "| let " . a:2 . "=" . len -+ else -+ return strpart(a:string, start, len) -+ endif -+endfun -+ -+" Count the number of disjoint copies of pattern in string. -+" If the pattern is a literal string and contains no '0' or '1' characters -+" then s:Count(string, pattern, '0', '1') should be faster than -+" s:Count(string, pattern). -+fun! s:Count(string, pattern, ...) -+ let pat = escape(a:pattern, '\\') -+ if a:0 > 1 -+ let foo = substitute(a:string, '[^'.a:pattern.']', "a:1", "g") -+ let foo = substitute(a:string, pat, a:2, "g") -+ let foo = substitute(foo, '[^' . a:2 . ']', "", "g") -+ return strlen(foo) -+ endif -+ let result = 0 -+ let foo = a:string -+ let index = matchend(foo, pat) -+ while index != -1 -+ let result = result + 1 -+ let foo = strpart(foo, index) -+ let index = matchend(foo, pat) -+ endwhile -+ return result -+endfun -+ -+" s:Resolve('\(a\)\(b\)', '\(c\)\2\1\1\2') should return table.word, where -+" word = '\(c\)\(b\)\(a\)\3\2' and table = '-32-------'. That is, the first -+" '\1' in target is replaced by '\(a\)' in word, table[1] = 3, and this -+" indicates that all other instances of '\1' in target are to be replaced -+" by '\3'. The hard part is dealing with nesting... -+" Note that ":" is an illegal character for source and target, -+" unless it is preceded by "\". -+fun! s:Resolve(source, target, output) -+ let word = a:target -+ let i = matchend(word, s:notslash . '\\\d') - 1 -+ let table = "----------" -+ while i != -2 " There are back references to be replaced. -+ let d = word[i] -+ let backref = s:Ref(a:source, d) -+ " The idea is to replace '\d' with backref. Before we do this, -+ " replace any \(\) groups in backref with :1, :2, ... if they -+ " correspond to the first, second, ... group already inserted -+ " into backref. Later, replace :1 with \1 and so on. The group -+ " number w+b within backref corresponds to the group number -+ " s within a:source. -+ " w = number of '\(' in word before the current one -+ let w = s:Count( -+ \ substitute(strpart(word, 0, i-1), '\\\\', '', 'g'), '\(', '1') -+ let b = 1 " number of the current '\(' in backref -+ let s = d " number of the current '\(' in a:source -+ while b <= s:Count(substitute(backref, '\\\\', '', 'g'), '\(', '1') -+ \ && s < 10 -+ if table[s] == "-" -+ if w + b < 10 -+ " let table[s] = w + b -+ let table = strpart(table, 0, s) . (w+b) . strpart(table, s+1) -+ endif -+ let b = b + 1 -+ let s = s + 1 -+ else -+ execute s:Ref(backref, b, "start", "len") -+ let ref = strpart(backref, start, len) -+ let backref = strpart(backref, 0, start) . ":". table[s] -+ \ . strpart(backref, start+len) -+ let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1') -+ endif -+ endwhile -+ let word = strpart(word, 0, i-1) . backref . strpart(word, i+1) -+ let i = matchend(word, s:notslash . '\\\d') - 1 -+ endwhile -+ let word = substitute(word, s:notslash . '\zs:', '\\', 'g') -+ if a:output == "table" -+ return table -+ elseif a:output == "word" -+ return word -+ else -+ return table . word -+ endif -+endfun -+ -+" Assume a:comma = ",". Then the format for a:patterns and a:1 is -+" a:patterns = ",,..." -+" a:1 = ",,..." -+" If is the first pattern that matches a:string then return -+" if no optional arguments are given; return , if a:1 is given. -+fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...) -+ let tail = (a:patterns =~ a:comma."$" ? a:patterns : a:patterns . a:comma) -+ let i = matchend(tail, s:notslash . a:comma) -+ if a:0 -+ let alttail = (a:1 =~ a:comma."$" ? a:1 : a:1 . a:comma) -+ let j = matchend(alttail, s:notslash . a:comma) -+ endif -+ let current = strpart(tail, 0, i-1) -+ if a:branch == "" -+ let currpat = current -+ else -+ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') -+ endif -+ while a:string !~ a:prefix . currpat . a:suffix -+ let tail = strpart(tail, i) -+ let i = matchend(tail, s:notslash . a:comma) -+ if i == -1 -+ return -1 -+ endif -+ let current = strpart(tail, 0, i-1) -+ if a:branch == "" -+ let currpat = current -+ else -+ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') -+ endif -+ if a:0 -+ let alttail = strpart(alttail, j) -+ let j = matchend(alttail, s:notslash . a:comma) -+ endif -+ endwhile -+ if a:0 -+ let current = current . a:comma . strpart(alttail, 0, j-1) -+ endif -+ return current -+endfun -+ -+" Call this function to turn on debugging information. Every time the main -+" script is run, buffer variables will be saved. These can be used directly -+" or viewed using the menu items below. -+if !exists(":MatchDebug") -+ command! -nargs=0 MatchDebug call s:Match_debug() -+endif -+ -+fun! s:Match_debug() -+ let b:match_debug = 1 " Save debugging information. -+ " pat = all of b:match_words with backrefs parsed -+ amenu &Matchit.&pat :echo b:match_pat -+ " match = bit of text that is recognized as a match -+ amenu &Matchit.&match :echo b:match_match -+ " curcol = cursor column of the start of the matching text -+ amenu &Matchit.&curcol :echo b:match_col -+ " wholeBR = matching group, original version -+ amenu &Matchit.wh&oleBR :echo b:match_wholeBR -+ " iniBR = 'if' piece, original version -+ amenu &Matchit.ini&BR :echo b:match_iniBR -+ " ini = 'if' piece, with all backrefs resolved from match -+ amenu &Matchit.&ini :echo b:match_ini -+ " tail = 'else\|endif' piece, with all backrefs resolved from match -+ amenu &Matchit.&tail :echo b:match_tail -+ " fin = 'endif' piece, with all backrefs resolved from match -+ amenu &Matchit.&word :echo b:match_word -+ " '\'.d in ini refers to the same thing as '\'.table[d] in word. -+ amenu &Matchit.t&able :echo '0:' . b:match_table . ':9' -+endfun -+ -+" Jump to the nearest unmatched "(" or "if" or "" if a:spflag == "bW" -+" or the nearest unmatched "" or "endif" or ")" if a:spflag == "W". -+" Return a "mark" for the original position, so that -+" let m = MultiMatch("bW", "n") ... execute m -+" will return to the original position. If there is a problem, do not -+" move the cursor and return "", unless a count is given, in which case -+" go up or down as many levels as possible and again return "". -+" TODO This relies on the same patterns as % matching. It might be a good -+" idea to give it its own matching patterns. -+fun! s:MultiMatch(spflag, mode) -+ if !exists("b:match_words") || b:match_words == "" -+ return "" -+ end -+ let restore_options = (&ic ? "" : "no") . "ignorecase" -+ if exists("b:match_ignorecase") -+ let &ignorecase = b:match_ignorecase -+ endif -+ let startline = line(".") -+ let startcol = col(".") -+ -+ " First step: if not already done, set the script variables -+ " s:do_BR flag for whether there are backrefs -+ " s:pat parsed version of b:match_words -+ " s:all regexp based on s:pat and the default groups -+ " This part is copied and slightly modified from s:Match_wrapper(). -+ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . -+ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' -+ " Allow b:match_words = "GetVimMatchWords()" . -+ if b:match_words =~ ":" -+ let match_words = b:match_words -+ else -+ execute "let match_words =" b:match_words -+ endif -+ if (match_words != s:last_words) || (&mps != s:last_mps) || -+ \ exists("b:match_debug") -+ let s:last_words = match_words -+ let s:last_mps = &mps -+ if match_words !~ s:notslash . '\\\d' -+ let s:do_BR = 0 -+ let s:pat = match_words -+ else -+ let s:do_BR = 1 -+ let s:pat = s:ParseWords(match_words) -+ endif -+ let s:all = '\%(' . substitute(s:pat . (strlen(s:pat)?",":"") . default, -+ \ '[,:]\+','\\|','g') . '\)' -+ if exists("b:match_debug") -+ let b:match_pat = s:pat -+ endif -+ endif -+ -+ " Second step: figure out the patterns for searchpair() -+ " and save the screen, cursor position, and 'ignorecase'. -+ " - TODO: A lot of this is copied from s:Match_wrapper(). -+ " - maybe even more functionality should be split off -+ " - into separate functions! -+ let cdefault = (s:pat =~ '[^,]$' ? "," : "") . default -+ let open = substitute(s:pat . cdefault, -+ \ s:notslash . '\zs:.\{-}' . s:notslash . ',', '\\),\\(', 'g') -+ let open = '\(' . substitute(open, s:notslash . '\zs:.*$', '\\)', '') -+ let close = substitute(s:pat . cdefault, -+ \ s:notslash . '\zs,.\{-}' . s:notslash . ':', '\\),\\(', 'g') -+ let close = substitute(close, '^.\{-}' . s:notslash . ':', '\\(', '') . '\)' -+ if exists("b:match_skip") -+ let skip = b:match_skip -+ elseif exists("b:match_comment") " backwards compatibility and testing! -+ let skip = "r:" . b:match_comment -+ else -+ let skip = 's:comment\|string' -+ endif -+ let skip = s:ParseSkip(skip) -+ " let restore_cursor = line(".") . "G" . virtcol(".") . "|" -+ " normal! H -+ " let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor -+ let restore_cursor = virtcol(".") . "|" -+ normal! g0 -+ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor -+ normal! H -+ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor -+ execute restore_cursor -+ -+ " Third step: call searchpair(). -+ " Replace '\('--but not '\\('--with '\%(' and ',' with '\|'. -+ let openpat = substitute(open, '\(\\\@" or ... -+" and return "endif" or "endwhile" or "" or ... . -+" For now, this uses b:match_words and the same script variables -+" as s:Match_wrapper() . Later, it may get its own patterns, -+" either from a buffer variable or passed as arguments. -+" fun! s:Autocomplete() -+" echo "autocomplete not yet implemented :-(" -+" if !exists("b:match_words") || b:match_words == "" -+" return "" -+" end -+" let startpos = s:MultiMatch("bW") -+" -+" if startpos == "" -+" return "" -+" endif -+" " - TODO: figure out whether 'if' or '' matched, and construct -+" " - the appropriate closing. -+" let matchline = getline(".") -+" let curcol = col(".") - 1 -+" " - TODO: Change the s:all argument if there is a new set of match pats. -+" let regexp = s:Wholematch(matchline, s:all, curcol) -+" let suf = strlen(matchline) - matchend(matchline, regexp) -+" let prefix = (curcol ? '^.\{' . curcol . '}\%(' : '^\%(') -+" let suffix = (suf ? '\).\{' . suf . '}$' : '\)$') -+" " Reconstruct the version with unresolved backrefs. -+" let patBR = substitute(b:match_words.',', '[,:]*,[,:]*', ',', 'g') -+" let patBR = substitute(patBR, ':\{2,}', ':', "g") -+" " Now, set group and groupBR to the matching group: 'if:endif' or -+" " 'while:endwhile' or whatever. -+" let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) -+" let i = matchend(group, s:notslash . ",") -+" let groupBR = strpart(group, i) -+" let group = strpart(group, 0, i-1) -+" " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix -+" if s:do_BR -+" let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) -+" endif -+" " let g:group = group -+" -+" " - TODO: Construct the closing from group. -+" let fake = "end" . expand("") -+" execute startpos -+" return fake -+" endfun -+ -+" Close all open structures. "Get the heck out of here!" -+" fun! s:Gthhoh() -+" let close = s:Autocomplete() -+" while strlen(close) -+" put=close -+" let close = s:Autocomplete() -+" endwhile -+" endfun -+ -+" Parse special strings as typical skip arguments for searchpair(): -+" s:foo becomes (current syntax item) =~ foo -+" S:foo becomes (current syntax item) !~ foo -+" r:foo becomes (line before cursor) =~ foo -+" R:foo becomes (line before cursor) !~ foo -+fun! s:ParseSkip(str) -+ let skip = a:str -+ if skip[1] == ":" -+ if skip[0] == "s" -+ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" . -+ \ strpart(skip,2) . "'" -+ elseif skip[0] == "S" -+ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" . -+ \ strpart(skip,2) . "'" -+ elseif skip[0] == "r" -+ let skip = "strpart(getline('.'),0,col('.'))=~'" . strpart(skip,2). "'" -+ elseif skip[0] == "R" -+ let skip = "strpart(getline('.'),0,col('.'))!~'" . strpart(skip,2). "'" -+ endif -+ endif -+ return skip -+endfun -+ -+let &cpo = s:save_cpo -+ -+" vim:sts=2:sw=2: -diff -urN vim71/1/plugin/.svn/text-base/NERD_commenter.vim.svn-base vim71_ada/1/plugin/.svn/text-base/NERD_commenter.vim.svn-base ---- vim71/1/plugin/.svn/text-base/NERD_commenter.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/.svn/text-base/NERD_commenter.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,4553 @@ -+" vim global plugin that provides easy code commenting for various file types -+" Last Change: 29 sep 2007 -+" Maintainer: Martin Grenfell -+let s:NERD_commenter_version = 2.1.4 -+ -+" For help documentation type :help NERDCommenter. If this fails, Restart vim -+" and try again. If it sill doesnt work... the help page is at the bottom -+" of this file. -+ -+" Section: script init stuff {{{1 -+if exists("loaded_nerd_comments") -+ finish -+endif -+if v:version < 700 -+ echoerr "NERDCommenter: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!" -+ finish -+endif -+let loaded_nerd_comments = 1 -+ -+" Section: spaces init {{{2 -+" Occasionally we need to grab a string of spaces so just make one here -+let s:spaces = "" -+while strlen(s:spaces) < 100 -+ let s:spaces = s:spaces . " " -+endwhile -+ -+" Function: s:InitVariable() function {{{2 -+" This function is used to initialise a given variable to a given value. The -+" variable is only initialised if it does not exist prior -+" -+" Args: -+" -var: the name of the var to be initialised -+" -value: the value to initialise var to -+" -+" Returns: -+" 1 if the var is set, 0 otherwise -+function s:InitVariable(var, value) -+ if !exists(a:var) -+ exec 'let ' . a:var . ' = ' . "'" . a:value . "'" -+ return 1 -+ endif -+ return 0 -+endfunction -+ -+" Section: space string init{{{2 -+" When putting spaces after the left delim and before the right we use -+" s:spaceStr for the space char. This way we can make it add anything after -+" the left and before the right by modifying this variable -+let s:spaceStr = ' ' -+let s:lenSpaceStr = strlen(s:spaceStr) -+ -+" Section: variable init calls {{{2 -+call s:InitVariable("g:NERDAllowAnyVisualDelims", 1) -+call s:InitVariable("g:NERDBlockComIgnoreEmpty", 0) -+call s:InitVariable("g:NERDCommentWholeLinesInVMode", 0) -+call s:InitVariable("g:NERDCompactSexyComs", 0) -+call s:InitVariable("g:NERDDefaultNesting", 0) -+call s:InitVariable("g:NERDMenuMode", 3) -+call s:InitVariable("g:NERDLPlace", "[>") -+call s:InitVariable("g:NERDUsePlaceHolders", 1) -+call s:InitVariable("g:NERDRemoveAltComs", 1) -+call s:InitVariable("g:NERDRemoveExtraSpaces", 0) -+call s:InitVariable("g:NERDRPlace", "<]") -+call s:InitVariable("g:NERDShutUp", '0') -+call s:InitVariable("g:NERDSpaceDelims", 0) -+call s:InitVariable("g:NERDDelimiterRequests", 1) -+ -+call s:InitVariable("g:NERDMapleader", ',c') -+ -+call s:InitVariable("g:NERDAltComMap", g:NERDMapleader . 'a') -+call s:InitVariable("g:NERDAppendComMap", g:NERDMapleader . 'A') -+call s:InitVariable("g:NERDComAlignBothMap", g:NERDMapleader . 'b') -+call s:InitVariable("g:NERDComAlignLeftMap", g:NERDMapleader . 'l') -+call s:InitVariable("g:NERDComAlignRightMap", g:NERDMapleader . 'r') -+call s:InitVariable("g:NERDComInInsertMap", '') -+call s:InitVariable("g:NERDComLineInvertMap", g:NERDMapleader . 'i') -+call s:InitVariable("g:NERDComLineMap", g:NERDMapleader . 'c') -+call s:InitVariable("g:NERDComLineNestMap", g:NERDMapleader . 'n') -+call s:InitVariable("g:NERDComLineSexyMap", g:NERDMapleader . 's') -+call s:InitVariable("g:NERDComLineToggleMap", g:NERDMapleader . '') -+call s:InitVariable("g:NERDComLineMinimalMap", g:NERDMapleader . 'm') -+call s:InitVariable("g:NERDComLineYankMap", g:NERDMapleader . 'y') -+call s:InitVariable("g:NERDComToEOLMap", g:NERDMapleader . '$') -+call s:InitVariable("g:NERDPrependComMap", g:NERDMapleader . 'I') -+call s:InitVariable("g:NERDUncomLineMap", g:NERDMapleader . 'u') -+let s:NERDFileNameEscape="[]#*$%'\" ?`!&();<>\\" -+ -+" Section: Comment mapping functions, autocommands and commands {{{1 -+" ============================================================================ -+" Section: Comment enabler autocommands {{{2 -+" ============================================================================ -+ -+if !exists("nerd_autocmds_loaded") -+ let nerd_autocmds_loaded=1 -+ -+ augroup commentEnablers -+ -+ "if the user enters a buffer or reads a buffer then we gotta set up -+ "the comment delimiters for that new filetype -+ autocmd BufEnter,BufRead * :call s:SetUpForNewFiletype(&filetype, 0) -+ -+ "if the filetype of a buffer changes, force the script to reset the -+ "delims for the buffer -+ autocmd Filetype * :call s:SetUpForNewFiletype(&filetype, 1) -+ augroup END -+ -+endif -+ -+ -+" Function: s:SetUpForNewFiletype(filetype) function {{{2 -+" This function is responsible for setting up buffer scoped variables for the -+" given filetype. -+" -+" These variables include the comment delimiters for the given filetype and calls -+" MapDelimiters or MapDelimitersWithAlternative passing in these delimiters. -+" -+" Args: -+" -filetype: the filetype to set delimiters for -+" -forceReset: 1 if the delimiters should be reset if they have already be -+" set for this buffer. -+" -+function s:SetUpForNewFiletype(filetype, forceReset) -+ "if we have already set the delimiters for this buffer then dont go thru -+ "it again -+ if !a:forceReset && exists("b:left") && b:left != '' -+ return -+ endif -+ -+ let b:sexyComMarker = '' -+ -+ "check the filetype against all known filetypes to see if we have -+ "hardcoded the comment delimiters to use -+ if a:filetype == "" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "abaqus" -+ call s:MapDelimiters('**', '') -+ elseif a:filetype == "abc" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "acedb" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "ada" -+ call s:MapDelimitersWithAlternative('--','', '-- ', '') -+ elseif a:filetype == "ahdl" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "ahk" -+ call s:MapDelimitersWithAlternative(';', '', '/*', '*/') -+ elseif a:filetype == "amiga" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "aml" -+ call s:MapDelimiters('/*', '') -+ elseif a:filetype == "ampl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ant" -+ call s:MapDelimiters('') -+ elseif a:filetype == "apache" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "apachestyle" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "asm68k" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "asm" -+ call s:MapDelimitersWithAlternative(';', '', '#', '') -+ elseif a:filetype == "asn" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "aspvbs" -+ call s:MapDelimiters('''', '') -+ elseif a:filetype == "atlas" -+ call s:MapDelimiters('C','$') -+ elseif a:filetype == "autohotkey" -+ call s:MapDelimiters(';','') -+ elseif a:filetype == "autoit" -+ call s:MapDelimiters(';','') -+ elseif a:filetype == "automake" -+ call s:MapDelimitersWithAlternative('#','', 'dnl ', '') -+ elseif a:filetype == "ave" -+ call s:MapDelimiters("'",'') -+ elseif a:filetype == "awk" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "basic" -+ call s:MapDelimitersWithAlternative("'",'', 'REM ', '') -+ elseif a:filetype == "b" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "bc" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "bdf" -+ call s:MapDelimiters('COMMENT ', '') -+ elseif a:filetype == "bib" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "bindzone" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "bst" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "btm" -+ call s:MapDelimiters('::', '') -+ elseif a:filetype == "caos" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "catalog" -+ call s:MapDelimiters('--','--') -+ elseif a:filetype == "c" -+ call s:MapDelimitersWithAlternative('/*','*/', '//', '') -+ elseif a:filetype == "cfg" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "cg" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "ch" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "changelog" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "cl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "clean" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "clipper" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "cmake" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "conf" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "config" -+ call s:MapDelimiters('dnl ', '') -+ elseif a:filetype == "context" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "cpp" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "crontab" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "cs" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "csc" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "csp" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "css" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "cterm" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "cupl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "csv" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "cvs" -+ call s:MapDelimiters('CVS:','') -+ elseif a:filetype == "dcl" -+ call s:MapDelimiters('$!', '') -+ elseif a:filetype == "debchangelog" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "debcontrol" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "debsources" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "def" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "desktop" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "diff" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "django" -+ call s:MapDelimitersWithAlternative('', '{#', '#}') -+ elseif a:filetype == "docbk" -+ call s:MapDelimiters('') -+ elseif a:filetype == "dns" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dosbatch" -+ call s:MapDelimiters('REM ','') -+ elseif a:filetype == "dosini" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dot" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "dracula" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dsl" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dtd" -+ call s:MapDelimiters('') -+ elseif a:filetype == "dtml" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "dylan" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == 'ebuild' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ecd" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == 'eclass' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "eiffel" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "elf" -+ call s:MapDelimiters("'", '') -+ elseif a:filetype == "elmfilt" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "erlang" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "eruby" -+ call s:MapDelimitersWithAlternative('', '<%#', '%>') -+ elseif a:filetype == "eterm" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "expect" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "exports" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fetchmail" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fgl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "focexec" -+ call s:MapDelimiters('-*', '') -+ elseif a:filetype == "form" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "fortran" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "foxpro" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "fstab" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fvwm" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fx" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "gams" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "gdb" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "gdmo" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "geek" -+ call s:MapDelimiters('GEEK_COMMENT:', '') -+ elseif a:filetype == 'gentoo-package-keywords' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == 'gentoo-package-mask' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == 'gentoo-package-use' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "gnuplot" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "groovy" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "gtkrc" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "haskell" -+ call s:MapDelimitersWithAlternative('--','', '{-', '-}') -+ elseif a:filetype == "hb" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "h" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "help" -+ call s:MapDelimiters('"','') -+ elseif a:filetype == "hercules" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "hog" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "html" -+ call s:MapDelimitersWithAlternative('', '//', '') -+ elseif a:filetype == "htmldjango" -+ call s:MapDelimitersWithAlternative('', '{#', '#}') -+ elseif a:filetype == "htmlos" -+ call s:MapDelimiters('#','/#') -+ elseif a:filetype == "ia64" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "icon" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "idlang" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "idl" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "indent" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "inform" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "inittab" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ishd" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "iss" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "ist" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "jam" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "java" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "javascript" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "jess" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "jgraph" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "jproperties" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "jsp" -+ call s:MapDelimiters('<%--', '--%>') -+ elseif a:filetype == "kconfig" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "kix" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "kscript" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "lace" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "ldif" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lex" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "lftp" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lifelines" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "lilo" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lisp" -+ call s:MapDelimitersWithAlternative(';','', '#|', '|#') -+ elseif a:filetype == "lite" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "lookupfile" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "lotos" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "lout" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lprolog" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "lscript" -+ call s:MapDelimiters("'", '') -+ elseif a:filetype == "lss" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lua" -+ call s:MapDelimitersWithAlternative('--','', '--[[', ']]') -+ elseif a:filetype == "lynx" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "m4" -+ call s:MapDelimiters('dnl ', '') -+ elseif a:filetype == "mail" -+ call s:MapDelimiters('> ','') -+ elseif a:filetype == "make" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "maple" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "masm" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "master" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "matlab" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "mel" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "mf" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "mib" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "mma" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "model" -+ call s:MapDelimiters('$','$') -+ elseif a:filetype =~ "moduala." -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "modula2" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "modula3" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "monk" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "mush" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "muttrc" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "named" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "nasm" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "nastran" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "natural" -+ call s:MapDelimiters('/*', '') -+ elseif a:filetype == "ncf" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "netdict" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "netrw" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "nqc" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "nroff" -+ call s:MapDelimiters('\"', '') -+ elseif a:filetype == "nsis" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "objc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "ocaml" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "occam" -+ call s:MapDelimiters('--','') -+ elseif a:filetype == "omlet" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "omnimark" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "openroad" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "opl" -+ call s:MapDelimiters("REM", "") -+ elseif a:filetype == "ora" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "otl" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "ox" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "pascal" -+ call s:MapDelimitersWithAlternative('{','}', '(*', '*)') -+ elseif a:filetype == "passwd" -+ call s:MapDelimitersWith('','') -+ elseif a:filetype == "pcap" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "pccts" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "perl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "pfmain" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "php" -+ call s:MapDelimitersWithAlternative('//','','/*', '*/') -+ elseif a:filetype == "phtml" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "pic" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "pike" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "pilrc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "pine" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "plaintex" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "plm" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "plsql" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "po" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "postscr" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "pov" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "povini" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "ppd" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "ppwiz" -+ call s:MapDelimiters(';;', '') -+ elseif a:filetype == "procmail" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "progress" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "prolog" -+ call s:MapDelimitersWithAlternative('%','','/*','*/') -+ elseif a:filetype == "psf" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ptcap" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "python" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "qf" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "radiance" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "Rails-log" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "ratpoison" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "r" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "readline" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rebol" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "registry" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "remind" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rexx" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "robots" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rpl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "rst" -+ call s:MapDelimiters('..', '') -+ elseif a:filetype == "rtf" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "ruby" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "sa" -+ call s:MapDelimiters('--','') -+ elseif a:filetype == "samba" -+ call s:MapDelimitersWithAlternative(';','', '#', '') -+ elseif a:filetype == "sas" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "sass" -+ call s:MapDelimitersWithAlternative('//','', '/*', '') -+ elseif a:filetype == "sather" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "scheme" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "scilab" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "screen" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "scsh" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "sdl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "sed" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "selectbuf" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "sgml" -+ call s:MapDelimiters('') -+ elseif a:filetype == "sgmldecl" -+ call s:MapDelimiters('--','--') -+ elseif a:filetype == "sgmllnx" -+ call s:MapDelimiters('') -+ elseif a:filetype == "sicad" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "simula" -+ call s:MapDelimitersWithAlternative('%', '', '--', '') -+ elseif a:filetype == "sinda" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "skill" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "slang" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "sl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "slrnrc" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "sm" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "smarty" -+ call s:MapDelimiters('{*', '*}') -+ elseif a:filetype == "smil" -+ call s:MapDelimiters('') -+ elseif a:filetype == "smith" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "sml" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "snnsnet" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "snnspat" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "snnsres" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "snobol4" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "spec" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "specman" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "spice" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "sql" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "sqlforms" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "sqlj" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "sqr" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "squid" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "st" -+ call s:MapDelimiters('"','') -+ elseif a:filetype == "stp" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "strace" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "svn" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "SVNcommitlog" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "systemverilog" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "tads" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "taglist" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "tags" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "tak" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "tasm" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "tcl" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "terminfo" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "tex" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "text" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "texinfo" -+ call s:MapDelimiters("@c ", "") -+ elseif a:filetype == "texmf" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "tf" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "tidy" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "tli" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "trasys" -+ call s:MapDelimiters("$", "") -+ elseif a:filetype == "tsalt" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "tsscl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "tssgm" -+ call s:MapDelimiters("comment = '","'") -+ elseif a:filetype == "uc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "uil" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "vb" -+ call s:MapDelimiters("'","") -+ elseif a:filetype == "vcscommit" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "vera" -+ call s:MapDelimitersWithAlternative('/*','*/','//','') -+ elseif a:filetype == "verilog" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "verilog_systemverilog" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "vgrindefs" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "vhdl" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "vim" -+ call s:MapDelimiters('"','') -+ elseif a:filetype == "viminfo" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "virata" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "vo_base" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "vrml" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "vsejcl" -+ call s:MapDelimiters('/*', '') -+ elseif a:filetype == "webmacro" -+ call s:MapDelimiters('##', '') -+ elseif a:filetype == "wget" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "winbatch" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "wml" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype =~ "[^w]*sh" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "wvdial" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "xdefaults" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "xf86conf" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "xhtml" -+ call s:MapDelimiters('') -+ elseif a:filetype == "xkb" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "xmath" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "xml" -+ call s:MapDelimiters('') -+ elseif a:filetype == "xmodmap" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "xpm2" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "xpm" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "xsd" -+ call s:MapDelimiters('') -+ elseif a:filetype == "xslt" -+ call s:MapDelimiters('') -+ elseif a:filetype == "yacc" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "yaml" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "z8a" -+ call s:MapDelimiters(';', '') -+ -+ elseif a:filetype == "" -+ call s:MapDelimitersWithAlternative("","", "", "") -+ -+ "we have not hardcoded the comment delimiters to use for this filetype so -+ "get them from &commentstring. -+ else -+ "print a disclaimer to the user :) -+ if !g:NERDShutUp -+ call s:NerdEcho("Unknown filetype '".a:filetype."', setting delimiters by &commentstring.\nPleeeeease email the author of the NERD commenter with this filetype\nand its delimiters!", 0) -+ endif -+ -+ "extract the delims from &commentstring -+ let left= substitute(&commentstring, '\(.*\)%s.*', '\1', '') -+ let right= substitute(&commentstring, '.*%s\(.*\)', '\1', 'g') -+ -+ call s:MapDelimiters(left,right) -+ endif -+endfunction -+ -+" Function: s:MapDelimiters(left, right) function {{{2 -+" This function is a wrapper for s:MapDelimiters(left, right, leftAlt, rightAlt, useAlt) and is called when there -+" is no alternative comment delimiters for the current filetype -+" -+" Args: -+" -left: the left comment delimiter -+" -right: the right comment delimiter -+function s:MapDelimiters(left, right) -+ call s:MapDelimitersWithAlternative(a:left, a:right, "", "") -+endfunction -+ -+" Function: s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) function {{{2 -+" this function sets up the comment delimiter buffer variables -+" -+" Args: -+" -left: the string defining the comment start delimiter -+" -right: the string defining the comment end delimiter -+" -leftAlt: the string for the alternative comment style defining the comment start delimiter -+" -rightAlt: the string for the alternative comment style defining the comment end delimiter -+function s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) -+ if !exists('g:NERD_' . &filetype . '_alt_style') -+ let b:left = a:left -+ let b:right = a:right -+ let b:leftAlt = a:leftAlt -+ let b:rightAlt = a:rightAlt -+ else -+ let b:left = a:leftAlt -+ let b:right = a:rightAlt -+ let b:leftAlt = a:left -+ let b:rightAlt = a:right -+ endif -+endfunction -+ -+" Function: s:SwitchToAlternativeDelimiters(printMsgs) function {{{2 -+" This function is used to swap the delimiters that are being used to the -+" alternative delimiters for that filetype. For example, if a c++ file is -+" being edited and // comments are being used, after this function is called -+" /**/ comments will be used. -+" -+" Args: -+" -printMsgs: if this is 1 then a message is echoed to the user telling them -+" if this function changed the delimiters or not -+function s:SwitchToAlternativeDelimiters(printMsgs) -+ "if both of the alternative delimiters are empty then there is no -+ "alternative comment style so bail out -+ if !s:HasMultipartDelims() -+ if a:printMsgs -+ call s:NerdEcho("Cannot use alternative delimiters, none are specified", 0) -+ endif -+ return 0 -+ endif -+ -+ "save the current delimiters -+ let tempLeft = b:left -+ let tempRight = b:right -+ -+ "swap current delimiters for alternative -+ let b:left = b:leftAlt -+ let b:right = b:rightAlt -+ -+ "set the previously current delimiters to be the new alternative ones -+ let b:leftAlt = tempLeft -+ let b:rightAlt = tempRight -+ -+ "tell the user what comment delimiters they are now using -+ if a:printMsgs -+ let leftNoEsc = b:left -+ let rightNoEsc = b:right -+ call s:NerdEcho("Now using " . leftNoEsc . " " . rightNoEsc . " to delimit comments", 1) -+ endif -+ -+ return 1 -+endfunction -+ -+" Section: Comment delimiter add/removal functions {{{1 -+" ============================================================================ -+" Function: s:AppendCommentToLine(){{{2 -+" This function appends comment delimiters at the EOL and places the cursor in -+" position to start typing the comment -+function s:AppendCommentToLine() -+ let left = s:GetLeft(0,1,0) -+ let right = s:GetRight(0,1,0) -+ -+ " get the len of the right delim -+ let lenRight = strlen(right) -+ -+ let isLineEmpty = strlen(getline(".")) == 0 -+ let insOrApp = (isLineEmpty==1 ? 'i' : 'A') -+ -+ "stick the delimiters down at the end of the line. We have to format the -+ "comment with spaces as appropriate -+ execute ":normal " . insOrApp . (isLineEmpty ? '' : ' ') . left . right . " " -+ -+ " if there is a right delimiter then we gotta move the cursor left -+ " by the len of the right delimiter so we insert between the delimiters -+ if lenRight > 0 -+ let leftMoveAmount = lenRight -+ execute ":normal " . leftMoveAmount . "h" -+ endif -+ startinsert -+endfunction -+ -+" Function: s:CommentBlock(top, bottom, lSide, rSide, forceNested ) {{{2 -+" This function is used to comment out a region of code. This region is -+" specified as a bounding box by arguments to the function. -+" -+" Args: -+" -top: the line number for the top line of code in the region -+" -bottom: the line number for the bottom line of code in the region -+" -lSide: the column number for the left most column in the region -+" -rSide: the column number for the right most column in the region -+" -forceNested: a flag indicating whether comments should be nested -+function s:CommentBlock(top, bottom, lSide, rSide, forceNested ) -+ " we need to create local copies of these arguments so we can modify them -+ let top = a:top -+ let bottom = a:bottom -+ let lSide = a:lSide -+ let rSide = a:rSide -+ -+ "if the top or bottom line starts with tabs we have to adjust the left and -+ "right boundaries so that they are set as though the tabs were spaces -+ let topline = getline(top) -+ let bottomline = getline(bottom) -+ if s:HasLeadingTabs(topline, bottomline) -+ -+ "find out how many tabs are in the top line and adjust the left -+ "boundary accordingly -+ let numTabs = s:NumberOfLeadingTabs(topline) -+ if lSide < numTabs -+ let lSide = &ts * lSide -+ else -+ let lSide = (lSide - numTabs) + (&ts * numTabs) -+ endif -+ -+ "find out how many tabs are in the bottom line and adjust the right -+ "boundary accordingly -+ let numTabs = s:NumberOfLeadingTabs(bottomline) -+ let rSide = (rSide - numTabs) + (&ts * numTabs) -+ endif -+ -+ "we must check that bottom IS actually below top, if it is not then we -+ "swap top and bottom. Similarly for left and right. -+ if bottom < top -+ let temp = top -+ let top = bottom -+ let bottom = top -+ endif -+ if rSide < lSide -+ let temp = lSide -+ let lSide = rSide -+ let rSide = temp -+ endif -+ -+ "if the current delimiters arent multipart then we will switch to the -+ "alternative delims (if THEY are) as the comment will be better and more -+ "accurate with multipart delims -+ let switchedDelims = 0 -+ if !s:Multipart() && g:NERDAllowAnyVisualDelims && s:AltMultipart() -+ let switchedDelims = 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+ -+ "start the commenting from the top and keep commenting till we reach the -+ "bottom -+ let currentLine=top -+ while currentLine <= bottom -+ -+ "check if we are allowed to comment this line -+ if s:CanCommentLine(a:forceNested, currentLine) -+ -+ "convert the leading tabs into spaces -+ let theLine = getline(currentLine) -+ let lineHasLeadTabs = s:HasLeadingTabs(theLine) -+ if lineHasLeadTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ -+ "dont comment lines that begin after the right boundary of the -+ "block unless the user has specified to do so -+ if theLine !~ '^ \{' . rSide . '\}' || !g:NERDBlockComIgnoreEmpty -+ -+ "attempt to place the cursor in on the left of the boundary box, -+ "then check if we were successful, if not then we cant comment this -+ "line -+ call setline(currentLine, theLine) -+ if s:CanPlaceCursor(currentLine, lSide) -+ -+ let leftSpaced = s:GetLeft(0,1,0) -+ let rightSpaced = s:GetRight(0,1,0) -+ -+ "stick the left delimiter down -+ let theLine = strpart(theLine, 0, lSide-1) . leftSpaced . strpart(theLine, lSide-1) -+ -+ if s:Multipart() -+ "stick the right delimiter down -+ let theLine = strpart(theLine, 0, rSide+strlen(leftSpaced)) . rightSpaced . strpart(theLine, rSide+strlen(rightSpaced)) -+ -+ let firstLeftDelim = s:FindDelimiterIndex(b:left, theLine) -+ let lastRightDelim = s:LastIndexOfDelim(b:right, theLine) -+ -+ if firstLeftDelim != -1 && lastRightDelim != -1 -+ let searchStr = strpart(theLine, 0, lastRightDelim) -+ let searchStr = strpart(searchStr, firstLeftDelim+strlen(b:left)) -+ -+ "replace the outter most delims in searchStr with -+ "place-holders -+ let theLineWithPlaceHolders = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, searchStr) -+ -+ "add the right delimiter onto the line -+ let theLine = strpart(theLine, 0, firstLeftDelim+strlen(b:left)) . theLineWithPlaceHolders . strpart(theLine, lastRightDelim) -+ endif -+ endif -+ endif -+ endif -+ -+ "restore tabs if needed -+ if lineHasLeadTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ call setline(currentLine, theLine) -+ endif -+ -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ "if we switched delims then we gotta go back to what they were before -+ if switchedDelims == 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+endfunction -+ -+" Function: s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) {{{2 -+" This function comments a range of lines. -+" -+" Args: -+" -forceNested: a flag indicating whether the called is requesting the comment -+" to be nested if need be -+" -alignRight/alignLeft: 0/1 if the comments delimiters should/shouldnt be -+" aligned left/right -+" -firstLine/lastLine: the top and bottom lines to comment -+function s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) -+ " we need to get the left and right indexes of the leftmost char in the -+ " block of of lines and the right most char so that we can do alignment of -+ " the delimiters if the user has specified -+ let leftAlignIndx = s:LeftMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) -+ let rightAlignIndx = s:RightMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) -+ -+ " gotta add the length of the left delimiter onto the rightAlignIndx cos -+ " we'll be adding a left delim to the line -+ let rightAlignIndx = rightAlignIndx + strlen(s:GetLeft(0,1,0)) -+ -+ " now we actually comment the lines. Do it line by line -+ let currentLine = a:firstLine -+ while currentLine <= a:lastLine -+ -+ " get the next line, check commentability and convert spaces to tabs -+ let theLine = getline(currentLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ if s:CanCommentLine(a:forceNested, currentLine) -+ "if the user has specified forceNesting then we check to see if we -+ "need to switch delimiters for place-holders -+ if a:forceNested && g:NERDUsePlaceHolders -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ endif -+ -+ " find out if the line is commented using normal delims and/or -+ " alternate ones -+ let isCommented = s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) -+ -+ " check if we can comment this line -+ if !isCommented || g:NERDUsePlaceHolders || s:Multipart() -+ if a:alignLeft -+ let theLine = s:AddLeftDelimAligned(b:left, theLine, leftAlignIndx) -+ else -+ let theLine = s:AddLeftDelim(s:GetLeft(0,1,0), theLine) -+ endif -+ if a:alignRight -+ let theLine = s:AddRightDelimAligned(b:right, theLine, rightAlignIndx) -+ else -+ let theLine = s:AddRightDelim(s:GetRight(0,1,0), theLine) -+ endif -+ endif -+ endif -+ -+ " restore leading tabs if appropriate -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ " we are done with this line -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+endfunction -+ -+" Function: s:CommentLinesMinimal(firstLine, lastLine) {{{2 -+" This function comments a range of lines in a minimal style. I -+" -+" Args: -+" -firstLine/lastLine: the top and bottom lines to comment -+function s:CommentLinesMinimal(firstLine, lastLine) -+ "check that minimal comments can be done on this filetype -+ if !s:HasMultipartDelims() -+ throw 'NERDCommenter.Delimiters exception: Minimal comments can only be used for filetypes that have multipart delimiters' -+ endif -+ -+ "if we need to use place holders for the comment, make sure they are -+ "enabled for this filetype -+ if !g:NERDUsePlaceHolders && s:DoesBlockHaveMultipartDelim(a:firstLine, a:lastLine) -+ throw 'NERDCommenter.Settings exception: Placeoholders are required but disabled.' -+ endif -+ -+ "get the left and right delims to smack on -+ let left = s:GetSexyComLeft(g:NERDSpaceDelims,0) -+ let right = s:GetSexyComRight(g:NERDSpaceDelims,0) -+ -+ "make sure all multipart delims on the lines are replaced with -+ "placeholders to prevent illegal syntax -+ let currentLine = a:firstLine -+ while(currentLine <= a:lastLine) -+ let theLine = getline(currentLine) -+ let theLine = s:ReplaceDelims(left, right, g:NERDLPlace, g:NERDRPlace, theLine) -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ "add the delim to the top line -+ let theLine = getline(a:firstLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let theLine = s:AddLeftDelim(left, theLine) -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:firstLine, theLine) -+ -+ "add the delim to the bottom line -+ let theLine = getline(a:lastLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let theLine = s:AddRightDelim(right, theLine) -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:lastLine, theLine) -+endfunction -+ -+" Function: s:CommentLinesSexy(topline, bottomline) function {{{2 -+" This function is used to comment lines in the 'Sexy' style. eg in c: -+" /* -+" * This is a sexy comment -+" */ -+" Args: -+" -topline: the line num of the top line in the sexy comment -+" -bottomline: the line num of the bottom line in the sexy comment -+function s:CommentLinesSexy(topline, bottomline) -+ let left = s:GetSexyComLeft(0, 0) -+ let right = s:GetSexyComRight(0, 0) -+ -+ "check if we can do a sexy comment with the available delimiters -+ if left == -1 || right == -1 -+ throw 'NERDCommenter.Delimiters exception: cannot perform sexy comments with available delimiters.' -+ endif -+ -+ "make sure the lines arent already commented sexually -+ if !s:CanSexyCommentLines(a:topline, a:bottomline) -+ throw 'NERDCommenter.Nesting exception: cannot nest sexy comments' -+ endif -+ -+ -+ let sexyComMarker = s:GetSexyComMarker(0,0) -+ let sexyComMarkerSpaced = s:GetSexyComMarker(1,0) -+ -+ -+ " we jam the comment as far to the right as possible -+ let leftAlignIndx = s:LeftMostIndx(1, 1, a:topline, a:bottomline) -+ -+ "check if we should use the compact style i.e that the left/right -+ "delimiters should appear on the first and last lines of the code and not -+ "on separate lines above/below the first/last lines of code -+ if g:NERDCompactSexyComs -+ let spaceString = (g:NERDSpaceDelims ? s:spaceStr : '') -+ -+ "comment the top line -+ let theLine = getline(a:topline) -+ let lineHasTabs = s:HasLeadingTabs(theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ let theLine = s:AddLeftDelimAligned(left . spaceString, theLine, leftAlignIndx) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:topline, theLine) -+ -+ "comment the bottom line -+ let theLine = getline(a:bottomline) -+ let lineHasTabs = s:HasLeadingTabs(theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ let theLine = s:AddRightDelim(spaceString . right, theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:bottomline, theLine) -+ else -+ -+ " add the left delimiter one line above the lines that are to be commented -+ call cursor(a:topline, 1) -+ execute 'normal! O' -+ call setline(a:topline, strpart(s:spaces, 0, leftAlignIndx) . left ) -+ -+ " add the right delimiter after bottom line (we have to add 1 cos we moved -+ " the lines down when we added the left delim -+ call cursor(a:bottomline+1, 1) -+ execute 'normal! o' -+ call setline(a:bottomline+2, strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . right ) -+ -+ endif -+ -+ " go thru each line adding the sexyComMarker marker to the start of each -+ " line in the appropriate place to align them with the comment delims -+ let currentLine = a:topline+1 -+ while currentLine <= a:bottomline + !g:NERDCompactSexyComs -+ " get the line and convert the tabs to spaces -+ let theLine = getline(currentLine) -+ let lineHasTabs = s:HasLeadingTabs(theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ -+ " add the sexyComMarker -+ let theLine = strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . sexyComMarkerSpaced . strpart(theLine, leftAlignIndx) -+ -+ if lineHasTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ -+ " set the line and move onto the next one -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+endfunction -+ -+" Function: s:CommentLinesToggle(forceNested, firstLine, lastLine) {{{2 -+" Applies "toggle" commenting to the given range of lines -+" -+" Args: -+" -forceNested: a flag indicating whether the called is requesting the comment -+" to be nested if need be -+" -firstLine/lastLine: the top and bottom lines to comment -+function s:CommentLinesToggle(forceNested, firstLine, lastLine) -+ let currentLine = a:firstLine -+ while currentLine <= a:lastLine -+ -+ " get the next line, check commentability and convert spaces to tabs -+ let theLine = getline(currentLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ if s:CanToggleCommentLine(a:forceNested, currentLine) -+ -+ "if the user has specified forceNesting then we check to see if we -+ "need to switch delimiters for place-holders -+ if g:NERDUsePlaceHolders -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ endif -+ -+ let theLine = s:AddLeftDelim(s:GetLeft(0, 1, 0), theLine) -+ let theLine = s:AddRightDelim(s:GetRight(0, 1, 0), theLine) -+ endif -+ -+ " restore leading tabs if appropriate -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ " we are done with this line -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+endfunction -+ -+" Function: s:CommentRegion(topline, topCol, bottomLine, bottomCol) function {{{2 -+" This function comments chunks of text selected in visual mode. -+" It will comment exactly the text that they have selected. -+" Args: -+" -topLine: the line num of the top line in the sexy comment -+" -topCol: top left col for this comment -+" -bottomline: the line num of the bottom line in the sexy comment -+" -bottomCol: the bottom right col for this comment -+" -forceNested: whether the caller wants comments to be nested if the -+" line(s) are already commented -+function s:CommentRegion(topLine, topCol, bottomLine, bottomCol, forceNested) -+ -+ "switch delims (if we can) if the current set isnt multipart -+ let switchedDelims = 0 -+ if !s:Multipart() && s:AltMultipart() && !g:NERDAllowAnyVisualDelims -+ let switchedDelims = 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+ -+ "if there is only one line in the comment then just do it -+ if a:topLine == a:bottomLine -+ call s:CommentBlock(a:topLine, a:bottomLine, a:topCol, a:bottomCol, a:forceNested) -+ -+ "there are multiple lines in the comment -+ else -+ "comment the top line -+ call s:CommentBlock(a:topLine, a:topLine, a:topCol, strlen(getline(a:topLine)), a:forceNested) -+ -+ "comment out all the lines in the middle of the comment -+ let topOfRange = a:topLine+1 -+ let bottomOfRange = a:bottomLine-1 -+ if topOfRange <= bottomOfRange -+ call s:CommentLines(a:forceNested, 0, 0, topOfRange, bottomOfRange) -+ endif -+ -+ "comment the bottom line -+ let bottom = getline(a:bottomLine) -+ let numLeadingSpacesTabs = strlen(substitute(bottom, '^\([ \t]*\).*$', '\1', '')) -+ call s:CommentBlock(a:bottomLine, a:bottomLine, numLeadingSpacesTabs+1, a:bottomCol, a:forceNested) -+ -+ endif -+ -+ "stick the cursor back on the char it was on before the comment -+ call cursor(a:topLine, a:topCol + strlen(b:left) + g:NERDSpaceDelims) -+ -+ "if we switched delims then we gotta go back to what they were before -+ if switchedDelims == 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+ -+endfunction -+ -+" Function: s:InvertComment(firstLine, lastLine) function {{{2 -+" Inverts the comments on the lines between and including the given line -+" numbers i.e all commented lines are uncommented and vice versa -+" Args: -+" -firstLine: the top of the range of lines to be inverted -+" -lastLine: the bottom of the range of lines to be inverted -+function s:InvertComment(firstLine, lastLine) -+ -+ " go thru all lines in the given range -+ let currentLine = a:firstLine -+ while currentLine <= a:lastLine -+ let theLine = getline(currentLine) -+ -+ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) -+ -+ " if the line is commented normally, uncomment it -+ if s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) -+ call s:UncommentLines(1, currentLine, currentLine) -+ let currentLine = currentLine + 1 -+ -+ " check if the line is commented sexually -+ elseif !empty(sexyComBounds) -+ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() -+ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) -+ -+ "move to the line after last line of the sexy comment -+ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() -+ let currentLine = bottomBound - (numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved) + 1 -+ -+ " the line isnt commented -+ else -+ call s:CommentLinesToggle(1, currentLine, currentLine) -+ let currentLine = currentLine + 1 -+ endif -+ -+ endwhile -+endfunction -+ -+" Function: NERDComment(isVisual, alignLeft, alignRight, type) function {{{2 -+" This function is a Wrapper for the main commenting functions -+" -+" Args: -+" -isVisual: a flag indicating whether the comment is requested in visual -+" mode or not -+" -type: the type of commenting requested. Can be 'sexy', 'invert', -+" 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', -+" 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' -+function! NERDComment(isVisual, type) range -+ " we want case sensitivity when commenting -+ let prevIgnoreCase = &ignorecase -+ set noignorecase -+ -+ if a:isVisual -+ let firstLine = line("'<") -+ let lastLine = line("'>") -+ let firstCol = col("'<") -+ let lastCol = col("'>") -+ else -+ let firstLine = a:firstline -+ let lastLine = a:lastline -+ endif -+ -+ let countWasGiven = (a:isVisual == 0 && firstLine != lastLine) -+ -+ let forceNested = (a:type == 'nested' || g:NERDDefaultNesting) -+ -+ if a:type == 'norm' || a:type == 'nested' -+ if a:isVisual && visualmode() == "" -+ call s:CommentBlock(firstLine, lastLine, firstCol, lastCol, forceNested) -+ elseif a:isVisual && visualmode() == "v" && (g:NERDCommentWholeLinesInVMode==0 || (g:NERDCommentWholeLinesInVMode==2 && s:HasMultipartDelims())) -+ call s:CommentRegion(firstLine, firstCol, lastLine, lastCol, forceNested) -+ else -+ call s:CommentLines(forceNested, 0, 0, firstLine, lastLine) -+ endif -+ -+ elseif a:type == 'alignLeft' || a:type == 'alignRight' || a:type == 'alignBoth' -+ let alignLeft = (a:type == 'alignLeft' || a:type == 'alignBoth') -+ let alignRight = (a:type == 'alignRight' || a:type == 'alignBoth') -+ call s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) -+ -+ elseif a:type == 'invert' -+ call s:InvertComment(firstLine, lastLine) -+ -+ elseif a:type == 'sexy' -+ try -+ call s:CommentLinesSexy(firstLine, lastLine) -+ catch /NERDCommenter.Delimiters/ -+ call s:NerdEcho("Sexy comments cannot be done with the available delimiters", 0) -+ catch /NERDCommenter.Nesting/ -+ call s:NerdEcho("Sexy comment aborted. Nested sexy cannot be nested", 0) -+ endtry -+ -+ elseif a:type == 'toggle' -+ let theLine = getline(firstLine) -+ -+ if s:IsInSexyComment(firstLine) || s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) -+ call s:UncommentLines(1, firstLine, lastLine) -+ else -+ call s:CommentLinesToggle(forceNested, firstLine, lastLine) -+ endif -+ -+ elseif a:type == 'minimal' -+ try -+ call s:CommentLinesMinimal(firstLine, lastLine) -+ catch /NERDCommenter.Delimiters/ -+ call s:NerdEcho("Minimal comments can only be used for filetypes that have multipart delimiters.", 0) -+ catch /NERDCommenter.Settings/ -+ call s:NerdEcho("Place holders are required but disabled.", 0) -+ endtry -+ -+ elseif a:type == 'toEOL' -+ call s:SaveScreenState() -+ call s:CommentBlock(firstLine, firstLine, col("."), col("$")-1, 1) -+ call s:RestoreScreenState() -+ -+ elseif a:type == 'prepend' -+ call s:PrependCommentToLine() -+ -+ elseif a:type == 'append' -+ call s:AppendCommentToLine() -+ -+ elseif a:type == 'insert' -+ call s:PlaceDelimitersAndInsBetween() -+ -+ elseif a:type == 'uncomment' -+ call s:UncommentLines(0, firstLine, lastLine) -+ -+ elseif a:type == 'yank' -+ if a:isVisual -+ normal gvy -+ elseif countWasGiven -+ execute firstLine .','. lastLine .'yank' -+ else -+ normal Y -+ endif -+ execute firstLine .','. lastLine .'call NERDComment('. a:isVisual .', "norm")' -+ endif -+ -+ let &ignorecase = prevIgnoreCase -+endfunction -+ -+" Function: s:PlaceDelimitersAndInsBetween() function {{{2 -+" This is function is called to place comment delimiters down and place the -+" cursor between them -+function s:PlaceDelimitersAndInsBetween() -+ " get the left and right delimiters without any escape chars in them -+ let left = s:GetLeft(0, 1, 0) -+ let right = s:GetRight(0, 1, 0) -+ -+ let theLine = getline(".") -+ let lineHasLeadTabs = s:HasLeadingTabs(theLine) || (theLine =~ '^ *$' && !&expandtab) -+ -+ "convert tabs to spaces and adjust the cursors column to take this into -+ "account -+ let untabbedCol = s:UntabbedCol(theLine, col(".")) -+ call setline(line("."), s:ConvertLeadingTabsToSpaces(theLine)) -+ call cursor(line("."), untabbedCol) -+ -+ " get the len of the right delim -+ let lenRight = strlen(right) -+ -+ let isDelimOnEOL = col(".") >= strlen(getline(".")) -+ -+ " if the cursor is in the first col then we gotta insert rather than -+ " append the comment delimiters here -+ let insOrApp = (col(".")==1 ? 'i' : 'a') -+ -+ " place the delimiters down. We do it differently depending on whether -+ " there is a left AND right delimiter -+ if lenRight > 0 -+ execute ":normal " . insOrApp . left . right -+ execute ":normal " . lenRight . "h" -+ else -+ execute ":normal " . insOrApp . left -+ -+ " if we are tacking the delim on the EOL then we gotta add a space -+ " after it cos when we go out of insert mode the cursor will move back -+ " one and the user wont be in position to type the comment. -+ if isDelimOnEOL -+ execute 'normal a ' -+ endif -+ endif -+ normal l -+ -+ "if needed convert spaces back to tabs and adjust the cursors col -+ "accordingly -+ if lineHasLeadTabs -+ let tabbedCol = s:TabbedCol(getline("."), col(".")) -+ call setline(line("."), s:ConvertLeadingSpacesToTabs(getline("."))) -+ call cursor(line("."), tabbedCol) -+ endif -+ -+ startinsert -+endfunction -+ -+" Function: s:PrependCommentToLine(){{{2 -+" This function prepends comment delimiters to the start of line and places -+" the cursor in position to start typing the comment -+function s:PrependCommentToLine() -+ " get the left and right delimiters without any escape chars in them -+ let left = s:GetLeft(0, 1, 0) -+ let right = s:GetRight(0, 1, 0) -+ -+ " get the len of the right delim -+ let lenRight = strlen(right) -+ -+ -+ "if the line is empty then we need to know about this later on -+ let isLineEmpty = strlen(getline(".")) == 0 -+ -+ "stick the delimiters down at the start of the line. We have to format the -+ "comment with spaces as appropriate -+ if lenRight > 0 -+ execute ":normal I" . left . right -+ else -+ execute ":normal I" . left -+ endif -+ -+ " if there is a right delimiter then we gotta move the cursor left -+ " by the len of the right delimiter so we insert between the delimiters -+ if lenRight > 0 -+ let leftMoveAmount = lenRight -+ execute ":normal " . leftMoveAmount . "h" -+ endif -+ normal l -+ -+ "if the line was empty then we gotta add an extra space on the end because -+ "the cursor will move back one more at the end of the last "execute" -+ "command -+ if isLineEmpty && lenRight == 0 -+ execute ":normal a " -+ endif -+ -+ startinsert -+endfunction -+" Function: s:RemoveDelimiters(left, right, line) {{{2 -+" this function is called to remove the first left comment delimiter and the -+" last right delimiter of the given line. -+" -+" The args left and right must be strings. If there is no right delimiter (as -+" is the case for e.g vim file comments) them the arg right should be "" -+" -+" Args: -+" -left: the left comment delimiter -+" -right: the right comment delimiter -+" -line: the line to remove the delimiters from -+function s:RemoveDelimiters(left, right, line) -+ -+ let l:left = a:left -+ let l:right = a:right -+ let lenLeft = strlen(left) -+ let lenRight = strlen(right) -+ -+ let delimsSpaced = (g:NERDSpaceDelims || g:NERDRemoveExtraSpaces) -+ -+ let line = a:line -+ -+ "look for the left delimiter, if we find it, remove it. -+ let leftIndx = s:FindDelimiterIndex(a:left, line) -+ if leftIndx != -1 -+ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+lenLeft) -+ -+ "if the user has specified that there is a space after the left delim -+ "then check for the space and remove it if it is there -+ if delimsSpaced && strpart(line, leftIndx, s:lenSpaceStr) == s:spaceStr -+ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+s:lenSpaceStr) -+ endif -+ endif -+ -+ "look for the right delimiter, if we find it, remove it -+ let rightIndx = s:FindDelimiterIndex(a:right, line) -+ if rightIndx != -1 -+ let line = strpart(line, 0, rightIndx) . strpart(line, rightIndx+lenRight) -+ -+ "if the user has specified that there is a space before the right delim -+ "then check for the space and remove it if it is there -+ if delimsSpaced && strpart(line, rightIndx-s:lenSpaceStr, s:lenSpaceStr) == s:spaceStr && s:Multipart() -+ let line = strpart(line, 0, rightIndx-s:lenSpaceStr) . strpart(line, rightIndx) -+ endif -+ endif -+ -+ return line -+endfunction -+ -+" Function: s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) {{{2 -+" This function uncomments the given lines -+" -+" Args: -+" onlyWholeLineComs: should be 1 for toggle style uncommenting -+" topLine: the top line of the visual selection to uncomment -+" bottomLine: the bottom line of the visual selection to uncomment -+function s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) -+ "make local copies of a:firstline and a:lastline and, if need be, swap -+ "them around if the top line is below the bottom -+ let l:firstline = a:topLine -+ let l:lastline = a:bottomLine -+ if firstline > lastline -+ let firstline = lastline -+ let lastline = a:topLine -+ endif -+ -+ "go thru each line uncommenting each line removing sexy comments -+ let currentLine = firstline -+ while currentLine <= lastline -+ -+ "check the current line to see if it is part of a sexy comment -+ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) -+ if !empty(sexyComBounds) -+ -+ "we need to store the num lines in the buf before the comment is -+ "removed so we know how many lines were removed when the sexy com -+ "was removed -+ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() -+ -+ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) -+ -+ "move to the line after last line of the sexy comment -+ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() -+ let numLinesRemoved = numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved -+ let currentLine = sexyComBounds[1] - numLinesRemoved + 1 -+ let lastline = lastline - numLinesRemoved -+ -+ "no sexy com was detected so uncomment the line as normal -+ else -+ let theLine = getline(currentLine) -+ if a:onlyWholeLineComs && (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) -+ call s:UncommentLinesNormal(currentLine, currentLine) -+ elseif !a:onlyWholeLineComs -+ call s:UncommentLinesNormal(currentLine, currentLine) -+ endif -+ let currentLine = currentLine + 1 -+ endif -+ endwhile -+ -+endfunction -+ -+" Function: s:UncommentLinesSexy(topline, bottomline) {{{2 -+" This function removes all the comment characters associated with the sexy -+" comment spanning the given lines -+" Args: -+" -topline/bottomline: the top/bottom lines of the sexy comment -+function s:UncommentLinesSexy(topline, bottomline) -+ let left = s:GetSexyComLeft(0,1) -+ let right = s:GetSexyComRight(0,1) -+ -+ -+ "check if it is even possible for sexy comments to exist with the -+ "available delimiters -+ if left == -1 || right == -1 -+ throw 'NERDCommenter.Delimiters exception: cannot uncomment sexy comments with available delimiters.' -+ endif -+ -+ let leftUnEsc = s:GetSexyComLeft(0,0) -+ let rightUnEsc = s:GetSexyComRight(0,0) -+ -+ let sexyComMarker = s:GetSexyComMarker(0, 1) -+ let sexyComMarkerUnEsc = s:GetSexyComMarker(0, 0) -+ -+ "the markerOffset is how far right we need to move the sexyComMarker to -+ "line it up with the end of the left delim -+ let markerOffset = strlen(leftUnEsc)-strlen(sexyComMarkerUnEsc) -+ -+ " go thru the intermediate lines of the sexy comment and remove the -+ " sexy comment markers (eg the '*'s on the start of line in a c sexy -+ " comment) -+ let currentLine = a:topline+1 -+ while currentLine < a:bottomline -+ let theLine = getline(currentLine) -+ -+ " remove the sexy comment marker from the line. We also remove the -+ " space after it if there is one and if appropriate options are set -+ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) -+ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) -+ endif -+ -+ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) -+ -+ let theLine = s:ConvertLeadingWhiteSpace(theLine) -+ -+ " move onto the next line -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ " gotta make a copy of a:bottomline cos we modify the position of the -+ " last line it if we remove the topline -+ let bottomline = a:bottomline -+ -+ " get the first line so we can remove the left delim from it -+ let theLine = getline(a:topline) -+ -+ " if the first line contains only the left delim then just delete it -+ if theLine =~ '^[ \t]*' . left . '[ \t]*$' && !g:NERDCompactSexyComs -+ call cursor(a:topline, 1) -+ normal dd -+ let bottomline = bottomline - 1 -+ -+ " topline contains more than just the left delim -+ else -+ -+ " remove the delim. If there is a space after it -+ " then remove this too if appropriate -+ let delimIndx = stridx(theLine, leftUnEsc) -+ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)) -+ endif -+ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) -+ call setline(a:topline, theLine) -+ endif -+ -+ " get the last line so we can remove the right delim -+ let theLine = getline(bottomline) -+ -+ " if the bottomline contains only the right delim then just delete it -+ if theLine =~ '^[ \t]*' . right . '[ \t]*$' -+ call cursor(bottomline, 1) -+ normal dd -+ -+ " the last line contains more than the right delim -+ else -+ " remove the right delim. If there is a space after it and -+ " if the appropriate options are set then remove this too. -+ let delimIndx = s:LastIndexOfDelim(rightUnEsc, theLine) -+ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)) -+ endif -+ -+ " if the last line also starts with a sexy comment marker then we -+ " remove this as well -+ if theLine =~ '^[ \t]*' . sexyComMarker -+ -+ " remove the sexyComMarker. If there is a space after it then -+ " remove that too -+ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) -+ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) -+ endif -+ endif -+ -+ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) -+ call setline(bottomline, theLine) -+ endif -+endfunction -+ -+" Function: s:UncommentLineNormal(line) {{{2 -+" uncomments the given line and returns the result -+" Args: -+" -line: the line to uncomment -+function s:UncommentLineNormal(line) -+ let line = a:line -+ -+ "get the comment status on the line so we know how it is commented -+ let lineCommentStatus = s:IsCommentedOuttermost(b:leftAlt, b:rightAlt, b:left, b:right, line) -+ -+ "it is commented with b:left and b:right so remove these delims -+ if lineCommentStatus == 1 -+ let line = s:RemoveDelimiters(b:leftAlt, b:rightAlt, line) -+ -+ "it is commented with b:leftAlt and b:rightAlt so remove these delims -+ elseif lineCommentStatus == 2 && g:NERDRemoveAltComs -+ let line = s:RemoveDelimiters(b:left, b:right, line) -+ -+ "it is not properly commented with any delims so we check if it has -+ "any random left or right delims on it and remove the outtermost ones -+ else -+ "get the positions of all delim types on the line -+ let indxLeft = s:FindDelimiterIndex(b:left, line) -+ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) -+ let indxRight = s:FindDelimiterIndex(b:right, line) -+ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) -+ -+ "remove the outter most left comment delim -+ if indxLeft != -1 && (indxLeft < indxLeftAlt || indxLeftAlt == -1) -+ let line = s:ReplaceLeftMostDelim(b:left, '', line) -+ elseif indxLeftAlt != -1 -+ let line = s:ReplaceLeftMostDelim(b:leftAlt, '', line) -+ endif -+ -+ "remove the outter most right comment delim -+ if indxRight != -1 && (indxRight < indxRightAlt || indxRightAlt == -1) -+ let line = s:ReplaceRightMostDelim(b:right, '', line) -+ elseif indxRightAlt != -1 -+ let line = s:ReplaceRightMostDelim(b:rightAlt, '', line) -+ endif -+ endif -+ -+ -+ let indxLeft = s:FindDelimiterIndex(b:left, line) -+ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) -+ let indxLeftPlace = s:FindDelimiterIndex(g:NERDLPlace, line) -+ -+ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) -+ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) -+ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) -+ -+ let right = b:right -+ let left = b:left -+ if !s:Multipart() -+ let right = b:rightAlt -+ let left = b:leftAlt -+ endif -+ -+ -+ "if there are place-holders on the line then we check to see if they are -+ "the outtermost delimiters on the line. If so then we replace them with -+ "real delimiters -+ if indxLeftPlace != -1 -+ if (indxLeftPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) -+ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) -+ endif -+ elseif indxRightPlace != -1 -+ if (indxRightPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) -+ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) -+ endif -+ -+ endif -+ -+ let line = s:ConvertLeadingWhiteSpace(line) -+ -+ return line -+endfunction -+ -+" Function: s:UncommentLinesNormal(topline, bottomline) {{{2 -+" This function is called to uncomment lines that arent a sexy comment -+" Args: -+" -topline/bottomline: the top/bottom line numbers of the comment -+function s:UncommentLinesNormal(topline, bottomline) -+ let currentLine = a:topline -+ while currentLine <= a:bottomline -+ let line = getline(currentLine) -+ call setline(currentLine, s:UncommentLineNormal(line)) -+ let currentLine = currentLine + 1 -+ endwhile -+endfunction -+ -+ -+" Section: Other helper functions {{{1 -+" ============================================================================ -+ -+" Function: s:AddLeftDelim(delim, theLine) {{{2 -+" Args: -+function s:AddLeftDelim(delim, theLine) -+ return substitute(a:theLine, '^\([ \t]*\)', '\1' . a:delim, '') -+endfunction -+ -+" Function: s:AddLeftDelimAligned(delim, theLine) {{{2 -+" Args: -+function s:AddLeftDelimAligned(delim, theLine, alignIndx) -+ -+ "if the line is not long enough then bung some extra spaces on the front -+ "so we can align the delim properly -+ let theLine = a:theLine -+ if strlen(theLine) < a:alignIndx -+ let theLine = strpart(s:spaces, 0, a:alignIndx - strlen(theLine)) -+ endif -+ -+ return strpart(theLine, 0, a:alignIndx) . a:delim . strpart(theLine, a:alignIndx) -+endfunction -+ -+" Function: s:AddRightDelim(delim, theLine) {{{2 -+" Args: -+function s:AddRightDelim(delim, theLine) -+ if a:delim == '' -+ return a:theLine -+ else -+ return substitute(a:theLine, '$', a:delim, '') -+ endif -+endfunction -+ -+" Function: s:AddRightDelimAligned(delim, theLine, alignIndx) {{{2 -+" Args: -+function s:AddRightDelimAligned(delim, theLine, alignIndx) -+ if a:delim == "" -+ return a:theLine -+ else -+ -+ " when we align the right delim we are just adding spaces -+ " so we get a string containing the needed spaces (it -+ " could be empty) -+ let extraSpaces = '' -+ let extraSpaces = strpart(s:spaces, 0, a:alignIndx-strlen(a:theLine)) -+ -+ " add the right delim -+ return substitute(a:theLine, '$', extraSpaces . a:delim, '') -+ endif -+endfunction -+ -+" Function: s:AltMultipart() {{{2 -+" returns 1 if the alternative delims are multipart -+function s:AltMultipart() -+ return b:rightAlt != '' -+endfunction -+ -+" Function: s:CanCommentLine(forceNested, line) {{{2 -+"This function is used to determine whether the given line can be commented. -+"It returns 1 if it can be and 0 otherwise -+" -+" Args: -+" -forceNested: a flag indicating whether the caller wants comments to be nested -+" if the current line is already commented -+" -lineNum: the line num of the line to check for commentability -+function s:CanCommentLine(forceNested, lineNum) -+ let theLine = getline(a:lineNum) -+ -+ " make sure we don't comment lines that are just spaces or tabs or empty. -+ if theLine =~ "^[ \t]*$" -+ return 0 -+ endif -+ -+ "if the line is part of a sexy comment then just flag it... -+ if s:IsInSexyComment(a:lineNum) -+ return 0 -+ endif -+ -+ let isCommented = s:IsCommentedNormOrSexy(a:lineNum) -+ -+ "if the line isnt commented return true -+ if !isCommented -+ return 1 -+ endif -+ -+ "if the line is commented but nesting is allowed then return true -+ if a:forceNested && (!s:Multipart() || g:NERDUsePlaceHolders) -+ return 1 -+ endif -+ -+ return 0 -+endfunction -+ -+" Function: s:CanPlaceCursor(line, col) {{{2 -+" returns 1 if the cursor can be placed exactly in the given position -+function s:CanPlaceCursor(line, col) -+ let c = col(".") -+ let l = line(".") -+ call cursor(a:line, a:col) -+ let success = (line(".") == a:line && col(".") == a:col) -+ call cursor(l,c) -+ return success -+endfunction -+ -+" Function: s:CanSexyCommentLines(topline, bottomline) {{{2 -+" Return: 1 if the given lines can be commented sexually, 0 otherwise -+function s:CanSexyCommentLines(topline, bottomline) -+ " see if the selected regions have any sexy comments -+ let currentLine = a:topline -+ while(currentLine <= a:bottomline) -+ if s:IsInSexyComment(currentLine) -+ return 0 -+ endif -+ let currentLine = currentLine + 1 -+ endwhile -+ return 1 -+endfunction -+" Function: s:CanToggleCommentLine(forceNested, line) {{{2 -+"This function is used to determine whether the given line can be toggle commented. -+"It returns 1 if it can be and 0 otherwise -+" -+" Args: -+" -lineNum: the line num of the line to check for commentability -+function s:CanToggleCommentLine(forceNested, lineNum) -+ let theLine = getline(a:lineNum) -+ if (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) && !a:forceNested -+ return 0 -+ endif -+ -+ " make sure we don't comment lines that are just spaces or tabs or empty. -+ if theLine =~ "^[ \t]*$" -+ return 0 -+ endif -+ -+ "if the line is part of a sexy comment then just flag it... -+ if s:IsInSexyComment(a:lineNum) -+ return 0 -+ endif -+ -+ return 1 -+endfunction -+ -+" Function: s:ConvertLeadingSpacesToTabs(line) {{{2 -+" This function takes a line and converts all leading tabs on that line into -+" spaces -+" -+" Args: -+" -line: the line whose leading tabs will be converted -+function s:ConvertLeadingSpacesToTabs(line) -+ let toReturn = a:line -+ while toReturn =~ '^\t*' . s:TabSpace() . '\(.*\)$' -+ let toReturn = substitute(toReturn, '^\(\t*\)' . s:TabSpace() . '\(.*\)$' , '\1\t\2' , "") -+ endwhile -+ -+ return toReturn -+endfunction -+ -+ -+" Function: s:ConvertLeadingTabsToSpaces(line) {{{2 -+" This function takes a line and converts all leading spaces on that line into -+" tabs -+" -+" Args: -+" -line: the line whose leading spaces will be converted -+function s:ConvertLeadingTabsToSpaces(line) -+ let toReturn = a:line -+ while toReturn =~ '^\( *\)\t' -+ let toReturn = substitute(toReturn, '^\( *\)\t', '\1' . s:TabSpace() , "") -+ endwhile -+ -+ return toReturn -+endfunction -+ -+" Function: s:ConvertLeadingWhiteSpace(line) {{{2 -+" Converts the leading white space to tabs/spaces depending on &ts -+" -+" Args: -+" -line: the line to convert -+function s:ConvertLeadingWhiteSpace(line) -+ let toReturn = a:line -+ while toReturn =~ '^ *\t' -+ let toReturn = substitute(toReturn, '^ *\zs\t\ze', s:TabSpace(), "g") -+ endwhile -+ -+ if !&expandtab -+ let toReturn = s:ConvertLeadingSpacesToTabs(toReturn) -+ endif -+ -+ return toReturn -+endfunction -+ -+ -+" Function: s:CountNonESCedOccurances(str, searchstr, escChar) {{{2 -+" This function counts the number of substrings contained in another string. -+" These substrings are only counted if they are not escaped with escChar -+" Args: -+" -str: the string to look for searchstr in -+" -searchstr: the substring to search for in str -+" -escChar: the escape character which, when preceding an instance of -+" searchstr, will cause it not to be counted -+function s:CountNonESCedOccurances(str, searchstr, escChar) -+ "get the index of the first occurrence of searchstr -+ let indx = stridx(a:str, a:searchstr) -+ -+ "if there is an instance of searchstr in str process it -+ if indx != -1 -+ "get the remainder of str after this instance of searchstr is removed -+ let lensearchstr = strlen(a:searchstr) -+ let strLeft = strpart(a:str, indx+lensearchstr) -+ -+ "if this instance of searchstr is not escaped, add one to the count -+ "and recurse. If it is escaped, just recurse -+ if !s:IsEscaped(a:str, indx, a:escChar) -+ return 1 + s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) -+ else -+ return s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) -+ endif -+ endif -+endfunction -+" Function: s:DoesBlockHaveDelim(delim, top, bottom) {{{2 -+" Returns 1 if the given block of lines has a delimiter (a:delim) in it -+" Args: -+" -delim: the comment delimiter to check the block for -+" -top: the top line number of the block -+" -bottom: the bottom line number of the block -+function s:DoesBlockHaveDelim(delim, top, bottom) -+ let currentLine = a:top -+ while currentLine < a:bottom -+ let theline = getline(currentLine) -+ if s:FindDelimiterIndex(a:delim, theline) != -1 -+ return 1 -+ endif -+ let currentLine = currentLine + 1 -+ endwhile -+ return 0 -+endfunction -+ -+" Function: s:DoesBlockHaveMultipartDelim(top, bottom) {{{2 -+" Returns 1 if the given block has a >= 1 multipart delimiter in it -+" Args: -+" -top: the top line number of the block -+" -bottom: the bottom line number of the block -+function s:DoesBlockHaveMultipartDelim(top, bottom) -+ if s:HasMultipartDelims() -+ if s:Multipart() -+ return s:DoesBlockHaveDelim(b:left, a:top, a:bottom) || s:DoesBlockHaveDelim(b:right, a:top, a:bottom) -+ else -+ return s:DoesBlockHaveDelim(b:leftAlt, a:top, a:bottom) || s:DoesBlockHaveDelim(b:rightAlt, a:top, a:bottom) -+ endif -+ endif -+ return 0 -+endfunction -+ -+ -+" Function: s:Esc(str) {{{2 -+" Escapes all the tricky chars in the given string -+function s:Esc(str) -+ let charsToEsc = '*/\."&$+' -+ return escape(a:str, charsToEsc) -+endfunction -+ -+" Function: s:FindDelimiterIndex(delimiter, line) {{{2 -+" This function is used to get the string index of the input comment delimiter -+" on the input line. If no valid comment delimiter is found in the line then -+" -1 is returned -+" Args: -+" -delimiter: the delimiter we are looking to find the index of -+" -line: the line we are looking for delimiter on -+function s:FindDelimiterIndex(delimiter, line) -+ -+ "make sure the delimiter isnt empty otherwise we go into an infinite loop. -+ if a:delimiter == "" -+ return -1 -+ endif -+ -+ -+ let l:delimiter = a:delimiter -+ let lenDel = strlen(l:delimiter) -+ -+ "get the index of the first occurrence of the delimiter -+ let delIndx = stridx(a:line, l:delimiter) -+ -+ "keep looping thru the line till we either find a real comment delimiter -+ "or run off the EOL -+ while delIndx != -1 -+ -+ "if we are not off the EOL get the str before the possible delimiter -+ "in question and check if it really is a delimiter. If it is, return -+ "its position -+ if delIndx != -1 -+ if s:IsDelimValid(l:delimiter, delIndx, a:line) -+ return delIndx -+ endif -+ endif -+ -+ "we have not yet found a real comment delimiter so move past the -+ "current one we are lookin at -+ let restOfLine = strpart(a:line, delIndx + lenDel) -+ let distToNextDelim = stridx(restOfLine , l:delimiter) -+ -+ "if distToNextDelim is -1 then there is no more potential delimiters -+ "on the line so set delIndx to -1. Otherwise, move along the line by -+ "distToNextDelim -+ if distToNextDelim == -1 -+ let delIndx = -1 -+ else -+ let delIndx = delIndx + lenDel + distToNextDelim -+ endif -+ endwhile -+ -+ "there is no comment delimiter on this line -+ return -1 -+endfunction -+ -+" Function: s:FindBoundingLinesOfSexyCom(lineNum) {{{2 -+" This function takes in a line number and tests whether this line number is -+" the top/bottom/middle line of a sexy comment. If it is then the top/bottom -+" lines of the sexy comment are returned -+" Args: -+" -lineNum: the line number that is to be tested whether it is the -+" top/bottom/middle line of a sexy com -+" Returns: -+" A string that has the top/bottom lines of the sexy comment encoded in it. -+" The format is 'topline,bottomline'. If a:lineNum turns out not to be the -+" top/bottom/middle of a sexy comment then -1 is returned -+function s:FindBoundingLinesOfSexyCom(lineNum) -+ -+ "find which delimiters to look for as the start/end delims of the comment -+ let left = '' -+ let right = '' -+ if s:Multipart() -+ let left = s:GetLeft(0,0,1) -+ let right = s:GetRight(0,0,1) -+ elseif s:AltMultipart() -+ let left = s:GetLeft(1,0,1) -+ let right = s:GetRight(1,0,1) -+ else -+ return [] -+ endif -+ -+ let sexyComMarker = s:GetSexyComMarker(0, 1) -+ -+ "initialise the top/bottom line numbers of the sexy comment to -1 -+ let top = -1 -+ let bottom = -1 -+ -+ let currentLine = a:lineNum -+ while top == -1 || bottom == -1 -+ let theLine = getline(currentLine) -+ -+ "check if the current line is the top of the sexy comment -+ if theLine =~ '^[ \t]*' . left && theLine !~ '.*' . right -+ let top = currentLine -+ let currentLine = a:lineNum -+ -+ "check if the current line is the bottom of the sexy comment -+ elseif theLine =~ '^[ \t]*' . right && theLine !~ '.*' . left -+ let bottom = currentLine -+ -+ "the right delimiter is on the same line as the last sexyComMarker -+ elseif theLine =~ '^[ \t]*' . sexyComMarker . '.*' . right -+ let bottom = currentLine -+ -+ "we have not found the top or bottom line so we assume currentLine is an -+ "intermediate line and look to prove otherwise -+ else -+ -+ "if the line doesnt start with a sexyComMarker then it is not a sexy -+ "comment -+ if theLine !~ '^[ \t]*' . sexyComMarker -+ return [] -+ endif -+ -+ endif -+ -+ "if top is -1 then we havent found the top yet so keep looking up -+ if top == -1 -+ let currentLine = currentLine - 1 -+ "if we have found the top line then go down looking for the bottom -+ else -+ let currentLine = currentLine + 1 -+ endif -+ -+ endwhile -+ -+ return [top, bottom] -+endfunction -+ -+ -+" Function: s:GetLeft(alt, space, esc) {{{2 -+" returns the left/left-alternative delimiter -+" Args: -+" -alt: specifies whether to get left or left-alternative delim -+" -space: specifies whether the delim should be spaced or not -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the delim should be ESCed -+function s:GetLeft(alt, space, esc) -+ let delim = b:left -+ -+ if a:alt -+ if b:leftAlt == '' -+ return '' -+ else -+ let delim = b:leftAlt -+ endif -+ endif -+ if delim == '' -+ return '' -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let delim = delim . s:spaceStr -+ endif -+ -+ if a:esc -+ let delim = s:Esc(delim) -+ endif -+ -+ return delim -+endfunction -+ -+" Function: s:GetRight(alt, space, esc) {{{2 -+" returns the right/right-alternative delimiter -+" Args: -+" -alt: specifies whether to get right or right-alternative delim -+" -space: specifies whether the delim should be spaced or not -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the delim should be ESCed -+function s:GetRight(alt, space, esc) -+ let delim = b:right -+ -+ if a:alt -+ if !s:AltMultipart() -+ return '' -+ else -+ let delim = b:rightAlt -+ endif -+ endif -+ if delim == '' -+ return '' -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let delim = s:spaceStr . delim -+ endif -+ -+ if a:esc -+ let delim = s:Esc(delim) -+ endif -+ -+ return delim -+endfunction -+ -+ -+" Function: s:GetSexyComMarker() {{{2 -+" Returns the sexy comment marker for the current filetype. -+" -+" C style sexy comments are assumed if possible. If not then the sexy comment -+" marker is the last char of the delimiter pair that has both left and right -+" delims and has the longest left delim -+" -+" Args: -+" -space: specifies whether the marker is to have a space string after it -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the marker are to be ESCed -+function s:GetSexyComMarker(space, esc) -+ let sexyComMarker = b:sexyComMarker -+ -+ "if there is no hardcoded marker then we find one -+ if sexyComMarker == '' -+ -+ "if the filetype has c style comments then use standard c sexy -+ "comments -+ if s:HasCStyleComments() -+ let sexyComMarker = '*' -+ else -+ "find a comment marker by getting the longest available left delim -+ "(that has a corresponding right delim) and taking the last char -+ let lenLeft = strlen(b:left) -+ let lenLeftAlt = strlen(b:leftAlt) -+ let left = '' -+ let right = '' -+ if s:Multipart() && lenLeft >= lenLeftAlt -+ let left = b:left -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ else -+ return -1 -+ endif -+ -+ "get the last char of left -+ let sexyComMarker = strpart(left, strlen(left)-1) -+ endif -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let sexyComMarker = sexyComMarker . s:spaceStr -+ endif -+ -+ if a:esc -+ let sexyComMarker = s:Esc(sexyComMarker) -+ endif -+ -+ return sexyComMarker -+endfunction -+ -+" Function: s:GetSexyComLeft(space, esc) {{{2 -+" Returns the left delimiter for sexy comments for this filetype or -1 if -+" there is none. C style sexy comments are used if possible -+" Args: -+" -space: specifies if the delim has a space string on the end -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the string are ESCed -+function s:GetSexyComLeft(space, esc) -+ let lenLeft = strlen(b:left) -+ let lenLeftAlt = strlen(b:leftAlt) -+ let left = '' -+ -+ "assume c style sexy comments if possible -+ if s:HasCStyleComments() -+ let left = '/*' -+ else -+ "grab the longest left delim that has a right -+ if s:Multipart() && lenLeft >= lenLeftAlt -+ let left = b:left -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ else -+ return -1 -+ endif -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let left = left . s:spaceStr -+ endif -+ -+ if a:esc -+ let left = s:Esc(left) -+ endif -+ -+ return left -+endfunction -+ -+" Function: s:GetSexyComRight(space, esc) {{{2 -+" Returns the right delimiter for sexy comments for this filetype or -1 if -+" there is none. C style sexy comments are used if possible. -+" Args: -+" -space: specifies if the delim has a space string on the start -+" (the space string will only be added if NERDSpaceDelims -+" is specified for the current filetype) -+" -esc: specifies whether the tricky chars in the string are ESCed -+function s:GetSexyComRight(space, esc) -+ let lenLeft = strlen(b:left) -+ let lenLeftAlt = strlen(b:leftAlt) -+ let right = '' -+ -+ "assume c style sexy comments if possible -+ if s:HasCStyleComments() -+ let right = '*/' -+ else -+ "grab the right delim that pairs with the longest left delim -+ if s:Multipart() && lenLeft >= lenLeftAlt -+ let right = b:right -+ elseif s:AltMultipart() -+ let right = b:rightAlt -+ else -+ return -1 -+ endif -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let right = s:spaceStr . right -+ endif -+ -+ if a:esc -+ let right = s:Esc(right) -+ endif -+ -+ return right -+endfunction -+ -+" Function: s:HasMultipartDelims() {{{2 -+" Returns 1 iff the current filetype has at least one set of multipart delims -+function s:HasMultipartDelims() -+ return s:Multipart() || s:AltMultipart() -+endfunction -+ -+" Function: s:HasLeadingTabs(...) {{{2 -+" Returns 1 if any of the given strings have leading tabs -+function s:HasLeadingTabs(...) -+ for s in a:000 -+ if s =~ '^\t.*' -+ return 1 -+ end -+ endfor -+ return 0 -+endfunction -+" Function: s:HasCStyleComments() {{{2 -+" Returns 1 iff the current filetype has c style comment delimiters -+function s:HasCStyleComments() -+ return (b:left == '/*' && b:right == '*/') || (b:leftAlt == '/*' && b:rightAlt == '*/') -+endfunction -+ -+" Function: s:InstallDocumentation(full_name, revision) {{{2 -+" Install help documentation. -+" Arguments: -+" full_name: Full name of this vim plugin script, including path name. -+" revision: Revision of the vim script. #version# mark in the document file -+" will be replaced with this string with 'v' prefix. -+" Return: -+" 1 if new document installed, 0 otherwise. -+" Note: Cleaned and generalized by guo-peng Wen. -+" -+" Note about authorship: this function was taken from the vimspell plugin -+" which can be found at http://www.vim.org/scripts/script.php?script_id=465 -+" -+function s:InstallDocumentation(full_name, revision) -+ " Name of the document path based on the system we use: -+ if has("vms") -+ " No chance that this script will work with -+ " VMS - to much pathname juggling here. -+ return 1 -+ elseif (has("unix")) -+ " On UNIX like system, using forward slash: -+ let l:slash_char = '/' -+ let l:mkdir_cmd = ':silent !mkdir -p ' -+ else -+ " On M$ system, use backslash. Also mkdir syntax is different. -+ " This should only work on W2K and up. -+ let l:slash_char = '\' -+ let l:mkdir_cmd = ':silent !mkdir ' -+ endif -+ -+ let l:doc_path = l:slash_char . 'doc' -+ let l:doc_home = l:slash_char . '.vim' . l:slash_char . 'doc' -+ -+ " Figure out document path based on full name of this script: -+ let l:vim_plugin_path = fnamemodify(a:full_name, ':h') -+ let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . l:doc_path -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ "Doc path: " . l:vim_doc_path -+ call s:NerdEcho("Doc path: " . l:vim_doc_path, 0) -+ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ " Try a default configuration in user home: -+ let l:vim_doc_path = expand("~") . l:doc_home -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ " Put a warning: -+ call s:NerdEcho("Unable to open documentation directory \ntype :help add-local-help for more information.", 0) -+ echo l:vim_doc_path -+ return 0 -+ endif -+ endif -+ endif -+ endif -+ -+ " Exit if we have problem to access the document directory: -+ if (!isdirectory(l:vim_plugin_path) || !isdirectory(l:vim_doc_path) || filewritable(l:vim_doc_path) != 2) -+ return 0 -+ endif -+ -+ " Full name of script and documentation file: -+ let l:script_name = fnamemodify(a:full_name, ':t') -+ let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' -+ let l:plugin_file = l:vim_plugin_path . l:slash_char . l:script_name -+ let l:doc_file = l:vim_doc_path . l:slash_char . l:doc_name -+ -+ " Bail out if document file is still up to date: -+ if (filereadable(l:doc_file) && getftime(l:plugin_file) < getftime(l:doc_file)) -+ return 0 -+ endif -+ -+ " Prepare window position restoring command: -+ if (strlen(@%)) -+ let l:go_back = 'b ' . bufnr("%") -+ else -+ let l:go_back = 'enew!' -+ endif -+ -+ " Create a new buffer & read in the plugin file (me): -+ setl nomodeline -+ exe 'enew!' -+ exe 'r ' . escape(l:plugin_file,s:NERDFileNameEscape) -+ -+ setl modeline -+ let l:buf = bufnr("%") -+ setl noswapfile modifiable -+ -+ norm zR -+ norm gg -+ -+ " Delete from first line to a line starts with -+ " === START_DOC -+ 1,/^=\{3,}\s\+START_DOC\C/ d -+ -+ " Delete from a line starts with -+ " === END_DOC -+ " to the end of the documents: -+ /^=\{3,}\s\+END_DOC\C/,$ d -+ -+ " Remove fold marks: -+ :%s/{\{3}[1-9]/ / -+ -+ " Add modeline for help doc: the modeline string is mangled intentionally -+ " to avoid it be recognized by VIM: -+ call append(line('$'), '') -+ call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') -+ -+ " Replace revision: -+ "exe "normal :1s/#version#/ v" . a:revision . "/\" -+ exe "normal :%s/#version#/ v" . a:revision . "/\" -+ -+ " Save the help document: -+ exe 'w! ' . escape(l:doc_file,s:NERDFileNameEscape) -+ exe l:go_back -+ exe 'bw ' . l:buf -+ -+ " Build help tags: -+ exe 'helptags ' . escape(l:vim_doc_path,s:NERDFileNameEscape) -+ -+ return 1 -+endfunction -+ -+ -+" Function: s:IsCommentedNormOrSexy(lineNum) {{{2 -+"This function is used to determine whether the given line is commented with -+"either set of delimiters or if it is part of a sexy comment -+" -+" Args: -+" -lineNum: the line number of the line to check -+function s:IsCommentedNormOrSexy(lineNum) -+ let theLine = getline(a:lineNum) -+ -+ "if the line is commented normally return 1 -+ if s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) -+ return 1 -+ endif -+ -+ "if the line is part of a sexy comment return 1 -+ if s:IsInSexyComment(a:lineNum) -+ return 1 -+ endif -+ return 0 -+endfunction -+ -+" Function: s:IsCommented(left, right, line) {{{2 -+"This function is used to determine whether the given line is commented with -+"the given delimiters -+" -+" Args: -+" -line: the line that to check if commented -+" -left/right: the left and right delimiters to check for -+function s:IsCommented(left, right, line) -+ "if the line isnt commented return true -+ if s:FindDelimiterIndex(a:left, a:line) != -1 && (s:FindDelimiterIndex(a:right, a:line) != -1 || !s:Multipart()) -+ return 1 -+ endif -+ return 0 -+endfunction -+ -+" Function: s:IsCommentedFromStartOfLine(left, line) {{{2 -+"This function is used to determine whether the given line is commented with -+"the given delimiters at the start of the line i.e the left delimiter is the -+"first thing on the line (apart from spaces\tabs) -+" -+" Args: -+" -line: the line that to check if commented -+" -left: the left delimiter to check for -+function s:IsCommentedFromStartOfLine(left, line) -+ let theLine = s:ConvertLeadingTabsToSpaces(a:line) -+ let numSpaces = strlen(substitute(theLine, '^\( *\).*$', '\1', '')) -+ let delimIndx = s:FindDelimiterIndex(a:left, theLine) -+ return delimIndx == numSpaces -+endfunction -+ -+" Function: s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) {{{2 -+" Finds the type of the outtermost delims on the line -+" -+" Args: -+" -line: the line that to check if the outtermost comments on it are -+" left/right -+" -left/right: the left and right delimiters to check for -+" -leftAlt/rightAlt: the left and right alternative delimiters to check for -+" -+" Returns: -+" 0 if the line is not commented with either set of delims -+" 1 if the line is commented with the left/right delim set -+" 2 if the line is commented with the leftAlt/rightAlt delim set -+function s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) -+ "get the first positions of the left delims and the last positions of the -+ "right delims -+ let indxLeft = s:FindDelimiterIndex(a:left, a:line) -+ let indxLeftAlt = s:FindDelimiterIndex(a:leftAlt, a:line) -+ let indxRight = s:LastIndexOfDelim(a:right, a:line) -+ let indxRightAlt = s:LastIndexOfDelim(a:rightAlt, a:line) -+ -+ "check if the line has a left delim before a leftAlt delim -+ if (indxLeft <= indxLeftAlt || indxLeftAlt == -1) && indxLeft != -1 -+ "check if the line has a right delim after any rightAlt delim -+ if (indxRight > indxRightAlt && indxRight > indxLeft) || !s:Multipart() -+ return 1 -+ endif -+ -+ "check if the line has a leftAlt delim before a left delim -+ elseif (indxLeftAlt <= indxLeft || indxLeft == -1) && indxLeftAlt != -1 -+ "check if the line has a rightAlt delim after any right delim -+ if (indxRightAlt > indxRight && indxRightAlt > indxLeftAlt) || !s:AltMultipart() -+ return 2 -+ endif -+ else -+ return 0 -+ endif -+ -+ return 0 -+ -+endfunction -+ -+ -+" Function: s:IsDelimValid(delimiter, delIndx, line) {{{2 -+" This function is responsible for determining whether a given instance of a -+" comment delimiter is a real delimiter or not. For example, in java the -+" // string is a comment delimiter but in the line: -+" System.out.println("//"); -+" it does not count as a comment delimiter. This function is responsible for -+" distinguishing between such cases. It does so by applying a set of -+" heuristics that are not fool proof but should work most of the time. -+" -+" Args: -+" -delimiter: the delimiter we are validating -+" -delIndx: the position of delimiter in line -+" -line: the line that delimiter occurs in -+" -+" Returns: -+" 0 if the given delimiter is not a real delimiter (as far as we can tell) , -+" 1 otherwise -+function s:IsDelimValid(delimiter, delIndx, line) -+ "get the delimiter without the escchars -+ let l:delimiter = a:delimiter -+ -+ "get the strings before and after the delimiter -+ let preComStr = strpart(a:line, 0, a:delIndx) -+ let postComStr = strpart(a:line, a:delIndx+strlen(delimiter)) -+ -+ "to check if the delimiter is real, make sure it isnt preceded by -+ "an odd number of quotes and followed by the same (which would indicate -+ "that it is part of a string and therefore is not a comment) -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, '"', "\\")) -+ return 0 -+ endif -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "'", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "'", "\\")) -+ return 0 -+ endif -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "`", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "`", "\\")) -+ return 0 -+ endif -+ -+ -+ "if the comment delimiter is escaped, assume it isnt a real delimiter -+ if s:IsEscaped(a:line, a:delIndx, "\\") -+ return 0 -+ endif -+ -+ "vim comments are so fuckin stupid!! Why the hell do they have comment -+ "delimiters that are used elsewhere in the syntax?!?! We need to check -+ "some conditions especially for vim -+ if &filetype == "vim" -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) -+ return 0 -+ endif -+ -+ "if the delimiter is on the very first char of the line or is the -+ "first non-tab/space char on the line then it is a valid comment delimiter -+ if a:delIndx == 0 || a:line =~ "^[ \t]\\{" . a:delIndx . "\\}\".*$" -+ return 1 -+ endif -+ -+ let numLeftParen =s:CountNonESCedOccurances(preComStr, "(", "\\") -+ let numRightParen =s:CountNonESCedOccurances(preComStr, ")", "\\") -+ -+ "if the quote is inside brackets then assume it isnt a comment -+ if numLeftParen > numRightParen -+ return 0 -+ endif -+ -+ "if the line has an even num of unescaped "'s then we can assume that -+ "any given " is not a comment delimiter -+ if s:IsNumEven(s:CountNonESCedOccurances(a:line, "\"", "\\")) -+ return 0 -+ endif -+ endif -+ -+ return 1 -+ -+endfunction -+ -+" Function: s:IsNumEven(num) {{{2 -+" A small function the returns 1 if the input number is even and 0 otherwise -+" Args: -+" -num: the number to check -+function s:IsNumEven(num) -+ return (a:num % 2) == 0 -+endfunction -+ -+" Function: s:IsEscaped(str, indx, escChar) {{{2 -+" This function takes a string, an index into that string and an esc char and -+" returns 1 if the char at the index is escaped (i.e if it is preceded by an -+" odd number of esc chars) -+" Args: -+" -str: the string to check -+" -indx: the index into str that we want to check -+" -escChar: the escape char the char at indx may be ESCed with -+function s:IsEscaped(str, indx, escChar) -+ "initialise numEscChars to 0 and look at the char before indx -+ let numEscChars = 0 -+ let curIndx = a:indx-1 -+ -+ "keep going back thru str until we either reach the start of the str or -+ "run out of esc chars -+ while curIndx >= 0 && strpart(a:str, curIndx, 1) == a:escChar -+ -+ "we have found another esc char so add one to the count and move left -+ "one char -+ let numEscChars = numEscChars + 1 -+ let curIndx = curIndx - 1 -+ -+ endwhile -+ -+ "if there is an odd num of esc chars directly before the char at indx then -+ "the char at indx is escaped -+ return !s:IsNumEven(numEscChars) -+endfunction -+ -+" Function: s:IsInSexyComment(line) {{{2 -+" returns 1 if the given line number is part of a sexy comment -+function s:IsInSexyComment(line) -+ return !empty(s:FindBoundingLinesOfSexyCom(a:line)) -+endfunction -+ -+" Function: s:IsSexyComment(topline, bottomline) {{{2 -+" This function takes in 2 line numbers and returns 1 if the lines between and -+" including the given line numbers are a sexy comment. It returns 0 otherwise. -+" Args: -+" -topline: the line that the possible sexy comment starts on -+" -bottomline: the line that the possible sexy comment stops on -+function s:IsSexyComment(topline, bottomline) -+ -+ "get the delim set that would be used for a sexy comment -+ let left = '' -+ let right = '' -+ if s:Multipart() -+ let left = b:left -+ let right = b:right -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ let right = b:rightAlt -+ else -+ return 0 -+ endif -+ -+ "swap the top and bottom line numbers around if need be -+ let topline = a:topline -+ let bottomline = a:bottomline -+ if bottomline < topline -+ topline = bottomline -+ bottomline = a:topline -+ endif -+ -+ "if there is < 2 lines in the comment it cannot be sexy -+ if (bottomline - topline) <= 0 -+ return 0 -+ endif -+ -+ "if the top line doesnt begin with a left delim then the comment isnt sexy -+ if getline(a:topline) !~ '^[ \t]*' . left -+ return 0 -+ endif -+ -+ "if there is a right delim on the top line then this isnt a sexy comment -+ if s:FindDelimiterIndex(right, getline(a:topline)) != -1 -+ return 0 -+ endif -+ -+ "if there is a left delim on the bottom line then this isnt a sexy comment -+ if s:FindDelimiterIndex(left, getline(a:bottomline)) != -1 -+ return 0 -+ endif -+ -+ "if the bottom line doesnt begin with a right delim then the comment isnt -+ "sexy -+ if getline(a:bottomline) !~ '^.*' . right . '$' -+ return 0 -+ endif -+ -+ let sexyComMarker = s:GetSexyComMarker(0, 1) -+ -+ "check each of the intermediate lines to make sure they start with a -+ "sexyComMarker -+ let currentLine = a:topline+1 -+ while currentLine < a:bottomline -+ let theLine = getline(currentLine) -+ -+ if theLine !~ '^[ \t]*' . sexyComMarker -+ return 0 -+ endif -+ -+ "if there is a right delim in an intermediate line then the block isnt -+ "a sexy comment -+ if s:FindDelimiterIndex(right, theLine) != -1 -+ return 0 -+ endif -+ -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ "we have not found anything to suggest that this isnt a sexy comment so -+ return 1 -+ -+endfunction -+ -+" Function: s:LastIndexOfDelim(delim, str) {{{2 -+" This function takes a string and a delimiter and returns the last index of -+" that delimiter in string -+" Args: -+" -delim: the delimiter to look for -+" -str: the string to look for delim in -+function s:LastIndexOfDelim(delim, str) -+ let delim = a:delim -+ let lenDelim = strlen(delim) -+ -+ "set index to the first occurrence of delim. If there is no occurrence then -+ "bail -+ let indx = s:FindDelimiterIndex(delim, a:str) -+ if indx == -1 -+ return -1 -+ endif -+ -+ "keep moving to the next instance of delim in str till there is none left -+ while 1 -+ -+ "search for the next delim after the previous one -+ let searchStr = strpart(a:str, indx+lenDelim) -+ let indx2 = s:FindDelimiterIndex(delim, searchStr) -+ -+ "if we find a delim update indx to record the position of it, if we -+ "dont find another delim then indx is the last one so break out of -+ "this loop -+ if indx2 != -1 -+ let indx = indx + indx2 + lenDelim -+ else -+ break -+ endif -+ endwhile -+ -+ return indx -+ -+endfunction -+ -+" Function: s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 -+" This function takes in 2 line numbers and returns the index of the left most -+" char (that is not a space or a tab) on all of these lines. -+" Args: -+" -countCommentedLines: 1 if lines that are commented are to be checked as -+" well. 0 otherwise -+" -countEmptyLines: 1 if empty lines are to be counted in the search -+" -topline: the top line to be checked -+" -bottomline: the bottom line to be checked -+function s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) -+ -+ " declare the left most index as an extreme value -+ let leftMostIndx = 1000 -+ -+ " go thru the block line by line updating leftMostIndx -+ let currentLine = a:topline -+ while currentLine <= a:bottomline -+ -+ " get the next line and if it is allowed to be commented, or is not -+ " commented, check it -+ let theLine = getline(currentLine) -+ if a:countEmptyLines || theLine !~ '^[ \t]*$' -+ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) -+ " convert spaces to tabs and get the number of leading spaces for -+ " this line and update leftMostIndx if need be -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let leadSpaceOfLine = strlen( substitute(theLine, '\(^[ \t]*\).*$','\1','') ) -+ if leadSpaceOfLine < leftMostIndx -+ let leftMostIndx = leadSpaceOfLine -+ endif -+ endif -+ endif -+ -+ " move on to the next line -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ if leftMostIndx == 1000 -+ return 0 -+ else -+ return leftMostIndx -+ endif -+endfunction -+ -+" Function: s:Multipart() {{{2 -+" returns 1 if the current delims are multipart -+function s:Multipart() -+ return b:right != '' -+endfunction -+ -+" Function: s:NerdEcho(msg, typeOfMsg) {{{2 -+" Args: -+" -msg: the message to echo -+" -typeOfMsg: 0 = warning message -+" 1 = normal message -+function s:NerdEcho(msg, typeOfMsg) -+ if a:typeOfMsg == 0 -+ echohl WarningMsg -+ echo 'NERDCommenter:' . a:msg -+ echohl None -+ elseif a:typeOfMsg == 1 -+ echo 'NERDCommenter:' . a:msg -+ endif -+endfunction -+ -+" Function: s:NumberOfLeadingTabs(s) {{{2 -+" returns the number of leading tabs in the given string -+function s:NumberOfLeadingTabs(s) -+ return strlen(substitute(a:s, '^\(\t*\).*$', '\1', "")) -+endfunction -+ -+" Function: s:NumLinesInBuf() {{{2 -+" Returns the number of lines in the current buffer -+function s:NumLinesInBuf() -+ return line('$') -+endfunction -+ -+" Function: s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) {{{2 -+" This function takes in a string, 2 delimiters in that string and 2 strings -+" to replace these delimiters with. -+" -+" Args: -+" -toReplace1: the first delimiter to replace -+" -toReplace2: the second delimiter to replace -+" -replacor1: the string to replace toReplace1 with -+" -replacor2: the string to replace toReplace2 with -+" -str: the string that the delimiters to be replaced are in -+function s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) -+ let line = s:ReplaceLeftMostDelim(a:toReplace1, a:replacor1, a:str) -+ let line = s:ReplaceRightMostDelim(a:toReplace2, a:replacor2, line) -+ return line -+endfunction -+ -+" Function: s:ReplaceLeftMostDelim(toReplace, replacor, str) {{{2 -+" This function takes a string and a delimiter and replaces the left most -+" occurrence of this delimiter in the string with a given string -+" -+" Args: -+" -toReplace: the delimiter in str that is to be replaced -+" -replacor: the string to replace toReplace with -+" -str: the string that contains toReplace -+function s:ReplaceLeftMostDelim(toReplace, replacor, str) -+ let toReplace = a:toReplace -+ let replacor = a:replacor -+ "get the left most occurrence of toReplace -+ let indxToReplace = s:FindDelimiterIndex(toReplace, a:str) -+ -+ "if there IS an occurrence of toReplace in str then replace it and return -+ "the resulting string -+ if indxToReplace != -1 -+ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) -+ return line -+ endif -+ -+ return a:str -+endfunction -+ -+" Function: s:ReplaceRightMostDelim(toReplace, replacor, str) {{{2 -+" This function takes a string and a delimiter and replaces the right most -+" occurrence of this delimiter in the string with a given string -+" -+" Args: -+" -toReplace: the delimiter in str that is to be replaced -+" -replacor: the string to replace toReplace with -+" -str: the string that contains toReplace -+" -+function s:ReplaceRightMostDelim(toReplace, replacor, str) -+ let toReplace = a:toReplace -+ let replacor = a:replacor -+ let lenToReplace = strlen(toReplace) -+ -+ "get the index of the last delim in str -+ let indxToReplace = s:LastIndexOfDelim(toReplace, a:str) -+ -+ "if there IS a delimiter in str, replace it and return the result -+ let line = a:str -+ if indxToReplace != -1 -+ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) -+ endif -+ return line -+endfunction -+ -+"FUNCTION: s:RestoreScreenState() {{{2 -+" -+"Sets the screen state back to what it was when s:SaveScreenState was last -+"called. -+" -+function s:RestoreScreenState() -+ if !exists("t:NERDComOldTopLine") || !exists("t:NERDComOldPos") -+ throw 'NERDCommenter exception: cannot restore screen' -+ endif -+ -+ call cursor(t:NERDComOldTopLine, 0) -+ normal zt -+ call setpos(".", t:NERDComOldPos) -+endfunction -+ -+" Function: s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 -+" This function takes in 2 line numbers and returns the index of the right most -+" char on all of these lines. -+" Args: -+" -countCommentedLines: 1 if lines that are commented are to be checked as -+" well. 0 otherwise -+" -countEmptyLines: 1 if empty lines are to be counted in the search -+" -topline: the top line to be checked -+" -bottomline: the bottom line to be checked -+function s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) -+ let rightMostIndx = -1 -+ -+ " go thru the block line by line updating rightMostIndx -+ let currentLine = a:topline -+ while currentLine <= a:bottomline -+ -+ " get the next line and see if it is commentable, otherwise it doesnt -+ " count -+ let theLine = getline(currentLine) -+ if a:countEmptyLines || theLine !~ '^[ \t]*$' -+ -+ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) -+ -+ " update rightMostIndx if need be -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let lineLen = strlen(theLine) -+ if lineLen > rightMostIndx -+ let rightMostIndx = lineLen -+ endif -+ endif -+ endif -+ -+ " move on to the next line -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ return rightMostIndx -+endfunction -+ -+"FUNCTION: s:SaveScreenState() {{{2 -+"Saves the current cursor position in the current buffer and the window -+"scroll position -+function s:SaveScreenState() -+ let t:NERDComOldPos = getpos(".") -+ let t:NERDComOldTopLine = line("w0") -+endfunction -+ -+" Function: s:SwapOutterMultiPartDelimsForPlaceHolders(line) {{{2 -+" This function takes a line and swaps the outter most multi-part delims for -+" place holders -+" Args: -+" -line: the line to swap the delims in -+" -+function s:SwapOutterMultiPartDelimsForPlaceHolders(line) -+ " find out if the line is commented using normal delims and/or -+ " alternate ones -+ let isCommented = s:IsCommented(b:left, b:right, a:line) -+ let isCommentedAlt = s:IsCommented(b:leftAlt, b:rightAlt, a:line) -+ -+ let line2 = a:line -+ -+ "if the line is commented and there is a right delimiter, replace -+ "the delims with place-holders -+ if isCommented && s:Multipart() -+ let line2 = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, a:line) -+ -+ "similarly if the line is commented with the alternative -+ "delimiters -+ elseif isCommentedAlt && s:AltMultipart() -+ let line2 = s:ReplaceDelims(b:leftAlt, b:rightAlt, g:NERDLPlace, g:NERDRPlace, a:line) -+ endif -+ -+ return line2 -+endfunction -+ -+" Function: s:SwapOutterPlaceHoldersForMultiPartDelims(line) {{{2 -+" This function takes a line and swaps the outtermost place holders for -+" multi-part delims -+" Args: -+" -line: the line to swap the delims in -+" -+function s:SwapOutterPlaceHoldersForMultiPartDelims(line) -+ let left = '' -+ let right = '' -+ if s:Multipart() -+ let left = b:left -+ let right = b:right -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ let right = b:rightAlt -+ endif -+ -+ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, a:line) -+ return line -+endfunction -+" Function: s:TabbedCol(line, col) {{{2 -+" Gets the col number for given line and existing col number. The new col -+" number is the col number when all leading spaces are converted to tabs -+" Args: -+" -line:the line to get the rel col for -+" -col: the abs col -+function s:TabbedCol(line, col) -+ let lineTruncated = strpart(a:line, 0, a:col) -+ let lineSpacesToTabs = substitute(lineTruncated, s:TabSpace(), '\t', 'g') -+ return strlen(lineSpacesToTabs) -+endfunction -+"FUNCTION: s:TabSpace() {{{2 -+"returns a string of spaces equal in length to &tabstop -+function s:TabSpace() -+ let tabSpace = "" -+ let spacesPerTab = &tabstop -+ while spacesPerTab > 0 -+ let tabSpace = tabSpace . " " -+ let spacesPerTab = spacesPerTab - 1 -+ endwhile -+ return tabSpace -+endfunction -+ -+" Function: s:UnEsc(str, escChar) {{{2 -+" This function removes all the escape chars from a string -+" Args: -+" -str: the string to remove esc chars from -+" -escChar: the escape char to be removed -+function s:UnEsc(str, escChar) -+ return substitute(a:str, a:escChar, "", "g") -+endfunction -+ -+" Function: s:UntabbedCol(line, col) {{{2 -+" Takes a line and a col and returns the absolute column of col taking into -+" account that a tab is worth 3 or 4 (or whatever) spaces. -+" Args: -+" -line:the line to get the abs col for -+" -col: the col that doesnt take into account tabs -+function s:UntabbedCol(line, col) -+ let lineTruncated = strpart(a:line, 0, a:col) -+ let lineTabsToSpaces = substitute(lineTruncated, '\t', s:TabSpace(), 'g') -+ return strlen(lineTabsToSpaces) -+endfunction -+" Section: Comment mapping setup {{{1 -+" =========================================================================== -+" This is where the mappings calls are made that set up the commenting key -+" mappings. -+ -+" set up the mapping to switch to/from alternative delimiters -+execute 'nnoremap ' . g:NERDAltComMap . ' :call SwitchToAlternativeDelimiters(1)' -+ -+" set up the mappings to comment out lines -+execute 'nnoremap ' . g:NERDComLineMap . ' :call NERDComment(0, "norm")' -+execute 'vnoremap ' . g:NERDComLineMap . ' :call NERDComment(1, "norm")' -+ -+" set up the mappings to do toggle comments -+execute 'nnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(0, "toggle")' -+execute 'vnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(1, "toggle")' -+ -+" set up the mapp to do minimal comments -+execute 'nnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(0, "minimal")' -+execute 'vnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(1, "minimal")' -+ -+" set up the mappings to comment out lines sexily -+execute 'nnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(0, "sexy")' -+execute 'vnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(1, "sexy")' -+ -+" set up the mappings to do invert comments -+execute 'nnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(0, "invert")' -+execute 'vnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(1, "invert")' -+ -+" set up the mappings to yank then comment out lines -+execute 'nmap ' . g:NERDComLineYankMap . ' :call NERDComment(0, "yank")' -+execute 'vmap ' . g:NERDComLineYankMap . ' :call NERDComment(1, "yank")' -+ -+" set up the mappings for left aligned comments -+execute 'nnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(0, "alignLeft")' -+execute 'vnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(1, "alignLeft")' -+ -+" set up the mappings for right aligned comments -+execute 'nnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(0, "alignRight")' -+execute 'vnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(1, "alignRight")' -+ -+" set up the mappings for left and right aligned comments -+execute 'nnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(0, "alignBoth")' -+execute 'vnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(1, "alignBoth")' -+ -+" set up the mappings to do nested comments -+execute 'nnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(0, "nested")' -+execute 'vnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(1, "nested")' -+ -+" set up the mapping to uncomment a line -+execute 'nnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(0, "uncomment")' -+execute 'vnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(1, "uncomment")' -+ -+" set up the mapping to comment out to the end of the line -+execute 'nnoremap ' . g:NERDComToEOLMap . ' :call NERDComment(0, "toEOL")' -+ -+" set up the mappings to append comments to the line -+execute 'nmap ' . g:NERDAppendComMap . ' :call NERDComment(0, "append")' -+ -+" set up the mappings to append comments to the line -+execute 'nmap ' . g:NERDPrependComMap . ' :call NERDComment(0, "prepend")' -+ -+" set up the mapping to insert comment delims at the cursor position in insert mode -+execute 'inoremap ' . g:NERDComInInsertMap . ' ' . ':call NERDComment(0, "insert")' -+ -+" Section: Menu item setup {{{1 -+" =========================================================================== -+"check if the user wants the menu to be displayed -+if g:NERDMenuMode != 0 -+ -+ let menuRoot = "" -+ if g:NERDMenuMode == 1 -+ let menuRoot = 'comment' -+ elseif g:NERDMenuMode == 2 -+ let menuRoot = '&comment' -+ elseif g:NERDMenuMode == 3 -+ let menuRoot = '&Plugin.&comment' -+ endif -+ -+ execute 'nmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(0, "norm")' -+ execute 'vmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(1, "norm")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(0, "toggle")' -+ execute 'vmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(1, "toggle")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(0, "minimal")' -+ execute 'vmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(1, "minimal")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(0, "nested")' -+ execute 'vmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(1, "nested")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ To\ EOL' . escape(g:NERDComToEOLMap, '\') . ' :call NERDComment(0, "toEOL")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(0,"invert")' -+ execute 'vmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(1,"invert")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(0,"sexy")' -+ execute 'vmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(1,"sexy")' -+ -+ execute 'nmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0Y' . g:NERDComLineMap -+ execute 'vmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0ygv' . g:NERDComLineMap -+ -+ execute 'nmenu '. menuRoot .'.Append\ Comment\ to\ Line' . escape(g:NERDAppendComMap, '\') . ' :call NERDComment(0, "append")' -+ execute 'nmenu '. menuRoot .'.Prepend\ Comment\ to\ Line' . escape(g:NERDPrependComMap, '\') . ' :call NERDComment(0, "prepend")' -+ -+ execute 'menu '. menuRoot .'.-Sep- :' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(0, "alignLeft")' -+ execute 'vmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(1, "alignLeft")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(0, "alignRight")' -+ execute 'vmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(1, "alignRight")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(0, "alignBoth")' -+ execute 'vmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(1, "alignBoth")' -+ -+ execute 'menu '. menuRoot .'.-Sep2- :' -+ -+ execute 'menu '. menuRoot .'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(0, "uncomment")' -+ execute 'vmenu ' . menuRoot.'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(1, "uncomment")' -+ -+ execute 'menu '. menuRoot .'.-Sep3- :' -+ -+ execute 'nmenu '. menuRoot .'.Use\ Alternative\ Delimiters' . escape(g:NERDAltComMap, '\') . ' :call SwitchToAlternativeDelimiters(1)' -+ -+ -+ execute 'imenu '. menuRoot .'.Insert\ Delims' . escape(g:NERDComInInsertMap, '\') . ' :call NERDComment(0, "insert")' -+ -+ execute 'menu '. menuRoot .'.-Sep4- :' -+ -+ execute 'menu '. menuRoot .'.Help:help\ NERDCommenterContents :help NERDCommenterContents' -+endif -+ -+" Section: Doc installation call {{{1 -+silent call s:InstallDocumentation(expand(':p'), s:NERD_commenter_version) -+ -+finish -+"============================================================================= -+" Section: The help file {{{1 -+" Title {{{2 -+" ============================================================================ -+=== START_DOC -+*NERD_commenter.txt* Plugin for commenting code #version# -+ -+ -+ NERD COMMENTER REFERENCE MANUAL~ -+ -+ -+ -+ -+ -+============================================================================== -+CONTENTS {{{2 *NERDCommenterContents* -+ -+ 1.Intro...................................|NERDCommenter| -+ 2.Functionality provided..................|NERDComFunctionality| -+ 2.1 Functionality Summary.............|NERDComFunctionalitySummary| -+ 2.2 Functionality Details.............|NERDComFunctionalityDetails| -+ 2.2.1 Comment map.................|NERDComComment| -+ 2.2.2 Nested comment map..........|NERDComNestedComment| -+ 2.2.3 Toggle comment map..........|NERDComToggleComment| -+ 2.2.4 Minimal comment map.........|NERDComMinimalComment| -+ 2.2.5 Invert comment map..........|NERDComInvertComment| -+ 2.2.6 Sexy comment map............|NERDComSexyComment| -+ 2.2.7 Yank comment map............|NERDComYankComment| -+ 2.2.8 Comment to EOL map..........|NERDComEOLComment| -+ 2.2.9 Append com to line map......|NERDComAppendComment| -+ 2.2.10 Prepend com to line map....|NERDComPrependComment| -+ 2.2.11 Insert comment map.........|NERDComInsertComment| -+ 2.2.12 Use alternate delims map...|NERDComAltDelim| -+ 2.2.13 Comment aligned maps.......|NERDComAlignedComment| -+ 2.2.14 Uncomment line map.........|NERDComUncommentLine| -+ 2.3 Supported filetypes...............|NERDComFiletypes| -+ 2.4 Sexy Comments.....................|NERDComSexyComments| -+ 2.5 The NERDComment function..........|NERDComNERDComment| -+ 3.Options.................................|NERDComOptions| -+ 3.1 Options summary...................|NERDComOptionsSummary| -+ 3.2 Options details...................|NERDComOptionsDetails| -+ 3.3 Default delimiter Options.........|NERDComDefaultDelims| -+ 3.4 Key mapping Options...............|NERDComMappings| -+ 4.Issues with the script..................|NERDComIssues| -+ 4.1 Delimiter detection heuristics....|NERDComHeuristics| -+ 4.2 Nesting issues....................|NERDComNesting| -+ 5.The author..............................|NERDComAuthor| -+ 6.TODO list...............................|NERDComTodo| -+ 7.Changelog...............................|NERDComChangelog| -+ 8.Credits.................................|NERDComCredits| -+ -+============================================================================== -+1. Intro {{{2 *NERDCommenter* -+ -+The NERD commenter provides many different commenting operations and styles -+which may be invoked via key mappings and a commenting menu. These operations -+are available for most filetypes. -+ -+There are also options available that allow you to tweak the commenting engine -+to you taste. -+ -+============================================================================== -+2. Functionality provided {{{2 *NERDComFunctionality* -+ -+------------------------------------------------------------------------------ -+2.1 Functionality summary {{{3 *NERDComFunctionalitySummary* -+ -+The following key mappings are provided by default (there is also a menu -+provided that contains menu items corresponding to all the below mappings): -+ -+Most of the following mappings are for normal/visual mode only. The -+|NERDComInsertComment| mapping is for insert mode only. -+ -+[count],cc |NERDComComment| -+Comments out the current line or text selected in visual mode. -+ -+ -+[count],cn |NERDComNestedComment| -+Same as |NERDComComment| but forces nesting. -+ -+ -+[count],c |NERDComToggleComment| -+Toggles the comment state of the selected line(s). If the topmost selected -+line is commented, all selected lines are uncommented and vice versa. -+ -+ -+[count],cm |NERDComMinimalComment| -+Comments the given lines using only one set of multipart delimiters if -+possible. -+ -+ -+[count],ci |NERDComInvertComment| -+Toggles the comment state of the selected line(s) individually. Each selected -+line that is commented is uncommented and vice versa. -+ -+ -+[count],cs |NERDComSexyComment| -+Comments out the selected lines ``sexually'' -+ -+ -+[count],cy |NERDComYankComment| -+Same as |NERDComComment| except that the commented line(s) are yanked -+before commenting. -+ -+ -+,c$ |NERDComEOLComment| -+Comments the current line from the cursor to the end of line. -+ -+ -+,cA |NERDComAppendComment| -+Adds comment delimiters to the end of line and goes into insert mode between -+them. -+ -+ -+,cI |NERDComPrependComment| -+Adds comment delimiters to the start of line and goes into insert mode between -+them. -+ -+ -+ |NERDComInsertComment| -+Adds comment delimiters at the current cursor position and inserts between. -+ -+ -+,ca |NERDComAltDelim| -+Switches to the alternative set of delimiters. -+ -+ -+[count],cl -+[count],cr -+[count],cb |NERDComAlignedComment| -+Same as |NERDComComment| except that the delimiters are aligned down the -+left side (,cl), the right side (,cr) or both sides -+(,cb). -+ -+ -+[count],cu |NERDComUncommentLine| -+Uncomments the selected line(s). -+ -+------------------------------------------------------------------------------ -+2.2 Functionality details {{{3 *NERDComFunctionalityDetails* -+ -+------------------------------------------------------------------------------ -+2.2.1 Comment map *NERDComComment* -+ -+Default mapping: [count],cc -+Change the mapping with: NERDComLineMap. -+Applicable modes: normal visual visual-line visual-block. -+ -+ -+Comments out the current line. If multiple lines are selected in visual-line -+mode, they are all commented out. If some text is selected in visual or -+visual-block mode then the script will try to comment out the exact text that -+is selected using multi-part delimiters if they are available. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.2 Nested comment map *NERDComNestedComment* -+ -+Default mapping: [count],cn -+Change the mapping with: NERDComLineNestMap. -+Applicable modes: normal visual visual-line visual-block. -+ -+Performs nested commenting. Works the same as ,cc except that if a -+line is already commented then it will be commented again. -+ -+If |NERDUsePlaceHolders| is set then the previous comment delimiters will -+be replaced by place-holder delimiters if needed. Otherwise the nested -+comment will only be added if the current commenting delimiters have no right -+delimiter (to avoid syntax errors) -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+Related options: -+|NERDDefaultNesting| -+ -+------------------------------------------------------------------------------ -+2.2.3 Toggle comment map *NERDComToggleComment* -+ -+Default mapping: [count],c -+Change the mapping with: NERDComLineToggleMap. -+Applicable modes: normal visual-line. -+ -+Toggles commenting of the lines selected. The behaviour of this mapping -+depends on whether the first line selected is commented or not. If so, all -+selected lines are uncommented and vice versa. -+ -+With this mapping, a line is only considered to be commented if it starts with -+a left delimiter. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.4 Minimal comment map *NERDComMinimalComment* -+ -+Default mapping: [count],cm -+Change the mapping with: NERDComLineMinimalMap -+Applicable modes: normal visual-line. -+ -+Comments the selected lines using one set of multipart delimiters if possible. -+ -+For example: if you are programming in c and you select 5 lines and press -+,cm then a '/*' will be placed at the start of the top line and a '*/' -+will be placed at the end of the last line. -+ -+Sets of multipart comment delimiters that are between the top and bottom -+selected lines are replaced with place holders (see |NERDLPlace|) if -+|NERDUsePlaceHolders| is set for the current filetype. If it is not, then -+the comment will be aborted if place holders are required to prevent illegal -+syntax. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.5 Invert comment map *NERDComInvertComment* -+ -+Default mapping: ,ci -+Change the mapping with: NERDComLineInvertMap. -+Applicable modes: normal visual-line. -+ -+Inverts the commented state of each selected line. If the a selected line is -+commented then it is uncommented and vice versa. Each line is examined and -+commented/uncommented individually. -+ -+With this mapping, a line is only considered to be commented if it starts with -+a left delimiter. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.6 Sexy comment map *NERDComSexyComment* -+ -+Default mapping: [count],cs -+Change the mapping with: NERDComLineSexyMap -+Applicable modes: normal, visual-line. -+ -+Comments the selected line(s) ``sexily''... see |NERDComSexyComments| for -+a description of what sexy comments are. Can only be done on filetypes for -+which there is at least one set of multipart comment delimiters specified. -+ -+Sexy comments cannot be nested and lines inside a sexy comment cannot be -+commented again. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+Related options: -+|NERDCompactSexyComs| -+ -+------------------------------------------------------------------------------ -+2.2.7 Yank comment map *NERDComYankComment* -+ -+Default mapping: [count],cy -+Change the mapping with: NERDComLineYankMap -+Applicable modes: normal visual visual-line visual-block. -+ -+Same as ,cc except that it yanks the line(s) that are commented first. -+ -+------------------------------------------------------------------------------ -+2.2.8 Comment to EOL map *NERDComEOLComment* -+ -+Default mapping: ,c$ -+Change the mapping with: NERDComToEOLMap -+Applicable modes: normal. -+ -+Comments the current line from the current cursor position up to the end of -+the line. -+ -+------------------------------------------------------------------------------ -+2.2.9 Append com to line map *NERDComAppendComment* -+ -+Default mapping: ,cA -+Change the mapping with: NERDAppendComMap. -+Applicable modes: normal. -+ -+Appends comment delimiters to the end of the current line and goes -+to insert mode between the new delimiters. -+ -+------------------------------------------------------------------------------ -+2.2.10 Prepend com to line map *NERDComPrependComment* -+ -+Default mapping: ,cI -+Change the mapping with: NERDPrependComMap. -+Applicable modes: normal. -+ -+Prepends comment delimiters to the start of the current line and goes to -+insert mode between the new delimiters. -+ -+------------------------------------------------------------------------------ -+2.2.11 Insert comment map *NERDComInsertComment* -+ -+Default mapping: -+Change the mapping with: NERDComInInsertMap. -+Applicable modes: insert. -+ -+Adds comment delimiters at the current cursor position and inserts -+between them. -+ -+------------------------------------------------------------------------------ -+2.2.12 Use alternate delims map *NERDComAltDelim* -+ -+Default mapping: ,ca -+Change the mapping with: NERDAltComMap -+Applicable modes: normal. -+ -+Changes to the alternative commenting style if one is available. For example, -+if the user is editing a c++ file using // comments and they hit ,ca -+then they will be switched over to /**/ comments. -+ -+See also |NERDComDefaultDelims| -+ -+------------------------------------------------------------------------------ -+2.2.13 Comment aligned maps *NERDComAlignedComment* -+ -+Default mappings: [count],cl [count],cr [count],cb -+Change the mappings with: NERDComAlignLeftMap, NERDComAlignRightMap and -+NERDComAlignBothMap. -+Applicable modes: normal visual-line. -+ -+Same as ,cc except that the comment delimiters are aligned on the left -+side, right side or both sides respectively. These comments are always nested -+if the line(s) are already commented. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.14 Uncomment line map *NERDComUncommentLine* -+ -+Default mapping: [count],cu -+Change the mapping with: NERDUncomLineMap. -+Applicable modes: normal visual visual-line visual-block. -+ -+Uncomments the current line. If multiple lines are selected in -+visual mode then they are all uncommented. -+ -+When uncommenting, if the line contains multiple sets of delimiters then the -+``outtermost'' pair of delimiters will be removed. -+ -+The script uses a set of heurisics to distinguish ``real'' delimiters from -+``fake'' ones when uncommenting. See |NERDComIssues| for details. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+Related options: -+|NERDRemoveAltComs| -+|NERDRemoveExtraSpaces| -+ -+------------------------------------------------------------------------------ -+2.3 Supported filetypes {{{3 *NERDComFiletypes* -+ -+Filetypes that can be commented by this plugin: -+abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asn -+aspvbs atlas autohotkey autoit automake ave awk basic b bc bdf bib bindzone -+bst btm caos catalog c cfg cg ch changelog cl clean clipper cmake conf config -+context cpp crontab cs csc csp css cterm cupl csv cvs dcl debchangelog -+debcontrol debsources def diff django docbk dns dosbatch dosini dot dracula -+dsl dtd dtml dylan ecd eiffel elf elmfilt erlang eruby eterm expect exports -+fetchmail fgl focexec form fortran foxpro fstab fvwm fx gdb gdmo geek -+gentoo-package-keywords' gentoo-package-mask' gentoo-package-use' gnuplot -+gtkrc haskell hb h help hercules hog html htmldjango htmlos ia64 icon idlang -+idl indent inform inittab ishd iss ist jam java javascript jess jgraph -+jproperties jproperties jsp kconfig kix kscript lace lex lftp lifelines lilo -+lisp lite lotos lout lprolog lscript lss lua lynx m4 mail make maple masm -+master matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc -+named nasm nastran natural ncf netdict netrw nqc nroff nsis objc ocaml occam -+omlet omnimark openroad opl ora otl ox pascal passwd pcap pccts perl pfmain -+php phtml pic pike pilrc pine plaintex plm plsql po postscr pov povini ppd -+ppwiz procmail progress prolog psf ptcap python python qf radiance ratpoison r -+rc readline rebol registry remind rexx robots rpl rtf ruby sa samba sas sass -+sather scheme scilab screen scsh sdl sed selectbuf sgml sgmldecl sgmllnx sh -+sicad simula sinda skill slang sl slrnrc sm smarty smil smith sml snnsnet -+snnspat snnsres snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp -+strace svn systemverilog tads taglist tags tak tasm tcl terminfo tex text -+plaintex texinfo texmf tf tidy tli trasys tsalt tsscl tssgm uc uil vb verilog -+verilog_systemverilog vgrindefs vhdl vim viminfo virata vo_base vrml vsejcl -+webmacro wget winbatch wml wvdial xdefaults xf86conf xhtml xkb xmath xml -+xmodmap xpm2 xpm xslt yacc yaml z8a -+ -+If a language is not in the list of hardcoded supported filetypes then the -+&commentstring vim option is used. -+ -+------------------------------------------------------------------------------ -+2.4 Sexy Comments {{{3 *NERDComSexyComments* -+These are comments that use one set of multipart comment delimiters as well as -+one other marker symbol. For example: > -+ /* -+ * This is a c style sexy comment -+ * So there! -+ */ -+ -+ /* This is a c style sexy comment -+ * So there! -+ * But this one is ``compact'' style */ -+< -+Here the multipart delimiters are /* and */ and the marker is *. The NERD -+commenter is capable of adding and removing comments of this type. -+ -+------------------------------------------------------------------------------ -+2.5 The NERDComment function {{{3 *NERDComNERDComment* -+ -+All of the NERD commenter mappings and menu items invoke a single function -+which delegates the commenting work to other functions. This function is -+public and has the prototype: > -+ function! NERDComment(isVisual, type) -+< -+The arguments to this function are simple: -+ - isVisual: if you wish to do any kind of visual comment then set this to -+ 1 and the function will use the '< and '> marks to find the comment -+ boundries. If set to 0 then the function will operate on the current -+ line. -+ - type: is used to specify what type of commenting operation is to be -+ performed, and it can be one of the following: 'sexy', 'invert', -+ 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', -+ 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' -+ -+For example, if you typed > -+ :call NERDComment(1, 'sexy') -+< -+then the script would do a sexy comment on the last visual selection. -+ -+ -+============================================================================== -+3. Options {{{2 *NERDComOptions* -+ -+------------------------------------------------------------------------------ -+3.1 Options summary *NERDComOptionsSummary* -+ -+|loaded_nerd_comments| Turns off the script. -+|NERDAllowAnyVisualDelims| Allows multipart alternative delims to -+ be used when commenting in -+ visual/visual-block mode. -+|NERDBlockComIgnoreEmpty| Forces right delims to be placed when -+ doing visual-block comments. -+|NERDCommentWholeLinesInVMode| Changes behaviour of visual comments. -+|NERDDefaultNesting| Tells the script to use nested comments -+ by default. -+|NERDMenuMode| Specifies how the NERD commenter menu -+ will appear (if at all). -+|NERDLPlace| Specifies what to use as the left -+ delimiter placeholder when nesting -+ comments. -+|NERDMapleader| Specifies what all the commenting key -+ mappings will begin with. -+|NERDUsePlaceHolders| Specifies which filetypes may use -+ placeholders when nesting comments. -+|NERDRemoveAltComs| Tells the script whether to remove -+ alternative comment delimiters when -+ uncommenting. -+|NERDRemoveExtraSpaces| Tells the script to always remove the -+ extra spaces when uncommenting -+ (regardless of whether NERDSpaceDelims -+ is set) -+|NERDRPlace| Specifies what to use as the right -+ delimiter placeholder when nesting -+ comments. -+|NERDShutUp| Stops "Unknown filetype" output from the -+ script -+|NERDSpaceDelims| Specifies whether to add extra spaces -+ around delimiters when commenting, and -+ whether to remove them when -+ uncommenting. -+|NERDCompactSexyComs| Specifies whether to use the compact -+ style sexy comments. -+ -+------------------------------------------------------------------------------ -+3.3 Options details *NERDComOptionsDetails* -+ -+To enable any of the below options you should put the given line in your -+~/.vimrc -+ -+ *loaded_nerd_comments* -+If this script is driving you insane you can turn it off by setting this -+option > -+ let loaded_nerd_comments=1 -+< -+------------------------------------------------------------------------------ -+ *NERDAllowAnyVisualDelims* -+Values: 0 or 1. -+Default: 1. -+ -+If set to 1 then, when doing a visual or visual-block comment (but not a -+visual-line comment), the script will choose the right delimiters to use for -+the comment. This means either using the current delimiters if they are -+multipart or using the alternative delimiters if THEY are multipart. For -+example if we are editing the following java code: > -+ float foo = 1221; -+ float bar = 324; -+ System.out.println(foo * bar); -+< -+If we are using // comments and select the "foo" and "bar" in visual-block -+mode, as shown left below (where '|'s are used to represent the visual-block -+boundary), and comment it then the script will use the alternative delims as -+shown on the right: > -+ -+ float |foo| = 1221; float /*foo*/ = 1221; -+ float |bar| = 324; float /*bar*/ = 324; -+ System.out.println(foo * bar); System.out.println(foo * bar); -+< -+------------------------------------------------------------------------------ -+ *NERDBlockComIgnoreEmpty* -+Values: 0 or 1. -+Default: 1. -+ -+This option affects visual-block mode commenting. If this option is turned -+on, lines that begin outside the right boundary of the selection block will be -+ignored. -+ -+For example, if you are commenting this chunk of c code in visual-block mode -+(where the '|'s are used to represent the visual-block boundary) > -+ #include -+ #include -+ #include -+ |int| main(){ -+ | | printf("SUCK THIS\n"); -+ | | while(1){ -+ | | fork(); -+ | | } -+ |} | -+< -+If NERDBlockComIgnoreEmpty=0 then this code will become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ /* */ printf("SUCK THIS\n"); -+ /* */ while(1){ -+ /* */ fork(); -+ /* */ } -+ /*} */ -+< -+Otherwise, the code block would become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ printf("SUCK THIS\n"); -+ while(1){ -+ fork(); -+ } -+ /*} */ -+< -+------------------------------------------------------------------------------ -+ *NERDCommentWholeLinesInVMode* -+Values: 0, 1 or 2. -+Default: 0. -+ -+By default the script tries to comment out exactly what is selected in visual -+mode (v). For example if you select and comment the following c code (using | -+to represent the visual boundary): > -+ in|t foo = 3; -+ int bar =| 9; -+ int baz = foo + bar; -+< -+This will result in: > -+ in/*t foo = 3;*/ -+ /*int bar =*/ 9; -+ int baz = foo + bar; -+< -+But some people prefer it if the whole lines are commented like: > -+ /*int foo = 3;*/ -+ /*int bar = 9;*/ -+ int baz = foo + bar; -+< -+If you prefer the second option then stick this line in your vimrc: > -+ let NERDCommentWholeLinesInVMode=1 -+< -+ -+If the filetype you are editing only has no multipart delimiters (for example -+a shell script) and you hadnt set this option then the above would become > -+ in#t foo = 3; -+ #int bar = 9; -+< -+(where # is the comment delimiter) as this is the closest the script can -+come to commenting out exactly what was selected. If you prefer for whole -+lines to be commented out when there is no multipart delimiters but the EXACT -+text that was selected to be commented out if there IS multipart delimiters -+then stick the following line in your vimrc: > -+ let NERDCommentWholeLinesInVMode=2 -+< -+ -+Note that this option does not affect the behaviour of |visual-block| mode. -+ -+------------------------------------------------------------------------------ -+ *NERDRemoveAltComs* -+Values: 0 or 1. -+Default: 1. -+ -+When uncommenting a line (for a filetype with an alternative commenting style) -+this option tells the script whether to look for, and remove, comments -+delimiters of the alternative style. -+ -+For example, if you are editing a c++ file using // style comments and you go -+,cu on this line: > -+ /* This is a c++ comment baby! */ -+< -+It will not be uncommented if the NERDRemoveAltComs is set to 0. -+ -+------------------------------------------------------------------------------ -+ *NERDRemoveExtraSpaces* -+Values: 0 or 1. -+Default: 1. -+ -+By default, the NERD commenter will remove spaces around comment delimiters if -+either: -+1. |NERDSpaceDelims| is set to 1. -+2. NERDRemoveExtraSpaces is set to 1. -+ -+This means that if we have the following lines in a c code file: > -+ /* int foo = 5; */ -+ /* int bar = 10; */ -+ int baz = foo + bar -+< -+If either of the above conditions hold then if these lines are uncommented -+they will become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+Otherwise they would become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+If you want the spaces to be removed only if |NERDSpaceDelims| is set then -+set NERDRemoveExtraSpaces to 0. -+ -+------------------------------------------------------------------------------ -+ *NERDLPlace* -+ *NERDRPlace* -+Values: arbitrary string. -+Default: -+ NERDLPlace: "[>" -+ NERDRPlace: "<]" -+ -+These options are used to control the strings used as place-holder delimiters. -+Place holder delimiters are used when performing nested commenting when the -+filetype supports commenting styles with both left and right delimiters. -+To set these options use lines like: > -+ let NERDLPlace="FOO" -+ let NERDRPlace="BAR" -+< -+Following the above example, if we have line of c code: > -+ /* int horse */ -+< -+and we comment it with ,cn it will be changed to: > -+ /*FOO int horse BAR*/ -+< -+When we uncomment this line it will go back to what it was. -+ -+------------------------------------------------------------------------------ -+ *NERDMapleader* -+Values: arbitrary string. -+Default: \c -+ -+NERDMapleader is used to specify what all the NERD commenter key mappings -+begin with. -+ -+The default key mappings will look like this: > -+ \cc -+ \cu -+ \ca -+ \ci -+ \cs -+ ... -+< -+However, if this line: > -+ let NERDMapleader = ',x' -+< -+were present in your vimrc then the default mappings would look like this: > -+ ,xc -+ ,xu -+ ,xa -+ ,xi -+ ,xs -+ ... -+< -+This option only affects the mappings that have not been explicitly set -+manually (see |NERDComMappings|). -+ -+------------------------------------------------------------------------------ -+ *NERDMenuMode* -+Values: 0, 1, 2, 3. -+Default: 3 -+ -+This option can take 4 values: -+ "0": Turns the menu off. -+ "1": Turns the 'comment' menu on with no menu shortcut. -+ "2": Turns the 'comment 'menu on with -c as the shortcut. -+ "3": Turns the 'Plugin -> comment' menu on with -c as the shortcut. -+ -+------------------------------------------------------------------------------ -+ *NERDUsePlaceHolders* -+Values: 0 or 1. -+Default 1. -+ -+This option is used to specify whether place-holder delimiters should be used -+when adding nested comments. -+ -+------------------------------------------------------------------------------ -+ *NERDShutUp* -+Values: 0 or 1. -+Default 1. -+ -+This option is used to prevent the script from echoing "Unknown filetype" -+messages. Stick this line in your vimrc: > -+ let NERDShutUp=1 -+< -+------------------------------------------------------------------------------ -+ *NERDSpaceDelims* -+Values: 0 or 1. -+Default 0. -+ -+Some people prefer a space after the left delimiter and before the right -+delimiter like this: > -+ /* int foo=2; */ -+< -+as opposed to this: > -+ /*int foo=2;*/ -+< -+If you want spaces to be added then set NERDSpaceDelims to 1 in your vimrc. -+ -+See also |NERDRemoveExtraSpaces|. -+ -+------------------------------------------------------------------------------ -+ *NERDCompactSexyComs* -+Values: 0 or 1. -+Default 0. -+ -+Some people may want their sexy comments to be like this: > -+ /* Hi There! -+ * This is a sexy comment -+ * in c */ -+< -+As opposed to like this: > -+ /* -+ * Hi There! -+ * This is a sexy comment -+ * in c -+ */ -+< -+If this option is set to 1 then the top style will be used. -+ -+------------------------------------------------------------------------------ -+ *NERDDefaultNesting* -+Values: 0 or 1. -+Default 0. -+ -+When this option is set to 1, comments are nested automatically. That is, if -+you hit ,cc on a line that is already commented it will be commented -+again -+ -+------------------------------------------------------------------------------ -+3.3 Default delimiter customisation *NERDComDefaultDelims* -+ -+If you want the NERD commenter to use the alternative delimiters for a -+specific filetype by default then put a line of this form into your vimrc: > -+ let NERD_<&filetype>_alt_style=1 -+< -+Example: java uses // style comments by default, but you want it to default to -+/* */ style comments instead. You would put this line in your vimrc: > -+ let NERD_java_alt_style=1 -+< -+ -+See |NERDComAltDelim| for switching commenting styles at runtime. -+ -+------------------------------------------------------------------------------ -+3.4 Key mapping customisation *NERDComMappings* -+ -+These options are used to override the default keys that are used for the -+commenting mappings. Their values must be set to strings. As an example: if -+you wanted to use the mapping ,foo to uncomment lines of code then -+you would place this line in your vimrc > -+ let NERDUncomLineMap=",foo" -+< -+Check out |NERDComFunctionality| for details about what the following -+mappings do. -+ -+Default Mapping Option to override~ -+ -+,ca NERDAltComMap -+,ce NERDAppendComMap -+,cl NERDComAlignLeftMap -+,cb NERDComAlignBothMap -+,cr NERDComAlignRightMap -+ NERDComInInsertMap -+,ci NERDComLineInvertMap -+,cc NERDComLineMap -+,cn NERDComLineNestMap -+,cs NERDComLineSexyMap -+,c NERDComLineToggleMap -+,cm NERDComLineMinimalMap -+,c$ NERDComToEOLMap -+,cy NERDComLineYankMap -+,cu NERDUncomLineMap -+ -+============================================================================== -+4. Issues with the script{{{2 *NERDComIssues* -+ -+ -+------------------------------------------------------------------------------ -+4.1 Delimiter detection heuristics *NERDComHeuristics* -+ -+Heuristics are used to distinguish the real comment delimiters -+ -+Because we have comment mappings that place delimiters in the middle of lines, -+removing comment delimiters is a bit tricky. This is because if comment -+delimiters appear in a line doesnt mean they really ARE delimiters. For -+example, Java uses // comments but the line > -+ System.out.println("//"); -+< -+clearly contains no real comment delimiters. -+ -+To distinguish between ``real'' comment delimiters and ``fake'' ones we use a -+set of heuristics. For example, one such heuristic states that any comment -+delimiter that has an odd number of non-escaped " characters both preceding -+and following it on the line is not a comment because it is probably part of a -+string. These heuristics, while usually pretty accurate, will not work for all -+cases. -+ -+------------------------------------------------------------------------------ -+4.2 Nesting issues *NERDComNesting* -+ -+If we have some line of code like this: > -+ /*int foo */ = /*5 + 9;*/ -+< -+This will not be uncommented legally. The NERD commenter will remove the -+"outter most" delimiters so the line will become: > -+ int foo */ = /*5 + 9; -+< -+which almost certainly will not be what you want. Nested sets of comments will -+uncomment fine though. Eg: > -+ /*int/* foo =*/ 5 + 9;*/ -+< -+will become: > -+ int/* foo =*/ 5 + 9; -+< -+(Note that in the above examples I have deliberately not used place holders -+for simplicity) -+ -+============================================================================== -+6. The author {{{2 *NERDComAuthor* -+ -+The author of the NERD commenter is Martyzillatron --- the half robot, half -+dinosaur bastard son of Megatron and Godzilla. He enjoys destroying -+metropolises and eating tourist busses. -+ -+Drop him a line at martin_grenfell at msn.com. He would love to hear from you. -+its a lonely life being the worlds premier terror machine. How would you feel -+if your face looked like a toaster and a t-rex put together? :( -+ -+============================================================================== -+7. TODO list {{{2 *NERDComTodo* -+ -+Uncommenting of minimal comments needs to be more robust. Currently it is easy -+to get illegal syntax when uncommenting them. -+ -+ -+ -+============================================================================== -+8. Changelog {{{2 *NERDComChangelog* -+ -+2.1.4 -+ - added support for the ahk filetype. Cheers to Don Hatlestad for the -+ email. -+ - added support for desktop and xsd filetypes. Thanks to Christophe Benz. -+ - added dummy support for Rails-log -+ - fixed a bunch of bugs in the comment delimiter setup process, thanks to -+ Cheng Fang for the email :D -+ - hardcore refactoring and removal of seldomly used, overly-complex -+ functionality. -+ - the script now requires vim 7 -+2.1.3 -+ - fixed numerous bugs that were causing tabs to permanently be converted -+ to spaces, even if noexpandtab was set. Thanks to Heptite on #vim for -+ working with me to track them down :) -+ - added dummy support for "lookupfile". Thanks to David Fishburn for the -+ email. -+ - added support for "rst", thanks to Niels Aan de Brugh for the email. -+ -+2.1.2 -+ - added support for the vera and ldif filetypes. Thanks to Normandie -+ Azucena and Florian Apolloner for the emails. -+ -+2.1.1 -+ - added dummy support for SVNcommitlog and vcscommit. Thanks to John -+ O'Shea for the email. -+ - added support for Groovy. Thanks to Jason Mills for the email. -+2.1.0 -+ - now the script resets the delimiters when the filetype of the buffer -+ changes (thanks to James Hales for the patch) -+ - added formal support/doc for prepending a count to many of the -+ commenting maps so you can go, eg, 5,cc to comment 5 lines from normal -+ mode. Thanks again to James Hales for the patch. -+ - added support for the "gams" filetype that Jorge Rodrigues created. -+ - added support for the "objc" filetype, thanks to Rainer Müller for the -+ email. -+ - added support for the "sass" filetype that Dmitry Ilyashevich created. -+ -+2.0.7 -+ - Added support for eclass and ebuild filetypes. Thanks to Alex Tarkovsky -+ for the email. -+ -+2.0.6 -+ - Changed the default setting of NERDMapleader to ",c", meaning all the -+ maps now start with ,c instead of \c. This is to stop a major mapping -+ clash with the vcscommand plugin. Anyone wanting to keep the \c map -+ leader should read :help NERDMapleader. -+ - Added support for debcontrol and dummy support for debchangelog -+ filetypes, thanks to Stefano Zacchiroli for the email. -+ - Made it so that the NERDShutUp option now only controls the "Pleeease -+ email the delimiters..." requests. It no longer affects the general -+ output of the script. -+ - Simplified the names of the help tags. -+ -+2.0.5 -+ - Added support for autoit, autohotkey and docbk filetypes (thanks to -+ Michael Böhler) -+ - Added support for cmake (thanks to Aaron Small) -+ - Added support for htmldjango and django filetypes (thanks to Ramiro -+ Morales) -+ - Improved the delimiters for eruby again -+ - Applied a patch from Seth Mason to fix some pathing issues with the help -+ file installation. -+ -+2.0.4 -+ - Added support for verilog_systemverilog and systemverilog filetypes -+ (Thanks to Alexey for the email) -+ - Added support for fstab, thanks to Lizendir for the email. -+ - Added support for the smarty filetype. -+ - Improved the delimiters for eruby. -+ - Added dummy support for changelog filetype. -+ -+2.0.3 -+ - Added dummy support for the csv filetype (thx to Mark Woodward for the -+ email) -+ - Added dummy support for vo_base and otl filetypes (thanks to fREW for -+ the email) -+ -+2.0.2: -+ - Minor bug fix that was stopping nested comments from working -+ -+2.0.1: -+ - Fixed the visual bell for the |NERDComToEOLMap| map. -+ - Added another possible value to the NERDMenuMode option which causes the -+ menu to be displayed under 'Plugin -> Comment'. See :h NERDMenuMode. -+ This new menu mode is now the default. -+ - Added support for the occam filetype (thanks to Anders for emailing me) -+ - Made the main commenting function (NERDComment) available outside the -+ script. -+ - bug fixes and refactoring -+ -+2.0.0: -+ - NOTE: renamed the script to NERD_commenter.vim. When you install this -+ version you must delete the old files: NERD_comments.vim and -+ NERD_comments.txt. -+ - Reworked the mappings and main entry point function for the script to -+ avoid causing visual-bells and screen scrolling. -+ - Changes to the script options (see |NERD_com-Customisation| for -+ details): -+ - They are all camel case now instead of underscored. -+ - Converted all of the regular expression options into simple boolean -+ options for simplicity. -+ - All the options are now stated positively, eg. -+ NERD_dont_remove_spaces_regexp has become NERDRemoveExtraSpaces. -+ - Some of the option names have been changed (other than in the above -+ ways) -+ - Some have been removed altogether, namely: NERD_create_h_filetype -+ (why was a commenting script creating a filetype?!), -+ NERD_left_align_regexp, NERD_right_align_regexp, -+ -+ - Removed all the NERD_use_alt_style_XXX_coms options and replaced them -+ with a better system. Now if a filetype has alternative delims, the -+ script will check whether an option of the form -+ "NERD_<&filetype>_alt_style" exists, and if it does then alt delims will -+ be used. See |NERD_com-cust-delims| for details. -+ - The script no longer removes extra spaces for sexy comments for the -+ NERDRemoveExtraSpaces option (it will still remove spaces if -+ NERDSpaceDelims is set). -+ - Added dummy support for viminfo and rtf. -+ - Added support for the "gentoo-package-\(keywords\|mask\|use\)" -+ filetypes. -+ - Added '#' comments as an alternative for the asm filetype -+ -+Thanks to Markus Klinik and Anders for bug reports, and again to Anders -+for his patch. Thanks to John O'Shea and fREW for the filetype -+information. -+ -+============================================================================== -+8. Credits {{{2 *NERDComCredits* -+ -+Thanks and respect to the following people: -+ -+Thanks to Nick Brettell for his many ideas and criticisms. A bloody good -+bastard. -+:normal :.-2s/good// -+ -+Thanks to Matthew Hawkins for his awesome refactoring! -+ -+Thanks to the authors of the vimspell whose documentation -+installation function I stole :) -+ -+Thanks to Greg Searle for the idea of using place-holders for nested comments. -+ -+Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! -+Also, thanks for the idea of doing sexy comments as well as his suggestions -+relating to it :P -+Thanks again to Nguyen for complaining about the NERD_comments menu mapping -+(-c) interfering with another mapping of his... and thus the -+NERD_dont_create_menu_shortcut option was born :P -+(it was then replaced with NERD_menu_mode in version 1.67 :) -+ -+Thanks to Sam R for pointing out some filetypes that NERD_comments could support! -+ -+Cheers to Litchi for the idea of having a mapping that appends a comment to -+the current line :) -+ -+Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some -+problems with commenting in visual mode. Thanks again to Jorge for his -+continued suggestions on this matter :) -+ -+Thanks to Martin Stubenschrott for pointing out a bug with the mapping -+:) Ive gotta stop breaking this mapping! -+ -+Thanks to Markus Erlmann for pointing out a conflict that this script was -+having with the taglist plugin. -+ -+Thanks to Brent Rice for alerting me about, and helping me track down, a bug -+in the script when the "ignorecase" option in vim was set. -+ -+Thanks to Richard Willis for telling me about how line continuation was -+causing problems on cygwin. Also, thanks pointing out a bug in the help file -+and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI -+have mercy on your soul :) -+ -+Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". -+Also, thanks for his suggested improvements about toggle comments after i -+implemented them. -+ -+Thanks to harry for telling me that i broke the cn mapping in 1.53 :), -+and thanks again for telling me about a bug that occurred when editing a file -+in a new tab. -+ -+Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc -+install function and added support for ada comments with spaces as well as -+making a couple of other small changes. -+ -+Thanks to David Bourgeois for pointing out a bug with when commenting c files -+:)... [a few days later] ok i completely misunderstood what David was talking -+about and ended up fixing a completely different bug to what he was talking -+about :P -+ -+Thanks to David Bourgeois for pointing out a bug when changing buffers. -+ -+Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that -+was causing spaces to be added to the end of lines with single-part -+delimiters. It's nice when people do my work for me :D -+ -+Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting -+sexy comments. Sexy comments dont look so sexy when they are only half removed -+:P -+ -+Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping -+the NERD_space_delim_filetype_regexp option from working with left aligned -+toggle comments. And for pointing out a bug when initialising VB comments. -+ -+Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". -+And for suggested improvements to minimal comments. -+ -+Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. -+In 1.65 -+ -+Thanks to Jonathan Derque for alerting me to some filetypes that could be -+supported (Namely: context, plaintext and mail). -+ -+Thanks to Joseph Barker for the sugesting that the menu be an optional -+feature. -+ -+Thanks to Gary Church and Tim Carey-Smith for complaining about the -+keymappings and causing me to introduce the NERD_mapleader option :) -+ -+Thanks to Vigil for pointing out that the "fetchmail" filetype was not -+supported and emailing me the delimiters -+ -+Thanks to Michael Brunner for telling me about the kconfig filetype. -+ -+Thanks to Antono Vasiljev for telling me about the netdict filetype. -+ -+Thanks to Melissa Reid for telling me about the omlet filetype. -+ -+Thanks to Ilia N Ternovich for alerting me to the 'qf' (quickfix) filetype. -+ -+Thanks to Markus Klinik for emailing me about a bug for sexy comments where -+spaces were being eaten. -+ -+Thanks to John O'Shea for emailing me about the RTF filetype. Thanks again for -+the SVNcommitlog and vcscommit filetypes. -+ -+Thanks to Anders for emailing me a patch to help get rid of all the visual -+bells and screen scrolling, and for sending me the delimiters for the occam -+filetype. -+ -+Thanks to Anders and Markus Klinik for emailing me about the screen scrolling -+issues and finally getting me off my ass about them :P -+ -+Thanks to Mark Woodward for emailing me about the csv filetype. -+ -+Thanks to fREW for emailing me with the /gentoo-package-(mask|keywords|use)/ -+filetypes the vo_base filetype. -+ -+Thanks to Alexey for emailing me about the verilog_systemverilog/systemverilog -+filetypes. -+ -+Cheers to Lizendir for the email about the fstab filetype -+ -+Thanks to Michael Böhler for emailing me with the autoit, autohotkey and docbk -+filetypes. -+ -+Thanks to Aaron Small for emailing me about the cmake filetype. -+ -+Thanks to Ramiro for emailing me about the htmldjango and django filetypes. -+ -+Thanks to Seth Mason for sending me a patch to fix some pathing issues for the -+help doc installation. -+ -+Thanks to Stefano Zacchiroli for emailing me with the debcontrol and -+debchangelog filetypes. -+ -+Thanks to Alex Tarkovsky for emailing me about the ebuild and eclass -+filetypes. -+ -+Cheers to Jorge Rodrigues for emailing me about the gams filetype. -+ -+Cheers to James Hales for the patch that made the comment maps work better with -+counts, and made the script reset comment delims for a buffer when its -+filetype changes. -+ -+Thank to Rainer Müller for emailing me with the Objective C delimiters. -+ -+Thanks to Jason Mills for emailing me the Groovy filetype. -+ -+Thanks to Normandie Azucena for emailing me about the vera filetype. -+ -+Thanks to Florian Apolloner for emailing me about the ldif filetype. -+ -+Cheers to David Fishburn for emailing me with the lookupfile filetype. -+ -+Thanks to Niels Aan de Brugh for emailing me with the rst filetype. -+ -+Cheers to heptite on #vim for helping me track down some tab-space conversion -+bugs. -+ -+Cheers to Don Hatlestad for telling me about the ahk filetype -+ -+Thanks to Christophe Benz for emailing me with the Desktop and xsd filetypes. -+ -+Cheers to Cheng Fang for the bug reports :D -+ -+Cheers to myself for being the best looking man on Earth! -+=== END_DOC -+" vim: set foldmethod=marker : -diff -urN vim71/1/plugin/.svn/text-base/taglist.vim.svn-base vim71_ada/1/plugin/.svn/text-base/taglist.vim.svn-base ---- vim71/1/plugin/.svn/text-base/taglist.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/.svn/text-base/taglist.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,4524 @@ -+" File: taglist.vim -+" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) -+" 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 -+" 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. -+" -+" 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 -+" you to efficiently browse through source code files for different -+" programming languages. You can visit the taglist plugin home page for more -+" information: -+" -+" http://vim-taglist.sourceforge.net -+" -+" You can subscribe to the taglist mailing list to post your questions -+" or suggestions for improvement or to report bugs. Visit the following -+" page for subscribing to the mailing list: -+" -+" http://groups.yahoo.com/group/taglist/ -+" -+" For more information about using this plugin, after installing the -+" taglist plugin, use the ":help taglist" command. -+" -+" Installation -+" ------------ -+" 1. Download the taglist.zip file and unzip the files to the $HOME/.vim -+" or the $HOME/vimfiles or the $VIM/vimfiles directory. This should -+" unzip the following two files (the directory structure should be -+" preserved): -+" -+" 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. -+" 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. -+" 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 -+" utility (not to the directory) in the .vimrc file. -+" 4. If you are running a terminal/console version of Vim and the -+" terminal doesn't support changing the window width then set the -+" 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. -+" 5. Restart Vim. -+" 6. You can now use the ":TlistToggle" command to open/close the taglist -+" window. You can use the ":help taglist" command to get more -+" information about using the taglist plugin. -+" -+" ****************** Do not modify after this line ************************ -+ -+" Line continuation used here -+let s:cpo_save = &cpo -+set cpo&vim -+ -+if !exists('loaded_taglist') -+ " First time loading the taglist plugin -+ " -+ " To speed up the loading of Vim, the taglist plugin uses autoload -+ " mechanism to load the taglist functions. -+ " Only define the configuration variables, user commands and some -+ " auto-commands and finish sourcing the file -+ -+ " The taglist plugin requires the built-in Vim system() function. If this -+ " function is not available, then don't load the plugin. -+ if !exists('*system') -+ echomsg 'Taglist: Vim system() built-in function is not available. ' . -+ \ 'Plugin is not loaded.' -+ let loaded_taglist = 'no' -+ let &cpo = s:cpo_save -+ finish -+ endif -+ -+ " Location of the exuberant ctags tool -+ if !exists('Tlist_Ctags_Cmd') -+ if executable('exuberant-ctags') -+ " On Debian Linux, exuberant ctags is installed -+ " as exuberant-ctags -+ let Tlist_Ctags_Cmd = 'exuberant-ctags' -+ elseif executable(' exctags') -+ " On Free-BSD, exuberant ctags is installed as exctags -+ let Tlist_Ctags_ Cmd = 'exctags' -+ elseif executable('ctags') -+ let Tlist_Ctags_Cmd = 'ctags' -+ elseif executable('ctags.exe') -+ let Tlist_Ctags_Cmd = 'ctags.exe' -+ elseif executable('tags') -+ let Tlist_Ctags_Cmd = 'tags' -+ else -+ echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . -+ \ 'not found in PATH. Plugin is not loaded.' -+ " Skip loading the plugin -+ let loaded_taglist = 'no' -+ let &cpo = s:cpo_save -+ finish -+ endif -+ endif -+ -+ -+ " Automatically open the taglist window on Vim startup -+ if !exists('Tlist_Auto_Open') -+ 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 -+ endif -+ -+ if !exists('Tlist_Show_Menu') -+ let Tlist_Show_Menu = 0 -+ endif -+ -+ " Tag listing sort type - 'name' or 'order' -+ if !exists('Tlist_Sort_Type') -+ let Tlist_Sort_Type = 'order' -+ endif -+ -+ " Tag listing window split (horizontal/vertical) control -+ if !exists('Tlist_Use_Horiz_Window') -+ let Tlist_Use_Horiz_Window = 0 -+ endif -+ -+ " Open the vertically split taglist window on the left or on the right -+ " side. This setting is relevant only if Tlist_Use_Horiz_Window is set to -+ " zero (i.e. only for vertically split windows) -+ if !exists('Tlist_Use_Right_Window') -+ let Tlist_Use_Right_Window = 0 -+ endif -+ -+ " Increase Vim window width to display vertically split taglist window. -+ " For MS-Windows version of Vim running in a MS-DOS window, this must be -+ " set to 0 otherwise the system may hang due to a Vim limitation. -+ if !exists('Tlist_Inc_Winwidth') -+ if (has('win16') || has('win95')) && !has('gui_running') -+ let Tlist_Inc_Winwidth = 0 -+ else -+ let Tlist_Inc_Winwidth = 1 -+ endif -+ endif -+ -+ " Vertically split taglist window width setting -+ if !exists('Tlist_WinWidth') -+ let Tlist_WinWidth = 30 -+ endif -+ -+ " Horizontally split taglist window height setting -+ if !exists('Tlist_WinHeight') -+ let Tlist_WinHeight = 10 -+ endif -+ -+ " Display tag prototypes or tag names in the taglist window -+ if !exists('Tlist_Display_Prototype') -+ let Tlist_Display_Prototype = 0 -+ endif -+ -+ " Display tag scopes in the taglist window -+ if !exists('Tlist_Display_Tag_Scope') -+ let Tlist_Display_Tag_Scope = 1 -+ endif -+ -+ " Use single left mouse click to jump to a tag. By default this is disabled. -+ " Only double click using the mouse will be processed. -+ if !exists('Tlist_Use_SingleClick') -+ let Tlist_Use_SingleClick = 0 -+ endif -+ -+ " Control whether additional help is displayed as part of the taglist or -+ " not. Also, controls whether empty lines are used to separate the tag -+ " tree. -+ if !exists('Tlist_Compact_Format') -+ let Tlist_Compact_Format = 0 -+ endif -+ -+ " Exit Vim if only the taglist window is currently open. By default, this is -+ " set to zero. -+ if !exists('Tlist_Exit_OnlyWindow') -+ let Tlist_Exit_OnlyWindow = 0 -+ endif -+ -+ " Automatically close the folds for the non-active files in the taglist -+ " window -+ if !exists('Tlist_File_Fold_Auto_Close') -+ let Tlist_File_Fold_Auto_Close = 0 -+ endif -+ -+ " Close the taglist window when a tag is selected -+ if !exists('Tlist_Close_On_Select') -+ let Tlist_Close_On_Select = 0 -+ endif -+ -+ " Automatically update the taglist window to display tags for newly -+ " edited files -+ if !exists('Tlist_Auto_Update') -+ let Tlist_Auto_Update = 1 -+ endif -+ -+ " Automatically highlight the current tag -+ if !exists('Tlist_Auto_Highlight_Tag') -+ let Tlist_Auto_Highlight_Tag = 1 -+ endif -+ -+ " Automatically highlight the current tag on entering a buffer -+ if !exists('Tlist_Highlight_Tag_On_BufEnter') -+ let Tlist_Highlight_Tag_On_BufEnter = 1 -+ endif -+ -+ " Enable fold column to display the folding for the tag tree -+ if !exists('Tlist_Enable_Fold_Column') -+ let Tlist_Enable_Fold_Column = 1 -+ endif -+ -+ " Display the tags for only one file in the taglist window -+ if !exists('Tlist_Show_One_File') -+ let Tlist_Show_One_File = 0 -+ endif -+ -+ if !exists('Tlist_Max_Submenu_Items') -+ let Tlist_Max_Submenu_Items = 20 -+ endif -+ -+ if !exists('Tlist_Max_Tag_Length') -+ let Tlist_Max_Tag_Length = 10 -+ endif -+ -+ " Do not change the name of the taglist title variable. The winmanager -+ " plugin relies on this name to determine the title for the taglist -+ " plugin. -+ let TagList_title = "__Tag_List__" -+ -+ " Taglist debug messages -+ let s:tlist_msg = '' -+ -+ " Define the taglist autocommand to automatically open the taglist window -+ " on Vim startup -+ if g:Tlist_Auto_Open -+ autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open() -+ endif -+ -+ " Refresh the taglist -+ if g:Tlist_Process_File_Always -+ autocmd BufEnter * call s:Tlist_Refresh() -+ endif -+ -+ if g:Tlist_Show_Menu -+ autocmd GUIEnter * call s:Tlist_Menu_Init() -+ endif -+ -+ " When the taglist buffer is created when loading a Vim session file, -+ " the taglist buffer needs to be initialized. The BufFilePost event -+ " is used to handle this case. -+ autocmd BufFilePost __Tag_List__ call s:Tlist_Vim_Session_Load() -+ -+ " Define the user commands to manage the taglist window -+ command! -nargs=0 -bar TlistToggle call s:Tlist_Window_Toggle() -+ command! -nargs=0 -bar TlistOpen call s:Tlist_Window_Open() -+ " For backwards compatiblity define the Tlist command -+ command! -nargs=0 -bar Tlist TlistToggle -+ command! -nargs=+ -complete=file TlistAddFiles -+ \ call s:Tlist_Add_Files() -+ command! -nargs=+ -complete=dir TlistAddFilesRecursive -+ \ call s:Tlist_Add_Files_Recursive() -+ command! -nargs=0 -bar TlistClose call s:Tlist_Window_Close() -+ command! -nargs=0 -bar TlistUpdate call s:Tlist_Update_Current_File() -+ command! -nargs=0 -bar TlistHighlightTag call s:Tlist_Window_Highlight_Tag( -+ \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1) -+ " For backwards compatiblity define the TlistSync command -+ command! -nargs=0 -bar TlistSync TlistHighlightTag -+ command! -nargs=* -complete=buffer TlistShowPrototype -+ \ echo Tlist_Get_Tag_Prototype_By_Line() -+ command! -nargs=* -complete=buffer TlistShowTag -+ \ echo Tlist_Get_Tagname_By_Line() -+ command! -nargs=* -complete=file TlistSessionLoad -+ \ call s:Tlist_Session_Load() -+ command! -nargs=* -complete=file TlistSessionSave -+ \ call s:Tlist_Session_Save() -+ command! -bar TlistLock let Tlist_Auto_Update=0 -+ command! -bar TlistUnlock let Tlist_Auto_Update=1 -+ -+ " Commands for enabling/disabling debug and to display debug messages -+ command! -nargs=? -complete=file -bar TlistDebug -+ \ call s:Tlist_Debug_Enable() -+ command! -nargs=0 -bar TlistUndebug call s:Tlist_Debug_Disable() -+ command! -nargs=0 -bar TlistMessages call s:Tlist_Debug_Show() -+ -+ " Define autocommands to autoload the taglist plugin when needed. -+ -+ " Trick to get the current script ID -+ map xx xx -+ let s:tlist_sid = substitute(maparg('xx'), '\(\d\+_\)xx$', -+ \ '\1', '') -+ unmap xx -+ -+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Window_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Menu_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined Tlist_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined TagList_* source ' . -+ \ escape(expand(''), ' ') -+ -+ let loaded_taglist = 'fast_load_done' -+ -+ if g:Tlist_Show_Menu && has('gui_running') -+ call s:Tlist_Menu_Init() -+ endif -+ -+ " restore 'cpo' -+ let &cpo = s:cpo_save -+ finish -+endif -+ -+if !exists('s:tlist_sid') -+ " Two or more versions of taglist plugin are installed. Don't -+ " load this version of the plugin. -+ finish -+endif -+ -+unlet! s:tlist_sid -+ -+if loaded_taglist != 'fast_load_done' -+ " restore 'cpo' -+ let &cpo = s:cpo_save -+ finish -+endif -+ -+" Taglist plugin functionality is available -+let loaded_taglist = 'available' -+ -+"------------------- end of user configurable options -------------------- -+ -+" Default language specific settings for supported file types and tag types -+" -+" Variable name format: -+" -+" s:tlist_def_{vim_ftype}_settings -+" -+" vim_ftype - Filetype detected by Vim -+" -+" Value format: -+" -+" ;:;:;... -+" -+" ctags_ftype - File type supported by exuberant ctags -+" flag - Flag supported by exuberant ctags to generate a tag type -+" name - Name of the tag type used in the taglist window to display the -+" tags of this type -+" -+ -+" Ada language -+let s:tlist_def_ada_settings = 'ada;' . -+ \ 'P:package spec;' . -+ \ 'p:package body;' . -+ \ 'T:type spec;' . -+ \ 't:type;' . -+ \ 'U:subtype spec;' . -+ \ 'u:subtype;' . -+ \ 'c:component;' . -+ \ 'l:literal;' . -+ \ 'V:variable spec;' . -+ \ 'v:variable;' . -+ \ 'f:formal;' . -+ \ 'n:constant;' . -+ \ 'x:exception;' . -+ \ 'R:subprogram spec;' . -+ \ 'r:subprogram body;' . -+ \ 'K:task spec;' . -+ \ 'k:task body;' . -+ \ 'O:protected spec;' . -+ \ 'o:protected body;' . -+ \ 'E:entry spec;' . -+ \ 'e:entry body;' . -+ \ 'b:label;' . -+ \ 'i:identifier;' . -+ \ 'a:autovar;' . -+ \ 'y:annon' -+ -+" assembly language -+let s:tlist_def_asm_settings = 'asm;d:define;l:label;m:macro;t:type' -+ -+" aspperl language -+let s:tlist_def_aspperl_settings = 'asp;f:function;s:sub;v:variable' -+ -+" aspvbs language -+let s:tlist_def_aspvbs_settings = 'asp;f:function;s:sub;v:variable' -+ -+" awk language -+let s:tlist_def_awk_settings = 'awk;f:function' -+ -+" beta language -+let s:tlist_def_beta_settings = 'beta;f:fragment;s:slot;v:pattern' -+ -+" c language -+let s:tlist_def_c_settings = 'c;d:macro;g:enum;s:struct;u:union;t:typedef;' . -+ \ 'v:variable;f:function' -+ -+" c++ language -+let s:tlist_def_cpp_settings = 'c++;n:namespace;v:variable;d:macro;t:typedef;' . -+ \ 'c:class;g:enum;s:struct;u:union;f:function' -+ -+" c# language -+let s:tlist_def_cs_settings = 'c#;d:macro;t:typedef;n:namespace;c:class;' . -+ \ 'E:event;g:enum;s:struct;i:interface;' . -+ \ 'p:properties;m:method' -+ -+" cobol language -+let s:tlist_def_cobol_settings = 'cobol;d:data;f:file;g:group;p:paragraph;' . -+ \ 'P:program;s:section' -+ -+" eiffel language -+let s:tlist_def_eiffel_settings = 'eiffel;c:class;f:feature' -+ -+" erlang language -+let s:tlist_def_erlang_settings = 'erlang;d:macro;r:record;m:module;f:function' -+ -+" expect (same as tcl) language -+let s:tlist_def_expect_settings = 'tcl;c:class;f:method;p:procedure' -+ -+" fortran language -+let s:tlist_def_fortran_settings = 'fortran;p:program;b:block data;' . -+ \ 'c:common;e:entry;i:interface;k:type;l:label;m:module;' . -+ \ 'n:namelist;t:derived;v:variable;f:function;s:subroutine' -+ -+" HTML language -+let s:tlist_def_html_settings = 'html;a:anchor;f:javascript function' -+ -+" java language -+let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' . -+ \ 'f:field;m:method' -+ -+" javascript language -+let s:tlist_def_javascript_settings = 'javascript;f:function' -+ -+" lisp language -+let s:tlist_def_lisp_settings = 'lisp;f:function' -+ -+" lua language -+let s:tlist_def_lua_settings = 'lua;f:function' -+ -+" makefiles -+let s:tlist_def_make_settings = 'make;m:macro' -+ -+" pascal language -+let s:tlist_def_pascal_settings = 'pascal;f:function;p:procedure' -+ -+" perl language -+let s:tlist_def_perl_settings = 'perl;c:constant;l:label;p:package;s:subroutine' -+ -+" php language -+let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function' -+ -+" python language -+let s:tlist_def_python_settings = 'python;c:class;m:member;f:function' -+ -+" rexx language -+let s:tlist_def_rexx_settings = 'rexx;s:subroutine' -+ -+" ruby language -+let s:tlist_def_ruby_settings = 'ruby;c:class;f:method;F:function;' . -+ \ 'm:singleton method' -+ -+" scheme language -+let s:tlist_def_scheme_settings = 'scheme;s:set;f:function' -+ -+" shell language -+let s:tlist_def_sh_settings = 'sh;f:function' -+ -+" C shell language -+let s:tlist_def_csh_settings = 'sh;f:function' -+ -+" Z shell language -+let s:tlist_def_zsh_settings = 'sh;f:function' -+ -+" slang language -+let s:tlist_def_slang_settings = 'slang;n:namespace;f:function' -+ -+" sml language -+let s:tlist_def_sml_settings = 'sml;e:exception;c:functor;s:signature;' . -+ \ 'r:structure;t:type;v:value;f:function' -+ -+" sql language -+let s:tlist_def_sql_settings = 'sql;c:cursor;F:field;P:package;r:record;' . -+ \ 's:subtype;t:table;T:trigger;v:variable;f:function;p:procedure' -+ -+" tcl language -+let s:tlist_def_tcl_settings = 'tcl;c:class;f:method;m:method;p:procedure' -+ -+" vera language -+let s:tlist_def_vera_settings = 'vera;c:class;d:macro;e:enumerator;' . -+ \ 'f:function;g:enum;m:member;p:program;' . -+ \ 'P:prototype;t:task;T:typedef;v:variable;' . -+ \ 'x:externvar' -+ -+"verilog language -+let s:tlist_def_verilog_settings = 'verilog;m:module;c:constant;P:parameter;' . -+ \ 'e:event;r:register;t:task;w:write;p:port;v:variable;f:function' -+ -+" vim language -+let s:tlist_def_vim_settings = 'vim;a:autocmds;v:variable;f:function' -+ -+" yacc language -+let s:tlist_def_yacc_settings = 'yacc;l:label' -+ -+"------------------- end of language specific options -------------------- -+ -+" Vim window size is changed by the taglist plugin or not -+let s:tlist_winsize_chgd = -1 -+" Taglist window is maximized or not -+let s:tlist_win_maximized = 0 -+" Name of files in the taglist -+let s:tlist_file_names='' -+" Number of files in the taglist -+let s:tlist_file_count = 0 -+" Number of filetypes supported by taglist -+let s:tlist_ftype_count = 0 -+" Is taglist part of other plugins like winmanager or cream? -+let s:tlist_app_name = "none" -+" Are we displaying brief help text -+let s:tlist_brief_help = 1 -+" List of files removed on user request -+let s:tlist_removed_flist = "" -+" Index of current file displayed in the taglist window -+let s:tlist_cur_file_idx = -1 -+" Taglist menu is empty or not -+let s:tlist_menu_empty = 1 -+ -+" An autocommand is used to refresh the taglist window when entering any -+" buffer. We don't want to refresh the taglist window if we are entering the -+" file window from one of the taglist functions. The 'Tlist_Skip_Refresh' -+" variable is used to skip the refresh of the taglist window and is set -+" and cleared appropriately. -+let s:Tlist_Skip_Refresh = 0 -+ -+" 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 -+ call setline('$', ' ') -+ endif -+ -+ if s:tlist_brief_help -+ " Add the brief help -+ call append(0, '" Press to display help text') -+ else -+ " Add the extensive help -+ call append(0, '" : Jump to tag definition') -+ call append(1, '" o : Jump to tag definition in new window') -+ call append(2, '" p : Preview the tag definition') -+ call append(3, '" : Display tag prototype') -+ call append(4, '" u : Update tag list') -+ call append(5, '" s : Select sort field') -+ call append(6, '" d : Remove file from taglist') -+ call append(7, '" x : Zoom-out/Zoom-in taglist window') -+ call append(8, '" + : Open a fold') -+ call append(9, '" - : Close a fold') -+ call append(10, '" * : Open all folds') -+ call append(11, '" = : Close all folds') -+ 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') -+ endif -+endfunction -+ -+" Tlist_Window_Toggle_Help_Text() -+" Toggle taglist plugin help text between the full version and the brief -+" version -+function! s:Tlist_Window_Toggle_Help_Text() -+ if g:Tlist_Compact_Format -+ " In compact display mode, do not display help -+ return -+ endif -+ -+ " Include the empty line displayed after the help text -+ let brief_help_size = 1 -+ let full_help_size = 16 -+ -+ setlocal modifiable -+ -+ " Set report option to a huge value to prevent informational messages -+ " while deleting the lines -+ let old_report = &report -+ set report=99999 -+ -+ " Remove the currently highlighted tag. Otherwise, the help text -+ " might be highlighted by mistake -+ match none -+ -+ " Toggle between brief and full help text -+ if s:tlist_brief_help -+ let s:tlist_brief_help = 0 -+ -+ " Remove the previous help -+ exe '1,' . brief_help_size . ' delete _' -+ -+ " Adjust the start/end line numbers for the files -+ call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) -+ else -+ let s:tlist_brief_help = 1 -+ -+ " Remove the previous help -+ exe '1,' . full_help_size . ' delete _' -+ -+ " Adjust the start/end line numbers for the files -+ call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) -+ endif -+ -+ call s:Tlist_Window_Display_Help() -+ -+ " Restore the report option -+ let &report = old_report -+ -+ setlocal nomodifiable -+endfunction -+ -+" Taglist debug support -+let s:tlist_debug = 0 -+ -+" File for storing the debug messages -+let s:tlist_debug_file = '' -+ -+" Tlist_Debug_Enable -+" Enable logging of taglist debug messages. -+function! s:Tlist_Debug_Enable(...) -+ let s:tlist_debug = 1 -+ -+ " Check whether a valid file name is supplied. -+ if a:1 != '' -+ let s:tlist_debug_file = fnamemodify(a:1, ':p') -+ -+ " Empty the log file -+ exe 'redir! > ' . s:tlist_debug_file -+ redir END -+ -+ " Check whether the log file is present/created -+ if !filewritable(s:tlist_debug_file) -+ call s:Tlist_Warning_Msg('Taglist: Unable to create log file ' -+ \ . s:tlist_debug_file) -+ let s:tlist_debug_file = '' -+ endif -+ endif -+endfunction -+ -+" Tlist_Debug_Disable -+" Disable logging of taglist debug messages. -+function! s:Tlist_Debug_Disable(...) -+ let s:tlist_debug = 0 -+ let s:tlist_debug_file = '' -+endfunction -+ -+" Tlist_Debug_Show -+" Display the taglist debug messages in a new window -+function! s:Tlist_Debug_Show() -+ if s:tlist_msg == '' -+ call s:Tlist_Warning_Msg('Taglist: No debug messages') -+ return -+ endif -+ -+ " Open a new window to display the taglist debug messages -+ new taglist_debug.txt -+ " Delete all the lines (if the buffer already exists) -+ silent! %delete _ -+ " Add the messages -+ silent! put =s:tlist_msg -+ " Move the cursor to the first line -+ normal! gg -+endfunction -+ -+" Tlist_Log_Msg -+" Log the supplied debug message along with the time -+function! s:Tlist_Log_Msg(msg) -+ if s:tlist_debug -+ if s:tlist_debug_file != '' -+ exe 'redir >> ' . s:tlist_debug_file -+ silent echon strftime('%H:%M:%S') . ': ' . a:msg . "\n" -+ redir END -+ else -+ " Log the message into a variable -+ " Retain only the last 3000 characters -+ let len = strlen(s:tlist_msg) -+ if len > 3000 -+ let s:tlist_msg = strpart(s:tlist_msg, len - 3000) -+ endif -+ let s:tlist_msg = s:tlist_msg . strftime('%H:%M:%S') . ': ' . -+ \ a:msg . "\n" -+ endif -+ endif -+endfunction -+ -+" Tlist_Warning_Msg() -+" Display a message using WarningMsg highlight group -+function! s:Tlist_Warning_Msg(msg) -+ echohl WarningMsg -+ echomsg a:msg -+ echohl None -+endfunction -+ -+" Last returned file index for file name lookup. -+" Used to speed up file lookup -+let s:tlist_file_name_idx_cache = -1 -+ -+" Tlist_Get_File_Index() -+" Return the index of the specified filename -+function! s:Tlist_Get_File_Index(fname) -+ if s:tlist_file_count == 0 || a:fname == '' -+ return -1 -+ endif -+ -+ " If the new filename is same as the last accessed filename, then -+ " return that index -+ if s:tlist_file_name_idx_cache != -1 && -+ \ s:tlist_file_name_idx_cache < s:tlist_file_count -+ if s:tlist_{s:tlist_file_name_idx_cache}_filename == a:fname -+ " Same as the last accessed file -+ return s:tlist_file_name_idx_cache -+ endif -+ endif -+ -+ " First, check whether the filename is present -+ let s_fname = a:fname . "\n" -+ let i = stridx(s:tlist_file_names, s_fname) -+ if i == -1 -+ let s:tlist_file_name_idx_cache = -1 -+ return -1 -+ endif -+ -+ " Second, compute the file name index -+ let nl_txt = substitute(strpart(s:tlist_file_names, 0, i), "[^\n]", '', 'g') -+ let s:tlist_file_name_idx_cache = strlen(nl_txt) -+ return s:tlist_file_name_idx_cache -+endfunction -+ -+" Last returned file index for line number lookup. -+" Used to speed up file lookup -+let s:tlist_file_lnum_idx_cache = -1 -+ -+" 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_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 -+ if s:tlist_file_lnum_idx_cache != -1 && -+ \ s:tlist_file_lnum_idx_cache < s:tlist_file_count -+ if a:lnum >= s:tlist_{s:tlist_file_lnum_idx_cache}_start && -+ \ a:lnum <= s:tlist_{s:tlist_file_lnum_idx_cache}_end -+ return s:tlist_file_lnum_idx_cache -+ endif -+ endif -+ -+ let fidx = -1 -+ -+ 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 -+ -+ endif -+ else -+ " 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 -+ -+ return fidx -+endfunction -+ -+" Tlist_Exe_Cmd_No_Acmds -+" Execute the specified Ex command after disabling autocommands -+function! s:Tlist_Exe_Cmd_No_Acmds(cmd) -+ let old_eventignore = &eventignore -+ set eventignore=all -+ exe a:cmd -+ let &eventignore = old_eventignore -+endfunction -+ -+" Tlist_Skip_File() -+" Check whether tag listing is supported for the specified file -+function! s:Tlist_Skip_File(filename, ftype) -+ " Skip buffers with no names and buffers with filetype not set -+ if a:filename == '' || a:ftype == '' -+ return 1 -+ endif -+ -+ " Skip files which are not supported by exuberant ctags -+ " First check whether default settings for this filetype are available. -+ " If it is not available, then check whether user specified settings are -+ " available. If both are not available, then don't list the tags for this -+ " filetype -+ let var = 's:tlist_def_' . a:ftype . '_settings' -+ if !exists(var) -+ let var = 'g:tlist_' . a:ftype . '_settings' -+ if !exists(var) -+ return 1 -+ endif -+ endif -+ -+ " Skip files which are not readable or files which are not yet stored -+ " to the disk -+ if !filereadable(a:filename) -+ return 1 -+ endif -+ -+ return 0 -+endfunction -+ -+" Tlist_User_Removed_File -+" Returns 1 if a file is removed by a user from the taglist -+function! s:Tlist_User_Removed_File(filename) -+ return stridx(s:tlist_removed_flist, a:filename . "\n") != -1 -+endfunction -+ -+" Tlist_Update_Remove_List -+" Update the list of user removed files from the taglist -+" add == 1, add the file to the removed list -+" add == 0, delete the file from the removed list -+function! s:Tlist_Update_Remove_List(filename, add) -+ if a:add -+ let s:tlist_removed_flist = s:tlist_removed_flist . a:filename . "\n" -+ else -+ let idx = stridx(s:tlist_removed_flist, a:filename . "\n") -+ let text_before = strpart(s:tlist_removed_flist, 0, idx) -+ let rem_text = strpart(s:tlist_removed_flist, idx) -+ let next_idx = stridx(rem_text, "\n") -+ let text_after = strpart(rem_text, next_idx + 1) -+ -+ let s:tlist_removed_flist = text_before . text_after -+ endif -+endfunction -+ -+" Tlist_FileType_Init -+" Initialize the ctags arguments and tag variable for the specified -+" file type -+function! s:Tlist_FileType_Init(ftype) -+ call s:Tlist_Log_Msg('Tlist_FileType_Init (' . a:ftype . ')') -+ " If the user didn't specify any settings, then use the default -+ " ctags args. Otherwise, use the settings specified by the user -+ let var = 'g:tlist_' . a:ftype . '_settings' -+ if exists(var) -+ " User specified ctags arguments -+ let settings = {var} . ';' -+ else -+ " Default ctags arguments -+ let var = 's:tlist_def_' . a:ftype . '_settings' -+ if !exists(var) -+ " No default settings for this file type. This filetype is -+ " not supported -+ return 0 -+ endif -+ let settings = s:tlist_def_{a:ftype}_settings . ';' -+ endif -+ -+ let msg = 'Taglist: Invalid ctags option setting - ' . settings -+ -+ " Format of the option that specifies the filetype and ctags arugments: -+ " -+ " ;flag1:name1;flag2:name2;flag3:name3 -+ " -+ -+ " Extract the file type to pass to ctags. This may be different from the -+ " file type detected by Vim -+ let pos = stridx(settings, ';') -+ if pos == -1 -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let ctags_ftype = strpart(settings, 0, pos) -+ if ctags_ftype == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ " Make sure a valid filetype is supplied. If the user didn't specify a -+ " valid filetype, then the ctags option settings may be treated as the -+ " filetype -+ if ctags_ftype =~ ':' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ -+ " Remove the file type from settings -+ let settings = strpart(settings, pos + 1) -+ if settings == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ -+ " Process all the specified ctags flags. The format is -+ " flag1:name1;flag2:name2;flag3:name3 -+ let ctags_flags = '' -+ let cnt = 0 -+ while settings != '' -+ " Extract the flag -+ let pos = stridx(settings, ':') -+ if pos == -1 -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let flag = strpart(settings, 0, pos) -+ if flag == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ " Remove the flag from settings -+ let settings = strpart(settings, pos + 1) -+ -+ " Extract the tag type name -+ let pos = stridx(settings, ';') -+ if pos == -1 -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let name = strpart(settings, 0, pos) -+ if name == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let settings = strpart(settings, pos + 1) -+ -+ let cnt = cnt + 1 -+ -+ let s:tlist_{a:ftype}_{cnt}_name = flag -+ let s:tlist_{a:ftype}_{cnt}_fullname = name -+ let ctags_flags = ctags_flags . flag -+ endwhile -+ -+ let s:tlist_{a:ftype}_ctags_args = '--language-force=' . ctags_ftype . -+ \ ' --' . ctags_ftype . '-types=' . ctags_flags -+ let s:tlist_{a:ftype}_count = cnt -+ let s:tlist_{a:ftype}_ctags_flags = ctags_flags -+ -+ " Save the filetype name -+ let s:tlist_ftype_{s:tlist_ftype_count}_name = a:ftype -+ let s:tlist_ftype_count = s:tlist_ftype_count + 1 -+ -+ return 1 -+endfunction -+ -+" Tlist_Get_Filetype -+" Determine the filetype for the specified file -+function! s:Tlist_Get_Filetype(fname) -+ " Ignore the filetype autocommands -+ let old_eventignore = &eventignore -+ set eventignore=FileType -+ -+ " Save the 'filetype', as this will be changed temporarily -+ let old_filetype = &filetype -+ -+ " Run the filetypedetect group of autocommands to determine -+ " the filetype -+ exe 'doautocmd filetypedetect BufRead ' . a:fname -+ -+ " Save the detected filetype -+ let ftype = &filetype -+ -+ " Restore the previous state -+ let &filetype = old_filetype -+ let &eventignore = old_eventignore -+ -+ return ftype -+endfunction -+ -+" Tlist_Get_Buffer_Filetype -+" Get the filetype for the specified buffer -+function! s:Tlist_Get_Buffer_Filetype(bnum) -+ if bufloaded(a:bnum) -+ " For loaded buffers, the 'filetype' is already determined -+ return getbufvar(a:bnum, '&filetype') -+ endif -+ -+ " For unloaded buffers, if the 'filetype' option is set, return it -+ let ftype = getbufvar(a:bnum, '&filetype') -+ if ftype != '' -+ return ftype -+ endif -+ -+ " Skip non-existent buffers -+ if !bufexists(a:bnum) -+ return '' -+ endif -+ -+ " For buffers whose filetype is not yet determined, try to determine -+ " the filetype -+ let bname = bufname(a:bnum) -+ -+ return s:Tlist_Get_Filetype(bname) -+endfunction -+ -+" Tlist_Discard_TagInfo -+" Discard the stored tag information for a file -+function! s:Tlist_Discard_TagInfo(fidx) -+ call s:Tlist_Log_Msg('Tlist_Discard_TagInfo (' . -+ \ s:tlist_{a:fidx}_filename . ')') -+ let ftype = s:tlist_{a:fidx}_filetype -+ -+ " Discard information about the tags defined in the file -+ let i = 1 -+ while i <= s:tlist_{a:fidx}_tag_count -+ let fidx_i = 's:tlist_' . a:fidx . '_' . i -+ unlet! {fidx_i}_tag -+ unlet! {fidx_i}_tag_name -+ unlet! {fidx_i}_tag_type -+ unlet! {fidx_i}_ttype_idx -+ unlet! {fidx_i}_tag_proto -+ unlet! {fidx_i}_tag_searchpat -+ unlet! {fidx_i}_tag_linenum -+ let i = i + 1 -+ endwhile -+ -+ let s:tlist_{a:fidx}_tag_count = 0 -+ -+ " Discard information about tag type groups -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{i}_name -+ if s:tlist_{a:fidx}_{ttype} != '' -+ let fidx_ttype = 's:tlist_' . a:fidx . '_' . ttype -+ let {fidx_ttype} = '' -+ let {fidx_ttype}_offset = 0 -+ let cnt = {fidx_ttype}_count -+ let {fidx_ttype}_count = 0 -+ let j = 1 -+ while j <= cnt -+ unlet! {fidx_ttype}_{j} -+ let j = j + 1 -+ endwhile -+ endif -+ let i = i + 1 -+ endwhile -+ -+ " Discard the stored menu command also -+ let s:tlist_{a:fidx}_menu_cmd = '' -+endfunction -+ -+" 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_Window_Update_Line_Offsets(start_idx, increment, offset) -+ let i = a:start_idx -+ -+ while i < s:tlist_file_count -+ if s:tlist_{i}_visible -+ " Update the start/end line number only if the file is visible -+ if a:increment -+ let s:tlist_{i}_start = s:tlist_{i}_start + a:offset -+ let s:tlist_{i}_end = s:tlist_{i}_end + a:offset -+ else -+ let s:tlist_{i}_start = s:tlist_{i}_start - a:offset -+ let s:tlist_{i}_end = s:tlist_{i}_end - a:offset -+ endif -+ endif -+ let i = i + 1 -+ endwhile -+endfunction -+ -+" Tlist_Discard_FileInfo -+" Discard the stored information for a file -+function! s:Tlist_Discard_FileInfo(fidx) -+ call s:Tlist_Log_Msg('Tlist_Discard_FileInfo (' . -+ \ s:tlist_{a:fidx}_filename . ')') -+ call s:Tlist_Discard_TagInfo(a:fidx) -+ -+ let ftype = s:tlist_{a:fidx}_filetype -+ -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{i}_name -+ unlet! s:tlist_{a:fidx}_{ttype} -+ unlet! s:tlist_{a:fidx}_{ttype}_offset -+ unlet! s:tlist_{a:fidx}_{ttype}_count -+ let i = i + 1 -+ endwhile -+ -+ unlet! s:tlist_{a:fidx}_filename -+ unlet! s:tlist_{a:fidx}_sort_type -+ unlet! s:tlist_{a:fidx}_filetype -+ unlet! s:tlist_{a:fidx}_mtime -+ unlet! s:tlist_{a:fidx}_start -+ unlet! s:tlist_{a:fidx}_end -+ unlet! s:tlist_{a:fidx}_valid -+ unlet! s:tlist_{a:fidx}_visible -+ unlet! s:tlist_{a:fidx}_tag_count -+ unlet! s:tlist_{a:fidx}_menu_cmd -+endfunction -+ -+" Tlist_Window_Remove_File_From_Display -+" Remove the specified 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 -+ return -+ endif -+ -+ " Remove the tags displayed for the specified file from the window -+ let start = s:tlist_{a:fidx}_start -+ " Include the empty line after the last line also -+ if g:Tlist_Compact_Format -+ let end = s:tlist_{a:fidx}_end -+ else -+ let end = s:tlist_{a:fidx}_end + 1 -+ endif -+ -+ setlocal modifiable -+ exe 'silent! ' . start . ',' . end . 'delete _' -+ setlocal nomodifiable -+ -+ " 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_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) -+endfunction -+ -+" Tlist_Remove_File -+" Remove the file under the cursor or the specified file index -+" user_request - User requested to remove the file from taglist -+function! s:Tlist_Remove_File(file_idx, user_request) -+ let fidx = a:file_idx -+ -+ if fidx == -1 -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ endif -+ call s:Tlist_Log_Msg('Tlist_Remove_File (' . -+ \ s:tlist_{fidx}_filename . ', ' . a:user_request . ')') -+ -+ let save_winnr = winnr() -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ " Taglist window is open, remove the file from display -+ -+ if save_winnr != winnum -+ let old_eventignore = &eventignore -+ set eventignore=all -+ exe winnum . 'wincmd w' -+ endif -+ -+ call s:Tlist_Window_Remove_File_From_Display(fidx) -+ -+ if save_winnr != winnum -+ exe save_winnr . 'wincmd w' -+ let &eventignore = old_eventignore -+ endif -+ endif -+ -+ let fname = s:tlist_{fidx}_filename -+ -+ if a:user_request -+ " As the user requested to remove the file from taglist, -+ " add it to the removed list -+ call s:Tlist_Update_Remove_List(fname, 1) -+ endif -+ -+ " Remove the file name from the taglist list of filenames -+ let idx = stridx(s:tlist_file_names, fname . "\n") -+ let text_before = strpart(s:tlist_file_names, 0, idx) -+ let rem_text = strpart(s:tlist_file_names, idx) -+ let next_idx = stridx(rem_text, "\n") -+ let text_after = strpart(rem_text, next_idx + 1) -+ let s:tlist_file_names = text_before . text_after -+ -+ call s:Tlist_Discard_FileInfo(fidx) -+ -+ " Shift all the file variables by one index -+ let i = fidx + 1 -+ -+ while i < s:tlist_file_count -+ let j = i - 1 -+ -+ let s:tlist_{j}_filename = s:tlist_{i}_filename -+ let s:tlist_{j}_sort_type = s:tlist_{i}_sort_type -+ let s:tlist_{j}_filetype = s:tlist_{i}_filetype -+ let s:tlist_{j}_mtime = s:tlist_{i}_mtime -+ let s:tlist_{j}_start = s:tlist_{i}_start -+ let s:tlist_{j}_end = s:tlist_{i}_end -+ let s:tlist_{j}_valid = s:tlist_{i}_valid -+ let s:tlist_{j}_visible = s:tlist_{i}_visible -+ let s:tlist_{j}_tag_count = s:tlist_{i}_tag_count -+ let s:tlist_{j}_menu_cmd = s:tlist_{i}_menu_cmd -+ -+ let k = 1 -+ while k <= s:tlist_{j}_tag_count -+ let s:tlist_{j}_{k}_tag = s:tlist_{i}_{k}_tag -+ let s:tlist_{j}_{k}_tag_name = s:tlist_{i}_{k}_tag_name -+ let s:tlist_{j}_{k}_tag_type = s:Tlist_Get_Tag_Type_By_Tag(i, k) -+ let s:tlist_{j}_{k}_ttype_idx = s:tlist_{i}_{k}_ttype_idx -+ let s:tlist_{j}_{k}_tag_proto = s:Tlist_Get_Tag_Prototype(i, k) -+ let s:tlist_{j}_{k}_tag_searchpat = s:Tlist_Get_Tag_SearchPat(i, k) -+ let s:tlist_{j}_{k}_tag_linenum = s:Tlist_Get_Tag_Linenum(i, k) -+ let k = k + 1 -+ endwhile -+ -+ let ftype = s:tlist_{i}_filetype -+ -+ let k = 1 -+ while k <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{k}_name -+ let s:tlist_{j}_{ttype} = s:tlist_{i}_{ttype} -+ let s:tlist_{j}_{ttype}_offset = s:tlist_{i}_{ttype}_offset -+ let s:tlist_{j}_{ttype}_count = s:tlist_{i}_{ttype}_count -+ if s:tlist_{j}_{ttype} != '' -+ let l = 1 -+ while l <= s:tlist_{j}_{ttype}_count -+ let s:tlist_{j}_{ttype}_{l} = s:tlist_{i}_{ttype}_{l} -+ let l = l + 1 -+ endwhile -+ endif -+ let k = k + 1 -+ endwhile -+ -+ " As the file and tag information is copied to the new index, -+ " discard the previous information -+ call s:Tlist_Discard_FileInfo(i) -+ -+ let i = i + 1 -+ endwhile -+ -+ " Reduce the number of files displayed -+ let s:tlist_file_count = s:tlist_file_count - 1 -+ -+ if g:Tlist_Show_One_File -+ " If the tags for only one file is displayed and if we just -+ " now removed that file, then invalidate the current file idx -+ if s:tlist_cur_file_idx == fidx -+ let s:tlist_cur_file_idx = -1 -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Goto_Window -+" Goto the taglist window -+function! s:Tlist_Window_Goto_Window() -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ if winnr() != winnum -+ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Create -+" Create a new taglist window. If it is already open, jump to it -+function! s:Tlist_Window_Create() -+ call s:Tlist_Log_Msg('Tlist_Window_Create()') -+ " If the window is open, jump to it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ " Jump to the existing window -+ if winnr() != winnum -+ exe winnum . 'wincmd w' -+ endif -+ return -+ endif -+ -+ " If used with winmanager don't open windows. Winmanager will handle -+ " the window/buffer management -+ if s:tlist_app_name == "winmanager" -+ return -+ endif -+ -+ " Create a new window. If user prefers a horizontal window, then open -+ " a horizontally split window. Otherwise open a vertically split -+ " window -+ if g:Tlist_Use_Horiz_Window -+ " Open a horizontally split window -+ let win_dir = 'botright' -+ " Horizontal window height -+ let win_size = g:Tlist_WinHeight -+ else -+ if s:tlist_winsize_chgd == -1 -+ " Open a vertically split window. Increase the window size, if -+ " needed, to accomodate the new window -+ if g:Tlist_Inc_Winwidth && -+ \ &columns < (80 + g:Tlist_WinWidth) -+ " Save the original window position -+ let s:tlist_pre_winx = getwinposx() -+ let s:tlist_pre_winy = getwinposy() -+ -+ " one extra column is needed to include the vertical split -+ let &columns= &columns + g:Tlist_WinWidth + 1 -+ -+ let s:tlist_winsize_chgd = 1 -+ else -+ let s:tlist_winsize_chgd = 0 -+ endif -+ endif -+ -+ if g:Tlist_Use_Right_Window -+ " Open the window at the rightmost place -+ let win_dir = 'botright vertical' -+ else -+ " Open the window at the leftmost place -+ let win_dir = 'topleft vertical' -+ endif -+ let win_size = g:Tlist_WinWidth -+ endif -+ -+ " If the tag listing temporary buffer already exists, then reuse it. -+ " Otherwise create a new buffer -+ let bufnum = bufnr(g:TagList_title) -+ if bufnum == -1 -+ " Create a new buffer -+ let wcmd = g:TagList_title -+ else -+ " Edit the existing buffer -+ let wcmd = '+buffer' . bufnum -+ endif -+ -+ " Create the taglist window -+ exe 'silent! ' . win_dir . ' ' . win_size . 'split ' . wcmd -+ -+ " Save the new window position -+ let s:tlist_winx = getwinposx() -+ let s:tlist_winy = getwinposy() -+ -+ " Initialize the taglist window -+ call s:Tlist_Window_Init() -+endfunction -+ -+" Tlist_Window_Zoom -+" Zoom (maximize/minimize) the taglist window -+function! s:Tlist_Window_Zoom() -+ if s:tlist_win_maximized -+ " Restore the window back to the previous size -+ if g:Tlist_Use_Horiz_Window -+ exe 'resize ' . g:Tlist_WinHeight -+ else -+ exe 'vert resize ' . g:Tlist_WinWidth -+ endif -+ let s:tlist_win_maximized = 0 -+ else -+ " Set the window size to the maximum possible without closing other -+ " windows -+ if g:Tlist_Use_Horiz_Window -+ resize -+ else -+ vert resize -+ endif -+ let s:tlist_win_maximized = 1 -+ endif -+endfunction -+ -+" Tlist_Ballon_Expr -+" When the mouse cursor is over a tag in the taglist window, display the -+" tag prototype (balloon) -+function! Tlist_Ballon_Expr() -+ " Get the file index -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(v:beval_lnum) -+ if fidx == -1 -+ return '' -+ endif -+ -+ " Get the tag output line for the current tag -+ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, v:beval_lnum) -+ if tidx == 0 -+ return '' -+ endif -+ -+ " Get the tag search pattern and display it -+ return s:Tlist_Get_Tag_Prototype(fidx, tidx) -+endfunction -+ -+" Tlist_Window_Check_Width -+" Check the width of the taglist window. For horizontally split windows, the -+" 'winfixheight' option is used to fix the height of the window. For -+" vertically split windows, Vim doesn't support the 'winfixwidth' option. So -+" need to handle window width changes from this function. -+function! s:Tlist_Window_Check_Width() -+ let tlist_winnr = bufwinnr(g:TagList_title) -+ if tlist_winnr == -1 -+ return -+ endif -+ -+ let width = winwidth(tlist_winnr) -+ if width != g:Tlist_WinWidth -+ call s:Tlist_Log_Msg("Tlist_Window_Check_Width: Changing window " . -+ \ "width from " . width . " to " . g:Tlist_WinWidth) -+ let save_winnr = winnr() -+ if save_winnr != tlist_winnr -+ call s:Tlist_Exe_Cmd_No_Acmds(tlist_winnr . 'wincmd w') -+ endif -+ exe 'vert resize ' . g:Tlist_WinWidth -+ if save_winnr != tlist_winnr -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Exit_Only_Window -+" If the 'Tlist_Exit_OnlyWindow' option is set, then exit Vim if only the -+" taglist window is present. -+function! s:Tlist_Window_Exit_Only_Window() -+ " Before quitting Vim, delete the taglist buffer so that -+ " the '0 mark is correctly set to the previous buffer. -+ if v:version < 700 -+ if winbufnr(2) == -1 -+ bdelete -+ quit -+ endif -+ else -+ if winbufnr(2) == -1 -+ if tabpagenr('$') == 1 -+ " Only one tag page is present -+ bdelete -+ quit -+ else -+ " More than one tab page is present. Close only the current -+ " tab page -+ close -+ endif -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Init -+" Set the default options for the taglist window -+function! s:Tlist_Window_Init() -+ call s:Tlist_Log_Msg('Tlist_Window_Init()') -+ -+ " The 'readonly' option should not be set for the taglist buffer. -+ " If Vim is started as "view/gview" or if the ":view" command is -+ " used, then the 'readonly' option is set for all the buffers. -+ " Unset it for the taglist buffer -+ setlocal noreadonly -+ -+ " Set the taglist buffer filetype to taglist -+ setlocal filetype=taglist -+ -+ " Define taglist window element highlighting -+ syntax match TagListComment '^" .*' -+ syntax match TagListFileName '^[^" ].*$' -+ syntax match TagListTitle '^ \S.*$' -+ syntax match TagListTagScope '\s\[.\{-\}\]$' -+ -+ " Define the highlighting only if colors are supported -+ if has('gui_running') || &t_Co > 2 -+ " 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 default link TagListTagName Search -+ endif -+ " Colors to highlight comments and titles -+ if hlexists('MyTagListComment') -+ highlight link TagListComment MyTagListComment -+ else -+ highlight clear TagListComment -+ highlight default link TagListComment Comment -+ endif -+ if hlexists('MyTagListTitle') -+ highlight link TagListTitle MyTagListTitle -+ else -+ highlight clear TagListTitle -+ highlight default link TagListTitle Title -+ endif -+ if hlexists('MyTagListFileName') -+ highlight link TagListFileName MyTagListFileName -+ else -+ highlight clear TagListFileName -+ highlight default TagListFileName guibg=Grey ctermbg=darkgray -+ \ guifg=white ctermfg=white -+ endif -+ if hlexists('MyTagListTagScope') -+ highlight link TagListTagScope MyTagListTagScope -+ else -+ highlight clear TagListTagScope -+ highlight default link TagListTagScope Identifier -+ endif -+ else -+ highlight default TagListTagName term=reverse cterm=reverse -+ endif -+ -+ " Folding related settings -+ setlocal foldenable -+ setlocal foldminlines=0 -+ setlocal foldmethod=manual -+ setlocal foldlevel=9999 -+ if g:Tlist_Enable_Fold_Column -+ setlocal foldcolumn=3 -+ else -+ setlocal foldcolumn=0 -+ endif -+ setlocal foldtext=v:folddashes.getline(v:foldstart) -+ -+ if s:tlist_app_name != "winmanager" -+ " Mark buffer as scratch -+ silent! setlocal buftype=nofile -+ if s:tlist_app_name == "none" -+ silent! setlocal bufhidden=delete -+ endif -+ silent! setlocal noswapfile -+ " Due to a bug in Vim 6.0, the winbufnr() function fails for unlisted -+ " buffers. So if the taglist buffer is unlisted, multiple taglist -+ " windows will be opened. This bug is fixed in Vim 6.1 and above -+ if v:version >= 601 -+ silent! setlocal nobuflisted -+ endif -+ endif -+ -+ silent! setlocal nowrap -+ -+ " If the 'number' option is set in the source window, it will affect the -+ " taglist window. So forcefully disable 'number' option for the taglist -+ " window -+ silent! setlocal nonumber -+ -+ " Use fixed height when horizontally split window is used -+ if g:Tlist_Use_Horiz_Window -+ if v:version >= 602 -+ set winfixheight -+ endif -+ endif -+ if !g:Tlist_Use_Horiz_Window && v:version >= 700 -+ set winfixwidth -+ endif -+ -+ " Setup balloon evaluation to display tag prototype -+ if v:version >= 700 && has('balloon_eval') -+ setlocal balloonexpr=Tlist_Ballon_Expr() -+ set ballooneval -+ 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_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 -+ nnoremap - :silent! foldclose -+ nnoremap * :silent! %foldopen! -+ nnoremap = :silent! %foldclose -+ nnoremap :silent! foldopen -+ nnoremap :silent! foldclose -+ nnoremap :silent! %foldopen! -+ 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_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_Window_Jump_To_Tag('useopen') -+ " Windows needs return -+ 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 -+ inoremap - :silent! foldclose -+ inoremap * :silent! %foldopen! -+ inoremap = :silent! %foldclose -+ inoremap :silent! foldopen -+ inoremap :silent! foldclose -+ inoremap :silent! %foldopen! -+ inoremap :call -+ \ 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_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 -+ if g:Tlist_Use_SingleClick == 1 -+ " Contributed by Bindu Wavell -+ " attempt to perform single click mapping, it would be much -+ " nicer if we could nnoremap ... however vim does -+ " not fire the when you use the mouse -+ " to enter a buffer. -+ let clickmap = ':if bufname("%") =~ "__Tag_List__" ' . -+ \ 'call Tlist_Window_Jump_To_Tag("useopen") ' . -+ \ ' endif ' -+ if maparg('', 'n') == '' -+ " no mapping for leftmouse -+ exe ':nnoremap ' . clickmap -+ else -+ " we have a mapping -+ let mapcmd = ':nnoremap ' -+ let mapcmd = mapcmd . substitute(substitute( -+ \ maparg('', 'n'), '|', '', 'g'), -+ \ '\c^', '', '') -+ let mapcmd = mapcmd . clickmap -+ exe mapcmd -+ endif -+ endif -+ -+ " Define the taglist autocommands -+ augroup TagListAutoCmds -+ autocmd! -+ " Display the tag prototype for the tag under the cursor. -+ autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info() -+ " Highlight the current tag periodically -+ 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 -+ autocmd BufUnload __Tag_List__ call s:Tlist_Post_Close_Cleanup() -+ " 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('')) -+ endif -+ " Exit Vim itself if only the taglist window is present (optional) -+ if g:Tlist_Exit_OnlyWindow -+ autocmd BufEnter __Tag_List__ nested -+ \ call s:Tlist_Window_Exit_Only_Window() -+ endif -+ if s:tlist_app_name != "winmanager" && -+ \ !g:Tlist_Process_File_Always && -+ \ (!has('gui_running') || !g:Tlist_Show_Menu) -+ " Auto refresh the taglist window -+ autocmd BufEnter * call s:Tlist_Refresh() -+ endif -+ -+ if !g:Tlist_Use_Horiz_Window -+ if v:version < 700 -+ autocmd WinEnter * call s:Tlist_Window_Check_Width() -+ endif -+ endif -+ augroup end -+ -+ " Restore the previous cpoptions settings -+ let &cpoptions = old_cpoptions -+endfunction -+ -+" Tlist_Window_Refresh -+" Display the tags for all the files in the taglist window -+function! s:Tlist_Window_Refresh() -+ call s:Tlist_Log_Msg('Tlist_Window_Refresh()') -+ " Set report option to a huge value to prevent informational messages -+ " while deleting the lines -+ let old_report = &report -+ set report=99999 -+ -+ " Mark the buffer as modifiable -+ setlocal modifiable -+ -+ " Delete the contents of the buffer to the black-hole register -+ silent! %delete _ -+ -+ " As we have cleared the taglist window, mark all the files -+ " as not visible -+ let i = 0 -+ while i < s:tlist_file_count -+ let s:tlist_{i}_visible = 0 -+ let i = i + 1 -+ endwhile -+ -+ if g:Tlist_Compact_Format == 0 -+ " Display help in non-compact mode -+ call s:Tlist_Window_Display_Help() -+ endif -+ -+ " Mark the buffer as not modifiable -+ setlocal nomodifiable -+ -+ " Restore the report option -+ let &report = old_report -+ -+ " If the tags for only one file should be displayed in the taglist -+ " window, then no need to add the tags here. The bufenter autocommand -+ " will add the tags for that file. -+ if g:Tlist_Show_One_File -+ return -+ endif -+ -+ " List all the tags for the previously processed files -+ " Do this only if taglist is configured to display tags for more than -+ " one file. Otherwise, when Tlist_Show_One_File is configured, -+ " tags for the wrong file will be displayed. -+ let i = 0 -+ while i < s:tlist_file_count -+ call s:Tlist_Window_Refresh_File(s:tlist_{i}_filename, -+ \ s:tlist_{i}_filetype) -+ let i = i + 1 -+ endwhile -+ -+ if g:Tlist_Auto_Update -+ " Add and list the tags for all buffers in the Vim buffer list -+ let i = 1 -+ let last_bufnum = bufnr('$') -+ while i <= last_bufnum -+ if buflisted(i) -+ let fname = fnamemodify(bufname(i), ':p') -+ let ftype = s:Tlist_Get_Buffer_Filetype(i) -+ " If the file doesn't support tag listing, skip it -+ if !s:Tlist_Skip_File(fname, ftype) -+ call s:Tlist_Window_Refresh_File(fname, ftype) -+ endif -+ endif -+ let i = i + 1 -+ endwhile -+ endif -+ -+ " If Tlist_File_Fold_Auto_Close option is set, then close all the folds -+ if g:Tlist_File_Fold_Auto_Close -+ " Close all the folds -+ silent! %foldclose -+ endif -+ -+ " Move the cursor to the top of the taglist window -+ normal! gg -+endfunction -+ -+" Tlist_Post_Close_Cleanup() -+" Close the taglist window and adjust the Vim window width -+function! s:Tlist_Post_Close_Cleanup() -+ call s:Tlist_Log_Msg('Tlist_Post_Close_Cleanup()') -+ " Mark all the files as not visible -+ let i = 0 -+ while i < s:tlist_file_count -+ let s:tlist_{i}_visible = 0 -+ let i = i + 1 -+ endwhile -+ -+ " Remove the taglist autocommands -+ silent! autocmd! TagListAutoCmds -+ -+ " Clear all the highlights -+ match none -+ -+ silent! syntax clear TagListTitle -+ silent! syntax clear TagListComment -+ silent! syntax clear TagListTagScope -+ -+ " Remove the left mouse click mapping if it was setup initially -+ if g:Tlist_Use_SingleClick -+ if hasmapto('') -+ nunmap -+ endif -+ endif -+ -+ if s:tlist_app_name != "winmanager" -+ if g:Tlist_Use_Horiz_Window || g:Tlist_Inc_Winwidth == 0 || -+ \ s:tlist_winsize_chgd != 1 || -+ \ &columns < (80 + g:Tlist_WinWidth) -+ " No need to adjust window width if using horizontally split taglist -+ " window or if columns is less than 101 or if the user chose not to -+ " adjust the window width -+ else -+ " If the user didn't manually move the window, then restore the window -+ " position to the pre-taglist position -+ if s:tlist_pre_winx != -1 && s:tlist_pre_winy != -1 && -+ \ getwinposx() == s:tlist_winx && -+ \ getwinposy() == s:tlist_winy -+ exe 'winpos ' . s:tlist_pre_winx . ' ' . s:tlist_pre_winy -+ endif -+ -+ " Adjust the Vim window width -+ let &columns= &columns - (g:Tlist_WinWidth + 1) -+ endif -+ endif -+ -+ let s:tlist_winsize_chgd = -1 -+ -+ " Reset taglist state variables -+ if s:tlist_app_name == "winmanager" -+ let s:tlist_app_name = "none" -+ endif -+ let s:tlist_window_initialized = 0 -+endfunction -+ -+" Tlist_Window_Refresh_File() -+" List the tags defined in the specified file in a Vim window -+function! s:Tlist_Window_Refresh_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Window_Refresh_File (' . a:filename . ')') -+ " First check whether the file already exists -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx != -1 -+ let file_listed = 1 -+ else -+ let file_listed = 0 -+ endif -+ -+ if !file_listed -+ " Check whether this file is removed based on user request -+ " If it is, then don't display the tags for this file -+ if s:Tlist_User_Removed_File(a:filename) -+ return -+ endif -+ endif -+ -+ if file_listed && s:tlist_{fidx}_visible -+ " Check whether the file tags are currently valid -+ if s:tlist_{fidx}_valid -+ " Goto the first line in the file -+ exe s:tlist_{fidx}_start -+ -+ " If the line is inside a fold, open the fold -+ if foldclosed('.') != -1 -+ exe "silent! " . s:tlist_{fidx}_start . "," . -+ \ s:tlist_{fidx}_end . "foldopen!" -+ endif -+ return -+ endif -+ -+ " Discard and remove the tags for this file from display -+ call s:Tlist_Discard_TagInfo(fidx) -+ call s:Tlist_Window_Remove_File_From_Display(fidx) -+ endif -+ -+ " Process and generate a list of tags defined in the file -+ if !file_listed || !s:tlist_{fidx}_valid -+ let ret_fidx = s:Tlist_Process_File(a:filename, a:ftype) -+ if ret_fidx == -1 -+ return -+ endif -+ let fidx = ret_fidx -+ endif -+ -+ " Set report option to a huge value to prevent informational messages -+ " while adding lines to the taglist window -+ let old_report = &report -+ set report=99999 -+ -+ if g:Tlist_Show_One_File -+ " Remove the previous file -+ if s:tlist_cur_file_idx != -1 -+ 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 -+ endif -+ let s:tlist_cur_file_idx = fidx -+ endif -+ -+ " Mark the buffer as modifiable -+ setlocal modifiable -+ -+ " Add new files to the end of the window. For existing files, add them at -+ " the same line where they were previously present. If the file is not -+ " visible, then add it at the end -+ if s:tlist_{fidx}_start == 0 || !s:tlist_{fidx}_visible -+ if g:Tlist_Compact_Format -+ let s:tlist_{fidx}_start = line('$') -+ else -+ let s:tlist_{fidx}_start = line('$') + 1 -+ endif -+ endif -+ -+ let s:tlist_{fidx}_visible = 1 -+ -+ " Goto the line where this file should be placed -+ if g:Tlist_Compact_Format -+ exe s:tlist_{fidx}_start -+ else -+ exe s:tlist_{fidx}_start - 1 -+ endif -+ -+ let txt = fnamemodify(s:tlist_{fidx}_filename, ':t') . ' (' . -+ \ fnamemodify(s:tlist_{fidx}_filename, ':p:h') . ')' -+ if g:Tlist_Compact_Format == 0 -+ silent! put =txt -+ else -+ silent! put! =txt -+ " Move to the next line -+ exe line('.') + 1 -+ endif -+ let file_start = s:tlist_{fidx}_start -+ -+ " Add the tag names grouped by tag type to the buffer with a title -+ let i = 1 -+ let ttype_cnt = s:tlist_{a:ftype}_count -+ while i <= ttype_cnt -+ let ttype = s:tlist_{a:ftype}_{i}_name -+ " Add the tag type only if there are tags for that type -+ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype -+ let ttype_txt = {fidx_ttype} -+ if ttype_txt != '' -+ let txt = ' ' . s:tlist_{a:ftype}_{i}_fullname -+ if g:Tlist_Compact_Format == 0 -+ let ttype_start_lnum = line('.') + 1 -+ silent! put =txt -+ else -+ let ttype_start_lnum = line('.') -+ silent! put! =txt -+ endif -+ silent! put =ttype_txt -+ -+ let {fidx_ttype}_offset = ttype_start_lnum - file_start -+ -+ " create a fold for this tag type -+ let fold_start = ttype_start_lnum -+ let fold_end = fold_start + {fidx_ttype}_count -+ exe fold_start . ',' . fold_end . 'fold' -+ -+ " Adjust the cursor position -+ if g:Tlist_Compact_Format == 0 -+ exe ttype_start_lnum + {fidx_ttype}_count -+ else -+ exe ttype_start_lnum + {fidx_ttype}_count + 1 -+ endif -+ -+ if g:Tlist_Compact_Format == 0 -+ " Separate the tag types by a empty line -+ silent! put ='' -+ endif -+ endif -+ let i = i + 1 -+ endwhile -+ -+ if s:tlist_{fidx}_tag_count == 0 -+ if g:Tlist_Compact_Format == 0 -+ silent! put ='' -+ endif -+ endif -+ -+ let s:tlist_{fidx}_end = line('.') - 1 -+ -+ " Create a fold for the entire file -+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' -+ exe 'silent! ' . s:tlist_{fidx}_start . ',' . -+ \ s:tlist_{fidx}_end . 'foldopen!' -+ -+ " Goto the starting line for this file, -+ exe s:tlist_{fidx}_start -+ -+ if s:tlist_app_name == "winmanager" -+ " To handle a bug in the winmanager plugin, add a space at the -+ " last line -+ call setline('$', ' ') -+ endif -+ -+ " Mark the buffer as not modifiable -+ setlocal nomodifiable -+ -+ " Restore the report option -+ let &report = old_report -+ -+ " Update the start and end line numbers for all the files following this -+ " file -+ let start = s:tlist_{fidx}_start -+ " include the empty line after the last line -+ if g:Tlist_Compact_Format -+ let end = s:tlist_{fidx}_end -+ else -+ let end = s:tlist_{fidx}_end + 1 -+ endif -+ 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) -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(1) -+ endif -+endfunction -+ -+" Tlist_Init_File -+" Initialize the variables for a new file -+function! s:Tlist_Init_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Init_File (' . a:filename . ')') -+ " Add new files at the end of the list -+ let fidx = s:tlist_file_count -+ let s:tlist_file_count = s:tlist_file_count + 1 -+ " Add the new file name to the taglist list of file names -+ let s:tlist_file_names = s:tlist_file_names . a:filename . "\n" -+ -+ " Initialize the file variables -+ let s:tlist_{fidx}_filename = a:filename -+ let s:tlist_{fidx}_sort_type = g:Tlist_Sort_Type -+ let s:tlist_{fidx}_filetype = a:ftype -+ let s:tlist_{fidx}_mtime = -1 -+ let s:tlist_{fidx}_start = 0 -+ let s:tlist_{fidx}_end = 0 -+ let s:tlist_{fidx}_valid = 0 -+ let s:tlist_{fidx}_visible = 0 -+ let s:tlist_{fidx}_tag_count = 0 -+ let s:tlist_{fidx}_menu_cmd = '' -+ -+ " Initialize the tag type variables -+ let i = 1 -+ while i <= s:tlist_{a:ftype}_count -+ let ttype = s:tlist_{a:ftype}_{i}_name -+ let s:tlist_{fidx}_{ttype} = '' -+ let s:tlist_{fidx}_{ttype}_offset = 0 -+ let s:tlist_{fidx}_{ttype}_count = 0 -+ let i = i + 1 -+ endwhile -+ -+ return fidx -+endfunction -+ -+" Tlist_Get_Tag_Type_By_Tag -+" Return the tag type for the specified tag index -+function! s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) -+ let ttype_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_type' -+ -+ " Already parsed and have the tag name -+ if exists(ttype_var) -+ return {ttype_var} -+ endif -+ -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let {ttype_var} = s:Tlist_Extract_Tagtype(tag_line) -+ -+ return {ttype_var} -+endfunction -+ -+" Tlist_Get_Tag_Prototype -+function! s:Tlist_Get_Tag_Prototype(fidx, tidx) -+ let tproto_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_proto' -+ -+ " Already parsed and have the tag prototype -+ if exists(tproto_var) -+ return {tproto_var} -+ endif -+ -+ " Parse and extract the tag prototype -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let start = stridx(tag_line, '/^') + 2 -+ let end = stridx(tag_line, '/;"' . "\t") -+ if tag_line[end - 1] == '$' -+ let end = end -1 -+ endif -+ let tag_proto = strpart(tag_line, start, end - start) -+ let {tproto_var} = substitute(tag_proto, '\s*', '', '') -+ -+ return {tproto_var} -+endfunction -+ -+" Tlist_Get_Tag_SearchPat -+function! s:Tlist_Get_Tag_SearchPat(fidx, tidx) -+ let tpat_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_searchpat' -+ -+ " Already parsed and have the tag search pattern -+ if exists(tpat_var) -+ return {tpat_var} -+ endif -+ -+ " Parse and extract the tag search pattern -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let start = stridx(tag_line, '/^') + 2 -+ let end = stridx(tag_line, '/;"' . "\t") -+ if tag_line[end - 1] == '$' -+ let end = end -1 -+ endif -+ let {tpat_var} = '\V\^' . strpart(tag_line, start, end - start) . -+ \ (tag_line[end] == '$' ? '\$' : '') -+ -+ return {tpat_var} -+endfunction -+ -+" Tlist_Get_Tag_Linenum -+" Return the tag line number, given the tag index -+function! s:Tlist_Get_Tag_Linenum(fidx, tidx) -+ let tline_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_linenum' -+ -+ " Already parsed and have the tag line number -+ if exists(tline_var) -+ return {tline_var} -+ endif -+ -+ " Parse and extract the tag line number -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let start = strridx(tag_line, 'line:') + 5 -+ let end = strridx(tag_line, "\t") -+ if end < start -+ let {tline_var} = strpart(tag_line, start) + 0 -+ else -+ let {tline_var} = strpart(tag_line, start, end - start) + 0 -+ endif -+ -+ return {tline_var} -+endfunction -+ -+" Tlist_Parse_Tagline -+" Parse a tag line from the ctags output. Separate the tag output based on the -+" tag type and store it in the tag type variable. -+" The format of each line in the ctags output is: -+" -+" tag_namefile_nameex_cmd;"extension_fields -+" -+function! s:Tlist_Parse_Tagline(tag_line) -+ if a:tag_line == '' -+ " Skip empty lines -+ return -+ endif -+ -+ " Extract the tag type -+ let ttype = s:Tlist_Extract_Tagtype(a:tag_line) -+ -+ " 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 -+ -+ " Update the total tag count -+ let s:tidx = s:tidx + 1 -+ -+ " The following variables are used to optimize this code. Vim is slow in -+ " using curly brace names. To reduce the amount of processing needed, the -+ " curly brace variables are pre-processed here -+ let fidx_tidx = 's:tlist_' . s:fidx . '_' . s:tidx -+ let fidx_ttype = 's:tlist_' . s:fidx . '_' . ttype -+ -+ " Update the count of this tag type -+ let ttype_idx = {fidx_ttype}_count + 1 -+ let {fidx_ttype}_count = ttype_idx -+ -+ " Store the ctags output for this tag -+ let {fidx_tidx}_tag = a:tag_line -+ -+ " Store the tag index and the tag type index (back pointers) -+ let {fidx_ttype}_{ttype_idx} = s:tidx -+ let {fidx_tidx}_ttype_idx = ttype_idx -+ -+ " Extract the tag name -+ let tag_name = strpart(a:tag_line, 0, stridx(a:tag_line, "\t")) -+ -+ " Extract the tag scope/prototype -+ if g:Tlist_Display_Prototype -+ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(s:fidx, s:tidx) -+ else -+ let ttxt = ' ' . tag_name -+ -+ " Add the tag scope, if it is available and is configured. Tag -+ " scope is the last field after the 'line:\t' field -+ if g:Tlist_Display_Tag_Scope -+ let tag_scope = s:Tlist_Extract_Tag_Scope(a:tag_line) -+ if tag_scope != '' -+ let ttxt = ttxt . ' [' . tag_scope . ']' -+ endif -+ endif -+ endif -+ -+ " Add this tag to the tag type variable -+ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" -+ -+ " Save the tag name -+ let {fidx_tidx}_tag_name = tag_name -+endfunction -+ -+" Tlist_Process_File -+" Get the list of tags defined in the specified file and store them -+" in Vim variables. Returns the file index where the tags are stored. -+function! s:Tlist_Process_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Process_File (' . a:filename . ', ' . -+ \ a:ftype . ')') -+ " Check whether this file is supported -+ if s:Tlist_Skip_File(a:filename, a:ftype) -+ return -1 -+ endif -+ -+ " If the tag types for this filetype are not yet created, then create -+ " them now -+ let var = 's:tlist_' . a:ftype . '_count' -+ if !exists(var) -+ if s:Tlist_FileType_Init(a:ftype) == 0 -+ return -1 -+ endif -+ endif -+ -+ " If this file is already processed, then use the cached values -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx == -1 -+ " First time, this file is loaded -+ let fidx = s:Tlist_Init_File(a:filename, a:ftype) -+ else -+ " File was previously processed. Discard the tag information -+ call s:Tlist_Discard_TagInfo(fidx) -+ endif -+ -+ let s:tlist_{fidx}_valid = 1 -+ -+ " Exuberant ctags arguments to generate a tag list -+ let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nks ' -+ -+ " Form the ctags argument depending on the sort type -+ if s:tlist_{fidx}_sort_type == 'name' -+ let ctags_args = ctags_args . '--sort=yes' -+ else -+ let ctags_args = ctags_args . '--sort=no' -+ endif -+ -+ " Add the filetype specific arguments -+ let ctags_args = ctags_args . ' ' . s:tlist_{a:ftype}_ctags_args -+ -+ " Ctags command to produce output with regexp for locating the tags -+ let ctags_cmd = g:Tlist_Ctags_Cmd . ctags_args -+ let ctags_cmd = ctags_cmd . ' "' . a:filename . '"' -+ -+ if &shellxquote == '"' -+ " Double-quotes within double-quotes will not work in the -+ " command-line.If the 'shellxquote' option is set to double-quotes, -+ " then escape the double-quotes in the ctags command-line. -+ let ctags_cmd = escape(ctags_cmd, '"') -+ endif -+ -+ " In Windows 95, if not using cygwin, disable the 'shellslash' -+ " option. Otherwise, this will cause problems when running the -+ " ctags command. -+ if has('win95') && !has('win32unix') -+ let old_shellslash = &shellslash -+ set noshellslash -+ endif -+ -+ if has('win32') && !has('win32unix') && !has('win95') -+ \ && (&shell =~ 'cmd.exe') -+ " Windows does not correctly deal with commands that have more than 1 -+ " set of double quotes. It will strip them all resulting in: -+ " 'C:\Program' is not recognized as an internal or external command -+ " operable program or batch file. To work around this, place the -+ " command inside a batch file and call the batch file. -+ " Do this only on Win2K, WinXP and above. -+ " Contributed by: David Fishburn. -+ let s:taglist_tempfile = fnamemodify(tempname(), ':h') . -+ \ '\taglist.cmd' -+ exe 'redir! > ' . s:taglist_tempfile -+ silent echo ctags_cmd -+ redir END -+ -+ call s:Tlist_Log_Msg('Cmd inside batch file: ' . ctags_cmd) -+ let ctags_cmd = '"' . s:taglist_tempfile . '"' -+ endif -+ -+ call s:Tlist_Log_Msg('Cmd: ' . ctags_cmd) -+ -+ " Run ctags and get the tag list -+ let cmd_output = system(ctags_cmd) -+ -+ " Restore the value of the 'shellslash' option. -+ if has('win95') && !has('win32unix') -+ let &shellslash = old_shellslash -+ endif -+ -+ if exists('s:taglist_tempfile') -+ " Delete the temporary cmd file created on MS-Windows -+ call delete(s:taglist_tempfile) -+ endif -+ -+ " Handle errors -+ if v:shell_error -+ let msg = "Taglist: Failed to generate tags for " . a:filename -+ call s:Tlist_Warning_Msg(msg) -+ if cmd_output != '' -+ call s:Tlist_Warning_Msg(cmd_output) -+ endif -+ return fidx -+ endif -+ -+ " Store the modification time for the file -+ let s:tlist_{fidx}_mtime = getftime(a:filename) -+ -+ " No tags for current file -+ if cmd_output == '' -+ call s:Tlist_Log_Msg('No tags defined in ' . a:filename) -+ return fidx -+ endif -+ -+ call s:Tlist_Log_Msg('Generated tags information for ' . a:filename) -+ -+ if v:version > 601 -+ " The following script local variables are used by the -+ " Tlist_Parse_Tagline() function. -+ let s:ctags_flags = s:tlist_{a:ftype}_ctags_flags -+ let s:fidx = fidx -+ let s:tidx = 0 -+ -+ " Process the ctags output one line at a time. The substitute() -+ " command is used to parse the tag lines instead of using the -+ " matchstr()/stridx()/strpart() functions for performance reason -+ call substitute(cmd_output, "\\([^\n]\\+\\)\n", -+ \ '\=s:Tlist_Parse_Tagline(submatch(1))', 'g') -+ -+ " Save the number of tags for this file -+ let s:tlist_{fidx}_tag_count = s:tidx -+ -+ " The following script local variables are no longer needed -+ unlet! s:ctags_flags -+ unlet! s:tidx -+ unlet! s:fidx -+ else -+ " Due to a bug in Vim earlier than version 6.1, -+ " we cannot use substitute() to parse the ctags output. -+ " Instead the slow str*() functions are used -+ let ctags_flags = s:tlist_{a:ftype}_ctags_flags -+ let tidx = 0 -+ -+ while cmd_output != '' -+ " Extract one line at a time -+ let idx = stridx(cmd_output, "\n") -+ let one_line = strpart(cmd_output, 0, idx) -+ " Remove the line from the tags output -+ let cmd_output = strpart(cmd_output, idx + 1) -+ -+ if one_line == '' -+ " Line is not in proper tags format -+ continue -+ endif -+ -+ " Extract the tag type -+ let ttype = s:Tlist_Extract_Tagtype(one_line) -+ -+ " Make sure the tag type is a valid and supported one -+ if ttype == '' || stridx(ctags_flags, ttype) == -1 -+ " Line is not in proper tags format or Tag type is not -+ " supported -+ continue -+ endif -+ -+ " Update the total tag count -+ let tidx = tidx + 1 -+ -+ " The following variables are used to optimize this code. Vim is -+ " slow in using curly brace names. To reduce the amount of -+ " processing needed, the curly brace variables are pre-processed -+ " here -+ let fidx_tidx = 's:tlist_' . fidx . '_' . tidx -+ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype -+ -+ " Update the count of this tag type -+ let ttype_idx = {fidx_ttype}_count + 1 -+ let {fidx_ttype}_count = ttype_idx -+ -+ " Store the ctags output for this tag -+ let {fidx_tidx}_tag = one_line -+ -+ " Store the tag index and the tag type index (back pointers) -+ let {fidx_ttype}_{ttype_idx} = tidx -+ let {fidx_tidx}_ttype_idx = ttype_idx -+ -+ " Extract the tag name -+ let tag_name = strpart(one_line, 0, stridx(one_line, "\t")) -+ -+ " Extract the tag scope/prototype -+ if g:Tlist_Display_Prototype -+ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(fidx, tidx) -+ else -+ let ttxt = ' ' . tag_name -+ -+ " Add the tag scope, if it is available and is configured. Tag -+ " scope is the last field after the 'line:\t' field -+ if g:Tlist_Display_Tag_Scope -+ let tag_scope = s:Tlist_Extract_Tag_Scope(one_line) -+ if tag_scope != '' -+ let ttxt = ttxt . ' [' . tag_scope . ']' -+ endif -+ endif -+ endif -+ -+ " Add this tag to the tag type variable -+ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" -+ -+ " Save the tag name -+ let {fidx_tidx}_tag_name = tag_name -+ endwhile -+ -+ " Save the number of tags for this file -+ let s:tlist_{fidx}_tag_count = tidx -+ endif -+ -+ call s:Tlist_Log_Msg('Processed ' . s:tlist_{fidx}_tag_count . -+ \ ' tags in ' . a:filename) -+ -+ return fidx -+endfunction -+ -+" Tlist_Update_File -+" Update the tags for a file (if needed) -+function! Tlist_Update_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Update_File (' . a:filename . ')') -+ " If the file doesn't support tag listing, skip it -+ if s:Tlist_Skip_File(a:filename, a:ftype) -+ return -+ endif -+ -+ " Convert the file name to a full path -+ let fname = fnamemodify(a:filename, ':p') -+ -+ " First check whether the file already exists -+ let fidx = s:Tlist_Get_File_Index(fname) -+ -+ if fidx != -1 && s:tlist_{fidx}_valid -+ " File exists and the tags are valid -+ " Check whether the file was modified after the last tags update -+ " If it is modified, then update the tags -+ if s:tlist_{fidx}_mtime == getftime(fname) -+ return -+ endif -+ else -+ " If the tags were removed previously based on a user request, -+ " as we are going to update the tags (based on the user request), -+ " remove the filename from the deleted list -+ call s:Tlist_Update_Remove_List(fname, 0) -+ endif -+ -+ " If the taglist window is opened, update it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum == -1 -+ " Taglist window is not present. Just update the taglist -+ " and return -+ call s:Tlist_Process_File(fname, a:ftype) -+ else -+ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != -1 -+ " If tags for only one file are displayed and we are not -+ " updating the tags for that file, then no need to -+ " refresh the taglist window. Otherwise, the taglist -+ " window should be updated. -+ if s:tlist_{s:tlist_cur_file_idx}_filename != fname -+ call s:Tlist_Process_File(fname, a:ftype) -+ return -+ endif -+ endif -+ -+ " Save the current window number -+ let save_winnr = winnr() -+ -+ " Goto the taglist window -+ call s:Tlist_Window_Goto_Window() -+ -+ " Save the cursor position -+ let save_line = line('.') -+ let save_col = col('.') -+ -+ " Update the taglist window -+ call s:Tlist_Window_Refresh_File(fname, a:ftype) -+ -+ " Restore the cursor position -+ if v:version >= 601 -+ call cursor(save_line, save_col) -+ else -+ exe save_line -+ exe 'normal! ' . save_col . '|' -+ endif -+ -+ if winnr() != save_winnr -+ " Go back to the original window -+ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') -+ endif -+ endif -+ -+ " Update the taglist menu -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(1) -+ endif -+endfunction -+ -+" Tlist_Window_Close -+" Close the taglist window -+function! s:Tlist_Window_Close() -+ call s:Tlist_Log_Msg('Tlist_Window_Close()') -+ " Make sure the taglist window exists -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum == -1 -+ call s:Tlist_Warning_Msg('Error: Taglist window is not open') -+ return -+ endif -+ -+ if winnr() == winnum -+ " Already in the taglist window. Close it and return -+ if winbufnr(2) != -1 -+ " If a window other than the taglist window is open, -+ " then only close the taglist window. -+ close -+ endif -+ else -+ " Goto the taglist window, close it and then come back to the -+ " original window -+ let curbufnr = bufnr('%') -+ exe winnum . '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 -+endfunction -+ -+" Tlist_Window_Mark_File_Window -+" Mark the current window as the file window to use when jumping to a tag. -+" Only if the current window is a non-plugin, non-preview and non-taglist -+" window -+function! s:Tlist_Window_Mark_File_Window() -+ if getbufvar('%', '&buftype') == '' && !&previewwindow -+ let w:tlist_file_window = "yes" -+ endif -+endfunction -+ -+" Tlist_Window_Open -+" Open and refresh the taglist window -+function! s:Tlist_Window_Open() -+ call s:Tlist_Log_Msg('Tlist_Window_Open()') -+ " If the window is open, jump to it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ " Jump to the existing window -+ if winnr() != winnum -+ exe winnum . 'wincmd w' -+ endif -+ return -+ endif -+ -+ if s:tlist_app_name == "winmanager" -+ " Taglist plugin is no longer part of the winmanager app -+ let s:tlist_app_name = "none" -+ endif -+ -+ " Get the filename and filetype for the specified buffer -+ let curbuf_name = fnamemodify(bufname('%'), ':p') -+ let curbuf_ftype = getbufvar('%', '&filetype') -+ let cur_lnum = line('.') -+ -+ " Mark the current window as the desired window to open a file when a tag -+ " is selected. -+ call s:Tlist_Window_Mark_File_Window() -+ -+ " Open the taglist window -+ call s:Tlist_Window_Create() -+ -+ call s:Tlist_Window_Refresh() -+ -+ if g:Tlist_Show_One_File -+ " Add only the current buffer and file -+ " -+ " If the file doesn't support tag listing, skip it -+ if !s:Tlist_Skip_File(curbuf_name, curbuf_ftype) -+ call s:Tlist_Window_Refresh_File(curbuf_name, curbuf_ftype) -+ endif -+ endif -+ -+ if g:Tlist_File_Fold_Auto_Close -+ " Open the fold for the current file, as all the folds in -+ " the taglist window are closed -+ let fidx = s:Tlist_Get_File_Index(curbuf_name) -+ if fidx != -1 -+ exe "silent! " . s:tlist_{fidx}_start . "," . -+ \ s:tlist_{fidx}_end . "foldopen!" -+ endif -+ endif -+ -+ " Highlight the current tag -+ call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) -+endfunction -+ -+" Tlist_Window_Toggle() -+" Open or close a taglist window -+function! s:Tlist_Window_Toggle() -+ call s:Tlist_Log_Msg('Tlist_Window_Toggle()') -+ " If taglist window is open then close it. -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ call s:Tlist_Window_Close() -+ return -+ endif -+ -+ call s:Tlist_Window_Open() -+ -+ " 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 -+ call s:Tlist_Menu_Update_File(0) -+ endif -+endfunction -+ -+" 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 -+ -+ " 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 -+ -+ " 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) -+ -+ let all_files = strpart(all_files, nl_idx + 1) -+ if one_file == '' -+ continue -+ endif -+ -+ " Skip non-directory names -+ if !isdirectory(one_file) -+ continue -+ endif -+ -+ 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 -+" Add files recursively from a directory -+function! s:Tlist_Add_Files_Recursive(dir, ...) -+ let dir_name = fnamemodify(a:dir, ':p') -+ if !isdirectory(dir_name) -+ call s:Tlist_Warning_Msg('Error: ' . dir_name . ' is not a directory') -+ return -+ endif -+ -+ if a:0 == 1 -+ " User specified file pattern -+ let pat = a:1 -+ else -+ " Default file pattern -+ let pat = '*' -+ endif -+ -+ echon "\r " -+ echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t') -+ let fcnt = s:Tlist_Process_Dir(dir_name, pat) -+ -+ echon "\rAdded " . fcnt . " files to the taglist" -+endfunction -+ -+" Tlist_Add_Files -+" Add the specified list of files to the taglist -+function! s:Tlist_Add_Files(...) -+ let flist = '' -+ let i = 1 -+ -+ " Get all the files matching the file patterns supplied as argument -+ while i <= a:0 -+ let flist = flist . glob(a:{i}) . "\n" -+ let i = i + 1 -+ endwhile -+ -+ if flist == '' -+ call s:Tlist_Warning_Msg('Error: No matching files are found') -+ return -+ endif -+ -+ let fcnt = s:Tlist_Process_Filelist(flist) -+ echon "\rAdded " . fcnt . " files to the taglist" -+endfunction -+ -+" Tlist_Extract_Tagtype -+" Extract the tag type from the tag text -+function! s:Tlist_Extract_Tagtype(tag_line) -+ " The tag type is after the tag prototype field. The prototype field -+ " ends with the /;"\t string. We add 4 at the end to skip the characters -+ " in this special string.. -+ let start = strridx(a:tag_line, '/;"' . "\t") + 4 -+ let end = strridx(a:tag_line, 'line:') - 1 -+ let ttype = strpart(a:tag_line, start, end - start) -+ -+ return ttype -+endfunction -+ -+" Tlist_Extract_Tag_Scope -+" Extract the tag scope from the tag text -+function! s:Tlist_Extract_Tag_Scope(tag_line) -+ let start = strridx(a:tag_line, 'line:') -+ let end = strridx(a:tag_line, "\t") -+ if end <= start -+ return '' -+ endif -+ -+ let tag_scope = strpart(a:tag_line, end + 1) -+ let tag_scope = strpart(tag_scope, stridx(tag_scope, ':') + 1) -+ -+ return tag_scope -+endfunction -+ -+" Tlist_Refresh() -+" Refresh the taglist -+function! s:Tlist_Refresh() -+ call s:Tlist_Log_Msg('Tlist_Refresh (Skip_Refresh = ' . -+ \ s:Tlist_Skip_Refresh . ', ' . bufname('%') . ')') -+ " If we are entering the buffer from one of the taglist functions, then -+ " no need to refresh the taglist window again. -+ if s:Tlist_Skip_Refresh -+ " We still need to update the taglist menu -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(0) -+ endif -+ return -+ endif -+ -+ " If part of the winmanager plugin and not configured to process -+ " tags always and not configured to display the tags menu, then return -+ if (s:tlist_app_name == 'winmanager') && !g:Tlist_Process_File_Always -+ \ && !g:Tlist_Show_Menu -+ return -+ endif -+ -+ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help -+ if &buftype != '' -+ return -+ endif -+ -+ let filename = fnamemodify(bufname('%'), ':p') -+ let ftype = &filetype -+ -+ " If the file doesn't support tag listing, skip it -+ if s:Tlist_Skip_File(filename, ftype) -+ return -+ endif -+ -+ let tlist_win = bufwinnr(g:TagList_title) -+ -+ " If the taglist window is not opened and not configured to process -+ " tags always and not displaying the tags menu, then return -+ if tlist_win == -1 && !g:Tlist_Process_File_Always && !g:Tlist_Show_Menu -+ return -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 -+ " Check whether this file is removed based on user request -+ " If it is, then don't display the tags for this file -+ if s:Tlist_User_Removed_File(filename) -+ return -+ endif -+ -+ " If the taglist should not be auto updated, then return -+ if !g:Tlist_Auto_Update -+ return -+ endif -+ endif -+ -+ let cur_lnum = line('.') -+ -+ if fidx == -1 -+ " Update the tags for the file -+ let fidx = s:Tlist_Process_File(filename, ftype) -+ else -+ let mtime = getftime(filename) -+ if s:tlist_{fidx}_mtime != mtime -+ " Invalidate the tags listed for this file -+ let s:tlist_{fidx}_valid = 0 -+ -+ " Update the taglist and the window -+ call Tlist_Update_File(filename, ftype) -+ -+ " Store the new file modification time -+ let s:tlist_{fidx}_mtime = mtime -+ endif -+ endif -+ -+ " Update the taglist window -+ if tlist_win != -1 -+ " Disable screen updates -+ let old_lazyredraw = &lazyredraw -+ set nolazyredraw -+ -+ " Save the current window number -+ let save_winnr = winnr() -+ -+ " Goto the taglist window -+ call s:Tlist_Window_Goto_Window() -+ -+ if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter -+ " Save the cursor position -+ let save_line = line('.') -+ let save_col = col('.') -+ endif -+ -+ " Update the taglist window -+ call s:Tlist_Window_Refresh_File(filename, ftype) -+ -+ " Open the fold for the file -+ exe "silent! " . s:tlist_{fidx}_start . "," . -+ \ s:tlist_{fidx}_end . "foldopen!" -+ -+ if g:Tlist_Highlight_Tag_On_BufEnter && g:Tlist_Auto_Highlight_Tag -+ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != fidx -+ " If displaying tags for only one file in the taglist -+ " window and about to display the tags for a new file, -+ " then center the current tag line for the new file -+ let center_tag_line = 1 -+ else -+ let center_tag_line = 0 -+ endif -+ -+ " Highlight the current tag -+ call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) -+ else -+ " Restore the cursor position -+ if v:version >= 601 -+ call cursor(save_line, save_col) -+ else -+ exe save_line -+ exe 'normal! ' . save_col . '|' -+ endif -+ endif -+ -+ " Jump back to the original window -+ if save_winnr != winnr() -+ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') -+ endif -+ -+ " Restore screen updates -+ let &lazyredraw = old_lazyredraw -+ endif -+ -+ " Update the taglist menu -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(0) -+ endif -+endfunction -+ -+" Tlist_Change_Sort() -+" Change the sort order of the tag listing -+" caller == 'cmd', command used in the taglist window -+" caller == 'menu', taglist menu -+" action == 'toggle', toggle sort from name to order and vice versa -+" action == 'set', set the sort order to sort_type -+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 == 'cmd' -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ -+ " Remove the previous highlighting -+ match none -+ elseif a:caller == 'menu' -+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) -+ if fidx == -1 -+ return -+ endif -+ endif -+ -+ if a:action == 'toggle' -+ let sort_type = s:tlist_{fidx}_sort_type -+ -+ " Toggle the sort order from 'name' to 'order' and vice versa -+ if sort_type == 'name' -+ let s:tlist_{fidx}_sort_type = 'order' -+ else -+ let s:tlist_{fidx}_sort_type = 'name' -+ endif -+ else -+ let s:tlist_{fidx}_sort_type = a:sort_type -+ endif -+ -+ " Invalidate the tags listed for this file -+ let s:tlist_{fidx}_valid = 0 -+ -+ if a:caller == 'cmd' -+ " Save the current line for later restoration -+ let curline = '\V\^' . getline('.') . '\$' -+ -+ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, -+ \ s:tlist_{fidx}_filetype) -+ -+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' -+ -+ " Go back to the cursor line before the tag list is sorted -+ call search(curline, 'w') -+ -+ call s:Tlist_Menu_Update_File(1) -+ else -+ call s:Tlist_Menu_Remove_File() -+ -+ call s:Tlist_Refresh() -+ endif -+endfunction -+ -+" Tlist_Update_Current_File() -+" Update taglist for the current buffer by regenerating the tag list -+" Contributed by WEN Guopeng. -+function! s:Tlist_Update_Current_File() -+ call s:Tlist_Log_Msg('Tlist_Update_Current_File()') -+ if winnr() == bufwinnr(g:TagList_title) -+ " In the taglist window. Update the current file -+ call s:Tlist_Window_Update_File() -+ else -+ " Not in the taglist window. Update the current buffer -+ let filename = fnamemodify(bufname('%'), ':p') -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx != -1 -+ let s:tlist_{fidx}_valid = 0 -+ endif -+ call Tlist_Update_File(filename, &filetype) -+ endif -+endfunction -+ -+" Tlist_Window_Update_File() -+" 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_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ -+ " Remove the previous highlighting -+ match none -+ -+ " Save the current line for later restoration -+ let curline = '\V\^' . getline('.') . '\$' -+ -+ let s:tlist_{fidx}_valid = 0 -+ -+ " Update the taglist window -+ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, -+ \ s:tlist_{fidx}_filetype) -+ -+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' -+ -+ " Go back to the tag line before the list is updated -+ call search(curline, 'w') -+endfunction -+ -+" Tlist_Window_Get_Tag_Type_By_Linenum() -+" Return the tag type index for the specified line in the taglist window -+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 -+ " tag type start line number and the number of tags in a tag type -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{i}_name -+ let start_lnum = -+ \ s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset -+ let end = start_lnum + s:tlist_{a:fidx}_{ttype}_count -+ if a:lnum >= start_lnum && a:lnum <= end -+ break -+ endif -+ let i = i + 1 -+ endwhile -+ -+ " Current line doesn't belong to any of the displayed tag types -+ if i > s:tlist_{ftype}_count -+ return '' -+ endif -+ -+ return ttype -+endfunction -+ -+" 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 == '' -+ return 0 -+ endif -+ -+ " Compute the index into the displayed tags for the tag type -+ let ttype_lnum = s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset -+ let tidx = a:lnum - ttype_lnum -+ if tidx == 0 -+ return 0 -+ endif -+ -+ " Get the corresponding tag line and return it -+ return s:tlist_{a:fidx}_{ttype}_{tidx} -+endfunction -+ -+" Tlist_Window_Highlight_Line -+" Highlight the current line -+function! s:Tlist_Window_Highlight_Line() -+ " Clear previously selected name -+ match none -+ -+ " Highlight the current line -+ if g:Tlist_Display_Prototype == 0 -+ let pat = '/\%' . line('.') . 'l\s\+\zs.*/' -+ else -+ let pat = '/\%' . line('.') . 'l.*/' -+ endif -+ -+ exe 'match TagListTagName ' . pat -+endfunction -+ -+" 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_Window_Open_File(win_ctrl, filename, tagpat) -+ 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 == '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 -+ 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 -+ let first_usable_win = 0 -+ -+ let i = 1 -+ let bnum = winbufnr(i) -+ while bnum != -1 -+ if getwinvar(i, 'tlist_file_window') == 'yes' -+ let fwin_num = i -+ break -+ endif -+ if first_usable_win == 0 && -+ \ getbufvar(bnum, '&buftype') == '' && -+ \ !getwinvar(i, '&previewwindow') -+ " First non-taglist, non-plugin and non-preview window -+ let first_usable_win = i -+ endif -+ let i = i + 1 -+ let bnum = winbufnr(i) -+ endwhile -+ -+ " If a previously used window is not found, then use the first -+ " non-taglist window -+ if fwin_num == 0 -+ let fwin_num = first_usable_win -+ endif -+ -+ if fwin_num != 0 -+ " Jump to the file window -+ exe fwin_num . "wincmd w" -+ -+ " If the user asked to jump to the tag in a new window, then split -+ " the existing window into two. -+ if a:win_ctrl == 'newwin' -+ split -+ endif -+ exe "edit " . escape(a:filename, ' ') -+ else -+ " Open a new window -+ if g:Tlist_Use_Horiz_Window -+ exe 'leftabove split ' . escape(a:filename, ' ') -+ else -+ if winbufnr(2) == -1 -+ " Only the taglist window is present -+ if g:Tlist_Use_Right_Window -+ exe 'leftabove vertical split ' . -+ \ escape(a:filename, ' ') -+ else -+ exe 'rightbelow vertical split ' . -+ \ escape(a:filename, ' ') -+ endif -+ -+ " Go to the taglist window to change the window size to -+ " the user configured value -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ if g:Tlist_Use_Horiz_Window -+ exe 'resize ' . g:Tlist_WinHeight -+ else -+ exe 'vertical resize ' . g:Tlist_WinWidth -+ endif -+ " Go back to the file window -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ else -+ " A plugin or help window is also present -+ wincmd w -+ exe 'leftabove split ' . escape(a:filename, ' ') -+ endif -+ endif -+ endif -+ " Mark the window, so that it can be reused. -+ call s:Tlist_Window_Mark_File_Window() -+ else -+ if v:version >= 700 -+ " If the file is opened in more than one window, then check -+ " whether the last accessed window has the selected file. -+ " If it does, then use that window. -+ let lastwin_bufnum = winbufnr(winnr('#')) -+ if bufnr(a:filename) == lastwin_bufnum -+ let winnum = winnr('#') -+ endif -+ endif -+ exe winnum . 'wincmd w' -+ -+ " If the user asked to jump to the tag in a new window, then split the -+ " existing window into two. -+ if a:win_ctrl == 'newwin' -+ split -+ endif -+ endif -+ endif -+ -+ " Jump to the tag -+ if a:tagpat != '' -+ " Add the current cursor position to the jump list, so that user can -+ " jump back using the ' and ` marks. -+ mark ' -+ silent call search(a:tagpat, 'w') -+ -+ " Bring the line to the middle of the window -+ normal! z. -+ -+ " If the line is inside a fold, open the fold -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+ endif -+ -+ " If the user selects to preview the tag then jump back to the -+ " taglist window -+ if a:win_ctrl == 'preview' -+ " Go back to the taglist window -+ let winnum = bufwinnr(g:TagList_title) -+ exe winnum . 'wincmd w' -+ else -+ " 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_Window_Goto_Window() -+ close -+ -+ " Go back to the window displaying the selected file -+ let wnum = bufwinnr(a:filename) -+ if wnum != -1 && wnum != winnr() -+ call s:Tlist_Exe_Cmd_No_Acmds(wnum . 'wincmd w') -+ endif -+ endif -+ endif -+ -+ let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh -+endfunction -+ -+" Tlist_Window_Jump_To_Tag() -+" Jump to the location of the current 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(' . a:win_ctrl . ')') -+ " Do not process comment lines and empty lines -+ let curline = getline('.') -+ if curline =~ '^\s*$' || curline[0] == '"' -+ return -+ endif -+ -+ " If inside a closed fold, then use the first line of the fold -+ " and jump to the file. -+ let lnum = foldclosed('.') -+ if lnum == -1 -+ " Jump to the selected tag or file -+ let lnum = line('.') -+ else -+ " Open the closed fold -+ .foldopen! -+ endif -+ -+ 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_Window_Get_Tag_Index(fidx, lnum) -+ if tidx != 0 -+ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx) -+ -+ " Highlight the tagline -+ call s:Tlist_Window_Highlight_Line() -+ else -+ " Selected a line which is not a tag name. Just edit the file -+ let tagpat = '' -+ endif -+ -+ call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) -+endfunction -+ -+" Tlist_Window_Show_Info() -+" Display information about the entry under the cursor -+function! s:Tlist_Window_Show_Info() -+ call s:Tlist_Log_Msg('Tlist_Window_Show_Info()') -+ -+ " Clear the previously displayed line -+ echo -+ -+ " Do not process comment lines and empty lines -+ let curline = getline('.') -+ if curline =~ '^\s*$' || curline[0] == '"' -+ return -+ endif -+ -+ " If inside a fold, then don't display the prototype -+ if foldclosed('.') != -1 -+ return -+ endif -+ -+ let lnum = line('.') -+ -+ " Get the file index -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) -+ if fidx == -1 -+ return -+ endif -+ -+ if lnum == s:tlist_{fidx}_start -+ " Cursor is on a file name -+ let fname = s:tlist_{fidx}_filename -+ if strlen(fname) > 50 -+ let fname = fnamemodify(fname, ':t') -+ endif -+ echo fname . ', Filetype=' . s:tlist_{fidx}_filetype . -+ \ ', Tag count=' . s:tlist_{fidx}_tag_count -+ return -+ endif -+ -+ " Get the tag output line for the current tag -+ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) -+ if tidx == 0 -+ " Cursor is on a tag type -+ let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) -+ if ttype == '' -+ return -+ endif -+ -+ let ttype_name = '' -+ -+ let ftype = s:tlist_{fidx}_filetype -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ if ttype == s:tlist_{ftype}_{i}_name -+ let ttype_name = s:tlist_{ftype}_{i}_fullname -+ break -+ endif -+ let i = i + 1 -+ endwhile -+ -+ echo 'Tag type=' . ttype_name . -+ \ ', Tag count=' . s:tlist_{fidx}_{ttype}_count -+ return -+ endif -+ -+ " Get the tag search pattern and display it -+ echo s:Tlist_Get_Tag_Prototype(fidx, tidx) -+endfunction -+ -+" Tlist_Find_Nearest_Tag_Idx -+" Find the tag idx nearest to the supplied line number -+" Returns -1, if a tag couldn't be found for the specified line number -+function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum) -+ let sort_type = s:tlist_{a:fidx}_sort_type -+ -+ let left = 1 -+ let right = s:tlist_{a:fidx}_tag_count -+ -+ if sort_type == 'order' -+ " Tags sorted by order, use a binary search. -+ " The idea behind this function is taken from the ctags.vim script (by -+ " Alexey Marinichev) available at the Vim online website. -+ -+ " If the current line is the less than the first tag, then no need to -+ " search -+ let first_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, 1) -+ -+ if a:linenum < first_lnum -+ return -1 -+ endif -+ -+ while left < right -+ let middle = (right + left + 1) / 2 -+ let middle_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, middle) -+ -+ if middle_lnum == a:linenum -+ let left = middle -+ break -+ endif -+ -+ if middle_lnum > a:linenum -+ let right = middle - 1 -+ else -+ let left = middle -+ endif -+ endwhile -+ else -+ " Tags sorted by name, use a linear search. (contributed by Dave -+ " Eggum). -+ " Look for a tag with a line number less than or equal to the supplied -+ " line number. If multiple tags are found, then use the tag with the -+ " line number closest to the supplied line number. IOW, use the tag -+ " with the highest line number. -+ let closest_lnum = 0 -+ let final_left = 0 -+ while left <= right -+ let lnum = s:Tlist_Get_Tag_Linenum(a:fidx, left) -+ -+ if lnum < a:linenum && lnum > closest_lnum -+ let closest_lnum = lnum -+ let final_left = left -+ elseif lnum == a:linenum -+ let closest_lnum = lnum -+ let final_left = left -+ break -+ else -+ let left = left + 1 -+ endif -+ endwhile -+ if closest_lnum == 0 -+ return -1 -+ endif -+ if left >= right -+ let left = final_left -+ endif -+ endif -+ -+ return left -+endfunction -+ -+" 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_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. -+ if !g:Tlist_Auto_Highlight_Tag && a:cntx == 1 -+ return -+ endif -+ -+ if a:filename == '' -+ return -+ endif -+ -+ " 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 -+ -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx == -1 -+ return -+ endif -+ -+ " If the file is currently not displayed in the taglist window, then retrn -+ if !s:tlist_{fidx}_visible -+ return -+ endif -+ -+ " If there are no tags for this file, then no need to proceed further -+ if s:tlist_{fidx}_tag_count == 0 -+ return -+ endif -+ -+ " Ignore all autocommands -+ let old_ei = &eventignore -+ set eventignore=all -+ -+ " Save the original window number -+ let org_winnr = winnr() -+ -+ if org_winnr == winnum -+ let in_taglist_window = 1 -+ else -+ let in_taglist_window = 0 -+ endif -+ -+ " Go to the taglist window -+ if !in_taglist_window -+ exe winnum . 'wincmd w' -+ endif -+ -+ " Clear previously selected name -+ match none -+ -+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, a:cur_lnum) -+ if tidx == -1 -+ " Make sure the current tag line is visible in the taglist window. -+ " Calling the winline() function makes the line visible. Don't know -+ " of a better way to achieve this. -+ let lnum = line('.') -+ -+ if lnum < s:tlist_{fidx}_start || lnum > s:tlist_{fidx}_end -+ " Move the cursor to the beginning of the file -+ exe s:tlist_{fidx}_start -+ endif -+ -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+ -+ call winline() -+ -+ if !in_taglist_window -+ exe org_winnr . 'wincmd w' -+ endif -+ -+ " Restore the autocommands -+ let &eventignore = old_ei -+ return -+ endif -+ -+ " Extract the tag type -+ let ttype = s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) -+ -+ " Compute the line number -+ " Start of file + Start of tag type + offset -+ let lnum = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + -+ \ s:tlist_{fidx}_{tidx}_ttype_idx -+ -+ " Goto the line containing the tag -+ exe lnum -+ -+ " Open the fold -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+ -+ if a:center -+ " Move the tag line to the center of the taglist window -+ normal! z. -+ else -+ " Make sure the current tag line is visible in the taglist window. -+ " Calling the winline() function makes the line visible. Don't know -+ " of a better way to achieve this. -+ call winline() -+ endif -+ -+ " Highlight the tag name -+ call s:Tlist_Window_Highlight_Line() -+ -+ " Go back to the original window -+ if !in_taglist_window -+ exe org_winnr . 'wincmd w' -+ endif -+ -+ " Restore the autocommands -+ let &eventignore = old_ei -+ return -+endfunction -+ -+" Tlist_Get_Tag_Prototype_By_Line -+" Get the prototype for the tag on or before the specified line number in the -+" current buffer -+function! Tlist_Get_Tag_Prototype_By_Line(...) -+ if a:0 == 0 -+ " Arguments are not supplied. Use the current buffer name -+ " and line number -+ let filename = bufname('%') -+ let linenr = line('.') -+ elseif a:0 == 2 -+ " Filename and line number are specified -+ let filename = a:1 -+ let linenr = a:2 -+ if linenr !~ '\d\+' -+ " Invalid line number -+ return "" -+ endif -+ else -+ " Sufficient arguments are not supplied -+ let msg = 'Usage: Tlist_Get_Tag_Prototype_By_Line ' . -+ \ '' -+ call s:Tlist_Warning_Msg(msg) -+ return "" -+ endif -+ -+ " Expand the file to a fully qualified name -+ let filename = fnamemodify(filename, ':p') -+ if filename == '' -+ return "" -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 -+ return "" -+ endif -+ -+ " If there are no tags for this file, then no need to proceed further -+ if s:tlist_{fidx}_tag_count == 0 -+ return "" -+ endif -+ -+ " Get the tag text using the line number -+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) -+ if tidx == -1 -+ return "" -+ endif -+ -+ return s:Tlist_Get_Tag_Prototype(fidx, tidx) -+endfunction -+ -+" Tlist_Get_Tagname_By_Line -+" Get the tag name on or before the specified line number in the -+" current buffer -+function! Tlist_Get_Tagname_By_Line(...) -+ if a:0 == 0 -+ " Arguments are not supplied. Use the current buffer name -+ " and line number -+ let filename = bufname('%') -+ let linenr = line('.') -+ elseif a:0 == 2 -+ " Filename and line number are specified -+ let filename = a:1 -+ let linenr = a:2 -+ if linenr !~ '\d\+' -+ " Invalid line number -+ return "" -+ endif -+ else -+ " Sufficient arguments are not supplied -+ let msg = 'Usage: Tlist_Get_Tagname_By_Line ' -+ call s:Tlist_Warning_Msg(msg) -+ return "" -+ endif -+ -+ " Make sure the current file has a name -+ let filename = fnamemodify(filename, ':p') -+ if filename == '' -+ return "" -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 -+ return "" -+ endif -+ -+ " If there are no tags for this file, then no need to proceed further -+ if s:tlist_{fidx}_tag_count == 0 -+ return "" -+ endif -+ -+ " Get the tag name using the line number -+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) -+ if tidx == -1 -+ return "" -+ endif -+ -+ return s:tlist_{fidx}_{tidx}_tag_name -+endfunction -+ -+" 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_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 -+ if a:dir == -1 -+ normal! zk -+ else -+ " While moving down to the start of the next fold, -+ " no need to do go to the start of the next file. -+ normal! zj -+ return -+ endif -+ endif -+ -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ -+ let cur_lnum = line('.') -+ -+ if a:dir == -1 -+ if cur_lnum > s:tlist_{fidx}_start -+ " Move to the beginning of the current file -+ exe s:tlist_{fidx}_start -+ return -+ endif -+ -+ 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 -+ -+ 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 -+ " Cursor is at the last file, wrap around to the first file -+ let fidx = 0 -+ endif -+ -+ if s:tlist_{fidx}_start != 0 -+ exe s:tlist_{fidx}_start -+ endif -+ return -+ endif -+endfunction -+ -+" Tlist_Session_Load -+" Load a taglist session (information about all the displayed files -+" and the tags) from the specified file -+function! s:Tlist_Session_Load(...) -+ if a:0 == 0 || a:1 == '' -+ call s:Tlist_Warning_Msg('Usage: TlistSessionLoad ') -+ return -+ endif -+ -+ let sessionfile = a:1 -+ -+ if !filereadable(sessionfile) -+ let msg = 'Taglist: Error - Unable to open file ' . sessionfile -+ call s:Tlist_Warning_Msg(msg) -+ return -+ endif -+ -+ " Mark the current window as the file window -+ call s:Tlist_Window_Mark_File_Window() -+ -+ " Source the session file -+ exe 'source ' . sessionfile -+ -+ let new_file_count = g:tlist_file_count -+ unlet! g:tlist_file_count -+ -+ let i = 0 -+ while i < new_file_count -+ let ftype = g:tlist_{i}_filetype -+ unlet! g:tlist_{i}_filetype -+ -+ if !exists('s:tlist_' . ftype . '_count') -+ if s:Tlist_FileType_Init(ftype) == 0 -+ let i = i + 1 -+ continue -+ endif -+ endif -+ -+ let fname = g:tlist_{i}_filename -+ unlet! g:tlist_{i}_filename -+ -+ let fidx = s:Tlist_Get_File_Index(fname) -+ if fidx != -1 -+ let s:tlist_{fidx}_visible = 0 -+ let i = i + 1 -+ continue -+ else -+ " As we are loading the tags from the session file, if this -+ " file was previously deleted by the user, now we need to -+ " add it back. So remove the file from the deleted list. -+ call s:Tlist_Update_Remove_List(fname, 0) -+ endif -+ -+ let fidx = s:Tlist_Init_File(fname, ftype) -+ -+ let s:tlist_{fidx}_filename = fname -+ -+ let s:tlist_{fidx}_sort_type = g:tlist_{i}_sort_type -+ unlet! g:tlist_{i}_sort_type -+ -+ let s:tlist_{fidx}_filetype = ftype -+ let s:tlist_{fidx}_mtime = getftime(fname) -+ -+ let s:tlist_{fidx}_start = 0 -+ let s:tlist_{fidx}_end = 0 -+ -+ let s:tlist_{fidx}_valid = 1 -+ -+ let s:tlist_{fidx}_tag_count = g:tlist_{i}_tag_count -+ unlet! g:tlist_{i}_tag_count -+ -+ let j = 1 -+ while j <= s:tlist_{fidx}_tag_count -+ let s:tlist_{fidx}_{j}_tag = g:tlist_{i}_{j}_tag -+ let s:tlist_{fidx}_{j}_tag_name = g:tlist_{i}_{j}_tag_name -+ let s:tlist_{fidx}_{j}_ttype_idx = g:tlist_{i}_{j}_ttype_idx -+ unlet! g:tlist_{i}_{j}_tag -+ unlet! g:tlist_{i}_{j}_tag_name -+ unlet! g:tlist_{i}_{j}_ttype_idx -+ let j = j + 1 -+ endwhile -+ -+ let j = 1 -+ while j <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{j}_name -+ -+ if exists('g:tlist_' . i . '_' . ttype) -+ let s:tlist_{fidx}_{ttype} = g:tlist_{i}_{ttype} -+ unlet! g:tlist_{i}_{ttype} -+ let s:tlist_{fidx}_{ttype}_offset = 0 -+ let s:tlist_{fidx}_{ttype}_count = g:tlist_{i}_{ttype}_count -+ unlet! g:tlist_{i}_{ttype}_count -+ -+ let k = 1 -+ while k <= s:tlist_{fidx}_{ttype}_count -+ let s:tlist_{fidx}_{ttype}_{k} = g:tlist_{i}_{ttype}_{k} -+ unlet! g:tlist_{i}_{ttype}_{k} -+ let k = k + 1 -+ endwhile -+ else -+ let s:tlist_{fidx}_{ttype} = '' -+ let s:tlist_{fidx}_{ttype}_offset = 0 -+ let s:tlist_{fidx}_{ttype}_count = 0 -+ endif -+ -+ let j = j + 1 -+ endwhile -+ -+ let i = i + 1 -+ endwhile -+ -+ " If the taglist window is open, then update it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ let save_winnr = winnr() -+ -+ " Goto the taglist window -+ call s:Tlist_Window_Goto_Window() -+ -+ " Refresh the taglist window -+ call s:Tlist_Window_Refresh() -+ -+ " Go back to the original window -+ if save_winnr != winnr() -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ endif -+ endif -+endfunction -+ -+" Tlist_Session_Save -+" Save a taglist session (information about all the displayed files -+" and the tags) into the specified file -+function! s:Tlist_Session_Save(...) -+ if a:0 == 0 || a:1 == '' -+ call s:Tlist_Warning_Msg('Usage: TlistSessionSave ') -+ return -+ endif -+ -+ let sessionfile = a:1 -+ -+ if s:tlist_file_count == 0 -+ " There is nothing to save -+ call s:Tlist_Warning_Msg('Warning: Taglist is empty. Nothing to save.') -+ return -+ endif -+ -+ if filereadable(sessionfile) -+ let ans = input('Do you want to overwrite ' . sessionfile . ' (Y/N)?') -+ if ans !=? 'y' -+ return -+ endif -+ -+ echo "\n" -+ endif -+ -+ let old_verbose = &verbose -+ set verbose&vim -+ -+ exe 'redir! > ' . sessionfile -+ -+ silent! echo '" Taglist session file. This file is auto-generated.' -+ silent! echo '" File information' -+ silent! echo 'let tlist_file_count = ' . s:tlist_file_count -+ -+ let i = 0 -+ -+ while i < s:tlist_file_count -+ " Store information about the file -+ silent! echo 'let tlist_' . i . "_filename = '" . -+ \ s:tlist_{i}_filename . "'" -+ silent! echo 'let tlist_' . i . '_sort_type = "' . -+ \ s:tlist_{i}_sort_type . '"' -+ silent! echo 'let tlist_' . i . '_filetype = "' . -+ \ s:tlist_{i}_filetype . '"' -+ silent! echo 'let tlist_' . i . '_tag_count = ' . -+ \ s:tlist_{i}_tag_count -+ " Store information about all the tags -+ let j = 1 -+ while j <= s:tlist_{i}_tag_count -+ let txt = escape(s:tlist_{i}_{j}_tag, '"\\') -+ silent! echo 'let tlist_' . i . '_' . j . '_tag = "' . txt . '"' -+ silent! echo 'let tlist_' . i . '_' . j . '_tag_name = "' . -+ \ s:tlist_{i}_{j}_tag_name . '"' -+ silent! echo 'let tlist_' . i . '_' . j . '_ttype_idx' . ' = ' . -+ \ s:tlist_{i}_{j}_ttype_idx -+ let j = j + 1 -+ endwhile -+ -+ " Store information about all the tags grouped by their type -+ let ftype = s:tlist_{i}_filetype -+ let j = 1 -+ while j <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{j}_name -+ if s:tlist_{i}_{ttype}_count != 0 -+ let txt = substitute(s:tlist_{i}_{ttype}, "\n", "\\\\n", 'g') -+ silent! echo 'let tlist_' . i . '_' . ttype . ' = "' . -+ \ txt . '"' -+ silent! echo 'let tlist_' . i . '_' . ttype . '_count = ' . -+ \ s:tlist_{i}_{ttype}_count -+ let k = 1 -+ while k <= s:tlist_{i}_{ttype}_count -+ silent! echo 'let tlist_' . i . '_' . ttype . '_' . k . -+ \ ' = ' . s:tlist_{i}_{ttype}_{k} -+ let k = k + 1 -+ endwhile -+ endif -+ let j = j + 1 -+ endwhile -+ -+ silent! echo -+ -+ let i = i + 1 -+ endwhile -+ -+ redir END -+ -+ let &verbose = old_verbose -+endfunction -+ -+" Tlist_Buffer_Removed -+" 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 . ')') -+ -+ " Make sure a valid filename is supplied -+ if a:filename == '' -+ return -+ endif -+ -+ " Get tag list index of the specified file -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx == -1 -+ " File not present in the taglist -+ return -+ endif -+ -+ " Remove the file from the list -+ call s:Tlist_Remove_File(fidx, 0) -+endfunction -+ -+" When a buffer is deleted, remove the file from the taglist -+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(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) -+ if winnum == -1 -+ call s:Tlist_Warning_Msg('Taglist: Error - Taglist window is not open') -+ return -+ endif -+ -+ " Save the original window number -+ let org_winnr = winnr() -+ if org_winnr == winnum -+ let in_taglist_window = 1 -+ else -+ let in_taglist_window = 0 -+ endif -+ -+ if in_taglist_window -+ " When entering the taglist window, no need to update the folds -+ return -+ endif -+ -+ " Go to the taglist window -+ if !in_taglist_window -+ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') -+ endif -+ -+ " Close all the folds -+ silent! %foldclose -+ -+ " Get tag list index of the specified file -+ 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 -+ if !in_taglist_window -+ call s:Tlist_Exe_Cmd_No_Acmds(org_winnr . 'wincmd w') -+ endif -+endfunction -+ -+" 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_Window_Check_Auto_Open() -+ let open_window = 0 -+ -+ let i = 1 -+ let buf_num = winbufnr(i) -+ while buf_num != -1 -+ let filename = fnamemodify(bufname(buf_num), ':p') -+ if !s:Tlist_Skip_File(filename, getbufvar(buf_num, '&filetype')) -+ let open_window = 1 -+ break -+ endif -+ let i = i + 1 -+ let buf_num = winbufnr(i) -+ endwhile -+ -+ if open_window -+ call s:Tlist_Window_Toggle() -+ endif -+endfunction -+ -+function! s:Tlist_Menu_Add_Base_Menu() -+ call s:Tlist_Log_Msg('Adding the base menu') -+ -+ " Add the menu -+ anoremenu T&ags.Refresh\ menu :call Tlist_Menu_Refresh() -+ anoremenu T&ags.Sort\ menu\ by.Name -+ \ :call Tlist_Change_Sort('menu', 'set', 'name') -+ anoremenu T&ags.Sort\ menu\ by.Order -+ \ :call Tlist_Change_Sort('menu', 'set', 'order') -+ anoremenu T&ags.-SEP1- : -+ -+ if &mousemodel =~ 'popup' -+ anoremenu PopUp.T&ags.Refresh\ menu -+ \ :call Tlist_Menu_Refresh() -+ anoremenu PopUp.T&ags.Sort\ menu\ by.Name -+ \ :call Tlist_Change_Sort('menu', 'set', 'name') -+ anoremenu PopUp.T&ags.Sort\ menu\ by.Order -+ \ :call Tlist_Change_Sort('menu', 'set', 'order') -+ anoremenu PopUp.T&ags.-SEP1- : -+ endif -+endfunction -+ -+let s:menu_char_prefix = -+ \ '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' -+ -+" Tlist_Menu_Get_Tag_Type_Cmd -+" Get the menu command for the specified tag type -+" 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 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 -+ -+ " Number of tag entries for this tag type -+ let tcnt = s:tlist_{fidx_ttype}_count -+ if tcnt == 0 " No entries for this tag type -+ return '' -+ endif -+ -+ let mcmd = '' -+ -+ " Create the menu items for the tags. -+ " Depending on the number of tags of this type, split the menu into -+ " multiple sub-menus, if needed. -+ if tcnt > g:Tlist_Max_Submenu_Items -+ let j = 1 -+ while j <= tcnt -+ let final_index = j + g:Tlist_Max_Submenu_Items - 1 -+ if final_index > tcnt -+ let final_index = tcnt -+ endif -+ -+ " Extract the first and last tag name and form the -+ " sub-menu name -+ let tidx = s:tlist_{fidx_ttype}_{j} -+ let first_tag = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ let tidx = s:tlist_{fidx_ttype}_{final_index} -+ let last_tag = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ " Truncate the names, if they are greater than the -+ " max length -+ let first_tag = strpart(first_tag, 0, g:Tlist_Max_Tag_Length) -+ let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length) -+ -+ " Form the menu command prefix -+ 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 -+ -+ while j <= final_index -+ let tidx = s:tlist_{fidx_ttype}_{j} -+ -+ let tname = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ let mcmd = mcmd . m_prefix . '\&' . -+ \ s:menu_char_prefix[m_prefix_idx] . '\.' . -+ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . -+ \ tidx . ')|' -+ -+ let m_prefix_idx = m_prefix_idx + 1 -+ let j = j + 1 -+ endwhile -+ endwhile -+ else -+ " Character prefix used to number the menu items (hotkey) -+ let m_prefix_idx = 0 -+ -+ 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} -+ -+ let tname = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ let mcmd = mcmd . m_prefix . '\&' . -+ \ s:menu_char_prefix[m_prefix_idx] . '\.' . -+ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . tidx -+ \ . ')|' -+ -+ let m_prefix_idx = m_prefix_idx + 1 -+ let j = j + 1 -+ endwhile -+ endif -+ -+ return mcmd -+endfunction -+ -+" Update the taglist menu with the tags for the specified file -+function! s:Tlist_Menu_File_Refresh(fidx) -+ call s:Tlist_Log_Msg('Refreshing the tag menu for ' . s:tlist_{a:fidx}_filename) -+ " The 'B' flag is needed in the 'cpoptions' option -+ let old_cpoptions = &cpoptions -+ set cpoptions&vim -+ -+ exe s:tlist_{a:fidx}_menu_cmd -+ -+ " Update the popup menu (if enabled) -+ if &mousemodel =~ 'popup' -+ let cmd = substitute(s:tlist_{a:fidx}_menu_cmd, ' T\\&ags\.', -+ \ ' PopUp.T\\\&ags.', "g") -+ exe cmd -+ endif -+ -+ " The taglist menu is not empty now -+ let s:tlist_menu_empty = 0 -+ -+ " Restore the 'cpoptions' settings -+ let &cpoptions = old_cpoptions -+endfunction -+ -+" Tlist_Menu_Update_File -+" Add the taglist menu -+function! s:Tlist_Menu_Update_File(clear_menu) -+ if !has('gui_running') -+ " Not running in GUI mode -+ return -+ endif -+ -+ call s:Tlist_Log_Msg('Updating the tag menu, clear_menu = ' . a:clear_menu) -+ -+ " Remove the tags menu -+ if a:clear_menu -+ call s:Tlist_Menu_Remove_File() -+ -+ endif -+ -+ let fname = escape(fnamemodify(bufname('%'), ':t'), '.') -+ if fname != '' -+ exe 'anoremenu T&ags.' . fname . ' ' -+ anoremenu T&ags.-SEP2- : -+ endif -+ -+ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help -+ if &buftype != '' -+ return -+ endif -+ -+ let filename = fnamemodify(bufname('%'), ':p') -+ let ftype = &filetype -+ -+ " If the file doesn't support tag listing, skip it -+ if s:Tlist_Skip_File(filename, ftype) -+ return -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 || !s:tlist_{fidx}_valid -+ " Check whether this file is removed based on user request -+ " If it is, then don't display the tags for this file -+ if s:Tlist_User_Removed_File(filename) -+ return -+ endif -+ -+ " Process the tags for the file -+ let fidx = s:Tlist_Process_File(filename, ftype) -+ if fidx == -1 -+ return -+ endif -+ endif -+ -+ if !s:tlist_{fidx}_tag_count -+ return -+ endif -+ -+ if s:tlist_{fidx}_menu_cmd != '' -+ " Update the menu with the cached command -+ call s:Tlist_Menu_File_Refresh(fidx) -+ -+ return -+ endif -+ -+ " We are going to add entries to the tags menu, so the menu won't be -+ " empty -+ let s:tlist_menu_empty = 0 -+ -+ 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, add_ttype_name, i) -+ if mcmd != '' -+ let cmd = cmd . mcmd -+ endif -+ -+ let i = i + 1 -+ endwhile -+ -+ " Cache the menu command for reuse -+ let s:tlist_{fidx}_menu_cmd = cmd -+ -+ " Update the menu -+ call s:Tlist_Menu_File_Refresh(fidx) -+endfunction -+ -+" Tlist_Menu_Remove_File -+" Remove the tags displayed in the tags menu -+function! s:Tlist_Menu_Remove_File() -+ if !has('gui_running') || s:tlist_menu_empty -+ return -+ endif -+ -+ call s:Tlist_Log_Msg('Removing the tags menu for a file') -+ -+ " Cleanup the Tags menu -+ silent! unmenu T&ags -+ if &mousemodel =~ 'popup' -+ silent! unmenu PopUp.T&ags -+ endif -+ -+ " Add a dummy menu item to retain teared off menu -+ noremenu T&ags.Dummy l -+ -+ silent! unmenu! T&ags -+ if &mousemodel =~ 'popup' -+ silent! unmenu! PopUp.T&ags -+ endif -+ -+ call s:Tlist_Menu_Add_Base_Menu() -+ -+ " Remove the dummy menu item -+ unmenu T&ags.Dummy -+ -+ let s:tlist_menu_empty = 1 -+endfunction -+ -+" Tlist_Menu_Refresh -+" Refresh the taglist menu -+function! s:Tlist_Menu_Refresh() -+ call s:Tlist_Log_Msg('Refreshing the tags menu') -+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) -+ if fidx != -1 -+ " Invalidate the cached menu command -+ let s:tlist_{fidx}_menu_cmd = '' -+ endif -+ -+ " Update the taglist, menu and window -+ call s:Tlist_Update_Current_File() -+endfunction -+ -+" Tlist_Menu_Jump_To_Tag -+" Jump to the selected tag -+function! s:Tlist_Menu_Jump_To_Tag(tidx) -+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) -+ if fidx == -1 -+ return -+ endif -+ -+ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, a:tidx) -+ if tagpat == '' -+ return -+ endif -+ -+ " Add the current cursor position to the jump list, so that user can -+ " jump back using the ' and ` marks. -+ mark ' -+ -+ silent call search(tagpat, 'w') -+ -+ " Bring the line to the middle of the window -+ normal! z. -+ -+ " If the line is inside a fold, open the fold -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+endfunction -+ -+" Tlist_Menu_Init -+" Initialize the taglist menu -+function! s:Tlist_Menu_Init() -+ call s:Tlist_Menu_Add_Base_Menu() -+ -+ " Automatically add the tags defined in the current file to the menu -+ augroup TagListMenuCmds -+ autocmd! -+ -+ if !g:Tlist_Process_File_Always -+ autocmd BufEnter * call s:Tlist_Refresh() -+ endif -+ autocmd BufLeave * call s:Tlist_Menu_Remove_File() -+ augroup end -+ -+ call s:Tlist_Menu_Update_File(0) -+endfunction -+ -+" Tlist_Vim_Session_Load -+" Initialize the taglist window/buffer, which is created when loading -+" a Vim session file. -+function! s:Tlist_Vim_Session_Load() -+ call s:Tlist_Log_Msg('Tlist_Vim_Session_Load') -+ -+ " Initialize the taglist window -+ call s:Tlist_Window_Init() -+ -+ " Refresh the taglist window -+ call s:Tlist_Window_Refresh() -+endfunction -+ -+" Tlist_Set_App -+" Set the name of the external plugin/application to which taglist -+" belongs. -+" Taglist plugin is part of another plugin like cream or winmanager. -+function! Tlist_Set_App(name) -+ if a:name == "" -+ return -+ endif -+ -+ let s:tlist_app_name = a:name -+endfunction -+ -+" Winmanager integration -+ -+" Initialization required for integration with winmanager -+function! TagList_Start() -+ " If current buffer is not taglist buffer, then don't proceed -+ if bufname('%') != '__Tag_List__' -+ return -+ endif -+ -+ call Tlist_Set_App('winmanager') -+ -+ " Get the current filename from the winmanager plugin -+ let bufnum = WinManagerGetLastEditedFile() -+ if bufnum != -1 -+ let filename = fnamemodify(bufname(bufnum), ':p') -+ let ftype = getbufvar(bufnum, '&filetype') -+ endif -+ -+ " Initialize the taglist window, if it is not already initialized -+ if !exists('s:tlist_window_initialized') || !s:tlist_window_initialized -+ call s:Tlist_Window_Init() -+ call s:Tlist_Window_Refresh() -+ let s:tlist_window_initialized = 1 -+ endif -+ -+ " Update the taglist window -+ if bufnum != -1 -+ if !s:Tlist_Skip_File(filename, ftype) && g:Tlist_Auto_Update -+ call s:Tlist_Window_Refresh_File(filename, ftype) -+ endif -+ endif -+endfunction -+ -+function! TagList_IsValid() -+ return 0 -+endfunction -+ -+function! TagList_WrapUp() -+ return 0 -+endfunction -+ -+" restore 'cpo' -+let &cpo = s:cpo_save -+unlet s:cpo_save -+ -diff -urN vim71/1/plugin/taglist.vim vim71_ada/1/plugin/taglist.vim ---- vim71/1/plugin/taglist.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/plugin/taglist.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,4524 @@ -+" File: taglist.vim -+" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) -+" 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 -+" 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. -+" -+" 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 -+" you to efficiently browse through source code files for different -+" programming languages. You can visit the taglist plugin home page for more -+" information: -+" -+" http://vim-taglist.sourceforge.net -+" -+" You can subscribe to the taglist mailing list to post your questions -+" or suggestions for improvement or to report bugs. Visit the following -+" page for subscribing to the mailing list: -+" -+" http://groups.yahoo.com/group/taglist/ -+" -+" For more information about using this plugin, after installing the -+" taglist plugin, use the ":help taglist" command. -+" -+" Installation -+" ------------ -+" 1. Download the taglist.zip file and unzip the files to the $HOME/.vim -+" or the $HOME/vimfiles or the $VIM/vimfiles directory. This should -+" unzip the following two files (the directory structure should be -+" preserved): -+" -+" 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. -+" 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. -+" 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 -+" utility (not to the directory) in the .vimrc file. -+" 4. If you are running a terminal/console version of Vim and the -+" terminal doesn't support changing the window width then set the -+" 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. -+" 5. Restart Vim. -+" 6. You can now use the ":TlistToggle" command to open/close the taglist -+" window. You can use the ":help taglist" command to get more -+" information about using the taglist plugin. -+" -+" ****************** Do not modify after this line ************************ -+ -+" Line continuation used here -+let s:cpo_save = &cpo -+set cpo&vim -+ -+if !exists('loaded_taglist') -+ " First time loading the taglist plugin -+ " -+ " To speed up the loading of Vim, the taglist plugin uses autoload -+ " mechanism to load the taglist functions. -+ " Only define the configuration variables, user commands and some -+ " auto-commands and finish sourcing the file -+ -+ " The taglist plugin requires the built-in Vim system() function. If this -+ " function is not available, then don't load the plugin. -+ if !exists('*system') -+ echomsg 'Taglist: Vim system() built-in function is not available. ' . -+ \ 'Plugin is not loaded.' -+ let loaded_taglist = 'no' -+ let &cpo = s:cpo_save -+ finish -+ endif -+ -+ " Location of the exuberant ctags tool -+ if !exists('Tlist_Ctags_Cmd') -+ if executable('exuberant-ctags') -+ " On Debian Linux, exuberant ctags is installed -+ " as exuberant-ctags -+ let Tlist_Ctags_Cmd = 'exuberant-ctags' -+ elseif executable(' exctags') -+ " On Free-BSD, exuberant ctags is installed as exctags -+ let Tlist_Ctags_ Cmd = 'exctags' -+ elseif executable('ctags') -+ let Tlist_Ctags_Cmd = 'ctags' -+ elseif executable('ctags.exe') -+ let Tlist_Ctags_Cmd = 'ctags.exe' -+ elseif executable('tags') -+ let Tlist_Ctags_Cmd = 'tags' -+ else -+ echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . -+ \ 'not found in PATH. Plugin is not loaded.' -+ " Skip loading the plugin -+ let loaded_taglist = 'no' -+ let &cpo = s:cpo_save -+ finish -+ endif -+ endif -+ -+ -+ " Automatically open the taglist window on Vim startup -+ if !exists('Tlist_Auto_Open') -+ 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 -+ endif -+ -+ if !exists('Tlist_Show_Menu') -+ let Tlist_Show_Menu = 0 -+ endif -+ -+ " Tag listing sort type - 'name' or 'order' -+ if !exists('Tlist_Sort_Type') -+ let Tlist_Sort_Type = 'order' -+ endif -+ -+ " Tag listing window split (horizontal/vertical) control -+ if !exists('Tlist_Use_Horiz_Window') -+ let Tlist_Use_Horiz_Window = 0 -+ endif -+ -+ " Open the vertically split taglist window on the left or on the right -+ " side. This setting is relevant only if Tlist_Use_Horiz_Window is set to -+ " zero (i.e. only for vertically split windows) -+ if !exists('Tlist_Use_Right_Window') -+ let Tlist_Use_Right_Window = 0 -+ endif -+ -+ " Increase Vim window width to display vertically split taglist window. -+ " For MS-Windows version of Vim running in a MS-DOS window, this must be -+ " set to 0 otherwise the system may hang due to a Vim limitation. -+ if !exists('Tlist_Inc_Winwidth') -+ if (has('win16') || has('win95')) && !has('gui_running') -+ let Tlist_Inc_Winwidth = 0 -+ else -+ let Tlist_Inc_Winwidth = 1 -+ endif -+ endif -+ -+ " Vertically split taglist window width setting -+ if !exists('Tlist_WinWidth') -+ let Tlist_WinWidth = 30 -+ endif -+ -+ " Horizontally split taglist window height setting -+ if !exists('Tlist_WinHeight') -+ let Tlist_WinHeight = 10 -+ endif -+ -+ " Display tag prototypes or tag names in the taglist window -+ if !exists('Tlist_Display_Prototype') -+ let Tlist_Display_Prototype = 0 -+ endif -+ -+ " Display tag scopes in the taglist window -+ if !exists('Tlist_Display_Tag_Scope') -+ let Tlist_Display_Tag_Scope = 1 -+ endif -+ -+ " Use single left mouse click to jump to a tag. By default this is disabled. -+ " Only double click using the mouse will be processed. -+ if !exists('Tlist_Use_SingleClick') -+ let Tlist_Use_SingleClick = 0 -+ endif -+ -+ " Control whether additional help is displayed as part of the taglist or -+ " not. Also, controls whether empty lines are used to separate the tag -+ " tree. -+ if !exists('Tlist_Compact_Format') -+ let Tlist_Compact_Format = 0 -+ endif -+ -+ " Exit Vim if only the taglist window is currently open. By default, this is -+ " set to zero. -+ if !exists('Tlist_Exit_OnlyWindow') -+ let Tlist_Exit_OnlyWindow = 0 -+ endif -+ -+ " Automatically close the folds for the non-active files in the taglist -+ " window -+ if !exists('Tlist_File_Fold_Auto_Close') -+ let Tlist_File_Fold_Auto_Close = 0 -+ endif -+ -+ " Close the taglist window when a tag is selected -+ if !exists('Tlist_Close_On_Select') -+ let Tlist_Close_On_Select = 0 -+ endif -+ -+ " Automatically update the taglist window to display tags for newly -+ " edited files -+ if !exists('Tlist_Auto_Update') -+ let Tlist_Auto_Update = 1 -+ endif -+ -+ " Automatically highlight the current tag -+ if !exists('Tlist_Auto_Highlight_Tag') -+ let Tlist_Auto_Highlight_Tag = 1 -+ endif -+ -+ " Automatically highlight the current tag on entering a buffer -+ if !exists('Tlist_Highlight_Tag_On_BufEnter') -+ let Tlist_Highlight_Tag_On_BufEnter = 1 -+ endif -+ -+ " Enable fold column to display the folding for the tag tree -+ if !exists('Tlist_Enable_Fold_Column') -+ let Tlist_Enable_Fold_Column = 1 -+ endif -+ -+ " Display the tags for only one file in the taglist window -+ if !exists('Tlist_Show_One_File') -+ let Tlist_Show_One_File = 0 -+ endif -+ -+ if !exists('Tlist_Max_Submenu_Items') -+ let Tlist_Max_Submenu_Items = 20 -+ endif -+ -+ if !exists('Tlist_Max_Tag_Length') -+ let Tlist_Max_Tag_Length = 10 -+ endif -+ -+ " Do not change the name of the taglist title variable. The winmanager -+ " plugin relies on this name to determine the title for the taglist -+ " plugin. -+ let TagList_title = "__Tag_List__" -+ -+ " Taglist debug messages -+ let s:tlist_msg = '' -+ -+ " Define the taglist autocommand to automatically open the taglist window -+ " on Vim startup -+ if g:Tlist_Auto_Open -+ autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open() -+ endif -+ -+ " Refresh the taglist -+ if g:Tlist_Process_File_Always -+ autocmd BufEnter * call s:Tlist_Refresh() -+ endif -+ -+ if g:Tlist_Show_Menu -+ autocmd GUIEnter * call s:Tlist_Menu_Init() -+ endif -+ -+ " When the taglist buffer is created when loading a Vim session file, -+ " the taglist buffer needs to be initialized. The BufFilePost event -+ " is used to handle this case. -+ autocmd BufFilePost __Tag_List__ call s:Tlist_Vim_Session_Load() -+ -+ " Define the user commands to manage the taglist window -+ command! -nargs=0 -bar TlistToggle call s:Tlist_Window_Toggle() -+ command! -nargs=0 -bar TlistOpen call s:Tlist_Window_Open() -+ " For backwards compatiblity define the Tlist command -+ command! -nargs=0 -bar Tlist TlistToggle -+ command! -nargs=+ -complete=file TlistAddFiles -+ \ call s:Tlist_Add_Files() -+ command! -nargs=+ -complete=dir TlistAddFilesRecursive -+ \ call s:Tlist_Add_Files_Recursive() -+ command! -nargs=0 -bar TlistClose call s:Tlist_Window_Close() -+ command! -nargs=0 -bar TlistUpdate call s:Tlist_Update_Current_File() -+ command! -nargs=0 -bar TlistHighlightTag call s:Tlist_Window_Highlight_Tag( -+ \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1) -+ " For backwards compatiblity define the TlistSync command -+ command! -nargs=0 -bar TlistSync TlistHighlightTag -+ command! -nargs=* -complete=buffer TlistShowPrototype -+ \ echo Tlist_Get_Tag_Prototype_By_Line() -+ command! -nargs=* -complete=buffer TlistShowTag -+ \ echo Tlist_Get_Tagname_By_Line() -+ command! -nargs=* -complete=file TlistSessionLoad -+ \ call s:Tlist_Session_Load() -+ command! -nargs=* -complete=file TlistSessionSave -+ \ call s:Tlist_Session_Save() -+ command! -bar TlistLock let Tlist_Auto_Update=0 -+ command! -bar TlistUnlock let Tlist_Auto_Update=1 -+ -+ " Commands for enabling/disabling debug and to display debug messages -+ command! -nargs=? -complete=file -bar TlistDebug -+ \ call s:Tlist_Debug_Enable() -+ command! -nargs=0 -bar TlistUndebug call s:Tlist_Debug_Disable() -+ command! -nargs=0 -bar TlistMessages call s:Tlist_Debug_Show() -+ -+ " Define autocommands to autoload the taglist plugin when needed. -+ -+ " Trick to get the current script ID -+ map xx xx -+ let s:tlist_sid = substitute(maparg('xx'), '\(\d\+_\)xx$', -+ \ '\1', '') -+ unmap xx -+ -+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Window_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Menu_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined Tlist_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined TagList_* source ' . -+ \ escape(expand(''), ' ') -+ -+ let loaded_taglist = 'fast_load_done' -+ -+ if g:Tlist_Show_Menu && has('gui_running') -+ call s:Tlist_Menu_Init() -+ endif -+ -+ " restore 'cpo' -+ let &cpo = s:cpo_save -+ finish -+endif -+ -+if !exists('s:tlist_sid') -+ " Two or more versions of taglist plugin are installed. Don't -+ " load this version of the plugin. -+ finish -+endif -+ -+unlet! s:tlist_sid -+ -+if loaded_taglist != 'fast_load_done' -+ " restore 'cpo' -+ let &cpo = s:cpo_save -+ finish -+endif -+ -+" Taglist plugin functionality is available -+let loaded_taglist = 'available' -+ -+"------------------- end of user configurable options -------------------- -+ -+" Default language specific settings for supported file types and tag types -+" -+" Variable name format: -+" -+" s:tlist_def_{vim_ftype}_settings -+" -+" vim_ftype - Filetype detected by Vim -+" -+" Value format: -+" -+" ;:;:;... -+" -+" ctags_ftype - File type supported by exuberant ctags -+" flag - Flag supported by exuberant ctags to generate a tag type -+" name - Name of the tag type used in the taglist window to display the -+" tags of this type -+" -+ -+" Ada language -+let s:tlist_def_ada_settings = 'ada;' . -+ \ 'P:package spec;' . -+ \ 'p:package body;' . -+ \ 'T:type spec;' . -+ \ 't:type;' . -+ \ 'U:subtype spec;' . -+ \ 'u:subtype;' . -+ \ 'c:component;' . -+ \ 'l:literal;' . -+ \ 'V:variable spec;' . -+ \ 'v:variable;' . -+ \ 'f:formal;' . -+ \ 'n:constant;' . -+ \ 'x:exception;' . -+ \ 'R:subprogram spec;' . -+ \ 'r:subprogram body;' . -+ \ 'K:task spec;' . -+ \ 'k:task body;' . -+ \ 'O:protected spec;' . -+ \ 'o:protected body;' . -+ \ 'E:entry spec;' . -+ \ 'e:entry body;' . -+ \ 'b:label;' . -+ \ 'i:identifier;' . -+ \ 'a:autovar;' . -+ \ 'y:annon' -+ -+" assembly language -+let s:tlist_def_asm_settings = 'asm;d:define;l:label;m:macro;t:type' -+ -+" aspperl language -+let s:tlist_def_aspperl_settings = 'asp;f:function;s:sub;v:variable' -+ -+" aspvbs language -+let s:tlist_def_aspvbs_settings = 'asp;f:function;s:sub;v:variable' -+ -+" awk language -+let s:tlist_def_awk_settings = 'awk;f:function' -+ -+" beta language -+let s:tlist_def_beta_settings = 'beta;f:fragment;s:slot;v:pattern' -+ -+" c language -+let s:tlist_def_c_settings = 'c;d:macro;g:enum;s:struct;u:union;t:typedef;' . -+ \ 'v:variable;f:function' -+ -+" c++ language -+let s:tlist_def_cpp_settings = 'c++;n:namespace;v:variable;d:macro;t:typedef;' . -+ \ 'c:class;g:enum;s:struct;u:union;f:function' -+ -+" c# language -+let s:tlist_def_cs_settings = 'c#;d:macro;t:typedef;n:namespace;c:class;' . -+ \ 'E:event;g:enum;s:struct;i:interface;' . -+ \ 'p:properties;m:method' -+ -+" cobol language -+let s:tlist_def_cobol_settings = 'cobol;d:data;f:file;g:group;p:paragraph;' . -+ \ 'P:program;s:section' -+ -+" eiffel language -+let s:tlist_def_eiffel_settings = 'eiffel;c:class;f:feature' -+ -+" erlang language -+let s:tlist_def_erlang_settings = 'erlang;d:macro;r:record;m:module;f:function' -+ -+" expect (same as tcl) language -+let s:tlist_def_expect_settings = 'tcl;c:class;f:method;p:procedure' -+ -+" fortran language -+let s:tlist_def_fortran_settings = 'fortran;p:program;b:block data;' . -+ \ 'c:common;e:entry;i:interface;k:type;l:label;m:module;' . -+ \ 'n:namelist;t:derived;v:variable;f:function;s:subroutine' -+ -+" HTML language -+let s:tlist_def_html_settings = 'html;a:anchor;f:javascript function' -+ -+" java language -+let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' . -+ \ 'f:field;m:method' -+ -+" javascript language -+let s:tlist_def_javascript_settings = 'javascript;f:function' -+ -+" lisp language -+let s:tlist_def_lisp_settings = 'lisp;f:function' -+ -+" lua language -+let s:tlist_def_lua_settings = 'lua;f:function' -+ -+" makefiles -+let s:tlist_def_make_settings = 'make;m:macro' -+ -+" pascal language -+let s:tlist_def_pascal_settings = 'pascal;f:function;p:procedure' -+ -+" perl language -+let s:tlist_def_perl_settings = 'perl;c:constant;l:label;p:package;s:subroutine' -+ -+" php language -+let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function' -+ -+" python language -+let s:tlist_def_python_settings = 'python;c:class;m:member;f:function' -+ -+" rexx language -+let s:tlist_def_rexx_settings = 'rexx;s:subroutine' -+ -+" ruby language -+let s:tlist_def_ruby_settings = 'ruby;c:class;f:method;F:function;' . -+ \ 'm:singleton method' -+ -+" scheme language -+let s:tlist_def_scheme_settings = 'scheme;s:set;f:function' -+ -+" shell language -+let s:tlist_def_sh_settings = 'sh;f:function' -+ -+" C shell language -+let s:tlist_def_csh_settings = 'sh;f:function' -+ -+" Z shell language -+let s:tlist_def_zsh_settings = 'sh;f:function' -+ -+" slang language -+let s:tlist_def_slang_settings = 'slang;n:namespace;f:function' -+ -+" sml language -+let s:tlist_def_sml_settings = 'sml;e:exception;c:functor;s:signature;' . -+ \ 'r:structure;t:type;v:value;f:function' -+ -+" sql language -+let s:tlist_def_sql_settings = 'sql;c:cursor;F:field;P:package;r:record;' . -+ \ 's:subtype;t:table;T:trigger;v:variable;f:function;p:procedure' -+ -+" tcl language -+let s:tlist_def_tcl_settings = 'tcl;c:class;f:method;m:method;p:procedure' -+ -+" vera language -+let s:tlist_def_vera_settings = 'vera;c:class;d:macro;e:enumerator;' . -+ \ 'f:function;g:enum;m:member;p:program;' . -+ \ 'P:prototype;t:task;T:typedef;v:variable;' . -+ \ 'x:externvar' -+ -+"verilog language -+let s:tlist_def_verilog_settings = 'verilog;m:module;c:constant;P:parameter;' . -+ \ 'e:event;r:register;t:task;w:write;p:port;v:variable;f:function' -+ -+" vim language -+let s:tlist_def_vim_settings = 'vim;a:autocmds;v:variable;f:function' -+ -+" yacc language -+let s:tlist_def_yacc_settings = 'yacc;l:label' -+ -+"------------------- end of language specific options -------------------- -+ -+" Vim window size is changed by the taglist plugin or not -+let s:tlist_winsize_chgd = -1 -+" Taglist window is maximized or not -+let s:tlist_win_maximized = 0 -+" Name of files in the taglist -+let s:tlist_file_names='' -+" Number of files in the taglist -+let s:tlist_file_count = 0 -+" Number of filetypes supported by taglist -+let s:tlist_ftype_count = 0 -+" Is taglist part of other plugins like winmanager or cream? -+let s:tlist_app_name = "none" -+" Are we displaying brief help text -+let s:tlist_brief_help = 1 -+" List of files removed on user request -+let s:tlist_removed_flist = "" -+" Index of current file displayed in the taglist window -+let s:tlist_cur_file_idx = -1 -+" Taglist menu is empty or not -+let s:tlist_menu_empty = 1 -+ -+" An autocommand is used to refresh the taglist window when entering any -+" buffer. We don't want to refresh the taglist window if we are entering the -+" file window from one of the taglist functions. The 'Tlist_Skip_Refresh' -+" variable is used to skip the refresh of the taglist window and is set -+" and cleared appropriately. -+let s:Tlist_Skip_Refresh = 0 -+ -+" 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 -+ call setline('$', ' ') -+ endif -+ -+ if s:tlist_brief_help -+ " Add the brief help -+ call append(0, '" Press to display help text') -+ else -+ " Add the extensive help -+ call append(0, '" : Jump to tag definition') -+ call append(1, '" o : Jump to tag definition in new window') -+ call append(2, '" p : Preview the tag definition') -+ call append(3, '" : Display tag prototype') -+ call append(4, '" u : Update tag list') -+ call append(5, '" s : Select sort field') -+ call append(6, '" d : Remove file from taglist') -+ call append(7, '" x : Zoom-out/Zoom-in taglist window') -+ call append(8, '" + : Open a fold') -+ call append(9, '" - : Close a fold') -+ call append(10, '" * : Open all folds') -+ call append(11, '" = : Close all folds') -+ 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') -+ endif -+endfunction -+ -+" Tlist_Window_Toggle_Help_Text() -+" Toggle taglist plugin help text between the full version and the brief -+" version -+function! s:Tlist_Window_Toggle_Help_Text() -+ if g:Tlist_Compact_Format -+ " In compact display mode, do not display help -+ return -+ endif -+ -+ " Include the empty line displayed after the help text -+ let brief_help_size = 1 -+ let full_help_size = 16 -+ -+ setlocal modifiable -+ -+ " Set report option to a huge value to prevent informational messages -+ " while deleting the lines -+ let old_report = &report -+ set report=99999 -+ -+ " Remove the currently highlighted tag. Otherwise, the help text -+ " might be highlighted by mistake -+ match none -+ -+ " Toggle between brief and full help text -+ if s:tlist_brief_help -+ let s:tlist_brief_help = 0 -+ -+ " Remove the previous help -+ exe '1,' . brief_help_size . ' delete _' -+ -+ " Adjust the start/end line numbers for the files -+ call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) -+ else -+ let s:tlist_brief_help = 1 -+ -+ " Remove the previous help -+ exe '1,' . full_help_size . ' delete _' -+ -+ " Adjust the start/end line numbers for the files -+ call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) -+ endif -+ -+ call s:Tlist_Window_Display_Help() -+ -+ " Restore the report option -+ let &report = old_report -+ -+ setlocal nomodifiable -+endfunction -+ -+" Taglist debug support -+let s:tlist_debug = 0 -+ -+" File for storing the debug messages -+let s:tlist_debug_file = '' -+ -+" Tlist_Debug_Enable -+" Enable logging of taglist debug messages. -+function! s:Tlist_Debug_Enable(...) -+ let s:tlist_debug = 1 -+ -+ " Check whether a valid file name is supplied. -+ if a:1 != '' -+ let s:tlist_debug_file = fnamemodify(a:1, ':p') -+ -+ " Empty the log file -+ exe 'redir! > ' . s:tlist_debug_file -+ redir END -+ -+ " Check whether the log file is present/created -+ if !filewritable(s:tlist_debug_file) -+ call s:Tlist_Warning_Msg('Taglist: Unable to create log file ' -+ \ . s:tlist_debug_file) -+ let s:tlist_debug_file = '' -+ endif -+ endif -+endfunction -+ -+" Tlist_Debug_Disable -+" Disable logging of taglist debug messages. -+function! s:Tlist_Debug_Disable(...) -+ let s:tlist_debug = 0 -+ let s:tlist_debug_file = '' -+endfunction -+ -+" Tlist_Debug_Show -+" Display the taglist debug messages in a new window -+function! s:Tlist_Debug_Show() -+ if s:tlist_msg == '' -+ call s:Tlist_Warning_Msg('Taglist: No debug messages') -+ return -+ endif -+ -+ " Open a new window to display the taglist debug messages -+ new taglist_debug.txt -+ " Delete all the lines (if the buffer already exists) -+ silent! %delete _ -+ " Add the messages -+ silent! put =s:tlist_msg -+ " Move the cursor to the first line -+ normal! gg -+endfunction -+ -+" Tlist_Log_Msg -+" Log the supplied debug message along with the time -+function! s:Tlist_Log_Msg(msg) -+ if s:tlist_debug -+ if s:tlist_debug_file != '' -+ exe 'redir >> ' . s:tlist_debug_file -+ silent echon strftime('%H:%M:%S') . ': ' . a:msg . "\n" -+ redir END -+ else -+ " Log the message into a variable -+ " Retain only the last 3000 characters -+ let len = strlen(s:tlist_msg) -+ if len > 3000 -+ let s:tlist_msg = strpart(s:tlist_msg, len - 3000) -+ endif -+ let s:tlist_msg = s:tlist_msg . strftime('%H:%M:%S') . ': ' . -+ \ a:msg . "\n" -+ endif -+ endif -+endfunction -+ -+" Tlist_Warning_Msg() -+" Display a message using WarningMsg highlight group -+function! s:Tlist_Warning_Msg(msg) -+ echohl WarningMsg -+ echomsg a:msg -+ echohl None -+endfunction -+ -+" Last returned file index for file name lookup. -+" Used to speed up file lookup -+let s:tlist_file_name_idx_cache = -1 -+ -+" Tlist_Get_File_Index() -+" Return the index of the specified filename -+function! s:Tlist_Get_File_Index(fname) -+ if s:tlist_file_count == 0 || a:fname == '' -+ return -1 -+ endif -+ -+ " If the new filename is same as the last accessed filename, then -+ " return that index -+ if s:tlist_file_name_idx_cache != -1 && -+ \ s:tlist_file_name_idx_cache < s:tlist_file_count -+ if s:tlist_{s:tlist_file_name_idx_cache}_filename == a:fname -+ " Same as the last accessed file -+ return s:tlist_file_name_idx_cache -+ endif -+ endif -+ -+ " First, check whether the filename is present -+ let s_fname = a:fname . "\n" -+ let i = stridx(s:tlist_file_names, s_fname) -+ if i == -1 -+ let s:tlist_file_name_idx_cache = -1 -+ return -1 -+ endif -+ -+ " Second, compute the file name index -+ let nl_txt = substitute(strpart(s:tlist_file_names, 0, i), "[^\n]", '', 'g') -+ let s:tlist_file_name_idx_cache = strlen(nl_txt) -+ return s:tlist_file_name_idx_cache -+endfunction -+ -+" Last returned file index for line number lookup. -+" Used to speed up file lookup -+let s:tlist_file_lnum_idx_cache = -1 -+ -+" 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_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 -+ if s:tlist_file_lnum_idx_cache != -1 && -+ \ s:tlist_file_lnum_idx_cache < s:tlist_file_count -+ if a:lnum >= s:tlist_{s:tlist_file_lnum_idx_cache}_start && -+ \ a:lnum <= s:tlist_{s:tlist_file_lnum_idx_cache}_end -+ return s:tlist_file_lnum_idx_cache -+ endif -+ endif -+ -+ let fidx = -1 -+ -+ 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 -+ -+ endif -+ else -+ " 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 -+ -+ return fidx -+endfunction -+ -+" Tlist_Exe_Cmd_No_Acmds -+" Execute the specified Ex command after disabling autocommands -+function! s:Tlist_Exe_Cmd_No_Acmds(cmd) -+ let old_eventignore = &eventignore -+ set eventignore=all -+ exe a:cmd -+ let &eventignore = old_eventignore -+endfunction -+ -+" Tlist_Skip_File() -+" Check whether tag listing is supported for the specified file -+function! s:Tlist_Skip_File(filename, ftype) -+ " Skip buffers with no names and buffers with filetype not set -+ if a:filename == '' || a:ftype == '' -+ return 1 -+ endif -+ -+ " Skip files which are not supported by exuberant ctags -+ " First check whether default settings for this filetype are available. -+ " If it is not available, then check whether user specified settings are -+ " available. If both are not available, then don't list the tags for this -+ " filetype -+ let var = 's:tlist_def_' . a:ftype . '_settings' -+ if !exists(var) -+ let var = 'g:tlist_' . a:ftype . '_settings' -+ if !exists(var) -+ return 1 -+ endif -+ endif -+ -+ " Skip files which are not readable or files which are not yet stored -+ " to the disk -+ if !filereadable(a:filename) -+ return 1 -+ endif -+ -+ return 0 -+endfunction -+ -+" Tlist_User_Removed_File -+" Returns 1 if a file is removed by a user from the taglist -+function! s:Tlist_User_Removed_File(filename) -+ return stridx(s:tlist_removed_flist, a:filename . "\n") != -1 -+endfunction -+ -+" Tlist_Update_Remove_List -+" Update the list of user removed files from the taglist -+" add == 1, add the file to the removed list -+" add == 0, delete the file from the removed list -+function! s:Tlist_Update_Remove_List(filename, add) -+ if a:add -+ let s:tlist_removed_flist = s:tlist_removed_flist . a:filename . "\n" -+ else -+ let idx = stridx(s:tlist_removed_flist, a:filename . "\n") -+ let text_before = strpart(s:tlist_removed_flist, 0, idx) -+ let rem_text = strpart(s:tlist_removed_flist, idx) -+ let next_idx = stridx(rem_text, "\n") -+ let text_after = strpart(rem_text, next_idx + 1) -+ -+ let s:tlist_removed_flist = text_before . text_after -+ endif -+endfunction -+ -+" Tlist_FileType_Init -+" Initialize the ctags arguments and tag variable for the specified -+" file type -+function! s:Tlist_FileType_Init(ftype) -+ call s:Tlist_Log_Msg('Tlist_FileType_Init (' . a:ftype . ')') -+ " If the user didn't specify any settings, then use the default -+ " ctags args. Otherwise, use the settings specified by the user -+ let var = 'g:tlist_' . a:ftype . '_settings' -+ if exists(var) -+ " User specified ctags arguments -+ let settings = {var} . ';' -+ else -+ " Default ctags arguments -+ let var = 's:tlist_def_' . a:ftype . '_settings' -+ if !exists(var) -+ " No default settings for this file type. This filetype is -+ " not supported -+ return 0 -+ endif -+ let settings = s:tlist_def_{a:ftype}_settings . ';' -+ endif -+ -+ let msg = 'Taglist: Invalid ctags option setting - ' . settings -+ -+ " Format of the option that specifies the filetype and ctags arugments: -+ " -+ " ;flag1:name1;flag2:name2;flag3:name3 -+ " -+ -+ " Extract the file type to pass to ctags. This may be different from the -+ " file type detected by Vim -+ let pos = stridx(settings, ';') -+ if pos == -1 -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let ctags_ftype = strpart(settings, 0, pos) -+ if ctags_ftype == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ " Make sure a valid filetype is supplied. If the user didn't specify a -+ " valid filetype, then the ctags option settings may be treated as the -+ " filetype -+ if ctags_ftype =~ ':' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ -+ " Remove the file type from settings -+ let settings = strpart(settings, pos + 1) -+ if settings == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ -+ " Process all the specified ctags flags. The format is -+ " flag1:name1;flag2:name2;flag3:name3 -+ let ctags_flags = '' -+ let cnt = 0 -+ while settings != '' -+ " Extract the flag -+ let pos = stridx(settings, ':') -+ if pos == -1 -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let flag = strpart(settings, 0, pos) -+ if flag == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ " Remove the flag from settings -+ let settings = strpart(settings, pos + 1) -+ -+ " Extract the tag type name -+ let pos = stridx(settings, ';') -+ if pos == -1 -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let name = strpart(settings, 0, pos) -+ if name == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let settings = strpart(settings, pos + 1) -+ -+ let cnt = cnt + 1 -+ -+ let s:tlist_{a:ftype}_{cnt}_name = flag -+ let s:tlist_{a:ftype}_{cnt}_fullname = name -+ let ctags_flags = ctags_flags . flag -+ endwhile -+ -+ let s:tlist_{a:ftype}_ctags_args = '--language-force=' . ctags_ftype . -+ \ ' --' . ctags_ftype . '-types=' . ctags_flags -+ let s:tlist_{a:ftype}_count = cnt -+ let s:tlist_{a:ftype}_ctags_flags = ctags_flags -+ -+ " Save the filetype name -+ let s:tlist_ftype_{s:tlist_ftype_count}_name = a:ftype -+ let s:tlist_ftype_count = s:tlist_ftype_count + 1 -+ -+ return 1 -+endfunction -+ -+" Tlist_Get_Filetype -+" Determine the filetype for the specified file -+function! s:Tlist_Get_Filetype(fname) -+ " Ignore the filetype autocommands -+ let old_eventignore = &eventignore -+ set eventignore=FileType -+ -+ " Save the 'filetype', as this will be changed temporarily -+ let old_filetype = &filetype -+ -+ " Run the filetypedetect group of autocommands to determine -+ " the filetype -+ exe 'doautocmd filetypedetect BufRead ' . a:fname -+ -+ " Save the detected filetype -+ let ftype = &filetype -+ -+ " Restore the previous state -+ let &filetype = old_filetype -+ let &eventignore = old_eventignore -+ -+ return ftype -+endfunction -+ -+" Tlist_Get_Buffer_Filetype -+" Get the filetype for the specified buffer -+function! s:Tlist_Get_Buffer_Filetype(bnum) -+ if bufloaded(a:bnum) -+ " For loaded buffers, the 'filetype' is already determined -+ return getbufvar(a:bnum, '&filetype') -+ endif -+ -+ " For unloaded buffers, if the 'filetype' option is set, return it -+ let ftype = getbufvar(a:bnum, '&filetype') -+ if ftype != '' -+ return ftype -+ endif -+ -+ " Skip non-existent buffers -+ if !bufexists(a:bnum) -+ return '' -+ endif -+ -+ " For buffers whose filetype is not yet determined, try to determine -+ " the filetype -+ let bname = bufname(a:bnum) -+ -+ return s:Tlist_Get_Filetype(bname) -+endfunction -+ -+" Tlist_Discard_TagInfo -+" Discard the stored tag information for a file -+function! s:Tlist_Discard_TagInfo(fidx) -+ call s:Tlist_Log_Msg('Tlist_Discard_TagInfo (' . -+ \ s:tlist_{a:fidx}_filename . ')') -+ let ftype = s:tlist_{a:fidx}_filetype -+ -+ " Discard information about the tags defined in the file -+ let i = 1 -+ while i <= s:tlist_{a:fidx}_tag_count -+ let fidx_i = 's:tlist_' . a:fidx . '_' . i -+ unlet! {fidx_i}_tag -+ unlet! {fidx_i}_tag_name -+ unlet! {fidx_i}_tag_type -+ unlet! {fidx_i}_ttype_idx -+ unlet! {fidx_i}_tag_proto -+ unlet! {fidx_i}_tag_searchpat -+ unlet! {fidx_i}_tag_linenum -+ let i = i + 1 -+ endwhile -+ -+ let s:tlist_{a:fidx}_tag_count = 0 -+ -+ " Discard information about tag type groups -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{i}_name -+ if s:tlist_{a:fidx}_{ttype} != '' -+ let fidx_ttype = 's:tlist_' . a:fidx . '_' . ttype -+ let {fidx_ttype} = '' -+ let {fidx_ttype}_offset = 0 -+ let cnt = {fidx_ttype}_count -+ let {fidx_ttype}_count = 0 -+ let j = 1 -+ while j <= cnt -+ unlet! {fidx_ttype}_{j} -+ let j = j + 1 -+ endwhile -+ endif -+ let i = i + 1 -+ endwhile -+ -+ " Discard the stored menu command also -+ let s:tlist_{a:fidx}_menu_cmd = '' -+endfunction -+ -+" 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_Window_Update_Line_Offsets(start_idx, increment, offset) -+ let i = a:start_idx -+ -+ while i < s:tlist_file_count -+ if s:tlist_{i}_visible -+ " Update the start/end line number only if the file is visible -+ if a:increment -+ let s:tlist_{i}_start = s:tlist_{i}_start + a:offset -+ let s:tlist_{i}_end = s:tlist_{i}_end + a:offset -+ else -+ let s:tlist_{i}_start = s:tlist_{i}_start - a:offset -+ let s:tlist_{i}_end = s:tlist_{i}_end - a:offset -+ endif -+ endif -+ let i = i + 1 -+ endwhile -+endfunction -+ -+" Tlist_Discard_FileInfo -+" Discard the stored information for a file -+function! s:Tlist_Discard_FileInfo(fidx) -+ call s:Tlist_Log_Msg('Tlist_Discard_FileInfo (' . -+ \ s:tlist_{a:fidx}_filename . ')') -+ call s:Tlist_Discard_TagInfo(a:fidx) -+ -+ let ftype = s:tlist_{a:fidx}_filetype -+ -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{i}_name -+ unlet! s:tlist_{a:fidx}_{ttype} -+ unlet! s:tlist_{a:fidx}_{ttype}_offset -+ unlet! s:tlist_{a:fidx}_{ttype}_count -+ let i = i + 1 -+ endwhile -+ -+ unlet! s:tlist_{a:fidx}_filename -+ unlet! s:tlist_{a:fidx}_sort_type -+ unlet! s:tlist_{a:fidx}_filetype -+ unlet! s:tlist_{a:fidx}_mtime -+ unlet! s:tlist_{a:fidx}_start -+ unlet! s:tlist_{a:fidx}_end -+ unlet! s:tlist_{a:fidx}_valid -+ unlet! s:tlist_{a:fidx}_visible -+ unlet! s:tlist_{a:fidx}_tag_count -+ unlet! s:tlist_{a:fidx}_menu_cmd -+endfunction -+ -+" Tlist_Window_Remove_File_From_Display -+" Remove the specified 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 -+ return -+ endif -+ -+ " Remove the tags displayed for the specified file from the window -+ let start = s:tlist_{a:fidx}_start -+ " Include the empty line after the last line also -+ if g:Tlist_Compact_Format -+ let end = s:tlist_{a:fidx}_end -+ else -+ let end = s:tlist_{a:fidx}_end + 1 -+ endif -+ -+ setlocal modifiable -+ exe 'silent! ' . start . ',' . end . 'delete _' -+ setlocal nomodifiable -+ -+ " 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_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) -+endfunction -+ -+" Tlist_Remove_File -+" Remove the file under the cursor or the specified file index -+" user_request - User requested to remove the file from taglist -+function! s:Tlist_Remove_File(file_idx, user_request) -+ let fidx = a:file_idx -+ -+ if fidx == -1 -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ endif -+ call s:Tlist_Log_Msg('Tlist_Remove_File (' . -+ \ s:tlist_{fidx}_filename . ', ' . a:user_request . ')') -+ -+ let save_winnr = winnr() -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ " Taglist window is open, remove the file from display -+ -+ if save_winnr != winnum -+ let old_eventignore = &eventignore -+ set eventignore=all -+ exe winnum . 'wincmd w' -+ endif -+ -+ call s:Tlist_Window_Remove_File_From_Display(fidx) -+ -+ if save_winnr != winnum -+ exe save_winnr . 'wincmd w' -+ let &eventignore = old_eventignore -+ endif -+ endif -+ -+ let fname = s:tlist_{fidx}_filename -+ -+ if a:user_request -+ " As the user requested to remove the file from taglist, -+ " add it to the removed list -+ call s:Tlist_Update_Remove_List(fname, 1) -+ endif -+ -+ " Remove the file name from the taglist list of filenames -+ let idx = stridx(s:tlist_file_names, fname . "\n") -+ let text_before = strpart(s:tlist_file_names, 0, idx) -+ let rem_text = strpart(s:tlist_file_names, idx) -+ let next_idx = stridx(rem_text, "\n") -+ let text_after = strpart(rem_text, next_idx + 1) -+ let s:tlist_file_names = text_before . text_after -+ -+ call s:Tlist_Discard_FileInfo(fidx) -+ -+ " Shift all the file variables by one index -+ let i = fidx + 1 -+ -+ while i < s:tlist_file_count -+ let j = i - 1 -+ -+ let s:tlist_{j}_filename = s:tlist_{i}_filename -+ let s:tlist_{j}_sort_type = s:tlist_{i}_sort_type -+ let s:tlist_{j}_filetype = s:tlist_{i}_filetype -+ let s:tlist_{j}_mtime = s:tlist_{i}_mtime -+ let s:tlist_{j}_start = s:tlist_{i}_start -+ let s:tlist_{j}_end = s:tlist_{i}_end -+ let s:tlist_{j}_valid = s:tlist_{i}_valid -+ let s:tlist_{j}_visible = s:tlist_{i}_visible -+ let s:tlist_{j}_tag_count = s:tlist_{i}_tag_count -+ let s:tlist_{j}_menu_cmd = s:tlist_{i}_menu_cmd -+ -+ let k = 1 -+ while k <= s:tlist_{j}_tag_count -+ let s:tlist_{j}_{k}_tag = s:tlist_{i}_{k}_tag -+ let s:tlist_{j}_{k}_tag_name = s:tlist_{i}_{k}_tag_name -+ let s:tlist_{j}_{k}_tag_type = s:Tlist_Get_Tag_Type_By_Tag(i, k) -+ let s:tlist_{j}_{k}_ttype_idx = s:tlist_{i}_{k}_ttype_idx -+ let s:tlist_{j}_{k}_tag_proto = s:Tlist_Get_Tag_Prototype(i, k) -+ let s:tlist_{j}_{k}_tag_searchpat = s:Tlist_Get_Tag_SearchPat(i, k) -+ let s:tlist_{j}_{k}_tag_linenum = s:Tlist_Get_Tag_Linenum(i, k) -+ let k = k + 1 -+ endwhile -+ -+ let ftype = s:tlist_{i}_filetype -+ -+ let k = 1 -+ while k <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{k}_name -+ let s:tlist_{j}_{ttype} = s:tlist_{i}_{ttype} -+ let s:tlist_{j}_{ttype}_offset = s:tlist_{i}_{ttype}_offset -+ let s:tlist_{j}_{ttype}_count = s:tlist_{i}_{ttype}_count -+ if s:tlist_{j}_{ttype} != '' -+ let l = 1 -+ while l <= s:tlist_{j}_{ttype}_count -+ let s:tlist_{j}_{ttype}_{l} = s:tlist_{i}_{ttype}_{l} -+ let l = l + 1 -+ endwhile -+ endif -+ let k = k + 1 -+ endwhile -+ -+ " As the file and tag information is copied to the new index, -+ " discard the previous information -+ call s:Tlist_Discard_FileInfo(i) -+ -+ let i = i + 1 -+ endwhile -+ -+ " Reduce the number of files displayed -+ let s:tlist_file_count = s:tlist_file_count - 1 -+ -+ if g:Tlist_Show_One_File -+ " If the tags for only one file is displayed and if we just -+ " now removed that file, then invalidate the current file idx -+ if s:tlist_cur_file_idx == fidx -+ let s:tlist_cur_file_idx = -1 -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Goto_Window -+" Goto the taglist window -+function! s:Tlist_Window_Goto_Window() -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ if winnr() != winnum -+ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Create -+" Create a new taglist window. If it is already open, jump to it -+function! s:Tlist_Window_Create() -+ call s:Tlist_Log_Msg('Tlist_Window_Create()') -+ " If the window is open, jump to it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ " Jump to the existing window -+ if winnr() != winnum -+ exe winnum . 'wincmd w' -+ endif -+ return -+ endif -+ -+ " If used with winmanager don't open windows. Winmanager will handle -+ " the window/buffer management -+ if s:tlist_app_name == "winmanager" -+ return -+ endif -+ -+ " Create a new window. If user prefers a horizontal window, then open -+ " a horizontally split window. Otherwise open a vertically split -+ " window -+ if g:Tlist_Use_Horiz_Window -+ " Open a horizontally split window -+ let win_dir = 'botright' -+ " Horizontal window height -+ let win_size = g:Tlist_WinHeight -+ else -+ if s:tlist_winsize_chgd == -1 -+ " Open a vertically split window. Increase the window size, if -+ " needed, to accomodate the new window -+ if g:Tlist_Inc_Winwidth && -+ \ &columns < (80 + g:Tlist_WinWidth) -+ " Save the original window position -+ let s:tlist_pre_winx = getwinposx() -+ let s:tlist_pre_winy = getwinposy() -+ -+ " one extra column is needed to include the vertical split -+ let &columns= &columns + g:Tlist_WinWidth + 1 -+ -+ let s:tlist_winsize_chgd = 1 -+ else -+ let s:tlist_winsize_chgd = 0 -+ endif -+ endif -+ -+ if g:Tlist_Use_Right_Window -+ " Open the window at the rightmost place -+ let win_dir = 'botright vertical' -+ else -+ " Open the window at the leftmost place -+ let win_dir = 'topleft vertical' -+ endif -+ let win_size = g:Tlist_WinWidth -+ endif -+ -+ " If the tag listing temporary buffer already exists, then reuse it. -+ " Otherwise create a new buffer -+ let bufnum = bufnr(g:TagList_title) -+ if bufnum == -1 -+ " Create a new buffer -+ let wcmd = g:TagList_title -+ else -+ " Edit the existing buffer -+ let wcmd = '+buffer' . bufnum -+ endif -+ -+ " Create the taglist window -+ exe 'silent! ' . win_dir . ' ' . win_size . 'split ' . wcmd -+ -+ " Save the new window position -+ let s:tlist_winx = getwinposx() -+ let s:tlist_winy = getwinposy() -+ -+ " Initialize the taglist window -+ call s:Tlist_Window_Init() -+endfunction -+ -+" Tlist_Window_Zoom -+" Zoom (maximize/minimize) the taglist window -+function! s:Tlist_Window_Zoom() -+ if s:tlist_win_maximized -+ " Restore the window back to the previous size -+ if g:Tlist_Use_Horiz_Window -+ exe 'resize ' . g:Tlist_WinHeight -+ else -+ exe 'vert resize ' . g:Tlist_WinWidth -+ endif -+ let s:tlist_win_maximized = 0 -+ else -+ " Set the window size to the maximum possible without closing other -+ " windows -+ if g:Tlist_Use_Horiz_Window -+ resize -+ else -+ vert resize -+ endif -+ let s:tlist_win_maximized = 1 -+ endif -+endfunction -+ -+" Tlist_Ballon_Expr -+" When the mouse cursor is over a tag in the taglist window, display the -+" tag prototype (balloon) -+function! Tlist_Ballon_Expr() -+ " Get the file index -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(v:beval_lnum) -+ if fidx == -1 -+ return '' -+ endif -+ -+ " Get the tag output line for the current tag -+ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, v:beval_lnum) -+ if tidx == 0 -+ return '' -+ endif -+ -+ " Get the tag search pattern and display it -+ return s:Tlist_Get_Tag_Prototype(fidx, tidx) -+endfunction -+ -+" Tlist_Window_Check_Width -+" Check the width of the taglist window. For horizontally split windows, the -+" 'winfixheight' option is used to fix the height of the window. For -+" vertically split windows, Vim doesn't support the 'winfixwidth' option. So -+" need to handle window width changes from this function. -+function! s:Tlist_Window_Check_Width() -+ let tlist_winnr = bufwinnr(g:TagList_title) -+ if tlist_winnr == -1 -+ return -+ endif -+ -+ let width = winwidth(tlist_winnr) -+ if width != g:Tlist_WinWidth -+ call s:Tlist_Log_Msg("Tlist_Window_Check_Width: Changing window " . -+ \ "width from " . width . " to " . g:Tlist_WinWidth) -+ let save_winnr = winnr() -+ if save_winnr != tlist_winnr -+ call s:Tlist_Exe_Cmd_No_Acmds(tlist_winnr . 'wincmd w') -+ endif -+ exe 'vert resize ' . g:Tlist_WinWidth -+ if save_winnr != tlist_winnr -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Exit_Only_Window -+" If the 'Tlist_Exit_OnlyWindow' option is set, then exit Vim if only the -+" taglist window is present. -+function! s:Tlist_Window_Exit_Only_Window() -+ " Before quitting Vim, delete the taglist buffer so that -+ " the '0 mark is correctly set to the previous buffer. -+ if v:version < 700 -+ if winbufnr(2) == -1 -+ bdelete -+ quit -+ endif -+ else -+ if winbufnr(2) == -1 -+ if tabpagenr('$') == 1 -+ " Only one tag page is present -+ bdelete -+ quit -+ else -+ " More than one tab page is present. Close only the current -+ " tab page -+ close -+ endif -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Init -+" Set the default options for the taglist window -+function! s:Tlist_Window_Init() -+ call s:Tlist_Log_Msg('Tlist_Window_Init()') -+ -+ " The 'readonly' option should not be set for the taglist buffer. -+ " If Vim is started as "view/gview" or if the ":view" command is -+ " used, then the 'readonly' option is set for all the buffers. -+ " Unset it for the taglist buffer -+ setlocal noreadonly -+ -+ " Set the taglist buffer filetype to taglist -+ setlocal filetype=taglist -+ -+ " Define taglist window element highlighting -+ syntax match TagListComment '^" .*' -+ syntax match TagListFileName '^[^" ].*$' -+ syntax match TagListTitle '^ \S.*$' -+ syntax match TagListTagScope '\s\[.\{-\}\]$' -+ -+ " Define the highlighting only if colors are supported -+ if has('gui_running') || &t_Co > 2 -+ " 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 default link TagListTagName Search -+ endif -+ " Colors to highlight comments and titles -+ if hlexists('MyTagListComment') -+ highlight link TagListComment MyTagListComment -+ else -+ highlight clear TagListComment -+ highlight default link TagListComment Comment -+ endif -+ if hlexists('MyTagListTitle') -+ highlight link TagListTitle MyTagListTitle -+ else -+ highlight clear TagListTitle -+ highlight default link TagListTitle Title -+ endif -+ if hlexists('MyTagListFileName') -+ highlight link TagListFileName MyTagListFileName -+ else -+ highlight clear TagListFileName -+ highlight default TagListFileName guibg=Grey ctermbg=darkgray -+ \ guifg=white ctermfg=white -+ endif -+ if hlexists('MyTagListTagScope') -+ highlight link TagListTagScope MyTagListTagScope -+ else -+ highlight clear TagListTagScope -+ highlight default link TagListTagScope Identifier -+ endif -+ else -+ highlight default TagListTagName term=reverse cterm=reverse -+ endif -+ -+ " Folding related settings -+ setlocal foldenable -+ setlocal foldminlines=0 -+ setlocal foldmethod=manual -+ setlocal foldlevel=9999 -+ if g:Tlist_Enable_Fold_Column -+ setlocal foldcolumn=3 -+ else -+ setlocal foldcolumn=0 -+ endif -+ setlocal foldtext=v:folddashes.getline(v:foldstart) -+ -+ if s:tlist_app_name != "winmanager" -+ " Mark buffer as scratch -+ silent! setlocal buftype=nofile -+ if s:tlist_app_name == "none" -+ silent! setlocal bufhidden=delete -+ endif -+ silent! setlocal noswapfile -+ " Due to a bug in Vim 6.0, the winbufnr() function fails for unlisted -+ " buffers. So if the taglist buffer is unlisted, multiple taglist -+ " windows will be opened. This bug is fixed in Vim 6.1 and above -+ if v:version >= 601 -+ silent! setlocal nobuflisted -+ endif -+ endif -+ -+ silent! setlocal nowrap -+ -+ " If the 'number' option is set in the source window, it will affect the -+ " taglist window. So forcefully disable 'number' option for the taglist -+ " window -+ silent! setlocal nonumber -+ -+ " Use fixed height when horizontally split window is used -+ if g:Tlist_Use_Horiz_Window -+ if v:version >= 602 -+ set winfixheight -+ endif -+ endif -+ if !g:Tlist_Use_Horiz_Window && v:version >= 700 -+ set winfixwidth -+ endif -+ -+ " Setup balloon evaluation to display tag prototype -+ if v:version >= 700 && has('balloon_eval') -+ setlocal balloonexpr=Tlist_Ballon_Expr() -+ set ballooneval -+ 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_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 -+ nnoremap - :silent! foldclose -+ nnoremap * :silent! %foldopen! -+ nnoremap = :silent! %foldclose -+ nnoremap :silent! foldopen -+ nnoremap :silent! foldclose -+ nnoremap :silent! %foldopen! -+ 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_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_Window_Jump_To_Tag('useopen') -+ " Windows needs return -+ 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 -+ inoremap - :silent! foldclose -+ inoremap * :silent! %foldopen! -+ inoremap = :silent! %foldclose -+ inoremap :silent! foldopen -+ inoremap :silent! foldclose -+ inoremap :silent! %foldopen! -+ inoremap :call -+ \ 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_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 -+ if g:Tlist_Use_SingleClick == 1 -+ " Contributed by Bindu Wavell -+ " attempt to perform single click mapping, it would be much -+ " nicer if we could nnoremap ... however vim does -+ " not fire the when you use the mouse -+ " to enter a buffer. -+ let clickmap = ':if bufname("%") =~ "__Tag_List__" ' . -+ \ 'call Tlist_Window_Jump_To_Tag("useopen") ' . -+ \ ' endif ' -+ if maparg('', 'n') == '' -+ " no mapping for leftmouse -+ exe ':nnoremap ' . clickmap -+ else -+ " we have a mapping -+ let mapcmd = ':nnoremap ' -+ let mapcmd = mapcmd . substitute(substitute( -+ \ maparg('', 'n'), '|', '', 'g'), -+ \ '\c^', '', '') -+ let mapcmd = mapcmd . clickmap -+ exe mapcmd -+ endif -+ endif -+ -+ " Define the taglist autocommands -+ augroup TagListAutoCmds -+ autocmd! -+ " Display the tag prototype for the tag under the cursor. -+ autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info() -+ " Highlight the current tag periodically -+ 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 -+ autocmd BufUnload __Tag_List__ call s:Tlist_Post_Close_Cleanup() -+ " 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('')) -+ endif -+ " Exit Vim itself if only the taglist window is present (optional) -+ if g:Tlist_Exit_OnlyWindow -+ autocmd BufEnter __Tag_List__ nested -+ \ call s:Tlist_Window_Exit_Only_Window() -+ endif -+ if s:tlist_app_name != "winmanager" && -+ \ !g:Tlist_Process_File_Always && -+ \ (!has('gui_running') || !g:Tlist_Show_Menu) -+ " Auto refresh the taglist window -+ autocmd BufEnter * call s:Tlist_Refresh() -+ endif -+ -+ if !g:Tlist_Use_Horiz_Window -+ if v:version < 700 -+ autocmd WinEnter * call s:Tlist_Window_Check_Width() -+ endif -+ endif -+ augroup end -+ -+ " Restore the previous cpoptions settings -+ let &cpoptions = old_cpoptions -+endfunction -+ -+" Tlist_Window_Refresh -+" Display the tags for all the files in the taglist window -+function! s:Tlist_Window_Refresh() -+ call s:Tlist_Log_Msg('Tlist_Window_Refresh()') -+ " Set report option to a huge value to prevent informational messages -+ " while deleting the lines -+ let old_report = &report -+ set report=99999 -+ -+ " Mark the buffer as modifiable -+ setlocal modifiable -+ -+ " Delete the contents of the buffer to the black-hole register -+ silent! %delete _ -+ -+ " As we have cleared the taglist window, mark all the files -+ " as not visible -+ let i = 0 -+ while i < s:tlist_file_count -+ let s:tlist_{i}_visible = 0 -+ let i = i + 1 -+ endwhile -+ -+ if g:Tlist_Compact_Format == 0 -+ " Display help in non-compact mode -+ call s:Tlist_Window_Display_Help() -+ endif -+ -+ " Mark the buffer as not modifiable -+ setlocal nomodifiable -+ -+ " Restore the report option -+ let &report = old_report -+ -+ " If the tags for only one file should be displayed in the taglist -+ " window, then no need to add the tags here. The bufenter autocommand -+ " will add the tags for that file. -+ if g:Tlist_Show_One_File -+ return -+ endif -+ -+ " List all the tags for the previously processed files -+ " Do this only if taglist is configured to display tags for more than -+ " one file. Otherwise, when Tlist_Show_One_File is configured, -+ " tags for the wrong file will be displayed. -+ let i = 0 -+ while i < s:tlist_file_count -+ call s:Tlist_Window_Refresh_File(s:tlist_{i}_filename, -+ \ s:tlist_{i}_filetype) -+ let i = i + 1 -+ endwhile -+ -+ if g:Tlist_Auto_Update -+ " Add and list the tags for all buffers in the Vim buffer list -+ let i = 1 -+ let last_bufnum = bufnr('$') -+ while i <= last_bufnum -+ if buflisted(i) -+ let fname = fnamemodify(bufname(i), ':p') -+ let ftype = s:Tlist_Get_Buffer_Filetype(i) -+ " If the file doesn't support tag listing, skip it -+ if !s:Tlist_Skip_File(fname, ftype) -+ call s:Tlist_Window_Refresh_File(fname, ftype) -+ endif -+ endif -+ let i = i + 1 -+ endwhile -+ endif -+ -+ " If Tlist_File_Fold_Auto_Close option is set, then close all the folds -+ if g:Tlist_File_Fold_Auto_Close -+ " Close all the folds -+ silent! %foldclose -+ endif -+ -+ " Move the cursor to the top of the taglist window -+ normal! gg -+endfunction -+ -+" Tlist_Post_Close_Cleanup() -+" Close the taglist window and adjust the Vim window width -+function! s:Tlist_Post_Close_Cleanup() -+ call s:Tlist_Log_Msg('Tlist_Post_Close_Cleanup()') -+ " Mark all the files as not visible -+ let i = 0 -+ while i < s:tlist_file_count -+ let s:tlist_{i}_visible = 0 -+ let i = i + 1 -+ endwhile -+ -+ " Remove the taglist autocommands -+ silent! autocmd! TagListAutoCmds -+ -+ " Clear all the highlights -+ match none -+ -+ silent! syntax clear TagListTitle -+ silent! syntax clear TagListComment -+ silent! syntax clear TagListTagScope -+ -+ " Remove the left mouse click mapping if it was setup initially -+ if g:Tlist_Use_SingleClick -+ if hasmapto('') -+ nunmap -+ endif -+ endif -+ -+ if s:tlist_app_name != "winmanager" -+ if g:Tlist_Use_Horiz_Window || g:Tlist_Inc_Winwidth == 0 || -+ \ s:tlist_winsize_chgd != 1 || -+ \ &columns < (80 + g:Tlist_WinWidth) -+ " No need to adjust window width if using horizontally split taglist -+ " window or if columns is less than 101 or if the user chose not to -+ " adjust the window width -+ else -+ " If the user didn't manually move the window, then restore the window -+ " position to the pre-taglist position -+ if s:tlist_pre_winx != -1 && s:tlist_pre_winy != -1 && -+ \ getwinposx() == s:tlist_winx && -+ \ getwinposy() == s:tlist_winy -+ exe 'winpos ' . s:tlist_pre_winx . ' ' . s:tlist_pre_winy -+ endif -+ -+ " Adjust the Vim window width -+ let &columns= &columns - (g:Tlist_WinWidth + 1) -+ endif -+ endif -+ -+ let s:tlist_winsize_chgd = -1 -+ -+ " Reset taglist state variables -+ if s:tlist_app_name == "winmanager" -+ let s:tlist_app_name = "none" -+ endif -+ let s:tlist_window_initialized = 0 -+endfunction -+ -+" Tlist_Window_Refresh_File() -+" List the tags defined in the specified file in a Vim window -+function! s:Tlist_Window_Refresh_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Window_Refresh_File (' . a:filename . ')') -+ " First check whether the file already exists -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx != -1 -+ let file_listed = 1 -+ else -+ let file_listed = 0 -+ endif -+ -+ if !file_listed -+ " Check whether this file is removed based on user request -+ " If it is, then don't display the tags for this file -+ if s:Tlist_User_Removed_File(a:filename) -+ return -+ endif -+ endif -+ -+ if file_listed && s:tlist_{fidx}_visible -+ " Check whether the file tags are currently valid -+ if s:tlist_{fidx}_valid -+ " Goto the first line in the file -+ exe s:tlist_{fidx}_start -+ -+ " If the line is inside a fold, open the fold -+ if foldclosed('.') != -1 -+ exe "silent! " . s:tlist_{fidx}_start . "," . -+ \ s:tlist_{fidx}_end . "foldopen!" -+ endif -+ return -+ endif -+ -+ " Discard and remove the tags for this file from display -+ call s:Tlist_Discard_TagInfo(fidx) -+ call s:Tlist_Window_Remove_File_From_Display(fidx) -+ endif -+ -+ " Process and generate a list of tags defined in the file -+ if !file_listed || !s:tlist_{fidx}_valid -+ let ret_fidx = s:Tlist_Process_File(a:filename, a:ftype) -+ if ret_fidx == -1 -+ return -+ endif -+ let fidx = ret_fidx -+ endif -+ -+ " Set report option to a huge value to prevent informational messages -+ " while adding lines to the taglist window -+ let old_report = &report -+ set report=99999 -+ -+ if g:Tlist_Show_One_File -+ " Remove the previous file -+ if s:tlist_cur_file_idx != -1 -+ 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 -+ endif -+ let s:tlist_cur_file_idx = fidx -+ endif -+ -+ " Mark the buffer as modifiable -+ setlocal modifiable -+ -+ " Add new files to the end of the window. For existing files, add them at -+ " the same line where they were previously present. If the file is not -+ " visible, then add it at the end -+ if s:tlist_{fidx}_start == 0 || !s:tlist_{fidx}_visible -+ if g:Tlist_Compact_Format -+ let s:tlist_{fidx}_start = line('$') -+ else -+ let s:tlist_{fidx}_start = line('$') + 1 -+ endif -+ endif -+ -+ let s:tlist_{fidx}_visible = 1 -+ -+ " Goto the line where this file should be placed -+ if g:Tlist_Compact_Format -+ exe s:tlist_{fidx}_start -+ else -+ exe s:tlist_{fidx}_start - 1 -+ endif -+ -+ let txt = fnamemodify(s:tlist_{fidx}_filename, ':t') . ' (' . -+ \ fnamemodify(s:tlist_{fidx}_filename, ':p:h') . ')' -+ if g:Tlist_Compact_Format == 0 -+ silent! put =txt -+ else -+ silent! put! =txt -+ " Move to the next line -+ exe line('.') + 1 -+ endif -+ let file_start = s:tlist_{fidx}_start -+ -+ " Add the tag names grouped by tag type to the buffer with a title -+ let i = 1 -+ let ttype_cnt = s:tlist_{a:ftype}_count -+ while i <= ttype_cnt -+ let ttype = s:tlist_{a:ftype}_{i}_name -+ " Add the tag type only if there are tags for that type -+ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype -+ let ttype_txt = {fidx_ttype} -+ if ttype_txt != '' -+ let txt = ' ' . s:tlist_{a:ftype}_{i}_fullname -+ if g:Tlist_Compact_Format == 0 -+ let ttype_start_lnum = line('.') + 1 -+ silent! put =txt -+ else -+ let ttype_start_lnum = line('.') -+ silent! put! =txt -+ endif -+ silent! put =ttype_txt -+ -+ let {fidx_ttype}_offset = ttype_start_lnum - file_start -+ -+ " create a fold for this tag type -+ let fold_start = ttype_start_lnum -+ let fold_end = fold_start + {fidx_ttype}_count -+ exe fold_start . ',' . fold_end . 'fold' -+ -+ " Adjust the cursor position -+ if g:Tlist_Compact_Format == 0 -+ exe ttype_start_lnum + {fidx_ttype}_count -+ else -+ exe ttype_start_lnum + {fidx_ttype}_count + 1 -+ endif -+ -+ if g:Tlist_Compact_Format == 0 -+ " Separate the tag types by a empty line -+ silent! put ='' -+ endif -+ endif -+ let i = i + 1 -+ endwhile -+ -+ if s:tlist_{fidx}_tag_count == 0 -+ if g:Tlist_Compact_Format == 0 -+ silent! put ='' -+ endif -+ endif -+ -+ let s:tlist_{fidx}_end = line('.') - 1 -+ -+ " Create a fold for the entire file -+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' -+ exe 'silent! ' . s:tlist_{fidx}_start . ',' . -+ \ s:tlist_{fidx}_end . 'foldopen!' -+ -+ " Goto the starting line for this file, -+ exe s:tlist_{fidx}_start -+ -+ if s:tlist_app_name == "winmanager" -+ " To handle a bug in the winmanager plugin, add a space at the -+ " last line -+ call setline('$', ' ') -+ endif -+ -+ " Mark the buffer as not modifiable -+ setlocal nomodifiable -+ -+ " Restore the report option -+ let &report = old_report -+ -+ " Update the start and end line numbers for all the files following this -+ " file -+ let start = s:tlist_{fidx}_start -+ " include the empty line after the last line -+ if g:Tlist_Compact_Format -+ let end = s:tlist_{fidx}_end -+ else -+ let end = s:tlist_{fidx}_end + 1 -+ endif -+ 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) -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(1) -+ endif -+endfunction -+ -+" Tlist_Init_File -+" Initialize the variables for a new file -+function! s:Tlist_Init_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Init_File (' . a:filename . ')') -+ " Add new files at the end of the list -+ let fidx = s:tlist_file_count -+ let s:tlist_file_count = s:tlist_file_count + 1 -+ " Add the new file name to the taglist list of file names -+ let s:tlist_file_names = s:tlist_file_names . a:filename . "\n" -+ -+ " Initialize the file variables -+ let s:tlist_{fidx}_filename = a:filename -+ let s:tlist_{fidx}_sort_type = g:Tlist_Sort_Type -+ let s:tlist_{fidx}_filetype = a:ftype -+ let s:tlist_{fidx}_mtime = -1 -+ let s:tlist_{fidx}_start = 0 -+ let s:tlist_{fidx}_end = 0 -+ let s:tlist_{fidx}_valid = 0 -+ let s:tlist_{fidx}_visible = 0 -+ let s:tlist_{fidx}_tag_count = 0 -+ let s:tlist_{fidx}_menu_cmd = '' -+ -+ " Initialize the tag type variables -+ let i = 1 -+ while i <= s:tlist_{a:ftype}_count -+ let ttype = s:tlist_{a:ftype}_{i}_name -+ let s:tlist_{fidx}_{ttype} = '' -+ let s:tlist_{fidx}_{ttype}_offset = 0 -+ let s:tlist_{fidx}_{ttype}_count = 0 -+ let i = i + 1 -+ endwhile -+ -+ return fidx -+endfunction -+ -+" Tlist_Get_Tag_Type_By_Tag -+" Return the tag type for the specified tag index -+function! s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) -+ let ttype_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_type' -+ -+ " Already parsed and have the tag name -+ if exists(ttype_var) -+ return {ttype_var} -+ endif -+ -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let {ttype_var} = s:Tlist_Extract_Tagtype(tag_line) -+ -+ return {ttype_var} -+endfunction -+ -+" Tlist_Get_Tag_Prototype -+function! s:Tlist_Get_Tag_Prototype(fidx, tidx) -+ let tproto_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_proto' -+ -+ " Already parsed and have the tag prototype -+ if exists(tproto_var) -+ return {tproto_var} -+ endif -+ -+ " Parse and extract the tag prototype -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let start = stridx(tag_line, '/^') + 2 -+ let end = stridx(tag_line, '/;"' . "\t") -+ if tag_line[end - 1] == '$' -+ let end = end -1 -+ endif -+ let tag_proto = strpart(tag_line, start, end - start) -+ let {tproto_var} = substitute(tag_proto, '\s*', '', '') -+ -+ return {tproto_var} -+endfunction -+ -+" Tlist_Get_Tag_SearchPat -+function! s:Tlist_Get_Tag_SearchPat(fidx, tidx) -+ let tpat_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_searchpat' -+ -+ " Already parsed and have the tag search pattern -+ if exists(tpat_var) -+ return {tpat_var} -+ endif -+ -+ " Parse and extract the tag search pattern -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let start = stridx(tag_line, '/^') + 2 -+ let end = stridx(tag_line, '/;"' . "\t") -+ if tag_line[end - 1] == '$' -+ let end = end -1 -+ endif -+ let {tpat_var} = '\V\^' . strpart(tag_line, start, end - start) . -+ \ (tag_line[end] == '$' ? '\$' : '') -+ -+ return {tpat_var} -+endfunction -+ -+" Tlist_Get_Tag_Linenum -+" Return the tag line number, given the tag index -+function! s:Tlist_Get_Tag_Linenum(fidx, tidx) -+ let tline_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_linenum' -+ -+ " Already parsed and have the tag line number -+ if exists(tline_var) -+ return {tline_var} -+ endif -+ -+ " Parse and extract the tag line number -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let start = strridx(tag_line, 'line:') + 5 -+ let end = strridx(tag_line, "\t") -+ if end < start -+ let {tline_var} = strpart(tag_line, start) + 0 -+ else -+ let {tline_var} = strpart(tag_line, start, end - start) + 0 -+ endif -+ -+ return {tline_var} -+endfunction -+ -+" Tlist_Parse_Tagline -+" Parse a tag line from the ctags output. Separate the tag output based on the -+" tag type and store it in the tag type variable. -+" The format of each line in the ctags output is: -+" -+" tag_namefile_nameex_cmd;"extension_fields -+" -+function! s:Tlist_Parse_Tagline(tag_line) -+ if a:tag_line == '' -+ " Skip empty lines -+ return -+ endif -+ -+ " Extract the tag type -+ let ttype = s:Tlist_Extract_Tagtype(a:tag_line) -+ -+ " 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 -+ -+ " Update the total tag count -+ let s:tidx = s:tidx + 1 -+ -+ " The following variables are used to optimize this code. Vim is slow in -+ " using curly brace names. To reduce the amount of processing needed, the -+ " curly brace variables are pre-processed here -+ let fidx_tidx = 's:tlist_' . s:fidx . '_' . s:tidx -+ let fidx_ttype = 's:tlist_' . s:fidx . '_' . ttype -+ -+ " Update the count of this tag type -+ let ttype_idx = {fidx_ttype}_count + 1 -+ let {fidx_ttype}_count = ttype_idx -+ -+ " Store the ctags output for this tag -+ let {fidx_tidx}_tag = a:tag_line -+ -+ " Store the tag index and the tag type index (back pointers) -+ let {fidx_ttype}_{ttype_idx} = s:tidx -+ let {fidx_tidx}_ttype_idx = ttype_idx -+ -+ " Extract the tag name -+ let tag_name = strpart(a:tag_line, 0, stridx(a:tag_line, "\t")) -+ -+ " Extract the tag scope/prototype -+ if g:Tlist_Display_Prototype -+ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(s:fidx, s:tidx) -+ else -+ let ttxt = ' ' . tag_name -+ -+ " Add the tag scope, if it is available and is configured. Tag -+ " scope is the last field after the 'line:\t' field -+ if g:Tlist_Display_Tag_Scope -+ let tag_scope = s:Tlist_Extract_Tag_Scope(a:tag_line) -+ if tag_scope != '' -+ let ttxt = ttxt . ' [' . tag_scope . ']' -+ endif -+ endif -+ endif -+ -+ " Add this tag to the tag type variable -+ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" -+ -+ " Save the tag name -+ let {fidx_tidx}_tag_name = tag_name -+endfunction -+ -+" Tlist_Process_File -+" Get the list of tags defined in the specified file and store them -+" in Vim variables. Returns the file index where the tags are stored. -+function! s:Tlist_Process_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Process_File (' . a:filename . ', ' . -+ \ a:ftype . ')') -+ " Check whether this file is supported -+ if s:Tlist_Skip_File(a:filename, a:ftype) -+ return -1 -+ endif -+ -+ " If the tag types for this filetype are not yet created, then create -+ " them now -+ let var = 's:tlist_' . a:ftype . '_count' -+ if !exists(var) -+ if s:Tlist_FileType_Init(a:ftype) == 0 -+ return -1 -+ endif -+ endif -+ -+ " If this file is already processed, then use the cached values -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx == -1 -+ " First time, this file is loaded -+ let fidx = s:Tlist_Init_File(a:filename, a:ftype) -+ else -+ " File was previously processed. Discard the tag information -+ call s:Tlist_Discard_TagInfo(fidx) -+ endif -+ -+ let s:tlist_{fidx}_valid = 1 -+ -+ " Exuberant ctags arguments to generate a tag list -+ let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nks ' -+ -+ " Form the ctags argument depending on the sort type -+ if s:tlist_{fidx}_sort_type == 'name' -+ let ctags_args = ctags_args . '--sort=yes' -+ else -+ let ctags_args = ctags_args . '--sort=no' -+ endif -+ -+ " Add the filetype specific arguments -+ let ctags_args = ctags_args . ' ' . s:tlist_{a:ftype}_ctags_args -+ -+ " Ctags command to produce output with regexp for locating the tags -+ let ctags_cmd = g:Tlist_Ctags_Cmd . ctags_args -+ let ctags_cmd = ctags_cmd . ' "' . a:filename . '"' -+ -+ if &shellxquote == '"' -+ " Double-quotes within double-quotes will not work in the -+ " command-line.If the 'shellxquote' option is set to double-quotes, -+ " then escape the double-quotes in the ctags command-line. -+ let ctags_cmd = escape(ctags_cmd, '"') -+ endif -+ -+ " In Windows 95, if not using cygwin, disable the 'shellslash' -+ " option. Otherwise, this will cause problems when running the -+ " ctags command. -+ if has('win95') && !has('win32unix') -+ let old_shellslash = &shellslash -+ set noshellslash -+ endif -+ -+ if has('win32') && !has('win32unix') && !has('win95') -+ \ && (&shell =~ 'cmd.exe') -+ " Windows does not correctly deal with commands that have more than 1 -+ " set of double quotes. It will strip them all resulting in: -+ " 'C:\Program' is not recognized as an internal or external command -+ " operable program or batch file. To work around this, place the -+ " command inside a batch file and call the batch file. -+ " Do this only on Win2K, WinXP and above. -+ " Contributed by: David Fishburn. -+ let s:taglist_tempfile = fnamemodify(tempname(), ':h') . -+ \ '\taglist.cmd' -+ exe 'redir! > ' . s:taglist_tempfile -+ silent echo ctags_cmd -+ redir END -+ -+ call s:Tlist_Log_Msg('Cmd inside batch file: ' . ctags_cmd) -+ let ctags_cmd = '"' . s:taglist_tempfile . '"' -+ endif -+ -+ call s:Tlist_Log_Msg('Cmd: ' . ctags_cmd) -+ -+ " Run ctags and get the tag list -+ let cmd_output = system(ctags_cmd) -+ -+ " Restore the value of the 'shellslash' option. -+ if has('win95') && !has('win32unix') -+ let &shellslash = old_shellslash -+ endif -+ -+ if exists('s:taglist_tempfile') -+ " Delete the temporary cmd file created on MS-Windows -+ call delete(s:taglist_tempfile) -+ endif -+ -+ " Handle errors -+ if v:shell_error -+ let msg = "Taglist: Failed to generate tags for " . a:filename -+ call s:Tlist_Warning_Msg(msg) -+ if cmd_output != '' -+ call s:Tlist_Warning_Msg(cmd_output) -+ endif -+ return fidx -+ endif -+ -+ " Store the modification time for the file -+ let s:tlist_{fidx}_mtime = getftime(a:filename) -+ -+ " No tags for current file -+ if cmd_output == '' -+ call s:Tlist_Log_Msg('No tags defined in ' . a:filename) -+ return fidx -+ endif -+ -+ call s:Tlist_Log_Msg('Generated tags information for ' . a:filename) -+ -+ if v:version > 601 -+ " The following script local variables are used by the -+ " Tlist_Parse_Tagline() function. -+ let s:ctags_flags = s:tlist_{a:ftype}_ctags_flags -+ let s:fidx = fidx -+ let s:tidx = 0 -+ -+ " Process the ctags output one line at a time. The substitute() -+ " command is used to parse the tag lines instead of using the -+ " matchstr()/stridx()/strpart() functions for performance reason -+ call substitute(cmd_output, "\\([^\n]\\+\\)\n", -+ \ '\=s:Tlist_Parse_Tagline(submatch(1))', 'g') -+ -+ " Save the number of tags for this file -+ let s:tlist_{fidx}_tag_count = s:tidx -+ -+ " The following script local variables are no longer needed -+ unlet! s:ctags_flags -+ unlet! s:tidx -+ unlet! s:fidx -+ else -+ " Due to a bug in Vim earlier than version 6.1, -+ " we cannot use substitute() to parse the ctags output. -+ " Instead the slow str*() functions are used -+ let ctags_flags = s:tlist_{a:ftype}_ctags_flags -+ let tidx = 0 -+ -+ while cmd_output != '' -+ " Extract one line at a time -+ let idx = stridx(cmd_output, "\n") -+ let one_line = strpart(cmd_output, 0, idx) -+ " Remove the line from the tags output -+ let cmd_output = strpart(cmd_output, idx + 1) -+ -+ if one_line == '' -+ " Line is not in proper tags format -+ continue -+ endif -+ -+ " Extract the tag type -+ let ttype = s:Tlist_Extract_Tagtype(one_line) -+ -+ " Make sure the tag type is a valid and supported one -+ if ttype == '' || stridx(ctags_flags, ttype) == -1 -+ " Line is not in proper tags format or Tag type is not -+ " supported -+ continue -+ endif -+ -+ " Update the total tag count -+ let tidx = tidx + 1 -+ -+ " The following variables are used to optimize this code. Vim is -+ " slow in using curly brace names. To reduce the amount of -+ " processing needed, the curly brace variables are pre-processed -+ " here -+ let fidx_tidx = 's:tlist_' . fidx . '_' . tidx -+ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype -+ -+ " Update the count of this tag type -+ let ttype_idx = {fidx_ttype}_count + 1 -+ let {fidx_ttype}_count = ttype_idx -+ -+ " Store the ctags output for this tag -+ let {fidx_tidx}_tag = one_line -+ -+ " Store the tag index and the tag type index (back pointers) -+ let {fidx_ttype}_{ttype_idx} = tidx -+ let {fidx_tidx}_ttype_idx = ttype_idx -+ -+ " Extract the tag name -+ let tag_name = strpart(one_line, 0, stridx(one_line, "\t")) -+ -+ " Extract the tag scope/prototype -+ if g:Tlist_Display_Prototype -+ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(fidx, tidx) -+ else -+ let ttxt = ' ' . tag_name -+ -+ " Add the tag scope, if it is available and is configured. Tag -+ " scope is the last field after the 'line:\t' field -+ if g:Tlist_Display_Tag_Scope -+ let tag_scope = s:Tlist_Extract_Tag_Scope(one_line) -+ if tag_scope != '' -+ let ttxt = ttxt . ' [' . tag_scope . ']' -+ endif -+ endif -+ endif -+ -+ " Add this tag to the tag type variable -+ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" -+ -+ " Save the tag name -+ let {fidx_tidx}_tag_name = tag_name -+ endwhile -+ -+ " Save the number of tags for this file -+ let s:tlist_{fidx}_tag_count = tidx -+ endif -+ -+ call s:Tlist_Log_Msg('Processed ' . s:tlist_{fidx}_tag_count . -+ \ ' tags in ' . a:filename) -+ -+ return fidx -+endfunction -+ -+" Tlist_Update_File -+" Update the tags for a file (if needed) -+function! Tlist_Update_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Update_File (' . a:filename . ')') -+ " If the file doesn't support tag listing, skip it -+ if s:Tlist_Skip_File(a:filename, a:ftype) -+ return -+ endif -+ -+ " Convert the file name to a full path -+ let fname = fnamemodify(a:filename, ':p') -+ -+ " First check whether the file already exists -+ let fidx = s:Tlist_Get_File_Index(fname) -+ -+ if fidx != -1 && s:tlist_{fidx}_valid -+ " File exists and the tags are valid -+ " Check whether the file was modified after the last tags update -+ " If it is modified, then update the tags -+ if s:tlist_{fidx}_mtime == getftime(fname) -+ return -+ endif -+ else -+ " If the tags were removed previously based on a user request, -+ " as we are going to update the tags (based on the user request), -+ " remove the filename from the deleted list -+ call s:Tlist_Update_Remove_List(fname, 0) -+ endif -+ -+ " If the taglist window is opened, update it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum == -1 -+ " Taglist window is not present. Just update the taglist -+ " and return -+ call s:Tlist_Process_File(fname, a:ftype) -+ else -+ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != -1 -+ " If tags for only one file are displayed and we are not -+ " updating the tags for that file, then no need to -+ " refresh the taglist window. Otherwise, the taglist -+ " window should be updated. -+ if s:tlist_{s:tlist_cur_file_idx}_filename != fname -+ call s:Tlist_Process_File(fname, a:ftype) -+ return -+ endif -+ endif -+ -+ " Save the current window number -+ let save_winnr = winnr() -+ -+ " Goto the taglist window -+ call s:Tlist_Window_Goto_Window() -+ -+ " Save the cursor position -+ let save_line = line('.') -+ let save_col = col('.') -+ -+ " Update the taglist window -+ call s:Tlist_Window_Refresh_File(fname, a:ftype) -+ -+ " Restore the cursor position -+ if v:version >= 601 -+ call cursor(save_line, save_col) -+ else -+ exe save_line -+ exe 'normal! ' . save_col . '|' -+ endif -+ -+ if winnr() != save_winnr -+ " Go back to the original window -+ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') -+ endif -+ endif -+ -+ " Update the taglist menu -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(1) -+ endif -+endfunction -+ -+" Tlist_Window_Close -+" Close the taglist window -+function! s:Tlist_Window_Close() -+ call s:Tlist_Log_Msg('Tlist_Window_Close()') -+ " Make sure the taglist window exists -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum == -1 -+ call s:Tlist_Warning_Msg('Error: Taglist window is not open') -+ return -+ endif -+ -+ if winnr() == winnum -+ " Already in the taglist window. Close it and return -+ if winbufnr(2) != -1 -+ " If a window other than the taglist window is open, -+ " then only close the taglist window. -+ close -+ endif -+ else -+ " Goto the taglist window, close it and then come back to the -+ " original window -+ let curbufnr = bufnr('%') -+ exe winnum . '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 -+endfunction -+ -+" Tlist_Window_Mark_File_Window -+" Mark the current window as the file window to use when jumping to a tag. -+" Only if the current window is a non-plugin, non-preview and non-taglist -+" window -+function! s:Tlist_Window_Mark_File_Window() -+ if getbufvar('%', '&buftype') == '' && !&previewwindow -+ let w:tlist_file_window = "yes" -+ endif -+endfunction -+ -+" Tlist_Window_Open -+" Open and refresh the taglist window -+function! s:Tlist_Window_Open() -+ call s:Tlist_Log_Msg('Tlist_Window_Open()') -+ " If the window is open, jump to it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ " Jump to the existing window -+ if winnr() != winnum -+ exe winnum . 'wincmd w' -+ endif -+ return -+ endif -+ -+ if s:tlist_app_name == "winmanager" -+ " Taglist plugin is no longer part of the winmanager app -+ let s:tlist_app_name = "none" -+ endif -+ -+ " Get the filename and filetype for the specified buffer -+ let curbuf_name = fnamemodify(bufname('%'), ':p') -+ let curbuf_ftype = getbufvar('%', '&filetype') -+ let cur_lnum = line('.') -+ -+ " Mark the current window as the desired window to open a file when a tag -+ " is selected. -+ call s:Tlist_Window_Mark_File_Window() -+ -+ " Open the taglist window -+ call s:Tlist_Window_Create() -+ -+ call s:Tlist_Window_Refresh() -+ -+ if g:Tlist_Show_One_File -+ " Add only the current buffer and file -+ " -+ " If the file doesn't support tag listing, skip it -+ if !s:Tlist_Skip_File(curbuf_name, curbuf_ftype) -+ call s:Tlist_Window_Refresh_File(curbuf_name, curbuf_ftype) -+ endif -+ endif -+ -+ if g:Tlist_File_Fold_Auto_Close -+ " Open the fold for the current file, as all the folds in -+ " the taglist window are closed -+ let fidx = s:Tlist_Get_File_Index(curbuf_name) -+ if fidx != -1 -+ exe "silent! " . s:tlist_{fidx}_start . "," . -+ \ s:tlist_{fidx}_end . "foldopen!" -+ endif -+ endif -+ -+ " Highlight the current tag -+ call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) -+endfunction -+ -+" Tlist_Window_Toggle() -+" Open or close a taglist window -+function! s:Tlist_Window_Toggle() -+ call s:Tlist_Log_Msg('Tlist_Window_Toggle()') -+ " If taglist window is open then close it. -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ call s:Tlist_Window_Close() -+ return -+ endif -+ -+ call s:Tlist_Window_Open() -+ -+ " 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 -+ call s:Tlist_Menu_Update_File(0) -+ endif -+endfunction -+ -+" 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 -+ -+ " 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 -+ -+ " 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) -+ -+ let all_files = strpart(all_files, nl_idx + 1) -+ if one_file == '' -+ continue -+ endif -+ -+ " Skip non-directory names -+ if !isdirectory(one_file) -+ continue -+ endif -+ -+ 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 -+" Add files recursively from a directory -+function! s:Tlist_Add_Files_Recursive(dir, ...) -+ let dir_name = fnamemodify(a:dir, ':p') -+ if !isdirectory(dir_name) -+ call s:Tlist_Warning_Msg('Error: ' . dir_name . ' is not a directory') -+ return -+ endif -+ -+ if a:0 == 1 -+ " User specified file pattern -+ let pat = a:1 -+ else -+ " Default file pattern -+ let pat = '*' -+ endif -+ -+ echon "\r " -+ echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t') -+ let fcnt = s:Tlist_Process_Dir(dir_name, pat) -+ -+ echon "\rAdded " . fcnt . " files to the taglist" -+endfunction -+ -+" Tlist_Add_Files -+" Add the specified list of files to the taglist -+function! s:Tlist_Add_Files(...) -+ let flist = '' -+ let i = 1 -+ -+ " Get all the files matching the file patterns supplied as argument -+ while i <= a:0 -+ let flist = flist . glob(a:{i}) . "\n" -+ let i = i + 1 -+ endwhile -+ -+ if flist == '' -+ call s:Tlist_Warning_Msg('Error: No matching files are found') -+ return -+ endif -+ -+ let fcnt = s:Tlist_Process_Filelist(flist) -+ echon "\rAdded " . fcnt . " files to the taglist" -+endfunction -+ -+" Tlist_Extract_Tagtype -+" Extract the tag type from the tag text -+function! s:Tlist_Extract_Tagtype(tag_line) -+ " The tag type is after the tag prototype field. The prototype field -+ " ends with the /;"\t string. We add 4 at the end to skip the characters -+ " in this special string.. -+ let start = strridx(a:tag_line, '/;"' . "\t") + 4 -+ let end = strridx(a:tag_line, 'line:') - 1 -+ let ttype = strpart(a:tag_line, start, end - start) -+ -+ return ttype -+endfunction -+ -+" Tlist_Extract_Tag_Scope -+" Extract the tag scope from the tag text -+function! s:Tlist_Extract_Tag_Scope(tag_line) -+ let start = strridx(a:tag_line, 'line:') -+ let end = strridx(a:tag_line, "\t") -+ if end <= start -+ return '' -+ endif -+ -+ let tag_scope = strpart(a:tag_line, end + 1) -+ let tag_scope = strpart(tag_scope, stridx(tag_scope, ':') + 1) -+ -+ return tag_scope -+endfunction -+ -+" Tlist_Refresh() -+" Refresh the taglist -+function! s:Tlist_Refresh() -+ call s:Tlist_Log_Msg('Tlist_Refresh (Skip_Refresh = ' . -+ \ s:Tlist_Skip_Refresh . ', ' . bufname('%') . ')') -+ " If we are entering the buffer from one of the taglist functions, then -+ " no need to refresh the taglist window again. -+ if s:Tlist_Skip_Refresh -+ " We still need to update the taglist menu -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(0) -+ endif -+ return -+ endif -+ -+ " If part of the winmanager plugin and not configured to process -+ " tags always and not configured to display the tags menu, then return -+ if (s:tlist_app_name == 'winmanager') && !g:Tlist_Process_File_Always -+ \ && !g:Tlist_Show_Menu -+ return -+ endif -+ -+ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help -+ if &buftype != '' -+ return -+ endif -+ -+ let filename = fnamemodify(bufname('%'), ':p') -+ let ftype = &filetype -+ -+ " If the file doesn't support tag listing, skip it -+ if s:Tlist_Skip_File(filename, ftype) -+ return -+ endif -+ -+ let tlist_win = bufwinnr(g:TagList_title) -+ -+ " If the taglist window is not opened and not configured to process -+ " tags always and not displaying the tags menu, then return -+ if tlist_win == -1 && !g:Tlist_Process_File_Always && !g:Tlist_Show_Menu -+ return -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 -+ " Check whether this file is removed based on user request -+ " If it is, then don't display the tags for this file -+ if s:Tlist_User_Removed_File(filename) -+ return -+ endif -+ -+ " If the taglist should not be auto updated, then return -+ if !g:Tlist_Auto_Update -+ return -+ endif -+ endif -+ -+ let cur_lnum = line('.') -+ -+ if fidx == -1 -+ " Update the tags for the file -+ let fidx = s:Tlist_Process_File(filename, ftype) -+ else -+ let mtime = getftime(filename) -+ if s:tlist_{fidx}_mtime != mtime -+ " Invalidate the tags listed for this file -+ let s:tlist_{fidx}_valid = 0 -+ -+ " Update the taglist and the window -+ call Tlist_Update_File(filename, ftype) -+ -+ " Store the new file modification time -+ let s:tlist_{fidx}_mtime = mtime -+ endif -+ endif -+ -+ " Update the taglist window -+ if tlist_win != -1 -+ " Disable screen updates -+ let old_lazyredraw = &lazyredraw -+ set nolazyredraw -+ -+ " Save the current window number -+ let save_winnr = winnr() -+ -+ " Goto the taglist window -+ call s:Tlist_Window_Goto_Window() -+ -+ if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter -+ " Save the cursor position -+ let save_line = line('.') -+ let save_col = col('.') -+ endif -+ -+ " Update the taglist window -+ call s:Tlist_Window_Refresh_File(filename, ftype) -+ -+ " Open the fold for the file -+ exe "silent! " . s:tlist_{fidx}_start . "," . -+ \ s:tlist_{fidx}_end . "foldopen!" -+ -+ if g:Tlist_Highlight_Tag_On_BufEnter && g:Tlist_Auto_Highlight_Tag -+ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != fidx -+ " If displaying tags for only one file in the taglist -+ " window and about to display the tags for a new file, -+ " then center the current tag line for the new file -+ let center_tag_line = 1 -+ else -+ let center_tag_line = 0 -+ endif -+ -+ " Highlight the current tag -+ call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) -+ else -+ " Restore the cursor position -+ if v:version >= 601 -+ call cursor(save_line, save_col) -+ else -+ exe save_line -+ exe 'normal! ' . save_col . '|' -+ endif -+ endif -+ -+ " Jump back to the original window -+ if save_winnr != winnr() -+ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') -+ endif -+ -+ " Restore screen updates -+ let &lazyredraw = old_lazyredraw -+ endif -+ -+ " Update the taglist menu -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(0) -+ endif -+endfunction -+ -+" Tlist_Change_Sort() -+" Change the sort order of the tag listing -+" caller == 'cmd', command used in the taglist window -+" caller == 'menu', taglist menu -+" action == 'toggle', toggle sort from name to order and vice versa -+" action == 'set', set the sort order to sort_type -+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 == 'cmd' -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ -+ " Remove the previous highlighting -+ match none -+ elseif a:caller == 'menu' -+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) -+ if fidx == -1 -+ return -+ endif -+ endif -+ -+ if a:action == 'toggle' -+ let sort_type = s:tlist_{fidx}_sort_type -+ -+ " Toggle the sort order from 'name' to 'order' and vice versa -+ if sort_type == 'name' -+ let s:tlist_{fidx}_sort_type = 'order' -+ else -+ let s:tlist_{fidx}_sort_type = 'name' -+ endif -+ else -+ let s:tlist_{fidx}_sort_type = a:sort_type -+ endif -+ -+ " Invalidate the tags listed for this file -+ let s:tlist_{fidx}_valid = 0 -+ -+ if a:caller == 'cmd' -+ " Save the current line for later restoration -+ let curline = '\V\^' . getline('.') . '\$' -+ -+ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, -+ \ s:tlist_{fidx}_filetype) -+ -+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' -+ -+ " Go back to the cursor line before the tag list is sorted -+ call search(curline, 'w') -+ -+ call s:Tlist_Menu_Update_File(1) -+ else -+ call s:Tlist_Menu_Remove_File() -+ -+ call s:Tlist_Refresh() -+ endif -+endfunction -+ -+" Tlist_Update_Current_File() -+" Update taglist for the current buffer by regenerating the tag list -+" Contributed by WEN Guopeng. -+function! s:Tlist_Update_Current_File() -+ call s:Tlist_Log_Msg('Tlist_Update_Current_File()') -+ if winnr() == bufwinnr(g:TagList_title) -+ " In the taglist window. Update the current file -+ call s:Tlist_Window_Update_File() -+ else -+ " Not in the taglist window. Update the current buffer -+ let filename = fnamemodify(bufname('%'), ':p') -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx != -1 -+ let s:tlist_{fidx}_valid = 0 -+ endif -+ call Tlist_Update_File(filename, &filetype) -+ endif -+endfunction -+ -+" Tlist_Window_Update_File() -+" 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_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ -+ " Remove the previous highlighting -+ match none -+ -+ " Save the current line for later restoration -+ let curline = '\V\^' . getline('.') . '\$' -+ -+ let s:tlist_{fidx}_valid = 0 -+ -+ " Update the taglist window -+ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, -+ \ s:tlist_{fidx}_filetype) -+ -+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' -+ -+ " Go back to the tag line before the list is updated -+ call search(curline, 'w') -+endfunction -+ -+" Tlist_Window_Get_Tag_Type_By_Linenum() -+" Return the tag type index for the specified line in the taglist window -+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 -+ " tag type start line number and the number of tags in a tag type -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{i}_name -+ let start_lnum = -+ \ s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset -+ let end = start_lnum + s:tlist_{a:fidx}_{ttype}_count -+ if a:lnum >= start_lnum && a:lnum <= end -+ break -+ endif -+ let i = i + 1 -+ endwhile -+ -+ " Current line doesn't belong to any of the displayed tag types -+ if i > s:tlist_{ftype}_count -+ return '' -+ endif -+ -+ return ttype -+endfunction -+ -+" 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 == '' -+ return 0 -+ endif -+ -+ " Compute the index into the displayed tags for the tag type -+ let ttype_lnum = s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset -+ let tidx = a:lnum - ttype_lnum -+ if tidx == 0 -+ return 0 -+ endif -+ -+ " Get the corresponding tag line and return it -+ return s:tlist_{a:fidx}_{ttype}_{tidx} -+endfunction -+ -+" Tlist_Window_Highlight_Line -+" Highlight the current line -+function! s:Tlist_Window_Highlight_Line() -+ " Clear previously selected name -+ match none -+ -+ " Highlight the current line -+ if g:Tlist_Display_Prototype == 0 -+ let pat = '/\%' . line('.') . 'l\s\+\zs.*/' -+ else -+ let pat = '/\%' . line('.') . 'l.*/' -+ endif -+ -+ exe 'match TagListTagName ' . pat -+endfunction -+ -+" 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_Window_Open_File(win_ctrl, filename, tagpat) -+ 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 == '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 -+ 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 -+ let first_usable_win = 0 -+ -+ let i = 1 -+ let bnum = winbufnr(i) -+ while bnum != -1 -+ if getwinvar(i, 'tlist_file_window') == 'yes' -+ let fwin_num = i -+ break -+ endif -+ if first_usable_win == 0 && -+ \ getbufvar(bnum, '&buftype') == '' && -+ \ !getwinvar(i, '&previewwindow') -+ " First non-taglist, non-plugin and non-preview window -+ let first_usable_win = i -+ endif -+ let i = i + 1 -+ let bnum = winbufnr(i) -+ endwhile -+ -+ " If a previously used window is not found, then use the first -+ " non-taglist window -+ if fwin_num == 0 -+ let fwin_num = first_usable_win -+ endif -+ -+ if fwin_num != 0 -+ " Jump to the file window -+ exe fwin_num . "wincmd w" -+ -+ " If the user asked to jump to the tag in a new window, then split -+ " the existing window into two. -+ if a:win_ctrl == 'newwin' -+ split -+ endif -+ exe "edit " . escape(a:filename, ' ') -+ else -+ " Open a new window -+ if g:Tlist_Use_Horiz_Window -+ exe 'leftabove split ' . escape(a:filename, ' ') -+ else -+ if winbufnr(2) == -1 -+ " Only the taglist window is present -+ if g:Tlist_Use_Right_Window -+ exe 'leftabove vertical split ' . -+ \ escape(a:filename, ' ') -+ else -+ exe 'rightbelow vertical split ' . -+ \ escape(a:filename, ' ') -+ endif -+ -+ " Go to the taglist window to change the window size to -+ " the user configured value -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ if g:Tlist_Use_Horiz_Window -+ exe 'resize ' . g:Tlist_WinHeight -+ else -+ exe 'vertical resize ' . g:Tlist_WinWidth -+ endif -+ " Go back to the file window -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ else -+ " A plugin or help window is also present -+ wincmd w -+ exe 'leftabove split ' . escape(a:filename, ' ') -+ endif -+ endif -+ endif -+ " Mark the window, so that it can be reused. -+ call s:Tlist_Window_Mark_File_Window() -+ else -+ if v:version >= 700 -+ " If the file is opened in more than one window, then check -+ " whether the last accessed window has the selected file. -+ " If it does, then use that window. -+ let lastwin_bufnum = winbufnr(winnr('#')) -+ if bufnr(a:filename) == lastwin_bufnum -+ let winnum = winnr('#') -+ endif -+ endif -+ exe winnum . 'wincmd w' -+ -+ " If the user asked to jump to the tag in a new window, then split the -+ " existing window into two. -+ if a:win_ctrl == 'newwin' -+ split -+ endif -+ endif -+ endif -+ -+ " Jump to the tag -+ if a:tagpat != '' -+ " Add the current cursor position to the jump list, so that user can -+ " jump back using the ' and ` marks. -+ mark ' -+ silent call search(a:tagpat, 'w') -+ -+ " Bring the line to the middle of the window -+ normal! z. -+ -+ " If the line is inside a fold, open the fold -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+ endif -+ -+ " If the user selects to preview the tag then jump back to the -+ " taglist window -+ if a:win_ctrl == 'preview' -+ " Go back to the taglist window -+ let winnum = bufwinnr(g:TagList_title) -+ exe winnum . 'wincmd w' -+ else -+ " 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_Window_Goto_Window() -+ close -+ -+ " Go back to the window displaying the selected file -+ let wnum = bufwinnr(a:filename) -+ if wnum != -1 && wnum != winnr() -+ call s:Tlist_Exe_Cmd_No_Acmds(wnum . 'wincmd w') -+ endif -+ endif -+ endif -+ -+ let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh -+endfunction -+ -+" Tlist_Window_Jump_To_Tag() -+" Jump to the location of the current 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(' . a:win_ctrl . ')') -+ " Do not process comment lines and empty lines -+ let curline = getline('.') -+ if curline =~ '^\s*$' || curline[0] == '"' -+ return -+ endif -+ -+ " If inside a closed fold, then use the first line of the fold -+ " and jump to the file. -+ let lnum = foldclosed('.') -+ if lnum == -1 -+ " Jump to the selected tag or file -+ let lnum = line('.') -+ else -+ " Open the closed fold -+ .foldopen! -+ endif -+ -+ 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_Window_Get_Tag_Index(fidx, lnum) -+ if tidx != 0 -+ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx) -+ -+ " Highlight the tagline -+ call s:Tlist_Window_Highlight_Line() -+ else -+ " Selected a line which is not a tag name. Just edit the file -+ let tagpat = '' -+ endif -+ -+ call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) -+endfunction -+ -+" Tlist_Window_Show_Info() -+" Display information about the entry under the cursor -+function! s:Tlist_Window_Show_Info() -+ call s:Tlist_Log_Msg('Tlist_Window_Show_Info()') -+ -+ " Clear the previously displayed line -+ echo -+ -+ " Do not process comment lines and empty lines -+ let curline = getline('.') -+ if curline =~ '^\s*$' || curline[0] == '"' -+ return -+ endif -+ -+ " If inside a fold, then don't display the prototype -+ if foldclosed('.') != -1 -+ return -+ endif -+ -+ let lnum = line('.') -+ -+ " Get the file index -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) -+ if fidx == -1 -+ return -+ endif -+ -+ if lnum == s:tlist_{fidx}_start -+ " Cursor is on a file name -+ let fname = s:tlist_{fidx}_filename -+ if strlen(fname) > 50 -+ let fname = fnamemodify(fname, ':t') -+ endif -+ echo fname . ', Filetype=' . s:tlist_{fidx}_filetype . -+ \ ', Tag count=' . s:tlist_{fidx}_tag_count -+ return -+ endif -+ -+ " Get the tag output line for the current tag -+ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) -+ if tidx == 0 -+ " Cursor is on a tag type -+ let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) -+ if ttype == '' -+ return -+ endif -+ -+ let ttype_name = '' -+ -+ let ftype = s:tlist_{fidx}_filetype -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ if ttype == s:tlist_{ftype}_{i}_name -+ let ttype_name = s:tlist_{ftype}_{i}_fullname -+ break -+ endif -+ let i = i + 1 -+ endwhile -+ -+ echo 'Tag type=' . ttype_name . -+ \ ', Tag count=' . s:tlist_{fidx}_{ttype}_count -+ return -+ endif -+ -+ " Get the tag search pattern and display it -+ echo s:Tlist_Get_Tag_Prototype(fidx, tidx) -+endfunction -+ -+" Tlist_Find_Nearest_Tag_Idx -+" Find the tag idx nearest to the supplied line number -+" Returns -1, if a tag couldn't be found for the specified line number -+function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum) -+ let sort_type = s:tlist_{a:fidx}_sort_type -+ -+ let left = 1 -+ let right = s:tlist_{a:fidx}_tag_count -+ -+ if sort_type == 'order' -+ " Tags sorted by order, use a binary search. -+ " The idea behind this function is taken from the ctags.vim script (by -+ " Alexey Marinichev) available at the Vim online website. -+ -+ " If the current line is the less than the first tag, then no need to -+ " search -+ let first_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, 1) -+ -+ if a:linenum < first_lnum -+ return -1 -+ endif -+ -+ while left < right -+ let middle = (right + left + 1) / 2 -+ let middle_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, middle) -+ -+ if middle_lnum == a:linenum -+ let left = middle -+ break -+ endif -+ -+ if middle_lnum > a:linenum -+ let right = middle - 1 -+ else -+ let left = middle -+ endif -+ endwhile -+ else -+ " Tags sorted by name, use a linear search. (contributed by Dave -+ " Eggum). -+ " Look for a tag with a line number less than or equal to the supplied -+ " line number. If multiple tags are found, then use the tag with the -+ " line number closest to the supplied line number. IOW, use the tag -+ " with the highest line number. -+ let closest_lnum = 0 -+ let final_left = 0 -+ while left <= right -+ let lnum = s:Tlist_Get_Tag_Linenum(a:fidx, left) -+ -+ if lnum < a:linenum && lnum > closest_lnum -+ let closest_lnum = lnum -+ let final_left = left -+ elseif lnum == a:linenum -+ let closest_lnum = lnum -+ let final_left = left -+ break -+ else -+ let left = left + 1 -+ endif -+ endwhile -+ if closest_lnum == 0 -+ return -1 -+ endif -+ if left >= right -+ let left = final_left -+ endif -+ endif -+ -+ return left -+endfunction -+ -+" 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_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. -+ if !g:Tlist_Auto_Highlight_Tag && a:cntx == 1 -+ return -+ endif -+ -+ if a:filename == '' -+ return -+ endif -+ -+ " 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 -+ -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx == -1 -+ return -+ endif -+ -+ " If the file is currently not displayed in the taglist window, then retrn -+ if !s:tlist_{fidx}_visible -+ return -+ endif -+ -+ " If there are no tags for this file, then no need to proceed further -+ if s:tlist_{fidx}_tag_count == 0 -+ return -+ endif -+ -+ " Ignore all autocommands -+ let old_ei = &eventignore -+ set eventignore=all -+ -+ " Save the original window number -+ let org_winnr = winnr() -+ -+ if org_winnr == winnum -+ let in_taglist_window = 1 -+ else -+ let in_taglist_window = 0 -+ endif -+ -+ " Go to the taglist window -+ if !in_taglist_window -+ exe winnum . 'wincmd w' -+ endif -+ -+ " Clear previously selected name -+ match none -+ -+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, a:cur_lnum) -+ if tidx == -1 -+ " Make sure the current tag line is visible in the taglist window. -+ " Calling the winline() function makes the line visible. Don't know -+ " of a better way to achieve this. -+ let lnum = line('.') -+ -+ if lnum < s:tlist_{fidx}_start || lnum > s:tlist_{fidx}_end -+ " Move the cursor to the beginning of the file -+ exe s:tlist_{fidx}_start -+ endif -+ -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+ -+ call winline() -+ -+ if !in_taglist_window -+ exe org_winnr . 'wincmd w' -+ endif -+ -+ " Restore the autocommands -+ let &eventignore = old_ei -+ return -+ endif -+ -+ " Extract the tag type -+ let ttype = s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) -+ -+ " Compute the line number -+ " Start of file + Start of tag type + offset -+ let lnum = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + -+ \ s:tlist_{fidx}_{tidx}_ttype_idx -+ -+ " Goto the line containing the tag -+ exe lnum -+ -+ " Open the fold -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+ -+ if a:center -+ " Move the tag line to the center of the taglist window -+ normal! z. -+ else -+ " Make sure the current tag line is visible in the taglist window. -+ " Calling the winline() function makes the line visible. Don't know -+ " of a better way to achieve this. -+ call winline() -+ endif -+ -+ " Highlight the tag name -+ call s:Tlist_Window_Highlight_Line() -+ -+ " Go back to the original window -+ if !in_taglist_window -+ exe org_winnr . 'wincmd w' -+ endif -+ -+ " Restore the autocommands -+ let &eventignore = old_ei -+ return -+endfunction -+ -+" Tlist_Get_Tag_Prototype_By_Line -+" Get the prototype for the tag on or before the specified line number in the -+" current buffer -+function! Tlist_Get_Tag_Prototype_By_Line(...) -+ if a:0 == 0 -+ " Arguments are not supplied. Use the current buffer name -+ " and line number -+ let filename = bufname('%') -+ let linenr = line('.') -+ elseif a:0 == 2 -+ " Filename and line number are specified -+ let filename = a:1 -+ let linenr = a:2 -+ if linenr !~ '\d\+' -+ " Invalid line number -+ return "" -+ endif -+ else -+ " Sufficient arguments are not supplied -+ let msg = 'Usage: Tlist_Get_Tag_Prototype_By_Line ' . -+ \ '' -+ call s:Tlist_Warning_Msg(msg) -+ return "" -+ endif -+ -+ " Expand the file to a fully qualified name -+ let filename = fnamemodify(filename, ':p') -+ if filename == '' -+ return "" -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 -+ return "" -+ endif -+ -+ " If there are no tags for this file, then no need to proceed further -+ if s:tlist_{fidx}_tag_count == 0 -+ return "" -+ endif -+ -+ " Get the tag text using the line number -+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) -+ if tidx == -1 -+ return "" -+ endif -+ -+ return s:Tlist_Get_Tag_Prototype(fidx, tidx) -+endfunction -+ -+" Tlist_Get_Tagname_By_Line -+" Get the tag name on or before the specified line number in the -+" current buffer -+function! Tlist_Get_Tagname_By_Line(...) -+ if a:0 == 0 -+ " Arguments are not supplied. Use the current buffer name -+ " and line number -+ let filename = bufname('%') -+ let linenr = line('.') -+ elseif a:0 == 2 -+ " Filename and line number are specified -+ let filename = a:1 -+ let linenr = a:2 -+ if linenr !~ '\d\+' -+ " Invalid line number -+ return "" -+ endif -+ else -+ " Sufficient arguments are not supplied -+ let msg = 'Usage: Tlist_Get_Tagname_By_Line ' -+ call s:Tlist_Warning_Msg(msg) -+ return "" -+ endif -+ -+ " Make sure the current file has a name -+ let filename = fnamemodify(filename, ':p') -+ if filename == '' -+ return "" -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 -+ return "" -+ endif -+ -+ " If there are no tags for this file, then no need to proceed further -+ if s:tlist_{fidx}_tag_count == 0 -+ return "" -+ endif -+ -+ " Get the tag name using the line number -+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) -+ if tidx == -1 -+ return "" -+ endif -+ -+ return s:tlist_{fidx}_{tidx}_tag_name -+endfunction -+ -+" 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_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 -+ if a:dir == -1 -+ normal! zk -+ else -+ " While moving down to the start of the next fold, -+ " no need to do go to the start of the next file. -+ normal! zj -+ return -+ endif -+ endif -+ -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ -+ let cur_lnum = line('.') -+ -+ if a:dir == -1 -+ if cur_lnum > s:tlist_{fidx}_start -+ " Move to the beginning of the current file -+ exe s:tlist_{fidx}_start -+ return -+ endif -+ -+ 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 -+ -+ 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 -+ " Cursor is at the last file, wrap around to the first file -+ let fidx = 0 -+ endif -+ -+ if s:tlist_{fidx}_start != 0 -+ exe s:tlist_{fidx}_start -+ endif -+ return -+ endif -+endfunction -+ -+" Tlist_Session_Load -+" Load a taglist session (information about all the displayed files -+" and the tags) from the specified file -+function! s:Tlist_Session_Load(...) -+ if a:0 == 0 || a:1 == '' -+ call s:Tlist_Warning_Msg('Usage: TlistSessionLoad ') -+ return -+ endif -+ -+ let sessionfile = a:1 -+ -+ if !filereadable(sessionfile) -+ let msg = 'Taglist: Error - Unable to open file ' . sessionfile -+ call s:Tlist_Warning_Msg(msg) -+ return -+ endif -+ -+ " Mark the current window as the file window -+ call s:Tlist_Window_Mark_File_Window() -+ -+ " Source the session file -+ exe 'source ' . sessionfile -+ -+ let new_file_count = g:tlist_file_count -+ unlet! g:tlist_file_count -+ -+ let i = 0 -+ while i < new_file_count -+ let ftype = g:tlist_{i}_filetype -+ unlet! g:tlist_{i}_filetype -+ -+ if !exists('s:tlist_' . ftype . '_count') -+ if s:Tlist_FileType_Init(ftype) == 0 -+ let i = i + 1 -+ continue -+ endif -+ endif -+ -+ let fname = g:tlist_{i}_filename -+ unlet! g:tlist_{i}_filename -+ -+ let fidx = s:Tlist_Get_File_Index(fname) -+ if fidx != -1 -+ let s:tlist_{fidx}_visible = 0 -+ let i = i + 1 -+ continue -+ else -+ " As we are loading the tags from the session file, if this -+ " file was previously deleted by the user, now we need to -+ " add it back. So remove the file from the deleted list. -+ call s:Tlist_Update_Remove_List(fname, 0) -+ endif -+ -+ let fidx = s:Tlist_Init_File(fname, ftype) -+ -+ let s:tlist_{fidx}_filename = fname -+ -+ let s:tlist_{fidx}_sort_type = g:tlist_{i}_sort_type -+ unlet! g:tlist_{i}_sort_type -+ -+ let s:tlist_{fidx}_filetype = ftype -+ let s:tlist_{fidx}_mtime = getftime(fname) -+ -+ let s:tlist_{fidx}_start = 0 -+ let s:tlist_{fidx}_end = 0 -+ -+ let s:tlist_{fidx}_valid = 1 -+ -+ let s:tlist_{fidx}_tag_count = g:tlist_{i}_tag_count -+ unlet! g:tlist_{i}_tag_count -+ -+ let j = 1 -+ while j <= s:tlist_{fidx}_tag_count -+ let s:tlist_{fidx}_{j}_tag = g:tlist_{i}_{j}_tag -+ let s:tlist_{fidx}_{j}_tag_name = g:tlist_{i}_{j}_tag_name -+ let s:tlist_{fidx}_{j}_ttype_idx = g:tlist_{i}_{j}_ttype_idx -+ unlet! g:tlist_{i}_{j}_tag -+ unlet! g:tlist_{i}_{j}_tag_name -+ unlet! g:tlist_{i}_{j}_ttype_idx -+ let j = j + 1 -+ endwhile -+ -+ let j = 1 -+ while j <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{j}_name -+ -+ if exists('g:tlist_' . i . '_' . ttype) -+ let s:tlist_{fidx}_{ttype} = g:tlist_{i}_{ttype} -+ unlet! g:tlist_{i}_{ttype} -+ let s:tlist_{fidx}_{ttype}_offset = 0 -+ let s:tlist_{fidx}_{ttype}_count = g:tlist_{i}_{ttype}_count -+ unlet! g:tlist_{i}_{ttype}_count -+ -+ let k = 1 -+ while k <= s:tlist_{fidx}_{ttype}_count -+ let s:tlist_{fidx}_{ttype}_{k} = g:tlist_{i}_{ttype}_{k} -+ unlet! g:tlist_{i}_{ttype}_{k} -+ let k = k + 1 -+ endwhile -+ else -+ let s:tlist_{fidx}_{ttype} = '' -+ let s:tlist_{fidx}_{ttype}_offset = 0 -+ let s:tlist_{fidx}_{ttype}_count = 0 -+ endif -+ -+ let j = j + 1 -+ endwhile -+ -+ let i = i + 1 -+ endwhile -+ -+ " If the taglist window is open, then update it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ let save_winnr = winnr() -+ -+ " Goto the taglist window -+ call s:Tlist_Window_Goto_Window() -+ -+ " Refresh the taglist window -+ call s:Tlist_Window_Refresh() -+ -+ " Go back to the original window -+ if save_winnr != winnr() -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ endif -+ endif -+endfunction -+ -+" Tlist_Session_Save -+" Save a taglist session (information about all the displayed files -+" and the tags) into the specified file -+function! s:Tlist_Session_Save(...) -+ if a:0 == 0 || a:1 == '' -+ call s:Tlist_Warning_Msg('Usage: TlistSessionSave ') -+ return -+ endif -+ -+ let sessionfile = a:1 -+ -+ if s:tlist_file_count == 0 -+ " There is nothing to save -+ call s:Tlist_Warning_Msg('Warning: Taglist is empty. Nothing to save.') -+ return -+ endif -+ -+ if filereadable(sessionfile) -+ let ans = input('Do you want to overwrite ' . sessionfile . ' (Y/N)?') -+ if ans !=? 'y' -+ return -+ endif -+ -+ echo "\n" -+ endif -+ -+ let old_verbose = &verbose -+ set verbose&vim -+ -+ exe 'redir! > ' . sessionfile -+ -+ silent! echo '" Taglist session file. This file is auto-generated.' -+ silent! echo '" File information' -+ silent! echo 'let tlist_file_count = ' . s:tlist_file_count -+ -+ let i = 0 -+ -+ while i < s:tlist_file_count -+ " Store information about the file -+ silent! echo 'let tlist_' . i . "_filename = '" . -+ \ s:tlist_{i}_filename . "'" -+ silent! echo 'let tlist_' . i . '_sort_type = "' . -+ \ s:tlist_{i}_sort_type . '"' -+ silent! echo 'let tlist_' . i . '_filetype = "' . -+ \ s:tlist_{i}_filetype . '"' -+ silent! echo 'let tlist_' . i . '_tag_count = ' . -+ \ s:tlist_{i}_tag_count -+ " Store information about all the tags -+ let j = 1 -+ while j <= s:tlist_{i}_tag_count -+ let txt = escape(s:tlist_{i}_{j}_tag, '"\\') -+ silent! echo 'let tlist_' . i . '_' . j . '_tag = "' . txt . '"' -+ silent! echo 'let tlist_' . i . '_' . j . '_tag_name = "' . -+ \ s:tlist_{i}_{j}_tag_name . '"' -+ silent! echo 'let tlist_' . i . '_' . j . '_ttype_idx' . ' = ' . -+ \ s:tlist_{i}_{j}_ttype_idx -+ let j = j + 1 -+ endwhile -+ -+ " Store information about all the tags grouped by their type -+ let ftype = s:tlist_{i}_filetype -+ let j = 1 -+ while j <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{j}_name -+ if s:tlist_{i}_{ttype}_count != 0 -+ let txt = substitute(s:tlist_{i}_{ttype}, "\n", "\\\\n", 'g') -+ silent! echo 'let tlist_' . i . '_' . ttype . ' = "' . -+ \ txt . '"' -+ silent! echo 'let tlist_' . i . '_' . ttype . '_count = ' . -+ \ s:tlist_{i}_{ttype}_count -+ let k = 1 -+ while k <= s:tlist_{i}_{ttype}_count -+ silent! echo 'let tlist_' . i . '_' . ttype . '_' . k . -+ \ ' = ' . s:tlist_{i}_{ttype}_{k} -+ let k = k + 1 -+ endwhile -+ endif -+ let j = j + 1 -+ endwhile -+ -+ silent! echo -+ -+ let i = i + 1 -+ endwhile -+ -+ redir END -+ -+ let &verbose = old_verbose -+endfunction -+ -+" Tlist_Buffer_Removed -+" 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 . ')') -+ -+ " Make sure a valid filename is supplied -+ if a:filename == '' -+ return -+ endif -+ -+ " Get tag list index of the specified file -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx == -1 -+ " File not present in the taglist -+ return -+ endif -+ -+ " Remove the file from the list -+ call s:Tlist_Remove_File(fidx, 0) -+endfunction -+ -+" When a buffer is deleted, remove the file from the taglist -+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(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) -+ if winnum == -1 -+ call s:Tlist_Warning_Msg('Taglist: Error - Taglist window is not open') -+ return -+ endif -+ -+ " Save the original window number -+ let org_winnr = winnr() -+ if org_winnr == winnum -+ let in_taglist_window = 1 -+ else -+ let in_taglist_window = 0 -+ endif -+ -+ if in_taglist_window -+ " When entering the taglist window, no need to update the folds -+ return -+ endif -+ -+ " Go to the taglist window -+ if !in_taglist_window -+ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') -+ endif -+ -+ " Close all the folds -+ silent! %foldclose -+ -+ " Get tag list index of the specified file -+ 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 -+ if !in_taglist_window -+ call s:Tlist_Exe_Cmd_No_Acmds(org_winnr . 'wincmd w') -+ endif -+endfunction -+ -+" 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_Window_Check_Auto_Open() -+ let open_window = 0 -+ -+ let i = 1 -+ let buf_num = winbufnr(i) -+ while buf_num != -1 -+ let filename = fnamemodify(bufname(buf_num), ':p') -+ if !s:Tlist_Skip_File(filename, getbufvar(buf_num, '&filetype')) -+ let open_window = 1 -+ break -+ endif -+ let i = i + 1 -+ let buf_num = winbufnr(i) -+ endwhile -+ -+ if open_window -+ call s:Tlist_Window_Toggle() -+ endif -+endfunction -+ -+function! s:Tlist_Menu_Add_Base_Menu() -+ call s:Tlist_Log_Msg('Adding the base menu') -+ -+ " Add the menu -+ anoremenu T&ags.Refresh\ menu :call Tlist_Menu_Refresh() -+ anoremenu T&ags.Sort\ menu\ by.Name -+ \ :call Tlist_Change_Sort('menu', 'set', 'name') -+ anoremenu T&ags.Sort\ menu\ by.Order -+ \ :call Tlist_Change_Sort('menu', 'set', 'order') -+ anoremenu T&ags.-SEP1- : -+ -+ if &mousemodel =~ 'popup' -+ anoremenu PopUp.T&ags.Refresh\ menu -+ \ :call Tlist_Menu_Refresh() -+ anoremenu PopUp.T&ags.Sort\ menu\ by.Name -+ \ :call Tlist_Change_Sort('menu', 'set', 'name') -+ anoremenu PopUp.T&ags.Sort\ menu\ by.Order -+ \ :call Tlist_Change_Sort('menu', 'set', 'order') -+ anoremenu PopUp.T&ags.-SEP1- : -+ endif -+endfunction -+ -+let s:menu_char_prefix = -+ \ '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' -+ -+" Tlist_Menu_Get_Tag_Type_Cmd -+" Get the menu command for the specified tag type -+" 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 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 -+ -+ " Number of tag entries for this tag type -+ let tcnt = s:tlist_{fidx_ttype}_count -+ if tcnt == 0 " No entries for this tag type -+ return '' -+ endif -+ -+ let mcmd = '' -+ -+ " Create the menu items for the tags. -+ " Depending on the number of tags of this type, split the menu into -+ " multiple sub-menus, if needed. -+ if tcnt > g:Tlist_Max_Submenu_Items -+ let j = 1 -+ while j <= tcnt -+ let final_index = j + g:Tlist_Max_Submenu_Items - 1 -+ if final_index > tcnt -+ let final_index = tcnt -+ endif -+ -+ " Extract the first and last tag name and form the -+ " sub-menu name -+ let tidx = s:tlist_{fidx_ttype}_{j} -+ let first_tag = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ let tidx = s:tlist_{fidx_ttype}_{final_index} -+ let last_tag = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ " Truncate the names, if they are greater than the -+ " max length -+ let first_tag = strpart(first_tag, 0, g:Tlist_Max_Tag_Length) -+ let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length) -+ -+ " Form the menu command prefix -+ 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 -+ -+ while j <= final_index -+ let tidx = s:tlist_{fidx_ttype}_{j} -+ -+ let tname = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ let mcmd = mcmd . m_prefix . '\&' . -+ \ s:menu_char_prefix[m_prefix_idx] . '\.' . -+ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . -+ \ tidx . ')|' -+ -+ let m_prefix_idx = m_prefix_idx + 1 -+ let j = j + 1 -+ endwhile -+ endwhile -+ else -+ " Character prefix used to number the menu items (hotkey) -+ let m_prefix_idx = 0 -+ -+ 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} -+ -+ let tname = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ let mcmd = mcmd . m_prefix . '\&' . -+ \ s:menu_char_prefix[m_prefix_idx] . '\.' . -+ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . tidx -+ \ . ')|' -+ -+ let m_prefix_idx = m_prefix_idx + 1 -+ let j = j + 1 -+ endwhile -+ endif -+ -+ return mcmd -+endfunction -+ -+" Update the taglist menu with the tags for the specified file -+function! s:Tlist_Menu_File_Refresh(fidx) -+ call s:Tlist_Log_Msg('Refreshing the tag menu for ' . s:tlist_{a:fidx}_filename) -+ " The 'B' flag is needed in the 'cpoptions' option -+ let old_cpoptions = &cpoptions -+ set cpoptions&vim -+ -+ exe s:tlist_{a:fidx}_menu_cmd -+ -+ " Update the popup menu (if enabled) -+ if &mousemodel =~ 'popup' -+ let cmd = substitute(s:tlist_{a:fidx}_menu_cmd, ' T\\&ags\.', -+ \ ' PopUp.T\\\&ags.', "g") -+ exe cmd -+ endif -+ -+ " The taglist menu is not empty now -+ let s:tlist_menu_empty = 0 -+ -+ " Restore the 'cpoptions' settings -+ let &cpoptions = old_cpoptions -+endfunction -+ -+" Tlist_Menu_Update_File -+" Add the taglist menu -+function! s:Tlist_Menu_Update_File(clear_menu) -+ if !has('gui_running') -+ " Not running in GUI mode -+ return -+ endif -+ -+ call s:Tlist_Log_Msg('Updating the tag menu, clear_menu = ' . a:clear_menu) -+ -+ " Remove the tags menu -+ if a:clear_menu -+ call s:Tlist_Menu_Remove_File() -+ -+ endif -+ -+ let fname = escape(fnamemodify(bufname('%'), ':t'), '.') -+ if fname != '' -+ exe 'anoremenu T&ags.' . fname . ' ' -+ anoremenu T&ags.-SEP2- : -+ endif -+ -+ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help -+ if &buftype != '' -+ return -+ endif -+ -+ let filename = fnamemodify(bufname('%'), ':p') -+ let ftype = &filetype -+ -+ " If the file doesn't support tag listing, skip it -+ if s:Tlist_Skip_File(filename, ftype) -+ return -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 || !s:tlist_{fidx}_valid -+ " Check whether this file is removed based on user request -+ " If it is, then don't display the tags for this file -+ if s:Tlist_User_Removed_File(filename) -+ return -+ endif -+ -+ " Process the tags for the file -+ let fidx = s:Tlist_Process_File(filename, ftype) -+ if fidx == -1 -+ return -+ endif -+ endif -+ -+ if !s:tlist_{fidx}_tag_count -+ return -+ endif -+ -+ if s:tlist_{fidx}_menu_cmd != '' -+ " Update the menu with the cached command -+ call s:Tlist_Menu_File_Refresh(fidx) -+ -+ return -+ endif -+ -+ " We are going to add entries to the tags menu, so the menu won't be -+ " empty -+ let s:tlist_menu_empty = 0 -+ -+ 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, add_ttype_name, i) -+ if mcmd != '' -+ let cmd = cmd . mcmd -+ endif -+ -+ let i = i + 1 -+ endwhile -+ -+ " Cache the menu command for reuse -+ let s:tlist_{fidx}_menu_cmd = cmd -+ -+ " Update the menu -+ call s:Tlist_Menu_File_Refresh(fidx) -+endfunction -+ -+" Tlist_Menu_Remove_File -+" Remove the tags displayed in the tags menu -+function! s:Tlist_Menu_Remove_File() -+ if !has('gui_running') || s:tlist_menu_empty -+ return -+ endif -+ -+ call s:Tlist_Log_Msg('Removing the tags menu for a file') -+ -+ " Cleanup the Tags menu -+ silent! unmenu T&ags -+ if &mousemodel =~ 'popup' -+ silent! unmenu PopUp.T&ags -+ endif -+ -+ " Add a dummy menu item to retain teared off menu -+ noremenu T&ags.Dummy l -+ -+ silent! unmenu! T&ags -+ if &mousemodel =~ 'popup' -+ silent! unmenu! PopUp.T&ags -+ endif -+ -+ call s:Tlist_Menu_Add_Base_Menu() -+ -+ " Remove the dummy menu item -+ unmenu T&ags.Dummy -+ -+ let s:tlist_menu_empty = 1 -+endfunction -+ -+" Tlist_Menu_Refresh -+" Refresh the taglist menu -+function! s:Tlist_Menu_Refresh() -+ call s:Tlist_Log_Msg('Refreshing the tags menu') -+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) -+ if fidx != -1 -+ " Invalidate the cached menu command -+ let s:tlist_{fidx}_menu_cmd = '' -+ endif -+ -+ " Update the taglist, menu and window -+ call s:Tlist_Update_Current_File() -+endfunction -+ -+" Tlist_Menu_Jump_To_Tag -+" Jump to the selected tag -+function! s:Tlist_Menu_Jump_To_Tag(tidx) -+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) -+ if fidx == -1 -+ return -+ endif -+ -+ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, a:tidx) -+ if tagpat == '' -+ return -+ endif -+ -+ " Add the current cursor position to the jump list, so that user can -+ " jump back using the ' and ` marks. -+ mark ' -+ -+ silent call search(tagpat, 'w') -+ -+ " Bring the line to the middle of the window -+ normal! z. -+ -+ " If the line is inside a fold, open the fold -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+endfunction -+ -+" Tlist_Menu_Init -+" Initialize the taglist menu -+function! s:Tlist_Menu_Init() -+ call s:Tlist_Menu_Add_Base_Menu() -+ -+ " Automatically add the tags defined in the current file to the menu -+ augroup TagListMenuCmds -+ autocmd! -+ -+ if !g:Tlist_Process_File_Always -+ autocmd BufEnter * call s:Tlist_Refresh() -+ endif -+ autocmd BufLeave * call s:Tlist_Menu_Remove_File() -+ augroup end -+ -+ call s:Tlist_Menu_Update_File(0) -+endfunction -+ -+" Tlist_Vim_Session_Load -+" Initialize the taglist window/buffer, which is created when loading -+" a Vim session file. -+function! s:Tlist_Vim_Session_Load() -+ call s:Tlist_Log_Msg('Tlist_Vim_Session_Load') -+ -+ " Initialize the taglist window -+ call s:Tlist_Window_Init() -+ -+ " Refresh the taglist window -+ call s:Tlist_Window_Refresh() -+endfunction -+ -+" Tlist_Set_App -+" Set the name of the external plugin/application to which taglist -+" belongs. -+" Taglist plugin is part of another plugin like cream or winmanager. -+function! Tlist_Set_App(name) -+ if a:name == "" -+ return -+ endif -+ -+ let s:tlist_app_name = a:name -+endfunction -+ -+" Winmanager integration -+ -+" Initialization required for integration with winmanager -+function! TagList_Start() -+ " If current buffer is not taglist buffer, then don't proceed -+ if bufname('%') != '__Tag_List__' -+ return -+ endif -+ -+ call Tlist_Set_App('winmanager') -+ -+ " Get the current filename from the winmanager plugin -+ let bufnum = WinManagerGetLastEditedFile() -+ if bufnum != -1 -+ let filename = fnamemodify(bufname(bufnum), ':p') -+ let ftype = getbufvar(bufnum, '&filetype') -+ endif -+ -+ " Initialize the taglist window, if it is not already initialized -+ if !exists('s:tlist_window_initialized') || !s:tlist_window_initialized -+ call s:Tlist_Window_Init() -+ call s:Tlist_Window_Refresh() -+ let s:tlist_window_initialized = 1 -+ endif -+ -+ " Update the taglist window -+ if bufnum != -1 -+ if !s:Tlist_Skip_File(filename, ftype) && g:Tlist_Auto_Update -+ call s:Tlist_Window_Refresh_File(filename, ftype) -+ endif -+ endif -+endfunction -+ -+function! TagList_IsValid() -+ return 0 -+endfunction -+ -+function! TagList_WrapUp() -+ return 0 -+endfunction -+ -+" restore 'cpo' -+let &cpo = s:cpo_save -+unlet s:cpo_save -+ -diff -urN vim71/1/SCRIPTS/Diff_All.cmd vim71_ada/1/SCRIPTS/Diff_All.cmd ---- vim71/1/SCRIPTS/Diff_All.cmd 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/Diff_All.cmd 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,6 @@ -+C:\bin\Vim\vim70\gvim -g -d --nofork .\indent\ada.vim %HOME%\vimfiles\indent\ada.vim -+C:\bin\Vim\vim70\gvim -g -d --nofork .\ftdetect\ada.vim %HOME%\vimfiles\ftdetect\ada.vim -+C:\bin\Vim\vim70\gvim -g -d --nofork .\syntax\ada.vim %HOME%\vimfiles\syntax\ada.vim -+C:\bin\Vim\vim70\gvim -g -d --nofork .\ftplugin\ada.vim %HOME%\vimfiles\ftplugin\ada.vim -+C:\bin\Vim\vim70\gvim -g -d --nofork .\compiler\gnat.vim %HOME%\vimfiles\compiler\gnat.vim -+C:\bin\Vim\vim70\gvim -g -d --nofork .\plugin\rainbow_parenthsis.vim %HOME%\vimfiles\plugin\rainbow_parenthsis.vim -diff -urN vim71/1/SCRIPTS/Diff_Home.zsh vim71_ada/1/SCRIPTS/Diff_Home.zsh ---- vim71/1/SCRIPTS/Diff_Home.zsh 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/Diff_Home.zsh 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,24 @@ -+#!/bin/zsh -+ -+setopt No_X_Trace; -+setopt Glob; -+setopt Extended_Glob; -+setopt Null_Glob; -+ -+pushd ..; -+ for I in \ -+ **/*.vim \ -+ macros/[[:alnum:]]##.bash \ -+ macros/[[:alnum:]]##.zsh \ -+ doc/[[:alnum:]]##.txt ; -+ do -+ if diff --brief --report-identical-files "${I}" ~/vimfiles/"${I}"; then -+ echo "do nothing"; -+ else -+ gvimdiff --nofork "${I}" ~/vimfiles/"${I}" -+ fi; -+ done; unset I; -+popd; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=zsh encoding=utf-8 fileformat=unix -diff -urN vim71/1/SCRIPTS/Diff_Portable.bash vim71_ada/1/SCRIPTS/Diff_Portable.bash ---- vim71/1/SCRIPTS/Diff_Portable.bash 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/Diff_Portable.bash 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,37 @@ -+#!/bin/bash -+ -+source /etc/profile.d/vim.bash -+set -o xtrace; -+ -+declare -r in_Target_Base="${1}" -+ -+declare -x VIMBIN='/opt/gnat/tools/bin'; -+declare -x VIM='/opt/gnat/tools/share/vim'; -+declare -x VIMRUNTIME='/opt/gnat/tools/share/vim/vim71'; -+declare -x Target="${in_Target_Base}/Bin/GVimPortable/App/vim/vimfiles"; -+ -+function Compare () -+ { -+ local in_File="${0}"; -+ -+ if diff --brief --report-identical-files "${in_File}" "${Target}/${in_File}"; then -+ echo "do nothing"; -+ else -+ ${VIMBIN}/gvim -d --nofork "${in_File}" "${Target}/${in_File}" -+ fi; -+ } -+declare -x -f Compare; -+ -+pushd ..; -+ find . \ -+ '(' \ -+ -iname "*.vim" -o \ -+ -iregex ".*/macros/[a-z_0-9]*.bash" -o \ -+ -iregex ".*/doc/[a-z_0-9]*.txt" \ -+ ')' \ -+ -exec \ -+ /bin/bash -c Compare '{}' ';' ; -+popd; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix -diff -urN vim71/1/SCRIPTS/Diff_Source.bash vim71_ada/1/SCRIPTS/Diff_Source.bash ---- vim71/1/SCRIPTS/Diff_Source.bash 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/Diff_Source.bash 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,43 @@ -+#!/bin/bash -+ -+source /etc/profile.d/vim.bash -+set -o xtrace; -+ -+#declare -x VIMBIN='/cygdrive/c/bin/Vim/vim71'; -+ -+declare -x VIMBIN='/opt/gnat/tools/bin'; -+declare -x VIM='/opt/gnat/tools/share/vim'; -+declare -x VIMRUNTIME='/opt/gnat/tools/share/vim/vim71'; -+declare -x Target="../../rpm/BUILD/vim-runtime-$(date +%d%m%Y)" -+declare -x -f Compare; -+ -+function Compare () -+ { -+ local in_File="${0}"; -+ -+ if test -f ${Target}/${in_File} ; then -+ if diff --brief --report-identical-files "${in_File}" "${Target}/${in_File}" ; then -+ echo "do nothing"; -+ else -+ ${VIMBIN}/gvim -d --nofork "${in_File}" "${Target}/${in_File}"; -+ fi; -+ else -+ echo "${in_File} not part of the main runtime"; -+ fi; -+ -+ return; -+ } -+ -+pushd ..; -+ find . \ -+ '(' \ -+ -iname "*.vim" -o \ -+ -iregex ".*/macros/[a-z_0-9]*.bash" -o \ -+ -iregex ".*/doc/[a-z_0-9]*.txt" \ -+ ')' \ -+ -exec \ -+ /bin/bash -c Compare '{}' ';' ; -+popd; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix -diff -urN vim71/1/SCRIPTS/Edit_All.bash vim71_ada/1/SCRIPTS/Edit_All.bash ---- vim71/1/SCRIPTS/Edit_All.bash 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/Edit_All.bash 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,17 @@ -+#!/bin/bash -+ -+pushd ..; -+ find . \ -+ '(' \ -+ -iname "*.vim" -o \ -+ -iregex ".*/doc/[a-z_]*.txt" \ -+ ')' \ -+ -print | \ -+ xargs --replace --max-args=64 \ -+ /opt/gnat/tools/bin/gvim \ -+ --servername "Edit All" \ -+ --remote-silent ; -+popd; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix -diff -urN vim71/1/SCRIPTS/Make_Tar.bash vim71_ada/1/SCRIPTS/Make_Tar.bash ---- vim71/1/SCRIPTS/Make_Tar.bash 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/Make_Tar.bash 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,20 @@ -+#!/bin/bash -+ -+pushd ..; -+ find . \ -+ '(' \ -+ -iname "*.vim" -o \ -+ -ipath "./macros/*.bash" -o \ -+ -iregex ".*/doc/[a-z]*.txt" \ -+ ')' \ -+ -print | \ -+ xargs \ -+ tar \ -+ --create \ -+ --bzip2 \ -+ --verbose \ -+ --file=ada_vimfiles.tar-bz2 ; -+popd; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix -diff -urN vim71/1/SCRIPTS/.svn/all-wcprops vim71_ada/1/SCRIPTS/.svn/all-wcprops ---- vim71/1/SCRIPTS/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,41 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 52 -+/svnroot/gnuada/!svn/ver/773/trunk/tools/vim/SCRIPTS -+END -+Make_Tar.bash -+K 25 -+svn:wc:ra_dav:version-url -+V 66 -+/svnroot/gnuada/!svn/ver/342/trunk/tools/vim/SCRIPTS/Make_Tar.bash -+END -+Diff_All.cmd -+K 25 -+svn:wc:ra_dav:version-url -+V 65 -+/svnroot/gnuada/!svn/ver/773/trunk/tools/vim/SCRIPTS/Diff_All.cmd -+END -+Diff_Home.zsh -+K 25 -+svn:wc:ra_dav:version-url -+V 66 -+/svnroot/gnuada/!svn/ver/695/trunk/tools/vim/SCRIPTS/Diff_Home.zsh -+END -+Diff_Source.bash -+K 25 -+svn:wc:ra_dav:version-url -+V 69 -+/svnroot/gnuada/!svn/ver/743/trunk/tools/vim/SCRIPTS/Diff_Source.bash -+END -+Edit_All.bash -+K 25 -+svn:wc:ra_dav:version-url -+V 66 -+/svnroot/gnuada/!svn/ver/429/trunk/tools/vim/SCRIPTS/Edit_All.bash -+END -+Diff_Portable.bash -+K 25 -+svn:wc:ra_dav:version-url -+V 71 -+/svnroot/gnuada/!svn/ver/743/trunk/tools/vim/SCRIPTS/Diff_Portable.bash -+END -diff -urN vim71/1/SCRIPTS/.svn/dir-prop-base vim71_ada/1/SCRIPTS/.svn/dir-prop-base ---- vim71/1/SCRIPTS/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,6 @@ -+K 10 -+svn:ignore -+V 9 -+.backups -+ -+END -diff -urN vim71/1/SCRIPTS/.svn/entries vim71_ada/1/SCRIPTS/.svn/entries ---- vim71/1/SCRIPTS/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/entries 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,106 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/SCRIPTS -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-09-17T08:58:57.545957Z -+773 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -+Make_Tar.bash -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+8fa993957020a567d7d18cf275f79f85 -+2006-07-27T19:03:11.250838Z -+342 -+krischik -+has-props -+ -+Diff_All.cmd -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+e5a39f09b8532487297a2b21ce18539c -+2007-09-17T08:58:57.545957Z -+773 -+krischik -+has-props -+ -+Diff_Home.zsh -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+2467db473cdf6e65848a2f29a33da0dc -+2007-04-27T17:57:11.151403Z -+695 -+krischik -+has-props -+ -+Diff_Source.bash -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+bfe42019807a5f00339c2a577835a52f -+2007-07-08T15:01:50.709462Z -+743 -+krischik -+has-props -+ -+Edit_All.bash -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+386419783256e147810d36e58847f593 -+2006-10-15T17:43:45.084385Z -+429 -+krischik -+has-props -+ -+Diff_Portable.bash -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+6fbd7df3976bc16679aa4dd121ad4723 -+2007-07-08T15:01:50.709462Z -+743 -+krischik -+has-props -+ -diff -urN vim71/1/SCRIPTS/.svn/format vim71_ada/1/SCRIPTS/.svn/format ---- vim71/1/SCRIPTS/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/format 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/SCRIPTS/.svn/prop-base/Diff_All.cmd.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_All.cmd.svn-base ---- vim71/1/SCRIPTS/.svn/prop-base/Diff_All.cmd.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_All.cmd.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 14 -+svn:executable -+V 1 -+* -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 15 -+text/x-dosbatch -+END -diff -urN vim71/1/SCRIPTS/.svn/prop-base/Diff_Home.zsh.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Home.zsh.svn-base ---- vim71/1/SCRIPTS/.svn/prop-base/Diff_Home.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Home.zsh.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 14 -+svn:executable -+V 1 -+* -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 9 -+text/x-sh -+END -diff -urN vim71/1/SCRIPTS/.svn/prop-base/Diff_Portable.bash.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Portable.bash.svn-base ---- vim71/1/SCRIPTS/.svn/prop-base/Diff_Portable.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Portable.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 14 -+svn:executable -+V 1 -+* -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 9 -+text/x-sh -+END -diff -urN vim71/1/SCRIPTS/.svn/prop-base/Diff_Source.bash.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Source.bash.svn-base ---- vim71/1/SCRIPTS/.svn/prop-base/Diff_Source.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/prop-base/Diff_Source.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 14 -+svn:executable -+V 1 -+* -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 9 -+text/x-sh -+END -diff -urN vim71/1/SCRIPTS/.svn/prop-base/Edit_All.bash.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Edit_All.bash.svn-base ---- vim71/1/SCRIPTS/.svn/prop-base/Edit_All.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/prop-base/Edit_All.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 14 -+svn:executable -+V 1 -+* -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 9 -+text/x-sh -+END -diff -urN vim71/1/SCRIPTS/.svn/prop-base/Make_Tar.bash.svn-base vim71_ada/1/SCRIPTS/.svn/prop-base/Make_Tar.bash.svn-base ---- vim71/1/SCRIPTS/.svn/prop-base/Make_Tar.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/prop-base/Make_Tar.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 14 -+svn:executable -+V 1 -+* -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 9 -+text/x-sh -+END -diff -urN vim71/1/SCRIPTS/.svn/text-base/Diff_All.cmd.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Diff_All.cmd.svn-base ---- vim71/1/SCRIPTS/.svn/text-base/Diff_All.cmd.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/text-base/Diff_All.cmd.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,6 @@ -+C:\bin\Vim\vim70\gvim -g -d --nofork .\indent\ada.vim %HOME%\vimfiles\indent\ada.vim -+C:\bin\Vim\vim70\gvim -g -d --nofork .\ftdetect\ada.vim %HOME%\vimfiles\ftdetect\ada.vim -+C:\bin\Vim\vim70\gvim -g -d --nofork .\syntax\ada.vim %HOME%\vimfiles\syntax\ada.vim -+C:\bin\Vim\vim70\gvim -g -d --nofork .\ftplugin\ada.vim %HOME%\vimfiles\ftplugin\ada.vim -+C:\bin\Vim\vim70\gvim -g -d --nofork .\compiler\gnat.vim %HOME%\vimfiles\compiler\gnat.vim -+C:\bin\Vim\vim70\gvim -g -d --nofork .\plugin\rainbow_parenthsis.vim %HOME%\vimfiles\plugin\rainbow_parenthsis.vim -diff -urN vim71/1/SCRIPTS/.svn/text-base/Diff_Home.zsh.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Home.zsh.svn-base ---- vim71/1/SCRIPTS/.svn/text-base/Diff_Home.zsh.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Home.zsh.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,24 @@ -+#!/bin/zsh -+ -+setopt No_X_Trace; -+setopt Glob; -+setopt Extended_Glob; -+setopt Null_Glob; -+ -+pushd ..; -+ for I in \ -+ **/*.vim \ -+ macros/[[:alnum:]]##.bash \ -+ macros/[[:alnum:]]##.zsh \ -+ doc/[[:alnum:]]##.txt ; -+ do -+ if diff --brief --report-identical-files "${I}" ~/vimfiles/"${I}"; then -+ echo "do nothing"; -+ else -+ gvimdiff --nofork "${I}" ~/vimfiles/"${I}" -+ fi; -+ done; unset I; -+popd; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=zsh encoding=utf-8 fileformat=unix -diff -urN vim71/1/SCRIPTS/.svn/text-base/Diff_Portable.bash.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Portable.bash.svn-base ---- vim71/1/SCRIPTS/.svn/text-base/Diff_Portable.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Portable.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,37 @@ -+#!/bin/bash -+ -+source /etc/profile.d/vim.bash -+set -o xtrace; -+ -+declare -r in_Target_Base="${1}" -+ -+declare -x VIMBIN='/opt/gnat/tools/bin'; -+declare -x VIM='/opt/gnat/tools/share/vim'; -+declare -x VIMRUNTIME='/opt/gnat/tools/share/vim/vim71'; -+declare -x Target="${in_Target_Base}/Bin/GVimPortable/App/vim/vimfiles"; -+ -+function Compare () -+ { -+ local in_File="${0}"; -+ -+ if diff --brief --report-identical-files "${in_File}" "${Target}/${in_File}"; then -+ echo "do nothing"; -+ else -+ ${VIMBIN}/gvim -d --nofork "${in_File}" "${Target}/${in_File}" -+ fi; -+ } -+declare -x -f Compare; -+ -+pushd ..; -+ find . \ -+ '(' \ -+ -iname "*.vim" -o \ -+ -iregex ".*/macros/[a-z_0-9]*.bash" -o \ -+ -iregex ".*/doc/[a-z_0-9]*.txt" \ -+ ')' \ -+ -exec \ -+ /bin/bash -c Compare '{}' ';' ; -+popd; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix -diff -urN vim71/1/SCRIPTS/.svn/text-base/Diff_Source.bash.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Source.bash.svn-base ---- vim71/1/SCRIPTS/.svn/text-base/Diff_Source.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/text-base/Diff_Source.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,43 @@ -+#!/bin/bash -+ -+source /etc/profile.d/vim.bash -+set -o xtrace; -+ -+#declare -x VIMBIN='/cygdrive/c/bin/Vim/vim71'; -+ -+declare -x VIMBIN='/opt/gnat/tools/bin'; -+declare -x VIM='/opt/gnat/tools/share/vim'; -+declare -x VIMRUNTIME='/opt/gnat/tools/share/vim/vim71'; -+declare -x Target="../../rpm/BUILD/vim-runtime-$(date +%d%m%Y)" -+declare -x -f Compare; -+ -+function Compare () -+ { -+ local in_File="${0}"; -+ -+ if test -f ${Target}/${in_File} ; then -+ if diff --brief --report-identical-files "${in_File}" "${Target}/${in_File}" ; then -+ echo "do nothing"; -+ else -+ ${VIMBIN}/gvim -d --nofork "${in_File}" "${Target}/${in_File}"; -+ fi; -+ else -+ echo "${in_File} not part of the main runtime"; -+ fi; -+ -+ return; -+ } -+ -+pushd ..; -+ find . \ -+ '(' \ -+ -iname "*.vim" -o \ -+ -iregex ".*/macros/[a-z_0-9]*.bash" -o \ -+ -iregex ".*/doc/[a-z_0-9]*.txt" \ -+ ')' \ -+ -exec \ -+ /bin/bash -c Compare '{}' ';' ; -+popd; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix -diff -urN vim71/1/SCRIPTS/.svn/text-base/Edit_All.bash.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Edit_All.bash.svn-base ---- vim71/1/SCRIPTS/.svn/text-base/Edit_All.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/text-base/Edit_All.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,17 @@ -+#!/bin/bash -+ -+pushd ..; -+ find . \ -+ '(' \ -+ -iname "*.vim" -o \ -+ -iregex ".*/doc/[a-z_]*.txt" \ -+ ')' \ -+ -print | \ -+ xargs --replace --max-args=64 \ -+ /opt/gnat/tools/bin/gvim \ -+ --servername "Edit All" \ -+ --remote-silent ; -+popd; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix -diff -urN vim71/1/SCRIPTS/.svn/text-base/Make_Tar.bash.svn-base vim71_ada/1/SCRIPTS/.svn/text-base/Make_Tar.bash.svn-base ---- vim71/1/SCRIPTS/.svn/text-base/Make_Tar.bash.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/SCRIPTS/.svn/text-base/Make_Tar.bash.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,20 @@ -+#!/bin/bash -+ -+pushd ..; -+ find . \ -+ '(' \ -+ -iname "*.vim" -o \ -+ -ipath "./macros/*.bash" -o \ -+ -iregex ".*/doc/[a-z]*.txt" \ -+ ')' \ -+ -print | \ -+ xargs \ -+ tar \ -+ --create \ -+ --bzip2 \ -+ --verbose \ -+ --file=ada_vimfiles.tar-bz2 ; -+popd; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix -diff -urN vim71/1/.svn/all-wcprops vim71_ada/1/.svn/all-wcprops ---- vim71/1/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,11 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 44 -+/svnroot/gnuada/!svn/ver/825/trunk/tools/vim -+END -+ada_options.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 60 -+/svnroot/gnuada/!svn/ver/774/trunk/tools/vim/ada_options.vim -+END -diff -urN vim71/1/.svn/dir-prop-base vim71_ada/1/.svn/dir-prop-base ---- vim71/1/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,8 @@ -+K 10 -+svn:ignore -+V 25 -+.backups -+*.tar-bz2 -+*.vba -+ -+END -diff -urN vim71/1/.svn/entries vim71_ada/1/.svn/entries ---- vim71/1/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/.svn/entries 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,74 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-12-09T13:34:03.484664Z -+825 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -+colors -+dir -+ -+indent -+dir -+ -+ftdetect -+dir -+ -+macros -+dir -+ -+doc -+dir -+ -+syntax -+dir -+ -+SCRIPTS -+dir -+ -+autoload -+dir -+ -+ftplugin -+dir -+ -+compiler -+dir -+ -+ada_options.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+2ed6ca5b229dcdc415152a2bcb6f1b31 -+2007-09-17T09:11:59.633161Z -+774 -+krischik -+has-props -+ -+plugin -+dir -+ -diff -urN vim71/1/.svn/format vim71_ada/1/.svn/format ---- vim71/1/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/.svn/format 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/.svn/prop-base/ada_options.vim.svn-base vim71_ada/1/.svn/prop-base/ada_options.vim.svn-base ---- vim71/1/.svn/prop-base/ada_options.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/.svn/prop-base/ada_options.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/.svn/text-base/ada_options.vim.svn-base vim71_ada/1/.svn/text-base/ada_options.vim.svn-base ---- vim71/1/.svn/text-base/ada_options.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/.svn/text-base/ada_options.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,105 @@ -+"------------------------------------------------------------------------------ -+" Description: Options setable by the Ada plugin -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL$ -+" History: 24.05.2006 MK Unified Headers -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 02.10.2006 MK Folding for "gnat pretty" -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Bram suggested to save on spaces -+" Usage: copy content into your .vimrc and change options to your -+" likeing. -+" Help Page: ft-ada-options -+"------------------------------------------------------------------------------ -+ -+echoerr 'It is suggested to copy the content of ada_options into .vimrc!' -+finish " 1}}} -+ -+" Section: Ada options {{{1 -+ -+ let g:ada_abbrev = 1 -+ let g:ada_default_compiler = 'gnat' -+ let g:ada_extended_tagging = 'list' -+ let g:ada_folding = 'i' -+" let g:ada_folding = 'gibxp' -+" let g:ada_folding = 'spftc' -+ let g:ada_rainbow_color = 1 -+ let g:ada_space_errors = 1 -+ let g:ada_standard_types = 1 -+ let g:ada_with_gnat_project_files = 1 -+" let g:ada_extended_completion = 1 -+" let g:ada_line_errors = 1 -+" let g:ada_omni_with_keywords = 1 -+ -+ let g:Tlist_Exit_OnlyWindow = 1 -+ let g:Tlist_File_Fold_Auto_Close = 1 -+ let g:Tlist_Sort_Type = "name" -+ -+ let g:NERD_use_ada_with_spaces = 1 -+ -+ let g:backup_directory = '.backups' -+ let g:backup_purge = 10 -+ -+ let g:mapleader = "" -+ -+ if &diff -+ let g:Tlist_Auto_Open = 0 -+ else -+ let g:Tlist_Auto_Open = 1 -+ endif -+ -+ filetype plugin indent on -+ syntax enable -+ -+" }}}1 -+ -+" Section: Vimball options {{{1 -+:set expandtab fileformat=unix encoding=utf-8 -+:.+2,.+13 MkVimball ada-4.5.0 -+ -+ada_options.vim -+autoload/ada.vim -+autoload/adacomplete.vim -+autoload/decada.vim -+autoload/gnat.vim -+compiler/decada.vim -+compiler/gnat.vim -+doc/ft_ada.txt -+ftdetect/ada.vim -+ftplugin/ada.vim -+indent/ada.vim -+syntax/ada.vim -+ -+" }}}1 -+ -+" Section: Tar options {{{1 -+ -+tar --create --bzip2 \ -+ --file="ada-4.5.0.tar.bz2" \ -+ autoload/ada.vim \ -+ autoload/adacomplete.vim \ -+ autoload/decada.vim \ -+ autoload/gnat.vim \ -+ compiler/decada.vim \ -+ compiler/gnat.vim \ -+ doc/ft_ada.txt \ -+ ftdetect/ada.vim \ -+ ftplugin/ada.vim \ -+ indent/ada.vim \ -+ syntax/ada.vim ; -+ -+" }}}1 -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+" vim: nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+" vim: textwidth=0 foldmethod=marker foldmethod=marker -diff -urN vim71/1/syntax/ada.vim vim71_ada/1/syntax/ada.vim ---- vim71/1/syntax/ada.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/syntax/ada.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,368 @@ -+"---------------------------------------------------------------------------- -+" Description: Vim Ada syntax file -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" David A. Wheeler -+" Simon Bradley -+" Contributors: Preben Randhol. -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ -+" http://www.dwheeler.com/vim -+" History: 24.05.2006 MK Unified Headers -+" 26.05.2006 MK ' should not be in iskeyword. -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 02.10.2006 MK Better folding. -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Spell check for comments and strings only -+" 05.11.2006 MK Bram suggested to save on spaces -+" Help Page: help ft-ada-syntax -+"------------------------------------------------------------------------------ -+" The formal spec of Ada 2005 (ARM) is the "Ada 2005 Reference Manual". -+" For more Ada 2005 info, see http://www.gnuada.org and http://www.adapower.com. -+" -+" This vim syntax file works on vim 7.0 only and makes use of most of Voim 7.0 -+" advanced features. -+"------------------------------------------------------------------------------ -+ -+if exists("b:current_syntax") || version < 700 -+ finish -+endif -+ -+let b:current_syntax = "ada" -+ -+" Section: Ada is entirely case-insensitive. {{{1 -+" -+syntax case ignore -+setlocal nosmartcase -+setlocal ignorecase -+ -+" Section: Highlighting commands {{{1 -+" -+" There are 72 reserved words in total in Ada2005. Some keywords are -+" used in more than one way. For example: -+" 1. "end" is a general keyword, but "end if" ends a Conditional. -+" 2. "then" is a conditional, but "and then" is an operator. -+" -+for b:Item in g:ada#Keywords -+ " Standard Exceptions (including I/O). -+ " We'll highlight the standard exceptions, similar to vim's Python mode. -+ " It's possible to redefine the standard exceptions as something else, -+ " but doing so is very bad practice, so simply highlighting them makes sense. -+ if b:Item['kind'] == "x" -+ execute "syntax keyword adaException " . b:Item['word'] -+ endif -+ if b:Item['kind'] == "a" -+ execute 'syntax match adaAttribute "\V' . b:Item['word'] . '"' -+ endif -+ " We don't normally highlight types in package Standard -+ " (Integer, Character, Float, etc.). I don't think it looks good -+ " with the other type keywords, and many Ada programs define -+ " so many of their own types that it looks inconsistent. -+ " However, if you want this highlighting, turn on "ada_standard_types". -+ " For package Standard's definition, see ARM section A.1. -+ if b:Item['kind'] == "t" && exists ("g:ada_standard_types") -+ execute "syntax keyword adaBuiltinType " . b:Item['word'] -+ endif -+endfor -+ -+" Section: others {{{1 -+" -+syntax keyword adaLabel others -+ -+" Section: Operatoren {{{1 -+" -+syntax keyword adaOperator abs mod not rem xor -+syntax match adaOperator "\" -+syntax match adaOperator "\" -+syntax match adaOperator "\" -+syntax match adaOperator "\" -+syntax match adaOperator "[-+*/<>&]" -+syntax keyword adaOperator ** -+syntax match adaOperator "[/<>]=" -+syntax keyword adaOperator => -+syntax match adaOperator "\.\." -+syntax match adaOperator "=" -+ -+" Section: <> {{{1 -+" -+" Handle the box, <>, specially: -+" -+syntax keyword adaSpecial <> -+ -+" Section: rainbow color {{{1 -+" -+if exists("g:ada_rainbow_color") -+ syntax match adaSpecial "[:;.,]" -+ call rainbow_parenthsis#LoadRound () -+ call rainbow_parenthsis#Activate () -+else -+ syntax match adaSpecial "[:;().,]" -+endif -+ -+" Section: := {{{1 -+" -+" We won't map "adaAssignment" by default, but we need to map ":=" to -+" something or the "=" inside it will be mislabelled as an operator. -+" Note that in Ada, assignment (:=) is not considered an operator. -+" -+syntax match adaAssignment ":=" -+ -+" Section: Numbers, including floating point, exponents, and alternate bases. {{{1 -+" -+syntax match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" -+syntax match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" -+ -+" Section: Identify leading numeric signs {{{1 -+" -+" In "A-5" the "-" is an operator, " but in "A:=-5" the "-" is a sign. This -+" handles "A3+-5" (etc.) correctly. " This assumes that if you put a -+" don't put a space after +/- when it's used " as an operator, you won't -+" put a space before it either -- which is true " in code I've seen. -+" -+syntax match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 -+ -+" Section: Labels for the goto statement. {{{1 -+" -+syntax region adaLabel start="<<" end=">>" -+ -+" Section: Boolean Constants {{{1 -+" Boolean Constants. -+syntax keyword adaBoolean true false -+ -+" Section: Warn C/C++ {{{1 -+" -+" Warn people who try to use C/C++ notation erroneously: -+" -+syntax match adaError "//" -+syntax match adaError "/\*" -+syntax match adaError "==" -+ -+ -+" Section: Space Errors {{{1 -+" -+if exists("g:ada_space_errors") -+ if !exists("g:ada_no_trail_space_error") -+ syntax match adaSpaceError excludenl "\s\+$" -+ endif -+ if !exists("g:ada_no_tab_space_error") -+ syntax match adaSpaceError " \+\t"me=e-1 -+ endif -+ if !exists("g:ada_all_tab_usage") -+ syntax match adaSpecial "\t" -+ endif -+endif -+ -+" Section: end {{{1 -+" Unless special ("end loop", "end if", etc.), "end" marks the end of a -+" begin, package, task etc. Assiging it to adaEnd. -+syntax match adaEnd /\/ -+ -+syntax keyword adaPreproc pragma -+ -+syntax keyword adaRepeat exit for loop reverse while -+syntax match adaRepeat "\" -+ -+syntax keyword adaStatement accept delay goto raise requeue return -+syntax keyword adaStatement terminate -+syntax match adaStatement "\" -+ -+" Section: Handle Ada's record keywords. {{{1 -+" -+" 'record' usually starts a structure, but "with null record;" does not, -+" and 'end record;' ends a structure. The ordering here is critical - -+" 'record;' matches a "with null record", so make it a keyword (this can -+" match when the 'with' or 'null' is on a previous line). -+" We see the "end" in "end record" before the word record, so we match that -+" pattern as adaStructure (and it won't match the "record;" pattern). -+" -+syntax match adaStructure "\" contains=adaRecord -+syntax match adaStructure "\" contains=adaRecord -+syntax match adaKeyword "\" -+syntax match adaConditional "\" -+syntax match adaConditional "\" -+syntax match adaConditional "\" -+syntax match adaConditional "\" -+syntax match adaConditional "\" -+syntax keyword adaConditional if case select -+syntax keyword adaConditional elsif when -+ -+" Section: other keywords {{{1 -+syntax match adaKeyword "\" contains=adaRecord -+syntax keyword adaKeyword all do exception in new null out -+syntax keyword adaKeyword separate until overriding -+ -+" Section: begin keywords {{{1 -+" -+" These keywords begin various constructs, and you _might_ want to -+" highlight them differently. -+" -+syntax keyword adaBegin begin body declare entry generic -+syntax keyword adaBegin protected renames task -+ -+syntax match adaBegin "\" contains=adaFunction -+syntax match adaBegin "\" contains=adaProcedure -+syntax match adaBegin "\" contains=adaPackage -+ -+if exists("ada_with_gnat_project_files") -+ syntax keyword adaBegin project -+endif -+ -+" Section: with, use {{{1 -+" -+if exists("ada_withuse_ordinary") -+ " Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. -+ syntax keyword adaKeyword with use -+else -+ " Highlight "with" and "use" clauses like C's "#include" when they're used -+ " to reference other compilation units; otherwise they're ordinary keywords. -+ " If we have vim 6.0 or later, we'll use its advanced pattern-matching -+ " capabilities so that we won't match leading spaces. -+ syntax match adaKeyword "\" -+ syntax match adaKeyword "\" -+ syntax match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ syntax match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ syntax match adaInc "\" contained contains=NONE -+ syntax match adaInc "\" contained contains=NONE -+ syntax match adaInc "\" contained contains=NONE -+ " Recognize "with null record" as a keyword (even the "record"). -+ syntax match adaKeyword "\" -+ " Consider generic formal parameters of subprograms and packages as keywords. -+ syntax match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>" -+ syntax match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>" -+endif -+ -+" Section: String and character constants. {{{1 -+" -+syntax region adaString contains=@Spell start=+"+ skip=+""+ end=+"+ -+syntax match adaCharacter "'.'" -+ -+" Section: Todo (only highlighted in comments) {{{1 -+" -+syntax keyword adaTodo contained TODO FIXME XXX NOTE -+ -+" Section: Comments. {{{1 -+" -+syntax region adaComment -+ \ oneline -+ \ contains=adaTodo,adaLineError,@Spell -+ \ start="--" -+ \ end="$" -+ -+" Section: line errors {{{1 -+" -+" Note: Line errors have become quite slow with Vim 7.0 -+" -+if exists("g:ada_line_errors") -+ syntax match adaLineError "\(^.\{79}\)\@<=." contains=ALL containedin=ALL -+endif -+ -+" Section: syntax folding {{{1 -+" -+" Syntax folding is very tricky - for now I still suggest to use -+" indent folding -+" -+if exists("g:ada_folding") && g:ada_folding[0] == 's' -+ if stridx (g:ada_folding, 'p') >= 0 -+ syntax region adaPackage -+ \ start="\(\\|\\)\s*\z(\k*\)" -+ \ end="end\s\+\z1\s*;" -+ \ keepend extend transparent fold contains=ALL -+ endif -+ if stridx (g:ada_folding, 'f') >= 0 -+ syntax region adaProcedure -+ \ start="\\s*\z(\k*\)" -+ \ end="\\s\+\z1\s*;" -+ \ keepend extend transparent fold contains=ALL -+ syntax region adaFunction -+ \ start="\\s*\z(\k*\)" -+ \ end="end\s\+\z1\s*;" -+ \ keepend extend transparent fold contains=ALL -+ endif -+ if stridx (g:ada_folding, 'f') >= 0 -+ syntax region adaRecord -+ \ start="\" -+ \ end="\" -+ \ keepend extend transparent fold contains=ALL -+ endif -+endif -+ -+" Section: The default methods for highlighting. Can be overridden later. {{{1 -+" -+highlight def link adaCharacter Character -+highlight def link adaComment Comment -+highlight def link adaConditional Conditional -+highlight def link adaKeyword Keyword -+highlight def link adaLabel Label -+highlight def link adaNumber Number -+highlight def link adaSign Number -+highlight def link adaOperator Operator -+highlight def link adaPreproc PreProc -+highlight def link adaRepeat Repeat -+highlight def link adaSpecial Special -+highlight def link adaStatement Statement -+highlight def link adaString String -+highlight def link adaStructure Structure -+highlight def link adaTodo Todo -+highlight def link adaType Type -+highlight def link adaTypedef Typedef -+highlight def link adaStorageClass StorageClass -+highlight def link adaBoolean Boolean -+highlight def link adaException Exception -+highlight def link adaAttribute Tag -+highlight def link adaInc Include -+highlight def link adaError Error -+highlight def link adaSpaceError Error -+highlight def link adaLineError Error -+highlight def link adaBuiltinType Type -+highlight def link adaAssignment Special -+ -+" Subsection: Begin, End {{{2 -+" -+if exists ("ada_begin_preproc") -+ " This is the old default display: -+ highlight def link adaBegin PreProc -+ highlight def link adaEnd PreProc -+else -+ " This is the new default display: -+ highlight def link adaBegin Keyword -+ highlight def link adaEnd Keyword -+endif -+ -+ -+" Section: formatoptions {{{1 -+" -+setlocal formatoptions+=ron -+ -+" Section: sync {{{1 -+" -+" We don't need to look backwards to highlight correctly; -+" this speeds things up greatly. -+syntax sync minlines=1 maxlines=1 -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+"vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+"vim: foldmethod=marker -diff -urN vim71/1/syntax/bush.vim vim71_ada/1/syntax/bush.vim ---- vim71/1/syntax/bush.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/syntax/bush.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,309 @@ -+" Vim syntax file -+" Language: BUSH / AdaScript -+" Maintainer: Ken O. Burtch -+" URL: http://www.pegasoft.ca/bush -+" Last Change: 2004-06-29 -+ -+" Former Maintainer: Simon Bradley -+" (was ) -+" Other contributors: Preben Randhol. -+" The formal spec of Ada95 (ARM) is the "Ada95 Reference Manual". -+" For more Ada95 info, see http://www.gnuada.org and http://www.adapower.com. -+ -+" This vim syntax file works on vim 5.6, 5.7, 5.8 and 6.x. -+" It implements Bram Moolenaar's April 25, 2001 recommendations to make -+" the syntax file maximally portable across different versions of vim. -+" If vim 6.0+ is available, -+" this syntax file takes advantage of the vim 6.0 advanced pattern-matching -+" functions to avoid highlighting uninteresting leading spaces in -+" some expressions containing "with" and "use". -+ -+" For version 5.x: Clear all syntax items -+" For version 6.x: Quit when a syntax file was already loaded -+if version < 600 -+ syntax clear -+elseif exists("b:current_syntax") -+ finish -+endif -+ -+" Ada is entirely case-insensitive. -+syn case ignore -+ -+" We don't need to look backwards to highlight correctly; -+" this speeds things up greatly. -+syn sync minlines=1 maxlines=1 -+ -+" Highlighting commands. There are 69 reserved words in total in Ada95. -+" Some keywords are used in more than one way. For example: -+" 1. "end" is a general keyword, but "end if" ends a Conditional. -+" 2. "then" is a conditional, but "and then" is an operator. -+ -+ -+" Standard Exceptions (including I/O). -+" We'll highlight the standard exceptions, similar to vim's Python mode. -+" It's possible to redefine the standard exceptions as something else, -+" but doing so is very bad practice, so simply highlighting them makes sense. -+syn keyword adaException Constraint_Error Program_Error Storage_Error -+syn keyword adaException Tasking_Error -+syn keyword adaException Status_Error Mode_Error Name_Error Use_Error -+syn keyword adaException Device_Error End_Error Data_Error Layout_Error -+syn keyword adaException Length_Error Pattern_Error Index_Error -+syn keyword adaException Translation_Error -+syn keyword adaException Time_Error Argument_Error -+syn keyword adaException Tag_Error -+syn keyword adaException Picture_Error -+" Interfaces -+syn keyword adaException Terminator_Error Conversion_Error -+syn keyword adaException Pointer_Error Dereference_Error Update_Error -+" This isn't in the Ada spec, but a GNAT extension. -+syn keyword adaException Assert_Failure -+" We don't list ALL exceptions defined in particular compilers (e.g., GNAT), -+" because it's quite reasonable to define those phrases as non-exceptions. -+ -+ -+" We don't normally highlight types in package Standard -+" (Integer, Character, Float, etc.). I don't think it looks good -+" with the other type keywords, and many Ada programs define -+" so many of their own types that it looks inconsistent. -+" However, if you want this highlighting, turn on "ada_standard_types". -+" For package Standard's definition, see ARM section A.1. -+ -+if exists("ada_standard_types") -+ syn keyword adaBuiltinType Boolean Integer Natural Positive Float -+ syn keyword adaBuiltinType Character Wide_Character -+ syn keyword adaBuiltinType String Wide_String -+ syn keyword adaBuiltinType Duration -+ " These aren't listed in ARM section A.1's code, but they're noted as -+ " options in ARM sections 3.5.4 and 3.5.7: -+ syn keyword adaBuiltinType Short_Integer Short_Short_Integer -+ syn keyword adaBuiltinType Long_Integer Long_Long_Integer -+ syn keyword adaBuiltinType Short_Float Short_Short_Float -+ syn keyword adaBuiltinType Long_Float Long_Long_Float -+ " BUSH-specific types -+ syn keyword adaBuiltinType command -+ syn keyword adaBuiltinType socket_type -+ syn keyword adaBuiltinType unbounded_string -+ syn keyword adaBuiltinType universal_typeless -+ syn keyword adaBuiltinType universal_string -+ syn keyword adaBuiltinType universal_numeric -+endif -+ -+" There are MANY other predefined types; they've not been added, because -+" determining when they're a type requires context in general. -+" One potential addition would be Unbounded_String. -+ -+ -+syn keyword adaLabel others -+ -+syn keyword adaOperator abs mod not rem xor -+syn match adaOperator "\" -+syn match adaOperator "\" -+syn match adaOperator "\" -+syn match adaOperator "\" -+syn match adaOperator "[-+*/<>&]" -+syn keyword adaOperator ** -+syn match adaOperator "[/<>]=" -+syn keyword adaOperator => -+syn match adaOperator "\.\." -+syn match adaOperator "=" -+ -+" We won't map "adaAssignment" by default, but we need to map ":=" to -+" something or the "=" inside it will be mislabelled as an operator. -+" Note that in Ada, assignment (:=) is not considered an operator. -+syn match adaAssignment ":=" -+ -+" Handle the box, <>, specially: -+syn keyword adaSpecial <> -+ -+" Numbers, including floating point, exponents, and alternate bases. -+syn match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" -+syn match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" -+ -+" Identify leading numeric signs. In "A-5" the "-" is an operator, -+" but in "A:=-5" the "-" is a sign. This handles "A3+-5" (etc.) correctly. -+" This assumes that if you put a don't put a space after +/- when it's used -+" as an operator, you won't put a space before it either -- which is true -+" in code I've seen. -+syn match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 -+ -+" Labels for the goto statement. -+syn region adaLabel start="<<" end=">>" -+ -+" Boolean Constants. -+syn keyword adaBoolean true false -+ -+" Warn people who try to use C/C++ notation erroneously: -+syn match adaError "//" -+syn match adaError "/\*" -+syn match adaError "==" -+ -+ -+if exists("ada_space_errors") -+ if !exists("ada_no_trail_space_error") -+ syn match adaSpaceError excludenl "\s\+$" -+ endif -+ if !exists("ada_no_tab_space_error") -+ syn match adaSpaceError " \+\t"me=e-1 -+ endif -+endif -+ -+" Unless special ("end loop", "end if", etc.), "end" marks the end of a -+" begin, package, task etc. Assiging it to adaEnd. -+syn match adaEnd "\" -+ -+syn keyword adaPreproc pragma -+ -+syn keyword adaRepeat exit for loop reverse while -+syn match adaRepeat "\" -+ -+syn keyword adaStatement accept delay goto raise requeue return -+syn keyword adaStatement terminate -+" BUSH-specific statements -+syn keyword adaStatement cd -+syn keyword adaStatement clear -+syn keyword adaStatement env -+syn keyword adaStatement inkey -+syn keyword adaStatement jobs -+syn keyword adaStatement logout -+syn keyword adaStatement pwd -+syn keyword adaStatement step -+syn keyword adaStatement trace -+syn keyword adaStatement typeset -+syn keyword adaStatement unset -+syn keyword adaStatement wait -+syn keyword adaStatement history -+syn keyword adaStatement "?" -+syn match adaStatement "\" -+ -+" Handle Ada's record keywords. -+" 'record' usually starts a structure, but "with null record;" does not, -+" and 'end record;' ends a structure. The ordering here is critical - -+" 'record;' matches a "with null record", so make it a keyword (this can -+" match when the 'with' or 'null' is on a previous line). -+" We see the "end" in "end record" before the word record, so we match that -+" pattern as adaStructure (and it won't match the "record;" pattern). -+syn match adaStructure "\" -+syn match adaStructure "\" -+syn match adaKeyword "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn keyword adaConditional if case select -+syn keyword adaConditional elsif when -+ -+syn keyword adaKeyword all do exception in is new null out -+syn keyword adaKeyword separate until -+ -+" These keywords begin various constructs, and you _might_ want to -+" highlight them differently. -+syn keyword adaBegin begin body declare entry function generic -+syn keyword adaBegin package procedure protected renames task -+ -+ -+if exists("ada_withuse_ordinary") -+" Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. -+ syn keyword adaKeyword with use -+else -+ " Highlight "with" and "use" clauses like C's "#include" when they're used -+ " to reference other compilation units; otherwise they're ordinary keywords. -+ " If we have vim 6.0 or later, we'll use its advanced pattern-matching -+ " capabilities so that we won't match leading spaces. -+ syn match adaKeyword "\" -+ syn match adaKeyword "\" -+ if version < 600 -+ syn match adaBeginWith "^\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ syn match adaSemiWith ";\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>"lc=1 contains=adaInc -+ else -+ syn match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ syn match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ endif -+ syn match adaInc "\" contained contains=NONE -+ syn match adaInc "\" contained contains=NONE -+ syn match adaInc "\" contained contains=NONE -+ " Recognize "with null record" as a keyword (even the "record"). -+ syn match adaKeyword "\" -+ " Consider generic formal parameters of subprograms and packages as keywords. -+ if version < 600 -+ syn match adaKeyword ";\s*with\s\+\(function\|procedure\|package\)\>" -+ syn match adaKeyword "^\s*with\s\+\(function\|procedure\|package\)\>" -+ else -+ syn match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>" -+ syn match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>" -+ endif -+endif -+ -+ -+" String and character constants. -+syn region adaString start=+"+ skip=+""+ end=+"+ -+syn match adaCharacter "'.'" -+ -+" Todo (only highlighted in comments) -+syn keyword adaTodo contained TODO FIXME XXX -+ -+" Comments. -+syn region adaComment oneline contains=adaTodo start="--" end="$" -+ -+ -+ -+" Define the default highlighting. -+" For version 5.7 and earlier: only when not done already -+" For version 5.8 and later: only when an item doesn't have highlighting yet -+if version >= 508 || !exists("did_ada_syn_inits") -+ if version < 508 -+ let did_ada_syn_inits = 1 -+ command -nargs=+ HiLink hi link -+ else -+ command -nargs=+ HiLink hi def link -+ endif -+ -+ " The default methods for highlighting. Can be overridden later. -+ HiLink adaCharacter Character -+ HiLink adaComment Comment -+ HiLink adaConditional Conditional -+ HiLink adaKeyword Keyword -+ HiLink adaLabel Label -+ HiLink adaNumber Number -+ HiLink adaSign Number -+ HiLink adaOperator Operator -+ HiLink adaPreproc PreProc -+ HiLink adaRepeat Repeat -+ HiLink adaSpecial Special -+ HiLink adaStatement Statement -+ HiLink adaString String -+ HiLink adaStructure Structure -+ HiLink adaTodo Todo -+ HiLink adaType Type -+ HiLink adaTypedef Typedef -+ HiLink adaStorageClass StorageClass -+ HiLink adaBoolean Boolean -+ HiLink adaException Exception -+ HiLink adaInc Include -+ HiLink adaError Error -+ HiLink adaSpaceError Error -+ HiLink adaBuiltinType Type -+ -+ if exists("ada_begin_preproc") -+ " This is the old default display: -+ HiLink adaBegin PreProc -+ HiLink adaEnd PreProc -+ else -+ " This is the new default display: -+ HiLink adaBegin Keyword -+ HiLink adaEnd Keyword -+ endif -+ -+ delcommand HiLink -+endif -+ -+let b:current_syntax = "ada" -+ -+" vim: ts=8 -diff -urN vim71/1/syntax/.svn/all-wcprops vim71_ada/1/syntax/.svn/all-wcprops ---- vim71/1/syntax/.svn/all-wcprops 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/syntax/.svn/all-wcprops 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,17 @@ -+K 25 -+svn:wc:ra_dav:version-url -+V 51 -+/svnroot/gnuada/!svn/ver/793/trunk/tools/vim/syntax -+END -+ada.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 59 -+/svnroot/gnuada/!svn/ver/793/trunk/tools/vim/syntax/ada.vim -+END -+bush.vim -+K 25 -+svn:wc:ra_dav:version-url -+V 60 -+/svnroot/gnuada/!svn/ver/746/trunk/tools/vim/syntax/bush.vim -+END -diff -urN vim71/1/syntax/.svn/dir-prop-base vim71_ada/1/syntax/.svn/dir-prop-base ---- vim71/1/syntax/.svn/dir-prop-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/syntax/.svn/dir-prop-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,6 @@ -+K 10 -+svn:ignore -+V 9 -+.backups -+ -+END -diff -urN vim71/1/syntax/.svn/entries vim71_ada/1/syntax/.svn/entries ---- vim71/1/syntax/.svn/entries 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/syntax/.svn/entries 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,54 @@ -+8 -+ -+dir -+841 -+https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax -+https://gnuada.svn.sourceforge.net/svnroot/gnuada -+ -+ -+ -+2007-11-01T18:29:58.081603Z -+793 -+krischik -+has-props -+ -+svn:special svn:externals svn:needs-lock -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+9b0cb6ef-3e0e-0410-8360-d61ff0ace097 -+ -+ada.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+1f3e27d039a012d7bc96fd9e2b95ff20 -+2007-11-01T18:29:58.081603Z -+793 -+krischik -+has-props -+ -+bush.vim -+file -+ -+ -+ -+ -+2008-01-16T15:37:03.000000Z -+7b0798091c1dad50554c7905c6803cbe -+2007-07-08T16:24:46.571321Z -+746 -+krischik -+has-props -+ -diff -urN vim71/1/syntax/.svn/format vim71_ada/1/syntax/.svn/format ---- vim71/1/syntax/.svn/format 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/syntax/.svn/format 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1 @@ -+8 -diff -urN vim71/1/syntax/.svn/prop-base/ada.vim.svn-base vim71_ada/1/syntax/.svn/prop-base/ada.vim.svn-base ---- vim71/1/syntax/.svn/prop-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/syntax/.svn/prop-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/syntax/.svn/prop-base/bush.vim.svn-base vim71_ada/1/syntax/.svn/prop-base/bush.vim.svn-base ---- vim71/1/syntax/.svn/prop-base/bush.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/syntax/.svn/prop-base/bush.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,13 @@ -+K 13 -+svn:eol-style -+V 2 -+LF -+K 12 -+svn:keywords -+V 31 -+Author Date Id Revision HeadURL -+K 13 -+svn:mime-type -+V 10 -+text/x-vim -+END -diff -urN vim71/1/syntax/.svn/text-base/ada.vim.svn-base vim71_ada/1/syntax/.svn/text-base/ada.vim.svn-base ---- vim71/1/syntax/.svn/text-base/ada.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/syntax/.svn/text-base/ada.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,368 @@ -+"---------------------------------------------------------------------------- -+" Description: Vim Ada syntax file -+" Language: Ada (2005) -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" Copyright: Copyright (C) 2006 Martin Krischik -+" Maintainer: Martin Krischik -+" David A. Wheeler -+" Simon Bradley -+" Contributors: Preben Randhol. -+" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ -+" Version: 4.5 -+" $Revision: 1.1 $ -+" $HeadURL$ -+" http://www.dwheeler.com/vim -+" History: 24.05.2006 MK Unified Headers -+" 26.05.2006 MK ' should not be in iskeyword. -+" 16.07.2006 MK Ada-Mode as vim-ball -+" 02.10.2006 MK Better folding. -+" 15.10.2006 MK Bram's suggestion for runtime integration -+" 05.11.2006 MK Spell check for comments and strings only -+" 05.11.2006 MK Bram suggested to save on spaces -+" Help Page: help ft-ada-syntax -+"------------------------------------------------------------------------------ -+" The formal spec of Ada 2005 (ARM) is the "Ada 2005 Reference Manual". -+" For more Ada 2005 info, see http://www.gnuada.org and http://www.adapower.com. -+" -+" This vim syntax file works on vim 7.0 only and makes use of most of Voim 7.0 -+" advanced features. -+"------------------------------------------------------------------------------ -+ -+if exists("b:current_syntax") || version < 700 -+ finish -+endif -+ -+let b:current_syntax = "ada" -+ -+" Section: Ada is entirely case-insensitive. {{{1 -+" -+syntax case ignore -+setlocal nosmartcase -+setlocal ignorecase -+ -+" Section: Highlighting commands {{{1 -+" -+" There are 72 reserved words in total in Ada2005. Some keywords are -+" used in more than one way. For example: -+" 1. "end" is a general keyword, but "end if" ends a Conditional. -+" 2. "then" is a conditional, but "and then" is an operator. -+" -+for b:Item in g:ada#Keywords -+ " Standard Exceptions (including I/O). -+ " We'll highlight the standard exceptions, similar to vim's Python mode. -+ " It's possible to redefine the standard exceptions as something else, -+ " but doing so is very bad practice, so simply highlighting them makes sense. -+ if b:Item['kind'] == "x" -+ execute "syntax keyword adaException " . b:Item['word'] -+ endif -+ if b:Item['kind'] == "a" -+ execute 'syntax match adaAttribute "\V' . b:Item['word'] . '"' -+ endif -+ " We don't normally highlight types in package Standard -+ " (Integer, Character, Float, etc.). I don't think it looks good -+ " with the other type keywords, and many Ada programs define -+ " so many of their own types that it looks inconsistent. -+ " However, if you want this highlighting, turn on "ada_standard_types". -+ " For package Standard's definition, see ARM section A.1. -+ if b:Item['kind'] == "t" && exists ("g:ada_standard_types") -+ execute "syntax keyword adaBuiltinType " . b:Item['word'] -+ endif -+endfor -+ -+" Section: others {{{1 -+" -+syntax keyword adaLabel others -+ -+" Section: Operatoren {{{1 -+" -+syntax keyword adaOperator abs mod not rem xor -+syntax match adaOperator "\" -+syntax match adaOperator "\" -+syntax match adaOperator "\" -+syntax match adaOperator "\" -+syntax match adaOperator "[-+*/<>&]" -+syntax keyword adaOperator ** -+syntax match adaOperator "[/<>]=" -+syntax keyword adaOperator => -+syntax match adaOperator "\.\." -+syntax match adaOperator "=" -+ -+" Section: <> {{{1 -+" -+" Handle the box, <>, specially: -+" -+syntax keyword adaSpecial <> -+ -+" Section: rainbow color {{{1 -+" -+if exists("g:ada_rainbow_color") -+ syntax match adaSpecial "[:;.,]" -+ call rainbow_parenthsis#LoadRound () -+ call rainbow_parenthsis#Activate () -+else -+ syntax match adaSpecial "[:;().,]" -+endif -+ -+" Section: := {{{1 -+" -+" We won't map "adaAssignment" by default, but we need to map ":=" to -+" something or the "=" inside it will be mislabelled as an operator. -+" Note that in Ada, assignment (:=) is not considered an operator. -+" -+syntax match adaAssignment ":=" -+ -+" Section: Numbers, including floating point, exponents, and alternate bases. {{{1 -+" -+syntax match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" -+syntax match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" -+ -+" Section: Identify leading numeric signs {{{1 -+" -+" In "A-5" the "-" is an operator, " but in "A:=-5" the "-" is a sign. This -+" handles "A3+-5" (etc.) correctly. " This assumes that if you put a -+" don't put a space after +/- when it's used " as an operator, you won't -+" put a space before it either -- which is true " in code I've seen. -+" -+syntax match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 -+ -+" Section: Labels for the goto statement. {{{1 -+" -+syntax region adaLabel start="<<" end=">>" -+ -+" Section: Boolean Constants {{{1 -+" Boolean Constants. -+syntax keyword adaBoolean true false -+ -+" Section: Warn C/C++ {{{1 -+" -+" Warn people who try to use C/C++ notation erroneously: -+" -+syntax match adaError "//" -+syntax match adaError "/\*" -+syntax match adaError "==" -+ -+ -+" Section: Space Errors {{{1 -+" -+if exists("g:ada_space_errors") -+ if !exists("g:ada_no_trail_space_error") -+ syntax match adaSpaceError excludenl "\s\+$" -+ endif -+ if !exists("g:ada_no_tab_space_error") -+ syntax match adaSpaceError " \+\t"me=e-1 -+ endif -+ if !exists("g:ada_all_tab_usage") -+ syntax match adaSpecial "\t" -+ endif -+endif -+ -+" Section: end {{{1 -+" Unless special ("end loop", "end if", etc.), "end" marks the end of a -+" begin, package, task etc. Assiging it to adaEnd. -+syntax match adaEnd /\/ -+ -+syntax keyword adaPreproc pragma -+ -+syntax keyword adaRepeat exit for loop reverse while -+syntax match adaRepeat "\" -+ -+syntax keyword adaStatement accept delay goto raise requeue return -+syntax keyword adaStatement terminate -+syntax match adaStatement "\" -+ -+" Section: Handle Ada's record keywords. {{{1 -+" -+" 'record' usually starts a structure, but "with null record;" does not, -+" and 'end record;' ends a structure. The ordering here is critical - -+" 'record;' matches a "with null record", so make it a keyword (this can -+" match when the 'with' or 'null' is on a previous line). -+" We see the "end" in "end record" before the word record, so we match that -+" pattern as adaStructure (and it won't match the "record;" pattern). -+" -+syntax match adaStructure "\" contains=adaRecord -+syntax match adaStructure "\" contains=adaRecord -+syntax match adaKeyword "\" -+syntax match adaConditional "\" -+syntax match adaConditional "\" -+syntax match adaConditional "\" -+syntax match adaConditional "\" -+syntax match adaConditional "\" -+syntax keyword adaConditional if case select -+syntax keyword adaConditional elsif when -+ -+" Section: other keywords {{{1 -+syntax match adaKeyword "\" contains=adaRecord -+syntax keyword adaKeyword all do exception in new null out -+syntax keyword adaKeyword separate until overriding -+ -+" Section: begin keywords {{{1 -+" -+" These keywords begin various constructs, and you _might_ want to -+" highlight them differently. -+" -+syntax keyword adaBegin begin body declare entry generic -+syntax keyword adaBegin protected renames task -+ -+syntax match adaBegin "\" contains=adaFunction -+syntax match adaBegin "\" contains=adaProcedure -+syntax match adaBegin "\" contains=adaPackage -+ -+if exists("ada_with_gnat_project_files") -+ syntax keyword adaBegin project -+endif -+ -+" Section: with, use {{{1 -+" -+if exists("ada_withuse_ordinary") -+ " Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. -+ syntax keyword adaKeyword with use -+else -+ " Highlight "with" and "use" clauses like C's "#include" when they're used -+ " to reference other compilation units; otherwise they're ordinary keywords. -+ " If we have vim 6.0 or later, we'll use its advanced pattern-matching -+ " capabilities so that we won't match leading spaces. -+ syntax match adaKeyword "\" -+ syntax match adaKeyword "\" -+ syntax match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ syntax match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ syntax match adaInc "\" contained contains=NONE -+ syntax match adaInc "\" contained contains=NONE -+ syntax match adaInc "\" contained contains=NONE -+ " Recognize "with null record" as a keyword (even the "record"). -+ syntax match adaKeyword "\" -+ " Consider generic formal parameters of subprograms and packages as keywords. -+ syntax match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>" -+ syntax match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>" -+endif -+ -+" Section: String and character constants. {{{1 -+" -+syntax region adaString contains=@Spell start=+"+ skip=+""+ end=+"+ -+syntax match adaCharacter "'.'" -+ -+" Section: Todo (only highlighted in comments) {{{1 -+" -+syntax keyword adaTodo contained TODO FIXME XXX NOTE -+ -+" Section: Comments. {{{1 -+" -+syntax region adaComment -+ \ oneline -+ \ contains=adaTodo,adaLineError,@Spell -+ \ start="--" -+ \ end="$" -+ -+" Section: line errors {{{1 -+" -+" Note: Line errors have become quite slow with Vim 7.0 -+" -+if exists("g:ada_line_errors") -+ syntax match adaLineError "\(^.\{79}\)\@<=." contains=ALL containedin=ALL -+endif -+ -+" Section: syntax folding {{{1 -+" -+" Syntax folding is very tricky - for now I still suggest to use -+" indent folding -+" -+if exists("g:ada_folding") && g:ada_folding[0] == 's' -+ if stridx (g:ada_folding, 'p') >= 0 -+ syntax region adaPackage -+ \ start="\(\\|\\)\s*\z(\k*\)" -+ \ end="end\s\+\z1\s*;" -+ \ keepend extend transparent fold contains=ALL -+ endif -+ if stridx (g:ada_folding, 'f') >= 0 -+ syntax region adaProcedure -+ \ start="\\s*\z(\k*\)" -+ \ end="\\s\+\z1\s*;" -+ \ keepend extend transparent fold contains=ALL -+ syntax region adaFunction -+ \ start="\\s*\z(\k*\)" -+ \ end="end\s\+\z1\s*;" -+ \ keepend extend transparent fold contains=ALL -+ endif -+ if stridx (g:ada_folding, 'f') >= 0 -+ syntax region adaRecord -+ \ start="\" -+ \ end="\" -+ \ keepend extend transparent fold contains=ALL -+ endif -+endif -+ -+" Section: The default methods for highlighting. Can be overridden later. {{{1 -+" -+highlight def link adaCharacter Character -+highlight def link adaComment Comment -+highlight def link adaConditional Conditional -+highlight def link adaKeyword Keyword -+highlight def link adaLabel Label -+highlight def link adaNumber Number -+highlight def link adaSign Number -+highlight def link adaOperator Operator -+highlight def link adaPreproc PreProc -+highlight def link adaRepeat Repeat -+highlight def link adaSpecial Special -+highlight def link adaStatement Statement -+highlight def link adaString String -+highlight def link adaStructure Structure -+highlight def link adaTodo Todo -+highlight def link adaType Type -+highlight def link adaTypedef Typedef -+highlight def link adaStorageClass StorageClass -+highlight def link adaBoolean Boolean -+highlight def link adaException Exception -+highlight def link adaAttribute Tag -+highlight def link adaInc Include -+highlight def link adaError Error -+highlight def link adaSpaceError Error -+highlight def link adaLineError Error -+highlight def link adaBuiltinType Type -+highlight def link adaAssignment Special -+ -+" Subsection: Begin, End {{{2 -+" -+if exists ("ada_begin_preproc") -+ " This is the old default display: -+ highlight def link adaBegin PreProc -+ highlight def link adaEnd PreProc -+else -+ " This is the new default display: -+ highlight def link adaBegin Keyword -+ highlight def link adaEnd Keyword -+endif -+ -+ -+" Section: formatoptions {{{1 -+" -+setlocal formatoptions+=ron -+ -+" Section: sync {{{1 -+" -+" We don't need to look backwards to highlight correctly; -+" this speeds things up greatly. -+syntax sync minlines=1 maxlines=1 -+ -+finish " 1}}} -+ -+"------------------------------------------------------------------------------ -+" Copyright (C) 2006 Martin Krischik -+" -+" Vim is Charityware - see ":help license" or uganda.txt for licence details. -+"------------------------------------------------------------------------------ -+"vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -+"vim: foldmethod=marker -diff -urN vim71/1/syntax/.svn/text-base/bush.vim.svn-base vim71_ada/1/syntax/.svn/text-base/bush.vim.svn-base ---- vim71/1/syntax/.svn/text-base/bush.vim.svn-base 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/1/syntax/.svn/text-base/bush.vim.svn-base 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,309 @@ -+" Vim syntax file -+" Language: BUSH / AdaScript -+" Maintainer: Ken O. Burtch -+" URL: http://www.pegasoft.ca/bush -+" Last Change: 2004-06-29 -+ -+" Former Maintainer: Simon Bradley -+" (was ) -+" Other contributors: Preben Randhol. -+" The formal spec of Ada95 (ARM) is the "Ada95 Reference Manual". -+" For more Ada95 info, see http://www.gnuada.org and http://www.adapower.com. -+ -+" This vim syntax file works on vim 5.6, 5.7, 5.8 and 6.x. -+" It implements Bram Moolenaar's April 25, 2001 recommendations to make -+" the syntax file maximally portable across different versions of vim. -+" If vim 6.0+ is available, -+" this syntax file takes advantage of the vim 6.0 advanced pattern-matching -+" functions to avoid highlighting uninteresting leading spaces in -+" some expressions containing "with" and "use". -+ -+" For version 5.x: Clear all syntax items -+" For version 6.x: Quit when a syntax file was already loaded -+if version < 600 -+ syntax clear -+elseif exists("b:current_syntax") -+ finish -+endif -+ -+" Ada is entirely case-insensitive. -+syn case ignore -+ -+" We don't need to look backwards to highlight correctly; -+" this speeds things up greatly. -+syn sync minlines=1 maxlines=1 -+ -+" Highlighting commands. There are 69 reserved words in total in Ada95. -+" Some keywords are used in more than one way. For example: -+" 1. "end" is a general keyword, but "end if" ends a Conditional. -+" 2. "then" is a conditional, but "and then" is an operator. -+ -+ -+" Standard Exceptions (including I/O). -+" We'll highlight the standard exceptions, similar to vim's Python mode. -+" It's possible to redefine the standard exceptions as something else, -+" but doing so is very bad practice, so simply highlighting them makes sense. -+syn keyword adaException Constraint_Error Program_Error Storage_Error -+syn keyword adaException Tasking_Error -+syn keyword adaException Status_Error Mode_Error Name_Error Use_Error -+syn keyword adaException Device_Error End_Error Data_Error Layout_Error -+syn keyword adaException Length_Error Pattern_Error Index_Error -+syn keyword adaException Translation_Error -+syn keyword adaException Time_Error Argument_Error -+syn keyword adaException Tag_Error -+syn keyword adaException Picture_Error -+" Interfaces -+syn keyword adaException Terminator_Error Conversion_Error -+syn keyword adaException Pointer_Error Dereference_Error Update_Error -+" This isn't in the Ada spec, but a GNAT extension. -+syn keyword adaException Assert_Failure -+" We don't list ALL exceptions defined in particular compilers (e.g., GNAT), -+" because it's quite reasonable to define those phrases as non-exceptions. -+ -+ -+" We don't normally highlight types in package Standard -+" (Integer, Character, Float, etc.). I don't think it looks good -+" with the other type keywords, and many Ada programs define -+" so many of their own types that it looks inconsistent. -+" However, if you want this highlighting, turn on "ada_standard_types". -+" For package Standard's definition, see ARM section A.1. -+ -+if exists("ada_standard_types") -+ syn keyword adaBuiltinType Boolean Integer Natural Positive Float -+ syn keyword adaBuiltinType Character Wide_Character -+ syn keyword adaBuiltinType String Wide_String -+ syn keyword adaBuiltinType Duration -+ " These aren't listed in ARM section A.1's code, but they're noted as -+ " options in ARM sections 3.5.4 and 3.5.7: -+ syn keyword adaBuiltinType Short_Integer Short_Short_Integer -+ syn keyword adaBuiltinType Long_Integer Long_Long_Integer -+ syn keyword adaBuiltinType Short_Float Short_Short_Float -+ syn keyword adaBuiltinType Long_Float Long_Long_Float -+ " BUSH-specific types -+ syn keyword adaBuiltinType command -+ syn keyword adaBuiltinType socket_type -+ syn keyword adaBuiltinType unbounded_string -+ syn keyword adaBuiltinType universal_typeless -+ syn keyword adaBuiltinType universal_string -+ syn keyword adaBuiltinType universal_numeric -+endif -+ -+" There are MANY other predefined types; they've not been added, because -+" determining when they're a type requires context in general. -+" One potential addition would be Unbounded_String. -+ -+ -+syn keyword adaLabel others -+ -+syn keyword adaOperator abs mod not rem xor -+syn match adaOperator "\" -+syn match adaOperator "\" -+syn match adaOperator "\" -+syn match adaOperator "\" -+syn match adaOperator "[-+*/<>&]" -+syn keyword adaOperator ** -+syn match adaOperator "[/<>]=" -+syn keyword adaOperator => -+syn match adaOperator "\.\." -+syn match adaOperator "=" -+ -+" We won't map "adaAssignment" by default, but we need to map ":=" to -+" something or the "=" inside it will be mislabelled as an operator. -+" Note that in Ada, assignment (:=) is not considered an operator. -+syn match adaAssignment ":=" -+ -+" Handle the box, <>, specially: -+syn keyword adaSpecial <> -+ -+" Numbers, including floating point, exponents, and alternate bases. -+syn match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" -+syn match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" -+ -+" Identify leading numeric signs. In "A-5" the "-" is an operator, -+" but in "A:=-5" the "-" is a sign. This handles "A3+-5" (etc.) correctly. -+" This assumes that if you put a don't put a space after +/- when it's used -+" as an operator, you won't put a space before it either -- which is true -+" in code I've seen. -+syn match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 -+ -+" Labels for the goto statement. -+syn region adaLabel start="<<" end=">>" -+ -+" Boolean Constants. -+syn keyword adaBoolean true false -+ -+" Warn people who try to use C/C++ notation erroneously: -+syn match adaError "//" -+syn match adaError "/\*" -+syn match adaError "==" -+ -+ -+if exists("ada_space_errors") -+ if !exists("ada_no_trail_space_error") -+ syn match adaSpaceError excludenl "\s\+$" -+ endif -+ if !exists("ada_no_tab_space_error") -+ syn match adaSpaceError " \+\t"me=e-1 -+ endif -+endif -+ -+" Unless special ("end loop", "end if", etc.), "end" marks the end of a -+" begin, package, task etc. Assiging it to adaEnd. -+syn match adaEnd "\" -+ -+syn keyword adaPreproc pragma -+ -+syn keyword adaRepeat exit for loop reverse while -+syn match adaRepeat "\" -+ -+syn keyword adaStatement accept delay goto raise requeue return -+syn keyword adaStatement terminate -+" BUSH-specific statements -+syn keyword adaStatement cd -+syn keyword adaStatement clear -+syn keyword adaStatement env -+syn keyword adaStatement inkey -+syn keyword adaStatement jobs -+syn keyword adaStatement logout -+syn keyword adaStatement pwd -+syn keyword adaStatement step -+syn keyword adaStatement trace -+syn keyword adaStatement typeset -+syn keyword adaStatement unset -+syn keyword adaStatement wait -+syn keyword adaStatement history -+syn keyword adaStatement "?" -+syn match adaStatement "\" -+ -+" Handle Ada's record keywords. -+" 'record' usually starts a structure, but "with null record;" does not, -+" and 'end record;' ends a structure. The ordering here is critical - -+" 'record;' matches a "with null record", so make it a keyword (this can -+" match when the 'with' or 'null' is on a previous line). -+" We see the "end" in "end record" before the word record, so we match that -+" pattern as adaStructure (and it won't match the "record;" pattern). -+syn match adaStructure "\" -+syn match adaStructure "\" -+syn match adaKeyword "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn keyword adaConditional if case select -+syn keyword adaConditional elsif when -+ -+syn keyword adaKeyword all do exception in is new null out -+syn keyword adaKeyword separate until -+ -+" These keywords begin various constructs, and you _might_ want to -+" highlight them differently. -+syn keyword adaBegin begin body declare entry function generic -+syn keyword adaBegin package procedure protected renames task -+ -+ -+if exists("ada_withuse_ordinary") -+" Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. -+ syn keyword adaKeyword with use -+else -+ " Highlight "with" and "use" clauses like C's "#include" when they're used -+ " to reference other compilation units; otherwise they're ordinary keywords. -+ " If we have vim 6.0 or later, we'll use its advanced pattern-matching -+ " capabilities so that we won't match leading spaces. -+ syn match adaKeyword "\" -+ syn match adaKeyword "\" -+ if version < 600 -+ syn match adaBeginWith "^\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ syn match adaSemiWith ";\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>"lc=1 contains=adaInc -+ else -+ syn match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ syn match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ endif -+ syn match adaInc "\" contained contains=NONE -+ syn match adaInc "\" contained contains=NONE -+ syn match adaInc "\" contained contains=NONE -+ " Recognize "with null record" as a keyword (even the "record"). -+ syn match adaKeyword "\" -+ " Consider generic formal parameters of subprograms and packages as keywords. -+ if version < 600 -+ syn match adaKeyword ";\s*with\s\+\(function\|procedure\|package\)\>" -+ syn match adaKeyword "^\s*with\s\+\(function\|procedure\|package\)\>" -+ else -+ syn match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>" -+ syn match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>" -+ endif -+endif -+ -+ -+" String and character constants. -+syn region adaString start=+"+ skip=+""+ end=+"+ -+syn match adaCharacter "'.'" -+ -+" Todo (only highlighted in comments) -+syn keyword adaTodo contained TODO FIXME XXX -+ -+" Comments. -+syn region adaComment oneline contains=adaTodo start="--" end="$" -+ -+ -+ -+" Define the default highlighting. -+" For version 5.7 and earlier: only when not done already -+" For version 5.8 and later: only when an item doesn't have highlighting yet -+if version >= 508 || !exists("did_ada_syn_inits") -+ if version < 508 -+ let did_ada_syn_inits = 1 -+ command -nargs=+ HiLink hi link -+ else -+ command -nargs=+ HiLink hi def link -+ endif -+ -+ " The default methods for highlighting. Can be overridden later. -+ HiLink adaCharacter Character -+ HiLink adaComment Comment -+ HiLink adaConditional Conditional -+ HiLink adaKeyword Keyword -+ HiLink adaLabel Label -+ HiLink adaNumber Number -+ HiLink adaSign Number -+ HiLink adaOperator Operator -+ HiLink adaPreproc PreProc -+ HiLink adaRepeat Repeat -+ HiLink adaSpecial Special -+ HiLink adaStatement Statement -+ HiLink adaString String -+ HiLink adaStructure Structure -+ HiLink adaTodo Todo -+ HiLink adaType Type -+ HiLink adaTypedef Typedef -+ HiLink adaStorageClass StorageClass -+ HiLink adaBoolean Boolean -+ HiLink adaException Exception -+ HiLink adaInc Include -+ HiLink adaError Error -+ HiLink adaSpaceError Error -+ HiLink adaBuiltinType Type -+ -+ if exists("ada_begin_preproc") -+ " This is the old default display: -+ HiLink adaBegin PreProc -+ HiLink adaEnd PreProc -+ else -+ " This is the new default display: -+ HiLink adaBegin Keyword -+ HiLink adaEnd Keyword -+ endif -+ -+ delcommand HiLink -+endif -+ -+let b:current_syntax = "ada" -+ -+" vim: ts=8 diff -urN vim71/runtime/autoload/adacomplete.vim vim71_ada/runtime/autoload/adacomplete.vim --- vim71/runtime/autoload/adacomplete.vim 2007-05-05 19:34:16.000000000 +0200 +++ vim71_ada/runtime/autoload/adacomplete.vim 2008-01-16 16:46:40.000000000 +0100 @@ -34628,18 +5,18 @@ diff -urN vim71/runtime/autoload/adacomplete.vim vim71_ada/runtime/autoload/adac "------------------------------------------------------------------------------ " Description: Vim Ada omnicompletion file " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ " Maintainer: Martin Krischik -" $Author: karsten $ --" $Date: 2008/01/16 15:58:14 $ +-" $Date: 2008/01/18 13:52:03 $ -" Version: 4.2 --" $Revision: 1.1 $ +-" $Revision: 1.2 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ +" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ ++" $Date: 2008/01/18 13:52:03 $ +" Version: 4.5 -+" $Revision: 1.1 $ ++" $Revision: 1.2 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ " History: 24.05.2006 MK Unified Headers " 26.05.2006 MK improved search for begin of word. @@ -34651,22 +28,22 @@ diff -urN vim71/runtime/autoload/ada.vim vim71_ada/runtime/autoload/ada.vim "------------------------------------------------------------------------------ " Description: Perform Ada specific completion & tagging. " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ -" Maintainer: Martin Krischik -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +" Maintainer: Martin Krischik +" Taylor Venable " Neil Bird -" $Author: karsten $ --" $Date: 2008/01/16 15:58:14 $ +-" $Date: 2008/01/18 13:52:03 $ -" Version: 4.2 --" $Revision: 1.1 $ +-" $Revision: 1.2 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ +" Ned Okie +" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ ++" $Date: 2008/01/18 13:52:03 $ +" Version: 4.5 -+" $Revision: 1.1 $ ++" $Revision: 1.2 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ " History: 24.05.2006 MK Unified Headers " 26.05.2006 MK ' should not be in iskeyword. @@ -34778,20 +155,20 @@ diff -urN vim71/runtime/autoload/decada.vim vim71_ada/runtime/autoload/decada.vi "------------------------------------------------------------------------------ " Description: Vim Ada/Dec Ada compiler file " Language: Ada (Dec Ada) --" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik -" Maintainer: Martin Krischik -" $Author: karsten $ --" $Date: 2008/01/16 15:58:14 $ +-" $Date: 2008/01/18 13:52:03 $ -" Version: 4.2 --" $Revision: 1.1 $ +-" $Revision: 1.2 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ +" Maintainer: Martin Krischik +" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ ++" $Date: 2008/01/18 13:52:03 $ +" Version: 4.5 -+" $Revision: 1.1 $ ++" $Revision: 1.2 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ " History: 21.07.2006 MK New Dec Ada " 15.10.2006 MK Bram's suggestion for runtime integration @@ -34812,21 +189,21 @@ diff -urN vim71/runtime/autoload/gnat.vim vim71_ada/runtime/autoload/gnat.vim "------------------------------------------------------------------------------ " Description: Vim Ada/GNAT compiler file " Language: Ada (GNAT) --" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik -" Maintainer: Martin Krischik -" $Author: karsten $ --" $Date: 2008/01/16 15:58:14 $ +-" $Date: 2008/01/18 13:52:03 $ -" Version: 4.2 --" $Revision: 1.1 $ +-" $Revision: 1.2 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ +" Maintainer: Martin Krischi k +" Ned Okie +" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ ++" $Date: 2008/01/18 13:52:03 $ +" Version: 4.5 -+" $Revision: 1.1 $ ++" $Revision: 1.2 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ " History: 24.05.2006 MK Unified Headers " 16.07.2006 MK Ada-Mode as vim-ball @@ -34873,20 +250,20 @@ diff -urN vim71/runtime/compiler/decada.vim vim71_ada/runtime/compiler/decada.vi "------------------------------------------------------------------------------ " Description: Vim Ada/Dec Ada compiler file " Language: Ada (Dec Ada) --" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik -" Maintainer: Martin Krischik -" $Author: karsten $ --" $Date: 2008/01/16 15:58:14 $ +-" $Date: 2008/01/18 13:52:03 $ -" Version: 4.2 --" $Revision: 1.1 $ +-" $Revision: 1.2 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ +" Maintainer: Martin Krischik +" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ ++" $Date: 2008/01/18 13:52:03 $ +" Version: 4.5 -+" $Revision: 1.1 $ ++" $Revision: 1.2 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ " History: 21.07.2006 MK New Dec Ada " 15.10.2006 MK Bram's suggestion for runtime integration @@ -34932,21 +309,21 @@ diff -urN vim71/runtime/compiler/gnat.vim vim71_ada/runtime/compiler/gnat.vim "------------------------------------------------------------------------------ " Description: Vim Ada/GNAT compiler file " Language: Ada (GNAT) --" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik -" Maintainer: Martin Krischik -" $Author: karsten $ --" $Date: 2008/01/16 15:58:14 $ +-" $Date: 2008/01/18 13:52:03 $ -" Version: 4.2 --" $Revision: 1.1 $ +-" $Revision: 1.2 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ +" Maintainer: Martin Krischi k +" Ned Okie +" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ ++" $Date: 2008/01/18 13:52:03 $ +" Version: 4.5 -+" $Revision: 1.1 $ ++" $Revision: 1.2 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ " History: 24.05.2006 MK Unified Headers " 16.07.2006 MK Ada-Mode as vim-ball @@ -35493,1165 +870,6 @@ diff -urN vim71/runtime/doc/ft_ada.txt vim71_ada/runtime/doc/ft_ada.txt +============================================================================== +vim: textwidth=78 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab +vim: filetype=help -diff -urN vim71/runtime/doc/NERD_commenter.txt vim71_ada/runtime/doc/NERD_commenter.txt ---- vim71/runtime/doc/NERD_commenter.txt 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/runtime/doc/NERD_commenter.txt 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,1155 @@ -+*NERD_comments.txt* Plugin for commenting code v169 -+ -+ -+ NERD_COMMENTS REFERENCE MANUAL~ -+ -+ -+ -+ -+ -+============================================================================== -+CONTENTS {{{2 *NERD_comments-contents* -+ -+ 1.Intro...................................|NERD_comments| -+ 2.Functionality provided..................|NERD_com-functionality| -+ 2.1 Functionality Summary.............|NERD_com-functionality-summary| -+ 2.2 Functionality Details.............|NERD_com-functionality-details| -+ 2.2.1 Comment map.................|NERD_com-comment| -+ 2.2.2 Nested comment map..........|NERD_com-nested-comment| -+ 2.2.3 Toggle comment map..........|NERD_com-toggle-comment| -+ 2.2.4 Minimal comment map.........|NERD_com-minimal-comment| -+ 2.2.5 Invert comment map..........|NERD_com-invert-comment| -+ 2.2.6 Sexy comment map............|NERD_com-sexy-comment| -+ 2.2.7 Yank comment map............|NERD_com-yank-comment| -+ 2.2.8 Comment to EOL map..........|NERD_com-EOL-comment| -+ 2.2.9 Append com to line map......|NERD_com-append-comment| -+ 2.2.10 Prepend com to line map....|NERD_com-prepend-comment| -+ 2.2.11 Insert comment map.........|NERD_com-insert-comment| -+ 2.2.12 Use alternate delims map...|NERD_com-alt-delim| -+ 2.2.13 Comment aligned maps.......|NERD_com-aligned-comment| -+ 2.2.14 Uncomment line map.........|NERD_com-uncomment-line| -+ 2.3 Supported filetypes...............|NERD_com-filetypes| -+ 2.4 Sexy Comments.....................|NERD_com_sexy_comments| -+ 3.Customisation...........................|NERD_com-customisation| -+ 3.1 Customisation summary.............|NERD_com-cust-summary| -+ 3.2 Customisation details.............|NERD_com-cust-details| -+ 3.3 Default delimiter customisation...|NERD_com-cust-delims| -+ 3.4 Key mapping customisation.........|NERD_com-cust-keys| -+ 3.5 Sample regular expressions........|NERD_com-reg-exps| -+ 4.Issues with the script..................|NERD_com-issues| -+ 4.1 Delimiter detection heuristics....|NERD_com-heuristics| -+ 4.2 Nesting issues....................|NERD_com-nesting| -+ 4.3 Nesting issues....................|NERD_com-nesting| -+ 4.3 Mark clobbering...................|NERD_com-mark-clobbering| -+ 5.TODO list...............................|NERD_com-todo| -+ 6.Credits.................................|NERD_com-credits| -+ -+============================================================================== -+1. Intro {{{2 *NERD_comments* -+ -+NERD_comments provides a set of handy key mappings for commenting code. These -+mappings are consistent across all supported filetypes. -+ -+When writing NERD_comments I have tried to give it as many features/options as -+possible while keeping it so that the plugin can still be used with little or -+no knowledge of these. The average user need only know about a few key -+mappings to use NERD_comments while there are plenty of other features for the -+l33t nerd take advantage of. -+ -+Enjoy :D -+ -+============================================================================== -+2. Functionality provided {{{2 *NERD_com-functionality* -+ -+------------------------------------------------------------------------------ -+2.1 Functionality summary {{{3 *NERD_com-functionality-summary* -+ -+The following key mappings are provided by default (there is also a menu -+provided that contains menu items corresponding to all the below mappings): -+ -+Note: is a user defined key that is used to start keymappings and -+defaults to \. Check out || for details. -+ -+Most of the following mappings are for normal/visual mode only. The -+|NERD_com-insert-comment| mapping is for insert mode only. -+ -+cc |NERD_com-comment-map| -+Comments out the current line or text selected in visual mode. -+ -+ -+cn |NERD_com-nested-comment| -+Same as |NERD_com-comment-map| but enforces nesting. -+ -+ -+c |NERD_com-toggle-comment| -+Toggles the comment state of the selected line(s). If the topmost selected -+line is commented, all selected lines are uncommented and vice versa. -+ -+ -+cm |NERD_com-minimal-comment| -+Comments the given lines using only one set of multipart delimiters if -+possible. -+ -+ -+ci |NERD_com-invert-comment| -+Toggles the comment state of the selected line(s) individually. Each selected -+line that is commented is uncommented and vice versa. -+ -+ -+cs |NERD_com-sexy-comment| -+Comments out the selected lines ``sexually'' -+ -+ -+cy |NERD_com-yank-comment| -+Same as |NERD_com-comment-map| except that the commented line(s) are yanked -+before commenting. -+ -+ -+c$ |NERD_com-EOL-comment| -+Comments the current line from the cursor to the end of line. -+ -+ -+cA |NERD_com-append-comment| -+Adds comment delimiters to the end of line and goes into insert mode between -+them. -+ -+ -+cI |NERD_com-prepend-comment| -+Adds comment delimiters to the start of line and goes into insert mode between -+them. -+ -+ -+ |NERD_com-insert-comment| -+Adds comment delimiters at the current cursor position and inserts between. -+ -+ -+ca |NERD_com-alt-delim| -+Switches to the alternative set of delimiters. -+ -+ -+cl OR cr OR cb |NERD_com-aligned-comment| -+Same as |NERD_com-comment| except that the delimiters are aligned down the -+left side (cl), the right side (cr) or both sides -+(cb). -+ -+ -+cu |NERD_com-uncomment-line| -+Uncomments the selected line(s). -+ -+------------------------------------------------------------------------------ -+2.2 Functionality details {{{3 *NERD_com-functionality-details* -+ -+------------------------------------------------------------------------------ -+2.2.1 Comment map *NERD_com-comment* -+cc -+Comments out the current line. If multiple lines are selected in visual-line -+mode, they are all commented out. If some text is selected in visual or -+visual-block mode then NERD_comments will try to comment out the exact text -+that is selected using multi-part delimiters if they are available. -+ -+Works in normal, visual, visual-line and visual-block mode. -+ -+Change the mapping with: |NERD_com_line_map|. -+ -+Relevant options: -+|NERD_allow_any_visual_delims_regexp| -+|NERD_comment_whole_lines_in_v_mode| -+|NERD_block_com_after_right| -+|NERD_left_align_regexp| -+|NERD_place_holder_regexp| -+|NERD_right_align_regexp| -+|NERD_space_delim_filetype_regexp| -+|NERD_use_nested_comments_default| -+ -+------------------------------------------------------------------------------ -+2.2.2 Nested comment map *NERD_com-nested-comment* -+cn -+Performs nested commenting. Works the same as cc except that if a -+line is already commented then it will be commented again. -+ -+If the filetype is covered by the |NERD_place_holder_regexp| option -+then the previous comment delimiters will be replaced by place-holder -+delimiters if needed. Otherwise the nested comment will only be added if the -+current commenting delimiters have no right delimiter (to avoid compiler -+errors) -+ -+Works in normal, visual, visual-line, visual-block modes. -+ -+Change the mapping with: |NERD_com_line_nest_map|. -+ -+Relevant options: -+|NERD_allow_any_visual_delims_regexp| -+|NERD_comment_whole_lines_in_v_mode| -+|NERD_block_com_after_right| -+|NERD_left_align_regexp| -+|NERD_place_holder_regexp| -+|NERD_right_align_regexp| -+|NERD_space_delim_filetype_regexp| -+|NERD_use_nested_comments_default| -+ -+ -+------------------------------------------------------------------------------ -+2.2.3 Toggle comment map *NERD_com-toggle-comment* -+c -+Toggles commenting of the lines selected. The behaviour of this mapping -+depends on whether the first line selected is commented or not. If so, all -+selected lines are uncommented and vice versa. -+ -+With this mapping, lines are only considered to be commented if a left comment -+delimiter is the first non-space/tab char on the line. -+ -+Works in normal, visual-line, modes. -+Using this mapping in visual or visual-block modes will cause it to work like -+|NERD_com-comment| -+ -+Change the mapping with: |NERD_com_line_toggle_map|. -+ -+Relevant options: -+|NERD_left_align_regexp| -+|NERD_right_align_regexp| -+|NERD_space_delim_filetype_regexp| -+|NERD_use_nested_comments_default| -+ -+------------------------------------------------------------------------------ -+2.2.4 Minimal comment map *NERD_com-minimal-comment* -+cm -+Comments the selected lines using one set of multipart delimiters if possible. -+ -+For example: if you are programming in c and you select 5 lines and press -+cm then a '/*' will be placed at the start of the top line and a '*/' -+will be placed at the end of the last line. -+ -+Sets of multipart comment delimiters that are between the top and bottom -+selected lines are replaced with place holders (see |NERD_lPlace|) if -+NERD_place_holder_regexp is set for the current filetype. If it is not, then -+the comment will be aborted if place holders are required to prevent illegal -+syntax. -+ -+------------------------------------------------------------------------------ -+2.2.5 Invert comment map *NERD_com-invert-comment* -+ci -+Inverts the commented state of each selected line. If the a selected line is -+commented then it is uncommented and vice versa. Each line is examined and -+commented/uncommented individually. -+ -+With this mapping, lines are only considered to be commented if a left comment -+delimiter is the first non-space/tab char on the line. -+ -+Works in normal, visual-line, modes. -+ -+Change the mapping with: |NERD_com_line_invert_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.6 Sexy comment map *NERD_com-sexy-comment* -+cs -+Comments the selected line(s) ``sexily''... see |NERD_com_sexy_commenting| for -+a description of what sexy comments are. Can only be done on filetypes for -+which there is at least one set of multipart comment delimiters specified. -+ -+Sexy comments cannot be nested and lines inside a sexy comment cannot be -+commented again. -+ -+Works in normal, visual-line. -+ -+Change the mapping with: |NERD_com_line_sexy_map| -+ -+Relevant options: -+|NERD_use_compact_sexy_com_regexp| -+ -+------------------------------------------------------------------------------ -+2.2.7 Yank comment map *NERD_com-yank-comment* -+cy -+Same as cc except that it yanks the line(s) that are commented first. -+ -+Works in normal, visual, visual-line, visual-block modes. -+ -+Change the mapping with: |NERD_com_line_yank_map| -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.8 Comment to EOL map *NERD_com-EOL-comment* -+c$ -+Comments the current line from the current cursor position up to the end of -+the line. -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_com_to_end_of_line_map| -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.9 Append com to line map *NERD_com-append-comment* -+cA -+Appends comment delimiters to the end of the current line and goes -+to insert mode between the new delimiters. -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_append_com_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.10 Prepend com to line map *NERD_com-prepend-comment* -+cI -+Prepends comment delimiters to the start of the current line and goes to -+insert mode between the new delimiters. -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_prepend_com_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.11 Insert comment map *NERD_com-insert-comment* -+ -+Adds comment delimiters at the current cursor position and inserts -+between them. -+ -+Works in insert mode. -+ -+Change the mapping with: |NERD_com_in_insert_map|. -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.12 Use alternate delims map *NERD_com-alt-delim* -+ca -+Changes to the alternative commenting style if one is available. For example, -+if the user is editing a c++ file using // comments and they hit ca -+then they will be switched over to /**/ comments. -+keys for this mappings can be overridden with the -+ -+Works in normal mode. -+ -+Change the mapping with: |NERD_alt_com_map| -+ -+Relevant options: -+ -+ -+------------------------------------------------------------------------------ -+2.2.13 Comment aligned maps *NERD_com-aligned-comment* -+cl cr cb -+Same as cc except that the comment delimiters are aligned on the left -+side, right side or both sides respectively. These comments are always nested -+if the line(s) are already commented. -+ -+Works in normal, visual-line. -+ -+Change the mappings with: |NERD_com_align_left_map|, |NERD_com_align_right_map| -+and |NERD_com_align_both_map|. -+ -+Relevant options: -+|NERD_left_align_regexp| -+|NERD_right_align_regexp| -+ -+ -+------------------------------------------------------------------------------ -+2.2.14 Uncomment line map *NERD_com-uncomment-line* -+cu -+Uncomments the current line. If multiple lines are selected in -+visual mode then they are all uncommented. -+ -+When uncommenting, if the line contains multiple sets of delimiters then the -+``outtermost'' pair of delimiters will be removed. -+ -+The script uses a set of heurisics to distinguish ``real'' delimiters from -+``fake'' ones when uncommenting. See |NERD_com-issues| for details. -+ -+Works in normal, visual, visual-line, visual-block. -+ -+Change the mapping with: |NERD_uncom_line_map|. -+ -+Relevant options: -+|NERD_dont_remove_alt_coms| -+|NERD_dont_remove_spaces_regexp| -+ -+ -+------------------------------------------------------------------------------ -+2.3 Supported filetypes *NERD_com-filetypes* -+ -+Files that can be commented by this plugin: -+abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asm -+asn aspvbs atlas automake ave awk basic b bc bdf bib bindzone btm caos catalog -+c cfg cg ch cl clean clipper conf config cpp crontab cs csc csp css cterm cupl -+cvs dcl def diff dns dosbatch dosini dot dracula dsl dtd dtml dylan ecd eiffel -+elf elmfilt erlang eruby eterm expect exports fgl focexec form fortran foxpro -+fvwm fx gdb gdmo gnuplot gtkrc haskell hb h help hercules hog html htmlos ia64 -+icon idlang idl indent inform inittab ishd iss ist jam java javascript jess -+jgraph jproperties jproperties jsp kix kscript lace lex lftp lifelines lilo -+lisp lite lotos lout lprolog lscript lss lua lynx m4 make maple masm master -+matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc named -+nasm nastran natural ncf netrw nqc nsis ocaml omnimark openroad opl ora ox -+pascal pcap pccts perl pfmain php phtml pic pike pilrc pine plm plsql po -+postscr pov povini ppd ppwiz procmail progress prolog psf ptcap python python -+radiance ratpoison r rc readline rebol registry remind rexx robots rpl ruby sa -+samba sas sather scheme scilab screen scsh sdl sed sgml sgmldecl sgmllnx sicad -+simula sinda skill slang sl slrnrc sm smil smith sml snnsnet snnspat snnsres -+snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp strace svn tads -+taglist tags tak tasm tcl terminfo tex texinfo texmf tf tidy tli trasys tsalt -+tsscl tssgm uc uil vb verilog vgrindefs vhdl vim virata vrml vsejcl webmacro -+wget winbatch wml sh wvdial xdefaults xf86conf xhtml xkb xmath xml xmodmap -+xpm2 xpm xslt yacc yaml z8a -+ -+If a language is not in the list of hardcoded supported filetypes then the -+&commentstring vim option is used. -+ -+ -+------------------------------------------------------------------------------ -+2.4 Sexy Comments *NERD_com_sexy_comments* -+These are comments that use one set of multipart comment delimiters as well as -+one other marker symbol. For example: > -+ /* -+ * This is a c style sexy comment -+ * So there! -+ */ -+ -+ /* This is a c style sexy comment -+ * So there! -+ * But this one is ``compact'' style */ -+< -+Here the multipart delimiters are /* and */ and the marker is *. NERD_comments -+is capable of adding and removing comments of this type. -+ -+ -+============================================================================== -+3. Customisation {{{2 *NERD_com-customisation* -+ -+------------------------------------------------------------------------------ -+3.1 Customisation summary *NERD_com-cust-summary* -+ -+|loaded_nerd_comments| Turns off the script. -+|NERD_allow_any_visual_delims_regexp| Allows multipart alternative delims to -+ be used when commenting in -+ visual/visual-block mode. -+|NERD_block_com_after_right| Forces right delims to be placed when -+ doing visual-block comments. -+|NERD_comment_whole_lines_in_v_mode| Changes behaviour of visual comments. -+|NERD_menu_mode| Determines if a NERD comment menu will -+ be made and whether the menu will have a -+ keyboard shortcut. -+|NERD_dont_remove_alt_coms| Causes alternative comments not to be -+ removed when uncommenting. -+|NERD_dont_remove_spaces_regexp| Causes spaces not to be removed when -+ uncommenting if the filetype doesnt -+ match |NERD_space_delim_filetype_regexp| -+|NERD_create_h_filetype| Creates a new filetype for .h files. -+|NERD_lPlace| Specifies what to use as the left -+ delimiter placeholder when nesting -+ comments. -+|NERD_left_align_regexp| Specifies which filetypes to align left -+ delimiters for. -+|NERD_mapleader| Specifies what all the commenting key -+ mappings will begin with. -+|NERD_place_holder_regexp| Specifies which filetypes may use -+ placeholders when nesting comments. -+|NERD_right_align_regexp| Specifies which filetypes to align right -+ delimiters for. -+|NERD_rPlace| Specifies what to use as the right -+ delimiter placeholder when nesting -+ comments. -+|NERD_shut_up| Stops all output from the script. -+|NERD_space_delim_filetype_regexp| Specifies which filetypes to add spaces -+ around the delimiters for. -+|NERD_use_compact_sexy_com_regexp| Specifies which filetypes to use compact -+ sexy comments for. -+|NERD_use_nested_comments_default| Tells the script to use nested comments -+ by default. -+ -+----------------------------------------------------------------------------- -+3.3 Customisation details *NERD_com-cust-details* -+ -+To enable any of the below options you should put the given line in your -+~/.vimrc -+ -+ *loaded_nerd_comments* -+If this script is driving you insane you can turn it off by setting this -+option > -+ let loaded_nerd_comments=1 -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_allow_any_visual_delims_regexp* -+This option is set to a regular expression that is used to specify which -+filetypes this option should be turned on for. If this covers the current -+filetype then, when NERD_comments is doing a visual or visual-block comment -+(but not a visual-line comment) it will choose the right delimiters to use for -+the comment. This normally means using the current delimiters if they are -+multipart or using the alternative delimiters if THEY are multipart and the -+current delims are not. For example if we are editing the following java -+code: > -+ float foo = 1221; -+ float bar = 324; -+ System.out.println(foo * bar); -+< -+If we are using // comments and select the "foo" and "bar" in visual-block -+mode, as shown left below (where '|'s are used to represent the visual-block -+boundary), and comment it then it will use the alternative delims as shown on -+the right: > -+ float |foo| = 1221; float /*foo*/ = 1221; -+ float |bar| = 324; float /*bar*/ = 324; -+ System.out.println(foo * bar); System.out.println(foo * bar); -+< -+By default this option is set to '.*' i.e is turned on for all filetypes. -+ -+----------------------------------------------------------------------------- -+ *NERD_block_com_after_right* -+This option affects commenting when it is done in visual-block mode. If this -+option is turned on, lines that begin outside the right boundary of the -+selection block will be commented. Enable this option with: > -+ let NERD_block_com_after_right=1 -+< -+For example, if you are commenting this chunk of c code in visual-block mode -+(where the '|'s are used to represent the visual-block boundary) > -+ #include -+ #include -+ #include -+ |int| main(){ -+ | | printf("SUCK THIS\n"); -+ | | while(1){ -+ | | fork(); -+ | | } -+ |} | -+< -+If NERD_block_com_after_right=1 then this code will become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ /* */ printf("SUCK THIS\n"); -+ /* */ while(1){ -+ /* */ fork(); -+ /* */ } -+ /*} */ -+< -+Otherwise, the code block would become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ printf("SUCK THIS\n"); -+ while(1){ -+ fork(); -+ } -+ /*} */ -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_comment_whole_lines_in_v_mode* -+This option can take 2 values. By default NERD_comments tries to comment out -+exactly what is selected in visual mode (v). For example if you select and -+comment the following c code (using | to represent the visual boundary): > -+ in|t foo = 3; -+ int bar =| 9; -+ int baz = foo + bar; -+< -+This will result in: > -+ in/*t foo = 3;*/ -+ /*int bar =*/ 9; -+ int baz = foo + bar; -+< -+But some people prefer it if the whole lines are commented like: > -+ /*int foo = 3;*/ -+ /*int bar = 9;*/ -+ int baz = foo + bar; -+< -+If you prefer the second option then stick this line in your .vimrc: > -+ let NERD_comment_whole_lines_in_v_mode=1 -+< -+ -+If the filetype you are editing only has no multipart delimiters (for example -+a shell script) and you hadnt set this option then the above would become > -+ in#t foo = 3; -+ #int bar = 9; -+< -+(where # is the comment delimiter) as this is the closest NERD_comments can -+come to commenting out exactly what was selected. If you prefer for whole -+lines to be commented out when there is no multipart delimiters but the EXACT -+text that was selected to be commented out if there IS multipart delimiters -+then stick the following line in your .vimrc: > -+ let NERD_comment_whole_lines_in_v_mode=2 -+< -+ -+Note that this option does not affect the behaviour of visual-block mode (). -+ -+----------------------------------------------------------------------------- -+ *NERD_dont_remove_alt_coms* -+When uncommenting a line when there is an alternative commenting style for the -+current filetype, this option tells the script not to look for, and remove, -+comments delimiters of the alternative style. > -+ let NERD_dont_remove_alt_coms=1 -+< -+For example, if you are editing a c++ file using // style comments and you go -+cu on this line: > -+ /* This is a c++ comment baby! */ -+< -+It will not be uncommented if the NERD_dont_remove_alt_coms is set to 1. -+ -+----------------------------------------------------------------------------- -+ *NERD_dont_remove_spaces_regexp* -+By default, the NERD commenter will remove spaces around comment delimiters if -+either: -+1. The current filetype matches the |NERD_space_delim_filetype_regexp| option -+ (which is a regular expression). -+2. The current filtype doesnt match NERD_dont_remove_spaces_regexp option -+ (which is also a reg exp) -+ -+This means that if we have the following lines in a c code file: > -+ /* int foo = 5; */ -+ /* int bar = 10; */ -+ int baz = foo + bar -+< -+If either of the above conditions hold then if these lines are uncommented -+they will become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+Otherwise they would become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+If you want the spaces to be removed only if the current filetype matches -+|NERD_space_delim_filetype_regexp| then set the -+NERD_dont_remove_spaces_regexp option in your vimrc so that it matches the -+desired filetypes. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+Defaults to "^python$" -+ -+----------------------------------------------------------------------------- -+ *NERD_create_h_filetype* -+If this option is set then NERD_comments will create a seperate filetype for h -+files. This could be needed because some versions of vim treat h files as cpp -+files which can be dodgy for commenting because if you are using // to comment -+cpp files then this is invalid when you are commenting h files for a c -+project (unless you arent adhering to the ANSI standard... naughty naughty). -+To enable this option, stick the following line in your .vimrc: > -+ let NERD_create_h_filetype = 1 -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_lPlace* -+ *NERD_rPlace* -+These options are used to control the strings used as place-holder delimiters. -+Place holder delimiters are used when performing nested commenting when the -+filetype supports commenting styles with both left and right delimiters. -+To set these options use lines like: > -+ let NERD_lPlace="FOO" -+ let NERD_rPlace="BAR" -+< -+Following the above example, if we have line of c code: > -+ /* int horse */ -+< -+and we comment it with cn it will be changed to: > -+ /*FOO int horse BAR*/ -+< -+When we uncomment this line it will go back to what it was. -+NERD_lPlace defaults to '[>', NERD_rPlace defaults to '<]'. -+ -+----------------------------------------------------------------------------- -+ *NERD_left_align_regexp* -+This option is a regular expression which is used to specify which filetypes -+should have their left delimiters aligned when commenting multiple lines. -+ -+For example, consider this chunk of c code: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 while(foo < 50){ -+ 4 foo = foo + bar; -+ 5 printf("i am just making up this code\n"); -+ 6 printf("i have no idea what im writing\n"); -+ 7 } -+< -+If the NERD_left_align_regexp regexp covers c files then if we select lines -+3-7 in visual mode and hit cc the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /*while(foo < 50){*/ -+ 4 /* foo = foo + bar;*/ -+ 5 /* printf("i am just making up this code\n");*/ -+ 6 /* printf("i have no idea what im writing\n");*/ -+ 7 /*}*/ -+< -+If NERD_left_align_regexp doesnt cover c files then the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /* while(foo < 50){ */ -+ 4 /* foo = foo + bar; */ -+ 5 /* printf("i am just making up this code\n"); */ -+ 6 /* printf("i have no idea what im writing\n"); */ -+ 7 /* } */ -+< -+NERD_left_align_regexp defaults to '^$' meaning no filetypes have their left -+delims aligned. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_mapleader* -+NERD_mapleader is used to specify what all the NERD commenter key mappings -+begin with. -+ -+Assuming that == '\', the default key mappings will look like this: > -+ \cc -+ \cu -+ \ca -+ \ci -+ \cs -+ ... -+< -+However, if this line: > -+ let NERD_mapleader = ',x' -+< -+were present in your vimrc then the default mappings would look like this: > -+ ,xc -+ ,xu -+ ,xa -+ ,xi -+ ,xs -+ ... -+< -+This option only affects the mappings that have not been explicitly set -+manually (see |NERD_com-cust-keys|). -+ -+Default is c. -+ -+----------------------------------------------------------------------------- -+ *NERD_menu_mode* -+This option can take 3 values: -+ "0": Turns the NERD commenter menu off completely. -+ "1": Turns the NERD commenter menu on with no menu shortcut. -+ "2": Turns the NERD commenter menu on with -c as the menu shortcut. -+ -+Default is "2". -+ -+----------------------------------------------------------------------------- -+ *NERD_place_holder_regexp* -+This option is a regular expression which is used to specify which filetypes -+place-holder delimiters should be used for when adding nested comments. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_right_align_regexp* -+This option is a regular expression which is used to specify which filetypes -+should have their right delimiters aligned when commenting multiple lines. -+ -+For example, consider this chunk of c code: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 while(foo < 50){ -+ 4 foo = foo + bar; -+ 5 printf("i am just making up this code\n"); -+ 6 printf("i have no idea what im writing\n"); -+ 7 } -+< -+If the NERD_right_align_regexp regexp covers c files then if we select lines -+3-7 in visual mode and hit cc the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /*while(foo < 50){ */ -+ 4 /*foo = foo + bar; */ -+ 5 /*printf("i am just making up this code\n"); */ -+ 6 /*printf("i have no idea what im writing\n");*/ -+ 7 /*} */ -+< -+If NERD_right_align_regexp doesnt cover c files then the code will become: > -+ 1 int foo = 3; -+ 2 int bar = 5; -+ 3 /* while(foo < 50){ */ -+ 4 /* foo = foo + bar; */ -+ 5 /* printf("i am just making up this code\n"); */ -+ 6 /* printf("i have no idea what im writing\n"); */ -+ 7 /* } */ -+< -+NERD_right_align_regexp defaults to '^$' meaning no filetypes have their right -+delims aligned. -+ -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_shut_up* -+This option is used to prevent NERD_comments from echoing anything. -+Stick this line in your .vimrc: > -+ let NERD_shut_up=1 -+< -+ -+----------------------------------------------------------------------------- -+ *NERD_space_delim_filetype_regexp* -+Some people prefer a space after the left delimiter and before the right -+delimiter like this: > -+ /* int foo=2; */ -+< -+as opposed to this: > -+ /*int foo=2;*/ -+< -+This option is a regular expression that is used to specify which filetypes -+NERD_comments should use spaces for (as in the first eg above). -+NERD_space_delim_filetype_regexp defaults to '^$'. -+ -+See also |NERD_dont_remove_spaces_regexp|. -+See |NERD_com-reg-exps| for example reg exps. -+ -+----------------------------------------------------------------------------- -+ *NERD_use_compact_sexy_com_regexp* -+Some people may want their sexy comments to be like this: > -+ /* Hi There! -+ * This is a sexy comment -+ * in c */ -+< -+As opposed to like this: > -+ /* -+ * Hi There! -+ * This is a sexy comment -+ * in c -+ */ -+< -+The option NERD_use_compact_sexy_com_regexp is a regular expression. If the -+filetype that the user is commenting matches this regular expression then when -+they do sexy comments they will look like the first comment above. -+ -+----------------------------------------------------------------------------- -+ *NERD_use_nested_comments_default* -+When this option is turned on comments are nested automatically. That is, if -+you hit cc on a line that is already commented, or contains comments, -+it will be commented again. > -+ let NERD_use_nested_comments_default=1 -+< -+ -+----------------------------------------------------------------------------- -+3.3 Default delimiter customisation *NERD_com-cust-delims* -+These options are used to tell NERD_comments which delimiters to use for a -+given filetype when it first loads up. To set one of these options just stick -+the corresponding line in your .vimrc. For example: if i want to use /* */ to -+delimit comments in java files instead of // (which is the default) then I -+would stick this line in my .vimrc: > -+ let NERD_use_c_style_java_comments=1 -+< -+ -+Note that if filetype has two commenting styles, which are both supported, you -+can switch between them with ca. See |NERD_com-alt-delim|. These -+options only change which style is used when the script is initialsed. -+ -+NERD_use_ada_with_spaces: use -- instead of -- for ada files. -+NERD_use_c_style_acedb_comments: use /**/ instead of // for acedb files. -+NERD_use_c_style_ch_comments: use /**/ instead of // for ch files. -+NERD_use_c_style_clean_comments: use /**/ instead of // for clean files. -+NERD_use_c_style_clipper_comments: use /**/ instead of // for clipper files. -+NERD_use_c_style_cpp_comments: use /**/ instead of // for c++ files. -+NERD_use_c_style_cs_comments: use /**/ instead of // for c# files. -+NERD_use_c_style_dot_comments: use /**/ instead of // for dot files. -+NERD_use_c_style_dylan_comments: use /**/ instead of // for dylan files. -+NERD_use_c_style_h_comments: use /**/ instead of // for h files. -+NERD_use_c_style_hercules_comments: use /**/ instead of // for hercules files. -+NERD_use_c_style_idl_comments: use /**/ instead of // for idl files. -+NERD_use_c_style_ishd_comments: use /**/ instead of // for ishd files. -+NERD_use_c_style_java_comments: use /**/ instead of // for java files. -+NERD_use_c_style_javascript_comments: use /**/ instead of // for javascript files. -+NERD_use_c_style_kscript_comments: use /**/ instead of // for kscript files. -+NERD_use_c_style_mel_comments: use /**/ instead of // for mel files. -+NERD_use_c_style_named_comments: use /**/ instead of // for named files. -+NERD_use_c_style_pccts_comments: use /**/ instead of // for pccts files. -+NERD_use_c_style_php_comments: use /* */ instead of // for php files. -+NERD_use_c_style_pike_comments: use /**/ instead of // for pike files. -+NERD_use_c_style_pilrc_comments: use /**/ instead of // for pilrc files. -+NERD_use_c_style_plm_comments: use /**/ instead of // for plm files. -+NERD_use_c_style_pov_comments: use /**/ instead of // for pov files. -+NERD_use_c_style_prolog_comments: use /**/ instead of % for prolog files. -+NERD_use_c_style_rc_comments: use /**/ instead of // for rc files. -+NERD_use_c_style_tads_comments: use /**/ instead of // for tads files. -+NERD_use_c_style_tsalt_comments: use /**/ instead of // for tsalt files. -+NERD_use_c_style_uc_comments: use /**/ instead of // for uc files. -+NERD_use_c_style_verilog_comments: use /**/ instead of // for verilog files. -+NERD_use_dash_dash_simula_comments: use -- instead of % for simula files. -+NERD_use_dnl_style_automake_comments: use dnl instead of # for automake files. -+NERD_use_hash_samba_comments: use # instead of ; for samba files. -+NERD_use_long_haskell_comments: use {--} instead of -- for haskell files. -+NERD_use_long_lisp_comments: use #||# instead of ; for lisp files. -+NERD_use_long_lua_comments: use --[[]] instead of -- for lua files. -+NERD_use_paren_star_pascal_comments: use (**) instead of {} for pascal files. -+NERD_use_REM_basic_comments: use REM instead of ' for basic files. -+NERD_use_single_part_c_comments: use // instead of /* */ for c files. -+ -+ -+----------------------------------------------------------------------------- -+3.4 Key mapping customisation *NERD_com-cust-keys* -+ -+These options are used to override the default keys that are used for the -+commenting mappings. Their values must be set to strings. As an example: if -+you wanted to use the mapping foo to uncomment lines of code then -+you would place this line in your vimrc > -+ let NERD_uncom_line_map="foo" -+< -+ -+Check out |NERD_com-functionality| for details about what the following -+mappings do. -+ -+ *NERD_alt_com_map* -+To override the ca mapping, set this option > -+ let NERD_alt_com_map="" -+< -+ *NERD_append_com_map* -+To override the ce mapping, set this option > -+ let NERD_append_com_map="" -+< -+ *NERD_com_align_left_map* -+To override the cl mapping, set this option > -+ let NERD_com_align_left_map="" -+< -+ *NERD_com_align_both_map* -+To override the cb mapping, set this option > -+ let NERD_com_align_both_map="" -+< -+ *NERD_com_align_right_map* -+To override the cr mapping, set this option > -+ let NERD_com_align_right_map="" -+< -+ *NERD_com_in_insert_map* -+To override the mapping, set this option > -+ let NERD_com_in_insert_map="" -+< -+ *NERD_com_line_invert_map* -+To override the ci mapping, set this option > -+ let NERD_com_line_invert_map="" -+< -+ *NERD_com_line_map* -+To override the cc mapping, set this option > -+ let NERD_com_line_map="" -+< -+ *NERD_com_line_nest_map* -+To override the cn mapping, set this option > -+ let NERD_com_line_nest_map="" -+< -+ *NERD_com_line_sexy_map* -+To override the cs mapping, set this option > -+ let NERD_com_line_sexy_map="" -+< -+ *NERD_com_line_toggle_map* -+To override the c mapping, set this option > -+ let NERD_com_line_toggle_map="" -+< -+ *NERD_com_line_minimal_map* -+To override the cm mapping, set this option > -+ let NERD_com_line_minimal_map="" -+< -+ *NERD_com_to_end_of_line_map* -+To override the c$ mapping, set this option > -+ let NERD_com_to_end_of_line_map="" -+< -+ *NERD_com_line_yank_map* -+To override the cy mapping, set this option > -+ let NERD_com_line_yank_map="" -+< -+ *NERD_uncom_line_map* -+To override the cu mapping, set this option > -+ let NERD_uncom_line_map="" -+< -+ -+------------------------------------------------------------------------------ -+3.5 Sample regular expressions *NERD_com-reg-exps* -+ -+Many of the options in the NERD commenter must be set to regular -+expressions... regular expressions can be a bit confusing so i have provided -+some template ones here that you can start from: -+ -+Regexp1: '.*' -+Matches any filetype. This is useful for turning an option on for all files. -+ -+Regexp2: '^$' -+Matches no filetypes. This is useful for turning an option off for all files. -+ -+Regexp3: '^\(java\)$' -+Matches only the java filetype. -+ -+Regexp4: '^\(c\|vim\)$' -+Matches only c and vim filetypes. -+ -+Regexp5: '^\(c.*\|vim\)$' -+Matches filetypes beginning with c (eg c, cpp, cs, etc) as well -+as vim files. -+ -+Regexp6: '^\(c.*\|java\|tex\)$' -+Matches filetypes beginning with c (eg c, cpp, cs, etc) as well as java and -+tex filetypes. -+ -+Regexp7: '^\(python\)\@!' -+Matches anything other than 'python'. -+ -+Regexp8: '^c\(s\)\@!' -+Matches 'c' followed by anything accept an 's'. -+ -+Regexp9: '^\(foo$\|bar$\|baz$\)\@!' -+Matches any strings except 'foo', 'bar' and 'baz'. -+ -+============================================================================== -+4. Issues with the script{{{2 *NERD_com-issues* -+ -+ -+------------------------------------------------------------------------------ -+4.1 Delimiter detection heuristics *NERD_com-heuristics* -+ -+Heuristics are used to distinguish the real comment delimiters -+ -+Because we have comment mappings that place delimiters in the middle of lines, -+removing comment delimiters is a bit tricky. This is because if comment -+delimiters appear in a line doesnt mean they really ARE delimiters. For -+example, Java uses // comments but the line > -+ System.out.println("//"); -+< -+clearly contains no real comment delimiters. -+ -+To distinguish between ``real'' comment delimiters and ``fake'' ones we use a -+set of heuristics. For example, one such heuristic states that any comment -+delimiter that has an odd number of non-escaped " characters both preceding -+and following it on the line is not a comment because it is probably part of a -+string. These heuristics, while usually pretty accurate, will not work for all -+cases. -+ -+------------------------------------------------------------------------------ -+4.2 Nesting issues *NERD_com-nesting* -+ -+If we have some line of code like this: > -+ /*int foo */ = /*5 + 9;*/ -+< -+This will not be uncommented legally. The NERD commenter will remove the -+"outter most" delimiters so the line will become: > -+ int foo */ = /*5 + 9; -+< -+which almost certainly will not be what you want. Nested sets of comments will -+uncomment fine though. Eg: > -+ /*int/* foo =*/ 5 + 9;*/ -+< -+will become: > -+ int/* foo =*/ 5 + 9; -+< -+(Note that in the above examples I have deliberately not used place holders -+for simplicity) -+ -+------------------------------------------------------------------------------ -+4.3 Mark clobbering *NERD_com-mark-clobbering* -+ -+The script clobbers the s and t marks when doing most comments. Im not sure -+how to save and restore the marks yet. -+ -+ -+ -+============================================================================== -+5. TODO list {{{2 *NERD_com-todo* -+ -+Uncommenting of minimal comments needs to be more robust. Currently it is easy -+to get illegal syntax when uncommenting them. -+ -+ -+ -+============================================================================== -+6. Credits {{{2 *NERD_com-credits* -+ -+Thanks and respect to the following people: -+ -+Thanks to Nick Brettell for his many ideas and criticisms. A bloody good -+bastard. -+:normal :.-2s/good// -+ -+Thanks to Matthew Hawkins for his awesome refactoring! -+ -+Thanks to the authors of the vimspell whose documentation -+installation function I stole :) -+ -+Thanks to Greg Searle for the idea of using place-holders for nested comments. -+ -+Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! -+Also, thanks for the idea of doing sexy comments as well as his suggestions -+relating to it :P -+Thanks again to Nguyen for complaining about the NERD_comments menu mapping -+(-c) interfering with another mapping of his... and thus the -+NERD_dont_create_menu_shortcut option was born :P -+(it was then replaced with NERD_menu_mode in version 1.67 :) -+ -+Thanks to Sam R for pointing out some filetypes that NERD_comments could support! -+ -+Cheers to Litchi for the idea of having a mapping that appends a comment to -+the current line :) -+ -+Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some -+problems with commenting in visual mode. Thanks again to Jorge for his -+continued suggestions on this matter :) -+ -+Thanks to Martin Stubenschrott for pointing out a bug with the mapping -+:) Ive gotta stop breaking this mapping! -+ -+Thanks to Markus Erlmann for pointing out a conflict that this script was -+having with the taglist plugin. -+ -+Thanks to Brent Rice for alerting me about, and helping me track down, a bug -+in the script when the "ignorecase" option in vim was set. -+ -+Thanks to Richard Willis for telling me about how line continuation was -+causing problems on cygwin. Also, thanks pointing out a bug in the help file -+and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI -+have mercy on your soul :) -+ -+Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". -+Also, thanks for his suggested improvements about toggle comments after i -+implemented them. -+ -+Thanks to harry for telling me that i broke the cn mapping in 1.53 :), -+and thanks again for telling me about a bug that occurred when editing a file -+in a new tab. -+ -+Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc -+install function and added support for ada comments with spaces as well as -+making a couple of other small changes. -+ -+Thanks to David Bourgeois for pointing out a bug with when commenting c files -+:)... [a few days later] ok i completely misunderstood what David was talking -+about and ended up fixing a completely different bug to what he was talking -+about :P -+ -+Thanks to David Bourgeois for pointing out a bug when changing buffers. -+ -+Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that -+was causing spaces to be added to the end of lines with single-part -+delimiters. It's nice when people do my work for me :D -+ -+Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting -+sexy comments. Sexy comments dont look so sexy when they are only half removed -+:P -+ -+Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping -+the NERD_space_delim_filetype_regexp option from working with left aligned -+toggle comments. And for pointing out a bug when initialising VB comments. -+ -+Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". -+And for suggested improvements to minimal comments. -+ -+Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. -+In 1.65 -+ -+Thanks to Jonathan Derque for alerting me to some filetypes that could be -+supported (Namely: context, plaintext and mail). -+ -+Thanks to Joseph Barker for the sugesting that the menu be an optional -+feature. -+ -+Thanks to Gary Church and Tim Carey-Smith for complaining about the -+keymappings and causing me to introduce the NERD_mapleader option :) -+ -+ -+Cheers to myself for being the best looking man on Earth! -+ -+ -+ vim:tw=78:ts=8:ft=help:norl: diff -urN vim71/runtime/ftplugin/ada.vim vim71_ada/runtime/ftplugin/ada.vim --- vim71/runtime/ftplugin/ada.vim 2007-05-05 19:17:45.000000000 +0200 +++ vim71_ada/runtime/ftplugin/ada.vim 2008-01-16 16:37:03.000000000 +0100 @@ -36659,21 +877,21 @@ diff -urN vim71/runtime/ftplugin/ada.vim vim71_ada/runtime/ftplugin/ada.vim "------------------------------------------------------------------------------ " Description: Perform Ada specific completion & tagging. " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ -" Maintainer: Martin Krischik -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +" Maintainer: Martin Krischik +" Taylor Venable " Neil Bird -" $Author: karsten $ --" $Date: 2008/01/16 15:58:14 $ +-" $Date: 2008/01/18 13:52:03 $ -" Version: 4.2 --" $Revision: 1.1 $ +-" $Revision: 1.2 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ +" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ ++" $Date: 2008/01/18 13:52:03 $ +" Version: 4.5 -+" $Revision: 1.1 $ ++" $Revision: 1.2 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ " History: 24.05.2006 MK Unified Headers " 26.05.2006 MK ' should not be in iskeyword. @@ -36720,22 +938,22 @@ diff -urN vim71/runtime/indent/ada.vim vim71_ada/runtime/indent/ada.vim "------------------------------------------------------------------------------ " Description: Vim Ada indent file " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik -" Maintainer: Martin Krischik +" Maintainer: Martin Krischik " Neil Bird -" $Author: karsten $ --" $Date: 2008/01/16 15:58:14 $ +-" $Date: 2008/01/18 13:52:03 $ -" Version: 4.2 --" $Revision: 1.1 $ +-" $Revision: 1.2 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ +" Ned Okie +" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ ++" $Date: 2008/01/18 13:52:03 $ +" Version: 4.5 -+" $Revision: 1.1 $ ++" $Revision: 1.2 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ " History: 24.05.2006 MK Unified Headers " 16.07.2006 MK Ada-Mode as vim-ball @@ -36820,13 +1038,13 @@ diff -urN vim71/runtime/macros/svnignore.btm vim71_ada/runtime/macros/svnignore. +::!C:\Bin\4Portable\App\4\4nt.EXE +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Description: Works like "tail -f" . -+:: $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++:: $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +:: Maintainer: Martin Krischik +:: Jason Heddings (vim at heddway dot com) +:: $Author: karsten $ -+:: $Date: 2008/01/16 15:58:14 $ ++:: $Date: 2008/01/18 13:52:03 $ +:: Version: 3.0 -+:: $Revision: 1.1 $ ++:: $Revision: 1.2 $ +:: $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.btm $ +:: History: 17.11.2007 Edit svn:ignore data +:: Help Page: tail.txt @@ -36851,13 +1069,13 @@ diff -urN vim71/runtime/macros/svnignore.zsh vim71_ada/runtime/macros/svnignore. +#!/bin/zsh +#------------------------------------------------------------------------------ +# Description: Works like "tail -f" . -+# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++# $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +# Maintainer: Martin Krischik +# Jason Heddings (vim at heddway dot com) +# $Author: karsten $ -+# $Date: 2008/01/16 15:58:14 $ ++# $Date: 2008/01/18 13:52:03 $ +# Version: 3.0 -+# $Revision: 1.1 $ ++# $Revision: 1.2 $ +# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.zsh $ +# History: 17.11.2007 Edit svn:ignore data +# Help Page: tail.txt @@ -36885,12 +1103,12 @@ diff -urN vim71/runtime/macros/vim.bash vim71_ada/runtime/macros/vim.bash +########################################################### {{{1 ########### +# Description: Set alias names for a custom installed vim/ctags. +# Language: Bash Shell Script -+# $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ ++# $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +# Maintainer: Martin Krischik +# $Author: karsten $ -+# $Date: 2008/01/16 15:58:14 $ ++# $Date: 2008/01/18 13:52:03 $ +# Version: 3.6 -+# $Revision: 1.1 $ ++# $Revision: 1.2 $ +# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/vim.bash $ +# History: 26.07.2006 MK pretty new +# Usage: copy to /etc/profile.d and make world executable @@ -37911,4563 +2129,6 @@ diff -urN vim71/runtime/plugin/matchit.vim vim71_ada/runtime/plugin/matchit.vim +let &cpo = s:save_cpo + +" vim:sts=2:sw=2: -diff -urN vim71/runtime/plugin/NERD_commenter.vim vim71_ada/runtime/plugin/NERD_commenter.vim ---- vim71/runtime/plugin/NERD_commenter.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/runtime/plugin/NERD_commenter.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,4553 @@ -+" vim global plugin that provides easy code commenting for various file types -+" Last Change: 29 sep 2007 -+" Maintainer: Martin Grenfell -+let s:NERD_commenter_version = 2.1.4 -+ -+" For help documentation type :help NERDCommenter. If this fails, Restart vim -+" and try again. If it sill doesnt work... the help page is at the bottom -+" of this file. -+ -+" Section: script init stuff {{{1 -+if exists("loaded_nerd_comments") -+ finish -+endif -+if v:version < 700 -+ echoerr "NERDCommenter: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!" -+ finish -+endif -+let loaded_nerd_comments = 1 -+ -+" Section: spaces init {{{2 -+" Occasionally we need to grab a string of spaces so just make one here -+let s:spaces = "" -+while strlen(s:spaces) < 100 -+ let s:spaces = s:spaces . " " -+endwhile -+ -+" Function: s:InitVariable() function {{{2 -+" This function is used to initialise a given variable to a given value. The -+" variable is only initialised if it does not exist prior -+" -+" Args: -+" -var: the name of the var to be initialised -+" -value: the value to initialise var to -+" -+" Returns: -+" 1 if the var is set, 0 otherwise -+function s:InitVariable(var, value) -+ if !exists(a:var) -+ exec 'let ' . a:var . ' = ' . "'" . a:value . "'" -+ return 1 -+ endif -+ return 0 -+endfunction -+ -+" Section: space string init{{{2 -+" When putting spaces after the left delim and before the right we use -+" s:spaceStr for the space char. This way we can make it add anything after -+" the left and before the right by modifying this variable -+let s:spaceStr = ' ' -+let s:lenSpaceStr = strlen(s:spaceStr) -+ -+" Section: variable init calls {{{2 -+call s:InitVariable("g:NERDAllowAnyVisualDelims", 1) -+call s:InitVariable("g:NERDBlockComIgnoreEmpty", 0) -+call s:InitVariable("g:NERDCommentWholeLinesInVMode", 0) -+call s:InitVariable("g:NERDCompactSexyComs", 0) -+call s:InitVariable("g:NERDDefaultNesting", 0) -+call s:InitVariable("g:NERDMenuMode", 3) -+call s:InitVariable("g:NERDLPlace", "[>") -+call s:InitVariable("g:NERDUsePlaceHolders", 1) -+call s:InitVariable("g:NERDRemoveAltComs", 1) -+call s:InitVariable("g:NERDRemoveExtraSpaces", 0) -+call s:InitVariable("g:NERDRPlace", "<]") -+call s:InitVariable("g:NERDShutUp", '0') -+call s:InitVariable("g:NERDSpaceDelims", 0) -+call s:InitVariable("g:NERDDelimiterRequests", 1) -+ -+call s:InitVariable("g:NERDMapleader", ',c') -+ -+call s:InitVariable("g:NERDAltComMap", g:NERDMapleader . 'a') -+call s:InitVariable("g:NERDAppendComMap", g:NERDMapleader . 'A') -+call s:InitVariable("g:NERDComAlignBothMap", g:NERDMapleader . 'b') -+call s:InitVariable("g:NERDComAlignLeftMap", g:NERDMapleader . 'l') -+call s:InitVariable("g:NERDComAlignRightMap", g:NERDMapleader . 'r') -+call s:InitVariable("g:NERDComInInsertMap", '') -+call s:InitVariable("g:NERDComLineInvertMap", g:NERDMapleader . 'i') -+call s:InitVariable("g:NERDComLineMap", g:NERDMapleader . 'c') -+call s:InitVariable("g:NERDComLineNestMap", g:NERDMapleader . 'n') -+call s:InitVariable("g:NERDComLineSexyMap", g:NERDMapleader . 's') -+call s:InitVariable("g:NERDComLineToggleMap", g:NERDMapleader . '') -+call s:InitVariable("g:NERDComLineMinimalMap", g:NERDMapleader . 'm') -+call s:InitVariable("g:NERDComLineYankMap", g:NERDMapleader . 'y') -+call s:InitVariable("g:NERDComToEOLMap", g:NERDMapleader . '$') -+call s:InitVariable("g:NERDPrependComMap", g:NERDMapleader . 'I') -+call s:InitVariable("g:NERDUncomLineMap", g:NERDMapleader . 'u') -+let s:NERDFileNameEscape="[]#*$%'\" ?`!&();<>\\" -+ -+" Section: Comment mapping functions, autocommands and commands {{{1 -+" ============================================================================ -+" Section: Comment enabler autocommands {{{2 -+" ============================================================================ -+ -+if !exists("nerd_autocmds_loaded") -+ let nerd_autocmds_loaded=1 -+ -+ augroup commentEnablers -+ -+ "if the user enters a buffer or reads a buffer then we gotta set up -+ "the comment delimiters for that new filetype -+ autocmd BufEnter,BufRead * :call s:SetUpForNewFiletype(&filetype, 0) -+ -+ "if the filetype of a buffer changes, force the script to reset the -+ "delims for the buffer -+ autocmd Filetype * :call s:SetUpForNewFiletype(&filetype, 1) -+ augroup END -+ -+endif -+ -+ -+" Function: s:SetUpForNewFiletype(filetype) function {{{2 -+" This function is responsible for setting up buffer scoped variables for the -+" given filetype. -+" -+" These variables include the comment delimiters for the given filetype and calls -+" MapDelimiters or MapDelimitersWithAlternative passing in these delimiters. -+" -+" Args: -+" -filetype: the filetype to set delimiters for -+" -forceReset: 1 if the delimiters should be reset if they have already be -+" set for this buffer. -+" -+function s:SetUpForNewFiletype(filetype, forceReset) -+ "if we have already set the delimiters for this buffer then dont go thru -+ "it again -+ if !a:forceReset && exists("b:left") && b:left != '' -+ return -+ endif -+ -+ let b:sexyComMarker = '' -+ -+ "check the filetype against all known filetypes to see if we have -+ "hardcoded the comment delimiters to use -+ if a:filetype == "" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "abaqus" -+ call s:MapDelimiters('**', '') -+ elseif a:filetype == "abc" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "acedb" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "ada" -+ call s:MapDelimitersWithAlternative('--','', '-- ', '') -+ elseif a:filetype == "ahdl" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "ahk" -+ call s:MapDelimitersWithAlternative(';', '', '/*', '*/') -+ elseif a:filetype == "amiga" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "aml" -+ call s:MapDelimiters('/*', '') -+ elseif a:filetype == "ampl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ant" -+ call s:MapDelimiters('') -+ elseif a:filetype == "apache" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "apachestyle" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "asm68k" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "asm" -+ call s:MapDelimitersWithAlternative(';', '', '#', '') -+ elseif a:filetype == "asn" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "aspvbs" -+ call s:MapDelimiters('''', '') -+ elseif a:filetype == "atlas" -+ call s:MapDelimiters('C','$') -+ elseif a:filetype == "autohotkey" -+ call s:MapDelimiters(';','') -+ elseif a:filetype == "autoit" -+ call s:MapDelimiters(';','') -+ elseif a:filetype == "automake" -+ call s:MapDelimitersWithAlternative('#','', 'dnl ', '') -+ elseif a:filetype == "ave" -+ call s:MapDelimiters("'",'') -+ elseif a:filetype == "awk" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "basic" -+ call s:MapDelimitersWithAlternative("'",'', 'REM ', '') -+ elseif a:filetype == "b" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "bc" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "bdf" -+ call s:MapDelimiters('COMMENT ', '') -+ elseif a:filetype == "bib" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "bindzone" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "bst" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "btm" -+ call s:MapDelimiters('::', '') -+ elseif a:filetype == "caos" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "catalog" -+ call s:MapDelimiters('--','--') -+ elseif a:filetype == "c" -+ call s:MapDelimitersWithAlternative('/*','*/', '//', '') -+ elseif a:filetype == "cfg" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "cg" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "ch" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "changelog" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "cl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "clean" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "clipper" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "cmake" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "conf" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "config" -+ call s:MapDelimiters('dnl ', '') -+ elseif a:filetype == "context" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "cpp" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "crontab" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "cs" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "csc" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "csp" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "css" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "cterm" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "cupl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "csv" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "cvs" -+ call s:MapDelimiters('CVS:','') -+ elseif a:filetype == "dcl" -+ call s:MapDelimiters('$!', '') -+ elseif a:filetype == "debchangelog" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "debcontrol" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "debsources" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "def" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "desktop" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "diff" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "django" -+ call s:MapDelimitersWithAlternative('', '{#', '#}') -+ elseif a:filetype == "docbk" -+ call s:MapDelimiters('') -+ elseif a:filetype == "dns" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dosbatch" -+ call s:MapDelimiters('REM ','') -+ elseif a:filetype == "dosini" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dot" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "dracula" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dsl" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "dtd" -+ call s:MapDelimiters('') -+ elseif a:filetype == "dtml" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "dylan" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == 'ebuild' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ecd" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == 'eclass' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "eiffel" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "elf" -+ call s:MapDelimiters("'", '') -+ elseif a:filetype == "elmfilt" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "erlang" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "eruby" -+ call s:MapDelimitersWithAlternative('', '<%#', '%>') -+ elseif a:filetype == "eterm" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "expect" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "exports" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fetchmail" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fgl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "focexec" -+ call s:MapDelimiters('-*', '') -+ elseif a:filetype == "form" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "fortran" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "foxpro" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "fstab" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fvwm" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "fx" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "gams" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "gdb" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "gdmo" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "geek" -+ call s:MapDelimiters('GEEK_COMMENT:', '') -+ elseif a:filetype == 'gentoo-package-keywords' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == 'gentoo-package-mask' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == 'gentoo-package-use' -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "gnuplot" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "groovy" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "gtkrc" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "haskell" -+ call s:MapDelimitersWithAlternative('--','', '{-', '-}') -+ elseif a:filetype == "hb" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "h" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "help" -+ call s:MapDelimiters('"','') -+ elseif a:filetype == "hercules" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "hog" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "html" -+ call s:MapDelimitersWithAlternative('', '//', '') -+ elseif a:filetype == "htmldjango" -+ call s:MapDelimitersWithAlternative('', '{#', '#}') -+ elseif a:filetype == "htmlos" -+ call s:MapDelimiters('#','/#') -+ elseif a:filetype == "ia64" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "icon" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "idlang" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "idl" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "indent" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "inform" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "inittab" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ishd" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "iss" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "ist" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "jam" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "java" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "javascript" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "jess" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "jgraph" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "jproperties" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "jsp" -+ call s:MapDelimiters('<%--', '--%>') -+ elseif a:filetype == "kconfig" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "kix" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "kscript" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "lace" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "ldif" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lex" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "lftp" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lifelines" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "lilo" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lisp" -+ call s:MapDelimitersWithAlternative(';','', '#|', '|#') -+ elseif a:filetype == "lite" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "lookupfile" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "lotos" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "lout" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lprolog" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "lscript" -+ call s:MapDelimiters("'", '') -+ elseif a:filetype == "lss" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "lua" -+ call s:MapDelimitersWithAlternative('--','', '--[[', ']]') -+ elseif a:filetype == "lynx" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "m4" -+ call s:MapDelimiters('dnl ', '') -+ elseif a:filetype == "mail" -+ call s:MapDelimiters('> ','') -+ elseif a:filetype == "make" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "maple" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "masm" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "master" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "matlab" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "mel" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "mf" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "mib" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "mma" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "model" -+ call s:MapDelimiters('$','$') -+ elseif a:filetype =~ "moduala." -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "modula2" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "modula3" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "monk" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "mush" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "muttrc" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "named" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "nasm" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "nastran" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "natural" -+ call s:MapDelimiters('/*', '') -+ elseif a:filetype == "ncf" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "netdict" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "netrw" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "nqc" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "nroff" -+ call s:MapDelimiters('\"', '') -+ elseif a:filetype == "nsis" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "objc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "ocaml" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "occam" -+ call s:MapDelimiters('--','') -+ elseif a:filetype == "omlet" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "omnimark" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "openroad" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "opl" -+ call s:MapDelimiters("REM", "") -+ elseif a:filetype == "ora" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "otl" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "ox" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "pascal" -+ call s:MapDelimitersWithAlternative('{','}', '(*', '*)') -+ elseif a:filetype == "passwd" -+ call s:MapDelimitersWith('','') -+ elseif a:filetype == "pcap" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "pccts" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "perl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "pfmain" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "php" -+ call s:MapDelimitersWithAlternative('//','','/*', '*/') -+ elseif a:filetype == "phtml" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "pic" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "pike" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "pilrc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "pine" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "plaintex" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "plm" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "plsql" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "po" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "postscr" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "pov" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "povini" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "ppd" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "ppwiz" -+ call s:MapDelimiters(';;', '') -+ elseif a:filetype == "procmail" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "progress" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "prolog" -+ call s:MapDelimitersWithAlternative('%','','/*','*/') -+ elseif a:filetype == "psf" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "ptcap" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "python" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "qf" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "radiance" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "Rails-log" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "ratpoison" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "r" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "readline" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rebol" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "registry" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "remind" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rexx" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "robots" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "rpl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "rst" -+ call s:MapDelimiters('..', '') -+ elseif a:filetype == "rtf" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "ruby" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "sa" -+ call s:MapDelimiters('--','') -+ elseif a:filetype == "samba" -+ call s:MapDelimitersWithAlternative(';','', '#', '') -+ elseif a:filetype == "sas" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "sass" -+ call s:MapDelimitersWithAlternative('//','', '/*', '') -+ elseif a:filetype == "sather" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "scheme" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "scilab" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "screen" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "scsh" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "sdl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "sed" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "selectbuf" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "sgml" -+ call s:MapDelimiters('') -+ elseif a:filetype == "sgmldecl" -+ call s:MapDelimiters('--','--') -+ elseif a:filetype == "sgmllnx" -+ call s:MapDelimiters('') -+ elseif a:filetype == "sicad" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "simula" -+ call s:MapDelimitersWithAlternative('%', '', '--', '') -+ elseif a:filetype == "sinda" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "skill" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "slang" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "sl" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "slrnrc" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "sm" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "smarty" -+ call s:MapDelimiters('{*', '*}') -+ elseif a:filetype == "smil" -+ call s:MapDelimiters('') -+ elseif a:filetype == "smith" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "sml" -+ call s:MapDelimiters('(*','*)') -+ elseif a:filetype == "snnsnet" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "snnspat" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "snnsres" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "snobol4" -+ call s:MapDelimiters('*', '') -+ elseif a:filetype == "spec" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "specman" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "spice" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "sql" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "sqlforms" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "sqlj" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "sqr" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "squid" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "st" -+ call s:MapDelimiters('"','') -+ elseif a:filetype == "stp" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "strace" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "svn" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "SVNcommitlog" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "systemverilog" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "tads" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "taglist" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "tags" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "tak" -+ call s:MapDelimiters('$', '') -+ elseif a:filetype == "tasm" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "tcl" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "terminfo" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "tex" -+ call s:MapDelimiters('%','') -+ elseif a:filetype == "text" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "texinfo" -+ call s:MapDelimiters("@c ", "") -+ elseif a:filetype == "texmf" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "tf" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "tidy" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "tli" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "trasys" -+ call s:MapDelimiters("$", "") -+ elseif a:filetype == "tsalt" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "tsscl" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "tssgm" -+ call s:MapDelimiters("comment = '","'") -+ elseif a:filetype == "uc" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "uil" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "vb" -+ call s:MapDelimiters("'","") -+ elseif a:filetype == "vcscommit" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "vera" -+ call s:MapDelimitersWithAlternative('/*','*/','//','') -+ elseif a:filetype == "verilog" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "verilog_systemverilog" -+ call s:MapDelimitersWithAlternative('//','', '/*','*/') -+ elseif a:filetype == "vgrindefs" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "vhdl" -+ call s:MapDelimiters('--', '') -+ elseif a:filetype == "vim" -+ call s:MapDelimiters('"','') -+ elseif a:filetype == "viminfo" -+ call s:MapDelimiters('','') -+ elseif a:filetype == "virata" -+ call s:MapDelimiters('%', '') -+ elseif a:filetype == "vo_base" -+ call s:MapDelimiters('', '') -+ elseif a:filetype == "vrml" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "vsejcl" -+ call s:MapDelimiters('/*', '') -+ elseif a:filetype == "webmacro" -+ call s:MapDelimiters('##', '') -+ elseif a:filetype == "wget" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "winbatch" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "wml" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype =~ "[^w]*sh" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "wvdial" -+ call s:MapDelimiters(';', '') -+ elseif a:filetype == "xdefaults" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "xf86conf" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "xhtml" -+ call s:MapDelimiters('') -+ elseif a:filetype == "xkb" -+ call s:MapDelimiters('//', '') -+ elseif a:filetype == "xmath" -+ call s:MapDelimiters('#', '') -+ elseif a:filetype == "xml" -+ call s:MapDelimiters('') -+ elseif a:filetype == "xmodmap" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "xpm2" -+ call s:MapDelimiters('!', '') -+ elseif a:filetype == "xpm" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "xsd" -+ call s:MapDelimiters('') -+ elseif a:filetype == "xslt" -+ call s:MapDelimiters('') -+ elseif a:filetype == "yacc" -+ call s:MapDelimiters('/*','*/') -+ elseif a:filetype == "yaml" -+ call s:MapDelimiters('#','') -+ elseif a:filetype == "z8a" -+ call s:MapDelimiters(';', '') -+ -+ elseif a:filetype == "" -+ call s:MapDelimitersWithAlternative("","", "", "") -+ -+ "we have not hardcoded the comment delimiters to use for this filetype so -+ "get them from &commentstring. -+ else -+ "print a disclaimer to the user :) -+ if !g:NERDShutUp -+ call s:NerdEcho("Unknown filetype '".a:filetype."', setting delimiters by &commentstring.\nPleeeeease email the author of the NERD commenter with this filetype\nand its delimiters!", 0) -+ endif -+ -+ "extract the delims from &commentstring -+ let left= substitute(&commentstring, '\(.*\)%s.*', '\1', '') -+ let right= substitute(&commentstring, '.*%s\(.*\)', '\1', 'g') -+ -+ call s:MapDelimiters(left,right) -+ endif -+endfunction -+ -+" Function: s:MapDelimiters(left, right) function {{{2 -+" This function is a wrapper for s:MapDelimiters(left, right, leftAlt, rightAlt, useAlt) and is called when there -+" is no alternative comment delimiters for the current filetype -+" -+" Args: -+" -left: the left comment delimiter -+" -right: the right comment delimiter -+function s:MapDelimiters(left, right) -+ call s:MapDelimitersWithAlternative(a:left, a:right, "", "") -+endfunction -+ -+" Function: s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) function {{{2 -+" this function sets up the comment delimiter buffer variables -+" -+" Args: -+" -left: the string defining the comment start delimiter -+" -right: the string defining the comment end delimiter -+" -leftAlt: the string for the alternative comment style defining the comment start delimiter -+" -rightAlt: the string for the alternative comment style defining the comment end delimiter -+function s:MapDelimitersWithAlternative(left, right, leftAlt, rightAlt) -+ if !exists('g:NERD_' . &filetype . '_alt_style') -+ let b:left = a:left -+ let b:right = a:right -+ let b:leftAlt = a:leftAlt -+ let b:rightAlt = a:rightAlt -+ else -+ let b:left = a:leftAlt -+ let b:right = a:rightAlt -+ let b:leftAlt = a:left -+ let b:rightAlt = a:right -+ endif -+endfunction -+ -+" Function: s:SwitchToAlternativeDelimiters(printMsgs) function {{{2 -+" This function is used to swap the delimiters that are being used to the -+" alternative delimiters for that filetype. For example, if a c++ file is -+" being edited and // comments are being used, after this function is called -+" /**/ comments will be used. -+" -+" Args: -+" -printMsgs: if this is 1 then a message is echoed to the user telling them -+" if this function changed the delimiters or not -+function s:SwitchToAlternativeDelimiters(printMsgs) -+ "if both of the alternative delimiters are empty then there is no -+ "alternative comment style so bail out -+ if !s:HasMultipartDelims() -+ if a:printMsgs -+ call s:NerdEcho("Cannot use alternative delimiters, none are specified", 0) -+ endif -+ return 0 -+ endif -+ -+ "save the current delimiters -+ let tempLeft = b:left -+ let tempRight = b:right -+ -+ "swap current delimiters for alternative -+ let b:left = b:leftAlt -+ let b:right = b:rightAlt -+ -+ "set the previously current delimiters to be the new alternative ones -+ let b:leftAlt = tempLeft -+ let b:rightAlt = tempRight -+ -+ "tell the user what comment delimiters they are now using -+ if a:printMsgs -+ let leftNoEsc = b:left -+ let rightNoEsc = b:right -+ call s:NerdEcho("Now using " . leftNoEsc . " " . rightNoEsc . " to delimit comments", 1) -+ endif -+ -+ return 1 -+endfunction -+ -+" Section: Comment delimiter add/removal functions {{{1 -+" ============================================================================ -+" Function: s:AppendCommentToLine(){{{2 -+" This function appends comment delimiters at the EOL and places the cursor in -+" position to start typing the comment -+function s:AppendCommentToLine() -+ let left = s:GetLeft(0,1,0) -+ let right = s:GetRight(0,1,0) -+ -+ " get the len of the right delim -+ let lenRight = strlen(right) -+ -+ let isLineEmpty = strlen(getline(".")) == 0 -+ let insOrApp = (isLineEmpty==1 ? 'i' : 'A') -+ -+ "stick the delimiters down at the end of the line. We have to format the -+ "comment with spaces as appropriate -+ execute ":normal " . insOrApp . (isLineEmpty ? '' : ' ') . left . right . " " -+ -+ " if there is a right delimiter then we gotta move the cursor left -+ " by the len of the right delimiter so we insert between the delimiters -+ if lenRight > 0 -+ let leftMoveAmount = lenRight -+ execute ":normal " . leftMoveAmount . "h" -+ endif -+ startinsert -+endfunction -+ -+" Function: s:CommentBlock(top, bottom, lSide, rSide, forceNested ) {{{2 -+" This function is used to comment out a region of code. This region is -+" specified as a bounding box by arguments to the function. -+" -+" Args: -+" -top: the line number for the top line of code in the region -+" -bottom: the line number for the bottom line of code in the region -+" -lSide: the column number for the left most column in the region -+" -rSide: the column number for the right most column in the region -+" -forceNested: a flag indicating whether comments should be nested -+function s:CommentBlock(top, bottom, lSide, rSide, forceNested ) -+ " we need to create local copies of these arguments so we can modify them -+ let top = a:top -+ let bottom = a:bottom -+ let lSide = a:lSide -+ let rSide = a:rSide -+ -+ "if the top or bottom line starts with tabs we have to adjust the left and -+ "right boundaries so that they are set as though the tabs were spaces -+ let topline = getline(top) -+ let bottomline = getline(bottom) -+ if s:HasLeadingTabs(topline, bottomline) -+ -+ "find out how many tabs are in the top line and adjust the left -+ "boundary accordingly -+ let numTabs = s:NumberOfLeadingTabs(topline) -+ if lSide < numTabs -+ let lSide = &ts * lSide -+ else -+ let lSide = (lSide - numTabs) + (&ts * numTabs) -+ endif -+ -+ "find out how many tabs are in the bottom line and adjust the right -+ "boundary accordingly -+ let numTabs = s:NumberOfLeadingTabs(bottomline) -+ let rSide = (rSide - numTabs) + (&ts * numTabs) -+ endif -+ -+ "we must check that bottom IS actually below top, if it is not then we -+ "swap top and bottom. Similarly for left and right. -+ if bottom < top -+ let temp = top -+ let top = bottom -+ let bottom = top -+ endif -+ if rSide < lSide -+ let temp = lSide -+ let lSide = rSide -+ let rSide = temp -+ endif -+ -+ "if the current delimiters arent multipart then we will switch to the -+ "alternative delims (if THEY are) as the comment will be better and more -+ "accurate with multipart delims -+ let switchedDelims = 0 -+ if !s:Multipart() && g:NERDAllowAnyVisualDelims && s:AltMultipart() -+ let switchedDelims = 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+ -+ "start the commenting from the top and keep commenting till we reach the -+ "bottom -+ let currentLine=top -+ while currentLine <= bottom -+ -+ "check if we are allowed to comment this line -+ if s:CanCommentLine(a:forceNested, currentLine) -+ -+ "convert the leading tabs into spaces -+ let theLine = getline(currentLine) -+ let lineHasLeadTabs = s:HasLeadingTabs(theLine) -+ if lineHasLeadTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ -+ "dont comment lines that begin after the right boundary of the -+ "block unless the user has specified to do so -+ if theLine !~ '^ \{' . rSide . '\}' || !g:NERDBlockComIgnoreEmpty -+ -+ "attempt to place the cursor in on the left of the boundary box, -+ "then check if we were successful, if not then we cant comment this -+ "line -+ call setline(currentLine, theLine) -+ if s:CanPlaceCursor(currentLine, lSide) -+ -+ let leftSpaced = s:GetLeft(0,1,0) -+ let rightSpaced = s:GetRight(0,1,0) -+ -+ "stick the left delimiter down -+ let theLine = strpart(theLine, 0, lSide-1) . leftSpaced . strpart(theLine, lSide-1) -+ -+ if s:Multipart() -+ "stick the right delimiter down -+ let theLine = strpart(theLine, 0, rSide+strlen(leftSpaced)) . rightSpaced . strpart(theLine, rSide+strlen(rightSpaced)) -+ -+ let firstLeftDelim = s:FindDelimiterIndex(b:left, theLine) -+ let lastRightDelim = s:LastIndexOfDelim(b:right, theLine) -+ -+ if firstLeftDelim != -1 && lastRightDelim != -1 -+ let searchStr = strpart(theLine, 0, lastRightDelim) -+ let searchStr = strpart(searchStr, firstLeftDelim+strlen(b:left)) -+ -+ "replace the outter most delims in searchStr with -+ "place-holders -+ let theLineWithPlaceHolders = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, searchStr) -+ -+ "add the right delimiter onto the line -+ let theLine = strpart(theLine, 0, firstLeftDelim+strlen(b:left)) . theLineWithPlaceHolders . strpart(theLine, lastRightDelim) -+ endif -+ endif -+ endif -+ endif -+ -+ "restore tabs if needed -+ if lineHasLeadTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ call setline(currentLine, theLine) -+ endif -+ -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ "if we switched delims then we gotta go back to what they were before -+ if switchedDelims == 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+endfunction -+ -+" Function: s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) {{{2 -+" This function comments a range of lines. -+" -+" Args: -+" -forceNested: a flag indicating whether the called is requesting the comment -+" to be nested if need be -+" -alignRight/alignLeft: 0/1 if the comments delimiters should/shouldnt be -+" aligned left/right -+" -firstLine/lastLine: the top and bottom lines to comment -+function s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) -+ " we need to get the left and right indexes of the leftmost char in the -+ " block of of lines and the right most char so that we can do alignment of -+ " the delimiters if the user has specified -+ let leftAlignIndx = s:LeftMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) -+ let rightAlignIndx = s:RightMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) -+ -+ " gotta add the length of the left delimiter onto the rightAlignIndx cos -+ " we'll be adding a left delim to the line -+ let rightAlignIndx = rightAlignIndx + strlen(s:GetLeft(0,1,0)) -+ -+ " now we actually comment the lines. Do it line by line -+ let currentLine = a:firstLine -+ while currentLine <= a:lastLine -+ -+ " get the next line, check commentability and convert spaces to tabs -+ let theLine = getline(currentLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ if s:CanCommentLine(a:forceNested, currentLine) -+ "if the user has specified forceNesting then we check to see if we -+ "need to switch delimiters for place-holders -+ if a:forceNested && g:NERDUsePlaceHolders -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ endif -+ -+ " find out if the line is commented using normal delims and/or -+ " alternate ones -+ let isCommented = s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) -+ -+ " check if we can comment this line -+ if !isCommented || g:NERDUsePlaceHolders || s:Multipart() -+ if a:alignLeft -+ let theLine = s:AddLeftDelimAligned(b:left, theLine, leftAlignIndx) -+ else -+ let theLine = s:AddLeftDelim(s:GetLeft(0,1,0), theLine) -+ endif -+ if a:alignRight -+ let theLine = s:AddRightDelimAligned(b:right, theLine, rightAlignIndx) -+ else -+ let theLine = s:AddRightDelim(s:GetRight(0,1,0), theLine) -+ endif -+ endif -+ endif -+ -+ " restore leading tabs if appropriate -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ " we are done with this line -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+endfunction -+ -+" Function: s:CommentLinesMinimal(firstLine, lastLine) {{{2 -+" This function comments a range of lines in a minimal style. I -+" -+" Args: -+" -firstLine/lastLine: the top and bottom lines to comment -+function s:CommentLinesMinimal(firstLine, lastLine) -+ "check that minimal comments can be done on this filetype -+ if !s:HasMultipartDelims() -+ throw 'NERDCommenter.Delimiters exception: Minimal comments can only be used for filetypes that have multipart delimiters' -+ endif -+ -+ "if we need to use place holders for the comment, make sure they are -+ "enabled for this filetype -+ if !g:NERDUsePlaceHolders && s:DoesBlockHaveMultipartDelim(a:firstLine, a:lastLine) -+ throw 'NERDCommenter.Settings exception: Placeoholders are required but disabled.' -+ endif -+ -+ "get the left and right delims to smack on -+ let left = s:GetSexyComLeft(g:NERDSpaceDelims,0) -+ let right = s:GetSexyComRight(g:NERDSpaceDelims,0) -+ -+ "make sure all multipart delims on the lines are replaced with -+ "placeholders to prevent illegal syntax -+ let currentLine = a:firstLine -+ while(currentLine <= a:lastLine) -+ let theLine = getline(currentLine) -+ let theLine = s:ReplaceDelims(left, right, g:NERDLPlace, g:NERDRPlace, theLine) -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ "add the delim to the top line -+ let theLine = getline(a:firstLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let theLine = s:AddLeftDelim(left, theLine) -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:firstLine, theLine) -+ -+ "add the delim to the bottom line -+ let theLine = getline(a:lastLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let theLine = s:AddRightDelim(right, theLine) -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:lastLine, theLine) -+endfunction -+ -+" Function: s:CommentLinesSexy(topline, bottomline) function {{{2 -+" This function is used to comment lines in the 'Sexy' style. eg in c: -+" /* -+" * This is a sexy comment -+" */ -+" Args: -+" -topline: the line num of the top line in the sexy comment -+" -bottomline: the line num of the bottom line in the sexy comment -+function s:CommentLinesSexy(topline, bottomline) -+ let left = s:GetSexyComLeft(0, 0) -+ let right = s:GetSexyComRight(0, 0) -+ -+ "check if we can do a sexy comment with the available delimiters -+ if left == -1 || right == -1 -+ throw 'NERDCommenter.Delimiters exception: cannot perform sexy comments with available delimiters.' -+ endif -+ -+ "make sure the lines arent already commented sexually -+ if !s:CanSexyCommentLines(a:topline, a:bottomline) -+ throw 'NERDCommenter.Nesting exception: cannot nest sexy comments' -+ endif -+ -+ -+ let sexyComMarker = s:GetSexyComMarker(0,0) -+ let sexyComMarkerSpaced = s:GetSexyComMarker(1,0) -+ -+ -+ " we jam the comment as far to the right as possible -+ let leftAlignIndx = s:LeftMostIndx(1, 1, a:topline, a:bottomline) -+ -+ "check if we should use the compact style i.e that the left/right -+ "delimiters should appear on the first and last lines of the code and not -+ "on separate lines above/below the first/last lines of code -+ if g:NERDCompactSexyComs -+ let spaceString = (g:NERDSpaceDelims ? s:spaceStr : '') -+ -+ "comment the top line -+ let theLine = getline(a:topline) -+ let lineHasTabs = s:HasLeadingTabs(theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ let theLine = s:AddLeftDelimAligned(left . spaceString, theLine, leftAlignIndx) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:topline, theLine) -+ -+ "comment the bottom line -+ let theLine = getline(a:bottomline) -+ let lineHasTabs = s:HasLeadingTabs(theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ let theLine = s:AddRightDelim(spaceString . right, theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ call setline(a:bottomline, theLine) -+ else -+ -+ " add the left delimiter one line above the lines that are to be commented -+ call cursor(a:topline, 1) -+ execute 'normal! O' -+ call setline(a:topline, strpart(s:spaces, 0, leftAlignIndx) . left ) -+ -+ " add the right delimiter after bottom line (we have to add 1 cos we moved -+ " the lines down when we added the left delim -+ call cursor(a:bottomline+1, 1) -+ execute 'normal! o' -+ call setline(a:bottomline+2, strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . right ) -+ -+ endif -+ -+ " go thru each line adding the sexyComMarker marker to the start of each -+ " line in the appropriate place to align them with the comment delims -+ let currentLine = a:topline+1 -+ while currentLine <= a:bottomline + !g:NERDCompactSexyComs -+ " get the line and convert the tabs to spaces -+ let theLine = getline(currentLine) -+ let lineHasTabs = s:HasLeadingTabs(theLine) -+ if lineHasTabs -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ endif -+ -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ -+ " add the sexyComMarker -+ let theLine = strpart(s:spaces, 0, leftAlignIndx) . strpart(s:spaces, 0, strlen(left)-strlen(sexyComMarker)) . sexyComMarkerSpaced . strpart(theLine, leftAlignIndx) -+ -+ if lineHasTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ -+ " set the line and move onto the next one -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+endfunction -+ -+" Function: s:CommentLinesToggle(forceNested, firstLine, lastLine) {{{2 -+" Applies "toggle" commenting to the given range of lines -+" -+" Args: -+" -forceNested: a flag indicating whether the called is requesting the comment -+" to be nested if need be -+" -firstLine/lastLine: the top and bottom lines to comment -+function s:CommentLinesToggle(forceNested, firstLine, lastLine) -+ let currentLine = a:firstLine -+ while currentLine <= a:lastLine -+ -+ " get the next line, check commentability and convert spaces to tabs -+ let theLine = getline(currentLine) -+ let lineHasLeadingTabs = s:HasLeadingTabs(theLine) -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ if s:CanToggleCommentLine(a:forceNested, currentLine) -+ -+ "if the user has specified forceNesting then we check to see if we -+ "need to switch delimiters for place-holders -+ if g:NERDUsePlaceHolders -+ let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) -+ endif -+ -+ let theLine = s:AddLeftDelim(s:GetLeft(0, 1, 0), theLine) -+ let theLine = s:AddRightDelim(s:GetRight(0, 1, 0), theLine) -+ endif -+ -+ " restore leading tabs if appropriate -+ if lineHasLeadingTabs -+ let theLine = s:ConvertLeadingSpacesToTabs(theLine) -+ endif -+ -+ " we are done with this line -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+endfunction -+ -+" Function: s:CommentRegion(topline, topCol, bottomLine, bottomCol) function {{{2 -+" This function comments chunks of text selected in visual mode. -+" It will comment exactly the text that they have selected. -+" Args: -+" -topLine: the line num of the top line in the sexy comment -+" -topCol: top left col for this comment -+" -bottomline: the line num of the bottom line in the sexy comment -+" -bottomCol: the bottom right col for this comment -+" -forceNested: whether the caller wants comments to be nested if the -+" line(s) are already commented -+function s:CommentRegion(topLine, topCol, bottomLine, bottomCol, forceNested) -+ -+ "switch delims (if we can) if the current set isnt multipart -+ let switchedDelims = 0 -+ if !s:Multipart() && s:AltMultipart() && !g:NERDAllowAnyVisualDelims -+ let switchedDelims = 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+ -+ "if there is only one line in the comment then just do it -+ if a:topLine == a:bottomLine -+ call s:CommentBlock(a:topLine, a:bottomLine, a:topCol, a:bottomCol, a:forceNested) -+ -+ "there are multiple lines in the comment -+ else -+ "comment the top line -+ call s:CommentBlock(a:topLine, a:topLine, a:topCol, strlen(getline(a:topLine)), a:forceNested) -+ -+ "comment out all the lines in the middle of the comment -+ let topOfRange = a:topLine+1 -+ let bottomOfRange = a:bottomLine-1 -+ if topOfRange <= bottomOfRange -+ call s:CommentLines(a:forceNested, 0, 0, topOfRange, bottomOfRange) -+ endif -+ -+ "comment the bottom line -+ let bottom = getline(a:bottomLine) -+ let numLeadingSpacesTabs = strlen(substitute(bottom, '^\([ \t]*\).*$', '\1', '')) -+ call s:CommentBlock(a:bottomLine, a:bottomLine, numLeadingSpacesTabs+1, a:bottomCol, a:forceNested) -+ -+ endif -+ -+ "stick the cursor back on the char it was on before the comment -+ call cursor(a:topLine, a:topCol + strlen(b:left) + g:NERDSpaceDelims) -+ -+ "if we switched delims then we gotta go back to what they were before -+ if switchedDelims == 1 -+ call s:SwitchToAlternativeDelimiters(0) -+ endif -+ -+endfunction -+ -+" Function: s:InvertComment(firstLine, lastLine) function {{{2 -+" Inverts the comments on the lines between and including the given line -+" numbers i.e all commented lines are uncommented and vice versa -+" Args: -+" -firstLine: the top of the range of lines to be inverted -+" -lastLine: the bottom of the range of lines to be inverted -+function s:InvertComment(firstLine, lastLine) -+ -+ " go thru all lines in the given range -+ let currentLine = a:firstLine -+ while currentLine <= a:lastLine -+ let theLine = getline(currentLine) -+ -+ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) -+ -+ " if the line is commented normally, uncomment it -+ if s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) -+ call s:UncommentLines(1, currentLine, currentLine) -+ let currentLine = currentLine + 1 -+ -+ " check if the line is commented sexually -+ elseif !empty(sexyComBounds) -+ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() -+ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) -+ -+ "move to the line after last line of the sexy comment -+ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() -+ let currentLine = bottomBound - (numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved) + 1 -+ -+ " the line isnt commented -+ else -+ call s:CommentLinesToggle(1, currentLine, currentLine) -+ let currentLine = currentLine + 1 -+ endif -+ -+ endwhile -+endfunction -+ -+" Function: NERDComment(isVisual, alignLeft, alignRight, type) function {{{2 -+" This function is a Wrapper for the main commenting functions -+" -+" Args: -+" -isVisual: a flag indicating whether the comment is requested in visual -+" mode or not -+" -type: the type of commenting requested. Can be 'sexy', 'invert', -+" 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', -+" 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' -+function! NERDComment(isVisual, type) range -+ " we want case sensitivity when commenting -+ let prevIgnoreCase = &ignorecase -+ set noignorecase -+ -+ if a:isVisual -+ let firstLine = line("'<") -+ let lastLine = line("'>") -+ let firstCol = col("'<") -+ let lastCol = col("'>") -+ else -+ let firstLine = a:firstline -+ let lastLine = a:lastline -+ endif -+ -+ let countWasGiven = (a:isVisual == 0 && firstLine != lastLine) -+ -+ let forceNested = (a:type == 'nested' || g:NERDDefaultNesting) -+ -+ if a:type == 'norm' || a:type == 'nested' -+ if a:isVisual && visualmode() == "" -+ call s:CommentBlock(firstLine, lastLine, firstCol, lastCol, forceNested) -+ elseif a:isVisual && visualmode() == "v" && (g:NERDCommentWholeLinesInVMode==0 || (g:NERDCommentWholeLinesInVMode==2 && s:HasMultipartDelims())) -+ call s:CommentRegion(firstLine, firstCol, lastLine, lastCol, forceNested) -+ else -+ call s:CommentLines(forceNested, 0, 0, firstLine, lastLine) -+ endif -+ -+ elseif a:type == 'alignLeft' || a:type == 'alignRight' || a:type == 'alignBoth' -+ let alignLeft = (a:type == 'alignLeft' || a:type == 'alignBoth') -+ let alignRight = (a:type == 'alignRight' || a:type == 'alignBoth') -+ call s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) -+ -+ elseif a:type == 'invert' -+ call s:InvertComment(firstLine, lastLine) -+ -+ elseif a:type == 'sexy' -+ try -+ call s:CommentLinesSexy(firstLine, lastLine) -+ catch /NERDCommenter.Delimiters/ -+ call s:NerdEcho("Sexy comments cannot be done with the available delimiters", 0) -+ catch /NERDCommenter.Nesting/ -+ call s:NerdEcho("Sexy comment aborted. Nested sexy cannot be nested", 0) -+ endtry -+ -+ elseif a:type == 'toggle' -+ let theLine = getline(firstLine) -+ -+ if s:IsInSexyComment(firstLine) || s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine) -+ call s:UncommentLines(1, firstLine, lastLine) -+ else -+ call s:CommentLinesToggle(forceNested, firstLine, lastLine) -+ endif -+ -+ elseif a:type == 'minimal' -+ try -+ call s:CommentLinesMinimal(firstLine, lastLine) -+ catch /NERDCommenter.Delimiters/ -+ call s:NerdEcho("Minimal comments can only be used for filetypes that have multipart delimiters.", 0) -+ catch /NERDCommenter.Settings/ -+ call s:NerdEcho("Place holders are required but disabled.", 0) -+ endtry -+ -+ elseif a:type == 'toEOL' -+ call s:SaveScreenState() -+ call s:CommentBlock(firstLine, firstLine, col("."), col("$")-1, 1) -+ call s:RestoreScreenState() -+ -+ elseif a:type == 'prepend' -+ call s:PrependCommentToLine() -+ -+ elseif a:type == 'append' -+ call s:AppendCommentToLine() -+ -+ elseif a:type == 'insert' -+ call s:PlaceDelimitersAndInsBetween() -+ -+ elseif a:type == 'uncomment' -+ call s:UncommentLines(0, firstLine, lastLine) -+ -+ elseif a:type == 'yank' -+ if a:isVisual -+ normal gvy -+ elseif countWasGiven -+ execute firstLine .','. lastLine .'yank' -+ else -+ normal Y -+ endif -+ execute firstLine .','. lastLine .'call NERDComment('. a:isVisual .', "norm")' -+ endif -+ -+ let &ignorecase = prevIgnoreCase -+endfunction -+ -+" Function: s:PlaceDelimitersAndInsBetween() function {{{2 -+" This is function is called to place comment delimiters down and place the -+" cursor between them -+function s:PlaceDelimitersAndInsBetween() -+ " get the left and right delimiters without any escape chars in them -+ let left = s:GetLeft(0, 1, 0) -+ let right = s:GetRight(0, 1, 0) -+ -+ let theLine = getline(".") -+ let lineHasLeadTabs = s:HasLeadingTabs(theLine) || (theLine =~ '^ *$' && !&expandtab) -+ -+ "convert tabs to spaces and adjust the cursors column to take this into -+ "account -+ let untabbedCol = s:UntabbedCol(theLine, col(".")) -+ call setline(line("."), s:ConvertLeadingTabsToSpaces(theLine)) -+ call cursor(line("."), untabbedCol) -+ -+ " get the len of the right delim -+ let lenRight = strlen(right) -+ -+ let isDelimOnEOL = col(".") >= strlen(getline(".")) -+ -+ " if the cursor is in the first col then we gotta insert rather than -+ " append the comment delimiters here -+ let insOrApp = (col(".")==1 ? 'i' : 'a') -+ -+ " place the delimiters down. We do it differently depending on whether -+ " there is a left AND right delimiter -+ if lenRight > 0 -+ execute ":normal " . insOrApp . left . right -+ execute ":normal " . lenRight . "h" -+ else -+ execute ":normal " . insOrApp . left -+ -+ " if we are tacking the delim on the EOL then we gotta add a space -+ " after it cos when we go out of insert mode the cursor will move back -+ " one and the user wont be in position to type the comment. -+ if isDelimOnEOL -+ execute 'normal a ' -+ endif -+ endif -+ normal l -+ -+ "if needed convert spaces back to tabs and adjust the cursors col -+ "accordingly -+ if lineHasLeadTabs -+ let tabbedCol = s:TabbedCol(getline("."), col(".")) -+ call setline(line("."), s:ConvertLeadingSpacesToTabs(getline("."))) -+ call cursor(line("."), tabbedCol) -+ endif -+ -+ startinsert -+endfunction -+ -+" Function: s:PrependCommentToLine(){{{2 -+" This function prepends comment delimiters to the start of line and places -+" the cursor in position to start typing the comment -+function s:PrependCommentToLine() -+ " get the left and right delimiters without any escape chars in them -+ let left = s:GetLeft(0, 1, 0) -+ let right = s:GetRight(0, 1, 0) -+ -+ " get the len of the right delim -+ let lenRight = strlen(right) -+ -+ -+ "if the line is empty then we need to know about this later on -+ let isLineEmpty = strlen(getline(".")) == 0 -+ -+ "stick the delimiters down at the start of the line. We have to format the -+ "comment with spaces as appropriate -+ if lenRight > 0 -+ execute ":normal I" . left . right -+ else -+ execute ":normal I" . left -+ endif -+ -+ " if there is a right delimiter then we gotta move the cursor left -+ " by the len of the right delimiter so we insert between the delimiters -+ if lenRight > 0 -+ let leftMoveAmount = lenRight -+ execute ":normal " . leftMoveAmount . "h" -+ endif -+ normal l -+ -+ "if the line was empty then we gotta add an extra space on the end because -+ "the cursor will move back one more at the end of the last "execute" -+ "command -+ if isLineEmpty && lenRight == 0 -+ execute ":normal a " -+ endif -+ -+ startinsert -+endfunction -+" Function: s:RemoveDelimiters(left, right, line) {{{2 -+" this function is called to remove the first left comment delimiter and the -+" last right delimiter of the given line. -+" -+" The args left and right must be strings. If there is no right delimiter (as -+" is the case for e.g vim file comments) them the arg right should be "" -+" -+" Args: -+" -left: the left comment delimiter -+" -right: the right comment delimiter -+" -line: the line to remove the delimiters from -+function s:RemoveDelimiters(left, right, line) -+ -+ let l:left = a:left -+ let l:right = a:right -+ let lenLeft = strlen(left) -+ let lenRight = strlen(right) -+ -+ let delimsSpaced = (g:NERDSpaceDelims || g:NERDRemoveExtraSpaces) -+ -+ let line = a:line -+ -+ "look for the left delimiter, if we find it, remove it. -+ let leftIndx = s:FindDelimiterIndex(a:left, line) -+ if leftIndx != -1 -+ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+lenLeft) -+ -+ "if the user has specified that there is a space after the left delim -+ "then check for the space and remove it if it is there -+ if delimsSpaced && strpart(line, leftIndx, s:lenSpaceStr) == s:spaceStr -+ let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+s:lenSpaceStr) -+ endif -+ endif -+ -+ "look for the right delimiter, if we find it, remove it -+ let rightIndx = s:FindDelimiterIndex(a:right, line) -+ if rightIndx != -1 -+ let line = strpart(line, 0, rightIndx) . strpart(line, rightIndx+lenRight) -+ -+ "if the user has specified that there is a space before the right delim -+ "then check for the space and remove it if it is there -+ if delimsSpaced && strpart(line, rightIndx-s:lenSpaceStr, s:lenSpaceStr) == s:spaceStr && s:Multipart() -+ let line = strpart(line, 0, rightIndx-s:lenSpaceStr) . strpart(line, rightIndx) -+ endif -+ endif -+ -+ return line -+endfunction -+ -+" Function: s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) {{{2 -+" This function uncomments the given lines -+" -+" Args: -+" onlyWholeLineComs: should be 1 for toggle style uncommenting -+" topLine: the top line of the visual selection to uncomment -+" bottomLine: the bottom line of the visual selection to uncomment -+function s:UncommentLines(onlyWholeLineComs, topLine, bottomLine) -+ "make local copies of a:firstline and a:lastline and, if need be, swap -+ "them around if the top line is below the bottom -+ let l:firstline = a:topLine -+ let l:lastline = a:bottomLine -+ if firstline > lastline -+ let firstline = lastline -+ let lastline = a:topLine -+ endif -+ -+ "go thru each line uncommenting each line removing sexy comments -+ let currentLine = firstline -+ while currentLine <= lastline -+ -+ "check the current line to see if it is part of a sexy comment -+ let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) -+ if !empty(sexyComBounds) -+ -+ "we need to store the num lines in the buf before the comment is -+ "removed so we know how many lines were removed when the sexy com -+ "was removed -+ let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() -+ -+ call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) -+ -+ "move to the line after last line of the sexy comment -+ let numLinesAfterSexyComRemoved = s:NumLinesInBuf() -+ let numLinesRemoved = numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved -+ let currentLine = sexyComBounds[1] - numLinesRemoved + 1 -+ let lastline = lastline - numLinesRemoved -+ -+ "no sexy com was detected so uncomment the line as normal -+ else -+ let theLine = getline(currentLine) -+ if a:onlyWholeLineComs && (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) -+ call s:UncommentLinesNormal(currentLine, currentLine) -+ elseif !a:onlyWholeLineComs -+ call s:UncommentLinesNormal(currentLine, currentLine) -+ endif -+ let currentLine = currentLine + 1 -+ endif -+ endwhile -+ -+endfunction -+ -+" Function: s:UncommentLinesSexy(topline, bottomline) {{{2 -+" This function removes all the comment characters associated with the sexy -+" comment spanning the given lines -+" Args: -+" -topline/bottomline: the top/bottom lines of the sexy comment -+function s:UncommentLinesSexy(topline, bottomline) -+ let left = s:GetSexyComLeft(0,1) -+ let right = s:GetSexyComRight(0,1) -+ -+ -+ "check if it is even possible for sexy comments to exist with the -+ "available delimiters -+ if left == -1 || right == -1 -+ throw 'NERDCommenter.Delimiters exception: cannot uncomment sexy comments with available delimiters.' -+ endif -+ -+ let leftUnEsc = s:GetSexyComLeft(0,0) -+ let rightUnEsc = s:GetSexyComRight(0,0) -+ -+ let sexyComMarker = s:GetSexyComMarker(0, 1) -+ let sexyComMarkerUnEsc = s:GetSexyComMarker(0, 0) -+ -+ "the markerOffset is how far right we need to move the sexyComMarker to -+ "line it up with the end of the left delim -+ let markerOffset = strlen(leftUnEsc)-strlen(sexyComMarkerUnEsc) -+ -+ " go thru the intermediate lines of the sexy comment and remove the -+ " sexy comment markers (eg the '*'s on the start of line in a c sexy -+ " comment) -+ let currentLine = a:topline+1 -+ while currentLine < a:bottomline -+ let theLine = getline(currentLine) -+ -+ " remove the sexy comment marker from the line. We also remove the -+ " space after it if there is one and if appropriate options are set -+ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) -+ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) -+ endif -+ -+ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) -+ -+ let theLine = s:ConvertLeadingWhiteSpace(theLine) -+ -+ " move onto the next line -+ call setline(currentLine, theLine) -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ " gotta make a copy of a:bottomline cos we modify the position of the -+ " last line it if we remove the topline -+ let bottomline = a:bottomline -+ -+ " get the first line so we can remove the left delim from it -+ let theLine = getline(a:topline) -+ -+ " if the first line contains only the left delim then just delete it -+ if theLine =~ '^[ \t]*' . left . '[ \t]*$' && !g:NERDCompactSexyComs -+ call cursor(a:topline, 1) -+ normal dd -+ let bottomline = bottomline - 1 -+ -+ " topline contains more than just the left delim -+ else -+ -+ " remove the delim. If there is a space after it -+ " then remove this too if appropriate -+ let delimIndx = stridx(theLine, leftUnEsc) -+ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)) -+ endif -+ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) -+ call setline(a:topline, theLine) -+ endif -+ -+ " get the last line so we can remove the right delim -+ let theLine = getline(bottomline) -+ -+ " if the bottomline contains only the right delim then just delete it -+ if theLine =~ '^[ \t]*' . right . '[ \t]*$' -+ call cursor(bottomline, 1) -+ normal dd -+ -+ " the last line contains more than the right delim -+ else -+ " remove the right delim. If there is a space after it and -+ " if the appropriate options are set then remove this too. -+ let delimIndx = s:LastIndexOfDelim(rightUnEsc, theLine) -+ if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)) -+ endif -+ -+ " if the last line also starts with a sexy comment marker then we -+ " remove this as well -+ if theLine =~ '^[ \t]*' . sexyComMarker -+ -+ " remove the sexyComMarker. If there is a space after it then -+ " remove that too -+ let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) -+ if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) -+ else -+ let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) -+ endif -+ endif -+ -+ let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) -+ call setline(bottomline, theLine) -+ endif -+endfunction -+ -+" Function: s:UncommentLineNormal(line) {{{2 -+" uncomments the given line and returns the result -+" Args: -+" -line: the line to uncomment -+function s:UncommentLineNormal(line) -+ let line = a:line -+ -+ "get the comment status on the line so we know how it is commented -+ let lineCommentStatus = s:IsCommentedOuttermost(b:leftAlt, b:rightAlt, b:left, b:right, line) -+ -+ "it is commented with b:left and b:right so remove these delims -+ if lineCommentStatus == 1 -+ let line = s:RemoveDelimiters(b:leftAlt, b:rightAlt, line) -+ -+ "it is commented with b:leftAlt and b:rightAlt so remove these delims -+ elseif lineCommentStatus == 2 && g:NERDRemoveAltComs -+ let line = s:RemoveDelimiters(b:left, b:right, line) -+ -+ "it is not properly commented with any delims so we check if it has -+ "any random left or right delims on it and remove the outtermost ones -+ else -+ "get the positions of all delim types on the line -+ let indxLeft = s:FindDelimiterIndex(b:left, line) -+ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) -+ let indxRight = s:FindDelimiterIndex(b:right, line) -+ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) -+ -+ "remove the outter most left comment delim -+ if indxLeft != -1 && (indxLeft < indxLeftAlt || indxLeftAlt == -1) -+ let line = s:ReplaceLeftMostDelim(b:left, '', line) -+ elseif indxLeftAlt != -1 -+ let line = s:ReplaceLeftMostDelim(b:leftAlt, '', line) -+ endif -+ -+ "remove the outter most right comment delim -+ if indxRight != -1 && (indxRight < indxRightAlt || indxRightAlt == -1) -+ let line = s:ReplaceRightMostDelim(b:right, '', line) -+ elseif indxRightAlt != -1 -+ let line = s:ReplaceRightMostDelim(b:rightAlt, '', line) -+ endif -+ endif -+ -+ -+ let indxLeft = s:FindDelimiterIndex(b:left, line) -+ let indxLeftAlt = s:FindDelimiterIndex(b:leftAlt, line) -+ let indxLeftPlace = s:FindDelimiterIndex(g:NERDLPlace, line) -+ -+ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) -+ let indxRightAlt = s:FindDelimiterIndex(b:rightAlt, line) -+ let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) -+ -+ let right = b:right -+ let left = b:left -+ if !s:Multipart() -+ let right = b:rightAlt -+ let left = b:leftAlt -+ endif -+ -+ -+ "if there are place-holders on the line then we check to see if they are -+ "the outtermost delimiters on the line. If so then we replace them with -+ "real delimiters -+ if indxLeftPlace != -1 -+ if (indxLeftPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) -+ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) -+ endif -+ elseif indxRightPlace != -1 -+ if (indxRightPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) -+ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) -+ endif -+ -+ endif -+ -+ let line = s:ConvertLeadingWhiteSpace(line) -+ -+ return line -+endfunction -+ -+" Function: s:UncommentLinesNormal(topline, bottomline) {{{2 -+" This function is called to uncomment lines that arent a sexy comment -+" Args: -+" -topline/bottomline: the top/bottom line numbers of the comment -+function s:UncommentLinesNormal(topline, bottomline) -+ let currentLine = a:topline -+ while currentLine <= a:bottomline -+ let line = getline(currentLine) -+ call setline(currentLine, s:UncommentLineNormal(line)) -+ let currentLine = currentLine + 1 -+ endwhile -+endfunction -+ -+ -+" Section: Other helper functions {{{1 -+" ============================================================================ -+ -+" Function: s:AddLeftDelim(delim, theLine) {{{2 -+" Args: -+function s:AddLeftDelim(delim, theLine) -+ return substitute(a:theLine, '^\([ \t]*\)', '\1' . a:delim, '') -+endfunction -+ -+" Function: s:AddLeftDelimAligned(delim, theLine) {{{2 -+" Args: -+function s:AddLeftDelimAligned(delim, theLine, alignIndx) -+ -+ "if the line is not long enough then bung some extra spaces on the front -+ "so we can align the delim properly -+ let theLine = a:theLine -+ if strlen(theLine) < a:alignIndx -+ let theLine = strpart(s:spaces, 0, a:alignIndx - strlen(theLine)) -+ endif -+ -+ return strpart(theLine, 0, a:alignIndx) . a:delim . strpart(theLine, a:alignIndx) -+endfunction -+ -+" Function: s:AddRightDelim(delim, theLine) {{{2 -+" Args: -+function s:AddRightDelim(delim, theLine) -+ if a:delim == '' -+ return a:theLine -+ else -+ return substitute(a:theLine, '$', a:delim, '') -+ endif -+endfunction -+ -+" Function: s:AddRightDelimAligned(delim, theLine, alignIndx) {{{2 -+" Args: -+function s:AddRightDelimAligned(delim, theLine, alignIndx) -+ if a:delim == "" -+ return a:theLine -+ else -+ -+ " when we align the right delim we are just adding spaces -+ " so we get a string containing the needed spaces (it -+ " could be empty) -+ let extraSpaces = '' -+ let extraSpaces = strpart(s:spaces, 0, a:alignIndx-strlen(a:theLine)) -+ -+ " add the right delim -+ return substitute(a:theLine, '$', extraSpaces . a:delim, '') -+ endif -+endfunction -+ -+" Function: s:AltMultipart() {{{2 -+" returns 1 if the alternative delims are multipart -+function s:AltMultipart() -+ return b:rightAlt != '' -+endfunction -+ -+" Function: s:CanCommentLine(forceNested, line) {{{2 -+"This function is used to determine whether the given line can be commented. -+"It returns 1 if it can be and 0 otherwise -+" -+" Args: -+" -forceNested: a flag indicating whether the caller wants comments to be nested -+" if the current line is already commented -+" -lineNum: the line num of the line to check for commentability -+function s:CanCommentLine(forceNested, lineNum) -+ let theLine = getline(a:lineNum) -+ -+ " make sure we don't comment lines that are just spaces or tabs or empty. -+ if theLine =~ "^[ \t]*$" -+ return 0 -+ endif -+ -+ "if the line is part of a sexy comment then just flag it... -+ if s:IsInSexyComment(a:lineNum) -+ return 0 -+ endif -+ -+ let isCommented = s:IsCommentedNormOrSexy(a:lineNum) -+ -+ "if the line isnt commented return true -+ if !isCommented -+ return 1 -+ endif -+ -+ "if the line is commented but nesting is allowed then return true -+ if a:forceNested && (!s:Multipart() || g:NERDUsePlaceHolders) -+ return 1 -+ endif -+ -+ return 0 -+endfunction -+ -+" Function: s:CanPlaceCursor(line, col) {{{2 -+" returns 1 if the cursor can be placed exactly in the given position -+function s:CanPlaceCursor(line, col) -+ let c = col(".") -+ let l = line(".") -+ call cursor(a:line, a:col) -+ let success = (line(".") == a:line && col(".") == a:col) -+ call cursor(l,c) -+ return success -+endfunction -+ -+" Function: s:CanSexyCommentLines(topline, bottomline) {{{2 -+" Return: 1 if the given lines can be commented sexually, 0 otherwise -+function s:CanSexyCommentLines(topline, bottomline) -+ " see if the selected regions have any sexy comments -+ let currentLine = a:topline -+ while(currentLine <= a:bottomline) -+ if s:IsInSexyComment(currentLine) -+ return 0 -+ endif -+ let currentLine = currentLine + 1 -+ endwhile -+ return 1 -+endfunction -+" Function: s:CanToggleCommentLine(forceNested, line) {{{2 -+"This function is used to determine whether the given line can be toggle commented. -+"It returns 1 if it can be and 0 otherwise -+" -+" Args: -+" -lineNum: the line num of the line to check for commentability -+function s:CanToggleCommentLine(forceNested, lineNum) -+ let theLine = getline(a:lineNum) -+ if (s:IsCommentedFromStartOfLine(b:left, theLine) || s:IsCommentedFromStartOfLine(b:leftAlt, theLine)) && !a:forceNested -+ return 0 -+ endif -+ -+ " make sure we don't comment lines that are just spaces or tabs or empty. -+ if theLine =~ "^[ \t]*$" -+ return 0 -+ endif -+ -+ "if the line is part of a sexy comment then just flag it... -+ if s:IsInSexyComment(a:lineNum) -+ return 0 -+ endif -+ -+ return 1 -+endfunction -+ -+" Function: s:ConvertLeadingSpacesToTabs(line) {{{2 -+" This function takes a line and converts all leading tabs on that line into -+" spaces -+" -+" Args: -+" -line: the line whose leading tabs will be converted -+function s:ConvertLeadingSpacesToTabs(line) -+ let toReturn = a:line -+ while toReturn =~ '^\t*' . s:TabSpace() . '\(.*\)$' -+ let toReturn = substitute(toReturn, '^\(\t*\)' . s:TabSpace() . '\(.*\)$' , '\1\t\2' , "") -+ endwhile -+ -+ return toReturn -+endfunction -+ -+ -+" Function: s:ConvertLeadingTabsToSpaces(line) {{{2 -+" This function takes a line and converts all leading spaces on that line into -+" tabs -+" -+" Args: -+" -line: the line whose leading spaces will be converted -+function s:ConvertLeadingTabsToSpaces(line) -+ let toReturn = a:line -+ while toReturn =~ '^\( *\)\t' -+ let toReturn = substitute(toReturn, '^\( *\)\t', '\1' . s:TabSpace() , "") -+ endwhile -+ -+ return toReturn -+endfunction -+ -+" Function: s:ConvertLeadingWhiteSpace(line) {{{2 -+" Converts the leading white space to tabs/spaces depending on &ts -+" -+" Args: -+" -line: the line to convert -+function s:ConvertLeadingWhiteSpace(line) -+ let toReturn = a:line -+ while toReturn =~ '^ *\t' -+ let toReturn = substitute(toReturn, '^ *\zs\t\ze', s:TabSpace(), "g") -+ endwhile -+ -+ if !&expandtab -+ let toReturn = s:ConvertLeadingSpacesToTabs(toReturn) -+ endif -+ -+ return toReturn -+endfunction -+ -+ -+" Function: s:CountNonESCedOccurances(str, searchstr, escChar) {{{2 -+" This function counts the number of substrings contained in another string. -+" These substrings are only counted if they are not escaped with escChar -+" Args: -+" -str: the string to look for searchstr in -+" -searchstr: the substring to search for in str -+" -escChar: the escape character which, when preceding an instance of -+" searchstr, will cause it not to be counted -+function s:CountNonESCedOccurances(str, searchstr, escChar) -+ "get the index of the first occurrence of searchstr -+ let indx = stridx(a:str, a:searchstr) -+ -+ "if there is an instance of searchstr in str process it -+ if indx != -1 -+ "get the remainder of str after this instance of searchstr is removed -+ let lensearchstr = strlen(a:searchstr) -+ let strLeft = strpart(a:str, indx+lensearchstr) -+ -+ "if this instance of searchstr is not escaped, add one to the count -+ "and recurse. If it is escaped, just recurse -+ if !s:IsEscaped(a:str, indx, a:escChar) -+ return 1 + s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) -+ else -+ return s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) -+ endif -+ endif -+endfunction -+" Function: s:DoesBlockHaveDelim(delim, top, bottom) {{{2 -+" Returns 1 if the given block of lines has a delimiter (a:delim) in it -+" Args: -+" -delim: the comment delimiter to check the block for -+" -top: the top line number of the block -+" -bottom: the bottom line number of the block -+function s:DoesBlockHaveDelim(delim, top, bottom) -+ let currentLine = a:top -+ while currentLine < a:bottom -+ let theline = getline(currentLine) -+ if s:FindDelimiterIndex(a:delim, theline) != -1 -+ return 1 -+ endif -+ let currentLine = currentLine + 1 -+ endwhile -+ return 0 -+endfunction -+ -+" Function: s:DoesBlockHaveMultipartDelim(top, bottom) {{{2 -+" Returns 1 if the given block has a >= 1 multipart delimiter in it -+" Args: -+" -top: the top line number of the block -+" -bottom: the bottom line number of the block -+function s:DoesBlockHaveMultipartDelim(top, bottom) -+ if s:HasMultipartDelims() -+ if s:Multipart() -+ return s:DoesBlockHaveDelim(b:left, a:top, a:bottom) || s:DoesBlockHaveDelim(b:right, a:top, a:bottom) -+ else -+ return s:DoesBlockHaveDelim(b:leftAlt, a:top, a:bottom) || s:DoesBlockHaveDelim(b:rightAlt, a:top, a:bottom) -+ endif -+ endif -+ return 0 -+endfunction -+ -+ -+" Function: s:Esc(str) {{{2 -+" Escapes all the tricky chars in the given string -+function s:Esc(str) -+ let charsToEsc = '*/\."&$+' -+ return escape(a:str, charsToEsc) -+endfunction -+ -+" Function: s:FindDelimiterIndex(delimiter, line) {{{2 -+" This function is used to get the string index of the input comment delimiter -+" on the input line. If no valid comment delimiter is found in the line then -+" -1 is returned -+" Args: -+" -delimiter: the delimiter we are looking to find the index of -+" -line: the line we are looking for delimiter on -+function s:FindDelimiterIndex(delimiter, line) -+ -+ "make sure the delimiter isnt empty otherwise we go into an infinite loop. -+ if a:delimiter == "" -+ return -1 -+ endif -+ -+ -+ let l:delimiter = a:delimiter -+ let lenDel = strlen(l:delimiter) -+ -+ "get the index of the first occurrence of the delimiter -+ let delIndx = stridx(a:line, l:delimiter) -+ -+ "keep looping thru the line till we either find a real comment delimiter -+ "or run off the EOL -+ while delIndx != -1 -+ -+ "if we are not off the EOL get the str before the possible delimiter -+ "in question and check if it really is a delimiter. If it is, return -+ "its position -+ if delIndx != -1 -+ if s:IsDelimValid(l:delimiter, delIndx, a:line) -+ return delIndx -+ endif -+ endif -+ -+ "we have not yet found a real comment delimiter so move past the -+ "current one we are lookin at -+ let restOfLine = strpart(a:line, delIndx + lenDel) -+ let distToNextDelim = stridx(restOfLine , l:delimiter) -+ -+ "if distToNextDelim is -1 then there is no more potential delimiters -+ "on the line so set delIndx to -1. Otherwise, move along the line by -+ "distToNextDelim -+ if distToNextDelim == -1 -+ let delIndx = -1 -+ else -+ let delIndx = delIndx + lenDel + distToNextDelim -+ endif -+ endwhile -+ -+ "there is no comment delimiter on this line -+ return -1 -+endfunction -+ -+" Function: s:FindBoundingLinesOfSexyCom(lineNum) {{{2 -+" This function takes in a line number and tests whether this line number is -+" the top/bottom/middle line of a sexy comment. If it is then the top/bottom -+" lines of the sexy comment are returned -+" Args: -+" -lineNum: the line number that is to be tested whether it is the -+" top/bottom/middle line of a sexy com -+" Returns: -+" A string that has the top/bottom lines of the sexy comment encoded in it. -+" The format is 'topline,bottomline'. If a:lineNum turns out not to be the -+" top/bottom/middle of a sexy comment then -1 is returned -+function s:FindBoundingLinesOfSexyCom(lineNum) -+ -+ "find which delimiters to look for as the start/end delims of the comment -+ let left = '' -+ let right = '' -+ if s:Multipart() -+ let left = s:GetLeft(0,0,1) -+ let right = s:GetRight(0,0,1) -+ elseif s:AltMultipart() -+ let left = s:GetLeft(1,0,1) -+ let right = s:GetRight(1,0,1) -+ else -+ return [] -+ endif -+ -+ let sexyComMarker = s:GetSexyComMarker(0, 1) -+ -+ "initialise the top/bottom line numbers of the sexy comment to -1 -+ let top = -1 -+ let bottom = -1 -+ -+ let currentLine = a:lineNum -+ while top == -1 || bottom == -1 -+ let theLine = getline(currentLine) -+ -+ "check if the current line is the top of the sexy comment -+ if theLine =~ '^[ \t]*' . left && theLine !~ '.*' . right -+ let top = currentLine -+ let currentLine = a:lineNum -+ -+ "check if the current line is the bottom of the sexy comment -+ elseif theLine =~ '^[ \t]*' . right && theLine !~ '.*' . left -+ let bottom = currentLine -+ -+ "the right delimiter is on the same line as the last sexyComMarker -+ elseif theLine =~ '^[ \t]*' . sexyComMarker . '.*' . right -+ let bottom = currentLine -+ -+ "we have not found the top or bottom line so we assume currentLine is an -+ "intermediate line and look to prove otherwise -+ else -+ -+ "if the line doesnt start with a sexyComMarker then it is not a sexy -+ "comment -+ if theLine !~ '^[ \t]*' . sexyComMarker -+ return [] -+ endif -+ -+ endif -+ -+ "if top is -1 then we havent found the top yet so keep looking up -+ if top == -1 -+ let currentLine = currentLine - 1 -+ "if we have found the top line then go down looking for the bottom -+ else -+ let currentLine = currentLine + 1 -+ endif -+ -+ endwhile -+ -+ return [top, bottom] -+endfunction -+ -+ -+" Function: s:GetLeft(alt, space, esc) {{{2 -+" returns the left/left-alternative delimiter -+" Args: -+" -alt: specifies whether to get left or left-alternative delim -+" -space: specifies whether the delim should be spaced or not -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the delim should be ESCed -+function s:GetLeft(alt, space, esc) -+ let delim = b:left -+ -+ if a:alt -+ if b:leftAlt == '' -+ return '' -+ else -+ let delim = b:leftAlt -+ endif -+ endif -+ if delim == '' -+ return '' -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let delim = delim . s:spaceStr -+ endif -+ -+ if a:esc -+ let delim = s:Esc(delim) -+ endif -+ -+ return delim -+endfunction -+ -+" Function: s:GetRight(alt, space, esc) {{{2 -+" returns the right/right-alternative delimiter -+" Args: -+" -alt: specifies whether to get right or right-alternative delim -+" -space: specifies whether the delim should be spaced or not -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the delim should be ESCed -+function s:GetRight(alt, space, esc) -+ let delim = b:right -+ -+ if a:alt -+ if !s:AltMultipart() -+ return '' -+ else -+ let delim = b:rightAlt -+ endif -+ endif -+ if delim == '' -+ return '' -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let delim = s:spaceStr . delim -+ endif -+ -+ if a:esc -+ let delim = s:Esc(delim) -+ endif -+ -+ return delim -+endfunction -+ -+ -+" Function: s:GetSexyComMarker() {{{2 -+" Returns the sexy comment marker for the current filetype. -+" -+" C style sexy comments are assumed if possible. If not then the sexy comment -+" marker is the last char of the delimiter pair that has both left and right -+" delims and has the longest left delim -+" -+" Args: -+" -space: specifies whether the marker is to have a space string after it -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the marker are to be ESCed -+function s:GetSexyComMarker(space, esc) -+ let sexyComMarker = b:sexyComMarker -+ -+ "if there is no hardcoded marker then we find one -+ if sexyComMarker == '' -+ -+ "if the filetype has c style comments then use standard c sexy -+ "comments -+ if s:HasCStyleComments() -+ let sexyComMarker = '*' -+ else -+ "find a comment marker by getting the longest available left delim -+ "(that has a corresponding right delim) and taking the last char -+ let lenLeft = strlen(b:left) -+ let lenLeftAlt = strlen(b:leftAlt) -+ let left = '' -+ let right = '' -+ if s:Multipart() && lenLeft >= lenLeftAlt -+ let left = b:left -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ else -+ return -1 -+ endif -+ -+ "get the last char of left -+ let sexyComMarker = strpart(left, strlen(left)-1) -+ endif -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let sexyComMarker = sexyComMarker . s:spaceStr -+ endif -+ -+ if a:esc -+ let sexyComMarker = s:Esc(sexyComMarker) -+ endif -+ -+ return sexyComMarker -+endfunction -+ -+" Function: s:GetSexyComLeft(space, esc) {{{2 -+" Returns the left delimiter for sexy comments for this filetype or -1 if -+" there is none. C style sexy comments are used if possible -+" Args: -+" -space: specifies if the delim has a space string on the end -+" (the space string will only be added if NERDSpaceDelims is set) -+" -esc: specifies whether the tricky chars in the string are ESCed -+function s:GetSexyComLeft(space, esc) -+ let lenLeft = strlen(b:left) -+ let lenLeftAlt = strlen(b:leftAlt) -+ let left = '' -+ -+ "assume c style sexy comments if possible -+ if s:HasCStyleComments() -+ let left = '/*' -+ else -+ "grab the longest left delim that has a right -+ if s:Multipart() && lenLeft >= lenLeftAlt -+ let left = b:left -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ else -+ return -1 -+ endif -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let left = left . s:spaceStr -+ endif -+ -+ if a:esc -+ let left = s:Esc(left) -+ endif -+ -+ return left -+endfunction -+ -+" Function: s:GetSexyComRight(space, esc) {{{2 -+" Returns the right delimiter for sexy comments for this filetype or -1 if -+" there is none. C style sexy comments are used if possible. -+" Args: -+" -space: specifies if the delim has a space string on the start -+" (the space string will only be added if NERDSpaceDelims -+" is specified for the current filetype) -+" -esc: specifies whether the tricky chars in the string are ESCed -+function s:GetSexyComRight(space, esc) -+ let lenLeft = strlen(b:left) -+ let lenLeftAlt = strlen(b:leftAlt) -+ let right = '' -+ -+ "assume c style sexy comments if possible -+ if s:HasCStyleComments() -+ let right = '*/' -+ else -+ "grab the right delim that pairs with the longest left delim -+ if s:Multipart() && lenLeft >= lenLeftAlt -+ let right = b:right -+ elseif s:AltMultipart() -+ let right = b:rightAlt -+ else -+ return -1 -+ endif -+ endif -+ -+ if a:space && g:NERDSpaceDelims -+ let right = s:spaceStr . right -+ endif -+ -+ if a:esc -+ let right = s:Esc(right) -+ endif -+ -+ return right -+endfunction -+ -+" Function: s:HasMultipartDelims() {{{2 -+" Returns 1 iff the current filetype has at least one set of multipart delims -+function s:HasMultipartDelims() -+ return s:Multipart() || s:AltMultipart() -+endfunction -+ -+" Function: s:HasLeadingTabs(...) {{{2 -+" Returns 1 if any of the given strings have leading tabs -+function s:HasLeadingTabs(...) -+ for s in a:000 -+ if s =~ '^\t.*' -+ return 1 -+ end -+ endfor -+ return 0 -+endfunction -+" Function: s:HasCStyleComments() {{{2 -+" Returns 1 iff the current filetype has c style comment delimiters -+function s:HasCStyleComments() -+ return (b:left == '/*' && b:right == '*/') || (b:leftAlt == '/*' && b:rightAlt == '*/') -+endfunction -+ -+" Function: s:InstallDocumentation(full_name, revision) {{{2 -+" Install help documentation. -+" Arguments: -+" full_name: Full name of this vim plugin script, including path name. -+" revision: Revision of the vim script. #version# mark in the document file -+" will be replaced with this string with 'v' prefix. -+" Return: -+" 1 if new document installed, 0 otherwise. -+" Note: Cleaned and generalized by guo-peng Wen. -+" -+" Note about authorship: this function was taken from the vimspell plugin -+" which can be found at http://www.vim.org/scripts/script.php?script_id=465 -+" -+function s:InstallDocumentation(full_name, revision) -+ " Name of the document path based on the system we use: -+ if has("vms") -+ " No chance that this script will work with -+ " VMS - to much pathname juggling here. -+ return 1 -+ elseif (has("unix")) -+ " On UNIX like system, using forward slash: -+ let l:slash_char = '/' -+ let l:mkdir_cmd = ':silent !mkdir -p ' -+ else -+ " On M$ system, use backslash. Also mkdir syntax is different. -+ " This should only work on W2K and up. -+ let l:slash_char = '\' -+ let l:mkdir_cmd = ':silent !mkdir ' -+ endif -+ -+ let l:doc_path = l:slash_char . 'doc' -+ let l:doc_home = l:slash_char . '.vim' . l:slash_char . 'doc' -+ -+ " Figure out document path based on full name of this script: -+ let l:vim_plugin_path = fnamemodify(a:full_name, ':h') -+ let l:vim_doc_path = fnamemodify(a:full_name, ':h:h') . l:doc_path -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ "Doc path: " . l:vim_doc_path -+ call s:NerdEcho("Doc path: " . l:vim_doc_path, 0) -+ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ " Try a default configuration in user home: -+ let l:vim_doc_path = expand("~") . l:doc_home -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ execute l:mkdir_cmd . '"' . l:vim_doc_path . '"' -+ if (!(filewritable(l:vim_doc_path) == 2)) -+ " Put a warning: -+ call s:NerdEcho("Unable to open documentation directory \ntype :help add-local-help for more information.", 0) -+ echo l:vim_doc_path -+ return 0 -+ endif -+ endif -+ endif -+ endif -+ -+ " Exit if we have problem to access the document directory: -+ if (!isdirectory(l:vim_plugin_path) || !isdirectory(l:vim_doc_path) || filewritable(l:vim_doc_path) != 2) -+ return 0 -+ endif -+ -+ " Full name of script and documentation file: -+ let l:script_name = fnamemodify(a:full_name, ':t') -+ let l:doc_name = fnamemodify(a:full_name, ':t:r') . '.txt' -+ let l:plugin_file = l:vim_plugin_path . l:slash_char . l:script_name -+ let l:doc_file = l:vim_doc_path . l:slash_char . l:doc_name -+ -+ " Bail out if document file is still up to date: -+ if (filereadable(l:doc_file) && getftime(l:plugin_file) < getftime(l:doc_file)) -+ return 0 -+ endif -+ -+ " Prepare window position restoring command: -+ if (strlen(@%)) -+ let l:go_back = 'b ' . bufnr("%") -+ else -+ let l:go_back = 'enew!' -+ endif -+ -+ " Create a new buffer & read in the plugin file (me): -+ setl nomodeline -+ exe 'enew!' -+ exe 'r ' . escape(l:plugin_file,s:NERDFileNameEscape) -+ -+ setl modeline -+ let l:buf = bufnr("%") -+ setl noswapfile modifiable -+ -+ norm zR -+ norm gg -+ -+ " Delete from first line to a line starts with -+ " === START_DOC -+ 1,/^=\{3,}\s\+START_DOC\C/ d -+ -+ " Delete from a line starts with -+ " === END_DOC -+ " to the end of the documents: -+ /^=\{3,}\s\+END_DOC\C/,$ d -+ -+ " Remove fold marks: -+ :%s/{\{3}[1-9]/ / -+ -+ " Add modeline for help doc: the modeline string is mangled intentionally -+ " to avoid it be recognized by VIM: -+ call append(line('$'), '') -+ call append(line('$'), ' v' . 'im:tw=78:ts=8:ft=help:norl:') -+ -+ " Replace revision: -+ "exe "normal :1s/#version#/ v" . a:revision . "/\" -+ exe "normal :%s/#version#/ v" . a:revision . "/\" -+ -+ " Save the help document: -+ exe 'w! ' . escape(l:doc_file,s:NERDFileNameEscape) -+ exe l:go_back -+ exe 'bw ' . l:buf -+ -+ " Build help tags: -+ exe 'helptags ' . escape(l:vim_doc_path,s:NERDFileNameEscape) -+ -+ return 1 -+endfunction -+ -+ -+" Function: s:IsCommentedNormOrSexy(lineNum) {{{2 -+"This function is used to determine whether the given line is commented with -+"either set of delimiters or if it is part of a sexy comment -+" -+" Args: -+" -lineNum: the line number of the line to check -+function s:IsCommentedNormOrSexy(lineNum) -+ let theLine = getline(a:lineNum) -+ -+ "if the line is commented normally return 1 -+ if s:IsCommented(b:left, b:right, theLine) || s:IsCommented(b:leftAlt, b:rightAlt, theLine) -+ return 1 -+ endif -+ -+ "if the line is part of a sexy comment return 1 -+ if s:IsInSexyComment(a:lineNum) -+ return 1 -+ endif -+ return 0 -+endfunction -+ -+" Function: s:IsCommented(left, right, line) {{{2 -+"This function is used to determine whether the given line is commented with -+"the given delimiters -+" -+" Args: -+" -line: the line that to check if commented -+" -left/right: the left and right delimiters to check for -+function s:IsCommented(left, right, line) -+ "if the line isnt commented return true -+ if s:FindDelimiterIndex(a:left, a:line) != -1 && (s:FindDelimiterIndex(a:right, a:line) != -1 || !s:Multipart()) -+ return 1 -+ endif -+ return 0 -+endfunction -+ -+" Function: s:IsCommentedFromStartOfLine(left, line) {{{2 -+"This function is used to determine whether the given line is commented with -+"the given delimiters at the start of the line i.e the left delimiter is the -+"first thing on the line (apart from spaces\tabs) -+" -+" Args: -+" -line: the line that to check if commented -+" -left: the left delimiter to check for -+function s:IsCommentedFromStartOfLine(left, line) -+ let theLine = s:ConvertLeadingTabsToSpaces(a:line) -+ let numSpaces = strlen(substitute(theLine, '^\( *\).*$', '\1', '')) -+ let delimIndx = s:FindDelimiterIndex(a:left, theLine) -+ return delimIndx == numSpaces -+endfunction -+ -+" Function: s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) {{{2 -+" Finds the type of the outtermost delims on the line -+" -+" Args: -+" -line: the line that to check if the outtermost comments on it are -+" left/right -+" -left/right: the left and right delimiters to check for -+" -leftAlt/rightAlt: the left and right alternative delimiters to check for -+" -+" Returns: -+" 0 if the line is not commented with either set of delims -+" 1 if the line is commented with the left/right delim set -+" 2 if the line is commented with the leftAlt/rightAlt delim set -+function s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) -+ "get the first positions of the left delims and the last positions of the -+ "right delims -+ let indxLeft = s:FindDelimiterIndex(a:left, a:line) -+ let indxLeftAlt = s:FindDelimiterIndex(a:leftAlt, a:line) -+ let indxRight = s:LastIndexOfDelim(a:right, a:line) -+ let indxRightAlt = s:LastIndexOfDelim(a:rightAlt, a:line) -+ -+ "check if the line has a left delim before a leftAlt delim -+ if (indxLeft <= indxLeftAlt || indxLeftAlt == -1) && indxLeft != -1 -+ "check if the line has a right delim after any rightAlt delim -+ if (indxRight > indxRightAlt && indxRight > indxLeft) || !s:Multipart() -+ return 1 -+ endif -+ -+ "check if the line has a leftAlt delim before a left delim -+ elseif (indxLeftAlt <= indxLeft || indxLeft == -1) && indxLeftAlt != -1 -+ "check if the line has a rightAlt delim after any right delim -+ if (indxRightAlt > indxRight && indxRightAlt > indxLeftAlt) || !s:AltMultipart() -+ return 2 -+ endif -+ else -+ return 0 -+ endif -+ -+ return 0 -+ -+endfunction -+ -+ -+" Function: s:IsDelimValid(delimiter, delIndx, line) {{{2 -+" This function is responsible for determining whether a given instance of a -+" comment delimiter is a real delimiter or not. For example, in java the -+" // string is a comment delimiter but in the line: -+" System.out.println("//"); -+" it does not count as a comment delimiter. This function is responsible for -+" distinguishing between such cases. It does so by applying a set of -+" heuristics that are not fool proof but should work most of the time. -+" -+" Args: -+" -delimiter: the delimiter we are validating -+" -delIndx: the position of delimiter in line -+" -line: the line that delimiter occurs in -+" -+" Returns: -+" 0 if the given delimiter is not a real delimiter (as far as we can tell) , -+" 1 otherwise -+function s:IsDelimValid(delimiter, delIndx, line) -+ "get the delimiter without the escchars -+ let l:delimiter = a:delimiter -+ -+ "get the strings before and after the delimiter -+ let preComStr = strpart(a:line, 0, a:delIndx) -+ let postComStr = strpart(a:line, a:delIndx+strlen(delimiter)) -+ -+ "to check if the delimiter is real, make sure it isnt preceded by -+ "an odd number of quotes and followed by the same (which would indicate -+ "that it is part of a string and therefore is not a comment) -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, '"', "\\")) -+ return 0 -+ endif -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "'", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "'", "\\")) -+ return 0 -+ endif -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "`", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "`", "\\")) -+ return 0 -+ endif -+ -+ -+ "if the comment delimiter is escaped, assume it isnt a real delimiter -+ if s:IsEscaped(a:line, a:delIndx, "\\") -+ return 0 -+ endif -+ -+ "vim comments are so fuckin stupid!! Why the hell do they have comment -+ "delimiters that are used elsewhere in the syntax?!?! We need to check -+ "some conditions especially for vim -+ if &filetype == "vim" -+ if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) -+ return 0 -+ endif -+ -+ "if the delimiter is on the very first char of the line or is the -+ "first non-tab/space char on the line then it is a valid comment delimiter -+ if a:delIndx == 0 || a:line =~ "^[ \t]\\{" . a:delIndx . "\\}\".*$" -+ return 1 -+ endif -+ -+ let numLeftParen =s:CountNonESCedOccurances(preComStr, "(", "\\") -+ let numRightParen =s:CountNonESCedOccurances(preComStr, ")", "\\") -+ -+ "if the quote is inside brackets then assume it isnt a comment -+ if numLeftParen > numRightParen -+ return 0 -+ endif -+ -+ "if the line has an even num of unescaped "'s then we can assume that -+ "any given " is not a comment delimiter -+ if s:IsNumEven(s:CountNonESCedOccurances(a:line, "\"", "\\")) -+ return 0 -+ endif -+ endif -+ -+ return 1 -+ -+endfunction -+ -+" Function: s:IsNumEven(num) {{{2 -+" A small function the returns 1 if the input number is even and 0 otherwise -+" Args: -+" -num: the number to check -+function s:IsNumEven(num) -+ return (a:num % 2) == 0 -+endfunction -+ -+" Function: s:IsEscaped(str, indx, escChar) {{{2 -+" This function takes a string, an index into that string and an esc char and -+" returns 1 if the char at the index is escaped (i.e if it is preceded by an -+" odd number of esc chars) -+" Args: -+" -str: the string to check -+" -indx: the index into str that we want to check -+" -escChar: the escape char the char at indx may be ESCed with -+function s:IsEscaped(str, indx, escChar) -+ "initialise numEscChars to 0 and look at the char before indx -+ let numEscChars = 0 -+ let curIndx = a:indx-1 -+ -+ "keep going back thru str until we either reach the start of the str or -+ "run out of esc chars -+ while curIndx >= 0 && strpart(a:str, curIndx, 1) == a:escChar -+ -+ "we have found another esc char so add one to the count and move left -+ "one char -+ let numEscChars = numEscChars + 1 -+ let curIndx = curIndx - 1 -+ -+ endwhile -+ -+ "if there is an odd num of esc chars directly before the char at indx then -+ "the char at indx is escaped -+ return !s:IsNumEven(numEscChars) -+endfunction -+ -+" Function: s:IsInSexyComment(line) {{{2 -+" returns 1 if the given line number is part of a sexy comment -+function s:IsInSexyComment(line) -+ return !empty(s:FindBoundingLinesOfSexyCom(a:line)) -+endfunction -+ -+" Function: s:IsSexyComment(topline, bottomline) {{{2 -+" This function takes in 2 line numbers and returns 1 if the lines between and -+" including the given line numbers are a sexy comment. It returns 0 otherwise. -+" Args: -+" -topline: the line that the possible sexy comment starts on -+" -bottomline: the line that the possible sexy comment stops on -+function s:IsSexyComment(topline, bottomline) -+ -+ "get the delim set that would be used for a sexy comment -+ let left = '' -+ let right = '' -+ if s:Multipart() -+ let left = b:left -+ let right = b:right -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ let right = b:rightAlt -+ else -+ return 0 -+ endif -+ -+ "swap the top and bottom line numbers around if need be -+ let topline = a:topline -+ let bottomline = a:bottomline -+ if bottomline < topline -+ topline = bottomline -+ bottomline = a:topline -+ endif -+ -+ "if there is < 2 lines in the comment it cannot be sexy -+ if (bottomline - topline) <= 0 -+ return 0 -+ endif -+ -+ "if the top line doesnt begin with a left delim then the comment isnt sexy -+ if getline(a:topline) !~ '^[ \t]*' . left -+ return 0 -+ endif -+ -+ "if there is a right delim on the top line then this isnt a sexy comment -+ if s:FindDelimiterIndex(right, getline(a:topline)) != -1 -+ return 0 -+ endif -+ -+ "if there is a left delim on the bottom line then this isnt a sexy comment -+ if s:FindDelimiterIndex(left, getline(a:bottomline)) != -1 -+ return 0 -+ endif -+ -+ "if the bottom line doesnt begin with a right delim then the comment isnt -+ "sexy -+ if getline(a:bottomline) !~ '^.*' . right . '$' -+ return 0 -+ endif -+ -+ let sexyComMarker = s:GetSexyComMarker(0, 1) -+ -+ "check each of the intermediate lines to make sure they start with a -+ "sexyComMarker -+ let currentLine = a:topline+1 -+ while currentLine < a:bottomline -+ let theLine = getline(currentLine) -+ -+ if theLine !~ '^[ \t]*' . sexyComMarker -+ return 0 -+ endif -+ -+ "if there is a right delim in an intermediate line then the block isnt -+ "a sexy comment -+ if s:FindDelimiterIndex(right, theLine) != -1 -+ return 0 -+ endif -+ -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ "we have not found anything to suggest that this isnt a sexy comment so -+ return 1 -+ -+endfunction -+ -+" Function: s:LastIndexOfDelim(delim, str) {{{2 -+" This function takes a string and a delimiter and returns the last index of -+" that delimiter in string -+" Args: -+" -delim: the delimiter to look for -+" -str: the string to look for delim in -+function s:LastIndexOfDelim(delim, str) -+ let delim = a:delim -+ let lenDelim = strlen(delim) -+ -+ "set index to the first occurrence of delim. If there is no occurrence then -+ "bail -+ let indx = s:FindDelimiterIndex(delim, a:str) -+ if indx == -1 -+ return -1 -+ endif -+ -+ "keep moving to the next instance of delim in str till there is none left -+ while 1 -+ -+ "search for the next delim after the previous one -+ let searchStr = strpart(a:str, indx+lenDelim) -+ let indx2 = s:FindDelimiterIndex(delim, searchStr) -+ -+ "if we find a delim update indx to record the position of it, if we -+ "dont find another delim then indx is the last one so break out of -+ "this loop -+ if indx2 != -1 -+ let indx = indx + indx2 + lenDelim -+ else -+ break -+ endif -+ endwhile -+ -+ return indx -+ -+endfunction -+ -+" Function: s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 -+" This function takes in 2 line numbers and returns the index of the left most -+" char (that is not a space or a tab) on all of these lines. -+" Args: -+" -countCommentedLines: 1 if lines that are commented are to be checked as -+" well. 0 otherwise -+" -countEmptyLines: 1 if empty lines are to be counted in the search -+" -topline: the top line to be checked -+" -bottomline: the bottom line to be checked -+function s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) -+ -+ " declare the left most index as an extreme value -+ let leftMostIndx = 1000 -+ -+ " go thru the block line by line updating leftMostIndx -+ let currentLine = a:topline -+ while currentLine <= a:bottomline -+ -+ " get the next line and if it is allowed to be commented, or is not -+ " commented, check it -+ let theLine = getline(currentLine) -+ if a:countEmptyLines || theLine !~ '^[ \t]*$' -+ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) -+ " convert spaces to tabs and get the number of leading spaces for -+ " this line and update leftMostIndx if need be -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let leadSpaceOfLine = strlen( substitute(theLine, '\(^[ \t]*\).*$','\1','') ) -+ if leadSpaceOfLine < leftMostIndx -+ let leftMostIndx = leadSpaceOfLine -+ endif -+ endif -+ endif -+ -+ " move on to the next line -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ if leftMostIndx == 1000 -+ return 0 -+ else -+ return leftMostIndx -+ endif -+endfunction -+ -+" Function: s:Multipart() {{{2 -+" returns 1 if the current delims are multipart -+function s:Multipart() -+ return b:right != '' -+endfunction -+ -+" Function: s:NerdEcho(msg, typeOfMsg) {{{2 -+" Args: -+" -msg: the message to echo -+" -typeOfMsg: 0 = warning message -+" 1 = normal message -+function s:NerdEcho(msg, typeOfMsg) -+ if a:typeOfMsg == 0 -+ echohl WarningMsg -+ echo 'NERDCommenter:' . a:msg -+ echohl None -+ elseif a:typeOfMsg == 1 -+ echo 'NERDCommenter:' . a:msg -+ endif -+endfunction -+ -+" Function: s:NumberOfLeadingTabs(s) {{{2 -+" returns the number of leading tabs in the given string -+function s:NumberOfLeadingTabs(s) -+ return strlen(substitute(a:s, '^\(\t*\).*$', '\1', "")) -+endfunction -+ -+" Function: s:NumLinesInBuf() {{{2 -+" Returns the number of lines in the current buffer -+function s:NumLinesInBuf() -+ return line('$') -+endfunction -+ -+" Function: s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) {{{2 -+" This function takes in a string, 2 delimiters in that string and 2 strings -+" to replace these delimiters with. -+" -+" Args: -+" -toReplace1: the first delimiter to replace -+" -toReplace2: the second delimiter to replace -+" -replacor1: the string to replace toReplace1 with -+" -replacor2: the string to replace toReplace2 with -+" -str: the string that the delimiters to be replaced are in -+function s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) -+ let line = s:ReplaceLeftMostDelim(a:toReplace1, a:replacor1, a:str) -+ let line = s:ReplaceRightMostDelim(a:toReplace2, a:replacor2, line) -+ return line -+endfunction -+ -+" Function: s:ReplaceLeftMostDelim(toReplace, replacor, str) {{{2 -+" This function takes a string and a delimiter and replaces the left most -+" occurrence of this delimiter in the string with a given string -+" -+" Args: -+" -toReplace: the delimiter in str that is to be replaced -+" -replacor: the string to replace toReplace with -+" -str: the string that contains toReplace -+function s:ReplaceLeftMostDelim(toReplace, replacor, str) -+ let toReplace = a:toReplace -+ let replacor = a:replacor -+ "get the left most occurrence of toReplace -+ let indxToReplace = s:FindDelimiterIndex(toReplace, a:str) -+ -+ "if there IS an occurrence of toReplace in str then replace it and return -+ "the resulting string -+ if indxToReplace != -1 -+ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) -+ return line -+ endif -+ -+ return a:str -+endfunction -+ -+" Function: s:ReplaceRightMostDelim(toReplace, replacor, str) {{{2 -+" This function takes a string and a delimiter and replaces the right most -+" occurrence of this delimiter in the string with a given string -+" -+" Args: -+" -toReplace: the delimiter in str that is to be replaced -+" -replacor: the string to replace toReplace with -+" -str: the string that contains toReplace -+" -+function s:ReplaceRightMostDelim(toReplace, replacor, str) -+ let toReplace = a:toReplace -+ let replacor = a:replacor -+ let lenToReplace = strlen(toReplace) -+ -+ "get the index of the last delim in str -+ let indxToReplace = s:LastIndexOfDelim(toReplace, a:str) -+ -+ "if there IS a delimiter in str, replace it and return the result -+ let line = a:str -+ if indxToReplace != -1 -+ let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) -+ endif -+ return line -+endfunction -+ -+"FUNCTION: s:RestoreScreenState() {{{2 -+" -+"Sets the screen state back to what it was when s:SaveScreenState was last -+"called. -+" -+function s:RestoreScreenState() -+ if !exists("t:NERDComOldTopLine") || !exists("t:NERDComOldPos") -+ throw 'NERDCommenter exception: cannot restore screen' -+ endif -+ -+ call cursor(t:NERDComOldTopLine, 0) -+ normal zt -+ call setpos(".", t:NERDComOldPos) -+endfunction -+ -+" Function: s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 -+" This function takes in 2 line numbers and returns the index of the right most -+" char on all of these lines. -+" Args: -+" -countCommentedLines: 1 if lines that are commented are to be checked as -+" well. 0 otherwise -+" -countEmptyLines: 1 if empty lines are to be counted in the search -+" -topline: the top line to be checked -+" -bottomline: the bottom line to be checked -+function s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) -+ let rightMostIndx = -1 -+ -+ " go thru the block line by line updating rightMostIndx -+ let currentLine = a:topline -+ while currentLine <= a:bottomline -+ -+ " get the next line and see if it is commentable, otherwise it doesnt -+ " count -+ let theLine = getline(currentLine) -+ if a:countEmptyLines || theLine !~ '^[ \t]*$' -+ -+ if a:countCommentedLines || (!s:IsCommented(b:left, b:right, theLine) && !s:IsCommented(b:leftAlt, b:rightAlt, theLine)) -+ -+ " update rightMostIndx if need be -+ let theLine = s:ConvertLeadingTabsToSpaces(theLine) -+ let lineLen = strlen(theLine) -+ if lineLen > rightMostIndx -+ let rightMostIndx = lineLen -+ endif -+ endif -+ endif -+ -+ " move on to the next line -+ let currentLine = currentLine + 1 -+ endwhile -+ -+ return rightMostIndx -+endfunction -+ -+"FUNCTION: s:SaveScreenState() {{{2 -+"Saves the current cursor position in the current buffer and the window -+"scroll position -+function s:SaveScreenState() -+ let t:NERDComOldPos = getpos(".") -+ let t:NERDComOldTopLine = line("w0") -+endfunction -+ -+" Function: s:SwapOutterMultiPartDelimsForPlaceHolders(line) {{{2 -+" This function takes a line and swaps the outter most multi-part delims for -+" place holders -+" Args: -+" -line: the line to swap the delims in -+" -+function s:SwapOutterMultiPartDelimsForPlaceHolders(line) -+ " find out if the line is commented using normal delims and/or -+ " alternate ones -+ let isCommented = s:IsCommented(b:left, b:right, a:line) -+ let isCommentedAlt = s:IsCommented(b:leftAlt, b:rightAlt, a:line) -+ -+ let line2 = a:line -+ -+ "if the line is commented and there is a right delimiter, replace -+ "the delims with place-holders -+ if isCommented && s:Multipart() -+ let line2 = s:ReplaceDelims(b:left, b:right, g:NERDLPlace, g:NERDRPlace, a:line) -+ -+ "similarly if the line is commented with the alternative -+ "delimiters -+ elseif isCommentedAlt && s:AltMultipart() -+ let line2 = s:ReplaceDelims(b:leftAlt, b:rightAlt, g:NERDLPlace, g:NERDRPlace, a:line) -+ endif -+ -+ return line2 -+endfunction -+ -+" Function: s:SwapOutterPlaceHoldersForMultiPartDelims(line) {{{2 -+" This function takes a line and swaps the outtermost place holders for -+" multi-part delims -+" Args: -+" -line: the line to swap the delims in -+" -+function s:SwapOutterPlaceHoldersForMultiPartDelims(line) -+ let left = '' -+ let right = '' -+ if s:Multipart() -+ let left = b:left -+ let right = b:right -+ elseif s:AltMultipart() -+ let left = b:leftAlt -+ let right = b:rightAlt -+ endif -+ -+ let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, a:line) -+ return line -+endfunction -+" Function: s:TabbedCol(line, col) {{{2 -+" Gets the col number for given line and existing col number. The new col -+" number is the col number when all leading spaces are converted to tabs -+" Args: -+" -line:the line to get the rel col for -+" -col: the abs col -+function s:TabbedCol(line, col) -+ let lineTruncated = strpart(a:line, 0, a:col) -+ let lineSpacesToTabs = substitute(lineTruncated, s:TabSpace(), '\t', 'g') -+ return strlen(lineSpacesToTabs) -+endfunction -+"FUNCTION: s:TabSpace() {{{2 -+"returns a string of spaces equal in length to &tabstop -+function s:TabSpace() -+ let tabSpace = "" -+ let spacesPerTab = &tabstop -+ while spacesPerTab > 0 -+ let tabSpace = tabSpace . " " -+ let spacesPerTab = spacesPerTab - 1 -+ endwhile -+ return tabSpace -+endfunction -+ -+" Function: s:UnEsc(str, escChar) {{{2 -+" This function removes all the escape chars from a string -+" Args: -+" -str: the string to remove esc chars from -+" -escChar: the escape char to be removed -+function s:UnEsc(str, escChar) -+ return substitute(a:str, a:escChar, "", "g") -+endfunction -+ -+" Function: s:UntabbedCol(line, col) {{{2 -+" Takes a line and a col and returns the absolute column of col taking into -+" account that a tab is worth 3 or 4 (or whatever) spaces. -+" Args: -+" -line:the line to get the abs col for -+" -col: the col that doesnt take into account tabs -+function s:UntabbedCol(line, col) -+ let lineTruncated = strpart(a:line, 0, a:col) -+ let lineTabsToSpaces = substitute(lineTruncated, '\t', s:TabSpace(), 'g') -+ return strlen(lineTabsToSpaces) -+endfunction -+" Section: Comment mapping setup {{{1 -+" =========================================================================== -+" This is where the mappings calls are made that set up the commenting key -+" mappings. -+ -+" set up the mapping to switch to/from alternative delimiters -+execute 'nnoremap ' . g:NERDAltComMap . ' :call SwitchToAlternativeDelimiters(1)' -+ -+" set up the mappings to comment out lines -+execute 'nnoremap ' . g:NERDComLineMap . ' :call NERDComment(0, "norm")' -+execute 'vnoremap ' . g:NERDComLineMap . ' :call NERDComment(1, "norm")' -+ -+" set up the mappings to do toggle comments -+execute 'nnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(0, "toggle")' -+execute 'vnoremap ' . g:NERDComLineToggleMap . ' :call NERDComment(1, "toggle")' -+ -+" set up the mapp to do minimal comments -+execute 'nnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(0, "minimal")' -+execute 'vnoremap ' . g:NERDComLineMinimalMap . ' :call NERDComment(1, "minimal")' -+ -+" set up the mappings to comment out lines sexily -+execute 'nnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(0, "sexy")' -+execute 'vnoremap ' . g:NERDComLineSexyMap . ' :call NERDComment(1, "sexy")' -+ -+" set up the mappings to do invert comments -+execute 'nnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(0, "invert")' -+execute 'vnoremap ' . g:NERDComLineInvertMap . ' :call NERDComment(1, "invert")' -+ -+" set up the mappings to yank then comment out lines -+execute 'nmap ' . g:NERDComLineYankMap . ' :call NERDComment(0, "yank")' -+execute 'vmap ' . g:NERDComLineYankMap . ' :call NERDComment(1, "yank")' -+ -+" set up the mappings for left aligned comments -+execute 'nnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(0, "alignLeft")' -+execute 'vnoremap ' . g:NERDComAlignLeftMap . ' :call NERDComment(1, "alignLeft")' -+ -+" set up the mappings for right aligned comments -+execute 'nnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(0, "alignRight")' -+execute 'vnoremap ' . g:NERDComAlignRightMap . ' :call NERDComment(1, "alignRight")' -+ -+" set up the mappings for left and right aligned comments -+execute 'nnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(0, "alignBoth")' -+execute 'vnoremap ' . g:NERDComAlignBothMap . ' :call NERDComment(1, "alignBoth")' -+ -+" set up the mappings to do nested comments -+execute 'nnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(0, "nested")' -+execute 'vnoremap ' . g:NERDComLineNestMap . ' :call NERDComment(1, "nested")' -+ -+" set up the mapping to uncomment a line -+execute 'nnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(0, "uncomment")' -+execute 'vnoremap ' . g:NERDUncomLineMap . ' :call NERDComment(1, "uncomment")' -+ -+" set up the mapping to comment out to the end of the line -+execute 'nnoremap ' . g:NERDComToEOLMap . ' :call NERDComment(0, "toEOL")' -+ -+" set up the mappings to append comments to the line -+execute 'nmap ' . g:NERDAppendComMap . ' :call NERDComment(0, "append")' -+ -+" set up the mappings to append comments to the line -+execute 'nmap ' . g:NERDPrependComMap . ' :call NERDComment(0, "prepend")' -+ -+" set up the mapping to insert comment delims at the cursor position in insert mode -+execute 'inoremap ' . g:NERDComInInsertMap . ' ' . ':call NERDComment(0, "insert")' -+ -+" Section: Menu item setup {{{1 -+" =========================================================================== -+"check if the user wants the menu to be displayed -+if g:NERDMenuMode != 0 -+ -+ let menuRoot = "" -+ if g:NERDMenuMode == 1 -+ let menuRoot = 'comment' -+ elseif g:NERDMenuMode == 2 -+ let menuRoot = '&comment' -+ elseif g:NERDMenuMode == 3 -+ let menuRoot = '&Plugin.&comment' -+ endif -+ -+ execute 'nmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(0, "norm")' -+ execute 'vmenu '. menuRoot .'.Comment' . escape(g:NERDComLineMap, '\') . ' :call NERDComment(1, "norm")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(0, "toggle")' -+ execute 'vmenu '. menuRoot .'.Comment\ Toggle' . escape(g:NERDComLineToggleMap, '\') . ' :call NERDComment(1, "toggle")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(0, "minimal")' -+ execute 'vmenu '. menuRoot .'.Comment\ Minimal' . escape(g:NERDComLineMinimalMap, '\') . ' :call NERDComment(1, "minimal")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(0, "nested")' -+ execute 'vmenu '. menuRoot .'.Comment\ Nested' . escape(g:NERDComLineNestMap, '\') . ' :call NERDComment(1, "nested")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ To\ EOL' . escape(g:NERDComToEOLMap, '\') . ' :call NERDComment(0, "toEOL")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(0,"invert")' -+ execute 'vmenu '. menuRoot .'.Comment\ Invert' . escape(g:NERDComLineInvertMap, '\') . ' :call NERDComment(1,"invert")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(0,"sexy")' -+ execute 'vmenu '. menuRoot .'.Comment\ Sexily' . escape(g:NERDComLineSexyMap, '\') . ' :call NERDComment(1,"sexy")' -+ -+ execute 'nmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0Y' . g:NERDComLineMap -+ execute 'vmenu '. menuRoot .'.Yank\ line(s)\ then\ comment' . escape(g:NERDComLineYankMap, '\') . ' "0ygv' . g:NERDComLineMap -+ -+ execute 'nmenu '. menuRoot .'.Append\ Comment\ to\ Line' . escape(g:NERDAppendComMap, '\') . ' :call NERDComment(0, "append")' -+ execute 'nmenu '. menuRoot .'.Prepend\ Comment\ to\ Line' . escape(g:NERDPrependComMap, '\') . ' :call NERDComment(0, "prepend")' -+ -+ execute 'menu '. menuRoot .'.-Sep- :' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(0, "alignLeft")' -+ execute 'vmenu '. menuRoot .'.Comment\ Align\ Left\ (nested)' . escape(g:NERDComAlignLeftMap, '\') . ' :call NERDComment(1, "alignLeft")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(0, "alignRight")' -+ execute 'vmenu '. menuRoot .'.Comment\ Align\ Right\ (nested)' . escape(g:NERDComAlignRightMap, '\') . ' :call NERDComment(1, "alignRight")' -+ -+ execute 'nmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(0, "alignBoth")' -+ execute 'vmenu '. menuRoot .'.Comment\ Align\ Both\ (nested)' . escape(g:NERDComAlignBothMap, '\') . ' :call NERDComment(1, "alignBoth")' -+ -+ execute 'menu '. menuRoot .'.-Sep2- :' -+ -+ execute 'menu '. menuRoot .'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(0, "uncomment")' -+ execute 'vmenu ' . menuRoot.'.Uncomment' . escape(g:NERDUncomLineMap, '\') . ' :call NERDComment(1, "uncomment")' -+ -+ execute 'menu '. menuRoot .'.-Sep3- :' -+ -+ execute 'nmenu '. menuRoot .'.Use\ Alternative\ Delimiters' . escape(g:NERDAltComMap, '\') . ' :call SwitchToAlternativeDelimiters(1)' -+ -+ -+ execute 'imenu '. menuRoot .'.Insert\ Delims' . escape(g:NERDComInInsertMap, '\') . ' :call NERDComment(0, "insert")' -+ -+ execute 'menu '. menuRoot .'.-Sep4- :' -+ -+ execute 'menu '. menuRoot .'.Help:help\ NERDCommenterContents :help NERDCommenterContents' -+endif -+ -+" Section: Doc installation call {{{1 -+silent call s:InstallDocumentation(expand(':p'), s:NERD_commenter_version) -+ -+finish -+"============================================================================= -+" Section: The help file {{{1 -+" Title {{{2 -+" ============================================================================ -+=== START_DOC -+*NERD_commenter.txt* Plugin for commenting code #version# -+ -+ -+ NERD COMMENTER REFERENCE MANUAL~ -+ -+ -+ -+ -+ -+============================================================================== -+CONTENTS {{{2 *NERDCommenterContents* -+ -+ 1.Intro...................................|NERDCommenter| -+ 2.Functionality provided..................|NERDComFunctionality| -+ 2.1 Functionality Summary.............|NERDComFunctionalitySummary| -+ 2.2 Functionality Details.............|NERDComFunctionalityDetails| -+ 2.2.1 Comment map.................|NERDComComment| -+ 2.2.2 Nested comment map..........|NERDComNestedComment| -+ 2.2.3 Toggle comment map..........|NERDComToggleComment| -+ 2.2.4 Minimal comment map.........|NERDComMinimalComment| -+ 2.2.5 Invert comment map..........|NERDComInvertComment| -+ 2.2.6 Sexy comment map............|NERDComSexyComment| -+ 2.2.7 Yank comment map............|NERDComYankComment| -+ 2.2.8 Comment to EOL map..........|NERDComEOLComment| -+ 2.2.9 Append com to line map......|NERDComAppendComment| -+ 2.2.10 Prepend com to line map....|NERDComPrependComment| -+ 2.2.11 Insert comment map.........|NERDComInsertComment| -+ 2.2.12 Use alternate delims map...|NERDComAltDelim| -+ 2.2.13 Comment aligned maps.......|NERDComAlignedComment| -+ 2.2.14 Uncomment line map.........|NERDComUncommentLine| -+ 2.3 Supported filetypes...............|NERDComFiletypes| -+ 2.4 Sexy Comments.....................|NERDComSexyComments| -+ 2.5 The NERDComment function..........|NERDComNERDComment| -+ 3.Options.................................|NERDComOptions| -+ 3.1 Options summary...................|NERDComOptionsSummary| -+ 3.2 Options details...................|NERDComOptionsDetails| -+ 3.3 Default delimiter Options.........|NERDComDefaultDelims| -+ 3.4 Key mapping Options...............|NERDComMappings| -+ 4.Issues with the script..................|NERDComIssues| -+ 4.1 Delimiter detection heuristics....|NERDComHeuristics| -+ 4.2 Nesting issues....................|NERDComNesting| -+ 5.The author..............................|NERDComAuthor| -+ 6.TODO list...............................|NERDComTodo| -+ 7.Changelog...............................|NERDComChangelog| -+ 8.Credits.................................|NERDComCredits| -+ -+============================================================================== -+1. Intro {{{2 *NERDCommenter* -+ -+The NERD commenter provides many different commenting operations and styles -+which may be invoked via key mappings and a commenting menu. These operations -+are available for most filetypes. -+ -+There are also options available that allow you to tweak the commenting engine -+to you taste. -+ -+============================================================================== -+2. Functionality provided {{{2 *NERDComFunctionality* -+ -+------------------------------------------------------------------------------ -+2.1 Functionality summary {{{3 *NERDComFunctionalitySummary* -+ -+The following key mappings are provided by default (there is also a menu -+provided that contains menu items corresponding to all the below mappings): -+ -+Most of the following mappings are for normal/visual mode only. The -+|NERDComInsertComment| mapping is for insert mode only. -+ -+[count],cc |NERDComComment| -+Comments out the current line or text selected in visual mode. -+ -+ -+[count],cn |NERDComNestedComment| -+Same as |NERDComComment| but forces nesting. -+ -+ -+[count],c |NERDComToggleComment| -+Toggles the comment state of the selected line(s). If the topmost selected -+line is commented, all selected lines are uncommented and vice versa. -+ -+ -+[count],cm |NERDComMinimalComment| -+Comments the given lines using only one set of multipart delimiters if -+possible. -+ -+ -+[count],ci |NERDComInvertComment| -+Toggles the comment state of the selected line(s) individually. Each selected -+line that is commented is uncommented and vice versa. -+ -+ -+[count],cs |NERDComSexyComment| -+Comments out the selected lines ``sexually'' -+ -+ -+[count],cy |NERDComYankComment| -+Same as |NERDComComment| except that the commented line(s) are yanked -+before commenting. -+ -+ -+,c$ |NERDComEOLComment| -+Comments the current line from the cursor to the end of line. -+ -+ -+,cA |NERDComAppendComment| -+Adds comment delimiters to the end of line and goes into insert mode between -+them. -+ -+ -+,cI |NERDComPrependComment| -+Adds comment delimiters to the start of line and goes into insert mode between -+them. -+ -+ -+ |NERDComInsertComment| -+Adds comment delimiters at the current cursor position and inserts between. -+ -+ -+,ca |NERDComAltDelim| -+Switches to the alternative set of delimiters. -+ -+ -+[count],cl -+[count],cr -+[count],cb |NERDComAlignedComment| -+Same as |NERDComComment| except that the delimiters are aligned down the -+left side (,cl), the right side (,cr) or both sides -+(,cb). -+ -+ -+[count],cu |NERDComUncommentLine| -+Uncomments the selected line(s). -+ -+------------------------------------------------------------------------------ -+2.2 Functionality details {{{3 *NERDComFunctionalityDetails* -+ -+------------------------------------------------------------------------------ -+2.2.1 Comment map *NERDComComment* -+ -+Default mapping: [count],cc -+Change the mapping with: NERDComLineMap. -+Applicable modes: normal visual visual-line visual-block. -+ -+ -+Comments out the current line. If multiple lines are selected in visual-line -+mode, they are all commented out. If some text is selected in visual or -+visual-block mode then the script will try to comment out the exact text that -+is selected using multi-part delimiters if they are available. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.2 Nested comment map *NERDComNestedComment* -+ -+Default mapping: [count],cn -+Change the mapping with: NERDComLineNestMap. -+Applicable modes: normal visual visual-line visual-block. -+ -+Performs nested commenting. Works the same as ,cc except that if a -+line is already commented then it will be commented again. -+ -+If |NERDUsePlaceHolders| is set then the previous comment delimiters will -+be replaced by place-holder delimiters if needed. Otherwise the nested -+comment will only be added if the current commenting delimiters have no right -+delimiter (to avoid syntax errors) -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+Related options: -+|NERDDefaultNesting| -+ -+------------------------------------------------------------------------------ -+2.2.3 Toggle comment map *NERDComToggleComment* -+ -+Default mapping: [count],c -+Change the mapping with: NERDComLineToggleMap. -+Applicable modes: normal visual-line. -+ -+Toggles commenting of the lines selected. The behaviour of this mapping -+depends on whether the first line selected is commented or not. If so, all -+selected lines are uncommented and vice versa. -+ -+With this mapping, a line is only considered to be commented if it starts with -+a left delimiter. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.4 Minimal comment map *NERDComMinimalComment* -+ -+Default mapping: [count],cm -+Change the mapping with: NERDComLineMinimalMap -+Applicable modes: normal visual-line. -+ -+Comments the selected lines using one set of multipart delimiters if possible. -+ -+For example: if you are programming in c and you select 5 lines and press -+,cm then a '/*' will be placed at the start of the top line and a '*/' -+will be placed at the end of the last line. -+ -+Sets of multipart comment delimiters that are between the top and bottom -+selected lines are replaced with place holders (see |NERDLPlace|) if -+|NERDUsePlaceHolders| is set for the current filetype. If it is not, then -+the comment will be aborted if place holders are required to prevent illegal -+syntax. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.5 Invert comment map *NERDComInvertComment* -+ -+Default mapping: ,ci -+Change the mapping with: NERDComLineInvertMap. -+Applicable modes: normal visual-line. -+ -+Inverts the commented state of each selected line. If the a selected line is -+commented then it is uncommented and vice versa. Each line is examined and -+commented/uncommented individually. -+ -+With this mapping, a line is only considered to be commented if it starts with -+a left delimiter. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.6 Sexy comment map *NERDComSexyComment* -+ -+Default mapping: [count],cs -+Change the mapping with: NERDComLineSexyMap -+Applicable modes: normal, visual-line. -+ -+Comments the selected line(s) ``sexily''... see |NERDComSexyComments| for -+a description of what sexy comments are. Can only be done on filetypes for -+which there is at least one set of multipart comment delimiters specified. -+ -+Sexy comments cannot be nested and lines inside a sexy comment cannot be -+commented again. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+Related options: -+|NERDCompactSexyComs| -+ -+------------------------------------------------------------------------------ -+2.2.7 Yank comment map *NERDComYankComment* -+ -+Default mapping: [count],cy -+Change the mapping with: NERDComLineYankMap -+Applicable modes: normal visual visual-line visual-block. -+ -+Same as ,cc except that it yanks the line(s) that are commented first. -+ -+------------------------------------------------------------------------------ -+2.2.8 Comment to EOL map *NERDComEOLComment* -+ -+Default mapping: ,c$ -+Change the mapping with: NERDComToEOLMap -+Applicable modes: normal. -+ -+Comments the current line from the current cursor position up to the end of -+the line. -+ -+------------------------------------------------------------------------------ -+2.2.9 Append com to line map *NERDComAppendComment* -+ -+Default mapping: ,cA -+Change the mapping with: NERDAppendComMap. -+Applicable modes: normal. -+ -+Appends comment delimiters to the end of the current line and goes -+to insert mode between the new delimiters. -+ -+------------------------------------------------------------------------------ -+2.2.10 Prepend com to line map *NERDComPrependComment* -+ -+Default mapping: ,cI -+Change the mapping with: NERDPrependComMap. -+Applicable modes: normal. -+ -+Prepends comment delimiters to the start of the current line and goes to -+insert mode between the new delimiters. -+ -+------------------------------------------------------------------------------ -+2.2.11 Insert comment map *NERDComInsertComment* -+ -+Default mapping: -+Change the mapping with: NERDComInInsertMap. -+Applicable modes: insert. -+ -+Adds comment delimiters at the current cursor position and inserts -+between them. -+ -+------------------------------------------------------------------------------ -+2.2.12 Use alternate delims map *NERDComAltDelim* -+ -+Default mapping: ,ca -+Change the mapping with: NERDAltComMap -+Applicable modes: normal. -+ -+Changes to the alternative commenting style if one is available. For example, -+if the user is editing a c++ file using // comments and they hit ,ca -+then they will be switched over to /**/ comments. -+ -+See also |NERDComDefaultDelims| -+ -+------------------------------------------------------------------------------ -+2.2.13 Comment aligned maps *NERDComAlignedComment* -+ -+Default mappings: [count],cl [count],cr [count],cb -+Change the mappings with: NERDComAlignLeftMap, NERDComAlignRightMap and -+NERDComAlignBothMap. -+Applicable modes: normal visual-line. -+ -+Same as ,cc except that the comment delimiters are aligned on the left -+side, right side or both sides respectively. These comments are always nested -+if the line(s) are already commented. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+------------------------------------------------------------------------------ -+2.2.14 Uncomment line map *NERDComUncommentLine* -+ -+Default mapping: [count],cu -+Change the mapping with: NERDUncomLineMap. -+Applicable modes: normal visual visual-line visual-block. -+ -+Uncomments the current line. If multiple lines are selected in -+visual mode then they are all uncommented. -+ -+When uncommenting, if the line contains multiple sets of delimiters then the -+``outtermost'' pair of delimiters will be removed. -+ -+The script uses a set of heurisics to distinguish ``real'' delimiters from -+``fake'' ones when uncommenting. See |NERDComIssues| for details. -+ -+If a [count] is given in normal mode, the mapping works as though that many -+lines were selected in visual-line mode. -+ -+Related options: -+|NERDRemoveAltComs| -+|NERDRemoveExtraSpaces| -+ -+------------------------------------------------------------------------------ -+2.3 Supported filetypes {{{3 *NERDComFiletypes* -+ -+Filetypes that can be commented by this plugin: -+abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asn -+aspvbs atlas autohotkey autoit automake ave awk basic b bc bdf bib bindzone -+bst btm caos catalog c cfg cg ch changelog cl clean clipper cmake conf config -+context cpp crontab cs csc csp css cterm cupl csv cvs dcl debchangelog -+debcontrol debsources def diff django docbk dns dosbatch dosini dot dracula -+dsl dtd dtml dylan ecd eiffel elf elmfilt erlang eruby eterm expect exports -+fetchmail fgl focexec form fortran foxpro fstab fvwm fx gdb gdmo geek -+gentoo-package-keywords' gentoo-package-mask' gentoo-package-use' gnuplot -+gtkrc haskell hb h help hercules hog html htmldjango htmlos ia64 icon idlang -+idl indent inform inittab ishd iss ist jam java javascript jess jgraph -+jproperties jproperties jsp kconfig kix kscript lace lex lftp lifelines lilo -+lisp lite lotos lout lprolog lscript lss lua lynx m4 mail make maple masm -+master matlab mel mf mib mma model moduala. modula2 modula3 monk mush muttrc -+named nasm nastran natural ncf netdict netrw nqc nroff nsis objc ocaml occam -+omlet omnimark openroad opl ora otl ox pascal passwd pcap pccts perl pfmain -+php phtml pic pike pilrc pine plaintex plm plsql po postscr pov povini ppd -+ppwiz procmail progress prolog psf ptcap python python qf radiance ratpoison r -+rc readline rebol registry remind rexx robots rpl rtf ruby sa samba sas sass -+sather scheme scilab screen scsh sdl sed selectbuf sgml sgmldecl sgmllnx sh -+sicad simula sinda skill slang sl slrnrc sm smarty smil smith sml snnsnet -+snnspat snnsres snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp -+strace svn systemverilog tads taglist tags tak tasm tcl terminfo tex text -+plaintex texinfo texmf tf tidy tli trasys tsalt tsscl tssgm uc uil vb verilog -+verilog_systemverilog vgrindefs vhdl vim viminfo virata vo_base vrml vsejcl -+webmacro wget winbatch wml wvdial xdefaults xf86conf xhtml xkb xmath xml -+xmodmap xpm2 xpm xslt yacc yaml z8a -+ -+If a language is not in the list of hardcoded supported filetypes then the -+&commentstring vim option is used. -+ -+------------------------------------------------------------------------------ -+2.4 Sexy Comments {{{3 *NERDComSexyComments* -+These are comments that use one set of multipart comment delimiters as well as -+one other marker symbol. For example: > -+ /* -+ * This is a c style sexy comment -+ * So there! -+ */ -+ -+ /* This is a c style sexy comment -+ * So there! -+ * But this one is ``compact'' style */ -+< -+Here the multipart delimiters are /* and */ and the marker is *. The NERD -+commenter is capable of adding and removing comments of this type. -+ -+------------------------------------------------------------------------------ -+2.5 The NERDComment function {{{3 *NERDComNERDComment* -+ -+All of the NERD commenter mappings and menu items invoke a single function -+which delegates the commenting work to other functions. This function is -+public and has the prototype: > -+ function! NERDComment(isVisual, type) -+< -+The arguments to this function are simple: -+ - isVisual: if you wish to do any kind of visual comment then set this to -+ 1 and the function will use the '< and '> marks to find the comment -+ boundries. If set to 0 then the function will operate on the current -+ line. -+ - type: is used to specify what type of commenting operation is to be -+ performed, and it can be one of the following: 'sexy', 'invert', -+ 'minimal', 'toggle', 'alignLeft', 'alignRight', 'alignBoth', 'norm', -+ 'nested', 'toEOL', 'prepend', 'append', 'insert', 'uncomment', 'yank' -+ -+For example, if you typed > -+ :call NERDComment(1, 'sexy') -+< -+then the script would do a sexy comment on the last visual selection. -+ -+ -+============================================================================== -+3. Options {{{2 *NERDComOptions* -+ -+------------------------------------------------------------------------------ -+3.1 Options summary *NERDComOptionsSummary* -+ -+|loaded_nerd_comments| Turns off the script. -+|NERDAllowAnyVisualDelims| Allows multipart alternative delims to -+ be used when commenting in -+ visual/visual-block mode. -+|NERDBlockComIgnoreEmpty| Forces right delims to be placed when -+ doing visual-block comments. -+|NERDCommentWholeLinesInVMode| Changes behaviour of visual comments. -+|NERDDefaultNesting| Tells the script to use nested comments -+ by default. -+|NERDMenuMode| Specifies how the NERD commenter menu -+ will appear (if at all). -+|NERDLPlace| Specifies what to use as the left -+ delimiter placeholder when nesting -+ comments. -+|NERDMapleader| Specifies what all the commenting key -+ mappings will begin with. -+|NERDUsePlaceHolders| Specifies which filetypes may use -+ placeholders when nesting comments. -+|NERDRemoveAltComs| Tells the script whether to remove -+ alternative comment delimiters when -+ uncommenting. -+|NERDRemoveExtraSpaces| Tells the script to always remove the -+ extra spaces when uncommenting -+ (regardless of whether NERDSpaceDelims -+ is set) -+|NERDRPlace| Specifies what to use as the right -+ delimiter placeholder when nesting -+ comments. -+|NERDShutUp| Stops "Unknown filetype" output from the -+ script -+|NERDSpaceDelims| Specifies whether to add extra spaces -+ around delimiters when commenting, and -+ whether to remove them when -+ uncommenting. -+|NERDCompactSexyComs| Specifies whether to use the compact -+ style sexy comments. -+ -+------------------------------------------------------------------------------ -+3.3 Options details *NERDComOptionsDetails* -+ -+To enable any of the below options you should put the given line in your -+~/.vimrc -+ -+ *loaded_nerd_comments* -+If this script is driving you insane you can turn it off by setting this -+option > -+ let loaded_nerd_comments=1 -+< -+------------------------------------------------------------------------------ -+ *NERDAllowAnyVisualDelims* -+Values: 0 or 1. -+Default: 1. -+ -+If set to 1 then, when doing a visual or visual-block comment (but not a -+visual-line comment), the script will choose the right delimiters to use for -+the comment. This means either using the current delimiters if they are -+multipart or using the alternative delimiters if THEY are multipart. For -+example if we are editing the following java code: > -+ float foo = 1221; -+ float bar = 324; -+ System.out.println(foo * bar); -+< -+If we are using // comments and select the "foo" and "bar" in visual-block -+mode, as shown left below (where '|'s are used to represent the visual-block -+boundary), and comment it then the script will use the alternative delims as -+shown on the right: > -+ -+ float |foo| = 1221; float /*foo*/ = 1221; -+ float |bar| = 324; float /*bar*/ = 324; -+ System.out.println(foo * bar); System.out.println(foo * bar); -+< -+------------------------------------------------------------------------------ -+ *NERDBlockComIgnoreEmpty* -+Values: 0 or 1. -+Default: 1. -+ -+This option affects visual-block mode commenting. If this option is turned -+on, lines that begin outside the right boundary of the selection block will be -+ignored. -+ -+For example, if you are commenting this chunk of c code in visual-block mode -+(where the '|'s are used to represent the visual-block boundary) > -+ #include -+ #include -+ #include -+ |int| main(){ -+ | | printf("SUCK THIS\n"); -+ | | while(1){ -+ | | fork(); -+ | | } -+ |} | -+< -+If NERDBlockComIgnoreEmpty=0 then this code will become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ /* */ printf("SUCK THIS\n"); -+ /* */ while(1){ -+ /* */ fork(); -+ /* */ } -+ /*} */ -+< -+Otherwise, the code block would become: > -+ #include -+ #include -+ #include -+ /*int*/ main(){ -+ printf("SUCK THIS\n"); -+ while(1){ -+ fork(); -+ } -+ /*} */ -+< -+------------------------------------------------------------------------------ -+ *NERDCommentWholeLinesInVMode* -+Values: 0, 1 or 2. -+Default: 0. -+ -+By default the script tries to comment out exactly what is selected in visual -+mode (v). For example if you select and comment the following c code (using | -+to represent the visual boundary): > -+ in|t foo = 3; -+ int bar =| 9; -+ int baz = foo + bar; -+< -+This will result in: > -+ in/*t foo = 3;*/ -+ /*int bar =*/ 9; -+ int baz = foo + bar; -+< -+But some people prefer it if the whole lines are commented like: > -+ /*int foo = 3;*/ -+ /*int bar = 9;*/ -+ int baz = foo + bar; -+< -+If you prefer the second option then stick this line in your vimrc: > -+ let NERDCommentWholeLinesInVMode=1 -+< -+ -+If the filetype you are editing only has no multipart delimiters (for example -+a shell script) and you hadnt set this option then the above would become > -+ in#t foo = 3; -+ #int bar = 9; -+< -+(where # is the comment delimiter) as this is the closest the script can -+come to commenting out exactly what was selected. If you prefer for whole -+lines to be commented out when there is no multipart delimiters but the EXACT -+text that was selected to be commented out if there IS multipart delimiters -+then stick the following line in your vimrc: > -+ let NERDCommentWholeLinesInVMode=2 -+< -+ -+Note that this option does not affect the behaviour of |visual-block| mode. -+ -+------------------------------------------------------------------------------ -+ *NERDRemoveAltComs* -+Values: 0 or 1. -+Default: 1. -+ -+When uncommenting a line (for a filetype with an alternative commenting style) -+this option tells the script whether to look for, and remove, comments -+delimiters of the alternative style. -+ -+For example, if you are editing a c++ file using // style comments and you go -+,cu on this line: > -+ /* This is a c++ comment baby! */ -+< -+It will not be uncommented if the NERDRemoveAltComs is set to 0. -+ -+------------------------------------------------------------------------------ -+ *NERDRemoveExtraSpaces* -+Values: 0 or 1. -+Default: 1. -+ -+By default, the NERD commenter will remove spaces around comment delimiters if -+either: -+1. |NERDSpaceDelims| is set to 1. -+2. NERDRemoveExtraSpaces is set to 1. -+ -+This means that if we have the following lines in a c code file: > -+ /* int foo = 5; */ -+ /* int bar = 10; */ -+ int baz = foo + bar -+< -+If either of the above conditions hold then if these lines are uncommented -+they will become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+Otherwise they would become: > -+ int foo = 5; -+ int bar = 10; -+ int baz = foo + bar -+< -+If you want the spaces to be removed only if |NERDSpaceDelims| is set then -+set NERDRemoveExtraSpaces to 0. -+ -+------------------------------------------------------------------------------ -+ *NERDLPlace* -+ *NERDRPlace* -+Values: arbitrary string. -+Default: -+ NERDLPlace: "[>" -+ NERDRPlace: "<]" -+ -+These options are used to control the strings used as place-holder delimiters. -+Place holder delimiters are used when performing nested commenting when the -+filetype supports commenting styles with both left and right delimiters. -+To set these options use lines like: > -+ let NERDLPlace="FOO" -+ let NERDRPlace="BAR" -+< -+Following the above example, if we have line of c code: > -+ /* int horse */ -+< -+and we comment it with ,cn it will be changed to: > -+ /*FOO int horse BAR*/ -+< -+When we uncomment this line it will go back to what it was. -+ -+------------------------------------------------------------------------------ -+ *NERDMapleader* -+Values: arbitrary string. -+Default: \c -+ -+NERDMapleader is used to specify what all the NERD commenter key mappings -+begin with. -+ -+The default key mappings will look like this: > -+ \cc -+ \cu -+ \ca -+ \ci -+ \cs -+ ... -+< -+However, if this line: > -+ let NERDMapleader = ',x' -+< -+were present in your vimrc then the default mappings would look like this: > -+ ,xc -+ ,xu -+ ,xa -+ ,xi -+ ,xs -+ ... -+< -+This option only affects the mappings that have not been explicitly set -+manually (see |NERDComMappings|). -+ -+------------------------------------------------------------------------------ -+ *NERDMenuMode* -+Values: 0, 1, 2, 3. -+Default: 3 -+ -+This option can take 4 values: -+ "0": Turns the menu off. -+ "1": Turns the 'comment' menu on with no menu shortcut. -+ "2": Turns the 'comment 'menu on with -c as the shortcut. -+ "3": Turns the 'Plugin -> comment' menu on with -c as the shortcut. -+ -+------------------------------------------------------------------------------ -+ *NERDUsePlaceHolders* -+Values: 0 or 1. -+Default 1. -+ -+This option is used to specify whether place-holder delimiters should be used -+when adding nested comments. -+ -+------------------------------------------------------------------------------ -+ *NERDShutUp* -+Values: 0 or 1. -+Default 1. -+ -+This option is used to prevent the script from echoing "Unknown filetype" -+messages. Stick this line in your vimrc: > -+ let NERDShutUp=1 -+< -+------------------------------------------------------------------------------ -+ *NERDSpaceDelims* -+Values: 0 or 1. -+Default 0. -+ -+Some people prefer a space after the left delimiter and before the right -+delimiter like this: > -+ /* int foo=2; */ -+< -+as opposed to this: > -+ /*int foo=2;*/ -+< -+If you want spaces to be added then set NERDSpaceDelims to 1 in your vimrc. -+ -+See also |NERDRemoveExtraSpaces|. -+ -+------------------------------------------------------------------------------ -+ *NERDCompactSexyComs* -+Values: 0 or 1. -+Default 0. -+ -+Some people may want their sexy comments to be like this: > -+ /* Hi There! -+ * This is a sexy comment -+ * in c */ -+< -+As opposed to like this: > -+ /* -+ * Hi There! -+ * This is a sexy comment -+ * in c -+ */ -+< -+If this option is set to 1 then the top style will be used. -+ -+------------------------------------------------------------------------------ -+ *NERDDefaultNesting* -+Values: 0 or 1. -+Default 0. -+ -+When this option is set to 1, comments are nested automatically. That is, if -+you hit ,cc on a line that is already commented it will be commented -+again -+ -+------------------------------------------------------------------------------ -+3.3 Default delimiter customisation *NERDComDefaultDelims* -+ -+If you want the NERD commenter to use the alternative delimiters for a -+specific filetype by default then put a line of this form into your vimrc: > -+ let NERD_<&filetype>_alt_style=1 -+< -+Example: java uses // style comments by default, but you want it to default to -+/* */ style comments instead. You would put this line in your vimrc: > -+ let NERD_java_alt_style=1 -+< -+ -+See |NERDComAltDelim| for switching commenting styles at runtime. -+ -+------------------------------------------------------------------------------ -+3.4 Key mapping customisation *NERDComMappings* -+ -+These options are used to override the default keys that are used for the -+commenting mappings. Their values must be set to strings. As an example: if -+you wanted to use the mapping ,foo to uncomment lines of code then -+you would place this line in your vimrc > -+ let NERDUncomLineMap=",foo" -+< -+Check out |NERDComFunctionality| for details about what the following -+mappings do. -+ -+Default Mapping Option to override~ -+ -+,ca NERDAltComMap -+,ce NERDAppendComMap -+,cl NERDComAlignLeftMap -+,cb NERDComAlignBothMap -+,cr NERDComAlignRightMap -+ NERDComInInsertMap -+,ci NERDComLineInvertMap -+,cc NERDComLineMap -+,cn NERDComLineNestMap -+,cs NERDComLineSexyMap -+,c NERDComLineToggleMap -+,cm NERDComLineMinimalMap -+,c$ NERDComToEOLMap -+,cy NERDComLineYankMap -+,cu NERDUncomLineMap -+ -+============================================================================== -+4. Issues with the script{{{2 *NERDComIssues* -+ -+ -+------------------------------------------------------------------------------ -+4.1 Delimiter detection heuristics *NERDComHeuristics* -+ -+Heuristics are used to distinguish the real comment delimiters -+ -+Because we have comment mappings that place delimiters in the middle of lines, -+removing comment delimiters is a bit tricky. This is because if comment -+delimiters appear in a line doesnt mean they really ARE delimiters. For -+example, Java uses // comments but the line > -+ System.out.println("//"); -+< -+clearly contains no real comment delimiters. -+ -+To distinguish between ``real'' comment delimiters and ``fake'' ones we use a -+set of heuristics. For example, one such heuristic states that any comment -+delimiter that has an odd number of non-escaped " characters both preceding -+and following it on the line is not a comment because it is probably part of a -+string. These heuristics, while usually pretty accurate, will not work for all -+cases. -+ -+------------------------------------------------------------------------------ -+4.2 Nesting issues *NERDComNesting* -+ -+If we have some line of code like this: > -+ /*int foo */ = /*5 + 9;*/ -+< -+This will not be uncommented legally. The NERD commenter will remove the -+"outter most" delimiters so the line will become: > -+ int foo */ = /*5 + 9; -+< -+which almost certainly will not be what you want. Nested sets of comments will -+uncomment fine though. Eg: > -+ /*int/* foo =*/ 5 + 9;*/ -+< -+will become: > -+ int/* foo =*/ 5 + 9; -+< -+(Note that in the above examples I have deliberately not used place holders -+for simplicity) -+ -+============================================================================== -+6. The author {{{2 *NERDComAuthor* -+ -+The author of the NERD commenter is Martyzillatron --- the half robot, half -+dinosaur bastard son of Megatron and Godzilla. He enjoys destroying -+metropolises and eating tourist busses. -+ -+Drop him a line at martin_grenfell at msn.com. He would love to hear from you. -+its a lonely life being the worlds premier terror machine. How would you feel -+if your face looked like a toaster and a t-rex put together? :( -+ -+============================================================================== -+7. TODO list {{{2 *NERDComTodo* -+ -+Uncommenting of minimal comments needs to be more robust. Currently it is easy -+to get illegal syntax when uncommenting them. -+ -+ -+ -+============================================================================== -+8. Changelog {{{2 *NERDComChangelog* -+ -+2.1.4 -+ - added support for the ahk filetype. Cheers to Don Hatlestad for the -+ email. -+ - added support for desktop and xsd filetypes. Thanks to Christophe Benz. -+ - added dummy support for Rails-log -+ - fixed a bunch of bugs in the comment delimiter setup process, thanks to -+ Cheng Fang for the email :D -+ - hardcore refactoring and removal of seldomly used, overly-complex -+ functionality. -+ - the script now requires vim 7 -+2.1.3 -+ - fixed numerous bugs that were causing tabs to permanently be converted -+ to spaces, even if noexpandtab was set. Thanks to Heptite on #vim for -+ working with me to track them down :) -+ - added dummy support for "lookupfile". Thanks to David Fishburn for the -+ email. -+ - added support for "rst", thanks to Niels Aan de Brugh for the email. -+ -+2.1.2 -+ - added support for the vera and ldif filetypes. Thanks to Normandie -+ Azucena and Florian Apolloner for the emails. -+ -+2.1.1 -+ - added dummy support for SVNcommitlog and vcscommit. Thanks to John -+ O'Shea for the email. -+ - added support for Groovy. Thanks to Jason Mills for the email. -+2.1.0 -+ - now the script resets the delimiters when the filetype of the buffer -+ changes (thanks to James Hales for the patch) -+ - added formal support/doc for prepending a count to many of the -+ commenting maps so you can go, eg, 5,cc to comment 5 lines from normal -+ mode. Thanks again to James Hales for the patch. -+ - added support for the "gams" filetype that Jorge Rodrigues created. -+ - added support for the "objc" filetype, thanks to Rainer Müller for the -+ email. -+ - added support for the "sass" filetype that Dmitry Ilyashevich created. -+ -+2.0.7 -+ - Added support for eclass and ebuild filetypes. Thanks to Alex Tarkovsky -+ for the email. -+ -+2.0.6 -+ - Changed the default setting of NERDMapleader to ",c", meaning all the -+ maps now start with ,c instead of \c. This is to stop a major mapping -+ clash with the vcscommand plugin. Anyone wanting to keep the \c map -+ leader should read :help NERDMapleader. -+ - Added support for debcontrol and dummy support for debchangelog -+ filetypes, thanks to Stefano Zacchiroli for the email. -+ - Made it so that the NERDShutUp option now only controls the "Pleeease -+ email the delimiters..." requests. It no longer affects the general -+ output of the script. -+ - Simplified the names of the help tags. -+ -+2.0.5 -+ - Added support for autoit, autohotkey and docbk filetypes (thanks to -+ Michael Böhler) -+ - Added support for cmake (thanks to Aaron Small) -+ - Added support for htmldjango and django filetypes (thanks to Ramiro -+ Morales) -+ - Improved the delimiters for eruby again -+ - Applied a patch from Seth Mason to fix some pathing issues with the help -+ file installation. -+ -+2.0.4 -+ - Added support for verilog_systemverilog and systemverilog filetypes -+ (Thanks to Alexey for the email) -+ - Added support for fstab, thanks to Lizendir for the email. -+ - Added support for the smarty filetype. -+ - Improved the delimiters for eruby. -+ - Added dummy support for changelog filetype. -+ -+2.0.3 -+ - Added dummy support for the csv filetype (thx to Mark Woodward for the -+ email) -+ - Added dummy support for vo_base and otl filetypes (thanks to fREW for -+ the email) -+ -+2.0.2: -+ - Minor bug fix that was stopping nested comments from working -+ -+2.0.1: -+ - Fixed the visual bell for the |NERDComToEOLMap| map. -+ - Added another possible value to the NERDMenuMode option which causes the -+ menu to be displayed under 'Plugin -> Comment'. See :h NERDMenuMode. -+ This new menu mode is now the default. -+ - Added support for the occam filetype (thanks to Anders for emailing me) -+ - Made the main commenting function (NERDComment) available outside the -+ script. -+ - bug fixes and refactoring -+ -+2.0.0: -+ - NOTE: renamed the script to NERD_commenter.vim. When you install this -+ version you must delete the old files: NERD_comments.vim and -+ NERD_comments.txt. -+ - Reworked the mappings and main entry point function for the script to -+ avoid causing visual-bells and screen scrolling. -+ - Changes to the script options (see |NERD_com-Customisation| for -+ details): -+ - They are all camel case now instead of underscored. -+ - Converted all of the regular expression options into simple boolean -+ options for simplicity. -+ - All the options are now stated positively, eg. -+ NERD_dont_remove_spaces_regexp has become NERDRemoveExtraSpaces. -+ - Some of the option names have been changed (other than in the above -+ ways) -+ - Some have been removed altogether, namely: NERD_create_h_filetype -+ (why was a commenting script creating a filetype?!), -+ NERD_left_align_regexp, NERD_right_align_regexp, -+ -+ - Removed all the NERD_use_alt_style_XXX_coms options and replaced them -+ with a better system. Now if a filetype has alternative delims, the -+ script will check whether an option of the form -+ "NERD_<&filetype>_alt_style" exists, and if it does then alt delims will -+ be used. See |NERD_com-cust-delims| for details. -+ - The script no longer removes extra spaces for sexy comments for the -+ NERDRemoveExtraSpaces option (it will still remove spaces if -+ NERDSpaceDelims is set). -+ - Added dummy support for viminfo and rtf. -+ - Added support for the "gentoo-package-\(keywords\|mask\|use\)" -+ filetypes. -+ - Added '#' comments as an alternative for the asm filetype -+ -+Thanks to Markus Klinik and Anders for bug reports, and again to Anders -+for his patch. Thanks to John O'Shea and fREW for the filetype -+information. -+ -+============================================================================== -+8. Credits {{{2 *NERDComCredits* -+ -+Thanks and respect to the following people: -+ -+Thanks to Nick Brettell for his many ideas and criticisms. A bloody good -+bastard. -+:normal :.-2s/good// -+ -+Thanks to Matthew Hawkins for his awesome refactoring! -+ -+Thanks to the authors of the vimspell whose documentation -+installation function I stole :) -+ -+Thanks to Greg Searle for the idea of using place-holders for nested comments. -+ -+Thanks to Nguyen for the suggestions and pointing the h file highlighting bug! -+Also, thanks for the idea of doing sexy comments as well as his suggestions -+relating to it :P -+Thanks again to Nguyen for complaining about the NERD_comments menu mapping -+(-c) interfering with another mapping of his... and thus the -+NERD_dont_create_menu_shortcut option was born :P -+(it was then replaced with NERD_menu_mode in version 1.67 :) -+ -+Thanks to Sam R for pointing out some filetypes that NERD_comments could support! -+ -+Cheers to Litchi for the idea of having a mapping that appends a comment to -+the current line :) -+ -+Thanks to jorge scandaliaris and Shufeng Zheng for telling me about some -+problems with commenting in visual mode. Thanks again to Jorge for his -+continued suggestions on this matter :) -+ -+Thanks to Martin Stubenschrott for pointing out a bug with the mapping -+:) Ive gotta stop breaking this mapping! -+ -+Thanks to Markus Erlmann for pointing out a conflict that this script was -+having with the taglist plugin. -+ -+Thanks to Brent Rice for alerting me about, and helping me track down, a bug -+in the script when the "ignorecase" option in vim was set. -+ -+Thanks to Richard Willis for telling me about how line continuation was -+causing problems on cygwin. Also, thanks pointing out a bug in the help file -+and for suggesting // comments for c (its about time SOMEONE did :P). May ANSI -+have mercy on your soul :) -+ -+Thanks to Igor Prischepoff for suggesting that i implement "toggle comments". -+Also, thanks for his suggested improvements about toggle comments after i -+implemented them. -+ -+Thanks to harry for telling me that i broke the cn mapping in 1.53 :), -+and thanks again for telling me about a bug that occurred when editing a file -+in a new tab. -+ -+Thanks to Martin (Krischikim?) for his patch that fixed a bug with the doc -+install function and added support for ada comments with spaces as well as -+making a couple of other small changes. -+ -+Thanks to David Bourgeois for pointing out a bug with when commenting c files -+:)... [a few days later] ok i completely misunderstood what David was talking -+about and ended up fixing a completely different bug to what he was talking -+about :P -+ -+Thanks to David Bourgeois for pointing out a bug when changing buffers. -+ -+Cheers to Eike Von Seggern for sending me a patch to fix a bug in 1.60 that -+was causing spaces to be added to the end of lines with single-part -+delimiters. It's nice when people do my work for me :D -+ -+Thanks to Torsten Blix for telling me about a couple of bugs when uncommenting -+sexy comments. Sexy comments dont look so sexy when they are only half removed -+:P -+ -+Thanks to Alexander "boesi" Bosecke for pointing out a bug that was stopping -+the NERD_space_delim_filetype_regexp option from working with left aligned -+toggle comments. And for pointing out a bug when initialising VB comments. -+ -+Thanks to Stefano Zacchiroli for suggesting the idea of "Minimal comments". -+And for suggested improvements to minimal comments. -+ -+Thanks to Norick Chen for emailing in a patch that fixed the asp delimiters. -+In 1.65 -+ -+Thanks to Jonathan Derque for alerting me to some filetypes that could be -+supported (Namely: context, plaintext and mail). -+ -+Thanks to Joseph Barker for the sugesting that the menu be an optional -+feature. -+ -+Thanks to Gary Church and Tim Carey-Smith for complaining about the -+keymappings and causing me to introduce the NERD_mapleader option :) -+ -+Thanks to Vigil for pointing out that the "fetchmail" filetype was not -+supported and emailing me the delimiters -+ -+Thanks to Michael Brunner for telling me about the kconfig filetype. -+ -+Thanks to Antono Vasiljev for telling me about the netdict filetype. -+ -+Thanks to Melissa Reid for telling me about the omlet filetype. -+ -+Thanks to Ilia N Ternovich for alerting me to the 'qf' (quickfix) filetype. -+ -+Thanks to Markus Klinik for emailing me about a bug for sexy comments where -+spaces were being eaten. -+ -+Thanks to John O'Shea for emailing me about the RTF filetype. Thanks again for -+the SVNcommitlog and vcscommit filetypes. -+ -+Thanks to Anders for emailing me a patch to help get rid of all the visual -+bells and screen scrolling, and for sending me the delimiters for the occam -+filetype. -+ -+Thanks to Anders and Markus Klinik for emailing me about the screen scrolling -+issues and finally getting me off my ass about them :P -+ -+Thanks to Mark Woodward for emailing me about the csv filetype. -+ -+Thanks to fREW for emailing me with the /gentoo-package-(mask|keywords|use)/ -+filetypes the vo_base filetype. -+ -+Thanks to Alexey for emailing me about the verilog_systemverilog/systemverilog -+filetypes. -+ -+Cheers to Lizendir for the email about the fstab filetype -+ -+Thanks to Michael Böhler for emailing me with the autoit, autohotkey and docbk -+filetypes. -+ -+Thanks to Aaron Small for emailing me about the cmake filetype. -+ -+Thanks to Ramiro for emailing me about the htmldjango and django filetypes. -+ -+Thanks to Seth Mason for sending me a patch to fix some pathing issues for the -+help doc installation. -+ -+Thanks to Stefano Zacchiroli for emailing me with the debcontrol and -+debchangelog filetypes. -+ -+Thanks to Alex Tarkovsky for emailing me about the ebuild and eclass -+filetypes. -+ -+Cheers to Jorge Rodrigues for emailing me about the gams filetype. -+ -+Cheers to James Hales for the patch that made the comment maps work better with -+counts, and made the script reset comment delims for a buffer when its -+filetype changes. -+ -+Thank to Rainer Müller for emailing me with the Objective C delimiters. -+ -+Thanks to Jason Mills for emailing me the Groovy filetype. -+ -+Thanks to Normandie Azucena for emailing me about the vera filetype. -+ -+Thanks to Florian Apolloner for emailing me about the ldif filetype. -+ -+Cheers to David Fishburn for emailing me with the lookupfile filetype. -+ -+Thanks to Niels Aan de Brugh for emailing me with the rst filetype. -+ -+Cheers to heptite on #vim for helping me track down some tab-space conversion -+bugs. -+ -+Cheers to Don Hatlestad for telling me about the ahk filetype -+ -+Thanks to Christophe Benz for emailing me with the Desktop and xsd filetypes. -+ -+Cheers to Cheng Fang for the bug reports :D -+ -+Cheers to myself for being the best looking man on Earth! -+=== END_DOC -+" vim: set foldmethod=marker : diff -urN vim71/runtime/plugin/taglist.vim vim71_ada/runtime/plugin/taglist.vim --- vim71/runtime/plugin/taglist.vim 1970-01-01 01:00:00.000000000 +0100 +++ vim71_ada/runtime/plugin/taglist.vim 2008-01-16 16:37:03.000000000 +0100 @@ -47003,22 +6664,22 @@ diff -urN vim71/runtime/syntax/ada.vim vim71_ada/runtime/syntax/ada.vim "---------------------------------------------------------------------------- " Description: Vim Ada syntax file " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.1 2008/01/16 15:58:14 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik " Maintainer: Martin Krischik " David A. Wheeler " Simon Bradley " Contributors: Preben Randhol. -" $Author: karsten $ --" $Date: 2008/01/16 15:58:14 $ +-" $Date: 2008/01/18 13:52:03 $ -" Version: 4.2 --" $Revision: 1.1 $ +-" $Revision: 1.2 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ +" $Author: karsten $ -+" $Date: 2008/01/16 15:58:14 $ ++" $Date: 2008/01/18 13:52:03 $ +" Version: 4.5 -+" $Revision: 1.1 $ ++" $Revision: 1.2 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ " http://www.dwheeler.com/vim " History: 24.05.2006 MK Unified Headers From eb7f4c1d54f4debaa958b3d406a44d7fd9bfbb4a Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Fri, 18 Jan 2008 13:54:58 +0000 Subject: [PATCH 03/71] - patchlevel 233 - fix ada patch --- 7.1.231 | 291 +++++++++++++++++++++++++++++++++++++++++++++++++ 7.1.232 | 70 ++++++++++++ 7.1.233 | 109 ++++++++++++++++++ README.patches | 3 + vim.spec | 14 ++- 5 files changed, 485 insertions(+), 2 deletions(-) create mode 100644 7.1.231 create mode 100644 7.1.232 create mode 100644 7.1.233 diff --git a/7.1.231 b/7.1.231 new file mode 100644 index 00000000..e9c78859 --- /dev/null +++ b/7.1.231 @@ -0,0 +1,291 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.231 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.231 +Problem: When shifting lines the change is acted upon multiple times. +Solution: Don't have shift_line() call changed_bytes. +Files: src/edit.c, src/ops.c, src/proto/edit.pro, src/proto/ops.pro + + +*** ../vim-7.1.230/src/edit.c Mon Jan 14 20:11:37 2008 +--- src/edit.c Mon Jan 14 20:06:43 2008 +*************** +*** 1662,1672 **** + * if round is TRUE, round the indent to 'shiftwidth' (only with _INC and _Dec). + */ + void +! change_indent(type, amount, round, replaced) + int type; + int amount; + int round; + int replaced; /* replaced character, put on replace stack */ + { + int vcol; + int last_vcol; +--- 1662,1673 ---- + * if round is TRUE, round the indent to 'shiftwidth' (only with _INC and _Dec). + */ + void +! change_indent(type, amount, round, replaced, call_changed_bytes) + int type; + int amount; + int round; + int replaced; /* replaced character, put on replace stack */ ++ int call_changed_bytes; /* call changed_bytes() */ + { + int vcol; + int last_vcol; +*************** +*** 1723,1729 **** + * Set the new indent. The cursor will be put on the first non-blank. + */ + if (type == INDENT_SET) +! (void)set_indent(amount, SIN_CHANGED); + else + { + #ifdef FEAT_VREPLACE +--- 1724,1730 ---- + * Set the new indent. The cursor will be put on the first non-blank. + */ + if (type == INDENT_SET) +! (void)set_indent(amount, call_changed_bytes ? SIN_CHANGED : 0); + else + { + #ifdef FEAT_VREPLACE +*************** +*** 1733,1739 **** + if (State & VREPLACE_FLAG) + State = INSERT; + #endif +! shift_line(type == INDENT_DEC, round, 1); + #ifdef FEAT_VREPLACE + State = save_State; + #endif +--- 1734,1740 ---- + if (State & VREPLACE_FLAG) + State = INSERT; + #endif +! shift_line(type == INDENT_DEC, round, 1, call_changed_bytes); + #ifdef FEAT_VREPLACE + State = save_State; + #endif +*************** +*** 5921,5927 **** + { + #ifdef FEAT_VREPLACE + if (State & VREPLACE_FLAG) +! change_indent(INDENT_SET, second_indent, FALSE, NUL); + else + #endif + (void)set_indent(second_indent, SIN_CHANGED); +--- 5922,5928 ---- + { + #ifdef FEAT_VREPLACE + if (State & VREPLACE_FLAG) +! change_indent(INDENT_SET, second_indent, FALSE, NUL, TRUE); + else + #endif + (void)set_indent(second_indent, SIN_CHANGED); +*************** +*** 7227,7233 **** + fixthisline(get_the_indent) + int (*get_the_indent) __ARGS((void)); + { +! change_indent(INDENT_SET, get_the_indent(), FALSE, 0); + if (linewhite(curwin->w_cursor.lnum)) + did_ai = TRUE; /* delete the indent if the line stays empty */ + } +--- 7228,7234 ---- + fixthisline(get_the_indent) + int (*get_the_indent) __ARGS((void)); + { +! change_indent(INDENT_SET, get_the_indent(), FALSE, 0, TRUE); + if (linewhite(curwin->w_cursor.lnum)) + did_ai = TRUE; /* delete the indent if the line stays empty */ + } +*************** +*** 8170,8179 **** + replace_pop_ins(); + if (lastc == '^') + old_indent = get_indent(); /* remember curr. indent */ +! change_indent(INDENT_SET, 0, TRUE, 0); + } + else +! change_indent(c == Ctrl_D ? INDENT_DEC : INDENT_INC, 0, TRUE, 0); + + if (did_ai && *skipwhite(ml_get_curline()) != NUL) + did_ai = FALSE; +--- 8171,8180 ---- + replace_pop_ins(); + if (lastc == '^') + old_indent = get_indent(); /* remember curr. indent */ +! change_indent(INDENT_SET, 0, TRUE, 0, TRUE); + } + else +! change_indent(c == Ctrl_D ? INDENT_DEC : INDENT_INC, 0, TRUE, 0, TRUE); + + if (did_ai && *skipwhite(ml_get_curline()) != NUL) + did_ai = FALSE; +*************** +*** 9633,9639 **** + curwin->w_cursor = old_pos; + #ifdef FEAT_VREPLACE + if (State & VREPLACE_FLAG) +! change_indent(INDENT_SET, i, FALSE, NUL); + else + #endif + (void)set_indent(i, SIN_CHANGED); +--- 9634,9640 ---- + curwin->w_cursor = old_pos; + #ifdef FEAT_VREPLACE + if (State & VREPLACE_FLAG) +! change_indent(INDENT_SET, i, FALSE, NUL, TRUE); + else + #endif + (void)set_indent(i, SIN_CHANGED); +*************** +*** 9662,9668 **** + curwin->w_cursor = old_pos; + } + if (temp) +! shift_line(TRUE, FALSE, 1); + } + } + +--- 9663,9669 ---- + curwin->w_cursor = old_pos; + } + if (temp) +! shift_line(TRUE, FALSE, 1, TRUE); + } + } + +*** ../vim-7.1.230/src/ops.c Thu Jan 3 16:31:17 2008 +--- src/ops.c Sun Jan 13 21:52:18 2008 +*************** +*** 258,264 **** + if (first_char != '#' || !preprocs_left()) + #endif + { +! shift_line(oap->op_type == OP_LSHIFT, p_sr, amount); + } + ++curwin->w_cursor.lnum; + } +--- 258,264 ---- + if (first_char != '#' || !preprocs_left()) + #endif + { +! shift_line(oap->op_type == OP_LSHIFT, p_sr, amount, FALSE); + } + ++curwin->w_cursor.lnum; + } +*************** +*** 321,330 **** + * leaves cursor on first blank in the line + */ + void +! shift_line(left, round, amount) + int left; + int round; + int amount; + { + int count; + int i, j; +--- 321,331 ---- + * leaves cursor on first blank in the line + */ + void +! shift_line(left, round, amount, call_changed_bytes) + int left; + int round; + int amount; ++ int call_changed_bytes; /* call changed_bytes() */ + { + int count; + int i, j; +*************** +*** 363,372 **** + /* Set new indent */ + #ifdef FEAT_VREPLACE + if (State & VREPLACE_FLAG) +! change_indent(INDENT_SET, count, FALSE, NUL); + else + #endif +! (void)set_indent(count, SIN_CHANGED); + } + + #if defined(FEAT_VISUALEXTRA) || defined(PROTO) +--- 364,373 ---- + /* Set new indent */ + #ifdef FEAT_VREPLACE + if (State & VREPLACE_FLAG) +! change_indent(INDENT_SET, count, FALSE, NUL, call_changed_bytes); + else + #endif +! (void)set_indent(count, call_changed_bytes ? SIN_CHANGED : 0); + } + + #if defined(FEAT_VISUALEXTRA) || defined(PROTO) +*** ../vim-7.1.230/src/proto/edit.pro Wed Jan 2 17:48:24 2008 +--- src/proto/edit.pro Sun Jan 13 21:52:27 2008 +*************** +*** 3,9 **** + void edit_putchar __ARGS((int c, int highlight)); + void edit_unputchar __ARGS((void)); + void display_dollar __ARGS((colnr_T col)); +! void change_indent __ARGS((int type, int amount, int round, int replaced)); + void truncate_spaces __ARGS((char_u *line)); + void backspace_until_column __ARGS((int col)); + int vim_is_ctrl_x_key __ARGS((int c)); +--- 3,9 ---- + void edit_putchar __ARGS((int c, int highlight)); + void edit_unputchar __ARGS((void)); + void display_dollar __ARGS((colnr_T col)); +! void change_indent __ARGS((int type, int amount, int round, int replaced, int call_changed_bytes)); + void truncate_spaces __ARGS((char_u *line)); + void backspace_until_column __ARGS((int col)); + int vim_is_ctrl_x_key __ARGS((int c)); +*** ../vim-7.1.230/src/proto/ops.pro Sun May 6 13:56:32 2007 +--- src/proto/ops.pro Sun Jan 13 21:52:30 2008 +*************** +*** 4,10 **** + int get_op_char __ARGS((int optype)); + int get_extra_op_char __ARGS((int optype)); + void op_shift __ARGS((oparg_T *oap, int curs_top, int amount)); +! void shift_line __ARGS((int left, int round, int amount)); + void op_reindent __ARGS((oparg_T *oap, int (*how)(void))); + int get_expr_register __ARGS((void)); + void set_expr_line __ARGS((char_u *new_line)); +--- 4,10 ---- + int get_op_char __ARGS((int optype)); + int get_extra_op_char __ARGS((int optype)); + void op_shift __ARGS((oparg_T *oap, int curs_top, int amount)); +! void shift_line __ARGS((int left, int round, int amount, int call_changed_bytes)); + void op_reindent __ARGS((oparg_T *oap, int (*how)(void))); + int get_expr_register __ARGS((void)); + void set_expr_line __ARGS((char_u *new_line)); +*** ../vim-7.1.230/src/version.c Tue Jan 15 22:16:36 2008 +--- src/version.c Wed Jan 16 19:58:25 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 231, + /**/ + +-- +Snoring is prohibited unless all bedroom windows are closed and securely +locked. + [real standing law in Massachusetts, United States of America] + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.232 b/7.1.232 new file mode 100644 index 00000000..092d6fa9 --- /dev/null +++ b/7.1.232 @@ -0,0 +1,70 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.232 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.232 (after 7.1.207 and 7.1.211) +Problem: Compiler warnings with MSVC. +Solution: Add type casts. (Mike Williams) +Files: src/ex_cmds2.c, src/netbeans.c + + +*** ../vim-7.1.231/src/ex_cmds2.c Tue Jan 15 22:16:36 2008 +--- src/ex_cmds2.c Tue Jan 15 20:41:28 2008 +*************** +*** 916,922 **** + + QueryPerformanceCounter(tm); + QueryPerformanceFrequency(&fr); +! tm->QuadPart += (double)msec / 1000.0 * (double)fr.QuadPart; + # else + long usec; + +--- 916,922 ---- + + QueryPerformanceCounter(tm); + QueryPerformanceFrequency(&fr); +! tm->QuadPart += (LONGLONG)((double)msec / 1000.0 * (double)fr.QuadPart); + # else + long usec; + +*** ../vim-7.1.231/src/netbeans.c Sat Jan 5 18:06:33 2008 +--- src/netbeans.c Mon Jan 14 21:11:02 2008 +*************** +*** 1217,1223 **** + + oldtext = ml_get(lnum); + oldlen = STRLEN(oldtext); +! if (first >= oldlen || oldlen == 0) /* just in case */ + return; + if (lastbyte >= oldlen) + lastbyte = oldlen - 1; +--- 1217,1223 ---- + + oldtext = ml_get(lnum); + oldlen = STRLEN(oldtext); +! if (first >= (colnr_T)oldlen || oldlen == 0) /* just in case */ + return; + if (lastbyte >= oldlen) + lastbyte = oldlen - 1; +*** ../vim-7.1.231/src/version.c Wed Jan 16 20:01:14 2008 +--- src/version.c Fri Jan 18 11:38:39 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 232, + /**/ + +-- +Why is "abbreviation" such a long word? + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.233 b/7.1.233 new file mode 100644 index 00000000..b2f07e3f --- /dev/null +++ b/7.1.233 @@ -0,0 +1,109 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.233 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.233 +Problem: Crash when doing Insert mode completion for a user defined + command. (Yegappan Lakshmanan) +Solution: Don't use the non-existing command line. +Files: src/ex_getln.c + + +*** ../vim-7.1.232/src/ex_getln.c Fri Jan 4 15:16:57 2008 +--- src/ex_getln.c Fri Jan 18 13:07:11 2008 +*************** +*** 4655,4661 **** + static void * call_user_expand_func __ARGS((void *(*user_expand_func) __ARGS((char_u *, int, char_u **, int)), expand_T *xp, int *num_file, char_u ***file)); + + /* +! * call "user_expand_func()" to invoke a user defined VimL function and return + * the result (either a string or a List). + */ + static void * +--- 4655,4661 ---- + static void * call_user_expand_func __ARGS((void *(*user_expand_func) __ARGS((char_u *, int, char_u **, int)), expand_T *xp, int *num_file, char_u ***file)); + + /* +! * Call "user_expand_func()" to invoke a user defined VimL function and return + * the result (either a string or a List). + */ + static void * +*************** +*** 4677,4687 **** + *num_file = 0; + *file = NULL; + +! keep = ccline.cmdbuff[ccline.cmdlen]; +! ccline.cmdbuff[ccline.cmdlen] = 0; +! sprintf((char *)num, "%d", ccline.cmdpos); + args[0] = xp->xp_pattern; +- args[1] = ccline.cmdbuff; + args[2] = num; + + /* Save the cmdline, we don't know what the function may do. */ +--- 4677,4698 ---- + *num_file = 0; + *file = NULL; + +! if (ccline.cmdbuff == NULL) +! { +! /* Completion from Insert mode, pass fake arguments. */ +! keep = 0; +! sprintf((char *)num, "%d", STRLEN(xp->xp_pattern)); +! args[1] = xp->xp_pattern; +! } +! else +! { +! /* Completion on the command line, pass real arguments. */ +! keep = ccline.cmdbuff[ccline.cmdlen]; +! ccline.cmdbuff[ccline.cmdlen] = 0; +! sprintf((char *)num, "%d", ccline.cmdpos); +! args[1] = ccline.cmdbuff; +! } + args[0] = xp->xp_pattern; + args[2] = num; + + /* Save the cmdline, we don't know what the function may do. */ +*************** +*** 4694,4701 **** + + ccline = save_ccline; + current_SID = save_current_SID; +! +! ccline.cmdbuff[ccline.cmdlen] = keep; + + return ret; + } +--- 4705,4712 ---- + + ccline = save_ccline; + current_SID = save_current_SID; +! if (ccline.cmdbuff != NULL) +! ccline.cmdbuff[ccline.cmdlen] = keep; + + return ret; + } +*** ../vim-7.1.232/src/version.c Fri Jan 18 11:40:02 2008 +--- src/version.c Fri Jan 18 13:01:05 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 233, + /**/ + +-- +"I love deadlines. I especially like the whooshing sound they +make as they go flying by." + -- Douglas Adams + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index a9bc70f6..01e81589 100644 --- a/README.patches +++ b/README.patches @@ -261,3 +261,6 @@ Individual patches for Vim 7.1: 1678 7.1.228 with 'foldmethod' "indent" fold can't be closed after "3>>" 1758 7.1.229 a fold is closed when backspacing in Insert mode 2052 7.1.230 memory leak when executing SourceCmd autocommands + 8648 7.1.231 when shifting lines the change is acted upon multiple times + 2002 7.1.232 (after 7.1.207 and 7.1.211) compiler warnings with MSVC + 3249 7.1.233 crash with Insert mode completion for a user defined command diff --git a/vim.spec b/vim.spec index d015a07f..9b78e6bc 100644 --- a/vim.spec +++ b/vim.spec @@ -17,13 +17,13 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 230 +%define patchlevel 233 Summary: The VIM editor URL: http://www.vim.org/ Name: vim Version: %{baseversion}.%{beta}%{patchlevel} -Release: 2%{?dist} +Release: 1%{?dist} License: Vim Group: Applications/Editors Source0: ftp://ftp.vim.org/pub/vim/unix/vim-%{baseversion}%{?beta}%{?CVSDATE}.tar.bz2 @@ -283,6 +283,9 @@ Patch227: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.227 Patch228: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.228 Patch229: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.229 Patch230: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.230 +Patch231: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.231 +Patch232: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.232 +Patch233: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.233 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch @@ -647,6 +650,9 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch228 -p0 %patch229 -p0 %patch230 -p0 +%patch231 -p0 +%patch232 -p0 +%patch233 -p0 # install spell files @@ -1034,6 +1040,10 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Fri Jan 18 2008 Karsten Hopp 7.1.233-1 +- patchlevel 233 +- fix ada patch + * Wed Jan 16 2008 Karsten Hopp 7.1.230-2 - add newer ada runtime files to fix bugzilla #246378 From a02fea15f061363e6dc24b414e58755e6a97bb60 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Fri, 18 Jan 2008 15:30:13 +0000 Subject: [PATCH 04/71] - silence taglist --- vim-7.1-ada.patch | 130 +++++++++++++++++++++++----------------------- vim.spec | 5 +- 2 files changed, 69 insertions(+), 66 deletions(-) diff --git a/vim-7.1-ada.patch b/vim-7.1-ada.patch index d2c1f47c..c48d7ecc 100644 --- a/vim-7.1-ada.patch +++ b/vim-7.1-ada.patch @@ -5,18 +5,18 @@ diff -urN vim71/runtime/autoload/adacomplete.vim vim71_ada/runtime/autoload/adac "------------------------------------------------------------------------------ " Description: Vim Ada omnicompletion file " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ " Maintainer: Martin Krischik -" $Author: karsten $ --" $Date: 2008/01/18 13:52:03 $ +-" $Date: 2008/01/18 15:30:13 $ -" Version: 4.2 --" $Revision: 1.2 $ +-" $Revision: 1.3 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ +" $Author: karsten $ -+" $Date: 2008/01/18 13:52:03 $ ++" $Date: 2008/01/18 15:30:13 $ +" Version: 4.5 -+" $Revision: 1.2 $ ++" $Revision: 1.3 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ " History: 24.05.2006 MK Unified Headers " 26.05.2006 MK improved search for begin of word. @@ -28,22 +28,22 @@ diff -urN vim71/runtime/autoload/ada.vim vim71_ada/runtime/autoload/ada.vim "------------------------------------------------------------------------------ " Description: Perform Ada specific completion & tagging. " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -" Maintainer: Martin Krischik -+" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ +" Maintainer: Martin Krischik +" Taylor Venable " Neil Bird -" $Author: karsten $ --" $Date: 2008/01/18 13:52:03 $ +-" $Date: 2008/01/18 15:30:13 $ -" Version: 4.2 --" $Revision: 1.2 $ +-" $Revision: 1.3 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ +" Ned Okie +" $Author: karsten $ -+" $Date: 2008/01/18 13:52:03 $ ++" $Date: 2008/01/18 15:30:13 $ +" Version: 4.5 -+" $Revision: 1.2 $ ++" $Revision: 1.3 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ " History: 24.05.2006 MK Unified Headers " 26.05.2006 MK ' should not be in iskeyword. @@ -155,20 +155,20 @@ diff -urN vim71/runtime/autoload/decada.vim vim71_ada/runtime/autoload/decada.vi "------------------------------------------------------------------------------ " Description: Vim Ada/Dec Ada compiler file " Language: Ada (Dec Ada) --" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik -" Maintainer: Martin Krischik -" $Author: karsten $ --" $Date: 2008/01/18 13:52:03 $ +-" $Date: 2008/01/18 15:30:13 $ -" Version: 4.2 --" $Revision: 1.2 $ +-" $Revision: 1.3 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ +" Maintainer: Martin Krischik +" $Author: karsten $ -+" $Date: 2008/01/18 13:52:03 $ ++" $Date: 2008/01/18 15:30:13 $ +" Version: 4.5 -+" $Revision: 1.2 $ ++" $Revision: 1.3 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ " History: 21.07.2006 MK New Dec Ada " 15.10.2006 MK Bram's suggestion for runtime integration @@ -189,21 +189,21 @@ diff -urN vim71/runtime/autoload/gnat.vim vim71_ada/runtime/autoload/gnat.vim "------------------------------------------------------------------------------ " Description: Vim Ada/GNAT compiler file " Language: Ada (GNAT) --" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik -" Maintainer: Martin Krischik -" $Author: karsten $ --" $Date: 2008/01/18 13:52:03 $ +-" $Date: 2008/01/18 15:30:13 $ -" Version: 4.2 --" $Revision: 1.2 $ +-" $Revision: 1.3 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ +" Maintainer: Martin Krischi k +" Ned Okie +" $Author: karsten $ -+" $Date: 2008/01/18 13:52:03 $ ++" $Date: 2008/01/18 15:30:13 $ +" Version: 4.5 -+" $Revision: 1.2 $ ++" $Revision: 1.3 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ " History: 24.05.2006 MK Unified Headers " 16.07.2006 MK Ada-Mode as vim-ball @@ -250,20 +250,20 @@ diff -urN vim71/runtime/compiler/decada.vim vim71_ada/runtime/compiler/decada.vi "------------------------------------------------------------------------------ " Description: Vim Ada/Dec Ada compiler file " Language: Ada (Dec Ada) --" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik -" Maintainer: Martin Krischik -" $Author: karsten $ --" $Date: 2008/01/18 13:52:03 $ +-" $Date: 2008/01/18 15:30:13 $ -" Version: 4.2 --" $Revision: 1.2 $ +-" $Revision: 1.3 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ +" Maintainer: Martin Krischik +" $Author: karsten $ -+" $Date: 2008/01/18 13:52:03 $ ++" $Date: 2008/01/18 15:30:13 $ +" Version: 4.5 -+" $Revision: 1.2 $ ++" $Revision: 1.3 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ " History: 21.07.2006 MK New Dec Ada " 15.10.2006 MK Bram's suggestion for runtime integration @@ -309,21 +309,21 @@ diff -urN vim71/runtime/compiler/gnat.vim vim71_ada/runtime/compiler/gnat.vim "------------------------------------------------------------------------------ " Description: Vim Ada/GNAT compiler file " Language: Ada (GNAT) --" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik -" Maintainer: Martin Krischik -" $Author: karsten $ --" $Date: 2008/01/18 13:52:03 $ +-" $Date: 2008/01/18 15:30:13 $ -" Version: 4.2 --" $Revision: 1.2 $ +-" $Revision: 1.3 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ +" Maintainer: Martin Krischi k +" Ned Okie +" $Author: karsten $ -+" $Date: 2008/01/18 13:52:03 $ ++" $Date: 2008/01/18 15:30:13 $ +" Version: 4.5 -+" $Revision: 1.2 $ ++" $Revision: 1.3 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ " History: 24.05.2006 MK Unified Headers " 16.07.2006 MK Ada-Mode as vim-ball @@ -877,21 +877,21 @@ diff -urN vim71/runtime/ftplugin/ada.vim vim71_ada/runtime/ftplugin/ada.vim "------------------------------------------------------------------------------ " Description: Perform Ada specific completion & tagging. " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -" Maintainer: Martin Krischik -+" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ +" Maintainer: Martin Krischik +" Taylor Venable " Neil Bird -" $Author: karsten $ --" $Date: 2008/01/18 13:52:03 $ +-" $Date: 2008/01/18 15:30:13 $ -" Version: 4.2 --" $Revision: 1.2 $ +-" $Revision: 1.3 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ +" $Author: karsten $ -+" $Date: 2008/01/18 13:52:03 $ ++" $Date: 2008/01/18 15:30:13 $ +" Version: 4.5 -+" $Revision: 1.2 $ ++" $Revision: 1.3 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ " History: 24.05.2006 MK Unified Headers " 26.05.2006 MK ' should not be in iskeyword. @@ -938,22 +938,22 @@ diff -urN vim71/runtime/indent/ada.vim vim71_ada/runtime/indent/ada.vim "------------------------------------------------------------------------------ " Description: Vim Ada indent file " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik -" Maintainer: Martin Krischik +" Maintainer: Martin Krischik " Neil Bird -" $Author: karsten $ --" $Date: 2008/01/18 13:52:03 $ +-" $Date: 2008/01/18 15:30:13 $ -" Version: 4.2 --" $Revision: 1.2 $ +-" $Revision: 1.3 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ +" Ned Okie +" $Author: karsten $ -+" $Date: 2008/01/18 13:52:03 $ ++" $Date: 2008/01/18 15:30:13 $ +" Version: 4.5 -+" $Revision: 1.2 $ ++" $Revision: 1.3 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ " History: 24.05.2006 MK Unified Headers " 16.07.2006 MK Ada-Mode as vim-ball @@ -1038,13 +1038,13 @@ diff -urN vim71/runtime/macros/svnignore.btm vim71_ada/runtime/macros/svnignore. +::!C:\Bin\4Portable\App\4\4nt.EXE +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Description: Works like "tail -f" . -+:: $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++:: $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ +:: Maintainer: Martin Krischik +:: Jason Heddings (vim at heddway dot com) +:: $Author: karsten $ -+:: $Date: 2008/01/18 13:52:03 $ ++:: $Date: 2008/01/18 15:30:13 $ +:: Version: 3.0 -+:: $Revision: 1.2 $ ++:: $Revision: 1.3 $ +:: $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.btm $ +:: History: 17.11.2007 Edit svn:ignore data +:: Help Page: tail.txt @@ -1069,13 +1069,13 @@ diff -urN vim71/runtime/macros/svnignore.zsh vim71_ada/runtime/macros/svnignore. +#!/bin/zsh +#------------------------------------------------------------------------------ +# Description: Works like "tail -f" . -+# $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++# $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ +# Maintainer: Martin Krischik +# Jason Heddings (vim at heddway dot com) +# $Author: karsten $ -+# $Date: 2008/01/18 13:52:03 $ ++# $Date: 2008/01/18 15:30:13 $ +# Version: 3.0 -+# $Revision: 1.2 $ ++# $Revision: 1.3 $ +# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.zsh $ +# History: 17.11.2007 Edit svn:ignore data +# Help Page: tail.txt @@ -1103,12 +1103,12 @@ diff -urN vim71/runtime/macros/vim.bash vim71_ada/runtime/macros/vim.bash +########################################################### {{{1 ########### +# Description: Set alias names for a custom installed vim/ctags. +# Language: Bash Shell Script -+# $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ ++# $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ +# Maintainer: Martin Krischik +# $Author: karsten $ -+# $Date: 2008/01/18 13:52:03 $ ++# $Date: 2008/01/18 15:30:13 $ +# Version: 3.6 -+# $Revision: 1.2 $ ++# $Revision: 1.3 $ +# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/vim.bash $ +# History: 26.07.2006 MK pretty new +# Usage: copy to /etc/profile.d and make world executable @@ -2229,8 +2229,8 @@ diff -urN vim71/runtime/plugin/taglist.vim vim71_ada/runtime/plugin/taglist.vim + elseif executable('tags') + let Tlist_Ctags_Cmd = 'tags' + else -+ echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . -+ \ 'not found in PATH. Plugin is not loaded.' ++ " echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . ++ " \ 'not found in PATH. Plugin is not loaded.' + " Skip loading the plugin + let loaded_taglist = 'no' + let &cpo = s:cpo_save @@ -6664,22 +6664,22 @@ diff -urN vim71/runtime/syntax/ada.vim vim71_ada/runtime/syntax/ada.vim "---------------------------------------------------------------------------- " Description: Vim Ada syntax file " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.2 2008/01/18 13:52:03 karsten Exp $ +-" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ " Copyright: Copyright (C) 2006 Martin Krischik " Maintainer: Martin Krischik " David A. Wheeler " Simon Bradley " Contributors: Preben Randhol. -" $Author: karsten $ --" $Date: 2008/01/18 13:52:03 $ +-" $Date: 2008/01/18 15:30:13 $ -" Version: 4.2 --" $Revision: 1.2 $ +-" $Revision: 1.3 $ -" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ +" $Author: karsten $ -+" $Date: 2008/01/18 13:52:03 $ ++" $Date: 2008/01/18 15:30:13 $ +" Version: 4.5 -+" $Revision: 1.2 $ ++" $Revision: 1.3 $ +" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ " http://www.dwheeler.com/vim " History: 24.05.2006 MK Unified Headers diff --git a/vim.spec b/vim.spec index 9b78e6bc..aefd57db 100644 --- a/vim.spec +++ b/vim.spec @@ -23,7 +23,7 @@ Summary: The VIM editor URL: http://www.vim.org/ Name: vim Version: %{baseversion}.%{beta}%{patchlevel} -Release: 1%{?dist} +Release: 2%{?dist} License: Vim Group: Applications/Editors Source0: ftp://ftp.vim.org/pub/vim/unix/vim-%{baseversion}%{?beta}%{?CVSDATE}.tar.bz2 @@ -1040,6 +1040,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Fri Jan 18 2008 Karsten Hopp 7.1.233-2 +- silence taglist plugin (#429200) + * Fri Jan 18 2008 Karsten Hopp 7.1.233-1 - patchlevel 233 - fix ada patch From a8166fc841616e8f3e0be9eb3a02d6032fbf66bf Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Sun, 27 Jan 2008 00:05:12 +0000 Subject: [PATCH 05/71] - patchlevel 242 --- 7.1.234 | 210 +++++++++++ 7.1.235 | 199 +++++++++++ 7.1.236 | 920 +++++++++++++++++++++++++++++++++++++++++++++++++ 7.1.237 | 54 +++ 7.1.238 | 61 ++++ 7.1.239 | 53 +++ 7.1.240 | 186 ++++++++++ 7.1.241 | 112 ++++++ 7.1.242 | 68 ++++ README.patches | 9 + vim.spec | 25 +- 11 files changed, 1895 insertions(+), 2 deletions(-) create mode 100644 7.1.234 create mode 100644 7.1.235 create mode 100644 7.1.236 create mode 100644 7.1.237 create mode 100644 7.1.238 create mode 100644 7.1.239 create mode 100644 7.1.240 create mode 100644 7.1.241 create mode 100644 7.1.242 diff --git a/7.1.234 b/7.1.234 new file mode 100644 index 00000000..03fa34da --- /dev/null +++ b/7.1.234 @@ -0,0 +1,210 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.234 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.234 +Problem: When diff'ing three files the third one isn't displayed correctly. + (Gary Johnson) +Solution: Compute the size of diff blocks correctly when merging blocks. + Compute filler lines correctly when scrolling. +Files: src/diff.c + + +*** ../vim-7.1.233/src/diff.c Fri Oct 19 18:57:33 2007 +--- src/diff.c Fri Jan 18 17:32:31 2008 +*************** +*** 1299,1305 **** + } + else + /* second overlap of new block with existing block */ +! dp->df_count[idx_new] += count_new - count_orig; + + /* Adjust the size of the block to include all the lines to the + * end of the existing block or the new diff, whatever ends last. */ +--- 1299,1307 ---- + } + else + /* second overlap of new block with existing block */ +! dp->df_count[idx_new] += count_new - count_orig +! + dpl->df_lnum[idx_orig] + dpl->df_count[idx_orig] +! - (dp->df_lnum[idx_orig] + dp->df_count[idx_orig]); + + /* Adjust the size of the block to include all the lines to the + * end of the existing block or the new diff, whatever ends last. */ +*************** +*** 1628,1641 **** + win_T *fromwin; + win_T *towin; + { +! buf_T *buf = fromwin->w_buffer; + linenr_T lnum = fromwin->w_topline; +! int idx; + diff_T *dp; + int i; + +! idx = diff_buf_idx(buf); +! if (idx == DB_COUNT) + return; /* safety check */ + + if (curtab->tp_diff_invalid) +--- 1630,1645 ---- + win_T *fromwin; + win_T *towin; + { +! buf_T *frombuf = fromwin->w_buffer; + linenr_T lnum = fromwin->w_topline; +! int fromidx; +! int toidx; + diff_T *dp; ++ int max_count; + int i; + +! fromidx = diff_buf_idx(frombuf); +! if (fromidx == DB_COUNT) + return; /* safety check */ + + if (curtab->tp_diff_invalid) +*************** +*** 1645,1686 **** + + /* search for a change that includes "lnum" in the list of diffblocks. */ + for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next) +! if (lnum <= dp->df_lnum[idx] + dp->df_count[idx]) + break; + if (dp == NULL) + { + /* After last change, compute topline relative to end of file; no + * filler lines. */ + towin->w_topline = towin->w_buffer->b_ml.ml_line_count +! - (buf->b_ml.ml_line_count - lnum); + } + else + { + /* Find index for "towin". */ +! i = diff_buf_idx(towin->w_buffer); +! if (i == DB_COUNT) + return; /* safety check */ + +! towin->w_topline = lnum + (dp->df_lnum[i] - dp->df_lnum[idx]); +! if (lnum >= dp->df_lnum[idx]) + { +! /* Inside a change: compute filler lines. */ +! if (dp->df_count[i] == dp->df_count[idx]) + towin->w_topfill = fromwin->w_topfill; +! else if (dp->df_count[i] > dp->df_count[idx]) + { +! if (lnum == dp->df_lnum[idx] + dp->df_count[idx]) +! towin->w_topline = dp->df_lnum[i] + dp->df_count[i] +! - fromwin->w_topfill; + } +! else + { +! if (towin->w_topline >= dp->df_lnum[i] + dp->df_count[i]) + { +! if (diff_flags & DIFF_FILLER) +! towin->w_topfill = dp->df_lnum[idx] +! + dp->df_count[idx] - lnum; +! towin->w_topline = dp->df_lnum[i] + dp->df_count[i]; + } + } + } +--- 1649,1720 ---- + + /* search for a change that includes "lnum" in the list of diffblocks. */ + for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next) +! if (lnum <= dp->df_lnum[fromidx] + dp->df_count[fromidx]) + break; + if (dp == NULL) + { + /* After last change, compute topline relative to end of file; no + * filler lines. */ + towin->w_topline = towin->w_buffer->b_ml.ml_line_count +! - (frombuf->b_ml.ml_line_count - lnum); + } + else + { + /* Find index for "towin". */ +! toidx = diff_buf_idx(towin->w_buffer); +! if (toidx == DB_COUNT) + return; /* safety check */ + +! towin->w_topline = lnum + (dp->df_lnum[toidx] - dp->df_lnum[fromidx]); +! if (lnum >= dp->df_lnum[fromidx]) + { +! /* Inside a change: compute filler lines. With three or more +! * buffers we need to know the largest count. */ +! max_count = 0; +! for (i = 0; i < DB_COUNT; ++i) +! if (curtab->tp_diffbuf[i] != NULL +! && max_count < dp->df_count[i]) +! max_count = dp->df_count[i]; +! +! if (dp->df_count[toidx] == dp->df_count[fromidx]) +! { +! /* same number of lines: use same filler count */ + towin->w_topfill = fromwin->w_topfill; +! } +! else if (dp->df_count[toidx] > dp->df_count[fromidx]) + { +! if (lnum == dp->df_lnum[fromidx] + dp->df_count[fromidx]) +! { +! /* more lines in towin and fromwin doesn't show diff +! * lines, only filler lines */ +! if (max_count - fromwin->w_topfill >= dp->df_count[toidx]) +! { +! /* towin also only shows filler lines */ +! towin->w_topline = dp->df_lnum[toidx] +! + dp->df_count[toidx]; +! towin->w_topfill = fromwin->w_topfill; +! } +! else +! /* towin still has some diff lines to show */ +! towin->w_topline = dp->df_lnum[toidx] +! + max_count - fromwin->w_topfill; +! } + } +! else if (towin->w_topline >= dp->df_lnum[toidx] +! + dp->df_count[toidx]) + { +! /* less lines in towin and no diff lines to show: compute +! * filler lines */ +! towin->w_topline = dp->df_lnum[toidx] + dp->df_count[toidx]; +! if (diff_flags & DIFF_FILLER) + { +! if (lnum == dp->df_lnum[fromidx] + dp->df_count[fromidx]) +! /* fromwin is also out of diff lines */ +! towin->w_topfill = fromwin->w_topfill; +! else +! /* fromwin has some diff lines */ +! towin->w_topfill = dp->df_lnum[fromidx] +! + max_count - lnum; + } + } + } +*** ../vim-7.1.233/src/version.c Fri Jan 18 13:15:32 2008 +--- src/version.c Fri Jan 18 17:37:32 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 234, + /**/ + +-- +ERIC IDLE PLAYED: THE DEAD COLLECTOR, MR BINT (A VILLAGE NE'ER-DO -WELL VERY + KEEN ON BURNING WITCHES), SIR ROBIN, THE GUARD WHO DOESN'T + HICOUGH BUT TRIES TO GET THINGS STRAIGHT, CONCORDE (SIR + LAUNCELOT'S TRUSTY STEED), ROGER THE SHRUBBER (A SHRUBBER), + BROTHER MAYNARD + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.235 b/7.1.235 new file mode 100644 index 00000000..4ea2e396 --- /dev/null +++ b/7.1.235 @@ -0,0 +1,199 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.235 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.235 +Problem: Pattern matching is slow when using a lot of simple patterns. +Solution: Avoid allocating memory by not freeing it when it's not so much. + (Alexei Alexandrov) +Files: src/regexp.c + + +*** ../vim-7.1.234/src/regexp.c Wed Jan 2 15:34:48 2008 +--- src/regexp.c Fri Jan 18 20:35:21 2008 +*************** +*** 378,391 **** + + static char_u *reg_prev_sub = NULL; + +- #if defined(EXITFREE) || defined(PROTO) +- void +- free_regexp_stuff() +- { +- vim_free(reg_prev_sub); +- } +- #endif +- + /* + * REGEXP_INRANGE contains all characters which are always special in a [] + * range after '\'. +--- 378,383 ---- +*************** +*** 3206,3217 **** + } backpos_T; + + /* +! * regstack and backpos are used by regmatch(). They are kept over calls to +! * avoid invoking malloc() and free() often. + */ +! static garray_T regstack; /* stack with regitem_T items, sometimes +! preceded by regstar_T or regbehind_T. */ +! static garray_T backpos; /* table with backpos_T for BACK */ + + /* + * Get pointer to the line "lnum", which is relative to "reg_firstlnum". +--- 3198,3236 ---- + } backpos_T; + + /* +! * "regstack" and "backpos" are used by regmatch(). They are kept over calls +! * to avoid invoking malloc() and free() often. +! * "regstack" is a stack with regitem_T items, sometimes preceded by regstar_T +! * or regbehind_T. +! * "backpos_T" is a table with backpos_T for BACK +! */ +! static garray_T regstack = {0, 0, 0, 0, NULL}; +! static garray_T backpos = {0, 0, 0, 0, NULL}; +! +! /* +! * Both for regstack and backpos tables we use the following strategy of +! * allocation (to reduce malloc/free calls): +! * - Initial size is fairly small. +! * - When needed, the tables are grown bigger (8 times at first, double after +! * that). +! * - After executing the match we free the memory only if the array has grown. +! * Thus the memory is kept allocated when it's at the initial size. +! * This makes it fast while not keeping a lot of memory allocated. +! * A three times speed increase was observed when using many simple patterns. + */ +! #define REGSTACK_INITIAL 2048 +! #define BACKPOS_INITIAL 64 +! +! #if defined(EXITFREE) || defined(PROTO) +! void +! free_regexp_stuff() +! { +! ga_clear(®stack); +! ga_clear(&backpos); +! vim_free(reg_tofree); +! vim_free(reg_prev_sub); +! } +! #endif + + /* + * Get pointer to the line "lnum", which is relative to "reg_firstlnum". +*************** +*** 3346,3360 **** + char_u *s; + long retval = 0L; + +! reg_tofree = NULL; +! +! /* Init the regstack empty. Use an item size of 1 byte, since we push +! * different things onto it. Use a large grow size to avoid reallocating +! * it too often. */ +! ga_init2(®stack, 1, 10000); +! +! /* Init the backpos table empty. */ +! ga_init2(&backpos, sizeof(backpos_T), 10); + + if (REG_MULTI) + { +--- 3365,3389 ---- + char_u *s; + long retval = 0L; + +! /* Create "regstack" and "backpos" if they are not allocated yet. +! * We allocate *_INITIAL amount of bytes first and then set the grow size +! * to much bigger value to avoid many malloc calls in case of deep regular +! * expressions. */ +! if (regstack.ga_data == NULL) +! { +! /* Use an item size of 1 byte, since we push different things +! * onto the regstack. */ +! ga_init2(®stack, 1, REGSTACK_INITIAL); +! ga_grow(®stack, REGSTACK_INITIAL); +! regstack.ga_growsize = REGSTACK_INITIAL * 8; +! } +! +! if (backpos.ga_data == NULL) +! { +! ga_init2(&backpos, sizeof(backpos_T), BACKPOS_INITIAL); +! ga_grow(&backpos, BACKPOS_INITIAL); +! backpos.ga_growsize = BACKPOS_INITIAL * 8; +! } + + if (REG_MULTI) + { +*************** +*** 3525,3533 **** + } + + theend: +! vim_free(reg_tofree); +! ga_clear(®stack); +! ga_clear(&backpos); + + return retval; + } +--- 3554,3570 ---- + } + + theend: +! /* Free "reg_tofree" when it's a bit big. +! * Free regstack and backpos if they are bigger than their initial size. */ +! if (reg_tofreelen > 400) +! { +! vim_free(reg_tofree); +! reg_tofree = NULL; +! } +! if (regstack.ga_maxlen > REGSTACK_INITIAL) +! ga_clear(®stack); +! if (backpos.ga_maxlen > BACKPOS_INITIAL) +! ga_clear(&backpos); + + return retval; + } +*************** +*** 3717,3724 **** + #define RA_MATCH 4 /* successful match */ + #define RA_NOMATCH 5 /* didn't match */ + +! /* Init the regstack and backpos table empty. They are initialized and +! * freed in vim_regexec_both() to reduce malloc()/free() calls. */ + regstack.ga_len = 0; + backpos.ga_len = 0; + +--- 3754,3761 ---- + #define RA_MATCH 4 /* successful match */ + #define RA_NOMATCH 5 /* didn't match */ + +! /* Make "regstack" and "backpos" empty. They are allocated and freed in +! * vim_regexec_both() to reduce malloc()/free() calls. */ + regstack.ga_len = 0; + backpos.ga_len = 0; + +*** ../vim-7.1.234/src/version.c Fri Jan 18 17:39:10 2008 +--- src/version.c Fri Jan 18 20:33:26 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 235, + /**/ + +-- +NEIL INNES PLAYED: THE FIRST SELF-DESTRUCTIVE MONK, ROBIN'S LEAST FAVORITE + MINSTREL, THE PAGE CRUSHED BY A RABBIT, THE OWNER OF A DUCK + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.236 b/7.1.236 new file mode 100644 index 00000000..32944c75 --- /dev/null +++ b/7.1.236 @@ -0,0 +1,920 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.236 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.236 +Problem: When using 'incsearch' and 'hlsearch' a complicated pattern may + make Vim hang until CTRL-C is pressed. +Solution: Add the 'redrawtime' option. +Files: runtime/doc/options.txt, src/ex_cmds.c, src/ex_docmd.c, + src/ex_getln.c, src/gui.c, src/misc1.c, src/normal.c, + src/option.c, src/quickfix.c, src/regexp.c, src/proto/regexp.pro, + src/proto/search.pro, src/search.c, src/screen.c, + src/option.h, src/spell.c, src/structs.h, src/syntax.c, src/tag.c, + src/vim.h + + +*** ../vim-7.1.235/runtime/doc/options.txt Sun Aug 12 16:55:01 2007 +--- runtime/doc/options.txt Sat Jan 19 14:01:22 2008 +*************** +*** 3618,3623 **** +--- 3636,3642 ---- + When you get bored looking at the highlighted matches, you can turn it + off with |:nohlsearch|. As soon as you use a search command, the + highlighting comes back. ++ 'redrawtime' specifies the maximum time spend on finding matches. + When the search pattern can match an end-of-line, Vim will try to + highlight all of the matched text. However, this depends on where the + search starts. This will be the first line in the window or the first +*************** +*** 3851,3856 **** +--- 3870,3879 ---- + original position when no match is found and when pressing . You + still need to finish the search command with to move the + cursor to the match. ++ When compiled with the |+reltime| feature Vim only searches for about ++ half a second. With a complicated pattern and/or a lot of text the ++ match may not be found. This is to avoid that Vim hangs while you ++ are typing the pattern. + The highlighting can be set with the 'i' flag in 'highlight'. + See also: 'hlsearch'. + CTRL-L can be used to add one character from after the current match +*************** +*** 5185,5190 **** +--- 5210,5227 ---- + {not in Vi:} When using the ":view" command the 'readonly' option is + set for the newly edited buffer. + ++ *'redrawtime'* *'rdt'* ++ 'redrawtime' 'rdt' number (default 2000) ++ global ++ {not in Vi} ++ {only available when compiled with the |+reltime| ++ feature} ++ The time in milliseconds for redrawing the display. This applies to ++ searching for patterns for 'hlsearch' and |:match| highlighting. ++ When redrawing takes more than this many milliseconds no further ++ matches will be highlighted. This is used to avoid that Vim hangs ++ when using a very complicated pattern. ++ + *'remap'* *'noremap'* + 'remap' boolean (default on) + global +*** ../vim-7.1.235/src/ex_cmds.c Sun Jan 13 13:30:34 2008 +--- src/ex_cmds.c Sat Jan 19 13:04:28 2008 +*************** +*** 4446,4452 **** + #endif + ); ++lnum) + { +! nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0); + if (nmatch) + { + colnr_T copycol; +--- 4446,4453 ---- + #endif + ); ++lnum) + { +! nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, +! (colnr_T)0, NULL); + if (nmatch) + { + colnr_T copycol; +*************** +*** 4957,4963 **** + || (do_ask && !re_lookbehind(regmatch.regprog)) + || nmatch_tl > 0 + || (nmatch = vim_regexec_multi(®match, curwin, +! curbuf, sub_firstlnum, matchcol)) == 0 + || regmatch.startpos[0].lnum > 0) + { + if (new_start != NULL) +--- 4958,4965 ---- + || (do_ask && !re_lookbehind(regmatch.regprog)) + || nmatch_tl > 0 + || (nmatch = vim_regexec_multi(®match, curwin, +! curbuf, sub_firstlnum, +! matchcol, NULL)) == 0 + || regmatch.startpos[0].lnum > 0) + { + if (new_start != NULL) +*************** +*** 5022,5028 **** + } + if (nmatch == -1 && !lastone) + nmatch = vim_regexec_multi(®match, curwin, curbuf, +! sub_firstlnum, matchcol); + + /* + * 5. break if there isn't another match in this line +--- 5024,5030 ---- + } + if (nmatch == -1 && !lastone) + nmatch = vim_regexec_multi(®match, curwin, curbuf, +! sub_firstlnum, matchcol, NULL); + + /* + * 5. break if there isn't another match in this line +*************** +*** 5252,5258 **** + for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum) + { + /* a match on this line? */ +! match = vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0); + if ((type == 'g' && match) || (type == 'v' && !match)) + { + ml_setmarked(lnum); +--- 5254,5261 ---- + for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum) + { + /* a match on this line? */ +! match = vim_regexec_multi(®match, curwin, curbuf, lnum, +! (colnr_T)0, NULL); + if ((type == 'g' && match) || (type == 'v' && !match)) + { + ml_setmarked(lnum); +*** ../vim-7.1.235/src/ex_docmd.c Sun Jan 13 17:11:25 2008 +--- src/ex_docmd.c Fri Jan 18 21:01:16 2008 +*************** +*** 3931,3937 **** + curwin->w_cursor.col = 0; + searchcmdlen = 0; + if (!do_search(NULL, c, cmd, 1L, +! SEARCH_HIS + SEARCH_MSG + SEARCH_START)) + { + curwin->w_cursor = pos; + cmd = NULL; +--- 3931,3938 ---- + curwin->w_cursor.col = 0; + searchcmdlen = 0; + if (!do_search(NULL, c, cmd, 1L, +! SEARCH_HIS + SEARCH_MSG + SEARCH_START, +! NULL)) + { + curwin->w_cursor = pos; + cmd = NULL; +*** ../vim-7.1.235/src/ex_getln.c Fri Jan 18 13:15:32 2008 +--- src/ex_getln.c Fri Jan 18 21:34:42 2008 +*************** +*** 1709,1714 **** +--- 1709,1717 ---- + if (p_is && !cmd_silent && (firstc == '/' || firstc == '?')) + { + pos_T end_pos; ++ #ifdef FEAT_RELTIME ++ proftime_T tm; ++ #endif + + /* if there is a character waiting, search and redraw later */ + if (char_avail()) +*************** +*** 1727,1734 **** + cursor_off(); /* so the user knows we're busy */ + out_flush(); + ++emsg_off; /* So it doesn't beep if bad expr */ + i = do_search(NULL, firstc, ccline.cmdbuff, count, +! SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK); + --emsg_off; + /* if interrupted while searching, behave like it failed */ + if (got_int) +--- 1730,1747 ---- + cursor_off(); /* so the user knows we're busy */ + out_flush(); + ++emsg_off; /* So it doesn't beep if bad expr */ ++ #ifdef FEAT_RELTIME ++ /* Set the time limit to half a second. */ ++ profile_setlimit(500L, &tm); ++ #endif + i = do_search(NULL, firstc, ccline.cmdbuff, count, +! SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK, +! #ifdef FEAT_RELTIME +! &tm +! #else +! NULL +! #endif +! ); + --emsg_off; + /* if interrupted while searching, behave like it failed */ + if (got_int) +*** ../vim-7.1.235/src/gui.c Thu Jan 3 16:14:25 2008 +--- src/gui.c Fri Jan 18 21:01:36 2008 +*************** +*** 5052,5058 **** + /* Search for the next match. */ + i = msg_scroll; + do_search(NULL, down ? '/' : '?', ga.ga_data, 1L, +! SEARCH_MSG + SEARCH_MARK); + msg_scroll = i; /* don't let an error message set msg_scroll */ + } + +--- 5052,5058 ---- + /* Search for the next match. */ + i = msg_scroll; + do_search(NULL, down ? '/' : '?', ga.ga_data, 1L, +! SEARCH_MSG + SEARCH_MARK, NULL); + msg_scroll = i; /* don't let an error message set msg_scroll */ + } + +*** ../vim-7.1.235/src/misc1.c Thu Jan 3 12:42:38 2008 +--- src/misc1.c Sat Jan 19 13:04:39 2008 +*************** +*** 437,443 **** + { + regmatch.rmm_ic = FALSE; + regmatch.rmm_maxcol = 0; +! if (vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0)) + { + pos.lnum = regmatch.endpos[0].lnum + lnum; + pos.col = regmatch.endpos[0].col; +--- 437,444 ---- + { + regmatch.rmm_ic = FALSE; + regmatch.rmm_maxcol = 0; +! if (vim_regexec_multi(®match, curwin, curbuf, lnum, +! (colnr_T)0, NULL)) + { + pos.lnum = regmatch.endpos[0].lnum + lnum; + pos.col = regmatch.endpos[0].col; +*** ../vim-7.1.235/src/normal.c Sat Jan 12 17:11:25 2008 +--- src/normal.c Fri Jan 18 21:01:47 2008 +*************** +*** 6093,6099 **** + curwin->w_set_curswant = TRUE; + + i = do_search(cap->oap, dir, pat, cap->count1, +! opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG); + if (i == 0) + clearop(cap->oap); + else +--- 6093,6099 ---- + curwin->w_set_curswant = TRUE; + + i = do_search(cap->oap, dir, pat, cap->count1, +! opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG, NULL); + if (i == 0) + clearop(cap->oap); + else +*** ../vim-7.1.235/src/option.c Tue Oct 2 20:40:01 2007 +--- src/option.c Sat Jan 19 13:44:33 2008 +*************** +*** 1991,1996 **** +--- 1991,2003 ---- + {"redraw", NULL, P_BOOL|P_VI_DEF, + (char_u *)NULL, PV_NONE, + {(char_u *)FALSE, (char_u *)0L}}, ++ {"redrawtime", "rdt", P_NUM|P_VI_DEF, ++ #ifdef FEAT_RELTIME ++ (char_u *)&p_rdt, PV_NONE, ++ #else ++ (char_u *)NULL, PV_NONE, ++ #endif ++ {(char_u *)2000L, (char_u *)0L}}, + {"remap", NULL, P_BOOL|P_VI_DEF, + (char_u *)&p_remap, PV_NONE, + {(char_u *)TRUE, (char_u *)0L}}, +*** ../vim-7.1.235/src/quickfix.c Sun Sep 30 14:00:41 2007 +--- src/quickfix.c Sat Jan 19 13:04:53 2008 +*************** +*** 1803,1809 **** + /* Move the cursor to the first line in the buffer */ + save_cursor = curwin->w_cursor; + curwin->w_cursor.lnum = 0; +! if (!do_search(NULL, '/', qf_ptr->qf_pattern, (long)1, SEARCH_KEEP)) + curwin->w_cursor = save_cursor; + } + +--- 1803,1810 ---- + /* Move the cursor to the first line in the buffer */ + save_cursor = curwin->w_cursor; + curwin->w_cursor.lnum = 0; +! if (!do_search(NULL, '/', qf_ptr->qf_pattern, (long)1, +! SEARCH_KEEP, NULL)) + curwin->w_cursor = save_cursor; + } + +*************** +*** 3159,3165 **** + { + col = 0; + while (vim_regexec_multi(®match, curwin, buf, lnum, +! col) > 0) + { + ; + if (qf_add_entry(qi, &prevp, +--- 3160,3166 ---- + { + col = 0; + while (vim_regexec_multi(®match, curwin, buf, lnum, +! col, NULL) > 0) + { + ; + if (qf_add_entry(qi, &prevp, +*** ../vim-7.1.235/src/regexp.c Fri Jan 18 20:36:40 2008 +--- src/regexp.c Sat Jan 19 15:18:12 2008 +*************** +*** 3040,3046 **** + } save_se_T; + + static char_u *reg_getline __ARGS((linenr_T lnum)); +! static long vim_regexec_both __ARGS((char_u *line, colnr_T col)); + static long regtry __ARGS((regprog_T *prog, colnr_T col)); + static void cleanup_subexpr __ARGS((void)); + #ifdef FEAT_SYN_HL +--- 3040,3046 ---- + } save_se_T; + + static char_u *reg_getline __ARGS((linenr_T lnum)); +! static long vim_regexec_both __ARGS((char_u *line, colnr_T col, proftime_T *tm)); + static long regtry __ARGS((regprog_T *prog, colnr_T col)); + static void cleanup_subexpr __ARGS((void)); + #ifdef FEAT_SYN_HL +*************** +*** 3284,3290 **** + ireg_icombine = FALSE; + #endif + ireg_maxcol = 0; +! return (vim_regexec_both(line, col) != 0); + } + + #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \ +--- 3284,3290 ---- + ireg_icombine = FALSE; + #endif + ireg_maxcol = 0; +! return (vim_regexec_both(line, col, NULL) != 0); + } + + #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \ +*************** +*** 3308,3314 **** + ireg_icombine = FALSE; + #endif + ireg_maxcol = 0; +! return (vim_regexec_both(line, col) != 0); + } + #endif + +--- 3308,3314 ---- + ireg_icombine = FALSE; + #endif + ireg_maxcol = 0; +! return (vim_regexec_both(line, col, NULL) != 0); + } + #endif + +*************** +*** 3321,3332 **** + * match otherwise. + */ + long +! vim_regexec_multi(rmp, win, buf, lnum, col) + regmmatch_T *rmp; + win_T *win; /* window in which to search or NULL */ + buf_T *buf; /* buffer in which to search */ + linenr_T lnum; /* nr of line to start looking for match */ + colnr_T col; /* column to start looking for match */ + { + long r; + buf_T *save_curbuf = curbuf; +--- 3321,3333 ---- + * match otherwise. + */ + long +! vim_regexec_multi(rmp, win, buf, lnum, col, tm) + regmmatch_T *rmp; + win_T *win; /* window in which to search or NULL */ + buf_T *buf; /* buffer in which to search */ + linenr_T lnum; /* nr of line to start looking for match */ + colnr_T col; /* column to start looking for match */ ++ proftime_T *tm; /* timeout limit or NULL */ + { + long r; + buf_T *save_curbuf = curbuf; +*************** +*** 3346,3352 **** + + /* Need to switch to buffer "buf" to make vim_iswordc() work. */ + curbuf = buf; +! r = vim_regexec_both(NULL, col); + curbuf = save_curbuf; + + return r; +--- 3347,3353 ---- + + /* Need to switch to buffer "buf" to make vim_iswordc() work. */ + curbuf = buf; +! r = vim_regexec_both(NULL, col, tm); + curbuf = save_curbuf; + + return r; +*************** +*** 3356,3365 **** + * Match a regexp against a string ("line" points to the string) or multiple + * lines ("line" is NULL, use reg_getline()). + */ + static long +! vim_regexec_both(line, col) + char_u *line; + colnr_T col; /* column to start looking for match */ + { + regprog_T *prog; + char_u *s; +--- 3357,3368 ---- + * Match a regexp against a string ("line" points to the string) or multiple + * lines ("line" is NULL, use reg_getline()). + */ ++ /*ARGSUSED*/ + static long +! vim_regexec_both(line, col, tm) + char_u *line; + colnr_T col; /* column to start looking for match */ ++ proftime_T *tm; /* timeout limit or NULL */ + { + regprog_T *prog; + char_u *s; +*************** +*** 3502,3507 **** +--- 3505,3513 ---- + } + else + { ++ #ifdef FEAT_RELTIME ++ int tm_count = 0; ++ #endif + /* Messy cases: unanchored match. */ + while (!got_int) + { +*************** +*** 3550,3555 **** +--- 3556,3570 ---- + else + #endif + ++col; ++ #ifdef FEAT_RELTIME ++ /* Check for timeout once in a twenty times to avoid overhead. */ ++ if (tm != NULL && ++tm_count == 20) ++ { ++ tm_count = 0; ++ if (profile_passed_limit(tm)) ++ break; ++ } ++ #endif + } + } + +*** ../vim-7.1.235/src/proto/regexp.pro Sat May 5 19:42:08 2007 +--- src/proto/regexp.pro Sat Jan 19 13:14:09 2008 +*************** +*** 1,13 **** + /* regexp.c */ +- void free_regexp_stuff __ARGS((void)); + int re_multiline __ARGS((regprog_T *prog)); + int re_lookbehind __ARGS((regprog_T *prog)); + char_u *skip_regexp __ARGS((char_u *startp, int dirc, int magic, char_u **newp)); + regprog_T *vim_regcomp __ARGS((char_u *expr, int re_flags)); + int vim_regcomp_had_eol __ARGS((void)); + int vim_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); + int vim_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); +! long vim_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col)); + reg_extmatch_T *ref_extmatch __ARGS((reg_extmatch_T *em)); + void unref_extmatch __ARGS((reg_extmatch_T *em)); + char_u *regtilde __ARGS((char_u *source, int magic)); +--- 1,13 ---- + /* regexp.c */ + int re_multiline __ARGS((regprog_T *prog)); + int re_lookbehind __ARGS((regprog_T *prog)); + char_u *skip_regexp __ARGS((char_u *startp, int dirc, int magic, char_u **newp)); + regprog_T *vim_regcomp __ARGS((char_u *expr, int re_flags)); + int vim_regcomp_had_eol __ARGS((void)); ++ void free_regexp_stuff __ARGS((void)); + int vim_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); + int vim_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); +! long vim_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm)); + reg_extmatch_T *ref_extmatch __ARGS((reg_extmatch_T *em)); + void unref_extmatch __ARGS((reg_extmatch_T *em)); + char_u *regtilde __ARGS((char_u *source, int magic)); +*** ../vim-7.1.235/src/proto/search.pro Sun Jan 6 20:05:36 2008 +--- src/proto/search.pro Fri Jan 18 21:03:49 2008 +*************** +*** 11,17 **** + void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast)); + void last_pat_prog __ARGS((regmmatch_T *regmatch)); + int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum, proftime_T *tm)); +! int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options)); + int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat)); + int searchc __ARGS((cmdarg_T *cap, int t_cmd)); + pos_T *findmatch __ARGS((oparg_T *oap, int initc)); +--- 11,17 ---- + void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast)); + void last_pat_prog __ARGS((regmmatch_T *regmatch)); + int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum, proftime_T *tm)); +! int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options, proftime_T *tm)); + int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat)); + int searchc __ARGS((cmdarg_T *cap, int t_cmd)); + pos_T *findmatch __ARGS((oparg_T *oap, int initc)); +*** ../vim-7.1.235/src/search.c Sun Jan 6 20:05:36 2008 +--- src/search.c Sat Jan 19 13:13:25 2008 +*************** +*** 606,612 **** + * Look for a match somewhere in line "lnum". + */ + nmatched = vim_regexec_multi(®match, win, buf, +! lnum, (colnr_T)0); + /* Abort searching on an error (e.g., out of stack). */ + if (called_emsg) + break; +--- 606,618 ---- + * Look for a match somewhere in line "lnum". + */ + nmatched = vim_regexec_multi(®match, win, buf, +! lnum, (colnr_T)0, +! #ifdef FEAT_RELTIME +! tm +! #else +! NULL +! #endif +! ); + /* Abort searching on an error (e.g., out of stack). */ + if (called_emsg) + break; +*************** +*** 615,623 **** + /* match may actually be in another line when using \zs */ + matchpos = regmatch.startpos[0]; + endpos = regmatch.endpos[0]; +! # ifdef FEAT_EVAL + submatch = first_submatch(®match); +! # endif + /* Line me be past end of buffer for "\n\zs". */ + if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) + ptr = (char_u *)""; +--- 621,629 ---- + /* match may actually be in another line when using \zs */ + matchpos = regmatch.startpos[0]; + endpos = regmatch.endpos[0]; +! #ifdef FEAT_EVAL + submatch = first_submatch(®match); +! #endif + /* Line me be past end of buffer for "\n\zs". */ + if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) + ptr = (char_u *)""; +*************** +*** 693,699 **** + if (ptr[matchcol] == NUL + || (nmatched = vim_regexec_multi(®match, + win, buf, lnum + matchpos.lnum, +! matchcol)) == 0) + { + match_ok = FALSE; + break; +--- 699,711 ---- + if (ptr[matchcol] == NUL + || (nmatched = vim_regexec_multi(®match, + win, buf, lnum + matchpos.lnum, +! matchcol, +! #ifdef FEAT_RELTIME +! tm +! #else +! NULL +! #endif +! )) == 0) + { + match_ok = FALSE; + break; +*************** +*** 799,805 **** + if (ptr[matchcol] == NUL + || (nmatched = vim_regexec_multi(®match, + win, buf, lnum + matchpos.lnum, +! matchcol)) == 0) + break; + + /* Need to get the line pointer again, a +--- 811,823 ---- + if (ptr[matchcol] == NUL + || (nmatched = vim_regexec_multi(®match, + win, buf, lnum + matchpos.lnum, +! matchcol, +! #ifdef FEAT_RELTIME +! tm +! #else +! NULL +! #endif +! )) == 0) + break; + + /* Need to get the line pointer again, a +*************** +*** 977,988 **** + * return 0 for failure, 1 for found, 2 for found and line offset added + */ + int +! do_search(oap, dirc, pat, count, options) + oparg_T *oap; /* can be NULL */ + int dirc; /* '/' or '?' */ + char_u *pat; + long count; + int options; + { + pos_T pos; /* position of the last match */ + char_u *searchstr; +--- 995,1007 ---- + * return 0 for failure, 1 for found, 2 for found and line offset added + */ + int +! do_search(oap, dirc, pat, count, options, tm) + oparg_T *oap; /* can be NULL */ + int dirc; /* '/' or '?' */ + char_u *pat; + long count; + int options; ++ proftime_T *tm; /* timeout limit or NULL */ + { + pos_T pos; /* position of the last match */ + char_u *searchstr; +*************** +*** 1256,1262 **** + (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS + + SEARCH_MSG + SEARCH_START + + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))), +! RE_LAST, (linenr_T)0, NULL); + + if (dircp != NULL) + *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */ +--- 1275,1281 ---- + (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS + + SEARCH_MSG + SEARCH_START + + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))), +! RE_LAST, (linenr_T)0, tm); + + if (dircp != NULL) + *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */ +*** ../vim-7.1.235/src/screen.c Sat Jan 12 16:45:25 2008 +--- src/screen.c Sat Jan 19 13:52:29 2008 +*************** +*** 848,858 **** +--- 848,863 ---- + cur->hl.buf = buf; + cur->hl.lnum = 0; + cur->hl.first_lnum = 0; ++ # ifdef FEAT_RELTIME ++ /* Set the time limit to 'redrawtime'. */ ++ profile_setlimit(p_rdt, &(cur->hl.tm)); ++ # endif + cur = cur->next; + } + search_hl.buf = buf; + search_hl.lnum = 0; + search_hl.first_lnum = 0; ++ /* time limit is set at the toplevel, for all windows */ + #endif + + #ifdef FEAT_LINEBREAK +*************** +*** 6462,6467 **** +--- 6467,6476 ---- + { + last_pat_prog(&search_hl.rm); + search_hl.attr = hl_attr(HLF_L); ++ # ifdef FEAT_RELTIME ++ /* Set the time limit to 'redrawtime'. */ ++ profile_setlimit(p_rdt, &search_hl.tm); ++ # endif + } + } + +*************** +*** 6587,6592 **** +--- 6596,6609 ---- + called_emsg = FALSE; + for (;;) + { ++ #ifdef FEAT_RELTIME ++ /* Stop searching after passing the time limit. */ ++ if (profile_passed_limit(&(shl->tm))) ++ { ++ shl->lnum = 0; /* no match found in time */ ++ break; ++ } ++ #endif + /* Three situations: + * 1. No useful previous match: search from start of line. + * 2. Not Vi compatible or empty match: continue at next character. +*************** +*** 6620,6626 **** + matchcol = shl->rm.endpos[0].col; + + shl->lnum = lnum; +! nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol); + if (called_emsg) + { + /* Error while handling regexp: stop using this regexp. */ +--- 6637,6649 ---- + matchcol = shl->rm.endpos[0].col; + + shl->lnum = lnum; +! nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol, +! #ifdef FEAT_RELTIME +! &(shl->tm) +! #else +! NULL +! #endif +! ); + if (called_emsg) + { + /* Error while handling regexp: stop using this regexp. */ +*** ../vim-7.1.235/src/option.h Thu May 10 20:34:47 2007 +--- src/option.h Sat Jan 19 13:45:51 2008 +*************** +*** 633,638 **** +--- 633,641 ---- + #ifdef FEAT_SEARCHPATH + EXTERN char_u *p_cdpath; /* 'cdpath' */ + #endif ++ #ifdef FEAT_RELTIME ++ EXTERN long p_rdt; /* 'redrawtime' */ ++ #endif + EXTERN int p_remap; /* 'remap' */ + EXTERN long p_report; /* 'report' */ + #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) +*** ../vim-7.1.235/src/spell.c Sat Jan 12 16:45:25 2008 +--- src/spell.c Fri Jan 18 21:02:47 2008 +*************** +*** 10343,10349 **** + curwin->w_cursor.lnum = 0; + while (!got_int) + { +! if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP) == 0 + || u_save_cursor() == FAIL) + break; + +--- 10343,10349 ---- + curwin->w_cursor.lnum = 0; + while (!got_int) + { +! if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP, NULL) == 0 + || u_save_cursor() == FAIL) + break; + +*** ../vim-7.1.235/src/structs.h Mon Oct 1 22:53:27 2007 +--- src/structs.h Fri Jan 18 21:18:53 2008 +*************** +*** 1717,1722 **** +--- 1717,1725 ---- + linenr_T first_lnum; /* first lnum to search for multi-line pat */ + colnr_T startcol; /* in win_line() points to char where HL starts */ + colnr_T endcol; /* in win_line() points to char where HL ends */ ++ #ifdef FEAT_RELTIME ++ proftime_T tm; /* for a time limit */ ++ #endif + } match_T; + + /* +*** ../vim-7.1.235/src/syntax.c Sun Jan 13 17:39:29 2008 +--- src/syntax.c Sat Jan 19 13:13:49 2008 +*************** +*** 3097,3103 **** + colnr_T col; + { + rmp->rmm_maxcol = syn_buf->b_p_smc; +! if (vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col) > 0) + { + rmp->startpos[0].lnum += lnum; + rmp->endpos[0].lnum += lnum; +--- 3097,3103 ---- + colnr_T col; + { + rmp->rmm_maxcol = syn_buf->b_p_smc; +! if (vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col, NULL) > 0) + { + rmp->startpos[0].lnum += lnum; + rmp->endpos[0].lnum += lnum; +*** ../vim-7.1.235/src/tag.c Thu May 10 19:44:07 2007 +--- src/tag.c Fri Jan 18 21:03:41 2008 +*************** +*** 3191,3197 **** + #endif + save_lnum = curwin->w_cursor.lnum; + curwin->w_cursor.lnum = 0; /* start search before first line */ +! if (do_search(NULL, pbuf[0], pbuf + 1, (long)1, search_options)) + retval = OK; + else + { +--- 3191,3198 ---- + #endif + save_lnum = curwin->w_cursor.lnum; + curwin->w_cursor.lnum = 0; /* start search before first line */ +! if (do_search(NULL, pbuf[0], pbuf + 1, (long)1, +! search_options, NULL)) + retval = OK; + else + { +*************** +*** 3203,3209 **** + */ + p_ic = TRUE; + if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1, +! search_options)) + { + /* + * Failed to find pattern, take a guess: "^func (" +--- 3204,3210 ---- + */ + p_ic = TRUE; + if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1, +! search_options, NULL)) + { + /* + * Failed to find pattern, take a guess: "^func (" +*************** +*** 3213,3225 **** + cc = *tagp.tagname_end; + *tagp.tagname_end = NUL; + sprintf((char *)pbuf, "^%s\\s\\*(", tagp.tagname); +! if (!do_search(NULL, '/', pbuf, (long)1, search_options)) + { + /* Guess again: "^char * \ /* for access() */ + + # define stat(a,b) (access(a,0) ? -1 : stat(a,b)) +- #endif +- +- #if (defined(FEAT_PROFILE) || defined(FEAT_RELTIME)) && !defined(PROTO) +- # ifdef WIN3264 +- typedef LARGE_INTEGER proftime_T; +- # else +- typedef struct timeval proftime_T; +- # endif +- #else +- typedef int proftime_T; /* dummy for function prototypes */ + #endif + + #include "ex_cmds.h" /* Ex command defines */ +--- 1770,1775 ---- +*** ../vim-7.1.235/src/version.c Fri Jan 18 20:36:40 2008 +--- src/version.c Sat Jan 19 15:19:48 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 236, + /**/ + +-- +Every time I lose weight, it finds me again! + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.237 b/7.1.237 new file mode 100644 index 00000000..c631d95a --- /dev/null +++ b/7.1.237 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.237 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.237 +Problem: Compiler warning on an Alpha processor in Motif code. +Solution: Change a typecast. (Adri Verhoef) +Files: src/gui_motif.c + + +*** ../vim-7.1.236/src/gui_motif.c Thu May 10 19:51:05 2007 +--- src/gui_motif.c Mon Jan 21 21:03:55 2008 +*************** +*** 3813,3819 **** + + XtAddCallback(frdp->find, XmNactivateCallback, + find_replace_callback, +! (XtPointer) (do_replace ? FRD_R_FINDNEXT : FRD_FINDNEXT)); + + if (do_replace) + { +--- 3813,3819 ---- + + XtAddCallback(frdp->find, XmNactivateCallback, + find_replace_callback, +! (do_replace ? (XtPointer)FRD_R_FINDNEXT : (XtPointer)FRD_FINDNEXT)); + + if (do_replace) + { +*** ../vim-7.1.236/src/version.c Sat Jan 19 15:55:51 2008 +--- src/version.c Tue Jan 22 11:05:12 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 237, + /**/ + +-- +I am always surprised in the Linux world how quickly solutions can be +obtained. (Imagine sending an email to Bill Gates, asking why Windows +crashed, and how to fix it... and then getting an answer that fixed the +problem... <0>_<0> !) -- Mark Langdon + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.238 b/7.1.238 new file mode 100644 index 00000000..e7b6a6fe --- /dev/null +++ b/7.1.238 @@ -0,0 +1,61 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.238 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.238 +Problem: Using the 'c' flag with searchpair() may cause it to fail. Using + the 'r' flag doesn't work when 'wrapscan' is set. (A.Politz) +Solution: Only use the 'c' flag for the first search, not for repeating. + When using 'r' imply 'W'. (Antony Scriven) +Files: src/eval.c + + +*** ../vim-7.1.237/src/eval.c Sat Jan 12 16:45:25 2008 +--- src/eval.c Tue Jan 22 11:42:28 2008 +*************** +*** 14189,14194 **** +--- 14189,14198 ---- + goto theend; + } + ++ /* Using 'r' implies 'W', otherwise it doesn't work. */ ++ if (flags & SP_REPEAT) ++ p_ws = FALSE; ++ + /* Optional fifth argument: skip expression */ + if (argvars[3].v_type == VAR_UNKNOWN + || argvars[4].v_type == VAR_UNKNOWN) +*************** +*** 14344,14349 **** +--- 14348,14356 ---- + incl(&pos); + } + foundpos = pos; ++ ++ /* clear the start flag to avoid getting stuck here */ ++ options &= ~SEARCH_START; + + /* If the skip pattern matches, ignore this match. */ + if (*skip != NUL) +*** ../vim-7.1.237/src/version.c Tue Jan 22 11:06:06 2008 +--- src/version.c Tue Jan 22 11:57:28 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 238, + /**/ + +-- +To keep milk from turning sour: Keep it in the cow. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.239 b/7.1.239 new file mode 100644 index 00000000..dca05345 --- /dev/null +++ b/7.1.239 @@ -0,0 +1,53 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.239 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.239 (after 7.1.233) +Problem: Compiler warning for sprintf() argument. +Solution: Add a typecast. (Nico Weber) +Files: src/ex_getln.c + + +*** ../vim-7.1.238/src/ex_getln.c Sat Jan 19 15:55:51 2008 +--- src/ex_getln.c Tue Jan 22 12:40:54 2008 +*************** +*** 4694,4700 **** + { + /* Completion from Insert mode, pass fake arguments. */ + keep = 0; +! sprintf((char *)num, "%d", STRLEN(xp->xp_pattern)); + args[1] = xp->xp_pattern; + } + else +--- 4694,4700 ---- + { + /* Completion from Insert mode, pass fake arguments. */ + keep = 0; +! sprintf((char *)num, "%d", (int)STRLEN(xp->xp_pattern)); + args[1] = xp->xp_pattern; + } + else +*** ../vim-7.1.238/src/version.c Tue Jan 22 11:58:41 2008 +--- src/version.c Tue Jan 22 12:42:36 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 239, + /**/ + +-- +We apologise again for the fault in the subtitles. Those responsible for +sacking the people who have just been sacked have been sacked. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.240 b/7.1.240 new file mode 100644 index 00000000..7f690850 --- /dev/null +++ b/7.1.240 @@ -0,0 +1,186 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.240 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.240 +Problem: When "gUe" turns a German sharp s into SS the operation stops + before the end of the word. Latin2 has the same sharp s but it's + not changed to SS there. +Solution: Make sure all the characters are operated upon. Detect the sharp + s in latin2. Also fixes that changing case of a multi-byte + character that changes the byte cound doesn't always work. +Files: src/ops.c + + +*** ../vim-7.1.239/src/ops.c Wed Jan 16 20:01:14 2008 +--- src/ops.c Tue Jan 22 16:00:07 2008 +*************** +*** 2184,2189 **** +--- 2184,2191 ---- + } + #endif + ++ static int swapchars __ARGS((int op_type, pos_T *pos, int length)); ++ + /* + * Handle the (non-standard vi) tilde operator. Also for "gu", "gU" and "g?". + */ +*************** +*** 2194,2202 **** + pos_T pos; + #ifdef FEAT_VISUAL + struct block_def bd; +- int todo; + #endif +! int did_change = 0; + + if (u_save((linenr_T)(oap->start.lnum - 1), + (linenr_T)(oap->end.lnum + 1)) == FAIL) +--- 2196,2203 ---- + pos_T pos; + #ifdef FEAT_VISUAL + struct block_def bd; + #endif +! int did_change; + + if (u_save((linenr_T)(oap->start.lnum - 1), + (linenr_T)(oap->end.lnum + 1)) == FAIL) +*************** +*** 2210,2225 **** + { + block_prep(oap, &bd, pos.lnum, FALSE); + pos.col = bd.textcol; +! for (todo = bd.textlen; todo > 0; --todo) +! { +! # ifdef FEAT_MBYTE +! if (has_mbyte) +! todo -= (*mb_ptr2len)(ml_get_pos(&pos)) - 1; +! # endif +! did_change |= swapchar(oap->op_type, &pos); +! if (inc(&pos) == -1) /* at end of file */ +! break; +! } + # ifdef FEAT_NETBEANS_INTG + if (usingNetbeans && did_change) + { +--- 2211,2218 ---- + { + block_prep(oap, &bd, pos.lnum, FALSE); + pos.col = bd.textcol; +! did_change = swapchars(oap->op_type, &pos, bd.textlen); +! + # ifdef FEAT_NETBEANS_INTG + if (usingNetbeans && did_change) + { +*************** +*** 2249,2261 **** + else if (!oap->inclusive) + dec(&(oap->end)); + +! while (ltoreq(pos, oap->end)) +! { +! did_change |= swapchar(oap->op_type, &pos); +! if (inc(&pos) == -1) /* at end of file */ +! break; +! } +! + if (did_change) + { + changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, +--- 2242,2248 ---- + else if (!oap->inclusive) + dec(&(oap->end)); + +! did_change = swapchars(oap->op_type, &pos, oap->end.col - pos.col + 1); + if (did_change) + { + changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, +*************** +*** 2309,2314 **** +--- 2296,2337 ---- + } + + /* ++ * Invoke swapchar() on "length" bytes at position "pos". ++ * "pos" is advanced to just after the changed characters. ++ * "length" is rounded up to include the whole last multi-byte character. ++ * Also works correctly when the number of bytes changes. ++ * Returns TRUE if some character was changed. ++ */ ++ static int ++ swapchars(op_type, pos, length) ++ int op_type; ++ pos_T *pos; ++ int length; ++ { ++ int todo; ++ int did_change = 0; ++ ++ for (todo = length; todo > 0; --todo) ++ { ++ # ifdef FEAT_MBYTE ++ int pos_col = pos->col; ++ ++ if (has_mbyte) ++ /* we're counting bytes, not characters */ ++ todo -= (*mb_ptr2len)(ml_get_pos(pos)) - 1; ++ # endif ++ did_change |= swapchar(op_type, pos); ++ # ifdef FEAT_MBYTE ++ /* Changing German sharp s to SS increases the column. */ ++ todo += pos->col - pos_col; ++ # endif ++ if (inc(pos) == -1) /* at end of file */ ++ break; ++ } ++ return did_change; ++ } ++ ++ /* + * If op_type == OP_UPPER: make uppercase, + * if op_type == OP_LOWER: make lowercase, + * if op_type == OP_ROT13: do rot13 encoding, +*************** +*** 2330,2336 **** + return FALSE; + + #ifdef FEAT_MBYTE +! if (op_type == OP_UPPER && enc_latin1like && c == 0xdf) + { + pos_T sp = curwin->w_cursor; + +--- 2353,2360 ---- + return FALSE; + + #ifdef FEAT_MBYTE +! if (op_type == OP_UPPER && c == 0xdf +! && (enc_latin1like || STRCMP(p_enc, "iso-8859-2") == 0)) + { + pos_T sp = curwin->w_cursor; + +*** ../vim-7.1.239/src/version.c Tue Jan 22 12:44:03 2008 +--- src/version.c Tue Jan 22 15:36:36 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 240, + /**/ + +-- +ARTHUR: It is I, Arthur, son of Uther Pendragon, from the castle of Camelot. + King of all Britons, defeator of the Saxons, sovereign of all England! + [Pause] +SOLDIER: Get away! + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.241 b/7.1.241 new file mode 100644 index 00000000..4a04c690 --- /dev/null +++ b/7.1.241 @@ -0,0 +1,112 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.241 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.241 +Problem: Focus change events not always ignored. (Erik Falor) +Solution: Ignore K_IGNORE in Insert mode in a few more places. +Files: src/edit.c + + +*** ../vim-7.1.240/src/edit.c Wed Jan 16 20:01:14 2008 +--- src/edit.c Tue Jan 22 17:45:32 2008 +*************** +*** 703,712 **** + #endif + + /* +! * Get a character for Insert mode. + */ + lastc = c; /* remember previous char for CTRL-D */ +! c = safe_vgetc(); + + #ifdef FEAT_AUTOCMD + /* Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. */ +--- 703,715 ---- + #endif + + /* +! * Get a character for Insert mode. Ignore K_IGNORE. + */ + lastc = c; /* remember previous char for CTRL-D */ +! do +! { +! c = safe_vgetc(); +! } while (c == K_IGNORE); + + #ifdef FEAT_AUTOCMD + /* Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. */ +*************** +*** 777,783 **** + /* Prepare for or stop CTRL-X mode. This doesn't do completion, but + * it does fix up the text when finishing completion. */ + compl_get_longest = FALSE; +! if (c != K_IGNORE && ins_compl_prep(c)) + continue; + #endif + +--- 780,786 ---- + /* Prepare for or stop CTRL-X mode. This doesn't do completion, but + * it does fix up the text when finishing completion. */ + compl_get_longest = FALSE; +! if (ins_compl_prep(c)) + continue; + #endif + +*************** +*** 4516,4530 **** + else + { + /* Need to get the character to have KeyTyped set. We'll put it +! * back with vungetc() below. */ + c = safe_vgetc(); + +! /* Don't interrupt completion when the character wasn't typed, +! * e.g., when doing @q to replay keys. */ +! if (c != Ctrl_R && KeyTyped) +! compl_interrupted = TRUE; +! +! vungetc(c); + } + } + if (compl_pending != 0 && !got_int) +--- 4519,4535 ---- + else + { + /* Need to get the character to have KeyTyped set. We'll put it +! * back with vungetc() below. But skip K_IGNORE. */ + c = safe_vgetc(); ++ if (c != K_IGNORE) ++ { ++ /* Don't interrupt completion when the character wasn't typed, ++ * e.g., when doing @q to replay keys. */ ++ if (c != Ctrl_R && KeyTyped) ++ compl_interrupted = TRUE; + +! vungetc(c); +! } + } + } + if (compl_pending != 0 && !got_int) +*** ../vim-7.1.240/src/version.c Tue Jan 22 16:01:25 2008 +--- src/version.c Tue Jan 22 17:48:46 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 241, + /**/ + +-- +The problem with political jokes is that they get elected. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.242 b/7.1.242 new file mode 100644 index 00000000..6aab9c87 --- /dev/null +++ b/7.1.242 @@ -0,0 +1,68 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.242 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.242 (after 7.1.005) +Problem: "cib" doesn't work properly on "(x)". (Tim Pope) +Solution: Use ltoreq() instead of lt(). Also fix "ciT" on "x". +Files: src/search.c + + +*** ../vim-7.1.241/src/search.c Sat Jan 19 15:55:51 2008 +--- src/search.c Sat Jan 26 13:56:06 2008 +*************** +*** 3637,3643 **** + oap->inclusive = FALSE; + if (sol) + incl(&curwin->w_cursor); +! else if (lt(start_pos, curwin->w_cursor)) + /* Include the character under the cursor. */ + oap->inclusive = TRUE; + else +--- 3637,3643 ---- + oap->inclusive = FALSE; + if (sol) + incl(&curwin->w_cursor); +! else if (ltoreq(start_pos, curwin->w_cursor)) + /* Include the character under the cursor. */ + oap->inclusive = TRUE; + else +*************** +*** 3754,3759 **** +--- 3754,3763 ---- + old_pos = curwin->w_cursor; + old_end = curwin->w_cursor; /* remember where we started */ + old_start = old_end; ++ #ifdef FEAT_VISUAL ++ if (!VIsual_active || *p_sel == 'e') ++ #endif ++ decl(&old_end); /* old_end is inclusive */ + + /* + * If we start on "" select that block. +*** ../vim-7.1.241/src/version.c Tue Jan 22 17:49:17 2008 +--- src/version.c Sat Jan 26 21:14:05 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 242, + /**/ + +-- +DENNIS: Oh, very nice. King, eh! I expect you've got a palace and fine + clothes and courtiers and plenty of food. And how d'you get that? By + exploiting the workers! By hanging on to outdated imperialist dogma + which perpetuates the social and economic differences in our society! + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index 01e81589..636bcd0e 100644 --- a/README.patches +++ b/README.patches @@ -264,3 +264,12 @@ Individual patches for Vim 7.1: 8648 7.1.231 when shifting lines the change is acted upon multiple times 2002 7.1.232 (after 7.1.207 and 7.1.211) compiler warnings with MSVC 3249 7.1.233 crash with Insert mode completion for a user defined command + 6865 7.1.234 display problems when diff'ing three files + 5925 7.1.235 pattern matching is slow when using a lot of simple patterns + 28992 7.1.236 hang when using complicated pattern and 'hlsearch' or ":match" + 1704 7.1.237 compiler warning on an Alpha processor in Motif code + 1801 7.1.238 searchpair() may fail when using 'c' or 'r' flag + 1639 7.1.239 (after 7.1.233) compiler warning for sprintf() argument + 5157 7.1.240 "gUe" may stop before the end of the word + 3093 7.1.241 focus change events not always ignored + 2262 7.1.242 "cib" doesn't work properly on "(x)" diff --git a/vim.spec b/vim.spec index aefd57db..467b2928 100644 --- a/vim.spec +++ b/vim.spec @@ -17,13 +17,13 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 233 +%define patchlevel 242 Summary: The VIM editor URL: http://www.vim.org/ Name: vim Version: %{baseversion}.%{beta}%{patchlevel} -Release: 2%{?dist} +Release: 1%{?dist} License: Vim Group: Applications/Editors Source0: ftp://ftp.vim.org/pub/vim/unix/vim-%{baseversion}%{?beta}%{?CVSDATE}.tar.bz2 @@ -286,6 +286,15 @@ Patch230: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.230 Patch231: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.231 Patch232: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.232 Patch233: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.233 +Patch234: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.234 +Patch235: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.235 +Patch236: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.236 +Patch237: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.237 +Patch238: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.238 +Patch239: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.239 +Patch240: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.240 +Patch241: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.241 +Patch242: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.242 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch @@ -653,6 +662,15 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch231 -p0 %patch232 -p0 %patch233 -p0 +%patch234 -p0 +%patch235 -p0 +%patch236 -p0 +%patch237 -p0 +%patch238 -p0 +%patch239 -p0 +%patch240 -p0 +%patch241 -p0 +%patch242 -p0 # install spell files @@ -1040,6 +1058,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Sun Jan 27 2008 Karsten Hopp 7.1.242-1 +- patchlevel 242 + * Fri Jan 18 2008 Karsten Hopp 7.1.233-2 - silence taglist plugin (#429200) From 868992f4edcaa37ce973f3164f9dcee7b6c8cdbe Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 11 Feb 2008 15:05:21 +0000 Subject: [PATCH 06/71] - patchlevel 245 --- 7.1.243 | 165 +++++++++++++++++++++++++++++++++++++++++++++++++ 7.1.244 | 58 +++++++++++++++++ 7.1.245 | 92 +++++++++++++++++++++++++++ README.patches | 4 ++ vim.spec | 5 +- 5 files changed, 323 insertions(+), 1 deletion(-) create mode 100644 7.1.243 create mode 100644 7.1.244 create mode 100644 7.1.245 diff --git a/7.1.243 b/7.1.243 new file mode 100644 index 00000000..102546c1 --- /dev/null +++ b/7.1.243 @@ -0,0 +1,165 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.243 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.243 (after 7.1.240) +Problem: "U" doesn't work on all text in Visual mode. (Adri Verhoef) +Solution: Loop over all the lines to be changed. Add tests for this. +Files: src/ops.c, src/testdir/test39.in, src/testdir/test39.ok + + +*** ../vim-7.1.242/src/ops.c Tue Jan 22 16:01:25 2008 +--- src/ops.c Mon Feb 4 22:23:22 2008 +*************** +*** 2197,2203 **** + #ifdef FEAT_VISUAL + struct block_def bd; + #endif +! int did_change; + + if (u_save((linenr_T)(oap->start.lnum - 1), + (linenr_T)(oap->end.lnum + 1)) == FAIL) +--- 2197,2203 ---- + #ifdef FEAT_VISUAL + struct block_def bd; + #endif +! int did_change = FALSE; + + if (u_save((linenr_T)(oap->start.lnum - 1), + (linenr_T)(oap->end.lnum + 1)) == FAIL) +*************** +*** 2242,2248 **** + else if (!oap->inclusive) + dec(&(oap->end)); + +! did_change = swapchars(oap->op_type, &pos, oap->end.col - pos.col + 1); + if (did_change) + { + changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, +--- 2242,2259 ---- + else if (!oap->inclusive) + dec(&(oap->end)); + +! if (pos.lnum == oap->end.lnum) +! did_change = swapchars(oap->op_type, &pos, +! oap->end.col - pos.col + 1); +! else +! for (;;) +! { +! did_change |= swapchars(oap->op_type, &pos, +! pos.lnum == oap->end.lnum ? oap->end.col + 1: +! (int)STRLEN(ml_get_pos(&pos))); +! if (ltoreq(oap->end, pos) || inc(&pos) == -1) +! break; +! } + if (did_change) + { + changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, +*************** +*** 2314,2330 **** + for (todo = length; todo > 0; --todo) + { + # ifdef FEAT_MBYTE +- int pos_col = pos->col; +- + if (has_mbyte) + /* we're counting bytes, not characters */ + todo -= (*mb_ptr2len)(ml_get_pos(pos)) - 1; + # endif + did_change |= swapchar(op_type, pos); +- # ifdef FEAT_MBYTE +- /* Changing German sharp s to SS increases the column. */ +- todo += pos->col - pos_col; +- # endif + if (inc(pos) == -1) /* at end of file */ + break; + } +--- 2325,2335 ---- +*** ../vim-7.1.242/src/testdir/test39.in Sun Jun 13 18:21:09 2004 +--- src/testdir/test39.in Wed Feb 6 13:57:37 2008 +*************** +*** 1,8 **** +--- 1,10 ---- + + Test Visual block mode commands ++ And test "U" in Visual mode, also on German sharp S. + + STARTTEST + :so small.vim ++ :so mbyte.vim + /^abcde + :" Test shift-right of a block + jlllljj>wlljlll> +*************** +*** 14,20 **** + Gllllkkklllrq + :" Test block-change + G$khhhhhkkcmno +! :$-4,$wq! test.out + ENDTEST + + abcdefghijklm +--- 16,37 ---- + Gllllkkklllrq + :" Test block-change + G$khhhhhkkcmno +! :$-4,$w! test.out +! :" gUe must uppercase a whole word, also when ß changes to SS +! Gothe youtußeuu endYpk0wgUe +! :" gUfx must uppercase until x, inclusive. +! O- youßtußexu -0fogUfx +! :" VU must uppercase a whole line +! YpkVU +! :" same, when it's the last line in the buffer +! YPGi111VUddP +! :" Uppercase two lines +! Oblah di +! doh dutVkUj +! :" Uppercase part of two lines +! ddppi333k0i222fyllvjfuUk +! :/^the/,$w >> test.out +! :qa! + ENDTEST + + abcdefghijklm +*** ../vim-7.1.242/src/testdir/test39.ok Sun Jun 13 18:59:28 2004 +--- src/testdir/test39.ok Tue Feb 5 22:25:38 2008 +*************** +*** 3,5 **** +--- 3,13 ---- + axyzqqqqef mno ghijklm + axyzqqqqefgmnoklm + abcdqqqqijklm ++ the YOUTUSSEUU end ++ - yOUSSTUSSEXu - ++ THE YOUTUSSEUU END ++ 111THE YOUTUSSEUU END ++ BLAH DI ++ DOH DUT ++ 222the yoUTUSSEUU END ++ 333THE YOUTUßeuu end +*** ../vim-7.1.242/src/version.c Sat Jan 26 21:15:00 2008 +--- src/version.c Wed Feb 6 14:41:00 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 243, + /**/ + +-- +It's totally unfair to suggest - as many have - that engineers are socially +inept. Engineers simply have different objectives when it comes to social +interaction. + (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.244 b/7.1.244 new file mode 100644 index 00000000..6c4c43f2 --- /dev/null +++ b/7.1.244 @@ -0,0 +1,58 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.244 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.244 +Problem: GUI may have part of the command line cut off. +Solution: Don't round the number of lines up, always round down. + (Tony Houghton, Scott Dillard) +Files: src/gui.c + + +*** ../vim-7.1.243/src/gui.c Sat Jan 19 15:55:51 2008 +--- src/gui.c Wed Feb 6 16:43:44 2008 +*************** +*** 1294,1304 **** + out_flush(); + + gui.num_cols = (pixel_width - gui_get_base_width()) / gui.char_width; +! gui.num_rows = (pixel_height - gui_get_base_height() +! #if !defined(FEAT_GUI_PHOTON) && !defined(FEAT_GUI_MSWIN) +! + (gui.char_height / 2) +! #endif +! ) / gui.char_height; + + gui_position_components(pixel_width); + +--- 1294,1300 ---- + out_flush(); + + gui.num_cols = (pixel_width - gui_get_base_width()) / gui.char_width; +! gui.num_rows = (pixel_height - gui_get_base_height()) / gui.char_height; + + gui_position_components(pixel_width); + +*** ../vim-7.1.243/src/version.c Wed Feb 6 14:43:50 2008 +--- src/version.c Wed Feb 6 17:32:35 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 244, + /**/ + +-- +A consultant is a person who takes your money and annoys your employees while +tirelessly searching for the best way to extend the consulting contract. + (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.245 b/7.1.245 new file mode 100644 index 00000000..ce7a7b51 --- /dev/null +++ b/7.1.245 @@ -0,0 +1,92 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.245 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.245 +Problem: Pressing CTRL-\ three times causes Vim to quit. (Ranganath Rao). + Also for f CTRL-\ CTRL-\. +Solution: When going to cooked mode in mch_delay() set a flag to ignore + SIGQUIT. +Files: src/os_unix.c + + +*** ../vim-7.1.244/src/os_unix.c Sun Jan 13 16:30:23 2008 +--- src/os_unix.c Sun Feb 10 22:07:27 2008 +*************** +*** 195,200 **** +--- 195,201 ---- + static int show_shell_mess = TRUE; + #endif + static int deadly_signal = 0; /* The signal we caught */ ++ static int in_mch_delay = FALSE; /* sleeping in mch_delay() */ + + static int curr_tmode = TMODE_COOK; /* contains current terminal mode */ + +*************** +*** 538,544 **** + if (ignoreinput) + { + /* Go to cooked mode without echo, to allow SIGINT interrupting us +! * here */ + old_tmode = curr_tmode; + if (curr_tmode == TMODE_RAW) + settmode(TMODE_SLEEP); +--- 539,547 ---- + if (ignoreinput) + { + /* Go to cooked mode without echo, to allow SIGINT interrupting us +! * here. But we don't want QUIT to kill us (CTRL-\ used in a +! * shell may produce SIGQUIT). */ +! in_mch_delay = TRUE; + old_tmode = curr_tmode; + if (curr_tmode == TMODE_RAW) + settmode(TMODE_SLEEP); +*************** +*** 602,607 **** +--- 605,611 ---- + #endif + + settmode(old_tmode); ++ in_mch_delay = FALSE; + } + else + WaitForChar(msec); +*************** +*** 922,927 **** +--- 926,939 ---- + #endif + + #ifdef SIGHASARG ++ # ifdef SIGQUIT ++ /* While in mch_delay() we go to cooked mode to allow a CTRL-C to ++ * interrupt us. But in cooked mode we may also get SIGQUIT, e.g., when ++ * pressing CTRL-\, but we don't want Vim to exit then. */ ++ if (in_mch_delay && sigarg == SIGQUIT) ++ SIGRETURN; ++ # endif ++ + /* When SIGHUP, SIGQUIT, etc. are blocked: postpone the effect and return + * here. This avoids that a non-reentrant function is interrupted, e.g., + * free(). Calling free() again may then cause a crash. */ +*** ../vim-7.1.244/src/version.c Wed Feb 6 17:33:19 2008 +--- src/version.c Sun Feb 10 22:04:09 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 245, + /**/ + +-- +Me? A skeptic? I trust you have proof. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index 636bcd0e..159f3bba 100644 --- a/README.patches +++ b/README.patches @@ -107,6 +107,7 @@ Individual patches for Vim 7.1: 5259 7.1.074 crash when using string() on a recursively nested List 1686 7.1.075 ":let v:statusmsg" reads memory already freed 2376 7.1.076 a couple more strcpy() with overlapping arguments + 1551 7.1.077 "can_spell" is used without initializing it 2678 7.1.078 dropping file name on gvim containing CSI byte doesn't work 2922 7.1.079 "@" character in 'isfname' doesn't pick up umlauts for latin1 2960 7.1.080 (extra) Compiler warnings for gvimex.cpp @@ -273,3 +274,6 @@ Individual patches for Vim 7.1: 5157 7.1.240 "gUe" may stop before the end of the word 3093 7.1.241 focus change events not always ignored 2262 7.1.242 "cib" doesn't work properly on "(x)" + 4475 7.1.243 (after 7.1.240) "U" doesn't work on all text in Visual mode + 1847 7.1.244 GUI may have part of the command line cut off + 2767 7.1.245 pressing CTRL-\ three times causes Vim to quit diff --git a/vim.spec b/vim.spec index 467b2928..62900a38 100644 --- a/vim.spec +++ b/vim.spec @@ -17,7 +17,7 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 242 +%define patchlevel 245 Summary: The VIM editor URL: http://www.vim.org/ @@ -1058,6 +1058,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Mon Feb 11 2008 Karsten Hopp 7.1.245-1 +- patchlevel 245 + * Sun Jan 27 2008 Karsten Hopp 7.1.242-1 - patchlevel 242 From 1ed41e10fdd4a7851e4a330820ea32877abc2219 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:27:41 +0000 Subject: [PATCH 07/71] - add fix for #231124 --- vimrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vimrc b/vimrc index 69a06225..8da18fbf 100644 --- a/vimrc +++ b/vimrc @@ -1,5 +1,5 @@ if v:lang =~ "utf8$" || v:lang =~ "UTF-8$" - set fileencodings=utf-8,latin1 + set fileencodings=ucs-bom,utf-8,latin1 endif set nocompatible " Use Vim defaults (much better!) From a0b9169bcc1f3a192c55602439893eff5a436836 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:35:49 +0000 Subject: [PATCH 08/71] - patchlevel 246 --- 7.1.246 | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 7.1.246 diff --git a/7.1.246 b/7.1.246 new file mode 100644 index 00000000..f4a7eb76 --- /dev/null +++ b/7.1.246 @@ -0,0 +1,72 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.246 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.246 +Problem: Configure hangs when the man pager is something strange. (lorien) +Solution: Set MANPAGER and PAGER to "cat". (Micah Cowan) +Files: src/auto/configure, src/configure.in + + +*** ../vim-7.1.245/src/auto/configure Tue Jan 1 16:25:33 2008 +--- src/auto/configure Wed Feb 13 10:22:56 2008 +*************** +*** 14259,14265 **** + echo "$as_me:$LINENO: checking how to run man with a section nr" >&5 + echo $ECHO_N "checking how to run man with a section nr... $ECHO_C" >&6 + MANDEF="man" +! (eval man -s 2 read) < /dev/null > /dev/null 2>&5 && MANDEF="man -s" + echo "$as_me:$LINENO: result: $MANDEF" >&5 + echo "${ECHO_T}$MANDEF" >&6 + if test "$MANDEF" = "man -s"; then +--- 14259,14265 ---- + echo "$as_me:$LINENO: checking how to run man with a section nr" >&5 + echo $ECHO_N "checking how to run man with a section nr... $ECHO_C" >&6 + MANDEF="man" +! (eval MANPAGER=cat PAGER=cat man -s 2 read) < /dev/null > /dev/null 2>&5 && MANDEF="man -s" + echo "$as_me:$LINENO: result: $MANDEF" >&5 + echo "${ECHO_T}$MANDEF" >&6 + if test "$MANDEF" = "man -s"; then +*** ../vim-7.1.245/src/configure.in Tue Jan 1 16:25:33 2008 +--- src/configure.in Fri Jan 25 20:51:51 2008 +*************** +*** 2726,2732 **** + dnl Check how we can run man with a section number + AC_MSG_CHECKING(how to run man with a section nr) + MANDEF="man" +! (eval man -s 2 read) < /dev/null > /dev/null 2>&AC_FD_CC && MANDEF="man -s" + AC_MSG_RESULT($MANDEF) + if test "$MANDEF" = "man -s"; then + AC_DEFINE(USEMAN_S) +--- 2726,2732 ---- + dnl Check how we can run man with a section number + AC_MSG_CHECKING(how to run man with a section nr) + MANDEF="man" +! (eval MANPAGER=cat PAGER=cat man -s 2 read) < /dev/null > /dev/null 2>&AC_FD_CC && MANDEF="man -s" + AC_MSG_RESULT($MANDEF) + if test "$MANDEF" = "man -s"; then + AC_DEFINE(USEMAN_S) +*** ../vim-7.1.245/src/version.c Sun Feb 10 22:25:12 2008 +--- src/version.c Wed Feb 13 10:26:47 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 246, + /**/ + +-- +Anyone who is capable of getting themselves made President should on no +account be allowed to do the job. + -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy" + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 86e3d796425c09c8e6f91bf693bef765d6b5d559 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:35:57 +0000 Subject: [PATCH 09/71] - patchlevel 247 --- 7.1.247 | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 7.1.247 diff --git a/7.1.247 b/7.1.247 new file mode 100644 index 00000000..ca65c9d6 --- /dev/null +++ b/7.1.247 @@ -0,0 +1,162 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.247 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.247 +Problem: When using Netbeans backspacing in Insert mode skips a character + now and then. (Ankit Jain) +Solution: Avoid calling netbeans_removed(), it frees the line pointer. + (partly by Dominique Pelle). +Files: src/misc1.c + + +*** ../vim-7.1.246/src/misc1.c Sat Jan 19 15:55:51 2008 +--- src/misc1.c Wed Feb 13 10:56:16 2008 +*************** +*** 2270,2282 **** + /* + * If the old line has been allocated the deletion can be done in the + * existing line. Otherwise a new line has to be allocated + */ +- was_alloced = ml_line_alloced(); /* check if oldp was allocated */ + #ifdef FEAT_NETBEANS_INTG +! if (was_alloced && usingNetbeans) +! netbeans_removed(curbuf, lnum, col, count); +! /* else is handled by ml_replace() */ + #endif + if (was_alloced) + newp = oldp; /* use same allocated memory */ + else +--- 2270,2285 ---- + /* + * If the old line has been allocated the deletion can be done in the + * existing line. Otherwise a new line has to be allocated ++ * Can't do this when using Netbeans, because we would need to invoke ++ * netbeans_removed(), which deallocates the line. Let ml_replace() take ++ * care of notifiying Netbeans. + */ + #ifdef FEAT_NETBEANS_INTG +! if (usingNetbeans) +! was_alloced = FALSE; +! else + #endif ++ was_alloced = ml_line_alloced(); /* check if oldp was allocated */ + if (was_alloced) + newp = oldp; /* use same allocated memory */ + else +*************** +*** 3978,3984 **** + /* remove trailing path separator */ + #ifndef MACOS_CLASSIC + /* With MacOS path (with colons) the final colon is required */ +! /* to avoid confusion between absoulute and relative path */ + if (pend > p && after_pathsep(p, pend)) + --pend; + #endif +--- 3981,3987 ---- + /* remove trailing path separator */ + #ifndef MACOS_CLASSIC + /* With MacOS path (with colons) the final colon is required */ +! /* to avoid confusion between absolute and relative path */ + if (pend > p && after_pathsep(p, pend)) + --pend; + #endif +*************** +*** 5689,5695 **** + else if (lookfor_ctor_init || class_or_struct) + { + /* we have something found, that looks like the start of +! * cpp-base-class-declaration or contructor-initialization */ + cpp_base_class = TRUE; + lookfor_ctor_init = class_or_struct = FALSE; + *col = 0; +--- 5692,5698 ---- + else if (lookfor_ctor_init || class_or_struct) + { + /* we have something found, that looks like the start of +! * cpp-base-class-declaration or constructor-initialization */ + cpp_base_class = TRUE; + lookfor_ctor_init = class_or_struct = FALSE; + *col = 0; +*************** +*** 6146,6152 **** + pos_T our_paren_pos; + char_u *start; + int start_brace; +! #define BRACE_IN_COL0 1 /* '{' is in comumn 0 */ + #define BRACE_AT_START 2 /* '{' is at start of line */ + #define BRACE_AT_END 3 /* '{' is at end of line */ + linenr_T ourscope; +--- 6149,6155 ---- + pos_T our_paren_pos; + char_u *start; + int start_brace; +! #define BRACE_IN_COL0 1 /* '{' is in column 0 */ + #define BRACE_AT_START 2 /* '{' is at start of line */ + #define BRACE_AT_END 3 /* '{' is at end of line */ + linenr_T ourscope; +*************** +*** 6369,6375 **** + if (curwin->w_cursor.lnum > 1) + { + /* If the start comment string matches in the previous +! * line, use the indent of that line pluss offset. If + * the middle comment string matches in the previous + * line, use the indent of that line. XXX */ + look = skipwhite(ml_get(curwin->w_cursor.lnum - 1)); +--- 6372,6378 ---- + if (curwin->w_cursor.lnum > 1) + { + /* If the start comment string matches in the previous +! * line, use the indent of that line plus offset. If + * the middle comment string matches in the previous + * line, use the indent of that line. XXX */ + look = skipwhite(ml_get(curwin->w_cursor.lnum - 1)); +*************** +*** 8222,8228 **** + + if (*that && *that != ';') /* not a comment line */ + { +! /* test *that != '(' to accomodate first let/do + * argument if it is more than one line */ + if (!vi_lisp && *that != '(' && *that != '[') + firsttry++; +--- 8225,8231 ---- + + if (*that && *that != ';') /* not a comment line */ + { +! /* test *that != '(' to accommodate first let/do + * argument if it is more than one line */ + if (!vi_lisp && *that != '(' && *that != '[') + firsttry++; +*** ../vim-7.1.246/src/version.c Wed Feb 13 10:27:28 2008 +--- src/version.c Wed Feb 13 10:56:42 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 247, + /**/ + +-- +Far back in the mists of ancient time, in the great and glorious days of the +former Galactic Empire, life was wild, rich and largely tax free. +Mighty starships plied their way between exotic suns, seeking adventure and +reward among the furthest reaches of Galactic space. In those days, spirits +were brave, the stakes were high, men were real men, women were real women +and small furry creatures from Alpha Centauri were real small furry creatures +from Alpha Centauri. And all dared to brave unknown terrors, to do mighty +deeds, to boldly split infinitives that no man had split before -- and thus +was the Empire forged. + -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy" + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From a52ea41a30991fb0bdd8a87f03b1e4141c65378b Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:36:18 +0000 Subject: [PATCH 10/71] - patchlevel 248 --- 7.1.248 | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 7.1.248 diff --git a/7.1.248 b/7.1.248 new file mode 100644 index 00000000..57be25d2 --- /dev/null +++ b/7.1.248 @@ -0,0 +1,138 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.248 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.248 +Problem: Can't set the '" mark. Can't know if setpos() was successful. +Solution: Allow setting the '" mark with setpos(). Have setpos() return a + value indicating success/failure. +Files: runtime/doc/eval.txt, src/eval.c, src/mark.c + + +*** ../vim-7.1.247/runtime/doc/eval.txt Sat Jan 12 16:45:25 2008 +--- runtime/doc/eval.txt Wed Feb 13 11:49:16 2008 +*************** +*** 1,4 **** +! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 11 + + + VIM REFERENCE MANUAL by Bram Moolenaar +--- 1,4 ---- +! *eval.txt* For Vim version 7.1. Last change: 2008 Feb 13 + + + VIM REFERENCE MANUAL by Bram Moolenaar +*************** +*** 4523,4528 **** +--- 4528,4536 ---- + character. E.g., a position within a or after the last + character. + ++ Returns 0 when the position could be set, -1 otherwise. ++ An error message is given if {expr} is invalid. ++ + Also see |getpos()| + + This does not restore the preferred column for moving +*** ../vim-7.1.247/src/eval.c Tue Jan 22 11:58:41 2008 +--- src/eval.c Wed Feb 13 11:54:09 2008 +*************** +*** 14776,14799 **** + int fnum; + char_u *name; + + name = get_tv_string_chk(argvars); + if (name != NULL) + { + if (list2fpos(&argvars[1], &pos, &fnum) == OK) + { + --pos.col; +! if (name[0] == '.') /* cursor */ + { + if (fnum == curbuf->b_fnum) + { + curwin->w_cursor = pos; + check_cursor(); + } + else + EMSG(_(e_invarg)); + } +! else if (name[0] == '\'') /* mark */ +! (void)setmark_pos(name[1], &pos, fnum); + else + EMSG(_(e_invarg)); + } +--- 14778,14808 ---- + int fnum; + char_u *name; + ++ rettv->vval.v_number = -1; + name = get_tv_string_chk(argvars); + if (name != NULL) + { + if (list2fpos(&argvars[1], &pos, &fnum) == OK) + { + --pos.col; +! if (name[0] == '.' && name[1] == NUL) + { ++ /* set cursor */ + if (fnum == curbuf->b_fnum) + { + curwin->w_cursor = pos; + check_cursor(); ++ rettv->vval.v_number = 0; + } + else + EMSG(_(e_invarg)); + } +! else if (name[0] == '\'' && name[1] != NUL && name[2] == NUL) +! { +! /* set mark */ +! if (setmark_pos(name[1], &pos, fnum) == OK) +! rettv->vval.v_number = 0; +! } + else + EMSG(_(e_invarg)); + } +*** ../vim-7.1.247/src/mark.c Thu Jan 3 20:21:34 2008 +--- src/mark.c Wed Feb 13 11:42:30 2008 +*************** +*** 79,84 **** +--- 79,90 ---- + return OK; + } + ++ if (c == '"') ++ { ++ curbuf->b_last_cursor = *pos; ++ return OK; ++ } ++ + /* Allow setting '[ and '] for an autocommand that simulates reading a + * file. */ + if (c == '[') +*** ../vim-7.1.247/src/version.c Wed Feb 13 10:57:11 2008 +--- src/version.c Wed Feb 13 12:39:23 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 248, + /**/ + +-- +"Making it up? Why should I want to make anything up? Life's bad enough +as it is without wanting to invent any more of it." + -- Marvin, the Paranoid Android in Douglas Adams' + "The Hitchhiker's Guide to the Galaxy" + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 621ffd82aed7a4305f2663c01fdda03e2b5d1f28 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:36:26 +0000 Subject: [PATCH 11/71] - patchlevel 249 --- 7.1.249 | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 7.1.249 diff --git a/7.1.249 b/7.1.249 new file mode 100644 index 00000000..f377e513 --- /dev/null +++ b/7.1.249 @@ -0,0 +1,76 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.249 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.249 +Problem: After "U" the cursor can be past end of line. (Adri Verhoef) +Solution: Adjust the cursor position in u_undoline(). +Files: src/undo.c + + +*** ../vim-7.1.248/src/undo.c Sat Nov 10 22:50:20 2007 +--- src/undo.c Wed Feb 13 15:17:54 2008 +*************** +*** 1814,1826 **** + if (undo_off) + return; + +! if (curbuf->b_u_line_ptr == NULL || +! curbuf->b_u_line_lnum > curbuf->b_ml.ml_line_count) + { + beep_flush(); + return; + } +! /* first save the line for the 'u' command */ + if (u_savecommon(curbuf->b_u_line_lnum - 1, + curbuf->b_u_line_lnum + 1, (linenr_T)0) == FAIL) + return; +--- 1814,1827 ---- + if (undo_off) + return; + +! if (curbuf->b_u_line_ptr == NULL +! || curbuf->b_u_line_lnum > curbuf->b_ml.ml_line_count) + { + beep_flush(); + return; + } +! +! /* first save the line for the 'u' command */ + if (u_savecommon(curbuf->b_u_line_lnum - 1, + curbuf->b_u_line_lnum + 1, (linenr_T)0) == FAIL) + return; +*************** +*** 1840,1845 **** +--- 1841,1847 ---- + curbuf->b_u_line_colnr = curwin->w_cursor.col; + curwin->w_cursor.col = t; + curwin->w_cursor.lnum = curbuf->b_u_line_lnum; ++ check_cursor_col(); + } + + /* +*** ../vim-7.1.248/src/version.c Wed Feb 13 12:41:30 2008 +--- src/version.c Wed Feb 13 15:20:12 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 249, + /**/ + +-- +How To Keep A Healthy Level Of Insanity: +1. At lunch time, sit in your parked car with sunglasses on and point + a hair dryer at passing cars. See if they slow down. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 3a43b597ab053959ab1e854dfb2825780f7a8adc Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:36:40 +0000 Subject: [PATCH 12/71] - patchlevel 250 --- 7.1.250 | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 7.1.250 diff --git a/7.1.250 b/7.1.250 new file mode 100644 index 00000000..0306206b --- /dev/null +++ b/7.1.250 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.250 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.250 +Problem: ":setglobal fenc=anything" gives an error message in a buffer + where 'modifiable' is off. (Ben Schmidt) +Solution: Don't give an error if 'modifiable' doesn't matter. +Files: src/option.c + + +*** ../vim-7.1.249/src/option.c Sat Jan 19 15:55:51 2008 +--- src/option.c Wed Feb 13 18:31:39 2008 +*************** +*** 5671,5677 **** + { + if (gvarp == &p_fenc) + { +! if (!curbuf->b_p_ma) + errmsg = e_modifiable; + else if (vim_strchr(*varp, ',') != NULL) + /* No comma allowed in 'fileencoding'; catches confusing it +--- 5671,5677 ---- + { + if (gvarp == &p_fenc) + { +! if (!curbuf->b_p_ma && opt_flags != OPT_GLOBAL) + errmsg = e_modifiable; + else if (vim_strchr(*varp, ',') != NULL) + /* No comma allowed in 'fileencoding'; catches confusing it +*** ../vim-7.1.249/src/version.c Wed Feb 13 15:20:59 2008 +--- src/version.c Wed Feb 13 18:34:24 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 250, + /**/ + +-- +How To Keep A Healthy Level Of Insanity: +3. Every time someone asks you to do something, ask if they want fries + with that. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From f4f5d7c5d51315fb2f3ed51ee93918297bfebf2e Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:36:48 +0000 Subject: [PATCH 13/71] - patchlevel 251 --- 7.1.251 | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 7.1.251 diff --git a/7.1.251 b/7.1.251 new file mode 100644 index 00000000..671807e8 --- /dev/null +++ b/7.1.251 @@ -0,0 +1,99 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.251 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.251 +Problem: Using freed memory when spell checking enabled. +Solution: Obtain the current line again after calling spell_move_to(). + (Dominique Pelle) +Files: src/screen.c + + +*** ../vim-7.1.250/src/screen.c Sat Jan 19 15:55:51 2008 +--- src/screen.c Wed Feb 13 21:45:38 2008 +*************** +*** 2644,2650 **** + #if defined(FEAT_SIGNS) || (defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)) \ + || defined(FEAT_SYN_HL) || defined(FEAT_DIFF) + # define LINE_ATTR +! int line_attr = 0; /* atrribute for the whole line */ + #endif + #ifdef FEAT_SEARCH_EXTRA + matchitem_T *cur; /* points to the match list */ +--- 2644,2650 ---- + #if defined(FEAT_SIGNS) || (defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)) \ + || defined(FEAT_SYN_HL) || defined(FEAT_DIFF) + # define LINE_ATTR +! int line_attr = 0; /* attribute for the whole line */ + #endif + #ifdef FEAT_SEARCH_EXTRA + matchitem_T *cur; /* points to the match list */ +*************** +*** 3040,3057 **** + if (has_spell) + { + int len; + hlf_T spell_hlf = HLF_COUNT; + + pos = wp->w_cursor; + wp->w_cursor.lnum = lnum; +! wp->w_cursor.col = (colnr_T)(ptr - line); + len = spell_move_to(wp, FORWARD, TRUE, TRUE, &spell_hlf); + if (len == 0 || (int)wp->w_cursor.col > ptr - line) + { + /* no bad word found at line start, don't check until end of a + * word */ + spell_hlf = HLF_COUNT; +! word_end = (int)(spell_to_word_end(ptr, wp->w_buffer) - line + 1); + } + else + { +--- 3040,3064 ---- + if (has_spell) + { + int len; ++ colnr_T linecol = (colnr_T)(ptr - line); + hlf_T spell_hlf = HLF_COUNT; + + pos = wp->w_cursor; + wp->w_cursor.lnum = lnum; +! wp->w_cursor.col = linecol; + len = spell_move_to(wp, FORWARD, TRUE, TRUE, &spell_hlf); ++ ++ /* spell_move_to() may call ml_get() and make "line" invalid */ ++ line = ml_get_buf(wp->w_buffer, lnum, FALSE); ++ ptr = line + linecol; ++ + if (len == 0 || (int)wp->w_cursor.col > ptr - line) + { + /* no bad word found at line start, don't check until end of a + * word */ + spell_hlf = HLF_COUNT; +! word_end = (int)(spell_to_word_end(ptr, wp->w_buffer) +! - line + 1); + } + else + { +*** ../vim-7.1.250/src/version.c Wed Feb 13 18:35:23 2008 +--- src/version.c Wed Feb 13 21:48:08 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 251, + /**/ + +-- +How To Keep A Healthy Level Of Insanity: +6. In the memo field of all your checks, write "for sexual favors". + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From c6e94cd1cd05cc1b55b2d37ed6b321fea118d555 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:37:03 +0000 Subject: [PATCH 14/71] - patchlevel 252 --- 7.1.252 | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 7.1.252 diff --git a/7.1.252 b/7.1.252 new file mode 100644 index 00000000..9681301f --- /dev/null +++ b/7.1.252 @@ -0,0 +1,47 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.252 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.252 (after 7.1.243) +Problem: Test 39 fails when the environment has a utf-8 locale. (Dominique + Pelle) +Solution: Force 'encoding' to be latin1. +Files: src/testdir/test39.in + + +*** ../vim-7.1.251/src/testdir/test39.in Wed Feb 6 14:43:50 2008 +--- src/testdir/test39.in Thu Feb 14 22:16:57 2008 +*************** +*** 5,10 **** +--- 5,12 ---- + STARTTEST + :so small.vim + :so mbyte.vim ++ :" This only works when 'encoding' is "latin1", don't depend on the environment ++ :set enc=latin1 + /^abcde + :" Test shift-right of a block + jlllljj>wlljlll> +*** ../vim-7.1.251/src/version.c Wed Feb 13 21:48:24 2008 +--- src/version.c Thu Feb 14 22:18:11 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 252, + /**/ + +-- +How To Keep A Healthy Level Of Insanity: +9. As often as possible, skip rather than walk. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 06acbda578a92d192de19c027411514da8f153bd Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:37:11 +0000 Subject: [PATCH 15/71] - patchlevel 253 --- 7.1.253 | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 7.1.253 diff --git a/7.1.253 b/7.1.253 new file mode 100644 index 00000000..2565ed19 --- /dev/null +++ b/7.1.253 @@ -0,0 +1,53 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.253 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.253 +Problem: ":sort" doesn't work in a one line file. (Patrick Texier) +Solution: Don't sort if there is only one line. (Dominique Pelle) +Files: src/ex_cmds.c + + +*** ../vim-7.1.252/src/ex_cmds.c Sat Jan 19 15:55:51 2008 +--- src/ex_cmds.c Mon Feb 18 19:38:02 2008 +*************** +*** 365,370 **** +--- 365,374 ---- + int sort_oct; /* sort on octal number */ + int sort_hex; /* sort on hex number */ + ++ /* Sorting one line is really quick! */ ++ if (count <= 1) ++ return; ++ + if (u_save((linenr_T)(eap->line1 - 1), (linenr_T)(eap->line2 + 1)) == FAIL) + return; + sortbuf1 = NULL; +*** ../vim-7.1.252/src/version.c Thu Feb 14 22:19:39 2008 +--- src/version.c Mon Feb 18 19:39:24 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 253, + /**/ + +-- +"You know, it's at times like this when I'm trapped in a Vogon airlock with +a man from Betelgeuse and about to die of asphyxiation in deep space that I +really wish I'd listened to what my mother told me when I was young!" +"Why, what did she tell you?" +"I don't know, I didn't listen!" + -- Arthur Dent and Ford Prefect in Douglas Adams' + "The Hitchhiker's Guide to the Galaxy" + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 30b093d02606776145d5d206c7943655b962ddfb Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:37:23 +0000 Subject: [PATCH 16/71] - patchlevel 254 --- 7.1.254 | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 7.1.254 diff --git a/7.1.254 b/7.1.254 new file mode 100644 index 00000000..19c69f3c --- /dev/null +++ b/7.1.254 @@ -0,0 +1,65 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.254 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.254 +Problem: Tests 49 and 55 fail when the locale is French. +Solution: Using C messages for test 49. Filter the error message in test 55 + such that it works when the number is halfway the message. +Files: src/testdir/test49.in, src/testdir/test55.in + + +*** ../vim-7.1.253/src/testdir/test49.in Tue Sep 25 17:54:41 2007 +--- src/testdir/test49.in Tue Feb 19 21:03:20 2008 +*************** +*** 6,11 **** +--- 6,12 ---- + STARTTEST + :so small.vim + :se nocp nomore viminfo+=nviminfo ++ :lang mess C + :so test49.vim + GGGGGGGGGGGGGG"rp:.-,$w! test.out + :" +*** ../vim-7.1.253/src/testdir/test55.in Tue Sep 25 17:54:41 2007 +--- src/testdir/test55.in Tue Feb 19 21:06:21 2008 +*************** +*** 146,152 **** + :try + : let n = d[1500] + :catch +! : $put =v:exception[:14] . v:exception[-4:-1] + :endtry + :" lookup each items + :for i in range(1500) +--- 146,152 ---- + :try + : let n = d[1500] + :catch +! : $put =substitute(v:exception, '\v(.{14}).*( \d{4}).*', '\1\2', '') + :endtry + :" lookup each items + :for i in range(1500) +*** ../vim-7.1.253/src/version.c Mon Feb 18 19:41:40 2008 +--- src/version.c Wed Feb 20 10:16:59 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 254, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +34. You laugh at people with 14400 baud modems. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 11ce335136d86a411a3ea6974b582c91d6404140 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:37:30 +0000 Subject: [PATCH 17/71] - patchlevel 255 --- 7.1.255 | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 7.1.255 diff --git a/7.1.255 b/7.1.255 new file mode 100644 index 00000000..6d7ebaa9 --- /dev/null +++ b/7.1.255 @@ -0,0 +1,50 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.255 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.255 +Problem: Vim doesn't support utf-32. (Yongwei Wu) +Solution: Add aliases for utf-32, it's the same as ucs-4. +Files: src/mbyte.c + + +*** ../vim-7.1.254/src/mbyte.c Sun Jan 6 17:18:16 2008 +--- src/mbyte.c Tue Feb 19 20:31:48 2008 +*************** +*** 360,365 **** +--- 360,371 ---- + {"ucs4be", IDX_UCS4}, + {"ucs-4be", IDX_UCS4}, + {"ucs4le", IDX_UCS4LE}, ++ {"utf32", IDX_UCS4}, ++ {"utf-32", IDX_UCS4}, ++ {"utf32be", IDX_UCS4}, ++ {"utf-32be", IDX_UCS4}, ++ {"utf32le", IDX_UCS4LE}, ++ {"utf-32le", IDX_UCS4LE}, + {"932", IDX_CP932}, + {"949", IDX_CP949}, + {"936", IDX_CP936}, +*** ../vim-7.1.254/src/version.c Wed Feb 20 10:57:11 2008 +--- src/version.c Wed Feb 20 11:27:00 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 255, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +37. You start looking for hot HTML addresses in public restrooms. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From f70bc58327af45aa44dfe09904ee7bd3e01d837a Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:37:40 +0000 Subject: [PATCH 18/71] - patchlevel 256 --- 7.1.256 | 1808 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1808 insertions(+) create mode 100644 7.1.256 diff --git a/7.1.256 b/7.1.256 new file mode 100644 index 00000000..25d9bbc0 --- /dev/null +++ b/7.1.256 @@ -0,0 +1,1808 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.256 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.256 +Problem: findfile() also returns directories. +Solution: Cleanup the code for finding files and directories in a list of + directories. Remove the ugly global ff_search_ctx. +Files: src/eval.c, src/misc2.c, src/vim.h, src/tag.c + + +*** ../vim-7.1.255/src/eval.c Wed Feb 13 12:41:30 2008 +--- src/eval.c Wed Feb 20 11:08:21 2008 +*************** +*** 9203,9215 **** + rettv->vval.v_number = filewritable(get_tv_string(&argvars[0])); + } + +! static void findfilendir __ARGS((typval_T *argvars, typval_T *rettv, int dir)); + + static void +! findfilendir(argvars, rettv, dir) + typval_T *argvars; + typval_T *rettv; +! int dir; + { + #ifdef FEAT_SEARCHPATH + char_u *fname; +--- 9205,9217 ---- + rettv->vval.v_number = filewritable(get_tv_string(&argvars[0])); + } + +! static void findfilendir __ARGS((typval_T *argvars, typval_T *rettv, int find_what)); + + static void +! findfilendir(argvars, rettv, find_what) + typval_T *argvars; + typval_T *rettv; +! int find_what; + { + #ifdef FEAT_SEARCHPATH + char_u *fname; +*************** +*** 9254,9261 **** + vim_free(fresult); + fresult = find_file_in_path_option(first ? fname : NULL, + first ? (int)STRLEN(fname) : 0, +! 0, first, path, dir, curbuf->b_ffname, +! dir ? (char_u *)"" : curbuf->b_p_sua); + first = FALSE; + + if (fresult != NULL && rettv->v_type == VAR_LIST) +--- 9256,9266 ---- + vim_free(fresult); + fresult = find_file_in_path_option(first ? fname : NULL, + first ? (int)STRLEN(fname) : 0, +! 0, first, path, +! find_what, +! curbuf->b_ffname, +! find_what == FINDFILE_DIR +! ? (char_u *)"" : curbuf->b_p_sua); + first = FALSE; + + if (fresult != NULL && rettv->v_type == VAR_LIST) +*************** +*** 9445,9451 **** + typval_T *argvars; + typval_T *rettv; + { +! findfilendir(argvars, rettv, TRUE); + } + + /* +--- 9450,9456 ---- + typval_T *argvars; + typval_T *rettv; + { +! findfilendir(argvars, rettv, FINDFILE_DIR); + } + + /* +*************** +*** 9456,9462 **** + typval_T *argvars; + typval_T *rettv; + { +! findfilendir(argvars, rettv, FALSE); + } + + /* +--- 9461,9467 ---- + typval_T *argvars; + typval_T *rettv; + { +! findfilendir(argvars, rettv, FINDFILE_FILE); + } + + /* +*** ../vim-7.1.255/src/misc2.c Fri Jan 4 21:25:01 2008 +--- src/misc2.c Wed Feb 13 17:19:21 2008 +*************** +*** 3777,3785 **** + char_u ffs_filearray_cur; /* needed for partly handled dirs */ + + /* to store status of partly handled directories +! * 0: we work the on this directory for the first time + * 1: this directory was partly searched in an earlier step +! */ + int ffs_stage; + + /* How deep are we in the directory tree? +--- 3778,3786 ---- + char_u ffs_filearray_cur; /* needed for partly handled dirs */ + + /* to store status of partly handled directories +! * 0: we work on this directory for the first time + * 1: this directory was partly searched in an earlier step +! */ + int ffs_stage; + + /* How deep are we in the directory tree? +*************** +*** 3848,3853 **** +--- 3849,3855 ---- + * Set the default maximum depth. + */ + #define FF_MAX_STAR_STAR_EXPAND ((char_u)30) ++ + /* + * The search context: + * ffsc_stack_ptr: the stack for the dirs to search +*************** +*** 3862,3868 **** + * ffsc_wc_path: the part of the given path containing wildcards + * ffsc_level: how many levels of dirs to search downwards + * ffsc_stopdirs_v: array of stop directories for upward search +! * ffsc_need_dir: TRUE if we search for a directory + */ + typedef struct ff_search_ctx_T + { +--- 3864,3870 ---- + * ffsc_wc_path: the part of the given path containing wildcards + * ffsc_level: how many levels of dirs to search downwards + * ffsc_stopdirs_v: array of stop directories for upward search +! * ffsc_find_what: FINDFILE_BOTH, FINDFILE_DIR or FINDFILE_FILE + */ + typedef struct ff_search_ctx_T + { +*************** +*** 3879,3889 **** + int ffsc_level; + char_u **ffsc_stopdirs_v; + #endif +! int ffsc_need_dir; + } ff_search_ctx_T; + +- static ff_search_ctx_T *ff_search_ctx = NULL; +- + /* locally needed functions */ + #ifdef FEAT_PATH_EXTRA + static int ff_check_visited __ARGS((ff_visited_T **, char_u *, char_u *)); +--- 3881,3889 ---- + int ffsc_level; + char_u **ffsc_stopdirs_v; + #endif +! int ffsc_find_what; + } ff_search_ctx_T; + + /* locally needed functions */ + #ifdef FEAT_PATH_EXTRA + static int ff_check_visited __ARGS((ff_visited_T **, char_u *, char_u *)); +*************** +*** 3897,3906 **** + static int ff_wc_equal __ARGS((char_u *s1, char_u *s2)); + #endif + +! static void ff_push __ARGS((ff_stack_T *)); +! static ff_stack_T * ff_pop __ARGS((void)); +! static void ff_clear __ARGS((void)); +! static void ff_free_stack_element __ARGS((ff_stack_T *)); + #ifdef FEAT_PATH_EXTRA + static ff_stack_T *ff_create_stack_element __ARGS((char_u *, char_u *, int, int)); + #else +--- 3897,3906 ---- + static int ff_wc_equal __ARGS((char_u *s1, char_u *s2)); + #endif + +! static void ff_push __ARGS((ff_search_ctx_T *search_ctx, ff_stack_T *stack_ptr)); +! static ff_stack_T *ff_pop __ARGS((ff_search_ctx_T *search_ctx)); +! static void ff_clear __ARGS((ff_search_ctx_T *search_ctx)); +! static void ff_free_stack_element __ARGS((ff_stack_T *stack_ptr)); + #ifdef FEAT_PATH_EXTRA + static ff_stack_T *ff_create_stack_element __ARGS((char_u *, char_u *, int, int)); + #else +*************** +*** 3961,3966 **** +--- 3961,3969 ---- + * not related to restricts given to the '**' wildcard. If 'level' is 100 + * and you use '**200' vim_findfile() will stop after 100 levels. + * ++ * 'filename' cannot contain wildcards! It is used as-is, no backslashes to ++ * escape special characters. ++ * + * If 'stopdirs' is not NULL and nothing is found downward, the search is + * restarted on the next higher directory level. This is repeated until the + * start-directory of a search is contained in 'stopdirs'. 'stopdirs' has the +*************** +*** 3980,4053 **** + * The list of visited files/dirs can also be cleared with the function + * vim_findfile_free_visited(). + * +! * Set the parameter 'need_dir' to TRUE if you want to search for a directory +! * instead of a file. + * + * A search context returned by a previous call to vim_findfile_init() can be +! * passed in the parameter 'search_ctx'. This context is than reused and +! * reinitialized with the new parameters. The list of already viseted + * directories from this context is only deleted if the parameter +! * 'free_visited' is true. Be aware that the passed search_context is freed if +! * the reinitialization fails. + * +! * If you don't have a search context from a previous call 'search_ctx' must be +! * NULL. + * + * This function silently ignores a few errors, vim_findfile() will have + * limited functionality then. + */ + /*ARGSUSED*/ + void * +! vim_findfile_init(path, filename, stopdirs, level, free_visited, need_dir, +! search_ctx, tagfile, rel_fname) + char_u *path; + char_u *filename; + char_u *stopdirs; + int level; + int free_visited; +! int need_dir; +! void *search_ctx; + int tagfile; + char_u *rel_fname; /* file name to use for "." */ + { + #ifdef FEAT_PATH_EXTRA +! char_u *wc_part; + #endif +! ff_stack_T *sptr; + + /* If a search context is given by the caller, reuse it, else allocate a + * new one. + */ +! if (search_ctx != NULL) +! ff_search_ctx = search_ctx; + else + { +! ff_search_ctx = (ff_search_ctx_T*)alloc( +! (unsigned)sizeof(ff_search_ctx_T)); +! if (ff_search_ctx == NULL) + goto error_return; +! memset(ff_search_ctx, 0, sizeof(ff_search_ctx_T)); + } + + /* clear the search context, but NOT the visited lists */ +! ff_clear(); + + /* clear visited list if wanted */ + if (free_visited == TRUE) +! vim_findfile_free_visited(ff_search_ctx); + else + { + /* Reuse old visited lists. Get the visited list for the given + * filename. If no list for the current filename exists, creates a new +! * one. +! */ +! ff_search_ctx->ffsc_visited_list = ff_get_visited_list(filename, +! &ff_search_ctx->ffsc_visited_lists_list); +! if (ff_search_ctx->ffsc_visited_list == NULL) + goto error_return; +! ff_search_ctx->ffsc_dir_visited_list = ff_get_visited_list(filename, +! &ff_search_ctx->ffsc_dir_visited_lists_list); +! if (ff_search_ctx->ffsc_dir_visited_list == NULL) + goto error_return; + } + +--- 3983,4056 ---- + * The list of visited files/dirs can also be cleared with the function + * vim_findfile_free_visited(). + * +! * Set the parameter 'find_what' to FINDFILE_DIR if you want to search for +! * directories only, FINDFILE_FILE for files only, FINDFILE_BOTH for both. + * + * A search context returned by a previous call to vim_findfile_init() can be +! * passed in the parameter "search_ctx_arg". This context is reused and +! * reinitialized with the new parameters. The list of already visited + * directories from this context is only deleted if the parameter +! * "free_visited" is true. Be aware that the passed "search_ctx_arg" is freed +! * if the reinitialization fails. + * +! * If you don't have a search context from a previous call "search_ctx_arg" +! * must be NULL. + * + * This function silently ignores a few errors, vim_findfile() will have + * limited functionality then. + */ + /*ARGSUSED*/ + void * +! vim_findfile_init(path, filename, stopdirs, level, free_visited, find_what, +! search_ctx_arg, tagfile, rel_fname) + char_u *path; + char_u *filename; + char_u *stopdirs; + int level; + int free_visited; +! int find_what; +! void *search_ctx_arg; + int tagfile; + char_u *rel_fname; /* file name to use for "." */ + { + #ifdef FEAT_PATH_EXTRA +! char_u *wc_part; + #endif +! ff_stack_T *sptr; +! ff_search_ctx_T *search_ctx; + + /* If a search context is given by the caller, reuse it, else allocate a + * new one. + */ +! if (search_ctx_arg != NULL) +! search_ctx = search_ctx_arg; + else + { +! search_ctx = (ff_search_ctx_T*)alloc((unsigned)sizeof(ff_search_ctx_T)); +! if (search_ctx == NULL) + goto error_return; +! memset(search_ctx, 0, sizeof(ff_search_ctx_T)); + } ++ search_ctx->ffsc_find_what = find_what; + + /* clear the search context, but NOT the visited lists */ +! ff_clear(search_ctx); + + /* clear visited list if wanted */ + if (free_visited == TRUE) +! vim_findfile_free_visited(search_ctx); + else + { + /* Reuse old visited lists. Get the visited list for the given + * filename. If no list for the current filename exists, creates a new +! * one. */ +! search_ctx->ffsc_visited_list = ff_get_visited_list(filename, +! &search_ctx->ffsc_visited_lists_list); +! if (search_ctx->ffsc_visited_list == NULL) + goto error_return; +! search_ctx->ffsc_dir_visited_list = ff_get_visited_list(filename, +! &search_ctx->ffsc_dir_visited_lists_list); +! if (search_ctx->ffsc_dir_visited_list == NULL) + goto error_return; + } + +*************** +*** 4071,4082 **** + { + /* Make the start dir an absolute path name. */ + vim_strncpy(ff_expand_buffer, rel_fname, len); +! ff_search_ctx->ffsc_start_dir = FullName_save(ff_expand_buffer, +! FALSE); + } + else +! ff_search_ctx->ffsc_start_dir = vim_strnsave(rel_fname, len); +! if (ff_search_ctx->ffsc_start_dir == NULL) + goto error_return; + if (*++path != NUL) + ++path; +--- 4074,4084 ---- + { + /* Make the start dir an absolute path name. */ + vim_strncpy(ff_expand_buffer, rel_fname, len); +! search_ctx->ffsc_start_dir = FullName_save(ff_expand_buffer, FALSE); + } + else +! search_ctx->ffsc_start_dir = vim_strnsave(rel_fname, len); +! if (search_ctx->ffsc_start_dir == NULL) + goto error_return; + if (*++path != NUL) + ++path; +*************** +*** 4101,4108 **** + if (mch_dirname(ff_expand_buffer, MAXPATHL) == FAIL) + goto error_return; + +! ff_search_ctx->ffsc_start_dir = vim_strsave(ff_expand_buffer); +! if (ff_search_ctx->ffsc_start_dir == NULL) + goto error_return; + + #ifdef BACKSLASH_IN_FILENAME +--- 4103,4110 ---- + if (mch_dirname(ff_expand_buffer, MAXPATHL) == FAIL) + goto error_return; + +! search_ctx->ffsc_start_dir = vim_strsave(ff_expand_buffer); +! if (search_ctx->ffsc_start_dir == NULL) + goto error_return; + + #ifdef BACKSLASH_IN_FILENAME +*************** +*** 4110,4117 **** + * directory (but not for "//machine/dir"). Only use the drive name. */ + if ((*path == '/' || *path == '\\') + && path[1] != path[0] +! && ff_search_ctx->ffsc_start_dir[1] == ':') +! ff_search_ctx->ffsc_start_dir[2] = NUL; + #endif + } + +--- 4112,4119 ---- + * directory (but not for "//machine/dir"). Only use the drive name. */ + if ((*path == '/' || *path == '\\') + && path[1] != path[0] +! && search_ctx->ffsc_start_dir[1] == ':') +! search_ctx->ffsc_start_dir[2] = NUL; + #endif + } + +*************** +*** 4121,4127 **** + * If this fails (mem allocation), there is no upward search at all or a + * stop directory is not recognized -> continue silently. + * If stopdirs just contains a ";" or is empty, +! * ff_search_ctx->ffsc_stopdirs_v will only contain a NULL pointer. This + * is handled as unlimited upward search. See function + * ff_path_in_stoplist() for details. + */ +--- 4123,4129 ---- + * If this fails (mem allocation), there is no upward search at all or a + * stop directory is not recognized -> continue silently. + * If stopdirs just contains a ";" or is empty, +! * search_ctx->ffsc_stopdirs_v will only contain a NULL pointer. This + * is handled as unlimited upward search. See function + * ff_path_in_stoplist() for details. + */ +*************** +*** 4134,4143 **** + walker++; + + dircount = 1; +! ff_search_ctx->ffsc_stopdirs_v = +! (char_u **)alloc((unsigned)sizeof(char_u *)); + +! if (ff_search_ctx->ffsc_stopdirs_v != NULL) + { + do + { +--- 4136,4145 ---- + walker++; + + dircount = 1; +! search_ctx->ffsc_stopdirs_v = +! (char_u **)alloc((unsigned)sizeof(char_u *)); + +! if (search_ctx->ffsc_stopdirs_v != NULL) + { + do + { +*************** +*** 4145,4181 **** + void *ptr; + + helper = walker; +! ptr = vim_realloc(ff_search_ctx->ffsc_stopdirs_v, + (dircount + 1) * sizeof(char_u *)); + if (ptr) +! ff_search_ctx->ffsc_stopdirs_v = ptr; + else + /* ignore, keep what we have and continue */ + break; + walker = vim_strchr(walker, ';'); + if (walker) + { +! ff_search_ctx->ffsc_stopdirs_v[dircount-1] = +! vim_strnsave(helper, (int)(walker - helper)); + walker++; + } + else + /* this might be "", which means ascent till top + * of directory tree. + */ +! ff_search_ctx->ffsc_stopdirs_v[dircount-1] = +! vim_strsave(helper); + + dircount++; + + } while (walker != NULL); +! ff_search_ctx->ffsc_stopdirs_v[dircount-1] = NULL; + } + } + #endif + + #ifdef FEAT_PATH_EXTRA +! ff_search_ctx->ffsc_level = level; + + /* split into: + * -fix path +--- 4147,4183 ---- + void *ptr; + + helper = walker; +! ptr = vim_realloc(search_ctx->ffsc_stopdirs_v, + (dircount + 1) * sizeof(char_u *)); + if (ptr) +! search_ctx->ffsc_stopdirs_v = ptr; + else + /* ignore, keep what we have and continue */ + break; + walker = vim_strchr(walker, ';'); + if (walker) + { +! search_ctx->ffsc_stopdirs_v[dircount-1] = +! vim_strnsave(helper, (int)(walker - helper)); + walker++; + } + else + /* this might be "", which means ascent till top + * of directory tree. + */ +! search_ctx->ffsc_stopdirs_v[dircount-1] = +! vim_strsave(helper); + + dircount++; + + } while (walker != NULL); +! search_ctx->ffsc_stopdirs_v[dircount-1] = NULL; + } + } + #endif + + #ifdef FEAT_PATH_EXTRA +! search_ctx->ffsc_level = level; + + /* split into: + * -fix path +*************** +*** 4189,4196 **** + char *errpt; + + /* save the fix part of the path */ +! ff_search_ctx->ffsc_fix_path = vim_strnsave(path, +! (int)(wc_part - path)); + + /* + * copy wc_path and add restricts to the '**' wildcard. +--- 4191,4197 ---- + char *errpt; + + /* save the fix part of the path */ +! search_ctx->ffsc_fix_path = vim_strnsave(path, (int)(wc_part - path)); + + /* + * copy wc_path and add restricts to the '**' wildcard. +*************** +*** 4229,4275 **** + ff_expand_buffer[len++] = *wc_part++; + } + ff_expand_buffer[len] = NUL; +! ff_search_ctx->ffsc_wc_path = vim_strsave(ff_expand_buffer); + +! if (ff_search_ctx->ffsc_wc_path == NULL) + goto error_return; + } + else + #endif +! ff_search_ctx->ffsc_fix_path = vim_strsave(path); + +! if (ff_search_ctx->ffsc_start_dir == NULL) + { + /* store the fix part as startdir. + * This is needed if the parameter path is fully qualified. + */ +! ff_search_ctx->ffsc_start_dir = vim_strsave(ff_search_ctx->ffsc_fix_path); +! if (ff_search_ctx->ffsc_start_dir) +! ff_search_ctx->ffsc_fix_path[0] = NUL; + } + + /* create an absolute path */ +! STRCPY(ff_expand_buffer, ff_search_ctx->ffsc_start_dir); + add_pathsep(ff_expand_buffer); +! STRCAT(ff_expand_buffer, ff_search_ctx->ffsc_fix_path); + add_pathsep(ff_expand_buffer); + + sptr = ff_create_stack_element(ff_expand_buffer, + #ifdef FEAT_PATH_EXTRA +! ff_search_ctx->ffsc_wc_path, + #endif + level, 0); + + if (sptr == NULL) + goto error_return; + +! ff_push(sptr); + +! ff_search_ctx->ffsc_file_to_search = vim_strsave(filename); +! if (ff_search_ctx->ffsc_file_to_search == NULL) + goto error_return; + +! return ff_search_ctx; + + error_return: + /* +--- 4230,4276 ---- + ff_expand_buffer[len++] = *wc_part++; + } + ff_expand_buffer[len] = NUL; +! search_ctx->ffsc_wc_path = vim_strsave(ff_expand_buffer); + +! if (search_ctx->ffsc_wc_path == NULL) + goto error_return; + } + else + #endif +! search_ctx->ffsc_fix_path = vim_strsave(path); + +! if (search_ctx->ffsc_start_dir == NULL) + { + /* store the fix part as startdir. + * This is needed if the parameter path is fully qualified. + */ +! search_ctx->ffsc_start_dir = vim_strsave(search_ctx->ffsc_fix_path); +! if (search_ctx->ffsc_start_dir) +! search_ctx->ffsc_fix_path[0] = NUL; + } + + /* create an absolute path */ +! STRCPY(ff_expand_buffer, search_ctx->ffsc_start_dir); + add_pathsep(ff_expand_buffer); +! STRCAT(ff_expand_buffer, search_ctx->ffsc_fix_path); + add_pathsep(ff_expand_buffer); + + sptr = ff_create_stack_element(ff_expand_buffer, + #ifdef FEAT_PATH_EXTRA +! search_ctx->ffsc_wc_path, + #endif + level, 0); + + if (sptr == NULL) + goto error_return; + +! ff_push(search_ctx, sptr); + +! search_ctx->ffsc_file_to_search = vim_strsave(filename); +! if (search_ctx->ffsc_file_to_search == NULL) + goto error_return; + +! return search_ctx; + + error_return: + /* +*************** +*** 4277,4283 **** + * Even when the caller gave us a (perhaps valid) context we free it here, + * as we might have already destroyed it. + */ +! vim_findfile_cleanup(ff_search_ctx); + return NULL; + } + +--- 4278,4284 ---- + * Even when the caller gave us a (perhaps valid) context we free it here, + * as we might have already destroyed it. + */ +! vim_findfile_cleanup(search_ctx); + return NULL; + } + +*************** +*** 4314,4320 **** + } + #endif + +! /* Clean up the given search context. Can handle a NULL pointer */ + void + vim_findfile_cleanup(ctx) + void *ctx; +--- 4315,4323 ---- + } + #endif + +! /* +! * Clean up the given search context. Can handle a NULL pointer. +! */ + void + vim_findfile_cleanup(ctx) + void *ctx; +*************** +*** 4322,4333 **** + if (ctx == NULL) + return; + +- ff_search_ctx = ctx; +- + vim_findfile_free_visited(ctx); +! ff_clear(); + vim_free(ctx); +- ff_search_ctx = NULL; + } + + /* +--- 4325,4333 ---- + if (ctx == NULL) + return; + + vim_findfile_free_visited(ctx); +! ff_clear(ctx); + vim_free(ctx); + } + + /* +*************** +*** 4343,4357 **** + * top of the list). + */ + char_u * +! vim_findfile(search_ctx) +! void *search_ctx; + { + char_u *file_path; + #ifdef FEAT_PATH_EXTRA + char_u *rest_of_wildcards; + char_u *path_end = NULL; + #endif +! ff_stack_T *ctx; + #if defined(FEAT_SEARCHPATH) || defined(FEAT_PATH_EXTRA) + int len; + #endif +--- 4343,4357 ---- + * top of the list). + */ + char_u * +! vim_findfile(search_ctx_arg) +! void *search_ctx_arg; + { + char_u *file_path; + #ifdef FEAT_PATH_EXTRA + char_u *rest_of_wildcards; + char_u *path_end = NULL; + #endif +! ff_stack_T *stackp; + #if defined(FEAT_SEARCHPATH) || defined(FEAT_PATH_EXTRA) + int len; + #endif +*************** +*** 4360,4370 **** + #ifdef FEAT_SEARCHPATH + char_u *suf; + #endif + +! if (search_ctx == NULL) + return NULL; + +! ff_search_ctx = (ff_search_ctx_T*)search_ctx; + + /* + * filepath is used as buffer for various actions and as the storage to +--- 4360,4371 ---- + #ifdef FEAT_SEARCHPATH + char_u *suf; + #endif ++ ff_search_ctx_T *search_ctx; + +! if (search_ctx_arg == NULL) + return NULL; + +! search_ctx = (ff_search_ctx_T *)search_ctx_arg; + + /* + * filepath is used as buffer for various actions and as the storage to +*************** +*** 4375,4382 **** + + #ifdef FEAT_PATH_EXTRA + /* store the end of the start dir -- needed for upward search */ +! if (ff_search_ctx->ffsc_start_dir != NULL) +! path_end = &ff_search_ctx->ffsc_start_dir[STRLEN(ff_search_ctx->ffsc_start_dir)]; + #endif + + #ifdef FEAT_PATH_EXTRA +--- 4376,4384 ---- + + #ifdef FEAT_PATH_EXTRA + /* store the end of the start dir -- needed for upward search */ +! if (search_ctx->ffsc_start_dir != NULL) +! path_end = &search_ctx->ffsc_start_dir[ +! STRLEN(search_ctx->ffsc_start_dir)]; + #endif + + #ifdef FEAT_PATH_EXTRA +*************** +*** 4393,4400 **** + break; + + /* get directory to work on from stack */ +! ctx = ff_pop(); +! if (ctx == NULL) + break; + + /* +--- 4395,4402 ---- + break; + + /* get directory to work on from stack */ +! stackp = ff_pop(search_ctx); +! if (stackp == NULL) + break; + + /* +*************** +*** 4414,4427 **** + * /etc/rc.d/init.d is linked to /etc/rc.d -> endless loop) + * + * This check is only needed for directories we work on for the +! * first time (hence ctx->ff_filearray == NULL) + */ +! if (ctx->ffs_filearray == NULL +! && ff_check_visited(&ff_search_ctx->ffsc_dir_visited_list + ->ffvl_visited_list, +! ctx->ffs_fix_path + #ifdef FEAT_PATH_EXTRA +! , ctx->ffs_wc_path + #endif + ) == FAIL) + { +--- 4416,4429 ---- + * /etc/rc.d/init.d is linked to /etc/rc.d -> endless loop) + * + * This check is only needed for directories we work on for the +! * first time (hence stackp->ff_filearray == NULL) + */ +! if (stackp->ffs_filearray == NULL +! && ff_check_visited(&search_ctx->ffsc_dir_visited_list + ->ffvl_visited_list, +! stackp->ffs_fix_path + #ifdef FEAT_PATH_EXTRA +! , stackp->ffs_wc_path + #endif + ) == FAIL) + { +*************** +*** 4430,4442 **** + { + verbose_enter_scroll(); + smsg((char_u *)"Already Searched: %s (%s)", +! ctx->ffs_fix_path, ctx->ffs_wc_path); + /* don't overwrite this either */ + msg_puts((char_u *)"\n"); + verbose_leave_scroll(); + } + #endif +! ff_free_stack_element(ctx); + continue; + } + #ifdef FF_VERBOSE +--- 4432,4444 ---- + { + verbose_enter_scroll(); + smsg((char_u *)"Already Searched: %s (%s)", +! stackp->ffs_fix_path, stackp->ffs_wc_path); + /* don't overwrite this either */ + msg_puts((char_u *)"\n"); + verbose_leave_scroll(); + } + #endif +! ff_free_stack_element(stackp); + continue; + } + #ifdef FF_VERBOSE +*************** +*** 4444,4450 **** + { + verbose_enter_scroll(); + smsg((char_u *)"Searching: %s (%s)", +! ctx->ffs_fix_path, ctx->ffs_wc_path); + /* don't overwrite this either */ + msg_puts((char_u *)"\n"); + verbose_leave_scroll(); +--- 4446,4452 ---- + { + verbose_enter_scroll(); + smsg((char_u *)"Searching: %s (%s)", +! stackp->ffs_fix_path, stackp->ffs_wc_path); + /* don't overwrite this either */ + msg_puts((char_u *)"\n"); + verbose_leave_scroll(); +*************** +*** 4452,4460 **** + #endif + + /* check depth */ +! if (ctx->ffs_level <= 0) + { +! ff_free_stack_element(ctx); + continue; + } + +--- 4454,4462 ---- + #endif + + /* check depth */ +! if (stackp->ffs_level <= 0) + { +! ff_free_stack_element(stackp); + continue; + } + +*************** +*** 4466,4472 **** + * and all possible expands are returned in one array. We use this + * to handle the expansion of '**' into an empty string. + */ +! if (ctx->ffs_filearray == NULL) + { + char_u *dirptrs[2]; + +--- 4468,4474 ---- + * and all possible expands are returned in one array. We use this + * to handle the expansion of '**' into an empty string. + */ +! if (stackp->ffs_filearray == NULL) + { + char_u *dirptrs[2]; + +*************** +*** 4477,4495 **** + dirptrs[1] = NULL; + + /* if we have a start dir copy it in */ +! if (!vim_isAbsName(ctx->ffs_fix_path) +! && ff_search_ctx->ffsc_start_dir) + { +! STRCPY(file_path, ff_search_ctx->ffsc_start_dir); + add_pathsep(file_path); + } + + /* append the fix part of the search path */ +! STRCAT(file_path, ctx->ffs_fix_path); + add_pathsep(file_path); + + #ifdef FEAT_PATH_EXTRA +! rest_of_wildcards = ctx->ffs_wc_path; + if (*rest_of_wildcards != NUL) + { + len = (int)STRLEN(file_path); +--- 4479,4497 ---- + dirptrs[1] = NULL; + + /* if we have a start dir copy it in */ +! if (!vim_isAbsName(stackp->ffs_fix_path) +! && search_ctx->ffsc_start_dir) + { +! STRCPY(file_path, search_ctx->ffsc_start_dir); + add_pathsep(file_path); + } + + /* append the fix part of the search path */ +! STRCAT(file_path, stackp->ffs_fix_path); + add_pathsep(file_path); + + #ifdef FEAT_PATH_EXTRA +! rest_of_wildcards = stackp->ffs_wc_path; + if (*rest_of_wildcards != NUL) + { + len = (int)STRLEN(file_path); +*************** +*** 4516,4526 **** + else + rest_of_wildcards += 3; + +! if (ctx->ffs_star_star_empty == 0) + { + /* if not done before, expand '**' to empty */ +! ctx->ffs_star_star_empty = 1; +! dirptrs[1] = ctx->ffs_fix_path; + } + } + +--- 4518,4528 ---- + else + rest_of_wildcards += 3; + +! if (stackp->ffs_star_star_empty == 0) + { + /* if not done before, expand '**' to empty */ +! stackp->ffs_star_star_empty = 1; +! dirptrs[1] = stackp->ffs_fix_path; + } + } + +*************** +*** 4547,4576 **** + */ + if (path_with_url(dirptrs[0])) + { +! ctx->ffs_filearray = (char_u **) + alloc((unsigned)sizeof(char *)); +! if (ctx->ffs_filearray != NULL +! && (ctx->ffs_filearray[0] + = vim_strsave(dirptrs[0])) != NULL) +! ctx->ffs_filearray_size = 1; + else +! ctx->ffs_filearray_size = 0; + } + else + expand_wildcards((dirptrs[1] == NULL) ? 1 : 2, dirptrs, +! &ctx->ffs_filearray_size, +! &ctx->ffs_filearray, + EW_DIR|EW_ADDSLASH|EW_SILENT); + +! ctx->ffs_filearray_cur = 0; +! ctx->ffs_stage = 0; + } + #ifdef FEAT_PATH_EXTRA + else +! rest_of_wildcards = &ctx->ffs_wc_path[STRLEN(ctx->ffs_wc_path)]; + #endif + +! if (ctx->ffs_stage == 0) + { + /* this is the first time we work on this directory */ + #ifdef FEAT_PATH_EXTRA +--- 4549,4579 ---- + */ + if (path_with_url(dirptrs[0])) + { +! stackp->ffs_filearray = (char_u **) + alloc((unsigned)sizeof(char *)); +! if (stackp->ffs_filearray != NULL +! && (stackp->ffs_filearray[0] + = vim_strsave(dirptrs[0])) != NULL) +! stackp->ffs_filearray_size = 1; + else +! stackp->ffs_filearray_size = 0; + } + else + expand_wildcards((dirptrs[1] == NULL) ? 1 : 2, dirptrs, +! &stackp->ffs_filearray_size, +! &stackp->ffs_filearray, + EW_DIR|EW_ADDSLASH|EW_SILENT); + +! stackp->ffs_filearray_cur = 0; +! stackp->ffs_stage = 0; + } + #ifdef FEAT_PATH_EXTRA + else +! rest_of_wildcards = &stackp->ffs_wc_path[ +! STRLEN(stackp->ffs_wc_path)]; + #endif + +! if (stackp->ffs_stage == 0) + { + /* this is the first time we work on this directory */ + #ifdef FEAT_PATH_EXTRA +*************** +*** 4581,4598 **** + * we don't have further wildcards to expand, so we have to + * check for the final file now + */ +! for (i = ctx->ffs_filearray_cur; +! i < ctx->ffs_filearray_size; ++i) + { +! if (!path_with_url(ctx->ffs_filearray[i]) +! && !mch_isdir(ctx->ffs_filearray[i])) + continue; /* not a directory */ + + /* prepare the filename to be checked for existance + * below */ +! STRCPY(file_path, ctx->ffs_filearray[i]); + add_pathsep(file_path); +! STRCAT(file_path, ff_search_ctx->ffsc_file_to_search); + + /* + * Try without extra suffix and then with suffixes +--- 4584,4601 ---- + * we don't have further wildcards to expand, so we have to + * check for the final file now + */ +! for (i = stackp->ffs_filearray_cur; +! i < stackp->ffs_filearray_size; ++i) + { +! if (!path_with_url(stackp->ffs_filearray[i]) +! && !mch_isdir(stackp->ffs_filearray[i])) + continue; /* not a directory */ + + /* prepare the filename to be checked for existance + * below */ +! STRCPY(file_path, stackp->ffs_filearray[i]); + add_pathsep(file_path); +! STRCAT(file_path, search_ctx->ffsc_file_to_search); + + /* + * Try without extra suffix and then with suffixes +*************** +*** 4606,4617 **** + { + /* if file exists and we didn't already find it */ + if ((path_with_url(file_path) +! || (mch_getperm(file_path) >= 0 +! && (!ff_search_ctx->ffsc_need_dir +! || mch_isdir(file_path)))) + #ifndef FF_VERBOSE + && (ff_check_visited( +! &ff_search_ctx->ffsc_visited_list->ffvl_visited_list, + file_path + #ifdef FEAT_PATH_EXTRA + , (char_u *)"" +--- 4609,4623 ---- + { + /* if file exists and we didn't already find it */ + if ((path_with_url(file_path) +! || (mch_getperm(file_path) >= 0 +! && (search_ctx->ffsc_find_what +! == FINDFILE_BOTH +! || ((search_ctx->ffsc_find_what +! == FINDFILE_DIR) +! == mch_isdir(file_path))))) + #ifndef FF_VERBOSE + && (ff_check_visited( +! &search_ctx->ffsc_visited_list->ffvl_visited_list, + file_path + #ifdef FEAT_PATH_EXTRA + , (char_u *)"" +*************** +*** 4622,4628 **** + { + #ifdef FF_VERBOSE + if (ff_check_visited( +! &ff_search_ctx->ffsc_visited_list->ffvl_visited_list, + file_path + #ifdef FEAT_PATH_EXTRA + , (char_u *)"" +--- 4628,4634 ---- + { + #ifdef FF_VERBOSE + if (ff_check_visited( +! &search_ctx->ffsc_visited_list->ffvl_visited_list, + file_path + #ifdef FEAT_PATH_EXTRA + , (char_u *)"" +*************** +*** 4643,4650 **** + #endif + + /* push dir to examine rest of subdirs later */ +! ctx->ffs_filearray_cur = i + 1; +! ff_push(ctx); + + simplify_filename(file_path); + if (mch_dirname(ff_expand_buffer, MAXPATHL) +--- 4649,4656 ---- + #endif + + /* push dir to examine rest of subdirs later */ +! stackp->ffs_filearray_cur = i + 1; +! ff_push(search_ctx, stackp); + + simplify_filename(file_path); + if (mch_dirname(ff_expand_buffer, MAXPATHL) +*************** +*** 4686,4704 **** + * still wildcards left, push the directories for further + * search + */ +! for (i = ctx->ffs_filearray_cur; +! i < ctx->ffs_filearray_size; ++i) + { +! if (!mch_isdir(ctx->ffs_filearray[i])) + continue; /* not a directory */ + +! ff_push(ff_create_stack_element(ctx->ffs_filearray[i], +! rest_of_wildcards, ctx->ffs_level - 1, 0)); + } + } + #endif +! ctx->ffs_filearray_cur = 0; +! ctx->ffs_stage = 1; + } + + #ifdef FEAT_PATH_EXTRA +--- 4692,4713 ---- + * still wildcards left, push the directories for further + * search + */ +! for (i = stackp->ffs_filearray_cur; +! i < stackp->ffs_filearray_size; ++i) + { +! if (!mch_isdir(stackp->ffs_filearray[i])) + continue; /* not a directory */ + +! ff_push(search_ctx, +! ff_create_stack_element( +! stackp->ffs_filearray[i], +! rest_of_wildcards, +! stackp->ffs_level - 1, 0)); + } + } + #endif +! stackp->ffs_filearray_cur = 0; +! stackp->ffs_stage = 1; + } + + #ifdef FEAT_PATH_EXTRA +*************** +*** 4706,4728 **** + * if wildcards contains '**' we have to descent till we reach the + * leaves of the directory tree. + */ +! if (STRNCMP(ctx->ffs_wc_path, "**", 2) == 0) + { +! for (i = ctx->ffs_filearray_cur; +! i < ctx->ffs_filearray_size; ++i) + { +! if (fnamecmp(ctx->ffs_filearray[i], ctx->ffs_fix_path) == 0) + continue; /* don't repush same directory */ +! if (!mch_isdir(ctx->ffs_filearray[i])) + continue; /* not a directory */ +! ff_push(ff_create_stack_element(ctx->ffs_filearray[i], +! ctx->ffs_wc_path, ctx->ffs_level - 1, 1)); + } + } + #endif + + /* we are done with the current directory */ +! ff_free_stack_element(ctx); + + } + +--- 4715,4739 ---- + * if wildcards contains '**' we have to descent till we reach the + * leaves of the directory tree. + */ +! if (STRNCMP(stackp->ffs_wc_path, "**", 2) == 0) + { +! for (i = stackp->ffs_filearray_cur; +! i < stackp->ffs_filearray_size; ++i) + { +! if (fnamecmp(stackp->ffs_filearray[i], +! stackp->ffs_fix_path) == 0) + continue; /* don't repush same directory */ +! if (!mch_isdir(stackp->ffs_filearray[i])) + continue; /* not a directory */ +! ff_push(search_ctx, +! ff_create_stack_element(stackp->ffs_filearray[i], +! stackp->ffs_wc_path, stackp->ffs_level - 1, 1)); + } + } + #endif + + /* we are done with the current directory */ +! ff_free_stack_element(stackp); + + } + +*************** +*** 4730,4769 **** + /* If we reached this, we didn't find anything downwards. + * Let's check if we should do an upward search. + */ +! if (ff_search_ctx->ffsc_start_dir +! && ff_search_ctx->ffsc_stopdirs_v != NULL && !got_int) + { + ff_stack_T *sptr; + + /* is the last starting directory in the stop list? */ +! if (ff_path_in_stoplist(ff_search_ctx->ffsc_start_dir, +! (int)(path_end - ff_search_ctx->ffsc_start_dir), +! ff_search_ctx->ffsc_stopdirs_v) == TRUE) + break; + + /* cut of last dir */ +! while (path_end > ff_search_ctx->ffsc_start_dir +! && vim_ispathsep(*path_end)) + path_end--; +! while (path_end > ff_search_ctx->ffsc_start_dir +! && !vim_ispathsep(path_end[-1])) + path_end--; + *path_end = 0; + path_end--; + +! if (*ff_search_ctx->ffsc_start_dir == 0) + break; + +! STRCPY(file_path, ff_search_ctx->ffsc_start_dir); + add_pathsep(file_path); +! STRCAT(file_path, ff_search_ctx->ffsc_fix_path); + + /* create a new stack entry */ + sptr = ff_create_stack_element(file_path, +! ff_search_ctx->ffsc_wc_path, ff_search_ctx->ffsc_level, 0); + if (sptr == NULL) + break; +! ff_push(sptr); + } + else + break; +--- 4741,4780 ---- + /* If we reached this, we didn't find anything downwards. + * Let's check if we should do an upward search. + */ +! if (search_ctx->ffsc_start_dir +! && search_ctx->ffsc_stopdirs_v != NULL && !got_int) + { + ff_stack_T *sptr; + + /* is the last starting directory in the stop list? */ +! if (ff_path_in_stoplist(search_ctx->ffsc_start_dir, +! (int)(path_end - search_ctx->ffsc_start_dir), +! search_ctx->ffsc_stopdirs_v) == TRUE) + break; + + /* cut of last dir */ +! while (path_end > search_ctx->ffsc_start_dir +! && vim_ispathsep(*path_end)) + path_end--; +! while (path_end > search_ctx->ffsc_start_dir +! && !vim_ispathsep(path_end[-1])) + path_end--; + *path_end = 0; + path_end--; + +! if (*search_ctx->ffsc_start_dir == 0) + break; + +! STRCPY(file_path, search_ctx->ffsc_start_dir); + add_pathsep(file_path); +! STRCAT(file_path, search_ctx->ffsc_fix_path); + + /* create a new stack entry */ + sptr = ff_create_stack_element(file_path, +! search_ctx->ffsc_wc_path, search_ctx->ffsc_level, 0); + if (sptr == NULL) + break; +! ff_push(search_ctx, sptr); + } + else + break; +*************** +*** 4779,4794 **** + * Can handle it if the passed search_context is NULL; + */ + void +! vim_findfile_free_visited(search_ctx) +! void *search_ctx; + { +! if (search_ctx == NULL) +! return; + +! ff_search_ctx = (ff_search_ctx_T *)search_ctx; + +! vim_findfile_free_visited_list(&ff_search_ctx->ffsc_visited_lists_list); +! vim_findfile_free_visited_list(&ff_search_ctx->ffsc_dir_visited_lists_list); + } + + static void +--- 4790,4806 ---- + * Can handle it if the passed search_context is NULL; + */ + void +! vim_findfile_free_visited(search_ctx_arg) +! void *search_ctx_arg; + { +! ff_search_ctx_T *search_ctx; + +! if (search_ctx_arg == NULL) +! return; + +! search_ctx = (ff_search_ctx_T *)search_ctx_arg; +! vim_findfile_free_visited_list(&search_ctx->ffsc_visited_lists_list); +! vim_findfile_free_visited_list(&search_ctx->ffsc_dir_visited_lists_list); + } + + static void +*************** +*** 5103,5135 **** + } + + /* +! * push a dir on the directory stack + */ + static void +! ff_push(ctx) +! ff_stack_T *ctx; + { + /* check for NULL pointer, not to return an error to the user, but + * to prevent a crash */ +! if (ctx != NULL) + { +! ctx->ffs_prev = ff_search_ctx->ffsc_stack_ptr; +! ff_search_ctx->ffsc_stack_ptr = ctx; + } + } + + /* +! * pop a dir from the directory stack +! * returns NULL if stack is empty + */ + static ff_stack_T * +! ff_pop() + { + ff_stack_T *sptr; + +! sptr = ff_search_ctx->ffsc_stack_ptr; +! if (ff_search_ctx->ffsc_stack_ptr != NULL) +! ff_search_ctx->ffsc_stack_ptr = ff_search_ctx->ffsc_stack_ptr->ffs_prev; + + return sptr; + } +--- 5115,5149 ---- + } + + /* +! * Push a dir on the directory stack. + */ + static void +! ff_push(search_ctx, stack_ptr) +! ff_search_ctx_T *search_ctx; +! ff_stack_T *stack_ptr; + { + /* check for NULL pointer, not to return an error to the user, but + * to prevent a crash */ +! if (stack_ptr != NULL) + { +! stack_ptr->ffs_prev = search_ctx->ffsc_stack_ptr; +! search_ctx->ffsc_stack_ptr = stack_ptr; + } + } + + /* +! * Pop a dir from the directory stack. +! * Returns NULL if stack is empty. + */ + static ff_stack_T * +! ff_pop(search_ctx) +! ff_search_ctx_T *search_ctx; + { + ff_stack_T *sptr; + +! sptr = search_ctx->ffsc_stack_ptr; +! if (search_ctx->ffsc_stack_ptr != NULL) +! search_ctx->ffsc_stack_ptr = search_ctx->ffsc_stack_ptr->ffs_prev; + + return sptr; + } +*************** +*** 5138,5199 **** + * free the given stack element + */ + static void +! ff_free_stack_element(ctx) +! ff_stack_T *ctx; + { + /* vim_free handles possible NULL pointers */ +! vim_free(ctx->ffs_fix_path); + #ifdef FEAT_PATH_EXTRA +! vim_free(ctx->ffs_wc_path); + #endif + +! if (ctx->ffs_filearray != NULL) +! FreeWild(ctx->ffs_filearray_size, ctx->ffs_filearray); + +! vim_free(ctx); + } + + /* +! * clear the search context + */ + static void +! ff_clear() + { + ff_stack_T *sptr; + + /* clear up stack */ +! while ((sptr = ff_pop()) != NULL) + ff_free_stack_element(sptr); + +! vim_free(ff_search_ctx->ffsc_file_to_search); +! vim_free(ff_search_ctx->ffsc_start_dir); +! vim_free(ff_search_ctx->ffsc_fix_path); + #ifdef FEAT_PATH_EXTRA +! vim_free(ff_search_ctx->ffsc_wc_path); + #endif + + #ifdef FEAT_PATH_EXTRA +! if (ff_search_ctx->ffsc_stopdirs_v != NULL) + { + int i = 0; + +! while (ff_search_ctx->ffsc_stopdirs_v[i] != NULL) + { +! vim_free(ff_search_ctx->ffsc_stopdirs_v[i]); + i++; + } +! vim_free(ff_search_ctx->ffsc_stopdirs_v); + } +! ff_search_ctx->ffsc_stopdirs_v = NULL; + #endif + + /* reset everything */ +! ff_search_ctx->ffsc_file_to_search = NULL; +! ff_search_ctx->ffsc_start_dir = NULL; +! ff_search_ctx->ffsc_fix_path = NULL; + #ifdef FEAT_PATH_EXTRA +! ff_search_ctx->ffsc_wc_path = NULL; +! ff_search_ctx->ffsc_level = 0; + #endif + } + +--- 5152,5214 ---- + * free the given stack element + */ + static void +! ff_free_stack_element(stack_ptr) +! ff_stack_T *stack_ptr; + { + /* vim_free handles possible NULL pointers */ +! vim_free(stack_ptr->ffs_fix_path); + #ifdef FEAT_PATH_EXTRA +! vim_free(stack_ptr->ffs_wc_path); + #endif + +! if (stack_ptr->ffs_filearray != NULL) +! FreeWild(stack_ptr->ffs_filearray_size, stack_ptr->ffs_filearray); + +! vim_free(stack_ptr); + } + + /* +! * Clear the search context, but NOT the visited list. + */ + static void +! ff_clear(search_ctx) +! ff_search_ctx_T *search_ctx; + { + ff_stack_T *sptr; + + /* clear up stack */ +! while ((sptr = ff_pop(search_ctx)) != NULL) + ff_free_stack_element(sptr); + +! vim_free(search_ctx->ffsc_file_to_search); +! vim_free(search_ctx->ffsc_start_dir); +! vim_free(search_ctx->ffsc_fix_path); + #ifdef FEAT_PATH_EXTRA +! vim_free(search_ctx->ffsc_wc_path); + #endif + + #ifdef FEAT_PATH_EXTRA +! if (search_ctx->ffsc_stopdirs_v != NULL) + { + int i = 0; + +! while (search_ctx->ffsc_stopdirs_v[i] != NULL) + { +! vim_free(search_ctx->ffsc_stopdirs_v[i]); + i++; + } +! vim_free(search_ctx->ffsc_stopdirs_v); + } +! search_ctx->ffsc_stopdirs_v = NULL; + #endif + + /* reset everything */ +! search_ctx->ffsc_file_to_search = NULL; +! search_ctx->ffsc_start_dir = NULL; +! search_ctx->ffsc_fix_path = NULL; + #ifdef FEAT_PATH_EXTRA +! search_ctx->ffsc_wc_path = NULL; +! search_ctx->ffsc_level = 0; + #endif + } + +*************** +*** 5242,5248 **** + + #if defined(FEAT_SEARCHPATH) || defined(PROTO) + /* +! * Find the file name "ptr[len]" in the path. + * + * On the first call set the parameter 'first' to TRUE to initialize + * the search. For repeating calls to FALSE. +--- 5257,5263 ---- + + #if defined(FEAT_SEARCHPATH) || defined(PROTO) + /* +! * Find the file name "ptr[len]" in the path. Also finds directory names. + * + * On the first call set the parameter 'first' to TRUE to initialize + * the search. For repeating calls to FALSE. +*************** +*** 5276,5282 **** + { + return find_file_in_path_option(ptr, len, options, first, + *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path, +! FALSE, rel_fname, curbuf->b_p_sua); + } + + static char_u *ff_file_to_find = NULL; +--- 5291,5297 ---- + { + return find_file_in_path_option(ptr, len, options, first, + *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path, +! FINDFILE_BOTH, rel_fname, curbuf->b_p_sua); + } + + static char_u *ff_file_to_find = NULL; +*************** +*** 5309,5325 **** + char_u *rel_fname; /* file name searching relative to */ + { + return find_file_in_path_option(ptr, len, options, TRUE, p_cdpath, +! TRUE, rel_fname, (char_u *)""); + } + + char_u * +! find_file_in_path_option(ptr, len, options, first, path_option, need_dir, rel_fname, suffixes) + char_u *ptr; /* file name */ + int len; /* length of file name */ + int options; + int first; /* use count'th matching file name */ + char_u *path_option; /* p_path or p_cdpath */ +! int need_dir; /* looking for directory name */ + char_u *rel_fname; /* file name we are looking relative to. */ + char_u *suffixes; /* list of suffixes, 'suffixesadd' option */ + { +--- 5324,5340 ---- + char_u *rel_fname; /* file name searching relative to */ + { + return find_file_in_path_option(ptr, len, options, TRUE, p_cdpath, +! FINDFILE_DIR, rel_fname, (char_u *)""); + } + + char_u * +! find_file_in_path_option(ptr, len, options, first, path_option, find_what, rel_fname, suffixes) + char_u *ptr; /* file name */ + int len; /* length of file name */ + int options; + int first; /* use count'th matching file name */ + char_u *path_option; /* p_path or p_cdpath */ +! int find_what; /* FINDFILE_FILE, _DIR or _BOTH */ + char_u *rel_fname; /* file name we are looking relative to. */ + char_u *suffixes; /* list of suffixes, 'suffixesadd' option */ + { +*************** +*** 5421,5432 **** + #ifdef DJGPP + /* "C:" by itself will fail for mch_getperm(), + * assume it's always valid. */ +! (need_dir && NameBuff[0] != NUL + && NameBuff[1] == ':' + && NameBuff[2] == NUL) || + #endif + (mch_getperm(NameBuff) >= 0 +! && (!need_dir || mch_isdir(NameBuff)))) + { + file_name = vim_strsave(NameBuff); + goto theend; +--- 5436,5449 ---- + #ifdef DJGPP + /* "C:" by itself will fail for mch_getperm(), + * assume it's always valid. */ +! (find_what != FINDFILE_FILE && NameBuff[0] != NUL + && NameBuff[1] == ':' + && NameBuff[2] == NUL) || + #endif + (mch_getperm(NameBuff) >= 0 +! && (find_what == FINDFILE_BOTH +! || ((find_what == FINDFILE_DIR) +! == mch_isdir(NameBuff))))) + { + file_name = vim_strsave(NameBuff); + goto theend; +*************** +*** 5457,5465 **** + { + if (did_findfile_init) + { +- ff_search_ctx->ffsc_need_dir = need_dir; + file_name = vim_findfile(fdip_search_ctx); +- ff_search_ctx->ffsc_need_dir = FALSE; + if (file_name != NULL) + break; + +--- 5474,5480 ---- +*************** +*** 5492,5498 **** + r_ptr = NULL; + #endif + fdip_search_ctx = vim_findfile_init(buf, ff_file_to_find, +! r_ptr, 100, FALSE, TRUE, + fdip_search_ctx, FALSE, rel_fname); + if (fdip_search_ctx != NULL) + did_findfile_init = TRUE; +--- 5507,5513 ---- + r_ptr = NULL; + #endif + fdip_search_ctx = vim_findfile_init(buf, ff_file_to_find, +! r_ptr, 100, FALSE, find_what, + fdip_search_ctx, FALSE, rel_fname); + if (fdip_search_ctx != NULL) + did_findfile_init = TRUE; +*************** +*** 5504,5510 **** + { + if (first == TRUE) + { +! if (need_dir) + EMSG2(_("E344: Can't find directory \"%s\" in cdpath"), + ff_file_to_find); + else +--- 5519,5525 ---- + { + if (first == TRUE) + { +! if (find_what == FINDFILE_DIR) + EMSG2(_("E344: Can't find directory \"%s\" in cdpath"), + ff_file_to_find); + else +*************** +*** 5513,5519 **** + } + else + { +! if (need_dir) + EMSG2(_("E346: No more directory \"%s\" found in cdpath"), + ff_file_to_find); + else +--- 5528,5534 ---- + } + else + { +! if (find_what == FINDFILE_DIR) + EMSG2(_("E346: No more directory \"%s\" found in cdpath"), + ff_file_to_find); + else +*** ../vim-7.1.255/src/vim.h Sat Jan 19 15:55:51 2008 +--- src/vim.h Tue Jan 22 22:35:16 2008 +*************** +*** 721,726 **** +--- 721,731 ---- + /* Note: mostly EW_NOTFOUND and EW_SILENT are mutually exclusive: EW_NOTFOUND + * is used when executing commands and EW_SILENT for interactive expanding. */ + ++ /* Flags for find_file_*() functions. */ ++ #define FINDFILE_FILE 0 /* only files */ ++ #define FINDFILE_DIR 1 /* only directories */ ++ #define FINDFILE_BOTH 2 /* files and directories */ ++ + #ifdef FEAT_VERTSPLIT + # define W_WINCOL(wp) (wp->w_wincol) + # define W_WIDTH(wp) (wp->w_width) +*** ../vim-7.1.255/src/tag.c Sat Jan 19 15:55:51 2008 +--- src/tag.c Wed Feb 13 18:02:32 2008 +*************** +*** 2669,2676 **** + + tnp->tn_search_ctx = vim_findfile_init(buf, filename, + r_ptr, 100, +! FALSE, /* don't free visited list */ +! FALSE, /* we search for a file */ + tnp->tn_search_ctx, TRUE, curbuf->b_ffname); + if (tnp->tn_search_ctx != NULL) + tnp->tn_did_filefind_init = TRUE; +--- 2669,2676 ---- + + tnp->tn_search_ctx = vim_findfile_init(buf, filename, + r_ptr, 100, +! FALSE, /* don't free visited list */ +! FINDFILE_FILE, /* we search for a file */ + tnp->tn_search_ctx, TRUE, curbuf->b_ffname); + if (tnp->tn_search_ctx != NULL) + tnp->tn_did_filefind_init = TRUE; +*************** +*** 2691,2696 **** +--- 2691,2697 ---- + { + vim_free(tnp->tn_tags); + vim_findfile_cleanup(tnp->tn_search_ctx); ++ tnp->tn_search_ctx = NULL; + ga_clear_strings(&tag_fnames); + } + +*** ../vim-7.1.255/src/version.c Wed Feb 20 11:27:59 2008 +--- src/version.c Wed Feb 20 12:09:54 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 256, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +38. You wake up at 3 a.m. to go to the bathroom and stop and check your e-mail + on the way back to bed. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 46a110ffd92cb84e29361ff571c7bf4665d4a7d8 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:37:48 +0000 Subject: [PATCH 19/71] - patchlevel 257 --- 7.1.257 | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 7.1.257 diff --git a/7.1.257 b/7.1.257 new file mode 100644 index 00000000..5aa91281 --- /dev/null +++ b/7.1.257 @@ -0,0 +1,87 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.257 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.257 +Problem: Configure can't always find the Tcl header files. +Solution: Also look in /usr/local/include/tcl$tclver and + /usr/include/tcl$tclver (James Vega) +Files: src/auto/configure, src/configure.in + + +*** ../vim-7.1.256/src/auto/configure Wed Feb 13 10:27:28 2008 +--- src/auto/configure Wed Feb 13 11:20:00 2008 +*************** +*** 4669,4678 **** + echo "$as_me:$LINENO: checking for location of Tcl include" >&5 + echo $ECHO_N "checking for location of Tcl include... $ECHO_C" >&6 + if test "x$MACOSX" != "xyes"; then +! tclinc="$tclloc/include $tclloc/include/tcl $tclloc/include/tcl$tclver /usr/local/include /usr/include" + else + tclinc="/System/Library/Frameworks/Tcl.framework/Headers" + fi + for try in $tclinc; do + if test -f "$try/tcl.h"; then + echo "$as_me:$LINENO: result: $try/tcl.h" >&5 +--- 4669,4679 ---- + echo "$as_me:$LINENO: checking for location of Tcl include" >&5 + echo $ECHO_N "checking for location of Tcl include... $ECHO_C" >&6 + if test "x$MACOSX" != "xyes"; then +! tclinc="$tclloc/include $tclloc/include/tcl $tclloc/include/tcl$tclver /usr/local/include /usr/include /usr/include/tcl$tclver" + else + tclinc="/System/Library/Frameworks/Tcl.framework/Headers" + fi ++ TCL_INC= + for try in $tclinc; do + if test -f "$try/tcl.h"; then + echo "$as_me:$LINENO: result: $try/tcl.h" >&5 +*** ../vim-7.1.256/src/configure.in Wed Feb 13 10:27:28 2008 +--- src/configure.in Wed Feb 13 11:23:55 2008 +*************** +*** 794,804 **** + + AC_MSG_CHECKING(for location of Tcl include) + if test "x$MACOSX" != "xyes"; then +! tclinc="$tclloc/include $tclloc/include/tcl $tclloc/include/tcl$tclver /usr/local/include /usr/include" + else + dnl For Mac OS X 10.3, use the OS-provided framework location + tclinc="/System/Library/Frameworks/Tcl.framework/Headers" + fi + for try in $tclinc; do + if test -f "$try/tcl.h"; then + AC_MSG_RESULT($try/tcl.h) +--- 794,805 ---- + + AC_MSG_CHECKING(for location of Tcl include) + if test "x$MACOSX" != "xyes"; then +! tclinc="$tclloc/include $tclloc/include/tcl $tclloc/include/tcl$tclver /usr/local/include /usr/local/include/tcl$tclver /usr/include /usr/include/tcl$tclver" + else + dnl For Mac OS X 10.3, use the OS-provided framework location + tclinc="/System/Library/Frameworks/Tcl.framework/Headers" + fi ++ TCL_INC= + for try in $tclinc; do + if test -f "$try/tcl.h"; then + AC_MSG_RESULT($try/tcl.h) +*** ../vim-7.1.256/src/version.c Wed Feb 20 12:22:59 2008 +--- src/version.c Wed Feb 20 12:42:17 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 257, + /**/ + +-- +He who laughs last, thinks slowest. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 38af7e1b1fa9d2ecb5a4c89b25bddb7882ed07bc Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:37:59 +0000 Subject: [PATCH 20/71] - patchlevel 258 --- 7.1.258 | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 7.1.258 diff --git a/7.1.258 b/7.1.258 new file mode 100644 index 00000000..cf36a32e --- /dev/null +++ b/7.1.258 @@ -0,0 +1,116 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.258 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.258 +Problem: Crash when doing "d/\n/e" and 'virtualedit' is "all". (Andy Wokula) +Solution: Avoid that the column becomes negative. Also fixes other problems + with the end of a pattern match is in column zero. (A.Politz) +Files: src/search.c + + +*** ../vim-7.1.257/src/search.c Sat Jan 26 21:15:00 2008 +--- src/search.c Wed Feb 20 13:22:23 2008 +*************** +*** 624,630 **** + #ifdef FEAT_EVAL + submatch = first_submatch(®match); + #endif +! /* Line me be past end of buffer for "\n\zs". */ + if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) + ptr = (char_u *)""; + else +--- 624,630 ---- + #ifdef FEAT_EVAL + submatch = first_submatch(®match); + #endif +! /* "lnum" may be past end of buffer for "\n\zs". */ + if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) + ptr = (char_u *)""; + else +*************** +*** 833,853 **** + continue; + } + +! if (options & SEARCH_END && !(options & SEARCH_NOOF)) + { + pos->lnum = lnum + endpos.lnum; +! pos->col = endpos.col - 1; +! #ifdef FEAT_MBYTE +! if (has_mbyte) + { +! /* 'e' offset may put us just below the last line */ +! if (pos->lnum > buf->b_ml.ml_line_count) +! ptr = (char_u *)""; +! else +! ptr = ml_get_buf(buf, pos->lnum, FALSE); +! pos->col -= (*mb_head_off)(ptr, ptr + pos->col); + } + #endif + } + else + { +--- 833,870 ---- + continue; + } + +! /* With the SEARCH_END option move to the last character +! * of the match. Don't do it for an empty match, end +! * should be same as start then. */ +! if (options & SEARCH_END && !(options & SEARCH_NOOF) +! && !(matchpos.lnum == endpos.lnum +! && matchpos.col == endpos.col)) + { ++ /* For a match in the first column, set the position ++ * on the NUL in the previous line. */ + pos->lnum = lnum + endpos.lnum; +! pos->col = endpos.col; +! if (endpos.col == 0) + { +! if (pos->lnum > 1) /* just in case */ +! { +! --pos->lnum; +! pos->col = (colnr_T)STRLEN(ml_get_buf(buf, +! pos->lnum, FALSE)); +! } + } ++ else ++ { ++ --pos->col; ++ #ifdef FEAT_MBYTE ++ if (has_mbyte ++ && pos->lnum <= buf->b_ml.ml_line_count) ++ { ++ ptr = ml_get_buf(buf, pos->lnum, FALSE); ++ pos->col -= (*mb_head_off)(ptr, ptr + pos->col); ++ } + #endif ++ } + } + else + { +*** ../vim-7.1.257/src/version.c Wed Feb 20 12:43:05 2008 +--- src/version.c Wed Feb 20 13:37:32 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 258, + /**/ + +-- +Micro$oft: where do you want to go today? + Linux: where do you want to go tomorrow? + FreeBSD: are you guys coming, or what? + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 67b939bfbd7eb489bb951dbf01f622c243e7299b Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:38:10 +0000 Subject: [PATCH 21/71] - patchlevel 259 --- 7.1.259 | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 7.1.259 diff --git a/7.1.259 b/7.1.259 new file mode 100644 index 00000000..fb4fb79f --- /dev/null +++ b/7.1.259 @@ -0,0 +1,61 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.259 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.259 +Problem: Cursor is in the wrong position when 'rightleft' is set, + 'encoding' is "utf-8" and on an illegal byte. (Dominique Pelle) +Solution: Only put the cursor in the first column when actually on a + double-wide character. (Yukihiro Nakadaira) +Files: src/screen.c + + +*** ../vim-7.1.258/src/screen.c Wed Feb 13 21:48:24 2008 +--- src/screen.c Wed Feb 20 14:06:26 2008 +*************** +*** 8045,8053 **** + windgoto(W_WINROW(curwin) + curwin->w_wrow, + W_WINCOL(curwin) + ( + #ifdef FEAT_RIGHTLEFT + curwin->w_p_rl ? ((int)W_WIDTH(curwin) - curwin->w_wcol - ( + # ifdef FEAT_MBYTE +! has_mbyte ? (*mb_ptr2cells)(ml_get_cursor()) : + # endif + 1)) : + #endif +--- 8045,8057 ---- + windgoto(W_WINROW(curwin) + curwin->w_wrow, + W_WINCOL(curwin) + ( + #ifdef FEAT_RIGHTLEFT ++ /* With 'rightleft' set and the cursor on a double-wide ++ * character, position it on the leftmost column. */ + curwin->w_p_rl ? ((int)W_WIDTH(curwin) - curwin->w_wcol - ( + # ifdef FEAT_MBYTE +! (has_mbyte +! && (*mb_ptr2cells)(ml_get_cursor()) == 2 +! && vim_isprintc(gchar_cursor())) ? 2 : + # endif + 1)) : + #endif +*** ../vim-7.1.258/src/version.c Wed Feb 20 13:41:14 2008 +--- src/version.c Wed Feb 20 14:10:23 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 259, + /**/ + +-- +A day without sunshine is like, well, night. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From bc67d538fcf006a76d98b11253f26f899b0e3bf4 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:38:18 +0000 Subject: [PATCH 22/71] - patchlevel 260 --- 7.1.260 | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 7.1.260 diff --git a/7.1.260 b/7.1.260 new file mode 100644 index 00000000..4bdd7673 --- /dev/null +++ b/7.1.260 @@ -0,0 +1,55 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.260 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.260 +Problem: Cursor positioning problem after ^@ wrapping halfway when + 'encoding' is utf-8. +Solution: Only count a position for printable characters. (partly by + Yukihiro Nakadaira) +Files: src/charset.c + + +*** ../vim-7.1.259/src/charset.c Sun Aug 19 22:42:27 2007 +--- src/charset.c Wed Feb 20 14:39:04 2008 +*************** +*** 1290,1296 **** + /* If a double-cell char doesn't fit at the end of a line + * it wraps to the next line, it's like this char is three + * cells wide. */ +! if (incr == 2 && wp->w_p_wrap && in_win_border(wp, vcol)) + { + ++incr; + head = 1; +--- 1290,1297 ---- + /* If a double-cell char doesn't fit at the end of a line + * it wraps to the next line, it's like this char is three + * cells wide. */ +! if (incr == 2 && wp->w_p_wrap && MB_BYTE2LEN(*ptr) > 1 +! && in_win_border(wp, vcol)) + { + ++incr; + head = 1; +*** ../vim-7.1.259/src/version.c Wed Feb 20 14:15:45 2008 +--- src/version.c Wed Feb 20 14:57:45 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 260, + /**/ + +-- +The users that I support would double-click on a landmine to find out +what happens. -- A system administrator + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 932e2c528a246e72d876551d3d67683b04b4bd75 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:38:26 +0000 Subject: [PATCH 23/71] - patchlevel 261 --- 7.1.261 | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 7.1.261 diff --git a/7.1.261 b/7.1.261 new file mode 100644 index 00000000..8c05e6c9 --- /dev/null +++ b/7.1.261 @@ -0,0 +1,78 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.261 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.261 +Problem: When a 2 byte BOM is detected Vim uses UCS-2, which doesn't work + for UTF-16 text. (Tony Mechelynck) +Solution: Default to UTF-16. +Files: src/fileio.c, src/testdir/test42.ok + + +*** ../vim-7.1.260/src/fileio.c Fri Jan 4 16:30:40 2008 +--- src/fileio.c Wed Feb 20 11:22:10 2008 +*************** +*** 5514,5523 **** + else if (p[0] == 0xfe && p[1] == 0xff + && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16)) + { +! if (flags == FIO_UTF16) +! name = "utf-16"; /* FE FF */ +! else + name = "ucs-2"; /* FE FF */ + } + else if (size >= 4 && p[0] == 0 && p[1] == 0 && p[2] == 0xfe + && p[3] == 0xff && (flags == FIO_ALL || flags == FIO_UCS4)) +--- 5523,5533 ---- + else if (p[0] == 0xfe && p[1] == 0xff + && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16)) + { +! /* Default to utf-16, it works also for ucs-2 text. */ +! if (flags == FIO_UCS2) + name = "ucs-2"; /* FE FF */ ++ else ++ name = "utf-16"; /* FE FF */ + } + else if (size >= 4 && p[0] == 0 && p[1] == 0 && p[2] == 0xfe + && p[3] == 0xff && (flags == FIO_ALL || flags == FIO_UCS4)) +*** ../vim-7.1.260/src/testdir/test42.ok Sun Jun 13 21:02:32 2004 +--- src/testdir/test42.ok Wed Feb 20 13:27:37 2008 +*************** +*** 15,21 **** + utf-8€err + + +! fileencoding=ucs-2 + bomb + ucs-2 + +--- 15,21 ---- + utf-8€err + + +! fileencoding=utf-16 + bomb + ucs-2 + +*** ../vim-7.1.260/src/version.c Wed Feb 20 14:58:46 2008 +--- src/version.c Wed Feb 20 18:13:00 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 261, + /**/ + +-- +Seen it all, done it all, can't remember most of it. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 2a74694d93b985a591eb471f4b96f3967fbacd8f Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:50:34 +0000 Subject: [PATCH 24/71] - patchlevel 262 --- 7.1.262 | 111 +++++++++++++++++++++++++++++++++++++++++++++++++ README.patches | 17 ++++++++ vim.spec | 47 ++++++++++++++++++++- 3 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 7.1.262 diff --git a/7.1.262 b/7.1.262 new file mode 100644 index 00000000..8b2111de --- /dev/null +++ b/7.1.262 @@ -0,0 +1,111 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.262 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.262 +Problem: Can't get the process ID of Vim. +Solution: Implement getpid(). +Files: src/eval.c, runtime/doc/eval.txt + + +*** ../vim-7.1.261/src/eval.c Wed Feb 20 12:22:59 2008 +--- src/eval.c Wed Feb 20 11:08:21 2008 +*************** +*** 532,537 **** +--- 532,538 ---- + static void f_getftype __ARGS((typval_T *argvars, typval_T *rettv)); + static void f_getline __ARGS((typval_T *argvars, typval_T *rettv)); + static void f_getmatches __ARGS((typval_T *argvars, typval_T *rettv)); ++ static void f_getpid __ARGS((typval_T *argvars, typval_T *rettv)); + static void f_getpos __ARGS((typval_T *argvars, typval_T *rettv)); + static void f_getqflist __ARGS((typval_T *argvars, typval_T *rettv)); + static void f_getreg __ARGS((typval_T *argvars, typval_T *rettv)); +*************** +*** 7132,7137 **** +--- 7133,7139 ---- + {"getline", 1, 2, f_getline}, + {"getloclist", 1, 1, f_getqflist}, + {"getmatches", 0, 0, f_getmatches}, ++ {"getpid", 0, 0, f_getpid}, + {"getpos", 1, 1, f_getpos}, + {"getqflist", 0, 0, f_getqflist}, + {"getreg", 0, 2, f_getreg}, +*************** +*** 10371,10376 **** +--- 10373,10390 ---- + } + } + #endif ++ } ++ ++ /* ++ * "getpid()" function ++ */ ++ /*ARGSUSED*/ ++ static void ++ f_getpid(argvars, rettv) ++ typval_T *argvars; ++ typval_T *rettv; ++ { ++ rettv->vval.v_number = mch_get_pid(); + } + + /* +*** ../vim-7.1.261/runtime/doc/eval.txt Wed Feb 13 12:41:30 2008 +--- runtime/doc/eval.txt Wed Feb 20 11:10:17 2008 +*************** +*** 1,4 **** +! *eval.txt* For Vim version 7.1. Last change: 2008 Feb 13 + + + VIM REFERENCE MANUAL by Bram Moolenaar +--- 1,4 ---- +! *eval.txt* For Vim version 7.1. Last change: 2008 Feb 20 + + + VIM REFERENCE MANUAL by Bram Moolenaar +*************** +*** 1638,1643 **** +--- 1638,1644 ---- + getline( {lnum}, {end}) List lines {lnum} to {end} of current buffer + getloclist({nr}) List list of location list items + getmatches() List list of current matches ++ getpid() Number process ID of Vim + getpos( {expr}) List position of cursor, mark, etc. + getqflist() List list of quickfix items + getreg( [{regname} [, 1]]) String contents of register +*************** +*** 3833,3838 **** +--- 3837,3846 ---- + characters. nr2char(0) is a real NUL and terminates the + string, thus results in an empty string. + ++ *getpid()* ++ getpid() Return a Number which is the process ID of the Vim process. ++ On Unix this is a unique number. On MS-DOS it's always zero. ++ + *getpos()* + getpos({expr}) Get the position for {expr}. For possible values of {expr} + see |line()|. +*** ../vim-7.1.261/src/version.c Wed Feb 20 18:14:25 2008 +--- src/version.c Wed Feb 20 20:04:14 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 262, + /**/ + +-- +Those who live by the sword get shot by those who don't. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index 159f3bba..48e2eb8c 100644 --- a/README.patches +++ b/README.patches @@ -277,3 +277,20 @@ Individual patches for Vim 7.1: 4475 7.1.243 (after 7.1.240) "U" doesn't work on all text in Visual mode 1847 7.1.244 GUI may have part of the command line cut off 2767 7.1.245 pressing CTRL-\ three times causes Vim to quit + 2739 7.1.246 configure hangs when the man pager is something strange + 6028 7.1.247 Netbeans: backspacing in Insert mode may skip a character + 3691 7.1.248 can't set the '" mark; can't know if setpos() was successful + 2144 7.1.249 after "U" the cursor can be past end of line + 1684 7.1.250 error for ":setglobal fenc=anything" when 'modifiable' is off + 3134 7.1.251 accessing freed memory when spell checking enabled + 1399 7.1.252 (after 7.1.243) test 39 fails when locale uses utf-8 encoding + 1751 7.1.253 ":sort" doesn't work in a one line file + 1894 7.1.254 Tests 49 and 55 fail when the locale is French + 1514 7.1.255 Vim doesn't support utf-32 + 50921 7.1.256 findfile() also returns directories + 3326 7.1.257 configure can't always find the Tcl header files + 3360 7.1.258 crash when doing "d/\n/e" and 'virtualedit' is "all" + 1944 7.1.259 cursor in wrong place with 'rl', "utf-8" and illegal byte + 1805 7.1.260 cursor position wrong after ^@ wrapping halfway if using utf-8 + 2255 7.1.261 for a 2 byte BOM UCS-2 is used, which doesn't work for UTF-16 + 3438 7.1.262 can't get the process ID of Vim diff --git a/vim.spec b/vim.spec index 62900a38..ec613376 100644 --- a/vim.spec +++ b/vim.spec @@ -17,7 +17,7 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 245 +%define patchlevel 262 Summary: The VIM editor URL: http://www.vim.org/ @@ -295,6 +295,27 @@ Patch239: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.239 Patch240: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.240 Patch241: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.241 Patch242: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.242 +Patch243: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.241 +Patch244: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.243 +Patch244: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.244 +Patch245: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.245 +Patch246: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.246 +Patch247: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.247 +Patch248: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.248 +Patch249: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.249 +Patch250: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.250 +Patch251: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.251 +Patch252: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.252 +Patch253: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.253 +Patch254: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.254 +Patch255: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.255 +Patch256: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.256 +Patch257: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.257 +Patch258: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.258 +Patch259: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.259 +Patch260: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.260 +Patch261: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.261 +Patch262: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.262 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch @@ -671,6 +692,26 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch240 -p0 %patch241 -p0 %patch242 -p0 +%patch243 -p0 +%patch244 -p0 +%patch245 -p0 +%patch246 -p0 +%patch247 -p0 +%patch248 -p0 +%patch249 -p0 +%patch250 -p0 +%patch251 -p0 +%patch252 -p0 +%patch253 -p0 +%patch254 -p0 +%patch255 -p0 +%patch256 -p0 +%patch257 -p0 +%patch258 -p0 +%patch259 -p0 +%patch260 -p0 +%patch261 -p0 +%patch262 -p0 # install spell files @@ -1058,6 +1099,10 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Mon Feb 25 2008 Karsten Hopp 7.1.262-1 +- patchlevel 262 +- add fix for #231124, BOM was ignored + * Mon Feb 11 2008 Karsten Hopp 7.1.245-1 - patchlevel 245 From 37832687bba71af2c3a50b6a05fca880f6a67941 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 15:59:47 +0000 Subject: [PATCH 25/71] - enable ruby interpreter (#215207) --- vim.spec | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/vim.spec b/vim.spec index ec613376..e3811172 100644 --- a/vim.spec +++ b/vim.spec @@ -12,6 +12,7 @@ %define withvimspell 0 %define withhunspell 0 +%define withruby 1 %define baseversion 7.1 #used for pre-releases: @@ -758,6 +759,11 @@ export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_ %else --disable-netbeans \ %endif +%if "%{withruby}" == "1" + --enable-rubyinterp \ +%else + --disable-rubyinterp \ +%endif make %{?_smp_mflags} cp vim gvim @@ -774,6 +780,11 @@ make clean %else --disable-netbeans \ %endif +%if "%{withruby}" == "1" + --enable-rubyinterp \ +%else + --disable-rubyinterp \ +%endif make %{?_smp_mflags} cp vim enhanced-vim @@ -1102,6 +1113,7 @@ rm -rf $RPM_BUILD_ROOT * Mon Feb 25 2008 Karsten Hopp 7.1.262-1 - patchlevel 262 - add fix for #231124, BOM was ignored +- enable ruby interpreter (#215207) * Mon Feb 11 2008 Karsten Hopp 7.1.245-1 - patchlevel 245 From a808d572057c360dd0a29df4e6a47a67e4c33d81 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 25 Feb 2008 16:56:37 +0000 Subject: [PATCH 26/71] - add filetype for Erlang header files (#417371) --- vim-7.1-erlang.patch | 12 ++++++++++++ vim.spec | 6 ++++-- 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 vim-7.1-erlang.patch diff --git a/vim-7.1-erlang.patch b/vim-7.1-erlang.patch new file mode 100644 index 00000000..e5efbe2b --- /dev/null +++ b/vim-7.1-erlang.patch @@ -0,0 +1,12 @@ +diff -up vim71/runtime/filetype.vim.erlang vim71/runtime/filetype.vim +--- vim71/runtime/filetype.vim.erlang 2008-02-25 17:50:50.000000000 +0100 ++++ vim71/runtime/filetype.vim 2008-02-25 17:51:17.000000000 +0100 +@@ -595,7 +595,7 @@ func! s:FTe() + endfunc + + " ERicsson LANGuage +-au BufNewFile,BufRead *.erl setf erlang ++au BufNewFile,BufRead *.erl,*hrl setf erlang + + " Elm Filter Rules file + au BufNewFile,BufRead filter-rules setf elmfilt diff --git a/vim.spec b/vim.spec index e3811172..033d6135 100644 --- a/vim.spec +++ b/vim.spec @@ -296,8 +296,7 @@ Patch239: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.239 Patch240: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.240 Patch241: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.241 Patch242: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.242 -Patch243: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.241 -Patch244: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.243 +Patch243: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.243 Patch244: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.244 Patch245: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.245 Patch246: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.246 @@ -332,6 +331,7 @@ Patch3012: vim-7.0-specedit.patch # Remove this one when the runtime files get updated (#246378): Patch3013: vim-7.1-ada.patch # +Patch3014: vim-7.1-erlang.patch Patch3100: vim-selinux.patch Patch3101: vim-selinux2.patch @@ -733,6 +733,7 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch3011 -p1 %patch3012 -p1 %patch3013 -p1 +%patch3014 -p1 %if %{WITH_SELINUX} %patch3100 -p1 @@ -1114,6 +1115,7 @@ rm -rf $RPM_BUILD_ROOT - patchlevel 262 - add fix for #231124, BOM was ignored - enable ruby interpreter (#215207) +- add filetype for Erlang header files (#417371) * Mon Feb 11 2008 Karsten Hopp 7.1.245-1 - patchlevel 245 From 823546196a25113af731eabe1ba3e28b7f027f71 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 3 Mar 2008 14:40:52 +0000 Subject: [PATCH 27/71] - patchlevel 263 --- 7.1.263 | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 7.1.263 diff --git a/7.1.263 b/7.1.263 new file mode 100644 index 00000000..59df471d --- /dev/null +++ b/7.1.263 @@ -0,0 +1,84 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.263 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.263 +Problem: The filetype can consist of two dot separated names. This works + for syntax and ftplugin, but not for indent. (Brett Stahlman) +Solution: Use split() and loop over each dot separated name. +Files: runtime/indent.vim + + +*** ../vim-7.1.262/runtime/indent.vim Mon Mar 28 22:56:55 2005 +--- runtime/indent.vim Fri Feb 22 21:05:39 2008 +*************** +*** 1,7 **** + " Vim support file to switch on loading indent files for file types + " + " Maintainer: Bram Moolenaar +! " Last Change: 2005 Mar 28 + + if exists("did_indent_on") + finish +--- 1,7 ---- + " Vim support file to switch on loading indent files for file types + " + " Maintainer: Bram Moolenaar +! " Last Change: 2008 Feb 22 + + if exists("did_indent_on") + finish +*************** +*** 15,25 **** + exe b:undo_indent + unlet! b:undo_indent b:did_indent + endif +! if expand("") != "" + if exists("b:did_indent") + unlet b:did_indent + endif +! runtime! indent/.vim + endif + endfunc + augroup END +--- 15,31 ---- + exe b:undo_indent + unlet! b:undo_indent b:did_indent + endif +! let s = expand("") +! if s != "" + if exists("b:did_indent") + unlet b:did_indent + endif +! +! " When there is a dot it is used to separate filetype names. Thus for +! " "aaa.bbb" load "indent/aaa.vim" and then "indent/bbb.vim". +! for name in split(s, '\.') +! exe 'runtime! indent/' . name . '.vim' +! endfor + endif + endfunc + augroup END +*** ../vim-7.1.262/src/version.c Wed Feb 20 20:09:44 2008 +--- src/version.c Mon Feb 25 20:44:04 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 263, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +45. You buy a Captain Kirk chair with a built-in keyboard and mouse. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 149381da19811f2942c04d7292ed9b16ce28e6f5 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 3 Mar 2008 14:41:00 +0000 Subject: [PATCH 28/71] - patchlevel 264 --- 7.1.264 | 237 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 7.1.264 diff --git a/7.1.264 b/7.1.264 new file mode 100644 index 00000000..67365cce --- /dev/null +++ b/7.1.264 @@ -0,0 +1,237 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.264 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.264 +Problem: Crash when indenting lines. (Dominique Pelle) +Solution: Set the cursor column when changing the cursor line. +Files: src/ops.c, src/misc1.c + + +*** ../vim-7.1.263/src/ops.c Wed Feb 6 14:43:50 2008 +--- src/ops.c Sun Feb 24 14:56:38 2008 +*************** +*** 692,697 **** +--- 692,698 ---- + } + } + ++curwin->w_cursor.lnum; ++ curwin->w_cursor.col = 0; /* make sure it's valid */ + } + + /* put cursor on first non-blank of indented line */ +*** ../vim-7.1.263/src/misc1.c Wed Feb 13 10:57:11 2008 +--- src/misc1.c Sun Feb 24 15:04:27 2008 +*************** +*** 6894,6899 **** +--- 6894,6900 ---- + if (trypos != NULL) + { + curwin->w_cursor.lnum = trypos->lnum + 1; ++ curwin->w_cursor.col = 0; + continue; + } + +*************** +*** 6954,6959 **** +--- 6955,6961 ---- + if (trypos != NULL) + { + curwin->w_cursor.lnum = trypos->lnum + 1; ++ curwin->w_cursor.col = 0; + continue; + } + } +*************** +*** 6991,6996 **** +--- 6993,6999 ---- + if ((trypos = find_start_comment(ind_maxcomment)) != NULL) + { + curwin->w_cursor.lnum = trypos->lnum + 1; ++ curwin->w_cursor.col = 0; + continue; + } + +*************** +*** 7114,7120 **** +--- 7117,7126 ---- + { + if (find_last_paren(l, '{', '}') && (trypos = + find_start_brace(ind_maxcomment)) != NULL) ++ { + curwin->w_cursor.lnum = trypos->lnum + 1; ++ curwin->w_cursor.col = 0; ++ } + continue; + } + +*************** +*** 7230,7240 **** + * case xx: if ( asdf && + * asdf) + */ +! curwin->w_cursor.lnum = trypos->lnum; + l = ml_get_curline(); + if (cin_iscase(l) || cin_isscopedecl(l)) + { + ++curwin->w_cursor.lnum; + continue; + } + } +--- 7236,7247 ---- + * case xx: if ( asdf && + * asdf) + */ +! curwin->w_cursor = *trypos; + l = ml_get_curline(); + if (cin_iscase(l) || cin_isscopedecl(l)) + { + ++curwin->w_cursor.lnum; ++ curwin->w_cursor.col = 0; + continue; + } + } +*************** +*** 7254,7259 **** +--- 7261,7267 ---- + if (*l == NUL || l[STRLEN(l) - 1] != '\\') + break; + --curwin->w_cursor.lnum; ++ curwin->w_cursor.col = 0; + } + } + +*************** +*** 7587,7597 **** + * case xx: if ( asdf && + * asdf) + */ +! curwin->w_cursor.lnum = trypos->lnum; + l = ml_get_curline(); + if (cin_iscase(l) || cin_isscopedecl(l)) + { + ++curwin->w_cursor.lnum; + continue; + } + } +--- 7595,7606 ---- + * case xx: if ( asdf && + * asdf) + */ +! curwin->w_cursor = *trypos; + l = ml_get_curline(); + if (cin_iscase(l) || cin_isscopedecl(l)) + { + ++curwin->w_cursor.lnum; ++ curwin->w_cursor.col = 0; + continue; + } + } +*************** +*** 7652,7664 **** + && (trypos = find_start_brace(ind_maxcomment)) + != NULL) /* XXX */ + { +! curwin->w_cursor.lnum = trypos->lnum; + /* if not "else {" check for terminated again */ + /* but skip block for "} else {" */ + l = cin_skipcomment(ml_get_curline()); + if (*l == '}' || !cin_iselse(l)) + goto term_again; + ++curwin->w_cursor.lnum; + } + } + } +--- 7661,7674 ---- + && (trypos = find_start_brace(ind_maxcomment)) + != NULL) /* XXX */ + { +! curwin->w_cursor = *trypos; + /* if not "else {" check for terminated again */ + /* but skip block for "} else {" */ + l = cin_skipcomment(ml_get_curline()); + if (*l == '}' || !cin_iselse(l)) + goto term_again; + ++curwin->w_cursor.lnum; ++ curwin->w_cursor.col = 0; + } + } + } +*************** +*** 7727,7732 **** +--- 7737,7743 ---- + if ((trypos = find_start_comment(ind_maxcomment)) != NULL) + { + curwin->w_cursor.lnum = trypos->lnum + 1; ++ curwin->w_cursor.col = 0; + continue; + } + +*************** +*** 7777,7783 **** + if (find_last_paren(l, '(', ')') + && (trypos = find_match_paren(ind_maxparen, + ind_maxcomment)) != NULL) +! curwin->w_cursor.lnum = trypos->lnum; + + /* For a line ending in ',' that is a continuation line go + * back to the first line with a backslash: +--- 7788,7794 ---- + if (find_last_paren(l, '(', ')') + && (trypos = find_match_paren(ind_maxparen, + ind_maxcomment)) != NULL) +! curwin->w_cursor = *trypos; + + /* For a line ending in ',' that is a continuation line go + * back to the first line with a backslash: +*************** +*** 7791,7796 **** +--- 7802,7808 ---- + if (*l == NUL || l[STRLEN(l) - 1] != '\\') + break; + --curwin->w_cursor.lnum; ++ curwin->w_cursor.col = 0; + } + + amount = get_indent(); /* XXX */ +*************** +*** 7864,7870 **** + + if ((trypos = find_match_paren(ind_maxparen, + ind_maxcomment)) != NULL) +! curwin->w_cursor.lnum = trypos->lnum; + amount = get_indent(); /* XXX */ + break; + } +--- 7876,7882 ---- + + if ((trypos = find_match_paren(ind_maxparen, + ind_maxcomment)) != NULL) +! curwin->w_cursor = *trypos; + amount = get_indent(); /* XXX */ + break; + } +*** ../vim-7.1.263/src/version.c Mon Feb 25 20:45:46 2008 +--- src/version.c Mon Feb 25 21:51:20 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 264, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +49. You never have to deal with busy signals when calling your ISP...because + you never log off. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 392215ee12d03b430ec0ee40b91f3fdd76e9d239 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 3 Mar 2008 14:41:10 +0000 Subject: [PATCH 29/71] - patchlevel 265 --- 7.1.265 | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 7.1.265 diff --git a/7.1.265 b/7.1.265 new file mode 100644 index 00000000..18aea172 --- /dev/null +++ b/7.1.265 @@ -0,0 +1,46 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.265 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.265 +Problem: When 'isfname' contains a space, cmdline completion can hang. + (James Vega) +Solution: Reset the "len" variable. +Files: src/ex_docmd.c + + +*** ../vim-7.1.264/src/ex_docmd.c Sat Jan 19 15:55:51 2008 +--- src/ex_docmd.c Sun Feb 24 22:09:52 2008 +*************** +*** 3346,3351 **** +--- 3346,3352 ---- + #endif + )) + { ++ len = 0; /* avoid getting stuck when space is in 'isfname' */ + while (*p != NUL) + { + #ifdef FEAT_MBYTE +*** ../vim-7.1.264/src/version.c Mon Feb 25 21:54:23 2008 +--- src/version.c Tue Feb 26 21:28:25 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 265, + /**/ + +-- +Q: What is a patch 22? +A: A patch you need to include to make it possible to include patches. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From ef25ac953bd76d6ab91b4ff68f9dd7d0505fc833 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 3 Mar 2008 14:41:24 +0000 Subject: [PATCH 30/71] - patchlevel 266 --- 7.1.266 | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++ README.patches | 4 +++ 2 files changed, 75 insertions(+) create mode 100644 7.1.266 diff --git a/7.1.266 b/7.1.266 new file mode 100644 index 00000000..f0d2941a --- /dev/null +++ b/7.1.266 @@ -0,0 +1,71 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.266 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.266 +Problem: When the version string returned by the terminal contains + unexpected characters, it is used as typed input. (James Vega) +Solution: Assume the escape sequence ends in a letter. +Files: src/term.c + + +*** ../vim-7.1.265/src/term.c Sat Sep 15 14:06:41 2007 +--- src/term.c Mon Feb 25 20:21:53 2008 +*************** +*** 4050,4064 **** + { + /* Check for xterm version string: "[>{x};{vers};{y}c". Also + * eat other possible responses to t_RV, rxvt returns +! * "[?1;2c". Also accept CSI instead of [. */ + if (*T_CRV != NUL && ((tp[0] == ESC && tp[1] == '[' && len >= 3) + || (tp[0] == CSI && len >= 2))) + { + j = 0; + extra = 0; +! for (i = 2 + (tp[0] != CSI); +! i < len && (VIM_ISDIGIT(tp[i]) +! || tp[i] == ';' || tp[i] == '.'); ++i) + if (tp[i] == ';' && ++j == 1) + extra = atoi((char *)tp + i + 1); + if (i == len) +--- 4050,4066 ---- + { + /* Check for xterm version string: "[>{x};{vers};{y}c". Also + * eat other possible responses to t_RV, rxvt returns +! * "[?1;2c". Also accept CSI instead of [. +! * mrxvt has been reported to have "+" in the version. Assume +! * the escape sequence ends with a letter or one of "{|}~". */ + if (*T_CRV != NUL && ((tp[0] == ESC && tp[1] == '[' && len >= 3) + || (tp[0] == CSI && len >= 2))) + { + j = 0; + extra = 0; +! for (i = 2 + (tp[0] != CSI); i < len +! && !(tp[i] >= '{' && tp[i] <= '~') +! && !ASCII_ISALPHA(tp[i]); ++i) + if (tp[i] == ';' && ++j == 1) + extra = atoi((char *)tp + i + 1); + if (i == len) +*** ../vim-7.1.265/src/version.c Tue Feb 26 21:29:06 2008 +--- src/version.c Wed Feb 27 16:10:59 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 266, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +54. You start tilting your head sideways to smile. :-) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index 48e2eb8c..c54db7f0 100644 --- a/README.patches +++ b/README.patches @@ -294,3 +294,7 @@ Individual patches for Vim 7.1: 1805 7.1.260 cursor position wrong after ^@ wrapping halfway if using utf-8 2255 7.1.261 for a 2 byte BOM UCS-2 is used, which doesn't work for UTF-16 3438 7.1.262 can't get the process ID of Vim + 2442 7.1.263 filetype with dot doesn't work for indent plugins + 6295 7.1.264 crash when C-indenting + 1310 7.1.265 hang when completing file name and space in 'isfname' + 2510 7.1.266 version string returned by terminal may be used as typed input From e73e8b0876eb8a551d6c982e53a668ab9db00986 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 3 Mar 2008 18:34:13 +0000 Subject: [PATCH 31/71] - patchlevel 266 - add minimal help page for /bin/vi (#173974) --- vi_help.txt | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++ vim.spec | 34 ++++++++++---- 2 files changed, 151 insertions(+), 9 deletions(-) create mode 100644 vi_help.txt diff --git a/vi_help.txt b/vi_help.txt new file mode 100644 index 00000000..23e5fe9e --- /dev/null +++ b/vi_help.txt @@ -0,0 +1,126 @@ +*vi-help.txt* For Vim version 7.1. Last change: 2008 Mar 03 + + VIM - minimal help file + (NOTE: This is a minimal help file and many tags won't work. Use 'vim' or + 'gvim' to read the complete help docs.) + k + Move around: Use the cursor keys, or "h" to go left, h l + "j" to go down, "k" to go up, "l" to go right. j +Close this window: Use ":q". + Get out of Vim: Use ":qa!" (careful, all changes are lost!). + +Jump to a subject: Position the cursor on a tag between |bars| and hit CTRL-]. + Jump back: Type CTRL-T or CTRL-O (repeat to go further back). + +Get specific help: It is possible to go directly to whatever you want help + on, by giving an argument to the ":help" command |:help|. + It is possible to further specify the context: + *vi-help-context* + WHAT PREPEND EXAMPLE ~ + Normal mode command (nothing) :help x + Insert mode command i_ :help i_ + Command-line command : :help :quit + Command-line editing c_ :help c_ + Vim command argument - :help -r + Option ' :help 'textwidth' + Search for help: Type ":help word", then hit CTRL-D to see matching + help entries for "word". + +VIM stands for Vi IMproved. Most of VIM was made by Bram Moolenaar, but only +through the help of many others. See |vi-credits|. +------------------------------------------------------------------------------ +3. Credits *vi-credits* *vi-author* *vi-Bram* *vi-Moolenaar* + +Most of Vim was written by Bram Moolenaar . + +Parts of the documentation come from several Vi manuals, written by: + W.N. Joy + Alan P.W. Hewett + Mark Horton + +The Vim editor is based on Stevie and includes (ideas from) other software, +worked on by the people mentioned here. Other people helped by sending me +patches, suggestions and giving feedback about what is good and bad in Vim. + +Vim would never have become what it is now, without the help of these people! + + Ron Aaron Win32 GUI changes + Zoltan Arpadffy work on VMS port + Tony Andrews Stevie + Gert van Antwerpen changes for DJGPP on MS-DOS + Berkeley DB(3) ideas for swap file implementation + Keith Bostic Nvi + Walter Briscoe Makefile updates, various patches + Ralf Brown SPAWNO library for MS-DOS + Robert Colon many useful remarks + Marcin Dalecki GTK+ GUI port, toolbar icons, gettext() + Kayhan Demirel sent me news in Uganda + Chris & John Downey xvi (ideas for multi-windows version) + Henk Elbers first VMS port + Daniel Elstner GTK+ 2 port + Eric Fischer Mac port, 'cindent', and other improvements + Benji Fisher Answering lots of user questions + Bill Foster Athena GUI port + Loic Grenie xvim (ideas for multi windows version) + Sven Guckes Vim promotor and previous WWW page maintainer + Darren Hiebert Exuberant ctags + Jason Hildebrand GTK+ 2 port + Bruce Hunsaker improvements for VMS port + Andy Kahn Cscope support, GTK+ GUI port + Oezguer Kesim Maintainer of Vim Mailing Lists + Axel Kielhorn work on the Macintosh port + Steve Kirkendall Elvis + Roger Knobbe original port to Windows NT + Sergey Laskavy Vim's help from Moscow + Felix von Leitner Maintainer of Vim Mailing Lists + David Leonard Port of Python extensions to Unix + Avner Lottem Edit in right-to-left windows + Flemming Madsen X11 client-server, various features and patches + MicroSoft Gave me a copy of DevStudio to compile Vim with + Paul Moore Python interface extensions, many patches + Katsuhito Nagano Work on multi-byte versions + Sung-Hyun Nam Work on multi-byte versions + Vince Negri Win32 GUI and generic console enhancements + Steve Oualline Author of the first Vim book |frombook| + George V. Reilly Win32 port, Win32 GUI start-off + Stephen Riehm bug collector + Stefan Roemer various patches and help to users + Ralf Schandl IBM OS/390 port + Olaf Seibert DICE and BeBox version, regexp improvements + Mortaza Shiran Farsi patches + Peter da Silva termlib + Paul Slootman OS/2 port + Henry Spencer regular expressions + Dany St-Amant Macintosh port + Tim Thompson Stevie + G. R. (Fred) Walter Stevie + Sven Verdoolaege Perl interface + Robert Webb Command-line completion, GUI versions, and + lots of patches + Ingo Wilken Tcl interface + Mike Williams PostScript printing + Juergen Weigert Lattice version, AUX improvements, UNIX and + MS-DOS ports, autoconf + Stefan 'Sec' Zehl Maintainer of vim.org + +I wish to thank all the people that sent me bug reports and suggestions. The +list is too long to mention them all here. Vim would not be the same without +the ideas from all these people: They keep Vim alive! + + +------------------------------------------------------------------------------ + *vi-doc-file-list* *V_ct* +BASIC: +|copying| About copyrights +|iccf| Helping poor children in Uganda +|sponsor| Sponsor Vim development, become a registered Vim user +|www| Vim on the World Wide Web +|bugs| Where to send bug reports + + +------------------------------------------------------------------------------ + +Now that you've jumped here with CTRL-] or a double mouse click, you can use +CTRL-T, CTRL-O, g, or to go back to where you were. +------------------------------------------------------------------------------ + vim:tw=78:fo=tcq2:isk=!-~,^*,^\|,^\":ts=8:ft=help:norl: diff --git a/vim.spec b/vim.spec index 033d6135..33383769 100644 --- a/vim.spec +++ b/vim.spec @@ -18,7 +18,7 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 262 +%define patchlevel 266 Summary: The VIM editor URL: http://www.vim.org/ @@ -38,7 +38,7 @@ Source8: gvim32.png Source9: gvim48.png Source10: gvim64.png Source11: Changelog.rpm -#Source12: vi-help.txt +Source12: vi_help.txt %if %{withvimspell} Source13: vim-spell-files.tar.bz2 %endif @@ -316,6 +316,10 @@ Patch259: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.259 Patch260: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.260 Patch261: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.261 Patch262: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.262 +Patch263: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.263 +Patch264: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.264 +Patch265: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.265 +Patch266: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.266 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch @@ -713,6 +717,10 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch260 -p0 %patch261 -p0 %patch262 -p0 +%patch263 -p0 +%patch264 -p0 +%patch265 -p0 +%patch266 -p0 # install spell files @@ -791,7 +799,7 @@ make %{?_smp_mflags} cp vim enhanced-vim make clean -#perl -pi -e "s/help.txt/vi-help.txt/" os_unix.h ex_cmds.c +perl -pi -e "s/help.txt/vi_help.txt/" os_unix.h ex_cmds.c perl -pi -e "s/\/etc\/vimrc/\/etc\/virc/" os_unix.h %configure --prefix=%{_prefix} --with-features=small --with-x=no \ --enable-multibyte \ @@ -815,7 +823,6 @@ cp runtime/doc/uganda.txt LICENSE cd src make install DESTDIR=$RPM_BUILD_ROOT BINDIR=/bin mv $RPM_BUILD_ROOT/bin/xxd $RPM_BUILD_ROOT/%{_bindir}/xxd -make installmacros DESTDIR=$RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/{16x16,32x32,48x48,64x64}/apps install -m755 gvim $RPM_BUILD_ROOT/%{_bindir}/gvim install -p -m644 %{SOURCE7} \ @@ -915,9 +922,16 @@ install -p -m644 %{SOURCE4} $RPM_BUILD_ROOT/%{_sysconfdir}/vimrc install -p -m644 %{SOURCE4} $RPM_BUILD_ROOT/%{_sysconfdir}/virc (cd $RPM_BUILD_ROOT/%{_datadir}/%{name}/%{vimdir}/doc; gzip -9 *.txt - gzip -d help.txt.gz - cat tags | sed -e 's/\t\(.*.txt\)\t/\t\1.gz\t/;s/\thelp.txt.gz\t/\thelp.txt\t/' > tags.new; mv -f tags.new tags -# cp %{SOURCE12} . + gzip -d help.txt.gz version7.txt.gz sponsor.txt.gz + cp %{SOURCE12} . + cat tags | sed -e 's/\t\(.*.txt\)\t/\t\1.gz\t/;s/\thelp.txt.gz\t/\thelp.txt\t/;s/\tversion7.txt.gz\t/\tversion7.txt\t/;s/\tsponsor.txt.gz\t/\tsponsor.txt\t/' > tags.new; mv -f tags.new tags +cat >> tags << EOF +vi_help.txt vi_help.txt /*vi_help.txt* +vi-author.txt vi_help.txt /*vi-author* +vi-Bram.txt vi_help.txt /*vi-Bram* +vi-Moolenaar.txt vi_help.txt /*vi-Moolenaar* +vi-credits.txt vi_help.txt /*vi-credits* +EOF ) (cd ../runtime; rm -rf doc; ln -svf ../../vim/%{vimdir}/doc docs;) rm -f $RPM_BUILD_ROOT/%{_datadir}/vim/%{vimdir}/macros/maze/maze*.c @@ -963,7 +977,6 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/%{name}/%{vimdir}/colors %{_datadir}/%{name}/%{vimdir}/compiler %{_datadir}/%{name}/%{vimdir}/doc -#exclude /%{_bindir}/vim/%{vimdir}/doc/vi-help.txt %{_datadir}/%{name}/%{vimdir}/*.vim %{_datadir}/%{name}/%{vimdir}/ftplugin %{_datadir}/%{name}/%{vimdir}/indent @@ -1079,7 +1092,6 @@ rm -rf $RPM_BUILD_ROOT /bin/view /bin/rvi /bin/rview -#%{_datadir}/%{name}/%{vimdir}/doc/vi-help.txt %files enhanced %defattr(-,root,root) @@ -1111,6 +1123,10 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Mon Feb 03 2008 Karsten Hopp 7.1.266-1 +- patchlevel 266 +- add minimal help page for /bin/vi (#173974) + * Mon Feb 25 2008 Karsten Hopp 7.1.262-1 - patchlevel 262 - add fix for #231124, BOM was ignored From c9e4ba56ab3b58e04ad8d515dfb1b3c032612808 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 3 Mar 2008 18:36:04 +0000 Subject: [PATCH 32/71] fix CL date --- vim.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vim.spec b/vim.spec index 33383769..470d8bbb 100644 --- a/vim.spec +++ b/vim.spec @@ -1123,7 +1123,7 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog -* Mon Feb 03 2008 Karsten Hopp 7.1.266-1 +* Mon Mar 03 2008 Karsten Hopp 7.1.266-1 - patchlevel 266 - add minimal help page for /bin/vi (#173974) From 10f184c341c5ab66a868b1df3dfa2ae2784f0185 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 10 Mar 2008 12:17:26 +0000 Subject: [PATCH 33/71] - patchlevel 267 --- 7.1.267 | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 7.1.267 diff --git a/7.1.267 b/7.1.267 new file mode 100644 index 00000000..a66f29f9 --- /dev/null +++ b/7.1.267 @@ -0,0 +1,57 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.267 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.267 +Problem: When changing folds cursor may be positioned in the wrong place. +Solution: Call changed_window_setting_win() instead of + changed_window_setting(). +Files: src/fold.c + + +*** ../vim-7.1.266/src/fold.c Sun Jan 13 21:57:25 2008 +--- src/fold.c Wed Mar 5 12:48:43 2008 +*************** +*** 2307,2313 **** + + /* If some fold changed, need to redraw and position cursor. */ + if (fold_changed && wp->w_p_fen) +! changed_window_setting(); + + /* If we updated folds past "bot", need to redraw more lines. Don't do + * this in other situations, the changed lines will be redrawn anyway and +--- 2307,2313 ---- + + /* If some fold changed, need to redraw and position cursor. */ + if (fold_changed && wp->w_p_fen) +! changed_window_setting_win(wp); + + /* If we updated folds past "bot", need to redraw more lines. Don't do + * this in other situations, the changed lines will be redrawn anyway and +*** ../vim-7.1.266/src/version.c Wed Feb 27 16:13:09 2008 +--- src/version.c Thu Mar 6 22:43:05 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 267, + /**/ + +-- +From "know your smileys": + % Bike accident. A bit far-fetched, I suppose; although... + o _ _ _ + _o /\_ _ \\o (_)\__/o (_) + _< \_ _>(_) (_)/<_ \_| \ _|/' \/ + (_)>(_) (_) (_) (_) (_)' _\o_ + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 09ae6641f56ce958681c27cb3f883548d4f19dce Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 10 Mar 2008 12:17:38 +0000 Subject: [PATCH 34/71] - patchlevel 268 --- 7.1.268 | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 7.1.268 diff --git a/7.1.268 b/7.1.268 new file mode 100644 index 00000000..2e1f9a67 --- /dev/null +++ b/7.1.268 @@ -0,0 +1,53 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.268 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.268 +Problem: Always shows "+" at end of screen line with: ":set + listchars=eol:$,extends:+ nowrap list cursorline" (Gary Johnson) +Solution: Check for lcs_eol_one instead of lcs_eol. +Files: src/screen.c + + +*** ../vim-7.1.267/src/screen.c Wed Feb 20 14:15:45 2008 +--- src/screen.c Sun Mar 9 14:26:14 2008 +*************** +*** 4527,4533 **** + #endif + col == W_WIDTH(wp) - 1) + && (*ptr != NUL +! || (wp->w_p_list && lcs_eol != NUL && p_extra != at_end_str) + || (n_extra && (c_extra != NUL || *p_extra != NUL)))) + { + c = lcs_ext; +--- 4527,4533 ---- + #endif + col == W_WIDTH(wp) - 1) + && (*ptr != NUL +! || (wp->w_p_list && lcs_eol_one > 0) + || (n_extra && (c_extra != NUL || *p_extra != NUL)))) + { + c = lcs_ext; +*** ../vim-7.1.267/src/version.c Thu Mar 6 22:44:45 2008 +--- src/version.c Sun Mar 9 14:24:59 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 268, + /**/ + +-- +From "know your smileys": + :-* A big kiss! + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 1404067f130a3ed8eddfc3901a1cf312beca5a4a Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 10 Mar 2008 12:18:00 +0000 Subject: [PATCH 35/71] - patchlevel 269 --- 7.1.269 | 171 +++++++++++++++++++++++++++++++++++++++++++++++++ README.patches | 3 + vim.spec | 12 +++- 3 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 7.1.269 diff --git a/7.1.269 b/7.1.269 new file mode 100644 index 00000000..7a2b4284 --- /dev/null +++ b/7.1.269 @@ -0,0 +1,171 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.269 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.269 +Problem: The matchparen plugin has an arbitrary limit for the number of + lines to look for a match. +Solution: Rely on the searchpair() timeout. +Files: runtime/plugin/matchparen.vim + + +*** ../vim-7.1.268/runtime/plugin/matchparen.vim Sun Jan 6 20:05:36 2008 +--- runtime/plugin/matchparen.vim Wed Feb 27 22:39:32 2008 +*************** +*** 1,6 **** + " Vim plugin for showing matching parens + " Maintainer: Bram Moolenaar +! " Last Change: 2008 Jan 06 + + " Exit quickly when: + " - this plugin was already loaded (or disabled) +--- 1,6 ---- + " Vim plugin for showing matching parens + " Maintainer: Bram Moolenaar +! " Last Change: 2008 Feb 27 + + " Exit quickly when: + " - this plugin was already loaded (or disabled) +*************** +*** 34,40 **** + endif + + " Avoid that we remove the popup menu. +! if pumvisible() + return + endif + +--- 34,41 ---- + endif + + " Avoid that we remove the popup menu. +! " Return when there are no colors (looks like the cursor jumps). +! if pumvisible() || (&t_Co < 8 && !has("gui_running")) + return + endif + +*************** +*** 60,98 **** + endif + + " Figure out the arguments for searchpairpos(). +- " Restrict the search to visible lines with "stopline". +- " And avoid searching very far (e.g., for closed folds and long lines) +- " The "viewable" variables give a range in which we can scroll while keeping +- " the cursor at the same position +- " adjustedScrolloff accounts for very large numbers of scrolloff +- let adjustedScrolloff = min([&scrolloff, (line('w$') - line('w0')) / 2]) +- let bottom_viewable = min([line('$'), c_lnum + &lines - adjustedScrolloff - 2]) +- let top_viewable = max([1, c_lnum-&lines+adjustedScrolloff + 2]) +- " one of these stoplines will be adjusted below, but the current values are +- " minimal boundaries within the current window +- let stoplinebottom = line('w$') +- let stoplinetop = line('w0') + if i % 2 == 0 + let s_flags = 'nW' + let c2 = plist[i + 1] +- if has("byte_offset") && has("syntax_items") && &smc > 0 +- let stopbyte = min([line2byte("$"), line2byte(".") + col(".") + &smc * 2]) +- let stopline = min([bottom_viewable, byte2line(stopbyte)]) +- else +- let stopline = min([bottom_viewable, c_lnum + 100]) +- endif +- let stoplinebottom = stopline + else + let s_flags = 'nbW' + let c2 = c + let c = plist[i - 1] +- if has("byte_offset") && has("syntax_items") && &smc > 0 +- let stopbyte = max([1, line2byte(".") + col(".") - &smc * 2]) +- let stopline = max([top_viewable, byte2line(stopbyte)]) +- else +- let stopline = max([top_viewable, c_lnum - 100]) +- endif +- let stoplinetop = stopline + endif + if c == '[' + let c = '\[' +--- 61,73 ---- +*************** +*** 111,120 **** + \ '=~? "string\\|character\\|singlequote\\|comment"' + execute 'if' s_skip '| let s_skip = 0 | endif' + + try +! " Limit the search time to 500 msec to avoid a hang on very long lines. +! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 500) + catch /E118/ + let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline) + endtry + +--- 86,132 ---- + \ '=~? "string\\|character\\|singlequote\\|comment"' + execute 'if' s_skip '| let s_skip = 0 | endif' + ++ " Limit the search to lines visible in the window. ++ let stoplinebottom = line('w$') ++ let stoplinetop = line('w0') ++ if i % 2 == 0 ++ let stopline = stoplinebottom ++ else ++ let stopline = stoplinetop ++ endif ++ + try +! " Limit the search time to 300 msec to avoid a hang on very long lines. +! " This fails when a timeout is not supported. +! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 300) + catch /E118/ ++ " Can't use the timeout, restrict the stopline a bit more to avoid taking ++ " a long time on closed folds and long lines. ++ " The "viewable" variables give a range in which we can scroll while ++ " keeping the cursor at the same position. ++ " adjustedScrolloff accounts for very large numbers of scrolloff. ++ let adjustedScrolloff = min([&scrolloff, (line('w$') - line('w0')) / 2]) ++ let bottom_viewable = min([line('$'), c_lnum + &lines - adjustedScrolloff - 2]) ++ let top_viewable = max([1, c_lnum-&lines+adjustedScrolloff + 2]) ++ " one of these stoplines will be adjusted below, but the current values are ++ " minimal boundaries within the current window ++ if i % 2 == 0 ++ if has("byte_offset") && has("syntax_items") && &smc > 0 ++ let stopbyte = min([line2byte("$"), line2byte(".") + col(".") + &smc * 2]) ++ let stopline = min([bottom_viewable, byte2line(stopbyte)]) ++ else ++ let stopline = min([bottom_viewable, c_lnum + 100]) ++ endif ++ let stoplinebottom = stopline ++ else ++ if has("byte_offset") && has("syntax_items") && &smc > 0 ++ let stopbyte = max([1, line2byte(".") + col(".") - &smc * 2]) ++ let stopline = max([top_viewable, byte2line(stopbyte)]) ++ else ++ let stopline = max([top_viewable, c_lnum - 100]) ++ endif ++ let stoplinetop = stopline ++ endif + let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline) + endtry + +*** ../vim-7.1.268/src/version.c Sun Mar 9 14:30:12 2008 +--- src/version.c Sun Mar 9 16:21:00 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 269, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +93. New mail alarm on your palmtop annoys other churchgoers. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index c54db7f0..ae4f7f2c 100644 --- a/README.patches +++ b/README.patches @@ -298,3 +298,6 @@ Individual patches for Vim 7.1: 6295 7.1.264 crash when C-indenting 1310 7.1.265 hang when completing file name and space in 'isfname' 2510 7.1.266 version string returned by terminal may be used as typed input + 1957 7.1.267 when changing folds cursor may be positioned in a wrong place + 1576 7.1.268 always shows "+" at end of screen line with 'cursurline' + 6183 7.1.269 matchparen plugin has an arbitrary line number limit diff --git a/vim.spec b/vim.spec index 470d8bbb..235140ae 100644 --- a/vim.spec +++ b/vim.spec @@ -18,7 +18,7 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 266 +%define patchlevel 269 Summary: The VIM editor URL: http://www.vim.org/ @@ -320,6 +320,9 @@ Patch263: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.263 Patch264: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.264 Patch265: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.265 Patch266: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.266 +Patch267: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.267 +Patch268: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.268 +Patch269: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.269 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch @@ -721,6 +724,9 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch264 -p0 %patch265 -p0 %patch266 -p0 +%patch267 -p0 +%patch268 -p0 +%patch269 -p0 # install spell files @@ -1123,6 +1129,10 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Mon Mar 10 2008 Karsten Hopp 7.1.269-1 +- patchlevel 269 +- rebuild with new perl (#436731) + * Mon Mar 03 2008 Karsten Hopp 7.1.266-1 - patchlevel 266 - add minimal help page for /bin/vi (#173974) From 779335b44d5928014d4a85c54e3813045ea97f48 Mon Sep 17 00:00:00 2001 From: Tom Callaway Date: Mon, 10 Mar 2008 14:17:23 +0000 Subject: [PATCH 36/71] add missing perl BR --- vim.spec | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vim.spec b/vim.spec index 235140ae..d448cc58 100644 --- a/vim.spec +++ b/vim.spec @@ -24,7 +24,7 @@ Summary: The VIM editor URL: http://www.vim.org/ Name: vim Version: %{baseversion}.%{beta}%{patchlevel} -Release: 1%{?dist} +Release: 2%{?dist} License: Vim Group: Applications/Editors Source0: ftp://ftp.vim.org/pub/vim/unix/vim-%{baseversion}%{?beta}%{?CVSDATE}.tar.bz2 @@ -344,6 +344,7 @@ Patch3101: vim-selinux2.patch Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: python-devel ncurses-devel gettext perl-devel +BuildRequires: perl(ExtUtils::Embed) BuildRequires: libacl-devel gpm-devel autoconf %if %{WITH_SELINUX} BuildRequires: libselinux-devel @@ -1129,6 +1130,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Mon Mar 10 2008 Tom "spot" Callaway 7.1.269-2 +- BR: ExtUtils::Embed to find perl headers + * Mon Mar 10 2008 Karsten Hopp 7.1.269-1 - patchlevel 269 - rebuild with new perl (#436731) From 3ee96c97ca29293d4a019eda112d1cce92746118 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Tue, 11 Mar 2008 12:49:59 +0000 Subject: [PATCH 37/71] - patchlevel 270 - don't write swapfile on most common locations for USB-sticks (#436752) --- 7.1.270 | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++ README.patches | 1 + vim.spec | 10 ++++-- vimrc | 2 ++ 4 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 7.1.270 diff --git a/7.1.270 b/7.1.270 new file mode 100644 index 00000000..d2563c8e --- /dev/null +++ b/7.1.270 @@ -0,0 +1,94 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.270 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.270 +Problem: ":?foo?" matches in current line since patch 7.1.025. (A.Politz) +Solution: Remove the SEARCH_START flag. +Files: src/ex_docmd.c, src/search.c + + +*** ../vim-7.1.269/src/ex_docmd.c Tue Feb 26 21:29:06 2008 +--- src/ex_docmd.c Sun Mar 2 20:50:43 2008 +*************** +*** 3932,3939 **** + curwin->w_cursor.col = 0; + searchcmdlen = 0; + if (!do_search(NULL, c, cmd, 1L, +! SEARCH_HIS + SEARCH_MSG + SEARCH_START, +! NULL)) + { + curwin->w_cursor = pos; + cmd = NULL; +--- 3932,3938 ---- + curwin->w_cursor.col = 0; + searchcmdlen = 0; + if (!do_search(NULL, c, cmd, 1L, +! SEARCH_HIS | SEARCH_MSG, NULL)) + { + curwin->w_cursor = pos; + cmd = NULL; +*************** +*** 3980,3987 **** + pos.col = 0; + if (searchit(curwin, curbuf, &pos, + *cmd == '?' ? BACKWARD : FORWARD, +! (char_u *)"", 1L, +! SEARCH_MSG + SEARCH_START, + i, (linenr_T)0, NULL) != FAIL) + lnum = pos.lnum; + else +--- 3979,3985 ---- + pos.col = 0; + if (searchit(curwin, curbuf, &pos, + *cmd == '?' ? BACKWARD : FORWARD, +! (char_u *)"", 1L, SEARCH_MSG, + i, (linenr_T)0, NULL) != FAIL) + lnum = pos.lnum; + else +*** ../vim-7.1.269/src/search.c Wed Feb 20 13:41:14 2008 +--- src/search.c Sun Mar 2 22:00:50 2008 +*************** +*** 538,544 **** + return FAIL; + } + +! if (options & SEARCH_START) + extra_col = 0; + #ifdef FEAT_MBYTE + /* Watch out for the "col" being MAXCOL - 2, used in a closed fold. */ +--- 538,547 ---- + return FAIL; + } + +! /* When not accepting a match at the start position set "extra_col" to a +! * non-zero value. Don't do that when starting at MAXCOL, since MAXCOL + +! * 1 is zero. */ +! if ((options & SEARCH_START) || pos->col == MAXCOL) + extra_col = 0; + #ifdef FEAT_MBYTE + /* Watch out for the "col" being MAXCOL - 2, used in a closed fold. */ +*** ../vim-7.1.269/src/version.c Sun Mar 9 16:45:16 2008 +--- src/version.c Mon Mar 10 21:32:07 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 270, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +102. When filling out your driver's license application, you give + your IP address. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index ae4f7f2c..a2910dec 100644 --- a/README.patches +++ b/README.patches @@ -301,3 +301,4 @@ Individual patches for Vim 7.1: 1957 7.1.267 when changing folds cursor may be positioned in a wrong place 1576 7.1.268 always shows "+" at end of screen line with 'cursurline' 6183 7.1.269 matchparen plugin has an arbitrary line number limit + 2861 7.1.270 ":?foo?" matches in current line since patch 7.1.025 diff --git a/vim.spec b/vim.spec index d448cc58..9a13acd9 100644 --- a/vim.spec +++ b/vim.spec @@ -18,13 +18,13 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 269 +%define patchlevel 270 Summary: The VIM editor URL: http://www.vim.org/ Name: vim Version: %{baseversion}.%{beta}%{patchlevel} -Release: 2%{?dist} +Release: 1%{?dist} License: Vim Group: Applications/Editors Source0: ftp://ftp.vim.org/pub/vim/unix/vim-%{baseversion}%{?beta}%{?CVSDATE}.tar.bz2 @@ -323,6 +323,7 @@ Patch266: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.266 Patch267: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.267 Patch268: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.268 Patch269: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.269 +Patch270: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.270 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch @@ -728,6 +729,7 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch267 -p0 %patch268 -p0 %patch269 -p0 +%patch270 -p0 # install spell files @@ -1130,6 +1132,10 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Tue Mar 11 2008 Karsten Hopp 7.1.270-1 +- patchlevel 270 +- don't write swapfile on most common locations for USB-sticks (#436752) + * Mon Mar 10 2008 Tom "spot" Callaway 7.1.269-2 - BR: ExtUtils::Embed to find perl headers diff --git a/vimrc b/vimrc index 8da18fbf..5eaf2624 100644 --- a/vimrc +++ b/vimrc @@ -20,6 +20,8 @@ if has("autocmd") \ if line("'\"") > 0 && line ("'\"") <= line("$") | \ exe "normal! g'\"" | \ endif + " don't write swapfile on most commonly used directories for NFS mounts or USB sticks + autocmd BufNewFile,BufReadPre /media/*,/mnt/* set directory=~/tmp,/var/tmp,/tmp endif if has("cscope") && filereadable("/usr/bin/cscope") From 19c138f48f226ac3b66926c6af76a55a58563ec7 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Tue, 11 Mar 2008 13:03:02 +0000 Subject: [PATCH 38/71] - add spec file template --- template.spec | 42 ++++++++++++++++++++++++++++++++++++++++++ vim.spec | 4 ++++ vimrc | 2 ++ 3 files changed, 48 insertions(+) create mode 100644 template.spec diff --git a/template.spec b/template.spec new file mode 100644 index 00000000..2b1f97cf --- /dev/null +++ b/template.spec @@ -0,0 +1,42 @@ +Name: +Version: +Release: 1%{?dist} +Summary: + +Group: +License: +URL: +Source0: +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: +Requires: + +%description + + +%prep +%setup -q + + +%build +%configure +make %{?_smp_mflags} + + +%install +rm -rf $RPM_BUILD_ROOT +make install DESTDIR=$RPM_BUILD_ROOT + + +%clean +rm -rf $RPM_BUILD_ROOT + + +%files +%defattr(-,root,root,-) +%doc + + + +%changelog diff --git a/vim.spec b/vim.spec index 9a13acd9..b4c22dcc 100644 --- a/vim.spec +++ b/vim.spec @@ -42,6 +42,7 @@ Source12: vi_help.txt %if %{withvimspell} Source13: vim-spell-files.tar.bz2 %endif +Source14: template.spec Patch2002: vim-7.0-fixkeys.patch Patch2003: vim-6.2-specsyntax.patch @@ -826,6 +827,7 @@ mkdir -p $RPM_BUILD_ROOT/bin mkdir -p $RPM_BUILD_ROOT/%{_bindir} mkdir -p $RPM_BUILD_ROOT/%{_datadir}/%{name}/vimfiles/after cp -f %{SOURCE11} . +cp -f %{SOURCE14} $RPM_BUILD_ROOT/%{_datadir}/%{name}/vimfiles/ cp runtime/doc/uganda.txt LICENSE @@ -982,6 +984,7 @@ rm -rf $RPM_BUILD_ROOT %dir %{_datadir}/%{name}/%{vimdir} %dir %{_datadir}/%{name}/vimfiles %dir %{_datadir}/%{name}/vimfiles/after +%{_datadir}/%{name}/vimfiles/template.spec %{_datadir}/%{name}/%{vimdir}/autoload %{_datadir}/%{name}/%{vimdir}/colors %{_datadir}/%{name}/%{vimdir}/compiler @@ -1135,6 +1138,7 @@ rm -rf $RPM_BUILD_ROOT * Tue Mar 11 2008 Karsten Hopp 7.1.270-1 - patchlevel 270 - don't write swapfile on most common locations for USB-sticks (#436752) +- add spec file template * Mon Mar 10 2008 Tom "spot" Callaway 7.1.269-2 - BR: ExtUtils::Embed to find perl headers diff --git a/vimrc b/vimrc index 5eaf2624..9097e865 100644 --- a/vimrc +++ b/vimrc @@ -22,6 +22,8 @@ if has("autocmd") \ endif " don't write swapfile on most commonly used directories for NFS mounts or USB sticks autocmd BufNewFile,BufReadPre /media/*,/mnt/* set directory=~/tmp,/var/tmp,/tmp + " start with spec file template + autocmd BufNewFile *.spec 0r /usr/share/vim/vimfiles/template.spec endif if has("cscope") && filereadable("/usr/bin/cscope") From f757d89d09cca7fd7f2d3e5cefe06fe40d566635 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Tue, 11 Mar 2008 13:06:03 +0000 Subject: [PATCH 39/71] - dumb makefile tries to parse every file with .spec suffix, rename it --- template.spec => spec-template | 0 vim.spec | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename template.spec => spec-template (100%) diff --git a/template.spec b/spec-template similarity index 100% rename from template.spec rename to spec-template diff --git a/vim.spec b/vim.spec index b4c22dcc..b9f4d686 100644 --- a/vim.spec +++ b/vim.spec @@ -42,7 +42,7 @@ Source12: vi_help.txt %if %{withvimspell} Source13: vim-spell-files.tar.bz2 %endif -Source14: template.spec +Source14: spec-template Patch2002: vim-7.0-fixkeys.patch Patch2003: vim-6.2-specsyntax.patch From 10143b63bb8cc5cdcddb774998c2642f9da2193e Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Tue, 11 Mar 2008 14:49:46 +0000 Subject: [PATCH 40/71] - fix filename --- vim.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vim.spec b/vim.spec index b9f4d686..5617e31f 100644 --- a/vim.spec +++ b/vim.spec @@ -827,7 +827,7 @@ mkdir -p $RPM_BUILD_ROOT/bin mkdir -p $RPM_BUILD_ROOT/%{_bindir} mkdir -p $RPM_BUILD_ROOT/%{_datadir}/%{name}/vimfiles/after cp -f %{SOURCE11} . -cp -f %{SOURCE14} $RPM_BUILD_ROOT/%{_datadir}/%{name}/vimfiles/ +cp -f %{SOURCE14} $RPM_BUILD_ROOT/%{_datadir}/%{name}/vimfiles/template.spec cp runtime/doc/uganda.txt LICENSE From 54eef065ccc047515182d20ea368c710b2ed68db Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 12 Mar 2008 12:38:00 +0000 Subject: [PATCH 41/71] - patchlevel 271 --- 7.1.271 | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 7.1.271 diff --git a/7.1.271 b/7.1.271 new file mode 100644 index 00000000..19495070 --- /dev/null +++ b/7.1.271 @@ -0,0 +1,53 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.271 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.271 +Problem: In a Vim build without autocommands, checking a file that was + changed externally causes the current buffer to be changed + unexpectedly. (Karsten Hopp) +Solution: Store "curbuf" instead of "buf". +Files: src/fileio.c + + +*** ../vim-7.1.270/src/fileio.c Wed Feb 20 18:14:25 2008 +--- src/fileio.c Tue Mar 11 21:35:05 2008 +*************** +*** 9239,9245 **** + aco_save_T *aco; /* structure to save values in */ + buf_T *buf; /* new curbuf */ + { +! aco->save_buf = buf; + curbuf = buf; + curwin->w_buffer = buf; + } +--- 9248,9254 ---- + aco_save_T *aco; /* structure to save values in */ + buf_T *buf; /* new curbuf */ + { +! aco->save_buf = curbuf; + curbuf = buf; + curwin->w_buffer = buf; + } +*** ../vim-7.1.270/src/version.c Mon Mar 10 21:33:52 2008 +--- src/version.c Tue Mar 11 21:57:30 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 271, + /**/ + +-- +In a world without walls and borders, who needs windows and gates? + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From e3deb8f9e62ca0c253e3db1477f2f3d6e9713443 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 12 Mar 2008 12:38:10 +0000 Subject: [PATCH 42/71] - patchlevel 272 --- 7.1.272 | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 7.1.272 diff --git a/7.1.272 b/7.1.272 new file mode 100644 index 00000000..19bacc67 --- /dev/null +++ b/7.1.272 @@ -0,0 +1,84 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.272 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.272 +Problem: The special buffer name [Location List] is not used for a buffer + displayed in another tab page. +Solution: Use FOR_ALL_TAB_WINDOWS instead of FOR_ALL_WINDOWS. (Hiroaki + Nishihara) +Files: src/buffer.c + + +*** ../vim-7.1.271/src/buffer.c Wed Oct 3 14:30:54 2007 +--- src/buffer.c Wed Mar 5 21:55:44 2008 +*************** +*** 4912,4918 **** + return retval; + } + +! #ifdef FEAT_VIMINFO + int + read_viminfo_bufferlist(virp, writing) + vir_T *virp; +--- 4912,4918 ---- + return retval; + } + +! #if defined(FEAT_VIMINFO) || defined(PROTO) + int + read_viminfo_bufferlist(virp, writing) + vir_T *virp; +*************** +*** 5033,5045 **** + #if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS) + if (bt_quickfix(buf)) + { +! win_T *win; + + /* + * For location list window, w_llist_ref points to the location list. + * For quickfix window, w_llist_ref is NULL. + */ +! FOR_ALL_WINDOWS(win) + if (win->w_buffer == buf) + break; + if (win != NULL && win->w_llist_ref != NULL) +--- 5033,5046 ---- + #if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS) + if (bt_quickfix(buf)) + { +! win_T *win; +! tabpage_T *tp; + + /* + * For location list window, w_llist_ref points to the location list. + * For quickfix window, w_llist_ref is NULL. + */ +! FOR_ALL_TAB_WINDOWS(tp, win) + if (win->w_buffer == buf) + break; + if (win != NULL && win->w_llist_ref != NULL) +*** ../vim-7.1.271/src/version.c Tue Mar 11 22:01:16 2008 +--- src/version.c Wed Mar 12 12:21:13 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 272, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +113. You are asked about a bus schedule, you wonder if it is 16 or 32 bits. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 0ee4caf6cca01ba0cb4c9065aa4a0c6b35500fdd Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 12 Mar 2008 12:38:47 +0000 Subject: [PATCH 43/71] - patchlevel 273 --- 7.1.273 | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ README.patches | 3 ++ vim.spec | 11 +++++++- 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 7.1.273 diff --git a/7.1.273 b/7.1.273 new file mode 100644 index 00000000..02a6ca9d --- /dev/null +++ b/7.1.273 @@ -0,0 +1,74 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.273 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.273 +Problem: When profiling on Linux Vim exits early. (Liu Yubao) +Solution: When profiling don't exit on SIGPROF. +Files: src/Makefile, src/os_unix.c + + +*** ../vim-7.1.272/src/Makefile Wed Mar 12 12:23:18 2008 +--- src/Makefile Wed Mar 12 13:11:07 2008 +*************** +*** 545,551 **** + # For unknown reasons adding "-lc" fixes a linking problem with GCC. That's + # probably a bug in the "-pg" implementation. + # Need to recompile everything after changing this: "make clean" "make". +! #PROFILE_CFLAGS = -pg -g + #PROFILE_LIBS = -pg + #PROFILE_LIBS = -pg -lc + +--- 545,551 ---- + # For unknown reasons adding "-lc" fixes a linking problem with GCC. That's + # probably a bug in the "-pg" implementation. + # Need to recompile everything after changing this: "make clean" "make". +! #PROFILE_CFLAGS = -pg -g -DWE_ARE_PROFILING + #PROFILE_LIBS = -pg + #PROFILE_LIBS = -pg -lc + +*** ../vim-7.1.272/src/os_unix.c Sun Feb 10 22:25:12 2008 +--- src/os_unix.c Wed Mar 5 22:15:41 2008 +*************** +*** 269,276 **** + #ifdef SIGVTALRM + {SIGVTALRM, "VTALRM", TRUE}, + #endif +! #if defined(SIGPROF) && !defined(FEAT_MZSCHEME) +! /* MzScheme uses SIGPROF for its own needs */ + {SIGPROF, "PROF", TRUE}, + #endif + #ifdef SIGXCPU +--- 269,277 ---- + #ifdef SIGVTALRM + {SIGVTALRM, "VTALRM", TRUE}, + #endif +! #if defined(SIGPROF) && !defined(FEAT_MZSCHEME) && !defined(WE_ARE_PROFILING) +! /* MzScheme uses SIGPROF for its own needs; On Linux with profiling +! * this makes Vim exit. WE_ARE_PROFILING is defined in Makefile. */ + {SIGPROF, "PROF", TRUE}, + #endif + #ifdef SIGXCPU +*** ../vim-7.1.272/src/version.c Wed Mar 12 12:22:56 2008 +--- src/version.c Wed Mar 12 13:08:59 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 273, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +114. You are counting items, you go "0,1,2,3,4,5,6,7,8,9,A,B,C,D...". + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index a2910dec..a62b12c9 100644 --- a/README.patches +++ b/README.patches @@ -302,3 +302,6 @@ Individual patches for Vim 7.1: 1576 7.1.268 always shows "+" at end of screen line with 'cursurline' 6183 7.1.269 matchparen plugin has an arbitrary line number limit 2861 7.1.270 ":?foo?" matches in current line since patch 7.1.025 + 1582 7.1.271 in tiny version ":!touch %" causes curbuf to be wrong + 2334 7.1.272 buffer name [Location List] not used for buffer in other tab + 2504 7.1.273 when profiling on Linux Vim exits early diff --git a/vim.spec b/vim.spec index 5617e31f..3d2921ca 100644 --- a/vim.spec +++ b/vim.spec @@ -18,7 +18,7 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 270 +%define patchlevel 273 Summary: The VIM editor URL: http://www.vim.org/ @@ -325,6 +325,9 @@ Patch267: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.267 Patch268: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.268 Patch269: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.269 Patch270: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.270 +Patch271: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.271 +Patch272: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.272 +Patch273: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.273 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch @@ -731,6 +734,9 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch268 -p0 %patch269 -p0 %patch270 -p0 +%patch271 -p0 +%patch272 -p0 +%patch273 -p0 # install spell files @@ -1135,6 +1141,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Wed Mar 12 2008 Karsten Hopp 7.1.273-1 +- update to patchlevel 273, this fixes #436902 + * Tue Mar 11 2008 Karsten Hopp 7.1.270-1 - patchlevel 270 - don't write swapfile on most common locations for USB-sticks (#436752) From d1dd9e7da6bc2d8f0e7f85f96ad217b1da4c2961 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 17 Mar 2008 16:49:58 +0000 Subject: [PATCH 44/71] - patchlevel 274 --- 7.1.274 | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 7.1.274 diff --git a/7.1.274 b/7.1.274 new file mode 100644 index 00000000..5bcb4ab9 --- /dev/null +++ b/7.1.274 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.274 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.274 (after 7.1.272) +Problem: Compiler warning for optimized build. +Solution: Init win to NULL. +Files: src/buffer.c + + +*** ../vim-7.1.273/src/buffer.c Wed Mar 12 12:22:56 2008 +--- src/buffer.c Wed Mar 12 13:15:21 2008 +*************** +*** 5033,5039 **** + #if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS) + if (bt_quickfix(buf)) + { +! win_T *win; + tabpage_T *tp; + + /* +--- 5033,5039 ---- + #if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS) + if (bt_quickfix(buf)) + { +! win_T *win = NULL; + tabpage_T *tp; + + /* +*** ../vim-7.1.273/src/version.c Wed Mar 12 13:16:37 2008 +--- src/version.c Wed Mar 12 13:45:25 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 274, + /**/ + +-- +FIXME and XXX are two common keywords used to mark broken or incomplete code +not only since XXX as a sex reference would grab everbodys attention but +simply due to the fact that Vim would highlight these words. + -- Hendrik Scholz + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 567667dedf20e8b442e54251736f9ec2bd585b7e Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 17 Mar 2008 16:50:08 +0000 Subject: [PATCH 45/71] - patchlevel 275 --- 7.1.275 | 1541 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1541 insertions(+) create mode 100644 7.1.275 diff --git a/7.1.275 b/7.1.275 new file mode 100644 index 00000000..8ed7130d --- /dev/null +++ b/7.1.275 @@ -0,0 +1,1541 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.275 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.275 (extra) +Problem: Mac: ATSUI and 'antialias' don't work properly together. +Solution: Fix this and the input method. (Jjgod Jiang) +Files: src/vim.h, src/gui_mac.c + + +*** ../vim-7.1.274/src/vim.h Wed Feb 20 12:22:59 2008 +--- src/vim.h Wed Mar 12 13:18:58 2008 +*************** +*** 461,468 **** + /* + * Check input method control. + */ +! #if defined(FEAT_XIM) || \ +! (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) + # define USE_IM_CONTROL + #endif + +--- 461,469 ---- + /* + * Check input method control. + */ +! #if defined(FEAT_XIM) \ +! || (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) \ +! || defined(FEAT_GUI_MAC) + # define USE_IM_CONTROL + #endif + +*** ../vim-7.1.274/src/gui_mac.c Sat Sep 29 13:15:29 2007 +--- src/gui_mac.c Wed Mar 12 13:40:57 2008 +*************** +*** 59,65 **** +--- 59,91 ---- + + #ifdef MACOS_CONVERT + # define USE_CARBONKEYHANDLER ++ ++ static int im_is_active = FALSE; ++ #if 0 ++ static int im_start_row = 0; ++ static int im_start_col = 0; ++ #endif ++ ++ #define NR_ELEMS(x) (sizeof(x) / sizeof(x[0])) ++ ++ static TSMDocumentID gTSMDocument; ++ ++ static void im_on_window_switch(int active); + static EventHandlerUPP keyEventHandlerUPP = NULL; ++ static EventHandlerUPP winEventHandlerUPP = NULL; ++ ++ static pascal OSStatus gui_mac_handle_window_activate( ++ EventHandlerCallRef nextHandler, EventRef theEvent, void *data); ++ ++ static pascal OSStatus gui_mac_handle_text_input( ++ EventHandlerCallRef nextHandler, EventRef theEvent, void *data); ++ ++ static pascal OSStatus gui_mac_update_input_area( ++ EventHandlerCallRef nextHandler, EventRef theEvent); ++ ++ static pascal OSStatus gui_mac_unicode_key_event( ++ EventHandlerCallRef nextHandler, EventRef theEvent); ++ + #endif + + +*************** +*** 137,143 **** +--- 166,176 ---- + + #ifdef MACOS_CONVERT + # define USE_ATSUI_DRAWING ++ int p_macatsui_last; + ATSUStyle gFontStyle; ++ # ifdef FEAT_MBYTE ++ ATSUStyle gWideFontStyle; ++ # endif + Boolean gIsFontFallbackSet; + #endif + +*************** +*** 265,270 **** +--- 298,308 ---- + static WindowRef drawer = NULL; // TODO: put into gui.h + #endif + ++ #ifdef USE_ATSUI_DRAWING ++ static void gui_mac_set_font_attributes(GuiFont font); ++ static void gui_mac_dispose_atsui_style(void); ++ #endif ++ + /* + * ------------------------------------------------------------ + * Conversion Utility +*************** +*** 1935,1946 **** + /* Dim scrollbars */ + if (whichWindow == gui.VimWindow) + { +! ControlRef rootControl; +! GetRootControl(gui.VimWindow, &rootControl); +! if ((event->modifiers) & activeFlag) +! ActivateControl(rootControl); +! else +! DeactivateControl(rootControl); + } + + /* Activate */ +--- 1973,1984 ---- + /* Dim scrollbars */ + if (whichWindow == gui.VimWindow) + { +! ControlRef rootControl; +! GetRootControl(gui.VimWindow, &rootControl); +! if ((event->modifiers) & activeFlag) +! ActivateControl(rootControl); +! else +! DeactivateControl(rootControl); + } + + /* Activate */ +*************** +*** 1976,1990 **** + * Handle the key + */ + #ifdef USE_CARBONKEYHANDLER + +! static int dialog_busy = FALSE; /* TRUE when gui_mch_dialog() wants the keys */ + + # define INLINE_KEY_BUFFER_SIZE 80 + static pascal OSStatus +! gui_mac_doKeyEventCarbon( + EventHandlerCallRef nextHandler, +! EventRef theEvent, +! void *data) + { + /* Multibyte-friendly key event handler */ + OSStatus err = -1; +--- 2014,2100 ---- + * Handle the key + */ + #ifdef USE_CARBONKEYHANDLER ++ static pascal OSStatus ++ gui_mac_handle_window_activate( ++ EventHandlerCallRef nextHandler, ++ EventRef theEvent, ++ void *data) ++ { ++ UInt32 eventClass = GetEventClass(theEvent); ++ UInt32 eventKind = GetEventKind(theEvent); ++ ++ if (eventClass == kEventClassWindow) ++ { ++ switch (eventKind) ++ { ++ case kEventWindowActivated: ++ #if defined(USE_IM_CONTROL) ++ im_on_window_switch(TRUE); ++ #endif ++ return noErr; ++ ++ case kEventWindowDeactivated: ++ #if defined(USE_IM_CONTROL) ++ im_on_window_switch(FALSE); ++ #endif ++ return noErr; ++ } ++ } ++ ++ return eventNotHandledErr; ++ } ++ ++ static pascal OSStatus ++ gui_mac_handle_text_input( ++ EventHandlerCallRef nextHandler, ++ EventRef theEvent, ++ void *data) ++ { ++ UInt32 eventClass = GetEventClass(theEvent); ++ UInt32 eventKind = GetEventKind(theEvent); ++ ++ if (eventClass != kEventClassTextInput) ++ return eventNotHandledErr; + +! if ((kEventTextInputUpdateActiveInputArea != eventKind) && +! (kEventTextInputUnicodeForKeyEvent != eventKind) && +! (kEventTextInputOffsetToPos != eventKind) && +! (kEventTextInputPosToOffset != eventKind) && +! (kEventTextInputGetSelectedText != eventKind)) +! return eventNotHandledErr; +! +! switch (eventKind) +! { +! case kEventTextInputUpdateActiveInputArea: +! return gui_mac_update_input_area(nextHandler, theEvent); +! case kEventTextInputUnicodeForKeyEvent: +! return gui_mac_unicode_key_event(nextHandler, theEvent); +! +! case kEventTextInputOffsetToPos: +! case kEventTextInputPosToOffset: +! case kEventTextInputGetSelectedText: +! break; +! } +! +! return eventNotHandledErr; +! } +! +! static pascal +! OSStatus gui_mac_update_input_area( +! EventHandlerCallRef nextHandler, +! EventRef theEvent) +! { +! return eventNotHandledErr; +! } +! +! static int dialog_busy = FALSE; /* TRUE when gui_mch_dialog() wants the +! keys */ + + # define INLINE_KEY_BUFFER_SIZE 80 + static pascal OSStatus +! gui_mac_unicode_key_event( + EventHandlerCallRef nextHandler, +! EventRef theEvent) + { + /* Multibyte-friendly key event handler */ + OSStatus err = -1; +*************** +*** 2000,2006 **** + char_u *to = NULL; + Boolean isSpecial = FALSE; + int i; +! EventRef keyEvent; + + /* Mask the mouse (as per user setting) */ + if (p_mh) +--- 2110,2116 ---- + char_u *to = NULL; + Boolean isSpecial = FALSE; + int i; +! EventRef keyEvent; + + /* Mask the mouse (as per user setting) */ + if (p_mh) +*************** +*** 2008,2046 **** + + /* Don't use the keys when the dialog wants them. */ + if (dialog_busy) +! return eventNotHandledErr; + + if (noErr != GetEventParameter(theEvent, kEventParamTextInputSendText, +! typeUnicodeText, NULL, 0, &actualSize, NULL)) +! return eventNotHandledErr; + + text = (UniChar *)alloc(actualSize); + if (!text) +! return eventNotHandledErr; + + err = GetEventParameter(theEvent, kEventParamTextInputSendText, +! typeUnicodeText, NULL, actualSize, NULL, text); + require_noerr(err, done); + + err = GetEventParameter(theEvent, kEventParamTextInputSendKeyboardEvent, +! typeEventRef, NULL, sizeof(EventRef), NULL, &keyEvent); + require_noerr(err, done); + + err = GetEventParameter(keyEvent, kEventParamKeyModifiers, +! typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); + require_noerr(err, done); + + err = GetEventParameter(keyEvent, kEventParamKeyCode, +! typeUInt32, NULL, sizeof(UInt32), NULL, &key_sym); + require_noerr(err, done); + + err = GetEventParameter(keyEvent, kEventParamKeyMacCharCodes, +! typeChar, NULL, sizeof(char), NULL, &charcode); + require_noerr(err, done); + + #ifndef USE_CMD_KEY + if (modifiers & cmdKey) +! goto done; /* Let system handle Cmd+... */ + #endif + + key_char = charcode; +--- 2118,2156 ---- + + /* Don't use the keys when the dialog wants them. */ + if (dialog_busy) +! return eventNotHandledErr; + + if (noErr != GetEventParameter(theEvent, kEventParamTextInputSendText, +! typeUnicodeText, NULL, 0, &actualSize, NULL)) +! return eventNotHandledErr; + + text = (UniChar *)alloc(actualSize); + if (!text) +! return eventNotHandledErr; + + err = GetEventParameter(theEvent, kEventParamTextInputSendText, +! typeUnicodeText, NULL, actualSize, NULL, text); + require_noerr(err, done); + + err = GetEventParameter(theEvent, kEventParamTextInputSendKeyboardEvent, +! typeEventRef, NULL, sizeof(EventRef), NULL, &keyEvent); + require_noerr(err, done); + + err = GetEventParameter(keyEvent, kEventParamKeyModifiers, +! typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); + require_noerr(err, done); + + err = GetEventParameter(keyEvent, kEventParamKeyCode, +! typeUInt32, NULL, sizeof(UInt32), NULL, &key_sym); + require_noerr(err, done); + + err = GetEventParameter(keyEvent, kEventParamKeyMacCharCodes, +! typeChar, NULL, sizeof(char), NULL, &charcode); + require_noerr(err, done); + + #ifndef USE_CMD_KEY + if (modifiers & cmdKey) +! goto done; /* Let system handle Cmd+... */ + #endif + + key_char = charcode; +*************** +*** 2048,2131 **** + + /* Find the special key (eg., for cursor keys) */ + if (actualSize <= sizeof(UniChar) && +! ((text[0] < 0x20) || (text[0] == 0x7f))) + { +! for (i = 0; special_keys[i].key_sym != (KeySym)0; ++i) +! if (special_keys[i].key_sym == key_sym) +! { +! key_char = TO_SPECIAL(special_keys[i].vim_code0, +! special_keys[i].vim_code1); +! key_char = simplify_key(key_char, +! (int *)&vimModifiers); +! isSpecial = TRUE; +! break; +! } + } + + /* Intercept CMD-. and CTRL-c */ + if (((modifiers & controlKey) && key_char == 'c') || +! ((modifiers & cmdKey) && key_char == '.')) +! got_int = TRUE; + + if (!isSpecial) + { +! /* remove SHIFT for keys that are already shifted, e.g., +! * '(' and '*' */ +! if (key_char < 0x100 && !isalpha(key_char) && isprint(key_char)) +! vimModifiers &= ~MOD_MASK_SHIFT; +! +! /* remove CTRL from keys that already have it */ +! if (key_char < 0x20) +! vimModifiers &= ~MOD_MASK_CTRL; +! +! /* don't process unicode characters here */ +! if (!IS_SPECIAL(key_char)) +! { +! /* Following code to simplify and consolidate vimModifiers +! * taken liberally from gui_w48.c */ +! key_char = simplify_key(key_char, (int *)&vimModifiers); +! +! /* Interpret META, include SHIFT, etc. */ +! key_char = extract_modifiers(key_char, (int *)&vimModifiers); +! if (key_char == CSI) +! key_char = K_CSI; +! +! if (IS_SPECIAL(key_char)) +! isSpecial = TRUE; +! } + } + + if (vimModifiers) + { +! result[len++] = CSI; +! result[len++] = KS_MODIFIER; +! result[len++] = vimModifiers; + } + + if (isSpecial && IS_SPECIAL(key_char)) + { +! result[len++] = CSI; +! result[len++] = K_SECOND(key_char); +! result[len++] = K_THIRD(key_char); + } + else + { +! encLen = actualSize; +! to = mac_utf16_to_enc(text, actualSize, &encLen); +! if (to) +! { +! /* This is basically add_to_input_buf_csi() */ +! for (i = 0; i < encLen && len < (INLINE_KEY_BUFFER_SIZE-1); ++i) +! { +! result[len++] = to[i]; +! if (to[i] == CSI) +! { +! result[len++] = KS_EXTRA; +! result[len++] = (int)KE_CSI; +! } +! } +! vim_free(to); +! } + } + + add_to_input_buf(result, len); +--- 2158,2241 ---- + + /* Find the special key (eg., for cursor keys) */ + if (actualSize <= sizeof(UniChar) && +! ((text[0] < 0x20) || (text[0] == 0x7f))) + { +! for (i = 0; special_keys[i].key_sym != (KeySym)0; ++i) +! if (special_keys[i].key_sym == key_sym) +! { +! key_char = TO_SPECIAL(special_keys[i].vim_code0, +! special_keys[i].vim_code1); +! key_char = simplify_key(key_char, +! (int *)&vimModifiers); +! isSpecial = TRUE; +! break; +! } + } + + /* Intercept CMD-. and CTRL-c */ + if (((modifiers & controlKey) && key_char == 'c') || +! ((modifiers & cmdKey) && key_char == '.')) +! got_int = TRUE; + + if (!isSpecial) + { +! /* remove SHIFT for keys that are already shifted, e.g., +! * '(' and '*' */ +! if (key_char < 0x100 && !isalpha(key_char) && isprint(key_char)) +! vimModifiers &= ~MOD_MASK_SHIFT; +! +! /* remove CTRL from keys that already have it */ +! if (key_char < 0x20) +! vimModifiers &= ~MOD_MASK_CTRL; +! +! /* don't process unicode characters here */ +! if (!IS_SPECIAL(key_char)) +! { +! /* Following code to simplify and consolidate vimModifiers +! * taken liberally from gui_w48.c */ +! key_char = simplify_key(key_char, (int *)&vimModifiers); +! +! /* Interpret META, include SHIFT, etc. */ +! key_char = extract_modifiers(key_char, (int *)&vimModifiers); +! if (key_char == CSI) +! key_char = K_CSI; +! +! if (IS_SPECIAL(key_char)) +! isSpecial = TRUE; +! } + } + + if (vimModifiers) + { +! result[len++] = CSI; +! result[len++] = KS_MODIFIER; +! result[len++] = vimModifiers; + } + + if (isSpecial && IS_SPECIAL(key_char)) + { +! result[len++] = CSI; +! result[len++] = K_SECOND(key_char); +! result[len++] = K_THIRD(key_char); + } + else + { +! encLen = actualSize; +! to = mac_utf16_to_enc(text, actualSize, &encLen); +! if (to) +! { +! /* This is basically add_to_input_buf_csi() */ +! for (i = 0; i < encLen && len < (INLINE_KEY_BUFFER_SIZE-1); ++i) +! { +! result[len++] = to[i]; +! if (to[i] == CSI) +! { +! result[len++] = KS_EXTRA; +! result[len++] = (int)KE_CSI; +! } +! } +! vim_free(to); +! } + } + + add_to_input_buf(result, len); +*************** +*** 2135,2144 **** + vim_free(text); + if (err == noErr) + { +! /* Fake event to wake up WNE (required to get +! * key repeat working */ +! PostEvent(keyUp, 0); +! return noErr; + } + + return eventNotHandledErr; +--- 2245,2254 ---- + vim_free(text); + if (err == noErr) + { +! /* Fake event to wake up WNE (required to get +! * key repeat working */ +! PostEvent(keyUp, 0); +! return noErr; + } + + return eventNotHandledErr; +*************** +*** 2334,2340 **** + /* prevent that the vim window size changes if it's activated by a + click into the tab pane */ + if (whichWindow == drawer) +! return; + #endif + + switch (thePart) +--- 2444,2450 ---- + /* prevent that the vim window size changes if it's activated by a + click into the tab pane */ + if (whichWindow == drawer) +! return; + #endif + + switch (thePart) +*************** +*** 2569,2579 **** + if (IsShowContextualMenuClick(event)) + { + # if 0 +! gui_mac_handle_contextual_menu(event); + # else +! gui_mac_doMouseDownEvent(event); + # endif +! return; + } + + /* Handle normal event */ +--- 2679,2689 ---- + if (IsShowContextualMenuClick(event)) + { + # if 0 +! gui_mac_handle_contextual_menu(event); + # else +! gui_mac_doMouseDownEvent(event); + # endif +! return; + } + + /* Handle normal event */ +*************** +*** 2832,2838 **** + # else + /* OSErr GetApplicationBundleFSSpec(FSSpecPtr theFSSpecPtr) + * of TN2015 +- * This technic remove the ../Contents/MacOS/etc part + */ + (void)GetCurrentProcess(&psn); + /* if (err != noErr) return err; */ +--- 2942,2947 ---- +*************** +*** 2933,2942 **** + /* TODO: Move most of this stuff toward gui_mch_init */ + Rect windRect; + MenuHandle pomme; +- EventTypeSpec eventTypeSpec; + EventHandlerRef mouseWheelHandlerRef; + #ifdef USE_CARBONKEYHANDLER +! EventHandlerRef keyEventHandlerRef; + #endif + ControlRef rootControl; + +--- 3042,3050 ---- + /* TODO: Move most of this stuff toward gui_mch_init */ + Rect windRect; + MenuHandle pomme; + EventHandlerRef mouseWheelHandlerRef; + #ifdef USE_CARBONKEYHANDLER +! EventTypeSpec eventTypeSpec; + #endif + ControlRef rootControl; + +*************** +*** 3042,3057 **** + } + + #ifdef USE_CARBONKEYHANDLER +! eventTypeSpec.eventClass = kEventClassTextInput; +! eventTypeSpec.eventKind = kEventUnicodeForKeyEvent; +! keyEventHandlerUPP = NewEventHandlerUPP(gui_mac_doKeyEventCarbon); +! if (noErr != InstallApplicationEventHandler(keyEventHandlerUPP, 1, +! &eventTypeSpec, NULL, &keyEventHandlerRef)) + { +- keyEventHandlerRef = NULL; + DisposeEventHandlerUPP(keyEventHandlerUPP); + keyEventHandlerUPP = NULL; + } + #endif + + /* +--- 3150,3196 ---- + } + + #ifdef USE_CARBONKEYHANDLER +! InterfaceTypeList supportedServices = { kUnicodeDocument }; +! NewTSMDocument(1, supportedServices, &gTSMDocument, 0); +! +! /* We don't support inline input yet, use input window by default */ +! UseInputWindow(gTSMDocument, TRUE); +! +! /* Should we activate the document by default? */ +! // ActivateTSMDocument(gTSMDocument); +! +! EventTypeSpec textEventTypes[] = { +! { kEventClassTextInput, kEventTextInputUpdateActiveInputArea }, +! { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent }, +! { kEventClassTextInput, kEventTextInputPosToOffset }, +! { kEventClassTextInput, kEventTextInputOffsetToPos }, +! }; +! +! keyEventHandlerUPP = NewEventHandlerUPP(gui_mac_handle_text_input); +! if (noErr != InstallApplicationEventHandler(keyEventHandlerUPP, +! NR_ELEMS(textEventTypes), +! textEventTypes, NULL, NULL)) + { + DisposeEventHandlerUPP(keyEventHandlerUPP); + keyEventHandlerUPP = NULL; + } ++ ++ EventTypeSpec windowEventTypes[] = { ++ { kEventClassWindow, kEventWindowActivated }, ++ { kEventClassWindow, kEventWindowDeactivated }, ++ }; ++ ++ /* Install window event handler to support TSMDocument activate and ++ * deactivate */ ++ winEventHandlerUPP = NewEventHandlerUPP(gui_mac_handle_window_activate); ++ if (noErr != InstallWindowEventHandler(gui.VimWindow, ++ winEventHandlerUPP, ++ NR_ELEMS(windowEventTypes), ++ windowEventTypes, NULL, NULL)) ++ { ++ DisposeEventHandlerUPP(winEventHandlerUPP); ++ winEventHandlerUPP = NULL; ++ } + #endif + + /* +*************** +*** 3107,3112 **** +--- 3246,3264 ---- + return OK; + } + ++ #ifdef USE_ATSUI_DRAWING ++ static void ++ gui_mac_dispose_atsui_style(void) ++ { ++ if (p_macatsui && gFontStyle) ++ ATSUDisposeStyle(gFontStyle); ++ #ifdef FEAT_MBYTE ++ if (p_macatsui && gWideFontStyle) ++ ATSUDisposeStyle(gWideFontStyle); ++ #endif ++ } ++ #endif ++ + void + gui_mch_exit(int rc) + { +*************** +*** 3122,3129 **** + DisposeEventHandlerUPP(mouseWheelHandlerUPP); + + #ifdef USE_ATSUI_DRAWING +! if (p_macatsui && gFontStyle) +! ATSUDisposeStyle(gFontStyle); + #endif + + /* Exit to shell? */ +--- 3274,3286 ---- + DisposeEventHandlerUPP(mouseWheelHandlerUPP); + + #ifdef USE_ATSUI_DRAWING +! gui_mac_dispose_atsui_style(); +! #endif +! +! #ifdef USE_CARBONKEYHANDLER +! FixTSMDocument(gTSMDocument); +! DeactivateTSMDocument(gTSMDocument); +! DeleteTSMDocument(gTSMDocument); + #endif + + /* Exit to shell? */ +*************** +*** 3263,3268 **** +--- 3420,3445 ---- + return selected_font; + } + ++ #ifdef USE_ATSUI_DRAWING ++ static void ++ gui_mac_create_atsui_style(void) ++ { ++ if (p_macatsui && gFontStyle == NULL) ++ { ++ if (ATSUCreateStyle(&gFontStyle) != noErr) ++ gFontStyle = NULL; ++ } ++ #ifdef FEAT_MBYTE ++ if (p_macatsui && gWideFontStyle == NULL) ++ { ++ if (ATSUCreateStyle(&gWideFontStyle) != noErr) ++ gWideFontStyle = NULL; ++ } ++ #endif ++ ++ p_macatsui_last = p_macatsui; ++ } ++ #endif + + /* + * Initialise vim to use the font with the given name. Return FAIL if the font +*************** +*** 3280,3290 **** + char_u used_font_name[512]; + + #ifdef USE_ATSUI_DRAWING +! if (p_macatsui && gFontStyle == NULL) +! { +! if (ATSUCreateStyle(&gFontStyle) != noErr) +! gFontStyle = NULL; +! } + #endif + + if (font_name == NULL) +--- 3457,3463 ---- + char_u used_font_name[512]; + + #ifdef USE_ATSUI_DRAWING +! gui_mac_create_atsui_style(); + #endif + + if (font_name == NULL) +*************** +*** 3348,3396 **** + gui.char_height = font_info.ascent + font_info.descent + p_linespace; + + #ifdef USE_ATSUI_DRAWING +- ATSUFontID fontID; +- Fixed fontSize; +- ATSStyleRenderingOptions fontOptions; +- + if (p_macatsui && gFontStyle) +! { +! fontID = font & 0xFFFF; +! fontSize = Long2Fix(font >> 16); +! +! /* No antialiasing by default (do not attempt to touch antialising +! * options on pre-Jaguar) */ +! fontOptions = +! (gMacSystemVersion >= 0x1020) ? +! kATSStyleNoAntiAliasing : +! kATSStyleNoOptions; +! +! ATSUAttributeTag attribTags[] = +! { +! kATSUFontTag, kATSUSizeTag, kATSUStyleRenderingOptionsTag, +! kATSUMaxATSUITagValue+1 +! }; +! ByteCount attribSizes[] = +! { +! sizeof(ATSUFontID), sizeof(Fixed), +! sizeof(ATSStyleRenderingOptions), sizeof font +! }; +! ATSUAttributeValuePtr attribValues[] = +! { +! &fontID, &fontSize, &fontOptions, &font +! }; +! +! /* Convert font id to ATSUFontID */ +! if (FMGetFontFromFontFamilyInstance(fontID, 0, &fontID, NULL) == noErr) +! { +! if (ATSUSetAttributes(gFontStyle, +! (sizeof attribTags)/sizeof(ATSUAttributeTag), +! attribTags, attribSizes, attribValues) != noErr) +! { +! ATSUDisposeStyle(gFontStyle); +! gFontStyle = NULL; +! } +! } +! } + #endif + + return OK; +--- 3521,3528 ---- + gui.char_height = font_info.ascent + font_info.descent + p_linespace; + + #ifdef USE_ATSUI_DRAWING + if (p_macatsui && gFontStyle) +! gui_mac_set_font_attributes(font); + #endif + + return OK; +*************** +*** 3447,3452 **** +--- 3579,3646 ---- + } + #endif + ++ #ifdef USE_ATSUI_DRAWING ++ static void ++ gui_mac_set_font_attributes(GuiFont font) ++ { ++ ATSUFontID fontID; ++ Fixed fontSize; ++ Fixed fontWidth; ++ ++ fontID = font & 0xFFFF; ++ fontSize = Long2Fix(font >> 16); ++ fontWidth = Long2Fix(gui.char_width); ++ ++ ATSUAttributeTag attribTags[] = ++ { ++ kATSUFontTag, kATSUSizeTag, kATSUImposeWidthTag, ++ kATSUMaxATSUITagValue + 1 ++ }; ++ ++ ByteCount attribSizes[] = ++ { ++ sizeof(ATSUFontID), sizeof(Fixed), sizeof(fontWidth), ++ sizeof(font) ++ }; ++ ++ ATSUAttributeValuePtr attribValues[] = ++ { ++ &fontID, &fontSize, &fontWidth, &font ++ }; ++ ++ if (FMGetFontFromFontFamilyInstance(fontID, 0, &fontID, NULL) == noErr) ++ { ++ if (ATSUSetAttributes(gFontStyle, ++ (sizeof attribTags) / sizeof(ATSUAttributeTag), ++ attribTags, attribSizes, attribValues) != noErr) ++ { ++ # ifndef NDEBUG ++ fprintf(stderr, "couldn't set font style\n"); ++ # endif ++ ATSUDisposeStyle(gFontStyle); ++ gFontStyle = NULL; ++ } ++ ++ #ifdef FEAT_MBYTE ++ if (has_mbyte) ++ { ++ /* FIXME: we should use a more mbyte sensitive way to support ++ * wide font drawing */ ++ fontWidth = Long2Fix(gui.char_width * 2); ++ ++ if (ATSUSetAttributes(gWideFontStyle, ++ (sizeof attribTags) / sizeof(ATSUAttributeTag), ++ attribTags, attribSizes, attribValues) != noErr) ++ { ++ ATSUDisposeStyle(gWideFontStyle); ++ gWideFontStyle = NULL; ++ } ++ } ++ #endif ++ } ++ } ++ #endif ++ + /* + * Set the current text font. + */ +*************** +*** 3456,3518 **** + #ifdef USE_ATSUI_DRAWING + GuiFont currFont; + ByteCount actualFontByteCount; +- ATSUFontID fontID; +- Fixed fontSize; +- ATSStyleRenderingOptions fontOptions; + + if (p_macatsui && gFontStyle) + { + /* Avoid setting same font again */ +! if (ATSUGetAttribute(gFontStyle, kATSUMaxATSUITagValue+1, sizeof font, +! &currFont, &actualFontByteCount) == noErr && +! actualFontByteCount == (sizeof font)) + { + if (currFont == font) + return; + } + +! fontID = font & 0xFFFF; +! fontSize = Long2Fix(font >> 16); +! /* Respect p_antialias setting only for wide font. +! * The reason for doing this at the moment is a bit complicated, +! * but it's mainly because a) latin (non-wide) aliased fonts +! * look bad in OS X 10.3.x and below (due to a bug in ATS), and +! * b) wide multibyte input does not suffer from that problem. */ +! /*fontOptions = +! (p_antialias && (font == gui.wide_font)) ? +! kATSStyleNoOptions : kATSStyleNoAntiAliasing; +! */ +! /*fontOptions = kATSStyleAntiAliasing;*/ +! +! ATSUAttributeTag attribTags[] = +! { +! kATSUFontTag, kATSUSizeTag, kATSUStyleRenderingOptionsTag, +! kATSUMaxATSUITagValue+1 +! }; +! ByteCount attribSizes[] = +! { +! sizeof(ATSUFontID), sizeof(Fixed), +! sizeof(ATSStyleRenderingOptions), sizeof font +! }; +! ATSUAttributeValuePtr attribValues[] = +! { +! &fontID, &fontSize, &fontOptions, &font +! }; +! +! if (FMGetFontFromFontFamilyInstance(fontID, 0, &fontID, NULL) == noErr) +! { +! if (ATSUSetAttributes(gFontStyle, +! (sizeof attribTags)/sizeof(ATSUAttributeTag), +! attribTags, attribSizes, attribValues) != noErr) +! { +! # ifndef NDEBUG +! fprintf(stderr, "couldn't set font style\n"); +! # endif +! ATSUDisposeStyle(gFontStyle); +! gFontStyle = NULL; +! } +! } +! + } + + if (p_macatsui && !gIsFontFallbackSet) +--- 3650,3668 ---- + #ifdef USE_ATSUI_DRAWING + GuiFont currFont; + ByteCount actualFontByteCount; + + if (p_macatsui && gFontStyle) + { + /* Avoid setting same font again */ +! if (ATSUGetAttribute(gFontStyle, kATSUMaxATSUITagValue + 1, +! sizeof(font), &currFont, &actualFontByteCount) == noErr +! && actualFontByteCount == (sizeof font)) + { + if (currFont == font) + return; + } + +! gui_mac_set_font_attributes(font); + } + + if (p_macatsui && !gIsFontFallbackSet) +*************** +*** 3536,3542 **** + &fallbackFonts, + NULL) == noErr) + { +! ATSUSetFontFallbacks((sizeof fallbackFonts)/sizeof(ATSUFontID), &fallbackFonts, kATSUSequentialFallbacksPreferred); + } + /* + ATSUAttributeValuePtr fallbackValues[] = { }; +--- 3686,3694 ---- + &fallbackFonts, + NULL) == noErr) + { +! ATSUSetFontFallbacks((sizeof fallbackFonts)/sizeof(ATSUFontID), +! &fallbackFonts, +! kATSUSequentialFallbacksPreferred); + } + /* + ATSUAttributeValuePtr fallbackValues[] = { }; +*************** +*** 3921,3927 **** + + /* - ATSUI automatically antialiases text (Someone) + * - for some reason it does not work... (Jussi) */ +! + /* + * When antialiasing we're using srcOr mode, we have to clear the block + * before drawing the text. +--- 4073,4082 ---- + + /* - ATSUI automatically antialiases text (Someone) + * - for some reason it does not work... (Jussi) */ +! #ifdef MAC_ATSUI_DEBUG +! fprintf(stderr, "row = %d, col = %d, len = %d: '%c'\n", +! row, col, len, len == 1 ? s[0] : ' '); +! #endif + /* + * When antialiasing we're using srcOr mode, we have to clear the block + * before drawing the text. +*************** +*** 3956,3990 **** + } + + { +- /* Use old-style, non-antialiased QuickDraw text rendering. */ + TextMode(srcCopy); + TextFace(normal); + +! /* SelectFont(hdc, gui.currFont); */ +! + if (flags & DRAW_TRANSP) + { + TextMode(srcOr); + } + + MoveTo(TEXT_X(col), TEXT_Y(row)); +- ATSUTextLayout textLayout; + +! if (ATSUCreateTextLayoutWithTextPtr(tofree, +! kATSUFromTextBeginning, kATSUToTextEnd, +! utf16_len, +! (gFontStyle ? 1 : 0), &utf16_len, +! (gFontStyle ? &gFontStyle : NULL), +! &textLayout) == noErr) + { +! ATSUSetTransientFontMatching(textLayout, TRUE); + +! ATSUDrawText(textLayout, +! kATSUFromTextBeginning, kATSUToTextEnd, +! kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc); + + ATSUDisposeTextLayout(textLayout); + } + } + + if (flags & DRAW_UNDERC) +--- 4111,4232 ---- + } + + { + TextMode(srcCopy); + TextFace(normal); + +! /* SelectFont(hdc, gui.currFont); */ + if (flags & DRAW_TRANSP) + { + TextMode(srcOr); + } + + MoveTo(TEXT_X(col), TEXT_Y(row)); + +! if (gFontStyle && flags & DRAW_BOLD) + { +! Boolean attValue = true; +! ATSUAttributeTag attribTags[] = { kATSUQDBoldfaceTag }; +! ByteCount attribSizes[] = { sizeof(Boolean) }; +! ATSUAttributeValuePtr attribValues[] = { &attValue }; + +! ATSUSetAttributes(gFontStyle, 1, attribTags, attribSizes, attribValues); +! } +! +! #ifdef FEAT_MBYTE +! if (has_mbyte) +! { +! int n, width_in_cell, last_width_in_cell; +! UniCharArrayOffset offset = 0; +! UniCharCount yet_to_draw = 0; +! ATSUTextLayout textLayout; +! ATSUStyle textStyle; +! +! last_width_in_cell = 1; +! ATSUCreateTextLayout(&textLayout); +! ATSUSetTextPointerLocation(textLayout, tofree, +! kATSUFromTextBeginning, +! kATSUToTextEnd, utf16_len); +! /* +! ATSUSetRunStyle(textLayout, gFontStyle, +! kATSUFromTextBeginning, kATSUToTextEnd); */ +! +! /* Compute the length in display cells. */ +! for (n = 0; n < len; n += MB_BYTE2LEN(s[n])) +! { +! width_in_cell = (*mb_ptr2cells)(s + n); +! +! /* probably we are switching from single byte character +! * to multibyte characters (which requires more than one +! * cell to draw) */ +! if (width_in_cell != last_width_in_cell) +! { +! #ifdef MAC_ATSUI_DEBUG +! fprintf(stderr, "\tn = %2d, (%d-%d), offset = %d, yet_to_draw = %d\n", +! n, last_width_in_cell, width_in_cell, offset, yet_to_draw); +! #endif +! textStyle = last_width_in_cell > 1 ? gWideFontStyle +! : gFontStyle; +! +! ATSUSetRunStyle(textLayout, textStyle, offset, yet_to_draw); +! offset += yet_to_draw; +! yet_to_draw = 0; +! last_width_in_cell = width_in_cell; +! } + ++ yet_to_draw++; ++ } ++ ++ if (yet_to_draw) ++ { ++ #ifdef MAC_ATSUI_DEBUG ++ fprintf(stderr, "\tn = %2d, (%d-%d), offset = %d, yet_to_draw = %d\n", ++ n, last_width_in_cell, width_in_cell, offset, yet_to_draw); ++ #endif ++ /* finish the rest style */ ++ textStyle = width_in_cell > 1 ? gWideFontStyle : gFontStyle; ++ ATSUSetRunStyle(textLayout, textStyle, offset, kATSUToTextEnd); ++ } ++ ++ ATSUSetTransientFontMatching(textLayout, TRUE); ++ ATSUDrawText(textLayout, ++ kATSUFromTextBeginning, kATSUToTextEnd, ++ kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc); + ATSUDisposeTextLayout(textLayout); + } ++ else ++ #endif ++ { ++ ATSUTextLayout textLayout; ++ ++ if (ATSUCreateTextLayoutWithTextPtr(tofree, ++ kATSUFromTextBeginning, kATSUToTextEnd, ++ utf16_len, ++ (gFontStyle ? 1 : 0), &utf16_len, ++ (gFontStyle ? &gFontStyle : NULL), ++ &textLayout) == noErr) ++ { ++ ATSUSetTransientFontMatching(textLayout, TRUE); ++ ++ ATSUDrawText(textLayout, ++ kATSUFromTextBeginning, kATSUToTextEnd, ++ kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc); ++ ++ ATSUDisposeTextLayout(textLayout); ++ } ++ } ++ ++ /* drawing is done, now reset bold to normal */ ++ if (gFontStyle && flags & DRAW_BOLD) ++ { ++ Boolean attValue = false; ++ ++ ATSUAttributeTag attribTags[] = { kATSUQDBoldfaceTag }; ++ ByteCount attribSizes[] = { sizeof(Boolean) }; ++ ATSUAttributeValuePtr attribValues[] = { &attValue }; ++ ++ ATSUSetAttributes(gFontStyle, 1, attribTags, attribSizes, ++ attribValues); ++ } + } + + if (flags & DRAW_UNDERC) +*************** +*** 3998,4003 **** +--- 4240,4252 ---- + gui_mch_draw_string(int row, int col, char_u *s, int len, int flags) + { + #if defined(USE_ATSUI_DRAWING) ++ if (p_macatsui == 0 && p_macatsui_last != 0) ++ /* switch from macatsui to nomacatsui */ ++ gui_mac_dispose_atsui_style(); ++ else if (p_macatsui != 0 && p_macatsui_last == 0) ++ /* switch from nomacatsui to macatsui */ ++ gui_mac_create_atsui_style(); ++ + if (p_macatsui) + draw_string_ATSUI(row, col, s, len, flags); + else +*************** +*** 4228,4239 **** + */ + /* TODO: reduce wtime accordinly??? */ + if (wtime > -1) +! sleeppyTick = 60*wtime/1000; + else + sleeppyTick = 32767; + if (WaitNextEventWrp(mask, &event, sleeppyTick, dragRgn)) + { +! gui_mac_handle_event(&event); + if (input_available()) + { + allow_scrollbar = FALSE; +--- 4477,4489 ---- + */ + /* TODO: reduce wtime accordinly??? */ + if (wtime > -1) +! sleeppyTick = 60 * wtime / 1000; + else + sleeppyTick = 32767; ++ + if (WaitNextEventWrp(mask, &event, sleeppyTick, dragRgn)) + { +! gui_mac_handle_event(&event); + if (input_available()) + { + allow_scrollbar = FALSE; +*************** +*** 6031,6037 **** + #endif + } + +! #if defined(USE_IM_CONTROL) || defined(PROTO) + /* + * Input Method Control functions. + */ +--- 6346,6352 ---- + #endif + } + +! #if (defined(USE_IM_CONTROL) || defined(PROTO)) && defined(USE_CARBONKEYHANDLER) + /* + * Input Method Control functions. + */ +*************** +*** 6042,6048 **** +--- 6357,6427 ---- + void + im_set_position(int row, int col) + { ++ #if 0 + /* TODO: Implement me! */ ++ im_start_row = row; ++ im_start_col = col; ++ #endif ++ } ++ ++ static ScriptLanguageRecord gTSLWindow; ++ static ScriptLanguageRecord gTSLInsert; ++ static ScriptLanguageRecord gTSLDefault = { 0, 0 }; ++ ++ static Component gTSCWindow; ++ static Component gTSCInsert; ++ static Component gTSCDefault; ++ ++ static int im_initialized = 0; ++ ++ static void ++ im_on_window_switch(int active) ++ { ++ ScriptLanguageRecord *slptr = NULL; ++ OSStatus err; ++ ++ if (! gui.in_use) ++ return; ++ ++ if (im_initialized == 0) ++ { ++ im_initialized = 1; ++ ++ /* save default TSM component (should be U.S.) to default */ ++ GetDefaultInputMethodOfClass(&gTSCDefault, &gTSLDefault, ++ kKeyboardInputMethodClass); ++ } ++ ++ if (active == TRUE) ++ { ++ im_is_active = TRUE; ++ ActivateTSMDocument(gTSMDocument); ++ slptr = &gTSLWindow; ++ ++ if (slptr) ++ { ++ err = SetDefaultInputMethodOfClass(gTSCWindow, slptr, ++ kKeyboardInputMethodClass); ++ if (err == noErr) ++ err = SetTextServiceLanguage(slptr); ++ ++ if (err == noErr) ++ KeyScript(slptr->fScript | smKeyForceKeyScriptMask); ++ } ++ } ++ else ++ { ++ err = GetTextServiceLanguage(&gTSLWindow); ++ if (err == noErr) ++ slptr = &gTSLWindow; ++ ++ if (slptr) ++ GetDefaultInputMethodOfClass(&gTSCWindow, slptr, ++ kKeyboardInputMethodClass); ++ ++ im_is_active = FALSE; ++ DeactivateTSMDocument(gTSMDocument); ++ } + } + + /* +*************** +*** 6051,6057 **** + void + im_set_active(int active) + { +! KeyScript(active ? smKeySysScript : smKeyRoman); + } + + /* +--- 6430,6486 ---- + void + im_set_active(int active) + { +! ScriptLanguageRecord *slptr = NULL; +! OSStatus err; +! +! if (! gui.in_use) +! return; +! +! if (im_initialized == 0) +! { +! im_initialized = 1; +! +! /* save default TSM component (should be U.S.) to default */ +! GetDefaultInputMethodOfClass(&gTSCDefault, &gTSLDefault, +! kKeyboardInputMethodClass); +! } +! +! if (active == TRUE) +! { +! im_is_active = TRUE; +! ActivateTSMDocument(gTSMDocument); +! slptr = &gTSLInsert; +! +! if (slptr) +! { +! err = SetDefaultInputMethodOfClass(gTSCInsert, slptr, +! kKeyboardInputMethodClass); +! if (err == noErr) +! err = SetTextServiceLanguage(slptr); +! +! if (err == noErr) +! KeyScript(slptr->fScript | smKeyForceKeyScriptMask); +! } +! } +! else +! { +! err = GetTextServiceLanguage(&gTSLInsert); +! if (err == noErr) +! slptr = &gTSLInsert; +! +! if (slptr) +! GetDefaultInputMethodOfClass(&gTSCInsert, slptr, +! kKeyboardInputMethodClass); +! +! /* restore to default when switch to normal mode, so than we could +! * enter commands easier */ +! SetDefaultInputMethodOfClass(gTSCDefault, &gTSLDefault, +! kKeyboardInputMethodClass); +! SetTextServiceLanguage(&gTSLDefault); +! +! im_is_active = FALSE; +! DeactivateTSMDocument(gTSMDocument); +! } + } + + /* +*************** +*** 6060,6068 **** + int + im_get_status(void) + { +! SInt32 script = GetScriptManagerVariable(smKeyScript); +! return (script != smRoman +! && script == GetScriptManagerVariable(smSysScript)) ? 1 : 0; + } + + #endif /* defined(USE_IM_CONTROL) || defined(PROTO) */ +--- 6489,6498 ---- + int + im_get_status(void) + { +! if (! gui.in_use) +! return 0; +! +! return im_is_active; + } + + #endif /* defined(USE_IM_CONTROL) || defined(PROTO) */ +*************** +*** 6118,6124 **** + int numTabs = 0; + + for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) +! ++numTabs; + return numTabs; + } + +--- 6548,6554 ---- + int numTabs = 0; + + for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) +! ++numTabs; + return numTabs; + } + +*************** +*** 6126,6133 **** + static OSStatus + dbItemDataCallback(ControlRef browser, + DataBrowserItemID itemID, +! DataBrowserPropertyID property /* column id */, +! DataBrowserItemDataRef itemData, + Boolean changeValue) + { + OSStatus status = noErr; +--- 6556,6563 ---- + static OSStatus + dbItemDataCallback(ControlRef browser, + DataBrowserItemID itemID, +! DataBrowserPropertyID property /* column id */, +! DataBrowserItemDataRef itemData, + Boolean changeValue) + { + OSStatus status = noErr; +*************** +*** 6170,6178 **** + static void + dbGetContextualMenuCallback(ControlRef browser, + MenuRef *menu, +! UInt32 *helpType, + CFStringRef *helpItemString, +! AEDesc *selection) + { + // on mac os 9: kCMHelpItemNoHelp, but it's not the same + *helpType = kCMHelpItemRemoveHelp; // OS X only ;-) +--- 6600,6608 ---- + static void + dbGetContextualMenuCallback(ControlRef browser, + MenuRef *menu, +! UInt32 *helpType, + CFStringRef *helpItemString, +! AEDesc *selection) + { + // on mac os 9: kCMHelpItemNoHelp, but it's not the same + *helpType = kCMHelpItemRemoveHelp; // OS X only ;-) +*************** +*** 6395,6403 **** + gui_mch_show_tabline(int showit) + { + if (showit == 0) +! CloseDrawer(drawer, true); + else +! OpenDrawer(drawer, kWindowEdgeRight, true); + } + + /* +--- 6825,6833 ---- + gui_mch_show_tabline(int showit) + { + if (showit == 0) +! CloseDrawer(drawer, true); + else +! OpenDrawer(drawer, kWindowEdgeRight, true); + } + + /* +*************** +*** 6425,6435 **** + // adjust data browser + if (tabLabels != NULL) + { +! int i; + +! for (i = 0; i < tabLabelsSize; ++i) +! CFRelease(tabLabels[i]); +! free(tabLabels); + } + tabLabels = (CFStringRef *)malloc(numTabs * sizeof(CFStringRef)); + tabLabelsSize = numTabs; +--- 6855,6865 ---- + // adjust data browser + if (tabLabels != NULL) + { +! int i; + +! for (i = 0; i < tabLabelsSize; ++i) +! CFRelease(tabLabels[i]); +! free(tabLabels); + } + tabLabels = (CFStringRef *)malloc(numTabs * sizeof(CFStringRef)); + tabLabelsSize = numTabs; +*************** +*** 6438,6444 **** + { + if (tp == curtab) + curtabidx = nr; +! tabLabels[nr-1] = getTabLabel(tp); + } + + RemoveDataBrowserItems(dataBrowser, kDataBrowserNoItem, 0, NULL, +--- 6868,6874 ---- + { + if (tp == curtab) + curtabidx = nr; +! tabLabels[nr-1] = getTabLabel(tp); + } + + RemoveDataBrowserItems(dataBrowser, kDataBrowserNoItem, 0, NULL, +*** ../vim-7.1.274/src/version.c Wed Mar 12 13:45:34 2008 +--- src/version.c Wed Mar 12 14:31:37 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 275, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +115. You are late picking up your kid from school and try to explain + to the teacher you were stuck in Web traffic. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 925a60a1bc74b7972e36f46c88726ecf822dc2c1 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 17 Mar 2008 16:50:18 +0000 Subject: [PATCH 46/71] - patchlevel 276 --- 7.1.276 | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 7.1.276 diff --git a/7.1.276 b/7.1.276 new file mode 100644 index 00000000..5af780b0 --- /dev/null +++ b/7.1.276 @@ -0,0 +1,156 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.276 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.276 +Problem: "gw" uses 'formatexpr', even though the docs say it doesn't. +Solution: Don't use 'formatexpr' for "gw". +Files: src/vim.h, src/edit.c, src/ops.c, src/proto/ops.pro + + +*** ../vim-7.1.275/src/vim.h Wed Mar 12 14:38:51 2008 +--- src/vim.h Wed Mar 12 16:31:44 2008 +*************** +*** 949,954 **** +--- 952,958 ---- + #define INSCHAR_FORMAT 1 /* force formatting */ + #define INSCHAR_DO_COM 2 /* format comments */ + #define INSCHAR_CTRLV 4 /* char typed just after CTRL-V */ ++ #define INSCHAR_NO_FEX 8 /* don't use 'formatexpr' */ + + /* flags for open_line() */ + #define OPENLINE_DELSPACES 1 /* delete spaces after cursor */ +*** ../vim-7.1.275/src/edit.c Tue Jan 22 17:49:17 2008 +--- src/edit.c Wed Mar 12 16:35:44 2008 +*************** +*** 5491,5497 **** + #if defined(FEAT_EVAL) + int do_internal = TRUE; + +! if (*curbuf->b_p_fex != NUL) + { + do_internal = (fex_format(curwin->w_cursor.lnum, 1L, c) != 0); + /* It may be required to save for undo again, e.g. when setline() +--- 5491,5497 ---- + #if defined(FEAT_EVAL) + int do_internal = TRUE; + +! if (*curbuf->b_p_fex != NUL && (flags & INSCHAR_NO_FEX) == 0) + { + do_internal = (fex_format(curwin->w_cursor.lnum, 1L, c) != 0); + /* It may be required to save for undo again, e.g. when setline() +*************** +*** 6057,6063 **** + * be adjusted for the text formatting. + */ + saved_cursor = pos; +! format_lines((linenr_T)-1); + curwin->w_cursor = saved_cursor; + saved_cursor.lnum = 0; + +--- 6057,6063 ---- + * be adjusted for the text formatting. + */ + saved_cursor = pos; +! format_lines((linenr_T)-1, FALSE); + curwin->w_cursor = saved_cursor; + saved_cursor.lnum = 0; + +*** ../vim-7.1.275/src/ops.c Mon Feb 25 21:54:23 2008 +--- src/ops.c Wed Mar 12 16:37:29 2008 +*************** +*** 4380,4386 **** + if (keep_cursor) + saved_cursor = oap->cursor_start; + +! format_lines(oap->line_count); + + /* + * Leave the cursor at the first non-blank of the last formatted line. +--- 4380,4386 ---- + if (keep_cursor) + saved_cursor = oap->cursor_start; + +! format_lines(oap->line_count, keep_cursor); + + /* + * Leave the cursor at the first non-blank of the last formatted line. +*************** +*** 4495,4502 **** + * first line. + */ + void +! format_lines(line_count) + linenr_T line_count; + { + int max_len; + int is_not_par; /* current line not part of parag. */ +--- 4495,4503 ---- + * first line. + */ + void +! format_lines(line_count, avoid_fex) + linenr_T line_count; ++ int avoid_fex; /* don't use 'formatexpr' */ + { + int max_len; + int is_not_par; /* current line not part of parag. */ +*************** +*** 4666,4672 **** + #ifdef FEAT_COMMENTS + + (do_comments ? INSCHAR_DO_COM : 0) + #endif +! , second_indent); + State = old_State; + p_smd = smd_save; + second_indent = -1; +--- 4667,4673 ---- + #ifdef FEAT_COMMENTS + + (do_comments ? INSCHAR_DO_COM : 0) + #endif +! + (avoid_fex ? INSCHAR_NO_FEX : 0), second_indent); + State = old_State; + p_smd = smd_save; + second_indent = -1; +*** ../vim-7.1.275/src/proto/ops.pro Wed Jan 16 20:01:14 2008 +--- src/proto/ops.pro Wed Mar 12 16:38:39 2008 +*************** +*** 41,47 **** + void op_format __ARGS((oparg_T *oap, int keep_cursor)); + void op_formatexpr __ARGS((oparg_T *oap)); + int fex_format __ARGS((linenr_T lnum, long count, int c)); +! void format_lines __ARGS((linenr_T line_count)); + int paragraph_start __ARGS((linenr_T lnum)); + int do_addsub __ARGS((int command, linenr_T Prenum1)); + int read_viminfo_register __ARGS((vir_T *virp, int force)); +--- 41,47 ---- + void op_format __ARGS((oparg_T *oap, int keep_cursor)); + void op_formatexpr __ARGS((oparg_T *oap)); + int fex_format __ARGS((linenr_T lnum, long count, int c)); +! void format_lines __ARGS((linenr_T line_count, int avoid_fex)); + int paragraph_start __ARGS((linenr_T lnum)); + int do_addsub __ARGS((int command, linenr_T Prenum1)); + int read_viminfo_register __ARGS((vir_T *virp, int force)); +*** ../vim-7.1.275/src/version.c Wed Mar 12 14:38:51 2008 +--- src/version.c Wed Mar 12 17:23:43 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 276, + /**/ + +-- +An actual excerpt from a classified section of a city newspaper: +"Illiterate? Write today for free help!" + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 5bce1f03ccbd126a6a887ab517779c03c14aad22 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 17 Mar 2008 16:50:30 +0000 Subject: [PATCH 47/71] - patchlevel 277 --- 7.1.277 | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 7.1.277 diff --git a/7.1.277 b/7.1.277 new file mode 100644 index 00000000..bedc3131 --- /dev/null +++ b/7.1.277 @@ -0,0 +1,84 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.277 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.277 +Problem: Default for 'paragraphs' misses some items (Colin Watson) +Solution: Add TP, HP, Pp, Lp and It to 'paragraphs'. (James Vega) +Files: runtime/doc/options.txt, src/option.c + + +*** ../vim-7.1.276/runtime/doc/options.txt Sat Jan 19 15:55:51 2008 +--- runtime/doc/options.txt Wed Mar 12 17:34:32 2008 +*************** +*** 1,4 **** +! *options.txt* For Vim version 7.1. Last change: 2007 Aug 10 + + + VIM REFERENCE MANUAL by Bram Moolenaar +--- 1,4 ---- +! *options.txt* For Vim version 7.1. Last change: 2008 Feb 24 + + + VIM REFERENCE MANUAL by Bram Moolenaar +*************** +*** 4878,4884 **** + |autocmd-osfiletypes| + + *'paragraphs'* *'para'* +! 'paragraphs' 'para' string (default "IPLPPPQPP LIpplpipbp") + global + Specifies the nroff macros that separate paragraphs. These are pairs + of two letters (see |object-motions|). +--- 4901,4907 ---- + |autocmd-osfiletypes| + + *'paragraphs'* *'para'* +! 'paragraphs' 'para' string (default "IPLPPPQPP TPHPLIPpLpItpplpipbp") + global + Specifies the nroff macros that separate paragraphs. These are pairs + of two letters (see |object-motions|). +*** ../vim-7.1.276/src/option.c Wed Feb 13 18:35:23 2008 +--- src/option.c Wed Mar 12 17:34:32 2008 +*************** +*** 1839,1845 **** + }, + {"paragraphs", "para", P_STRING|P_VI_DEF, + (char_u *)&p_para, PV_NONE, +! {(char_u *)"IPLPPPQPP LIpplpipbp", (char_u *)0L}}, + {"paste", NULL, P_BOOL|P_VI_DEF|P_PRI_MKRC, + (char_u *)&p_paste, PV_NONE, + {(char_u *)FALSE, (char_u *)0L}}, +--- 1839,1846 ---- + }, + {"paragraphs", "para", P_STRING|P_VI_DEF, + (char_u *)&p_para, PV_NONE, +! {(char_u *)"IPLPPPQPP TPHPLIPpLpItpplpipbp", +! (char_u *)0L}}, + {"paste", NULL, P_BOOL|P_VI_DEF|P_PRI_MKRC, + (char_u *)&p_paste, PV_NONE, + {(char_u *)FALSE, (char_u *)0L}}, +*** ../vim-7.1.276/src/version.c Wed Mar 12 17:25:50 2008 +--- src/version.c Wed Mar 12 17:35:14 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 277, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +119. You are reading a book and look for the scroll bar to get to + the next page. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 449a162925d163782836ca13844eeef54583561d Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 17 Mar 2008 16:50:42 +0000 Subject: [PATCH 48/71] - patchlevel 278 --- 7.1.278 | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 7.1.278 diff --git a/7.1.278 b/7.1.278 new file mode 100644 index 00000000..d274ebbe --- /dev/null +++ b/7.1.278 @@ -0,0 +1,62 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.278 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.278 (extra, after 7.1.275) +Problem: Build failure when USE_CARBONKEYHANDLER is not defined. +Solution: Remove #ifdef. +Files: src/gui_mac.c + + +*** ../vim-7.1.277/src/gui_mac.c Wed Mar 12 14:38:51 2008 +--- src/gui_mac.c Wed Mar 12 21:40:54 2008 +*************** +*** 3037,3049 **** + gui_mch_init(void) + { + /* TODO: Move most of this stuff toward gui_mch_init */ +! Rect windRect; +! MenuHandle pomme; + EventHandlerRef mouseWheelHandlerRef; +- #ifdef USE_CARBONKEYHANDLER + EventTypeSpec eventTypeSpec; +! #endif +! ControlRef rootControl; + + if (Gestalt(gestaltSystemVersion, &gMacSystemVersion) != noErr) + gMacSystemVersion = 0x1000; /* TODO: Default to minimum sensible value */ +--- 3040,3050 ---- + gui_mch_init(void) + { + /* TODO: Move most of this stuff toward gui_mch_init */ +! Rect windRect; +! MenuHandle pomme; + EventHandlerRef mouseWheelHandlerRef; + EventTypeSpec eventTypeSpec; +! ControlRef rootControl; + + if (Gestalt(gestaltSystemVersion, &gMacSystemVersion) != noErr) + gMacSystemVersion = 0x1000; /* TODO: Default to minimum sensible value */ +*** ../vim-7.1.277/src/version.c Wed Mar 12 17:37:53 2008 +--- src/version.c Wed Mar 12 21:43:22 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 278, + /**/ + +-- +Would you care for a drink? I mean, if it were, like, +disabled and you had to look after it? + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 6aafe61de6e2a4f9910ab57cc861756afdf2a2e5 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 17 Mar 2008 16:50:51 +0000 Subject: [PATCH 49/71] - patchlevel 279 --- 7.1.279 | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 7.1.279 diff --git a/7.1.279 b/7.1.279 new file mode 100644 index 00000000..b44beaed --- /dev/null +++ b/7.1.279 @@ -0,0 +1,146 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.279 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.279 +Problem: When using cscope temporary files are left behind. +Solution: Send the quit command to cscope and give it two seconds to exit + nicely before killing it. (partly by Dominique Pelle) +Files: src/if_cscope.c + + +*** ../vim-7.1.278/src/if_cscope.c Fri Sep 14 19:56:18 2007 +--- src/if_cscope.c Sat Mar 15 12:38:12 2008 +*************** +*** 2096,2101 **** +--- 2096,2113 ---- + return CSCOPE_SUCCESS; + } + ++ #if defined(UNIX) && defined(SIGALRM) ++ /* ++ * Used to catch and ignore SIGALRM below. ++ */ ++ /* ARGSUSED */ ++ static RETSIGTYPE ++ sig_handler SIGDEFARG(sigarg) ++ { ++ /* do nothing */ ++ SIGRETURN; ++ } ++ #endif + + /* + * PRIVATE: cs_release_csp +*************** +*** 2108,2116 **** + int i; + int freefnpp; + { +- #if defined(UNIX) +- int pstat; +- #else + /* + * Trying to exit normally (not sure whether it is fit to UNIX cscope + */ +--- 2120,2125 ---- +*************** +*** 2119,2124 **** +--- 2128,2179 ---- + (void)fputs("q\n", csinfo[i].to_fp); + (void)fflush(csinfo[i].to_fp); + } ++ #if defined(UNIX) ++ { ++ int pstat; ++ pid_t pid; ++ ++ # if defined(HAVE_SIGACTION) ++ struct sigaction sa, old; ++ ++ /* Use sigaction() to limit the waiting time to two seconds. */ ++ sa.sa_handler = sig_handler; ++ sa.sa_flags = SA_NODEFER; ++ sigaction(SIGALRM, &sa, &old); ++ alarm(2); /* 2 sec timeout */ ++ ++ /* Block until cscope exits or until timer expires */ ++ pid = waitpid(csinfo[i].pid, &pstat, 0); ++ ++ /* cancel pending alarm if still there and restore signal */ ++ alarm(0); ++ sigaction(SIGALRM, &old, NULL); ++ # else ++ int waited; ++ ++ /* Can't use sigaction(), loop for two seconds. First yield the CPU ++ * to give cscope a chance to exit quickly. */ ++ sleep(0); ++ for (waited = 0; waited < 40; ++waited) ++ { ++ pid = waitpid(csinfo[i].pid, &pstat, WNOHANG); ++ if (pid != 0) ++ break; /* break unless the process is still running */ ++ mch_delay(50, FALSE); /* sleep 50 ms */ ++ } ++ # endif ++ /* ++ * If the cscope process is still running: kill it. ++ * Safety check: If the PID would be zero here, the entire X session ++ * would be killed. -1 and 1 are dangerous as well. ++ */ ++ if (pid < 0 && csinfo[i].pid > 1) ++ { ++ kill(csinfo[i].pid, SIGTERM); ++ (void)waitpid(csinfo[i].pid, &pstat, 0); ++ } ++ } ++ #else /* !UNIX */ + if (csinfo[i].hProc != NULL) + { + /* Give cscope a chance to exit normally */ +*************** +*** 2133,2150 **** + if (csinfo[i].to_fp != NULL) + (void)fclose(csinfo[i].to_fp); + +- /* +- * Safety check: If the PID would be zero here, the entire X session would +- * be killed. -1 and 1 are dangerous as well. +- */ +- #if defined(UNIX) +- if (csinfo[i].pid > 1) +- { +- kill(csinfo[i].pid, SIGTERM); +- (void)waitpid(csinfo[i].pid, &pstat, 0); +- } +- #endif +- + if (freefnpp) + { + vim_free(csinfo[i].fname); +--- 2188,2193 ---- +*** ../vim-7.1.278/src/version.c Wed Mar 12 21:47:31 2008 +--- src/version.c Sat Mar 15 12:38:58 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 279, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +130. You can't get out of your desk even if it's time to eat or time + to go to the bathroom. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From efd6edff1d412dced051a802b3d8fba8fff1dc20 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 17 Mar 2008 16:51:00 +0000 Subject: [PATCH 50/71] - patchlevel 280 --- 7.1.280 | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 7.1.280 diff --git a/7.1.280 b/7.1.280 new file mode 100644 index 00000000..c0993c42 --- /dev/null +++ b/7.1.280 @@ -0,0 +1,52 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.280 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.280 (after 7.1.275) +Problem: Mac: build problems when not using multibyte feature. (Nicholas + Stallard) +Solution: Don't define USE_IM_CONTROL when not using multibyte. +Files: src/vim.h + + +*** ../vim-7.1.279/src/vim.h Wed Mar 12 17:25:50 2008 +--- src/vim.h Thu Mar 13 23:39:21 2008 +*************** +*** 463,469 **** + */ + #if defined(FEAT_XIM) \ + || (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) \ +! || defined(FEAT_GUI_MAC) + # define USE_IM_CONTROL + #endif + +--- 466,472 ---- + */ + #if defined(FEAT_XIM) \ + || (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) \ +! || (defined(FEAT_GUI_MAC) && defined(FEAT_MBYTE)) + # define USE_IM_CONTROL + #endif + +*** ../vim-7.1.279/src/version.c Sat Mar 15 12:40:23 2008 +--- src/version.c Sat Mar 15 13:08:40 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 280, + /**/ + +-- +Why is it called "Windows"? "Gates" would be more appropriate... + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 57eed86f161c80cb6f9740e3d8f54d4a1cabfc55 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 17 Mar 2008 16:51:12 +0000 Subject: [PATCH 51/71] - patchlevel 281 --- 7.1.281 | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 7.1.281 diff --git a/7.1.281 b/7.1.281 new file mode 100644 index 00000000..2886273d --- /dev/null +++ b/7.1.281 @@ -0,0 +1,72 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.281 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.281 (after 7.1.279) +Problem: sa.sa_mask is not initialized. Cscope may not exit. +Solution: Use sigemptyset(). Use SIGKILL instead of SIGTERM. (Dominique + Pelle) +Files: src/if_cscope.c + + +*** ../vim-7.1.280/src/if_cscope.c Sat Mar 15 12:40:23 2008 +--- src/if_cscope.c Sun Mar 16 13:05:51 2008 +*************** +*** 2136,2142 **** + # if defined(HAVE_SIGACTION) + struct sigaction sa, old; + +! /* Use sigaction() to limit the waiting time to two seconds. */ + sa.sa_handler = sig_handler; + sa.sa_flags = SA_NODEFER; + sigaction(SIGALRM, &sa, &old); +--- 2136,2143 ---- + # if defined(HAVE_SIGACTION) + struct sigaction sa, old; + +! /* Use sigaction() to limit the waiting time to two seconds. */ +! sigemptyset(&sa.sa_mask); + sa.sa_handler = sig_handler; + sa.sa_flags = SA_NODEFER; + sigaction(SIGALRM, &sa, &old); +*************** +*** 2169,2175 **** + */ + if (pid < 0 && csinfo[i].pid > 1) + { +! kill(csinfo[i].pid, SIGTERM); + (void)waitpid(csinfo[i].pid, &pstat, 0); + } + } +--- 2170,2176 ---- + */ + if (pid < 0 && csinfo[i].pid > 1) + { +! kill(csinfo[i].pid, SIGKILL); + (void)waitpid(csinfo[i].pid, &pstat, 0); + } + } +*** ../vim-7.1.280/src/version.c Sat Mar 15 13:10:57 2008 +--- src/version.c Sun Mar 16 13:08:08 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 281, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +136. You decide to stay in a low-paying job teaching just for the + free Internet access. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From d1c2bee7cdd5451cd2d3b5cf74512a12dbd4feeb Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 17 Mar 2008 16:51:22 +0000 Subject: [PATCH 52/71] - patchlevel 282 --- 7.1.282 | 549 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 549 insertions(+) create mode 100644 7.1.282 diff --git a/7.1.282 b/7.1.282 new file mode 100644 index 00000000..7bb125cf --- /dev/null +++ b/7.1.282 @@ -0,0 +1,549 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.282 (extra) +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.282 (extra) +Problem: Win64: Edit with Vim context menu isn't installed correctly. + Compiler warnings and a few other things. +Solution: Add [ and ] to entry of class name. Use UINT_PTR instead of UINT. + And a fixes for the other things. (George V. Reilly) +Files: src/GvimExt/Makefile, src/dosinst.c, src/if_ole.cpp, src/if_ole.h, + src/if_ole.idl, src/INSTALLpc.txt, src/Make_mvc.mak, + src/os_win32.c, + + +*** ../vim-7.1.281/src/GvimExt/Makefile Sat May 5 12:51:46 2007 +--- src/GvimExt/Makefile Tue Jul 10 16:18:18 2007 +*************** +*** 24,30 **** + gvimext.obj: gvimext.h + + .cpp.obj: +! $(cc) $(cflags) -DFEAT_GETTEXT $(cvarsdll) $*.cpp + + gvimext.res: gvimext.rc + $(rc) $(rcflags) $(rcvars) gvimext.rc +--- 24,30 ---- + gvimext.obj: gvimext.h + + .cpp.obj: +! $(cc) $(cflags) -DFEAT_GETTEXT $(cvarsmt) $*.cpp + + gvimext.res: gvimext.rc + $(rc) $(rcflags) $(rcvars) gvimext.rc +*** ../vim-7.1.281/src/dosinst.c Thu May 10 20:54:39 2007 +--- src/dosinst.c Tue Jul 10 16:07:16 2007 +*************** +*** 1365,1371 **** + + printf("Creating \"Edit with Vim\" popup menu entry\n"); + +! fprintf(fd, "HKEY_CLASSES_ROOT\\CLSID\\%s\n", vim_ext_clsid); + fprintf(fd, "@=\"%s\"\n", vim_ext_name); + fprintf(fd, "[HKEY_CLASSES_ROOT\\CLSID\\%s\\InProcServer32]\n", + vim_ext_clsid); +--- 1365,1371 ---- + + printf("Creating \"Edit with Vim\" popup menu entry\n"); + +! fprintf(fd, "[HKEY_CLASSES_ROOT\\CLSID\\%s]\n", vim_ext_clsid); + fprintf(fd, "@=\"%s\"\n", vim_ext_name); + fprintf(fd, "[HKEY_CLASSES_ROOT\\CLSID\\%s\\InProcServer32]\n", + vim_ext_clsid); +*** ../vim-7.1.281/src/if_ole.cpp Wed Aug 16 17:34:09 2006 +--- src/if_ole.cpp Tue Sep 25 16:44:44 2007 +*************** +*** 34,39 **** +--- 34,45 ---- + extern HWND vim_parent_hwnd; + } + ++ #if _MSC_VER < 1300 ++ /* Work around old versions of basetsd.h which wrongly declares ++ * UINT_PTR as unsigned long */ ++ # define UINT_PTR UINT ++ #endif ++ + #include "if_ole.h" // Interface definitions + #include "iid_ole.c" // UUID definitions (compile here) + +*************** +*** 107,113 **** + STDMETHOD(SendKeys)(BSTR keys); + STDMETHOD(Eval)(BSTR expr, BSTR *result); + STDMETHOD(SetForeground)(void); +! STDMETHOD(GetHwnd)(UINT *result); + + private: + // Constructor is private - create using CVim::Create() +--- 113,119 ---- + STDMETHOD(SendKeys)(BSTR keys); + STDMETHOD(Eval)(BSTR expr, BSTR *result); + STDMETHOD(SetForeground)(void); +! STDMETHOD(GetHwnd)(UINT_PTR *result); + + private: + // Constructor is private - create using CVim::Create() +*************** +*** 288,296 **** + } + + STDMETHODIMP +! CVim::GetHwnd(UINT *result) + { +! *result = (UINT) s_hwnd; + return S_OK; + } + +--- 294,302 ---- + } + + STDMETHODIMP +! CVim::GetHwnd(UINT_PTR *result) + { +! *result = (UINT_PTR)s_hwnd; + return S_OK; + } + +*** ../vim-7.1.281/src/if_ole.h Sun Jun 13 17:46:29 2004 +--- src/if_ole.h Tue Jul 10 16:21:18 2007 +*************** +*** 79,85 **** + virtual HRESULT STDMETHODCALLTYPE SetForeground( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetHwnd( +! /* [retval][out] */ UINT __RPC_FAR *result) = 0; + + }; + +--- 79,85 ---- + virtual HRESULT STDMETHODCALLTYPE SetForeground( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetHwnd( +! /* [retval][out] */ UINT_PTR __RPC_FAR *result) = 0; + + }; + +*************** +*** 143,149 **** + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetHwnd )( + IVim __RPC_FAR * This, +! /* [retval][out] */ UINT __RPC_FAR *result); + + END_INTERFACE + } IVimVtbl; +--- 143,149 ---- + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetHwnd )( + IVim __RPC_FAR * This, +! /* [retval][out] */ UINT_PTR __RPC_FAR *result); + + END_INTERFACE + } IVimVtbl; +*************** +*** 236,242 **** + + HRESULT STDMETHODCALLTYPE IVim_GetHwnd_Proxy( + IVim __RPC_FAR * This, +! /* [retval][out] */ UINT __RPC_FAR *result); + + + void __RPC_STUB IVim_GetHwnd_Stub( +--- 236,242 ---- + + HRESULT STDMETHODCALLTYPE IVim_GetHwnd_Proxy( + IVim __RPC_FAR * This, +! /* [retval][out] */ UINT_PTR __RPC_FAR *result); + + + void __RPC_STUB IVim_GetHwnd_Stub( +*** ../vim-7.1.281/src/if_ole.idl Sun Jun 13 17:22:03 2004 +--- src/if_ole.idl Tue Jul 10 16:21:45 2007 +*************** +*** 20,26 **** + HRESULT SendKeys([in]BSTR keys); + HRESULT Eval([in]BSTR expr, [out, retval]BSTR* result); + HRESULT SetForeground(void); +! HRESULT GetHwnd([out, retval]UINT* result); + }; + + // Component and type library definitions +--- 20,26 ---- + HRESULT SendKeys([in]BSTR keys); + HRESULT Eval([in]BSTR expr, [out, retval]BSTR* result); + HRESULT SetForeground(void); +! HRESULT GetHwnd([out, retval]UINT_PTR* result); + }; + + // Component and type library definitions +*** ../vim-7.1.281/src/INSTALLpc.txt Sun Apr 30 20:29:26 2006 +--- src/INSTALLpc.txt Wed Mar 12 15:01:37 2008 +*************** +*** 82,90 **** + |ms-platform-sdk|, |dotnet-1.1-redist|, |dotnet-1.1-sdk|, + and |windbg-download|. + +! It's easier to download Visual C++ 2005 Express Edition, |msvc-2005-express|. +! The advantage of the VC 2003 Toolkit is that it will be freely available +! long after VC 2005 Express Edition stops being free in November 2006. + + The free Code::Blocks IDE works with the VC2003 Toolkit, as described at + http://wiki.codeblocks.org/index.php?title=Integrating_Microsoft_Visual_Toolkit_2003_with_Code::Blocks_IDE +--- 82,89 ---- + |ms-platform-sdk|, |dotnet-1.1-redist|, |dotnet-1.1-sdk|, + and |windbg-download|. + +! It's easier to download Visual C++ 2008 Express Edition, |msvc-2008-express|, +! which is freely available in perpetuity. + + The free Code::Blocks IDE works with the VC2003 Toolkit, as described at + http://wiki.codeblocks.org/index.php?title=Integrating_Microsoft_Visual_Toolkit_2003_with_Code::Blocks_IDE +*************** +*** 152,157 **** +--- 151,164 ---- + http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/default.aspx + + ++ Visual C++ 2008 Express Edition *msvc-2008-express* ++ ------------------------------- ++ ++ Visual C++ 2008 Express Edition can be downloaded for free from: ++ http://msdn2.microsoft.com/en-us/express/default.aspx ++ This includes the IDE and the debugger. You can build Vim with Make_mvc.mak. ++ ++ + 2. MinGW + ======== + +*** ../vim-7.1.281/src/Make_mvc.mak Wed Oct 3 13:28:40 2007 +--- src/Make_mvc.mak Wed Mar 12 15:09:55 2008 +*************** +*** 1,6 **** + # Makefile for Vim on Win32 (Windows NT/2000/XP/2003 and Windows 95/98/Me) + # and Win64, using the Microsoft Visual C++ compilers. Known to work with +! # VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), and VC8 (VS2005). + # + # To build using other Windows compilers, see INSTALLpc.txt + # +--- 1,7 ---- + # Makefile for Vim on Win32 (Windows NT/2000/XP/2003 and Windows 95/98/Me) + # and Win64, using the Microsoft Visual C++ compilers. Known to work with +! # VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), VC8 (VS2005), +! # and VC9 (VS2008). + # + # To build using other Windows compilers, see INSTALLpc.txt + # +*************** +*** 285,291 **** + # need shell32.lib for ExtractIcon() + # gdi32.lib and comdlg32.lib for printing support + # ole32.lib and uuid.lib are needed for FEAT_SHORTCUT +! CON_LIB = advapi32.lib shell32.lib gdi32.lib comdlg32.lib ole32.lib uuid.lib + !if "$(DELAYLOAD)" == "yes" + CON_LIB = $(CON_LIB) /DELAYLOAD:comdlg32.dll /DELAYLOAD:ole32.dll DelayImp.lib + !endif +--- 286,293 ---- + # need shell32.lib for ExtractIcon() + # gdi32.lib and comdlg32.lib for printing support + # ole32.lib and uuid.lib are needed for FEAT_SHORTCUT +! CON_LIB = oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib \ +! comdlg32.lib ole32.lib uuid.lib /machine:$(CPU) /nodefaultlib + !if "$(DELAYLOAD)" == "yes" + CON_LIB = $(CON_LIB) /DELAYLOAD:comdlg32.dll /DELAYLOAD:ole32.dll DelayImp.lib + !endif +*************** +*** 331,336 **** +--- 333,339 ---- + !endif + !if "$(_NMAKE_VER)" == "6.00.8168.0" + MSVCVER = 6.0 ++ CPU = ix86 + !endif + !if "$(_NMAKE_VER)" == "7.00.9466" + MSVCVER = 7.0 +*************** +*** 344,349 **** +--- 347,355 ---- + !if "$(_NMAKE_VER)" == "8.00.50727.762" + MSVCVER = 8.0 + !endif ++ !if "$(_NMAKE_VER)" == "9.00.20706.01" ++ MSVCVER = 9.0 ++ !endif + !endif + + # Abort bulding VIM if version of VC is unrecognised. +*************** +*** 352,364 **** + !message Cannot determine Visual C version being used. If you are using the + !message Windows SDK then you must have the environment variable MSVCVER set to + !message your version of the VC compiler. If you are not using the Express +! !message version of Visual C you van either set MSVCVER or update this makefile +! !message to handle the new value for _NMAKE_VER. + !error Make aborted. + !endif + + # Convert processor ID to MVC-compatible number +! !if "$(MSVCVER)" != "8.0" + !if "$(CPUNR)" == "i386" + CPUARG = /G3 + !elseif "$(CPUNR)" == "i486" +--- 358,370 ---- + !message Cannot determine Visual C version being used. If you are using the + !message Windows SDK then you must have the environment variable MSVCVER set to + !message your version of the VC compiler. If you are not using the Express +! !message version of Visual C, you can either set MSVCVER or update this makefile +! !message to handle the new value for _NMAKE_VER, "$(_NMAKE_VER)". + !error Make aborted. + !endif + + # Convert processor ID to MVC-compatible number +! !if ("$(MSVCVER)" != "8.0") && ("$(MSVCVER)" != "9.0") + !if "$(CPUNR)" == "i386" + CPUARG = /G3 + !elseif "$(CPUNR)" == "i486" +*************** +*** 373,379 **** + CPUARG = + !endif + !else +! # VC8 only allows specifying SSE architecture + !if "$(CPUNR)" == "pentium4" + CPUARG = /arch:SSE2 + !endif +--- 379,385 ---- + CPUARG = + !endif + !else +! # VC8/9 only allows specifying SSE architecture + !if "$(CPUNR)" == "pentium4" + CPUARG = /arch:SSE2 + !endif +*************** +*** 391,397 **** + !else # MAXSPEED + OPTFLAG = /Ox + !endif +! !if "$(MSVCVER)" == "8.0" + # Use link time code generation if not worried about size + !if "$(OPTIMIZE)" != "SPACE" + OPTFLAG = $(OPTFLAG) /GL +--- 397,403 ---- + !else # MAXSPEED + OPTFLAG = /Ox + !endif +! !if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") + # Use link time code generation if not worried about size + !if "$(OPTIMIZE)" != "SPACE" + OPTFLAG = $(OPTFLAG) /GL +*************** +*** 404,414 **** + LIBC = msvcrt.lib + ! else + LIBC = libcmt.lib +! CFLAGS = $(CFLAGS) /MT + ! endif + !else # DEBUG + VIM = vimd +! ! if "$(CPU)" == "i386" + DEBUGINFO = /ZI + ! endif + CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG /Od +--- 410,420 ---- + LIBC = msvcrt.lib + ! else + LIBC = libcmt.lib +! CFLAGS = $(CFLAGS) /Zl /MT + ! endif + !else # DEBUG + VIM = vimd +! ! if ("$(CPU)" == "i386") || ("$(CPU)" == "ix86") + DEBUGINFO = /ZI + ! endif + CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG /Od +*************** +*** 424,430 **** + LIBC = $(LIBC) msvcrtd.lib + ! else + LIBC = $(LIBC) libcmtd.lib +! CFLAGS = $(CFLAGS) /MTd + ! endif + !endif # DEBUG + +--- 430,436 ---- + LIBC = $(LIBC) msvcrtd.lib + ! else + LIBC = $(LIBC) libcmtd.lib +! CFLAGS = $(CFLAGS) /Zl /MTd + ! endif + !endif # DEBUG + +*************** +*** 534,540 **** + $(OUTDIR)\gui_w32.obj \ + $(OUTDIR)\os_w32exe.obj + GUI_LIB = \ +! oldnames.lib kernel32.lib gdi32.lib version.lib $(IME_LIB) \ + winspool.lib comctl32.lib advapi32.lib shell32.lib \ + /machine:$(CPU) /nodefaultlib + !else +--- 540,546 ---- + $(OUTDIR)\gui_w32.obj \ + $(OUTDIR)\os_w32exe.obj + GUI_LIB = \ +! gdi32.lib version.lib $(IME_LIB) \ + winspool.lib comctl32.lib advapi32.lib shell32.lib \ + /machine:$(CPU) /nodefaultlib + !else +*************** +*** 757,763 **** + + # Report link time code generation progress if used. + !ifdef NODEBUG +! !if "$(MSVCVER)" == "8.0" + !if "$(OPTIMIZE)" != "SPACE" + LINKARGS1 = $(LINKARGS1) /LTCG:STATUS + !endif +--- 763,769 ---- + + # Report link time code generation progress if used. + !ifdef NODEBUG +! !if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") + !if "$(OPTIMIZE)" != "SPACE" + LINKARGS1 = $(LINKARGS1) /LTCG:STATUS + !endif +*** ../vim-7.1.281/src/os_win32.c Tue Nov 20 17:21:28 2007 +--- src/os_win32.c Wed Mar 12 15:24:33 2008 +*************** +*** 2856,2862 **** + windgoto((int)Rows - 1, 0); + g_fForceExit = TRUE; + +! sprintf((char *)IObuff, _("Vim: Caught %s event\n"), + (dwCtrlType == CTRL_CLOSE_EVENT + ? _("close") + : dwCtrlType == CTRL_LOGOFF_EVENT +--- 2856,2862 ---- + windgoto((int)Rows - 1, 0); + g_fForceExit = TRUE; + +! vim_snprintf((char *)IObuff, IOSIZE, _("Vim: Caught %s event\n"), + (dwCtrlType == CTRL_CLOSE_EVENT + ? _("close") + : dwCtrlType == CTRL_LOGOFF_EVENT +*************** +*** 3282,3293 **** + { + /* we use "command" or "cmd" to start the shell; slow but easy */ + char_u *newcmd; +! +! newcmd = lalloc((long_u) ( + #ifdef FEAT_GUI_W32 + STRLEN(vimrun_path) + + #endif +! STRLEN(p_sh) + STRLEN(p_shcf) + STRLEN(cmd) + 10), TRUE); + if (newcmd != NULL) + { + char_u *cmdbase = (*cmd == '"' ? cmd + 1 : cmd); +--- 3282,3294 ---- + { + /* we use "command" or "cmd" to start the shell; slow but easy */ + char_u *newcmd; +! long_u cmdlen = ( + #ifdef FEAT_GUI_W32 + STRLEN(vimrun_path) + + #endif +! STRLEN(p_sh) + STRLEN(p_shcf) + STRLEN(cmd) + 10); +! +! newcmd = lalloc(cmdlen, TRUE); + if (newcmd != NULL) + { + char_u *cmdbase = (*cmd == '"' ? cmd + 1 : cmd); +*************** +*** 3373,3386 **** + if (!s_dont_use_vimrun) + /* Use vimrun to execute the command. It opens a console + * window, which can be closed without killing Vim. */ +! sprintf((char *)newcmd, "%s%s%s %s %s", + vimrun_path, + (msg_silent != 0 || (options & SHELL_DOOUT)) + ? "-s " : "", + p_sh, p_shcf, cmd); + else + #endif +! sprintf((char *)newcmd, "%s %s %s", p_sh, p_shcf, cmd); + x = mch_system((char *)newcmd, options); + } + vim_free(newcmd); +--- 3374,3388 ---- + if (!s_dont_use_vimrun) + /* Use vimrun to execute the command. It opens a console + * window, which can be closed without killing Vim. */ +! vim_snprintf((char *)newcmd, cmdlen, "%s%s%s %s %s", + vimrun_path, + (msg_silent != 0 || (options & SHELL_DOOUT)) + ? "-s " : "", + p_sh, p_shcf, cmd); + else + #endif +! vim_snprintf((char *)newcmd, cmdlen, "%s %s %s", +! p_sh, p_shcf, cmd); + x = mch_system((char *)newcmd, options); + } + vim_free(newcmd); +*************** +*** 4664,4675 **** +--- 4666,4694 ---- + # endif + ) + { ++ # if defined(DEBUG) && _MSC_VER > 1200 ++ /* Work around an annoying assertion in the Microsoft debug CRT ++ * when mode's text/binary setting doesn't match _get_fmode(). */ ++ char newMode = mode[strlen(mode) - 1]; ++ int oldMode = 0; ++ ++ _get_fmode(&oldMode); ++ if (newMode == 't') ++ _set_fmode(_O_TEXT); ++ else if (newMode == 'b') ++ _set_fmode(_O_BINARY); ++ # endif + wn = enc_to_ucs2(name, NULL); + wm = enc_to_ucs2(mode, NULL); + if (wn != NULL && wm != NULL) + f = _wfopen(wn, wm); + vim_free(wn); + vim_free(wm); ++ ++ # if defined(DEBUG) && _MSC_VER > 1200 ++ _set_fmode(oldMode); ++ # endif ++ + if (f != NULL) + return f; + /* Retry with non-wide function (for Windows 98). Can't use +*** ../vim-7.1.281/src/version.c Sun Mar 16 13:09:14 2008 +--- src/version.c Sun Mar 16 14:49:21 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 282, + /**/ + +-- +Amazing but true: If all the salmon caught in Canada in one year were laid +end to end across the Sahara Desert, the smell would be absolutely awful. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From b647e77c0f6904ad8eeac89f0a05ec6c25b88781 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 17 Mar 2008 16:51:39 +0000 Subject: [PATCH 53/71] - patchlevel 283 --- 7.1.283 | 263 +++++++++++++++++++++++++++++++++++++++++++++++++ README.patches | 10 ++ vim.spec | 25 ++++- 3 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 7.1.283 diff --git a/7.1.283 b/7.1.283 new file mode 100644 index 00000000..1dfe1446 --- /dev/null +++ b/7.1.283 @@ -0,0 +1,263 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.283 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.283 +Problem: Non-extra part for 7.1.282. +Solution: Various changes. +Files: src/ex_docmd.c, src/globals.h, src/if_cscope.c, src/main.c, + src/mark.c, src/netbeans.c, src/popupmnu.c, src/vim.h, + src/window.c + + +*** ../vim-7.1.282/src/ex_docmd.c Mon Mar 10 21:33:52 2008 +--- src/ex_docmd.c Wed Mar 12 14:53:18 2008 +*************** +*** 3009,3015 **** + break; + if (!isalpha(p[j]) && j >= cmdmods[i].minlen + && (p == cmd || cmdmods[i].has_count)) +! return j + (p - cmd); + } + return 0; + } +--- 3009,3015 ---- + break; + if (!isalpha(p[j]) && j >= cmdmods[i].minlen + && (p == cmd || cmdmods[i].has_count)) +! return j + (int)(p - cmd); + } + return 0; + } +*** ../vim-7.1.282/src/globals.h Tue Jan 1 14:16:42 2008 +--- src/globals.h Wed Mar 12 14:54:00 2008 +*************** +*** 1263,1269 **** + * The value of the --windowid argument. + * For embedding gvim inside another application. + */ +! EXTERN int win_socket_id INIT(= 0); + #endif + + #if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL) +--- 1263,1269 ---- + * The value of the --windowid argument. + * For embedding gvim inside another application. + */ +! EXTERN long_u win_socket_id INIT(= 0); + #endif + + #if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL) +*** ../vim-7.1.282/src/if_cscope.c Sun Mar 16 13:09:14 2008 +--- src/if_cscope.c Sun Mar 16 13:05:51 2008 +*************** +*** 1400,1406 **** + return NULL; + + /* Store length of eap->arg before it gets modified by strtok(). */ +! eap_arg_len = STRLEN(eap->arg); + + if ((stok = strtok((char *)(eap->arg), (const char *)" ")) == NULL) + return NULL; +--- 1400,1406 ---- + return NULL; + + /* Store length of eap->arg before it gets modified by strtok(). */ +! eap_arg_len = (int)STRLEN(eap->arg); + + if ((stok = strtok((char *)(eap->arg), (const char *)" ")) == NULL) + return NULL; +*** ../vim-7.1.282/src/main.c Sun Jan 13 16:17:02 2008 +--- src/main.c Wed Mar 12 15:04:30 2008 +*************** +*** 1552,1566 **** + else if (STRICMP(argv[i], "--socketid") == 0) + # endif + { +! unsigned int id; +! int count; + + if (i == argc - 1) + mainerr_arg_missing((char_u *)argv[i]); + if (STRNICMP(argv[i+1], "0x", 2) == 0) +! count = sscanf(&(argv[i + 1][2]), "%x", &id); + else +! count = sscanf(argv[i+1], "%u", &id); + if (count != 1) + mainerr(ME_INVALID_ARG, (char_u *)argv[i]); + else +--- 1552,1566 ---- + else if (STRICMP(argv[i], "--socketid") == 0) + # endif + { +! long_u id; +! int count; + + if (i == argc - 1) + mainerr_arg_missing((char_u *)argv[i]); + if (STRNICMP(argv[i+1], "0x", 2) == 0) +! count = sscanf(&(argv[i + 1][2]), SCANF_HEX_LONG_U, &id); + else +! count = sscanf(argv[i + 1], SCANF_DECIMAL_LONG_U, &id); + if (count != 1) + mainerr(ME_INVALID_ARG, (char_u *)argv[i]); + else +*** ../vim-7.1.282/src/mark.c Wed Feb 13 12:41:30 2008 +--- src/mark.c Wed Mar 12 15:10:14 2008 +*************** +*** 522,528 **** + int len; + + expand_env((char_u *)"~/", NameBuff, MAXPATHL); +! len = STRLEN(NameBuff); + vim_strncpy(NameBuff + len, fm->fname + 2, MAXPATHL - len - 1); + } + else +--- 522,528 ---- + int len; + + expand_env((char_u *)"~/", NameBuff, MAXPATHL); +! len = (int)STRLEN(NameBuff); + vim_strncpy(NameBuff + len, fm->fname + 2, MAXPATHL - len - 1); + } + else +*** ../vim-7.1.282/src/netbeans.c Fri Jan 18 11:40:02 2008 +--- src/netbeans.c Wed Mar 12 15:11:42 2008 +*************** +*** 1216,1222 **** + int lastbyte = last; + + oldtext = ml_get(lnum); +! oldlen = STRLEN(oldtext); + if (first >= (colnr_T)oldlen || oldlen == 0) /* just in case */ + return; + if (lastbyte >= oldlen) +--- 1216,1222 ---- + int lastbyte = last; + + oldtext = ml_get(lnum); +! oldlen = (int)STRLEN(oldtext); + if (first >= (colnr_T)oldlen || oldlen == 0) /* just in case */ + return; + if (lastbyte >= oldlen) +*************** +*** 1241,1248 **** + int len_first, len_other; + char_u *p; + +! len_first = STRLEN(ml_get(first)); +! len_other = STRLEN(ml_get(other)); + p = alloc((unsigned)(len_first + len_other + 1)); + if (p != NULL) + { +--- 1241,1248 ---- + int len_first, len_other; + char_u *p; + +! len_first = (int)STRLEN(ml_get(first)); +! len_other = (int)STRLEN(ml_get(other)); + p = alloc((unsigned)(len_first + len_other + 1)); + if (p != NULL) + { +*** ../vim-7.1.282/src/popupmnu.c Wed Aug 8 22:48:16 2007 +--- src/popupmnu.c Wed Mar 12 15:17:21 2008 +*************** +*** 337,343 **** + + if (rt != NULL) + { +! len = STRLEN(rt); + if (len > pum_width) + { + for (j = pum_width; j < len; ++j) +--- 337,343 ---- + + if (rt != NULL) + { +! len = (int)STRLEN(rt); + if (len > pum_width) + { + for (j = pum_width; j < len; ++j) +*** ../vim-7.1.282/src/vim.h Sat Mar 15 13:10:57 2008 +--- src/vim.h Thu Mar 13 23:39:21 2008 +*************** +*** 355,370 **** + * On Win64 longs are 32 bit and pointers 64 bit. + * For printf() and scanf() we need to take care of long_u specifically. */ + #ifdef _WIN64 +! typedef unsigned __int64 long_u; +! typedef __int64 long_i; +! # define SCANF_HEX_LONG_U "%Ix" +! # define PRINTF_HEX_LONG_U "0x%Ix" +! #else +! typedef unsigned long long_u; +! typedef long long_i; +! # define SCANF_HEX_LONG_U "%lx" +! # define PRINTF_HEX_LONG_U "0x%lx" + #endif + + /* + * The characters and attributes cached for the screen. +--- 355,373 ---- + * On Win64 longs are 32 bit and pointers 64 bit. + * For printf() and scanf() we need to take care of long_u specifically. */ + #ifdef _WIN64 +! typedef unsigned __int64 long_u; +! typedef __int64 long_i; +! # define SCANF_HEX_LONG_U "%Ix" +! # define SCANF_DECIMAL_LONG_U "%Iu" +! # define PRINTF_HEX_LONG_U "0x%Ix" +! #else +! typedef unsigned long long_u; +! typedef long long_i; +! # define SCANF_HEX_LONG_U "%lx" +! # define SCANF_DECIMAL_LONG_U "%lu" +! # define PRINTF_HEX_LONG_U "0x%lx" + #endif ++ #define PRINTF_DECIMAL_LONG_U SCANF_DECIMAL_LONG_U + + /* + * The characters and attributes cached for the screen. +*** ../vim-7.1.282/src/window.c Sat Sep 29 14:15:00 2007 +--- src/window.c Wed Mar 12 15:22:10 2008 +*************** +*** 6303,6309 **** + cur = cur->next; + } + } +! if ((hlg_id = syn_namen2id(grp, STRLEN(grp))) == 0) + { + EMSG2(_(e_nogroup), grp); + return -1; +--- 6303,6309 ---- + cur = cur->next; + } + } +! if ((hlg_id = syn_namen2id(grp, (int)STRLEN(grp))) == 0) + { + EMSG2(_(e_nogroup), grp); + return -1; +*** ../vim-7.1.282/src/version.c Sun Mar 16 14:52:53 2008 +--- src/version.c Sun Mar 16 16:00:17 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 283, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +139. You down your lunch in five minutes, at your desk, so you can + spend the rest of the hour surfing the Net. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index a62b12c9..8d26375b 100644 --- a/README.patches +++ b/README.patches @@ -305,3 +305,13 @@ Individual patches for Vim 7.1: 1582 7.1.271 in tiny version ":!touch %" causes curbuf to be wrong 2334 7.1.272 buffer name [Location List] not used for buffer in other tab 2504 7.1.273 when profiling on Linux Vim exits early + 1549 7.1.274 (after 7.1.272) compiler warning with optimized build + 40835 7.1.275 (extra) Mac: ATSUI and 'antialias' don't work together + 4946 7.1.276 "gw" uses 'formatexpr', even though the docs say it doesn't + 2802 7.1.277 default for 'paragraphs' misses some items + 1989 7.1.278 (extra, after 7.1.275) build problem + 3848 7.1.279 when using cscope temporary files are left behind + 1556 7.1.280 (after 7.1.275) Mac: build problems without multibyte feature + 2094 7.1.281 (after 7.1.279) Vim hangs when cscope doesn't exit + 16302 7.1.282 (extra) Win64: Installing context menu, compiler warnings + 7633 7.1.283 non-extra part of 7.1.282 diff --git a/vim.spec b/vim.spec index 3d2921ca..34cc6c6e 100644 --- a/vim.spec +++ b/vim.spec @@ -18,7 +18,7 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 273 +%define patchlevel 283 Summary: The VIM editor URL: http://www.vim.org/ @@ -328,6 +328,16 @@ Patch270: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.270 Patch271: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.271 Patch272: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.272 Patch273: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.273 +Patch274: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.274 +Patch275: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.275 +Patch276: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.276 +Patch277: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.277 +Patch278: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.278 +Patch279: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.279 +Patch280: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.280 +Patch281: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.281 +Patch282: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.282 +Patch283: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.283 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch @@ -737,6 +747,16 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch271 -p0 %patch272 -p0 %patch273 -p0 +%patch274 -p0 +%patch275 -p0 +%patch276 -p0 +%patch277 -p0 +%patch278 -p0 +%patch279 -p0 +%patch280 -p0 +%patch281 -p0 +%patch282 -p0 +%patch283 -p0 # install spell files @@ -1141,6 +1161,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Mon Mar 17 2008 Karsten Hopp 7.1.283-1 +- patchlevel 283, fixes leftover cscope files in /tmp + * Wed Mar 12 2008 Karsten Hopp 7.1.273-1 - update to patchlevel 273, this fixes #436902 From a8897a22b18cf7a4a2bb11132035f4aeac6a500e Mon Sep 17 00:00:00 2001 From: Tom Callaway Date: Tue, 18 Mar 2008 19:04:27 +0000 Subject: [PATCH 54/71] add Requires for versioned perl (libperl.so) --- vim.spec | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/vim.spec b/vim.spec index 34cc6c6e..016f6b25 100644 --- a/vim.spec +++ b/vim.spec @@ -24,7 +24,7 @@ Summary: The VIM editor URL: http://www.vim.org/ Name: vim Version: %{baseversion}.%{beta}%{patchlevel} -Release: 1%{?dist} +Release: 2%{?dist} License: Vim Group: Applications/Editors Source0: ftp://ftp.vim.org/pub/vim/unix/vim-%{baseversion}%{?beta}%{?CVSDATE}.tar.bz2 @@ -365,7 +365,8 @@ BuildRequires: libacl-devel gpm-devel autoconf BuildRequires: libselinux-devel %endif %if %{desktop_file} -Requires: /usr/bin/desktop-file-install +# for /usr/bin/desktop-file-install +Requires: desktop-file-utils BuildRequires: desktop-file-utils >= %{desktop_file_utils_version} %endif Epoch: 2 @@ -423,6 +424,7 @@ Summary: A version of the VIM editor which includes recent enhancements Group: Applications/Editors Requires: vim-common = %{epoch}:%{version}-%{release} which Provides: vim = %{version}-%{release} +Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) %description enhanced VIM (VIsual editor iMproved) is an updated and improved version of the @@ -443,6 +445,7 @@ Group: Applications/Editors Requires: vim-common = %{epoch}:%{version}-%{release} libattr >= 2.4 gtk2 >= 2.6 Provides: gvim = %{version}-%{release} BuildRequires: gtk2-devel libSM-devel libXt-devel libXpm-devel +Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) %description X11 VIM (VIsual editor iMproved) is an updated and improved version of the @@ -1161,6 +1164,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Tue Mar 18 2008 Tom "spot" Callaway 7.1.283-2 +- add Requires for versioned perl (libperl.so) + * Mon Mar 17 2008 Karsten Hopp 7.1.283-1 - patchlevel 283, fixes leftover cscope files in /tmp From 51f81c328b5b5e0d4a9304df7672ce7be7a3c19b Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 2 Apr 2008 15:07:12 +0000 Subject: [PATCH 55/71] - patchlevel 284 --- 7.1.284 | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 7.1.284 diff --git a/7.1.284 b/7.1.284 new file mode 100644 index 00000000..8c46689c --- /dev/null +++ b/7.1.284 @@ -0,0 +1,61 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.284 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.284 +Problem: Compiler warnings for functions without prototype. +Solution: Add the function prototypes. (Patrick Texier) +Files: src/eval.c, src/quickfix.c + + +*** ../vim-7.1.283/src/eval.c Wed Feb 20 20:09:44 2008 +--- src/eval.c Sat Mar 15 12:49:14 2008 +*************** +*** 14662,14667 **** +--- 14662,14669 ---- + appended_lines_mark(lcount, added); + } + ++ static void set_qf_ll_list __ARGS((win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *rettv)); ++ + /* + * Used by "setqflist()" and "setloclist()" functions + */ +*** ../vim-7.1.283/src/quickfix.c Sat Jan 19 15:55:51 2008 +--- src/quickfix.c Sat Mar 15 12:51:05 2008 +*************** +*** 106,112 **** +--- 106,114 ---- + + static int qf_init_ext __ARGS((qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast)); + static void qf_new_list __ARGS((qf_info_T *qi)); ++ static void ll_free_all __ARGS((qf_info_T **pqi)); + static int qf_add_entry __ARGS((qf_info_T *qi, qfline_T **prevp, char_u *dir, char_u *fname, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid)); ++ static qf_info_T *ll_new_list __ARGS((void)); + static void qf_msg __ARGS((qf_info_T *qi)); + static void qf_free __ARGS((qf_info_T *qi, int idx)); + static char_u *qf_types __ARGS((int, int)); +*** ../vim-7.1.283/src/version.c Sun Mar 16 16:02:47 2008 +--- src/version.c Thu Mar 20 13:21:42 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 284, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +160. You get in the elevator and double-click the button for the floor + you want. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From b928ed2fd52a1953a6132ece12771ef4501073ce Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 2 Apr 2008 15:07:26 +0000 Subject: [PATCH 56/71] - patchlevel 285 --- 7.1.285 | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 7.1.285 diff --git a/7.1.285 b/7.1.285 new file mode 100644 index 00000000..f4be10ff --- /dev/null +++ b/7.1.285 @@ -0,0 +1,209 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.285 (extra) +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.285 (extra) +Problem: Mac: dialog hotkeys don't work. +Solution: Add hotkey support. (Dan Sandler) +Files: src/gui_mac.c + + +*** ../vim-7.1.284/src/gui_mac.c Wed Mar 12 21:47:31 2008 +--- src/gui_mac.c Sun Mar 16 15:25:13 2008 +*************** +*** 153,158 **** +--- 153,161 ---- + /* Keeping track of which scrollbar is being dragged */ + static ControlHandle dragged_sb = NULL; + ++ /* Vector of char_u --> control index for hotkeys in dialogs */ ++ static short *gDialogHotKeys; ++ + static struct + { + FMFontFamily family; +*************** +*** 5519,5524 **** +--- 5522,5570 ---- + SetDialogItemText(itemHandle, itemName); + } + ++ ++ /* ModalDialog() handler for message dialogs that have hotkey accelerators. ++ * Expects a mapping of hotkey char to control index in gDialogHotKeys; ++ * setting gDialogHotKeys to NULL disables any hotkey handling. ++ */ ++ static pascal Boolean ++ DialogHotkeyFilterProc ( ++ DialogRef theDialog, ++ EventRecord *event, ++ DialogItemIndex *itemHit) ++ { ++ char_u keyHit; ++ ++ if (event->what == keyDown || event->what == autoKey) ++ { ++ keyHit = (event->message & charCodeMask); ++ ++ if (gDialogHotKeys && gDialogHotKeys[keyHit]) ++ { ++ #ifdef DEBUG_MAC_DIALOG_HOTKEYS ++ printf("user pressed hotkey '%c' --> item %d\n", keyHit, gDialogHotKeys[keyHit]); ++ #endif ++ *itemHit = gDialogHotKeys[keyHit]; ++ ++ /* When handing off to StdFilterProc, pretend that the user ++ * clicked the control manually. Note that this is also supposed ++ * to cause the button to hilite briefly (to give some user ++ * feedback), but this seems not to actually work (or it's too ++ * fast to be seen). ++ */ ++ event->what = kEventControlSimulateHit; ++ ++ return true; /* we took care of it */ ++ } ++ ++ /* Defer to the OS's standard behavior for this event. ++ * This ensures that Enter will still activate the default button. */ ++ return StdFilterProc(theDialog, event, itemHit); ++ } ++ return false; /* Let ModalDialog deal with it */ ++ } ++ ++ + /* TODO: There have been some crashes with dialogs, check your inbox + * (Jussi) + */ +*************** +*** 5544,5549 **** +--- 5590,5597 ---- + GrafPtr oldPort; + short itemHit; + char_u *buttonChar; ++ short hotKeys[256]; /* map of hotkey -> control ID */ ++ char_u aHotKey; + Rect box; + short button; + short lastButton; +*************** +*** 5571,5576 **** +--- 5619,5626 ---- + + WindowRef theWindow; + ++ ModalFilterUPP dialogUPP; ++ + /* Check 'v' flag in 'guioptions': vertical button placement. */ + vertical = (vim_strchr(p_go, GO_VERTICAL) != NULL); + +*************** +*** 5610,5615 **** +--- 5660,5668 ---- + buttonChar = buttons; + button = 0; + ++ /* initialize the hotkey mapping */ ++ memset(hotKeys, 0, sizeof(hotKeys)); ++ + for (;*buttonChar != 0;) + { + /* Get the name of the button */ +*************** +*** 5619,5625 **** +--- 5672,5689 ---- + { + if (*buttonChar != DLG_HOTKEY_CHAR) + name[++len] = *buttonChar; ++ else ++ { ++ aHotKey = (char_u)*(buttonChar+1); ++ if (aHotKey >= 'A' && aHotKey <= 'Z') ++ aHotKey = (char_u)((int)aHotKey + (int)'a' - (int)'A'); ++ hotKeys[aHotKey] = button; ++ #ifdef DEBUG_MAC_DIALOG_HOTKEYS ++ printf("### hotKey for button %d is '%c'\n", button, aHotKey); ++ #endif ++ } + } ++ + if (*buttonChar != 0) + buttonChar++; + name[0] = len; +*************** +*** 5688,5694 **** +--- 5752,5764 ---- + (void) C2PascalString(textfield, &name); + SetDialogItemText(itemHandle, name); + inputItm.width = StringWidth(name); ++ ++ /* Hotkeys don't make sense if there's a text field */ ++ gDialogHotKeys = NULL; + } ++ else ++ /* Install hotkey table */ ++ gDialogHotKeys = (short *)&hotKeys; + + /* Set the and button. */ + SetDialogDefaultItem(theDialog, dfltbutton); +*************** +*** 5777,5786 **** + dialog_busy = TRUE; + #endif + + /* Hang until one of the button is hit */ + do + { +! ModalDialog(nil, &itemHit); + } while ((itemHit < 1) || (itemHit > lastButton)); + + #ifdef USE_CARBONKEYHANDLER +--- 5847,5859 ---- + dialog_busy = TRUE; + #endif + ++ /* Prepare the shortcut-handling filterProc for handing to the dialog */ ++ dialogUPP = NewModalFilterUPP(DialogHotkeyFilterProc); ++ + /* Hang until one of the button is hit */ + do + { +! ModalDialog(dialogUPP, &itemHit); + } while ((itemHit < 1) || (itemHit > lastButton)); + + #ifdef USE_CARBONKEYHANDLER +*************** +*** 5803,5808 **** +--- 5876,5884 ---- + /* Restore the original graphical port */ + SetPort(oldPort); + ++ /* Free the modal filterProc */ ++ DisposeRoutineDescriptor(dialogUPP); ++ + /* Get ride of th edialog (free memory) */ + DisposeDialog(theDialog); + +*** ../vim-7.1.284/src/version.c Thu Mar 20 13:22:47 2008 +--- src/version.c Thu Mar 20 14:38:06 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 285, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +163. You go outside for the fresh air (at -30 degrees) but open the + window first to hear new mail arrive. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 45aaf6a30e103f634b5236d111c69ba88c490c51 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 2 Apr 2008 15:07:38 +0000 Subject: [PATCH 57/71] - patchlevel 286 --- 7.1.286 | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 7.1.286 diff --git a/7.1.286 b/7.1.286 new file mode 100644 index 00000000..e38bae21 --- /dev/null +++ b/7.1.286 @@ -0,0 +1,66 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.286 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.286 (after 7.1.103) +Problem: "w" at the end of the buffer moves the cursor past the end of the + line. (Markus Heidelberg) +Solution: Move the cursor back from the NUL when it was moved forward. +Files: src/normal.c + + +*** ../vim-7.1.285/src/normal.c Sat Jan 19 15:55:51 2008 +--- src/normal.c Wed Mar 19 20:33:44 2008 +*************** +*** 8345,8350 **** +--- 8345,8351 ---- + int n; + int word_end; + int flag = FALSE; ++ pos_T startpos = curwin->w_cursor; + + /* + * Set inclusive for the "E" and "e" command. +*************** +*** 8405,8412 **** + else + n = fwd_word(cap->count1, cap->arg, cap->oap->op_type != OP_NOP); + +! /* Don't leave the cursor on the NUL past the end of line. */ +! if (n != FAIL) + adjust_cursor(cap->oap); + + if (n == FAIL && cap->oap->op_type == OP_NOP) +--- 8406,8414 ---- + else + n = fwd_word(cap->count1, cap->arg, cap->oap->op_type != OP_NOP); + +! /* Don't leave the cursor on the NUL past the end of line. Unless we +! * didn't move it forward. */ +! if (lt(startpos, curwin->w_cursor)) + adjust_cursor(cap->oap); + + if (n == FAIL && cap->oap->op_type == OP_NOP) +*** ../vim-7.1.285/src/version.c Thu Mar 20 14:38:58 2008 +--- src/version.c Tue Apr 1 12:04:54 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 286, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +200. You really believe in the concept of a "paperless" office. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From d72ab234bf4eb1634ff863b5b391c73ba57e5d61 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 2 Apr 2008 15:07:52 +0000 Subject: [PATCH 58/71] - patchlevel 287 --- 7.1.287 | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 7.1.287 diff --git a/7.1.287 b/7.1.287 new file mode 100644 index 00000000..3501acb9 --- /dev/null +++ b/7.1.287 @@ -0,0 +1,62 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.287 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.287 +Problem: Crash when reversing a list after using it. (Andy Wokula) +Solution: Update the pointer to the last used element. (Dominique Pelle) +Files: src/eval.c + + +*** ../vim-7.1.286/src/eval.c Thu Mar 20 13:22:47 2008 +--- src/eval.c Tue Apr 1 12:36:41 2008 +*************** +*** 13954,13959 **** +--- 13954,13960 ---- + rettv->vval.v_list = l; + rettv->v_type = VAR_LIST; + ++l->lv_refcount; ++ l->lv_idx = l->lv_len - l->lv_idx - 1; + } + } + +*************** +*** 15202,15208 **** + if (!item_compare_func_err) + { + /* Clear the List and append the items in the sorted order. */ +! l->lv_first = l->lv_last = NULL; + l->lv_len = 0; + for (i = 0; i < len; ++i) + list_append(l, ptrs[i]); +--- 15203,15209 ---- + if (!item_compare_func_err) + { + /* Clear the List and append the items in the sorted order. */ +! l->lv_first = l->lv_last = l->lv_idx_item = NULL; + l->lv_len = 0; + for (i = 0; i < len; ++i) + list_append(l, ptrs[i]); +*** ../vim-7.1.286/src/version.c Tue Apr 1 12:05:49 2008 +--- src/version.c Tue Apr 1 13:09:10 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 287, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +203. You're an active member of more than 20 newsgroups. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From b910ac1d554e73dc2e3c401f816dd8ff98b74dc8 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 2 Apr 2008 15:08:09 +0000 Subject: [PATCH 59/71] - patchlevel 288 --- 7.1.288 | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 7.1.288 diff --git a/7.1.288 b/7.1.288 new file mode 100644 index 00000000..63467f26 --- /dev/null +++ b/7.1.288 @@ -0,0 +1,117 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.288 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.288 (after 7.1.281) +Problem: Cscope still leaves behind temp files when using gvim. +Solution: When getting the ECHILD error loop for a while until cscope exits. + (Dominique Pelle) +Files: if_cscope.c + + +*** ../vim-7.1.287/src/if_cscope.c Sun Mar 16 16:02:47 2008 +--- src/if_cscope.c Tue Mar 25 21:34:23 2008 +*************** +*** 2130,2135 **** +--- 2130,2136 ---- + } + #if defined(UNIX) + { ++ int waitpid_errno; + int pstat; + pid_t pid; + +*************** +*** 2145,2150 **** +--- 2146,2152 ---- + + /* Block until cscope exits or until timer expires */ + pid = waitpid(csinfo[i].pid, &pstat, 0); ++ waitpid_errno = errno; + + /* cancel pending alarm if still there and restore signal */ + alarm(0); +*************** +*** 2158,2163 **** +--- 2160,2166 ---- + for (waited = 0; waited < 40; ++waited) + { + pid = waitpid(csinfo[i].pid, &pstat, WNOHANG); ++ waitpid_errno = errno; + if (pid != 0) + break; /* break unless the process is still running */ + mch_delay(50, FALSE); /* sleep 50 ms */ +*************** +*** 2170,2177 **** + */ + if (pid < 0 && csinfo[i].pid > 1) + { +! kill(csinfo[i].pid, SIGKILL); +! (void)waitpid(csinfo[i].pid, &pstat, 0); + } + } + #else /* !UNIX */ +--- 2173,2212 ---- + */ + if (pid < 0 && csinfo[i].pid > 1) + { +! # ifdef ECHILD +! int alive = TRUE; +! +! if (waitpid_errno == ECHILD) +! { +! /* +! * When using 'vim -g', vim is forked and cscope process is +! * no longer a child process but a sibling. So waitpid() +! * fails with errno being ECHILD (No child processes). +! * Don't send SIGKILL to cscope immediately but wait +! * (polling) for it to exit normally as result of sending +! * the "q" command, hence giving it a chance to clean up +! * its temporary files. +! */ +! int waited; +! +! sleep(0); +! for (waited = 0; waited < 40; ++waited) +! { +! /* Check whether cscope process is still alive */ +! if (kill(csinfo[i].pid, 0) != 0) +! { +! alive = FALSE; /* cscope process no longer exists */ +! break; +! } +! mch_delay(50, FALSE); /* sleep 50ms */ +! } +! } +! if (alive) +! # endif +! { +! kill(csinfo[i].pid, SIGKILL); +! (void)waitpid(csinfo[i].pid, &pstat, 0); +! } + } + } + #else /* !UNIX */ +*** ../vim-7.1.287/src/version.c Tue Apr 1 13:10:45 2008 +--- src/version.c Tue Apr 1 14:28:42 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 288, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +204. You're being audited because you mailed your tax return to the IRC. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 7c11274e9d9a3cbdd8badbae81edfa9782cb1e3a Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 2 Apr 2008 15:08:25 +0000 Subject: [PATCH 60/71] - patchlevel 289 --- 7.1.289 | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 7.1.289 diff --git a/7.1.289 b/7.1.289 new file mode 100644 index 00000000..4de2caac --- /dev/null +++ b/7.1.289 @@ -0,0 +1,74 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.289 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.289 +Problem: When EXITFREE is defined and 'acd' is set freed memory is used. + (Dominique Pelle) +Solution: Reset p_acd before freeing all buffers. +Files: src/misc2.c + + +*** ../vim-7.1.288/src/misc2.c Wed Feb 20 12:22:59 2008 +--- src/misc2.c Wed Mar 26 21:02:57 2008 +*************** +*** 751,757 **** + #endif + + /* +! * Note: if unsinged is 16 bits we can only allocate up to 64K with alloc(). + * Use lalloc for larger blocks. + */ + char_u * +--- 752,758 ---- + #endif + + /* +! * Note: if unsigned is 16 bits we can only allocate up to 64K with alloc(). + * Use lalloc for larger blocks. + */ + char_u * +*************** +*** 1082,1088 **** + win_free_all(); + #endif + +! /* Free all buffers. */ + for (buf = firstbuf; buf != NULL; ) + { + nextbuf = buf->b_next; +--- 1083,1093 ---- + win_free_all(); + #endif + +! /* Free all buffers. Reset 'autochdir' to avoid accessing things that +! * were freed already. */ +! #ifdef FEAT_AUTOCHDIR +! p_acd = FALSE; +! #endif + for (buf = firstbuf; buf != NULL; ) + { + nextbuf = buf->b_next; +*** ../vim-7.1.288/src/version.c Tue Apr 1 14:30:18 2008 +--- src/version.c Tue Apr 1 14:51:06 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 289, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +207. You're given one phone call in prison and you ask them for a laptop. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 415cb17706c323e856e09a3604b64252d421c5b3 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 2 Apr 2008 15:08:43 +0000 Subject: [PATCH 61/71] - patchlevel 290 --- 7.1.290 | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 7.1.290 diff --git a/7.1.290 b/7.1.290 new file mode 100644 index 00000000..2392003b --- /dev/null +++ b/7.1.290 @@ -0,0 +1,77 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.290 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.290 +Problem: Reading bytes that were not written when spell checking and a line + has a very large indent. +Solution: Don't copy the start of the next line when it only contains + spaces. (Dominique Pelle) +Files: src/spell.c + + +*** ../vim-7.1.289/src/spell.c Sat Jan 19 15:55:51 2008 +--- src/spell.c Sat Mar 29 13:00:28 2008 +*************** +*** 2268,2273 **** +--- 2269,2276 ---- + /* + * For spell checking: concatenate the start of the following line "line" into + * "buf", blanking-out special characters. Copy less then "maxlen" bytes. ++ * Keep the blanks at the start of the next line, this is used in win_line() ++ * to skip those bytes if the word was OK. + */ + void + spell_cat_line(buf, line, maxlen) +*************** +*** 2284,2295 **** + + if (*p != NUL) + { +! *buf = ' '; +! vim_strncpy(buf + 1, line, maxlen - 2); +! n = (int)(p - line); +! if (n >= maxlen) +! n = maxlen - 1; +! vim_memset(buf + 1, ' ', n); + } + } + +--- 2287,2300 ---- + + if (*p != NUL) + { +! /* Only worth concatenating if there is something else than spaces to +! * concatenate. */ +! n = (int)(p - line) + 1; +! if (n < maxlen - 1) +! { +! vim_memset(buf, ' ', n); +! vim_strncpy(buf + n, p, maxlen - 1 - n); +! } + } + } + +*** ../vim-7.1.289/src/version.c Tue Apr 1 14:53:02 2008 +--- src/version.c Tue Apr 1 17:05:55 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 290, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +209. Your house stinks because you haven't cleaned it in a week. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 25e0c52235a254ea8f3bb7403697a95564d8d7cf Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Wed, 2 Apr 2008 15:11:59 +0000 Subject: [PATCH 62/71] - patchlevel 291 --- 7.1.291 | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ README.patches | 8 ++++++ vim.spec | 23 +++++++++++++++-- 3 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 7.1.291 diff --git a/7.1.291 b/7.1.291 new file mode 100644 index 00000000..d7b72a00 --- /dev/null +++ b/7.1.291 @@ -0,0 +1,70 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.291 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.291 (after 7.1.288) +Problem: Compiler warning. +Solution: Change 50 to 50L. +Files: src/if_cscope.c + + +*** ../vim-7.1.290/src/if_cscope.c Tue Apr 1 14:30:18 2008 +--- src/if_cscope.c Tue Apr 1 20:56:02 2008 +*************** +*** 2163,2169 **** + waitpid_errno = errno; + if (pid != 0) + break; /* break unless the process is still running */ +! mch_delay(50, FALSE); /* sleep 50 ms */ + } + # endif + /* +--- 2163,2169 ---- + waitpid_errno = errno; + if (pid != 0) + break; /* break unless the process is still running */ +! mch_delay(50L, FALSE); /* sleep 50 ms */ + } + # endif + /* +*************** +*** 2198,2204 **** + alive = FALSE; /* cscope process no longer exists */ + break; + } +! mch_delay(50, FALSE); /* sleep 50ms */ + } + } + if (alive) +--- 2198,2204 ---- + alive = FALSE; /* cscope process no longer exists */ + break; + } +! mch_delay(50L, FALSE); /* sleep 50ms */ + } + } + if (alive) +*** ../vim-7.1.290/src/version.c Tue Apr 1 17:13:54 2008 +--- src/version.c Tue Apr 1 20:58:11 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 291, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +210. When you get a divorce, you don't care about who gets the children, + but discuss endlessly who can use the email address. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index 8d26375b..5ffd87a2 100644 --- a/README.patches +++ b/README.patches @@ -315,3 +315,11 @@ Individual patches for Vim 7.1: 2094 7.1.281 (after 7.1.279) Vim hangs when cscope doesn't exit 16302 7.1.282 (extra) Win64: Installing context menu, compiler warnings 7633 7.1.283 non-extra part of 7.1.282 + 2258 7.1.284 compiler warnings for functions without prototype + 5787 7.1.285 (extra) Mac: dialog hotkeys don't work + 2045 7.1.286 (after 7.1.103) "w" at end of buffer moves cursor too far + 1859 7.1.287 crash when reversing a list after using it + 3182 7.1.288 (after 7.1.281) cscope leaves behind temp files with gvim + 1979 7.1.289 when EXITFREE is defined and 'acd' is set freed memory is used + 2146 7.1.290 reading unwritten bytes when spell checking with large indent + 1940 7.1.291 compiler warning for int-long conversion diff --git a/vim.spec b/vim.spec index 016f6b25..a0bc45b2 100644 --- a/vim.spec +++ b/vim.spec @@ -18,13 +18,13 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 283 +%define patchlevel 291 Summary: The VIM editor URL: http://www.vim.org/ Name: vim Version: %{baseversion}.%{beta}%{patchlevel} -Release: 2%{?dist} +Release: 1%{?dist} License: Vim Group: Applications/Editors Source0: ftp://ftp.vim.org/pub/vim/unix/vim-%{baseversion}%{?beta}%{?CVSDATE}.tar.bz2 @@ -338,6 +338,14 @@ Patch280: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.280 Patch281: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.281 Patch282: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.282 Patch283: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.283 +Patch284: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.284 +Patch285: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.285 +Patch286: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.286 +Patch287: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.287 +Patch288: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.288 +Patch289: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.289 +Patch290: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.290 +Patch291: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.291 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch @@ -760,6 +768,14 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch281 -p0 %patch282 -p0 %patch283 -p0 +%patch284 -p0 +%patch285 -p0 +%patch286 -p0 +%patch287 -p0 +%patch288 -p0 +%patch289 -p0 +%patch290 -p0 +%patch291 -p0 # install spell files @@ -1164,6 +1180,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Wed Apr 02 2008 Karsten Hopp 7.1.291-1 +- patchlevel 291, more fixes for leftover /tmp/cscope* files + * Tue Mar 18 2008 Tom "spot" Callaway 7.1.283-2 - add Requires for versioned perl (libperl.so) From 0e5df63b76a95c5417218b4ae204211b5654c202 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Fri, 11 Apr 2008 09:17:14 +0000 Subject: [PATCH 63/71] - patchlevel 292 --- 7.1.292 | 251 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 7.1.292 diff --git a/7.1.292 b/7.1.292 new file mode 100644 index 00000000..2ebecfcc --- /dev/null +++ b/7.1.292 @@ -0,0 +1,251 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.292 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.292 +Problem: When using a pattern with "\@<=" the submatches can be wrong. + (Brett Stahlman) +Solution: Save the submatches when attempting a look-behind match. +Files: src/regexp.c + + +*** ../vim-7.1.291/src/regexp.c Sat Jan 19 15:55:51 2008 +--- src/regexp.c Tue Apr 1 18:15:47 2008 +*************** +*** 3039,3044 **** +--- 3039,3053 ---- + } se_u; + } save_se_T; + ++ /* used for BEHIND and NOBEHIND matching */ ++ typedef struct regbehind_S ++ { ++ regsave_T save_after; ++ regsave_T save_behind; ++ save_se_T save_start[NSUBEXP]; ++ save_se_T save_end[NSUBEXP]; ++ } regbehind_T; ++ + static char_u *reg_getline __ARGS((linenr_T lnum)); + static long vim_regexec_both __ARGS((char_u *line, colnr_T col, proftime_T *tm)); + static long regtry __ARGS((regprog_T *prog, colnr_T col)); +*************** +*** 3046,3051 **** +--- 3055,3062 ---- + #ifdef FEAT_SYN_HL + static void cleanup_zsubexpr __ARGS((void)); + #endif ++ static void save_subexpr __ARGS((regbehind_T *bp)); ++ static void restore_subexpr __ARGS((regbehind_T *bp)); + static void reg_nextline __ARGS((void)); + static void reg_save __ARGS((regsave_T *save, garray_T *gap)); + static void reg_restore __ARGS((regsave_T *save, garray_T *gap)); +*************** +*** 3166,3184 **** + save_se_T sesave; + regsave_T regsave; + } rs_un; /* room for saving reginput */ +! short rs_no; /* submatch nr */ + } regitem_T; + + static regitem_T *regstack_push __ARGS((regstate_T state, char_u *scan)); + static void regstack_pop __ARGS((char_u **scan)); + +- /* used for BEHIND and NOBEHIND matching */ +- typedef struct regbehind_S +- { +- regsave_T save_after; +- regsave_T save_behind; +- } regbehind_T; +- + /* used for STAR, PLUS and BRACE_SIMPLE matching */ + typedef struct regstar_S + { +--- 3177,3188 ---- + save_se_T sesave; + regsave_T regsave; + } rs_un; /* room for saving reginput */ +! short rs_no; /* submatch nr or BEHIND/NOBEHIND */ + } regitem_T; + + static regitem_T *regstack_push __ARGS((regstate_T state, char_u *scan)); + static void regstack_pop __ARGS((char_u **scan)); + + /* used for STAR, PLUS and BRACE_SIMPLE matching */ + typedef struct regstar_S + { +*************** +*** 4888,4893 **** +--- 4892,4901 ---- + status = RA_FAIL; + else + { ++ /* Need to save the subexpr to be able to restore them ++ * when there is a match but we don't use it. */ ++ save_subexpr(((regbehind_T *)rp) - 1); ++ + rp->rs_no = op; + reg_save(&rp->rs_un.regsave, &backpos); + /* First try if what follows matches. If it does then we +*************** +*** 5118,5132 **** + reg_restore(&(((regbehind_T *)rp) - 1)->save_after, + &backpos); + else +! /* But we didn't want a match. */ + status = RA_NOMATCH; + regstack_pop(&scan); + regstack.ga_len -= sizeof(regbehind_T); + } + else + { +! /* No match: Go back one character. May go to previous +! * line once. */ + no = OK; + if (REG_MULTI) + { +--- 5126,5145 ---- + reg_restore(&(((regbehind_T *)rp) - 1)->save_after, + &backpos); + else +! { +! /* But we didn't want a match. Need to restore the +! * subexpr, because what follows matched, so they have +! * been set. */ + status = RA_NOMATCH; ++ restore_subexpr(((regbehind_T *)rp) - 1); ++ } + regstack_pop(&scan); + regstack.ga_len -= sizeof(regbehind_T); + } + else + { +! /* No match or a match that doesn't end where we want it: Go +! * back one character. May go to previous line once. */ + no = OK; + if (REG_MULTI) + { +*************** +*** 5160,5165 **** +--- 5173,5185 ---- + /* Advanced, prepare for finding match again. */ + reg_restore(&rp->rs_un.regsave, &backpos); + scan = OPERAND(rp->rs_scan); ++ if (status == RA_MATCH) ++ { ++ /* We did match, so subexpr may have been changed, ++ * need to restore them for the next try. */ ++ status = RA_NOMATCH; ++ restore_subexpr(((regbehind_T *)rp) - 1); ++ } + } + else + { +*************** +*** 5172,5178 **** + status = RA_MATCH; + } + else +! status = RA_NOMATCH; + regstack_pop(&scan); + regstack.ga_len -= sizeof(regbehind_T); + } +--- 5192,5207 ---- + status = RA_MATCH; + } + else +! { +! /* We do want a proper match. Need to restore the +! * subexpr if we had a match, because they may have +! * been set. */ +! if (status == RA_MATCH) +! { +! status = RA_NOMATCH; +! restore_subexpr(((regbehind_T *)rp) - 1); +! } +! } + regstack_pop(&scan); + regstack.ga_len -= sizeof(regbehind_T); + } +*************** +*** 5820,5825 **** +--- 5849,5903 ---- + #endif + + /* ++ * Save the current subexpr to "bp", so that they can be restored ++ * later by restore_subexpr(). ++ */ ++ static void ++ save_subexpr(bp) ++ regbehind_T *bp; ++ { ++ int i; ++ ++ for (i = 0; i < NSUBEXP; ++i) ++ { ++ if (REG_MULTI) ++ { ++ bp->save_start[i].se_u.pos = reg_startpos[i]; ++ bp->save_end[i].se_u.pos = reg_endpos[i]; ++ } ++ else ++ { ++ bp->save_start[i].se_u.ptr = reg_startp[i]; ++ bp->save_end[i].se_u.ptr = reg_endp[i]; ++ } ++ } ++ } ++ ++ /* ++ * Restore the subexpr from "bp". ++ */ ++ static void ++ restore_subexpr(bp) ++ regbehind_T *bp; ++ { ++ int i; ++ ++ for (i = 0; i < NSUBEXP; ++i) ++ { ++ if (REG_MULTI) ++ { ++ reg_startpos[i] = bp->save_start[i].se_u.pos; ++ reg_endpos[i] = bp->save_end[i].se_u.pos; ++ } ++ else ++ { ++ reg_startp[i] = bp->save_start[i].se_u.ptr; ++ reg_endp[i] = bp->save_end[i].se_u.ptr; ++ } ++ } ++ } ++ ++ /* + * Advance reglnum, regline and reginput to the next line. + */ + static void +*** ../vim-7.1.291/src/version.c Tue Apr 1 20:58:23 2008 +--- src/version.c Wed Apr 9 12:12:33 2008 +*************** +*** 668,669 **** +--- 673,676 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 292, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +259. When you enter your name in the AltaVista search engine, the top ten + matches do indeed refer to you. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// From 6d326c7e0d4c38797004ace357662a45f3bd3e41 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Fri, 11 Apr 2008 09:17:31 +0000 Subject: [PATCH 64/71] - patchlevel 293 --- 7.1.293 | 118 +++++++++++++++++++++++++++++++++++++++++++++++++ README.patches | 2 + 2 files changed, 120 insertions(+) create mode 100644 7.1.293 diff --git a/7.1.293 b/7.1.293 new file mode 100644 index 00000000..df4499c5 --- /dev/null +++ b/7.1.293 @@ -0,0 +1,118 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.293 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.293 +Problem: Spell checking considers super- and subscript characters as word + characters. +Solution: Recognize the Unicode super and subscript characters. +Files: src/spell.c + + +*** ../vim-7.1.292/src/spell.c Tue Apr 1 17:13:54 2008 +--- src/spell.c Wed Apr 9 15:47:06 2008 +*************** +*** 753,758 **** +--- 753,759 ---- + static int spell_iswordp __ARGS((char_u *p, buf_T *buf)); + static int spell_iswordp_nmw __ARGS((char_u *p)); + #ifdef FEAT_MBYTE ++ static int spell_mb_isword_class __ARGS((int cl)); + static int spell_iswordp_w __ARGS((int *p, buf_T *buf)); + #endif + static int write_spell_prefcond __ARGS((FILE *fd, garray_T *gap)); +*************** +*** 9789,9795 **** + + c = mb_ptr2char(s); + if (c > 255) +! return mb_get_class(s) >= 2; + return spelltab.st_isw[c]; + } + #endif +--- 9790,9796 ---- + + c = mb_ptr2char(s); + if (c > 255) +! return spell_mb_isword_class(mb_get_class(s)); + return spelltab.st_isw[c]; + } + #endif +*************** +*** 9812,9818 **** + { + c = mb_ptr2char(p); + if (c > 255) +! return mb_get_class(p) >= 2; + return spelltab.st_isw[c]; + } + #endif +--- 9813,9819 ---- + { + c = mb_ptr2char(p); + if (c > 255) +! return spell_mb_isword_class(mb_get_class(p)); + return spelltab.st_isw[c]; + } + #endif +*************** +*** 9821,9826 **** +--- 9822,9839 ---- + + #ifdef FEAT_MBYTE + /* ++ * Return TRUE if word class indicates a word character. ++ * Only for characters above 255. ++ * Unicode subscript and superscript are not considered word characters. ++ */ ++ static int ++ spell_mb_isword_class(cl) ++ int cl; ++ { ++ return cl >= 2 && cl != 0x2070 && cl != 0x2080; ++ } ++ ++ /* + * Return TRUE if "p" points to a word character. + * Wide version of spell_iswordp(). + */ +*************** +*** 9841,9847 **** + if (*s > 255) + { + if (enc_utf8) +! return utf_class(*s) >= 2; + if (enc_dbcs) + return dbcs_class((unsigned)*s >> 8, *s & 0xff) >= 2; + return 0; +--- 9854,9860 ---- + if (*s > 255) + { + if (enc_utf8) +! return spell_mb_isword_class(utf_class(*s)); + if (enc_dbcs) + return dbcs_class((unsigned)*s >> 8, *s & 0xff) >= 2; + return 0; +*** ../vim-7.1.292/src/version.c Wed Apr 9 12:14:44 2008 +--- src/version.c Wed Apr 9 15:45:10 2008 +*************** +*** 668,669 **** +--- 673,676 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 293, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +268. You get up in the morning and go online before getting your coffee. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index 5ffd87a2..98a14bc6 100644 --- a/README.patches +++ b/README.patches @@ -323,3 +323,5 @@ Individual patches for Vim 7.1: 1979 7.1.289 when EXITFREE is defined and 'acd' is set freed memory is used 2146 7.1.290 reading unwritten bytes when spell checking with large indent 1940 7.1.291 compiler warning for int-long conversion + 6698 7.1.292 when using a pattern with "\@<=" the submatches can be wrong + 3087 7.1.293 spell checking considers super/subscript chars as word chars From d6b34b9bf22572cac5a61fef8f3c5993315cb7e8 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Fri, 11 Apr 2008 09:18:35 +0000 Subject: [PATCH 65/71] - update forth syntax file --- forth.vim | 329 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100644 forth.vim diff --git a/forth.vim b/forth.vim new file mode 100644 index 00000000..8713a721 --- /dev/null +++ b/forth.vim @@ -0,0 +1,329 @@ +" Vim syntax file +" Language: FORTH +" Maintainer: Christian V. J. Brüssow +" Last Change: Sa 09 Feb 2008 13:27:29 CET +" Filenames: *.fs,*.ft +" URL: http://www.cvjb.de/comp/vim/forth.vim + +" $Id$ + +" The list of keywords is incomplete, compared with the offical ANS +" wordlist. If you use this language, please improve it, and send me +" the patches. +" +" Before sending me patches, please download the newest version of this file +" from http://www.cvjb.de/comp/vim/forth.vim or http://www.vim.org/ (search +" for forth.vim). + +" Many Thanks to... +" +" 2008-02-09: +" Shawn K. Quinn send a big patch with +" new words commonly used in Forth programs or defined by GNU Forth. +" +" 2007-07-11: +" Benjamin Krill send me a patch +" to highlight space errors. +" You can toggle this feature on through setting the +" flag forth_space_errors in you vimrc. If you have switched it on, +" you can turn off highlighting of trailing spaces in comments by +" setting forth_no_trail_space_error in your vimrc. If you do not want +" the highlighting of a tabulator following a space in comments, you +" can turn this off by setting forth_no_tab_space_error. +" +" 2006-05-25: +" Bill McCarthy and Ilya Sher +" Who found a bug in the ccomment line in 2004!!! +" I'm really very sorry, that it has taken two years to fix that +" in the offical version of this file. Shame on me. +" I think my face will be red the next ten years... +" +" 2006-05-21: +" Thomas E. Vaughan send me a patch +" for the parenthesis comment word, so words with a trailing +" parenthesis will not start the highlighting for such comments. +" +" 2003-05-10: +" Andrew Gaul send me a patch for +" forthOperators. +" +" 2003-04-03: +" Ron Aaron made updates for an +" improved Win32Forth support. +" +" 2002-04-22: +" Charles Shattuck helped me to settle up with the +" binary and hex number highlighting. +" +" 2002-04-20: +" Charles Shattuck send me some code for correctly +" highlighting char and [char] followed by an opening paren. He also added +" some words for operators, conditionals, and definitions; and added the +" highlighting for s" and c". +" +" 2000-03-28: +" John Providenza made improvements for the +" highlighting of strings, and added the code for highlighting hex numbers. +" + + +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +" Synchronization method +syn sync ccomment +syn sync maxlines=200 + +" I use gforth, so I set this to case ignore +syn case ignore + +" Some special, non-FORTH keywords +syn keyword forthTodo contained TODO FIXME XXX +syn match forthTodo contained 'Copyright\(\s([Cc])\)\=\(\s[0-9]\{2,4}\)\=' + +" Characters allowed in keywords +" I don't know if 128-255 are allowed in ANS-FORTH +if version >= 600 + setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255 +else + set iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255 +endif + +" when wanted, highlight trailing white space +if exists("forth_space_errors") + if !exists("forth_no_trail_space_error") + syn match forthSpaceError display excludenl "\s\+$" + endif + if !exists("forth_no_tab_space_error") + syn match forthSpaceError display " \+\t"me=e-1 + endif +endif + +" Keywords + +" basic mathematical and logical operators +syn keyword forthOperators + - * / MOD /MOD NEGATE ABS MIN MAX +syn keyword forthOperators AND OR XOR NOT LSHIFT RSHIFT INVERT 2* 2/ 1+ +syn keyword forthOperators 1- 2+ 2- 8* UNDER+ +syn keyword forthOperators M+ */ */MOD M* UM* M*/ UM/MOD FM/MOD SM/REM +syn keyword forthOperators D+ D- DNEGATE DABS DMIN DMAX D2* D2/ +syn keyword forthOperators F+ F- F* F/ FNEGATE FABS FMAX FMIN FLOOR FROUND +syn keyword forthOperators F** FSQRT FEXP FEXPM1 FLN FLNP1 FLOG FALOG FSIN +syn keyword forthOperators FCOS FSINCOS FTAN FASIN FACOS FATAN FATAN2 FSINH +syn keyword forthOperators FCOSH FTANH FASINH FACOSH FATANH F2* F2/ 1/F +syn keyword forthOperators F~REL F~ABS F~ +syn keyword forthOperators 0< 0<= 0<> 0= 0> 0>= < <= <> = > >= U< U<= +syn keyword forthOperators U> U>= D0< D0<= D0<> D0= D0> D0>= D< D<= D<> +syn keyword forthOperators D= D> D>= DU< DU<= DU> DU>= WITHIN ?NEGATE +syn keyword forthOperators ?DNEGATE + +" stack manipulations +syn keyword forthStack DROP NIP DUP OVER TUCK SWAP ROT -ROT ?DUP PICK ROLL +syn keyword forthStack 2DROP 2NIP 2DUP 2OVER 2TUCK 2SWAP 2ROT 2-ROT +syn keyword forthStack 3DUP 4DUP 5DUP 3DROP 4DROP 5DROP 8DROP 4SWAP 4ROT +syn keyword forthStack 4-ROT 4TUCK 8SWAP 8DUP +syn keyword forthRStack >R R> R@ RDROP 2>R 2R> 2R@ 2RDROP +syn keyword forthRstack 4>R 4R> 4R@ 4RDROP +syn keyword forthFStack FDROP FNIP FDUP FOVER FTUCK FSWAP FROT + +" stack pointer manipulations +syn keyword forthSP SP@ SP! FP@ FP! RP@ RP! LP@ LP! + +" address operations +syn keyword forthMemory @ ! +! C@ C! 2@ 2! F@ F! SF@ SF! DF@ DF! +syn keyword forthAdrArith CHARS CHAR+ CELLS CELL+ CELL ALIGN ALIGNED FLOATS +syn keyword forthAdrArith FLOAT+ FLOAT FALIGN FALIGNED SFLOATS SFLOAT+ +syn keyword forthAdrArith SFALIGN SFALIGNED DFLOATS DFLOAT+ DFALIGN DFALIGNED +syn keyword forthAdrArith MAXALIGN MAXALIGNED CFALIGN CFALIGNED +syn keyword forthAdrArith ADDRESS-UNIT-BITS ALLOT ALLOCATE HERE +syn keyword forthMemBlks MOVE ERASE CMOVE CMOVE> FILL BLANK + +" conditionals +syn keyword forthCond IF ELSE ENDIF THEN CASE OF ENDOF ENDCASE ?DUP-IF +syn keyword forthCond ?DUP-0=-IF AHEAD CS-PICK CS-ROLL CATCH THROW WITHIN + +" iterations +syn keyword forthLoop BEGIN WHILE REPEAT UNTIL AGAIN +syn keyword forthLoop ?DO LOOP I J K +DO U+DO -DO U-DO DO +LOOP -LOOP +syn keyword forthLoop UNLOOP LEAVE ?LEAVE EXIT DONE FOR NEXT + +" new words +syn match forthClassDef '\<:class\s*[^ \t]\+\>' +syn match forthObjectDef '\<:object\s*[^ \t]\+\>' +syn match forthColonDef '\<:m\?\s*[^ \t]\+\>' +syn keyword forthEndOfColonDef ; ;M ;m +syn keyword forthEndOfClassDef ;class +syn keyword forthEndOfObjectDef ;object +syn keyword forthDefine CONSTANT 2CONSTANT FCONSTANT VARIABLE 2VARIABLE +syn keyword forthDefine FVARIABLE CREATE USER VALUE TO DEFER IS DOES> IMMEDIATE +syn keyword forthDefine COMPILE-ONLY COMPILE RESTRICT INTERPRET POSTPONE EXECUTE +syn keyword forthDefine LITERAL CREATE-INTERPRET/COMPILE INTERPRETATION> +syn keyword forthDefine INT NAME?INT NAME>COMP +syn keyword forthDefine NAME>STRING STATE C; CVARIABLE +syn keyword forthDefine , 2, F, C, +syn match forthDefine "\[IFDEF]" +syn match forthDefine "\[IFUNDEF]" +syn match forthDefine "\[THEN]" +syn match forthDefine "\[ENDIF]" +syn match forthDefine "\[ELSE]" +syn match forthDefine "\[?DO]" +syn match forthDefine "\[DO]" +syn match forthDefine "\[LOOP]" +syn match forthDefine "\[+LOOP]" +syn match forthDefine "\[NEXT]" +syn match forthDefine "\[BEGIN]" +syn match forthDefine "\[UNTIL]" +syn match forthDefine "\[AGAIN]" +syn match forthDefine "\[WHILE]" +syn match forthDefine "\[REPEAT]" +syn match forthDefine "\[COMP']" +syn match forthDefine "'" +syn match forthDefine '\<\[\>' +syn match forthDefine "\[']" +syn match forthDefine '\[COMPILE]' + +" debugging +syn keyword forthDebug PRINTDEBUGDATA PRINTDEBUGLINE +syn match forthDebug "\<\~\~\>" + +" Assembler +syn keyword forthAssembler ASSEMBLER CODE END-CODE ;CODE FLUSH-ICACHE C, + +" basic character operations +syn keyword forthCharOps (.) CHAR EXPECT FIND WORD TYPE -TRAILING EMIT KEY +syn keyword forthCharOps KEY? TIB CR +" recognize 'char (' or '[char] (' correctly, so it doesn't +" highlight everything after the paren as a comment till a closing ')' +syn match forthCharOps '\ #>> #S (NUMBER) (NUMBER?) CONVERT D>F +syn keyword forthConversion D>S DIGIT DPL F>D HLD HOLD NUMBER S>D SIGN >NUMBER +syn keyword forthConversion F>S S>F + +" interptreter, wordbook, compiler +syn keyword forthForth (LOCAL) BYE COLD ABORT >BODY >NEXT >LINK CFA >VIEW HERE +syn keyword forthForth PAD WORDS VIEW VIEW> N>LINK NAME> LINK> L>NAME FORGET +syn keyword forthForth BODY> ASSERT( ASSERT0( ASSERT1( ASSERT2( ASSERT3( ) +syn region forthForth start=+ABORT"\s+ skip=+\\"+ end=+"+ + +" vocabularies +syn keyword forthVocs ONLY FORTH ALSO ROOT SEAL VOCS ORDER CONTEXT #VOCS +syn keyword forthVocs VOCABULARY DEFINITIONS + +" File keywords +syn keyword forthFileMode R/O R/W W/O BIN +syn keyword forthFileWords OPEN-FILE CREATE-FILE CLOSE-FILE DELETE-FILE +syn keyword forthFileWords RENAME-FILE READ-FILE READ-LINE KEY-FILE +syn keyword forthFileWords KEY?-FILE WRITE-FILE WRITE-LINE EMIT-FILE +syn keyword forthFileWords FLUSH-FILE FILE-STATUS FILE-POSITION +syn keyword forthFileWords REPOSITION-FILE FILE-SIZE RESIZE-FILE +syn keyword forthFileWords SLURP-FILE SLURP-FID STDIN STDOUT STDERR +syn keyword forthBlocks OPEN-BLOCKS USE LOAD --> BLOCK-OFFSET +syn keyword forthBlocks GET-BLOCK-FID BLOCK-POSITION LIST SCR BLOCK +syn keyword forthBlocks BUFER EMPTY-BUFFERS EMPTY-BUFFER UPDATE UPDATED? +syn keyword forthBlocks SAVE-BUFFERS SAVE-BUFFER FLUSH THRU +LOAD +THRU +syn keyword forthBlocks BLOCK-INCLUDED + +" numbers +syn keyword forthMath DECIMAL HEX BASE +syn match forthInteger '\<-\=[0-9.]*[0-9.]\+\>' +syn match forthInteger '\<&-\=[0-9.]*[0-9.]\+\>' +" recognize hex and binary numbers, the '$' and '%' notation is for gforth +syn match forthInteger '\<\$\x*\x\+\>' " *1* --- dont't mess +syn match forthInteger '\<\x*\d\x*\>' " *2* --- this order! +syn match forthInteger '\<%[0-1]*[0-1]\+\>' +syn match forthFloat '\<-\=\d*[.]\=\d\+[DdEe]\d\+\>' +syn match forthFloat '\<-\=\d*[.]\=\d\+[DdEe][-+]\d\+\>' + +" XXX If you find this overkill you can remove it. this has to come after the +" highlighting for numbers otherwise it has no effect. +syn region forthComment start='0 \[if\]' end='\[endif\]' end='\[then\]' contains=forthTodo + +" Strings +syn region forthString start=+\.*\"+ end=+"+ end=+$+ +" XXX +syn region forthString start=+s\"+ end=+"+ end=+$+ +syn region forthString start=+c\"+ end=+"+ end=+$+ + +" Comments +syn match forthComment '\\\s.*$' contains=forthTodo,forthSpaceError +syn region forthComment start='\\S\s' end='.*' contains=forthTodo,forthSpaceError +syn match forthComment '\.(\s[^)]*)' contains=forthTodo,forthSpaceError +syn region forthComment start='\s(\s' skip='\\)' end=')' contains=forthTodo,forthSpaceError +syn region forthComment start='/\*' end='\*/' contains=forthTodo,forthSpaceError + +" Include files +syn match forthInclude '^INCLUDE\s\+\k\+' +syn match forthInclude '^require\s\+\k\+' +syn match forthInclude '^fload\s\+' +syn match forthInclude '^needs\s\+' + +" Locals definitions +syn region forthLocals start='{\s' start='{$' end='\s}' end='^}' +syn match forthLocals '{ }' " otherwise, at least two spaces between +syn region forthDeprecated start='locals|' end='|' + +" Define the default highlighting. +" For version 5.7 and earlier: only when not done already +" For version 5.8 and later: only when an item doesn't have highlighting yet +if version >= 508 || !exists("did_forth_syn_inits") + if version < 508 + let did_forth_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + " The default methods for highlighting. Can be overriden later. + HiLink forthTodo Todo + HiLink forthOperators Operator + HiLink forthMath Number + HiLink forthInteger Number + HiLink forthFloat Float + HiLink forthStack Special + HiLink forthRstack Special + HiLink forthFStack Special + HiLink forthSP Special + HiLink forthMemory Function + HiLink forthAdrArith Function + HiLink forthMemBlks Function + HiLink forthCond Conditional + HiLink forthLoop Repeat + HiLink forthColonDef Define + HiLink forthEndOfColonDef Define + HiLink forthDefine Define + HiLink forthDebug Debug + HiLink forthAssembler Include + HiLink forthCharOps Character + HiLink forthConversion String + HiLink forthForth Statement + HiLink forthVocs Statement + HiLink forthString String + HiLink forthComment Comment + HiLink forthClassDef Define + HiLink forthEndOfClassDef Define + HiLink forthObjectDef Define + HiLink forthEndOfObjectDef Define + HiLink forthInclude Include + HiLink forthLocals Type " nothing else uses type and locals must stand out + HiLink forthDeprecated Error " if you must, change to Type + HiLink forthFileMode Function + HiLink forthFileWords Statement + HiLink forthBlocks Statement + HiLink forthSpaceError Error + + delcommand HiLink +endif + +let b:current_syntax = "forth" + +" vim:ts=8:sw=4:nocindent:smartindent: From 87c2150ade1285f108ed9b7d0b26c3f9c7bc5010 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Fri, 11 Apr 2008 09:19:21 +0000 Subject: [PATCH 66/71] - patchlevel 293 - update forth syntax file (Benjamin Krill) --- vim.spec | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/vim.spec b/vim.spec index a0bc45b2..c2576d54 100644 --- a/vim.spec +++ b/vim.spec @@ -18,7 +18,7 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 291 +%define patchlevel 293 Summary: The VIM editor URL: http://www.vim.org/ @@ -43,6 +43,7 @@ Source12: vi_help.txt Source13: vim-spell-files.tar.bz2 %endif Source14: spec-template +Source15: http://www.cvjb.de/comp/vim/forth.vim Patch2002: vim-7.0-fixkeys.patch Patch2003: vim-6.2-specsyntax.patch @@ -346,6 +347,8 @@ Patch288: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.288 Patch289: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.289 Patch290: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.290 Patch291: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.291 +Patch292: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.292 +Patch293: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.293 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch @@ -776,6 +779,8 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch289 -p0 %patch290 -p0 %patch291 -p0 +%patch292 -p0 +%patch293 -p0 # install spell files @@ -802,6 +807,7 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch3100 -p1 %patch3101 -p1 %endif +cp -f %{SOURCE15} runtime/syntax/forth.vim %build @@ -1180,6 +1186,10 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Fri Apr 11 2008 Karsten Hopp 7.1.293-1 +- patchlevel 293 +- update forth syntax file (Benjamin Krill) + * Wed Apr 02 2008 Karsten Hopp 7.1.291-1 - patchlevel 291, more fixes for leftover /tmp/cscope* files From 177672cf9dde4136d4afe4ad07536fb1cf9d7e73 Mon Sep 17 00:00:00 2001 From: Jesse Keating Date: Tue, 22 Apr 2008 00:41:58 +0000 Subject: [PATCH 67/71] Initialize branch F-9 for vim --- branch | 1 + 1 file changed, 1 insertion(+) create mode 100644 branch diff --git a/branch b/branch new file mode 100644 index 00000000..1c26f782 --- /dev/null +++ b/branch @@ -0,0 +1 @@ +F-9 From 37ff1fb4d6310ffa4ef628aba35314908c29d789 Mon Sep 17 00:00:00 2001 From: Dennis Gilmore Date: Sun, 25 May 2008 14:53:35 +0000 Subject: [PATCH 68/71] minor sparc rebuild --- vim.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vim.spec b/vim.spec index c2576d54..32aae062 100644 --- a/vim.spec +++ b/vim.spec @@ -24,7 +24,7 @@ Summary: The VIM editor URL: http://www.vim.org/ Name: vim Version: %{baseversion}.%{beta}%{patchlevel} -Release: 1%{?dist} +Release: 1%{?dist}.1 License: Vim Group: Applications/Editors Source0: ftp://ftp.vim.org/pub/vim/unix/vim-%{baseversion}%{?beta}%{?CVSDATE}.tar.bz2 @@ -1186,6 +1186,9 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Sun May 25 2008 Dennis Gilmore 7.1.293-1.1 +- minor rebuild for sparc + * Fri Apr 11 2008 Karsten Hopp 7.1.293-1 - patchlevel 293 - update forth syntax file (Benjamin Krill) From e688175e508458e852f83f14aa261a79340475c0 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Mon, 1 Dec 2008 15:06:23 +0000 Subject: [PATCH 69/71] update to vim-7.2 patchlevel 60 --- .cvsignore | 6 +- 7.1.001 | 75 - 7.1.002 | 69 - 7.1.003 | 48 - 7.1.004 | 73 - 7.1.005 | 149 - 7.1.006 | 85 - 7.1.007 | 221 - 7.1.008 | 82 - 7.1.009 | 58 - 7.1.010 | 75 - 7.1.011 | 58 - 7.1.012 | 62 - 7.1.013 | 60 - 7.1.014 | 46 - 7.1.015 | 97 - 7.1.016 | 72 - 7.1.017 | 212 - 7.1.018 | 60 - 7.1.019 | 55 - 7.1.020 | 115 - 7.1.021 | 92 - 7.1.022 | 67 - 7.1.023 | 54 - 7.1.024 | 47 - 7.1.025 | 72 - 7.1.026 | 55 - 7.1.027 | 120 - 7.1.028 | 71 - 7.1.029 | 84 - 7.1.030 | 80 - 7.1.031 | 191 - 7.1.032 | 97 - 7.1.033 | 48 - 7.1.034 | 116 - 7.1.035 | 52 - 7.1.036 | 461 - 7.1.037 | 57 - 7.1.038 | 205 - 7.1.039 | 57 - 7.1.040 | 1843 ---- 7.1.041 | 133 - 7.1.042 | 75 - 7.1.043 | 103 - 7.1.044 | 54 - 7.1.045 | 101 - 7.1.046 | 60 - 7.1.047 | 52 - 7.1.048 | 135 - 7.1.049 | 52 - 7.1.050 | 172 - 7.1.051 | 86 - 7.1.052 | 89 - 7.1.053 | 52 - 7.1.054 | 148 - 7.1.055 | 216 - 7.1.056 | 106 - 7.1.057 | 91 - 7.1.058 | 397 - 7.1.059 | 104 - 7.1.060 | 176 - 7.1.061 | 222 - 7.1.062 | 55 - 7.1.063 | 52 - 7.1.064 | 50 - 7.1.065 | 113 - 7.1.066 | 152 - 7.1.067 | 302 - 7.1.068 | 206 - 7.1.069 | 82 - 7.1.070 | 49 - 7.1.071 | 169 - 7.1.072 | 177 - 7.1.073 | 113 - 7.1.074 | 171 - 7.1.075 | 55 - 7.1.076 | 74 - 7.1.077 | 50 - 7.1.078 | 86 - 7.1.079 | 84 - 7.1.080 | 104 - 7.1.081 | 143 - 7.1.082 | 107 - 7.1.083 | 123 - 7.1.084 | 53 - 7.1.085 | 85 - 7.1.086 | 123 - 7.1.087 | 151 - 7.1.088 | 70 - 7.1.089 | 494 - 7.1.090 | 75 - 7.1.091 | 355 - 7.1.092 | 92 - 7.1.093 | 551 -- 7.1.094 | 58 - 7.1.095 | 210 - 7.1.096 | 89 - 7.1.097 | 51 - 7.1.098 | 65 - 7.1.099 | 137 - 7.1.100 | 513 -- 7.1.101 | 53 - 7.1.102 | 103 - 7.1.103 | 57 - 7.1.104 | 538 -- 7.1.105 | 86 - 7.1.106 | 53 - 7.1.107 | 130 - 7.1.108 | 78 - 7.1.109 | 69 - 7.1.110 | 66 - 7.1.111 | 105 - 7.1.112 | 64 - 7.1.113 | 114 - 7.1.114 | 44 - 7.1.115 | 51 - 7.1.116 | 119 - 7.1.117 | 49 - 7.1.118 | 53 - 7.1.119 | 59 - 7.1.120 | 558 -- 7.1.121 | 81 - 7.1.122 | 98 - 7.1.123 | 259 - 7.1.124 | 82 - 7.1.125 | 454 - 7.1.126 | 469 - 7.1.127 | 78 - 7.1.128 | 67 - 7.1.129 | 56 - 7.1.130 | 363 - 7.1.131 | 50 - 7.1.132 | 54 - 7.1.133 | 56 - 7.1.134 | 377 - 7.1.135 | 106 - 7.1.136 | 47 - 7.1.137 | 49 - 7.1.138 | 66 - 7.1.139 | 54 - 7.1.140 | 52 - 7.1.141 | 97 - 7.1.142 | 77 - 7.1.143 | 54 - 7.1.144 | 46 - 7.1.145 | 171 - 7.1.146 | 92 - 7.1.147 | 75 - 7.1.148 | 73 - 7.1.149 | 180 - 7.1.150 | 59 - 7.1.151 | 70 - 7.1.152 | 118 - 7.1.153 | 143 - 7.1.154 | 52 - 7.1.155 | 53 - 7.1.156 | 121 - 7.1.157 | 55 - 7.1.158 | 157 - 7.1.159 | 54 - 7.1.160 | 54 - 7.1.161 | 176 - 7.1.162 | 172 - 7.1.163 | 72 - 7.1.164 | 52 - 7.1.165 | 177 - 7.1.166 | 80 - 7.1.167 | 80 - 7.1.168 | 112 - 7.1.169 | 75 - 7.1.170 | 58 - 7.1.171 | 79 - 7.1.172 | 50 - 7.1.173 | 61 - 7.1.174 | 71 - 7.1.175 | 179 - 7.1.176 | 88 - 7.1.177 | 193 - 7.1.178 | 54 - 7.1.179 | 189 - 7.1.180 | 266 - 7.1.181 | 62 - 7.1.182 | 169 - 7.1.183 | 99 - 7.1.184 | 63 - 7.1.185 | 140 - 7.1.186 | 111 - 7.1.187 | 81 - 7.1.188 | 54 - 7.1.189 | 76 - 7.1.190 | 55 - 7.1.191 | 61 - 7.1.192 | 79 - 7.1.193 | 100 - 7.1.194 | 55 - 7.1.195 | 75 - 7.1.196 | 90 - 7.1.197 | 62 - 7.1.198 | 51 - 7.1.199 | 105 - 7.1.200 | 74 - 7.1.201 | 87 - 7.1.202 | 83 - 7.1.203 | 68 - 7.1.204 | 74 - 7.1.205 | 181 - 7.1.206 | 59 - 7.1.207 | 253 - 7.1.208 | 69 - 7.1.209 | 71 - 7.1.210 | 74 - 7.1.211 | 748 -- 7.1.212 | 47 - 7.1.213 | 57 - 7.1.214 | 266 - 7.1.215 | 198 - 7.1.216 | 55 - 7.1.217 | 228 - 7.1.218 | 58 - 7.1.219 | 378 - 7.1.220 | 136 - 7.1.221 | 58 - 7.1.222 | 135 - 7.1.223 | 263 - 7.1.224 | 73 - 7.1.225 | 55 - 7.1.226 | 68 - 7.1.227 | 188 - 7.1.228 | 51 - 7.1.229 | 55 - 7.1.230 | 64 - 7.1.231 | 291 - 7.1.232 | 70 - 7.1.233 | 109 - 7.1.234 | 210 - 7.1.235 | 199 - 7.1.236 | 920 -- 7.1.237 | 54 - 7.1.238 | 61 - 7.1.239 | 53 - 7.1.240 | 186 - 7.1.241 | 112 - 7.1.242 | 68 - 7.1.243 | 165 - 7.1.244 | 58 - 7.1.245 | 92 - 7.1.246 | 72 - 7.1.247 | 162 - 7.1.248 | 138 - 7.1.249 | 76 - 7.1.250 | 54 - 7.1.251 | 99 - 7.1.252 | 47 - 7.1.253 | 53 - 7.1.254 | 65 - 7.1.255 | 50 - 7.1.256 | 1808 ---- 7.1.257 | 87 - 7.1.258 | 116 - 7.1.259 | 61 - 7.1.260 | 55 - 7.1.261 | 78 - 7.1.262 | 111 - 7.1.263 | 84 - 7.1.264 | 237 - 7.1.265 | 46 - 7.1.266 | 71 - 7.1.267 | 57 - 7.1.268 | 53 - 7.1.269 | 171 - 7.1.270 | 94 - 7.1.271 | 53 - 7.1.272 | 84 - 7.1.273 | 74 - 7.1.274 | 54 - 7.1.275 | 1541 ---- 7.1.276 | 156 - 7.1.277 | 84 - 7.1.278 | 62 - 7.1.279 | 146 - 7.1.280 | 52 - 7.1.281 | 72 - 7.1.282 | 549 -- 7.1.283 | 263 - 7.1.284 | 61 - 7.1.285 | 209 - 7.1.286 | 66 - 7.1.287 | 62 - 7.1.288 | 117 - 7.1.289 | 74 - 7.1.290 | 77 - 7.1.291 | 70 - 7.1.292 | 251 - 7.1.293 | 118 - 7.2.001 | 61 + 7.2.002 | 47 + 7.2.003 | 107 + 7.2.004 | 103 + 7.2.005 | 149 + 7.2.006 | 50 + 7.2.007 | 493 + 7.2.008 | 63 + 7.2.009 | 67 + 7.2.010 | 206 + 7.2.011 | 105 + 7.2.012 | 53 + 7.2.013 | 135 + 7.2.014 | 52 + 7.2.015 | 82 + 7.2.016 | 166 + 7.2.017 | 162 + 7.2.018 | 45 + 7.2.019 | 65 + 7.2.020 | 54 + 7.2.021 | 147 + 7.2.022 | 140 + 7.2.023 | 65 + 7.2.024 | 50 + 7.2.025 | 54 + 7.2.026 | 105 + 7.2.027 | 98 + 7.2.028 | 53 + 7.2.029 | 44 + 7.2.030 | 51 + 7.2.031 | 1281 +++ 7.2.032 | 55 + 7.2.033 | 78 + 7.2.034 | 81 + 7.2.035 | 128 + 7.2.036 | 276 + 7.2.037 | 53 + 7.2.038 | 86 + 7.2.039 | 46 + 7.2.040 | 64 + 7.2.041 | 729 ++ 7.2.042 | 166 + 7.2.043 | 78 + 7.2.044 | 161 + 7.2.045 | 67 + 7.2.046 | 55 + 7.2.047 | 88 + 7.2.048 | 160 + 7.2.049 | 1193 +++ 7.2.050 | 316 + 7.2.051 | 411 + 7.2.052 | 83 + 7.2.053 | 58 + 7.2.054 | 68 + 7.2.055 | 1271 +++ 7.2.056 | 57 + 7.2.057 | 111 + 7.2.058 | 83 + 7.2.059 | 70 + 7.2.060 | 1102 +++ README.patches | 368 +- filetype.vim | 2449 +++++ gzip.vim | 36 + netrw.vim | 8011 +++++++++++++++++ netrwFileHandlers.vim | 361 + netrwPlugin.vim | 159 + netrwSettings.vim | 207 + sources | 6 +- tar.vim | 500 + vim-6.4-cvim.patch | 100 - vim-7.0-vimspelltypo.patch | 11 - vim-7.1-ada.patch | 7018 --------------- vim-7.1-erlang.patch | 12 - vim-6.4-lib64.patch => vim-7.1-lib64.patch | 16 +- ...bsyntax.patch => vim-7.2-fstabsyntax.patch | 13 +- vim-selinux.patch | 143 - vim-selinux2.patch | 11 - vim.spec | 1109 +-- zip.vim | 387 + 373 files changed, 23940 insertions(+), 48686 deletions(-) delete mode 100644 7.1.001 delete mode 100644 7.1.002 delete mode 100644 7.1.003 delete mode 100644 7.1.004 delete mode 100644 7.1.005 delete mode 100644 7.1.006 delete mode 100644 7.1.007 delete mode 100644 7.1.008 delete mode 100644 7.1.009 delete mode 100644 7.1.010 delete mode 100644 7.1.011 delete mode 100644 7.1.012 delete mode 100644 7.1.013 delete mode 100644 7.1.014 delete mode 100644 7.1.015 delete mode 100644 7.1.016 delete mode 100644 7.1.017 delete mode 100644 7.1.018 delete mode 100644 7.1.019 delete mode 100644 7.1.020 delete mode 100644 7.1.021 delete mode 100644 7.1.022 delete mode 100644 7.1.023 delete mode 100644 7.1.024 delete mode 100644 7.1.025 delete mode 100644 7.1.026 delete mode 100644 7.1.027 delete mode 100644 7.1.028 delete mode 100644 7.1.029 delete mode 100644 7.1.030 delete mode 100644 7.1.031 delete mode 100644 7.1.032 delete mode 100644 7.1.033 delete mode 100644 7.1.034 delete mode 100644 7.1.035 delete mode 100644 7.1.036 delete mode 100644 7.1.037 delete mode 100644 7.1.038 delete mode 100644 7.1.039 delete mode 100644 7.1.040 delete mode 100644 7.1.041 delete mode 100644 7.1.042 delete mode 100644 7.1.043 delete mode 100644 7.1.044 delete mode 100644 7.1.045 delete mode 100644 7.1.046 delete mode 100644 7.1.047 delete mode 100644 7.1.048 delete mode 100644 7.1.049 delete mode 100644 7.1.050 delete mode 100644 7.1.051 delete mode 100644 7.1.052 delete mode 100644 7.1.053 delete mode 100644 7.1.054 delete mode 100644 7.1.055 delete mode 100644 7.1.056 delete mode 100644 7.1.057 delete mode 100644 7.1.058 delete mode 100644 7.1.059 delete mode 100644 7.1.060 delete mode 100644 7.1.061 delete mode 100644 7.1.062 delete mode 100644 7.1.063 delete mode 100644 7.1.064 delete mode 100644 7.1.065 delete mode 100644 7.1.066 delete mode 100644 7.1.067 delete mode 100644 7.1.068 delete mode 100644 7.1.069 delete mode 100644 7.1.070 delete mode 100644 7.1.071 delete mode 100644 7.1.072 delete mode 100644 7.1.073 delete mode 100644 7.1.074 delete mode 100644 7.1.075 delete mode 100644 7.1.076 delete mode 100644 7.1.077 delete mode 100644 7.1.078 delete mode 100644 7.1.079 delete mode 100644 7.1.080 delete mode 100644 7.1.081 delete mode 100644 7.1.082 delete mode 100644 7.1.083 delete mode 100644 7.1.084 delete mode 100644 7.1.085 delete mode 100644 7.1.086 delete mode 100644 7.1.087 delete mode 100644 7.1.088 delete mode 100644 7.1.089 delete mode 100644 7.1.090 delete mode 100644 7.1.091 delete mode 100644 7.1.092 delete mode 100644 7.1.093 delete mode 100644 7.1.094 delete mode 100644 7.1.095 delete mode 100644 7.1.096 delete mode 100644 7.1.097 delete mode 100644 7.1.098 delete mode 100644 7.1.099 delete mode 100644 7.1.100 delete mode 100644 7.1.101 delete mode 100644 7.1.102 delete mode 100644 7.1.103 delete mode 100644 7.1.104 delete mode 100644 7.1.105 delete mode 100644 7.1.106 delete mode 100644 7.1.107 delete mode 100644 7.1.108 delete mode 100644 7.1.109 delete mode 100644 7.1.110 delete mode 100644 7.1.111 delete mode 100644 7.1.112 delete mode 100644 7.1.113 delete mode 100644 7.1.114 delete mode 100644 7.1.115 delete mode 100644 7.1.116 delete mode 100644 7.1.117 delete mode 100644 7.1.118 delete mode 100644 7.1.119 delete mode 100644 7.1.120 delete mode 100644 7.1.121 delete mode 100644 7.1.122 delete mode 100644 7.1.123 delete mode 100644 7.1.124 delete mode 100644 7.1.125 delete mode 100644 7.1.126 delete mode 100644 7.1.127 delete mode 100644 7.1.128 delete mode 100644 7.1.129 delete mode 100644 7.1.130 delete mode 100644 7.1.131 delete mode 100644 7.1.132 delete mode 100644 7.1.133 delete mode 100644 7.1.134 delete mode 100644 7.1.135 delete mode 100644 7.1.136 delete mode 100644 7.1.137 delete mode 100644 7.1.138 delete mode 100644 7.1.139 delete mode 100644 7.1.140 delete mode 100644 7.1.141 delete mode 100644 7.1.142 delete mode 100644 7.1.143 delete mode 100644 7.1.144 delete mode 100644 7.1.145 delete mode 100644 7.1.146 delete mode 100644 7.1.147 delete mode 100644 7.1.148 delete mode 100644 7.1.149 delete mode 100644 7.1.150 delete mode 100644 7.1.151 delete mode 100644 7.1.152 delete mode 100644 7.1.153 delete mode 100644 7.1.154 delete mode 100644 7.1.155 delete mode 100644 7.1.156 delete mode 100644 7.1.157 delete mode 100644 7.1.158 delete mode 100644 7.1.159 delete mode 100644 7.1.160 delete mode 100644 7.1.161 delete mode 100644 7.1.162 delete mode 100644 7.1.163 delete mode 100644 7.1.164 delete mode 100644 7.1.165 delete mode 100644 7.1.166 delete mode 100644 7.1.167 delete mode 100644 7.1.168 delete mode 100644 7.1.169 delete mode 100644 7.1.170 delete mode 100644 7.1.171 delete mode 100644 7.1.172 delete mode 100644 7.1.173 delete mode 100644 7.1.174 delete mode 100644 7.1.175 delete mode 100644 7.1.176 delete mode 100644 7.1.177 delete mode 100644 7.1.178 delete mode 100644 7.1.179 delete mode 100644 7.1.180 delete mode 100644 7.1.181 delete mode 100644 7.1.182 delete mode 100644 7.1.183 delete mode 100644 7.1.184 delete mode 100644 7.1.185 delete mode 100644 7.1.186 delete mode 100644 7.1.187 delete mode 100644 7.1.188 delete mode 100644 7.1.189 delete mode 100644 7.1.190 delete mode 100644 7.1.191 delete mode 100644 7.1.192 delete mode 100644 7.1.193 delete mode 100644 7.1.194 delete mode 100644 7.1.195 delete mode 100644 7.1.196 delete mode 100644 7.1.197 delete mode 100644 7.1.198 delete mode 100644 7.1.199 delete mode 100644 7.1.200 delete mode 100644 7.1.201 delete mode 100644 7.1.202 delete mode 100644 7.1.203 delete mode 100644 7.1.204 delete mode 100644 7.1.205 delete mode 100644 7.1.206 delete mode 100644 7.1.207 delete mode 100644 7.1.208 delete mode 100644 7.1.209 delete mode 100644 7.1.210 delete mode 100644 7.1.211 delete mode 100644 7.1.212 delete mode 100644 7.1.213 delete mode 100644 7.1.214 delete mode 100644 7.1.215 delete mode 100644 7.1.216 delete mode 100644 7.1.217 delete mode 100644 7.1.218 delete mode 100644 7.1.219 delete mode 100644 7.1.220 delete mode 100644 7.1.221 delete mode 100644 7.1.222 delete mode 100644 7.1.223 delete mode 100644 7.1.224 delete mode 100644 7.1.225 delete mode 100644 7.1.226 delete mode 100644 7.1.227 delete mode 100644 7.1.228 delete mode 100644 7.1.229 delete mode 100644 7.1.230 delete mode 100644 7.1.231 delete mode 100644 7.1.232 delete mode 100644 7.1.233 delete mode 100644 7.1.234 delete mode 100644 7.1.235 delete mode 100644 7.1.236 delete mode 100644 7.1.237 delete mode 100644 7.1.238 delete mode 100644 7.1.239 delete mode 100644 7.1.240 delete mode 100644 7.1.241 delete mode 100644 7.1.242 delete mode 100644 7.1.243 delete mode 100644 7.1.244 delete mode 100644 7.1.245 delete mode 100644 7.1.246 delete mode 100644 7.1.247 delete mode 100644 7.1.248 delete mode 100644 7.1.249 delete mode 100644 7.1.250 delete mode 100644 7.1.251 delete mode 100644 7.1.252 delete mode 100644 7.1.253 delete mode 100644 7.1.254 delete mode 100644 7.1.255 delete mode 100644 7.1.256 delete mode 100644 7.1.257 delete mode 100644 7.1.258 delete mode 100644 7.1.259 delete mode 100644 7.1.260 delete mode 100644 7.1.261 delete mode 100644 7.1.262 delete mode 100644 7.1.263 delete mode 100644 7.1.264 delete mode 100644 7.1.265 delete mode 100644 7.1.266 delete mode 100644 7.1.267 delete mode 100644 7.1.268 delete mode 100644 7.1.269 delete mode 100644 7.1.270 delete mode 100644 7.1.271 delete mode 100644 7.1.272 delete mode 100644 7.1.273 delete mode 100644 7.1.274 delete mode 100644 7.1.275 delete mode 100644 7.1.276 delete mode 100644 7.1.277 delete mode 100644 7.1.278 delete mode 100644 7.1.279 delete mode 100644 7.1.280 delete mode 100644 7.1.281 delete mode 100644 7.1.282 delete mode 100644 7.1.283 delete mode 100644 7.1.284 delete mode 100644 7.1.285 delete mode 100644 7.1.286 delete mode 100644 7.1.287 delete mode 100644 7.1.288 delete mode 100644 7.1.289 delete mode 100644 7.1.290 delete mode 100644 7.1.291 delete mode 100644 7.1.292 delete mode 100644 7.1.293 create mode 100644 7.2.001 create mode 100644 7.2.002 create mode 100644 7.2.003 create mode 100644 7.2.004 create mode 100644 7.2.005 create mode 100644 7.2.006 create mode 100644 7.2.007 create mode 100644 7.2.008 create mode 100644 7.2.009 create mode 100644 7.2.010 create mode 100644 7.2.011 create mode 100644 7.2.012 create mode 100644 7.2.013 create mode 100644 7.2.014 create mode 100644 7.2.015 create mode 100644 7.2.016 create mode 100644 7.2.017 create mode 100644 7.2.018 create mode 100644 7.2.019 create mode 100644 7.2.020 create mode 100644 7.2.021 create mode 100644 7.2.022 create mode 100644 7.2.023 create mode 100644 7.2.024 create mode 100644 7.2.025 create mode 100644 7.2.026 create mode 100644 7.2.027 create mode 100644 7.2.028 create mode 100644 7.2.029 create mode 100644 7.2.030 create mode 100644 7.2.031 create mode 100644 7.2.032 create mode 100644 7.2.033 create mode 100644 7.2.034 create mode 100644 7.2.035 create mode 100644 7.2.036 create mode 100644 7.2.037 create mode 100644 7.2.038 create mode 100644 7.2.039 create mode 100644 7.2.040 create mode 100644 7.2.041 create mode 100644 7.2.042 create mode 100644 7.2.043 create mode 100644 7.2.044 create mode 100644 7.2.045 create mode 100644 7.2.046 create mode 100644 7.2.047 create mode 100644 7.2.048 create mode 100644 7.2.049 create mode 100644 7.2.050 create mode 100644 7.2.051 create mode 100644 7.2.052 create mode 100644 7.2.053 create mode 100644 7.2.054 create mode 100644 7.2.055 create mode 100644 7.2.056 create mode 100644 7.2.057 create mode 100644 7.2.058 create mode 100644 7.2.059 create mode 100644 7.2.060 create mode 100644 filetype.vim create mode 100644 gzip.vim create mode 100644 netrw.vim create mode 100644 netrwFileHandlers.vim create mode 100644 netrwPlugin.vim create mode 100644 netrwSettings.vim create mode 100644 tar.vim delete mode 100644 vim-6.4-cvim.patch delete mode 100644 vim-7.0-vimspelltypo.patch delete mode 100644 vim-7.1-ada.patch delete mode 100644 vim-7.1-erlang.patch rename vim-6.4-lib64.patch => vim-7.1-lib64.patch (58%) rename vim-7.0-fstabsyntax.patch => vim-7.2-fstabsyntax.patch (55%) delete mode 100644 vim-selinux.patch delete mode 100644 vim-selinux2.patch create mode 100644 zip.vim diff --git a/.cvsignore b/.cvsignore index 1334acaf..ba6c13ca 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,3 +1,3 @@ -vim-7.1-extra.tar.gz -vim-7.1-lang.tar.gz -vim-7.1.tar.bz2 +vim-7.2-extra.tar.gz +vim-7.2-lang.tar.gz +vim-7.2.tar.bz2 diff --git a/7.1.001 b/7.1.001 deleted file mode 100644 index 444e84c3..00000000 --- a/7.1.001 +++ /dev/null @@ -1,75 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.001 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.001 -Problem: Still can't build with Gnome libraries. -Solution: Fix typo in bind_textdomain_codeset. (Mike Kelly) -Files: src/gui_gtk.c, src/gui_gtk_x11.c - - -*** ../vim-7.1.000/src/gui_gtk.c Thu May 10 20:27:29 2007 ---- src/gui_gtk.c Mon May 14 14:40:54 2007 -*************** -*** 53,60 **** - # ifdef bindtextdomain - # undef bindtextdomain - # endif -! # ifdef bindtextdomain_codeset -! # undef bindtextdomain_codeset - # endif - # if defined(FEAT_GETTEXT) && !defined(ENABLE_NLS) - # define ENABLE_NLS /* so the texts in the dialog boxes are translated */ ---- 53,60 ---- - # ifdef bindtextdomain - # undef bindtextdomain - # endif -! # ifdef bind_textdomain_codeset -! # undef bind_textdomain_codeset - # endif - # if defined(FEAT_GETTEXT) && !defined(ENABLE_NLS) - # define ENABLE_NLS /* so the texts in the dialog boxes are translated */ -*** ../vim-7.1.000/src/gui_gtk_x11.c Thu May 10 21:17:51 2007 ---- src/gui_gtk_x11.c Mon May 14 14:41:06 2007 -*************** -*** 36,43 **** - # ifdef bindtextdomain - # undef bindtextdomain - # endif -! # ifdef bindtextdomain_codeset -! # undef bindtextdomain_codeset - # endif - # if defined(FEAT_GETTEXT) && !defined(ENABLE_NLS) - # define ENABLE_NLS /* so the texts in the dialog boxes are translated */ ---- 36,43 ---- - # ifdef bindtextdomain - # undef bindtextdomain - # endif -! # ifdef bind_textdomain_codeset -! # undef bind_textdomain_codeset - # endif - # if defined(FEAT_GETTEXT) && !defined(ENABLE_NLS) - # define ENABLE_NLS /* so the texts in the dialog boxes are translated */ -*** ../vim-7.1.000/src/version.c Sat May 12 16:34:15 2007 ---- src/version.c Mon May 14 14:42:19 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 1, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -127. You bring your laptop and cellular phone to church. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.002 b/7.1.002 deleted file mode 100644 index d75be05a..00000000 --- a/7.1.002 +++ /dev/null @@ -1,69 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.002 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.002 -Problem: Oracle Pro*C/C++ files are not detected. -Solution: Add the missing star. (Micah J. Cowan) -Files: runtime/filetype.vim - - -*** ../vim-7.1.001/runtime/filetype.vim Thu May 10 20:42:30 2007 ---- runtime/filetype.vim Tue May 15 09:12:06 2007 -*************** -*** 1,7 **** - " Vim support file to detect file types - " - " Maintainer: Bram Moolenaar -! " Last Change: 2007 May 10 - - " Listen very carefully, I will say this only once - if exists("did_load_filetypes") ---- 1,7 ---- - " Vim support file to detect file types - " - " Maintainer: Bram Moolenaar -! " Last Change: 2007 May 15 - - " Listen very carefully, I will say this only once - if exists("did_load_filetypes") -*************** -*** 1286,1292 **** - au BufNewFile,BufRead *.it,*.ih setf ppwiz - - " Oracle Pro*C/C++ -! au BufNewFile,BufRead .pc setf proc - - " Privoxy actions file - au BufNewFile,BufRead *.action setf privoxy ---- 1286,1292 ---- - au BufNewFile,BufRead *.it,*.ih setf ppwiz - - " Oracle Pro*C/C++ -! au BufNewFile,BufRead *.pc setf proc - - " Privoxy actions file - au BufNewFile,BufRead *.action setf privoxy -*** ../vim-7.1.001/src/version.c Mon May 14 19:35:51 2007 ---- src/version.c Tue May 15 09:13:11 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 2, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -132. You come back and check this list every half-hour. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.003 b/7.1.003 deleted file mode 100644 index 4beb4348..00000000 --- a/7.1.003 +++ /dev/null @@ -1,48 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.003 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.003 (extra) -Problem: The "Tear off this menu" message appears in the message history - when using a menu. (Yongwei Wu) -Solution: Disable message history when displaying the menu tip. -Files: src/gui_w32.c - - -*** ../vim-7.1.002/src/gui_w32.c Thu May 10 22:17:22 2007 ---- src/gui_w32.c Sat Jun 9 13:43:07 2007 -*************** -*** 1051,1057 **** ---- 1051,1059 ---- - if (pMenu != NULL && pMenu->strings[MENU_INDEX_TIP] != 0 - && GetMenuState(s_menuBar, pMenu->id, MF_BYCOMMAND) != -1) - { -+ ++msg_hist_off; - msg(pMenu->strings[MENU_INDEX_TIP]); -+ --msg_hist_off; - setcursor(); - out_flush(); - did_menu_tip = TRUE; -*** ../vim-7.1.002/src/version.c Tue May 15 09:14:33 2007 ---- src/version.c Tue Jun 19 10:08:17 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 3, - /**/ - --- -In his lifetime van Gogh painted 486 oil paintings. Oddly enough, 8975 -of them are to be found in the United States. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.004 b/7.1.004 deleted file mode 100644 index ce28af8a..00000000 --- a/7.1.004 +++ /dev/null @@ -1,73 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.004 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.004 -Problem: Crash when doing ":next directory". (Raphael Finkel) -Solution: Do not use "buf", it may be invalid after autocommands. -Files: src/ex_cmds.c - - -*** ../vim-7.1.003/src/ex_cmds.c Thu May 10 21:24:24 2007 ---- src/ex_cmds.c Mon Jun 18 22:03:56 2007 -*************** -*** 3367,3373 **** - * was in this window (or another window). If not used - * before, reset the local window options to the global - * values. Also restores old folding stuff. */ -! get_winopts(buf); - #ifdef FEAT_SPELL - did_get_winopts = TRUE; - #endif ---- 3367,3373 ---- - * was in this window (or another window). If not used - * before, reset the local window options to the global - * values. Also restores old folding stuff. */ -! get_winopts(curbuf); - #ifdef FEAT_SPELL - did_get_winopts = TRUE; - #endif -*************** -*** 3649,3656 **** - #ifdef FEAT_SPELL - /* If the window options were changed may need to set the spell language. - * Can only do this after the buffer has been properly setup. */ -! if (did_get_winopts && curwin->w_p_spell && *buf->b_p_spl != NUL) -! did_set_spelllang(buf); - #endif - - if (command == NULL) ---- 3649,3656 ---- - #ifdef FEAT_SPELL - /* If the window options were changed may need to set the spell language. - * Can only do this after the buffer has been properly setup. */ -! if (did_get_winopts && curwin->w_p_spell && *curbuf->b_p_spl != NUL) -! did_set_spelllang(curbuf); - #endif - - if (command == NULL) -*** ../vim-7.1.003/src/version.c Tue Jun 19 10:09:15 2007 ---- src/version.c Tue Jun 19 11:53:34 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 4, - /**/ - --- -FIRST HEAD: Oh! quick! get the sword out I want to cut his head off. -THIRD HEAD: Oh, cut your own head off. -SECOND HEAD: Yes - do us all a favour. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.005 b/7.1.005 deleted file mode 100644 index 273b1f5c..00000000 --- a/7.1.005 +++ /dev/null @@ -1,149 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.005 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.005 -Problem: "cit" used on deletes . Should not delete - anything and start insertion, like "ci'" does on "". (Michal - Bozon) -Solution: Handle an empty object specifically. Made it work consistent for - various text objects. -Files: src/search.c - - -*** ../vim-7.1.004/src/search.c Thu May 10 20:54:46 2007 ---- src/search.c Mon Jun 4 12:31:04 2007 -*************** -*** 3600,3612 **** - { - oap->start = start_pos; - oap->motion_type = MCHAR; - if (sol) -- { - incl(&curwin->w_cursor); -! oap->inclusive = FALSE; -! } -! else - oap->inclusive = TRUE; - } - - return OK; ---- 3600,3615 ---- - { - oap->start = start_pos; - oap->motion_type = MCHAR; -+ oap->inclusive = FALSE; - if (sol) - incl(&curwin->w_cursor); -! else if (lt(start_pos, curwin->w_cursor)) -! /* Include the character under the cursor. */ - oap->inclusive = TRUE; -+ else -+ /* End is before the start (no text in between <>, [], etc.): don't -+ * operate on any text. */ -+ curwin->w_cursor = start_pos; - } - - return OK; -*************** -*** 3734,3740 **** - - if (in_html_tag(FALSE)) - { -! /* cursor on start tag, move to just after it */ - while (*ml_get_cursor() != '>') - if (inc_cursor() < 0) - break; ---- 3737,3743 ---- - - if (in_html_tag(FALSE)) - { -! /* cursor on start tag, move to its '>' */ - while (*ml_get_cursor() != '>') - if (inc_cursor() < 0) - break; -*************** -*** 3838,3844 **** - /* Exclude the start tag. */ - curwin->w_cursor = start_pos; - while (inc_cursor() >= 0) -! if (*ml_get_cursor() == '>' && lt(curwin->w_cursor, end_pos)) - { - inc_cursor(); - start_pos = curwin->w_cursor; ---- 3841,3847 ---- - /* Exclude the start tag. */ - curwin->w_cursor = start_pos; - while (inc_cursor() >= 0) -! if (*ml_get_cursor() == '>') - { - inc_cursor(); - start_pos = curwin->w_cursor; -*************** -*** 3860,3866 **** - #ifdef FEAT_VISUAL - if (VIsual_active) - { -! if (*p_sel == 'e') - ++curwin->w_cursor.col; - VIsual = start_pos; - VIsual_mode = 'v'; ---- 3863,3873 ---- - #ifdef FEAT_VISUAL - if (VIsual_active) - { -! /* If the end is before the start there is no text between tags, select -! * the char under the cursor. */ -! if (lt(end_pos, start_pos)) -! curwin->w_cursor = start_pos; -! else if (*p_sel == 'e') - ++curwin->w_cursor.col; - VIsual = start_pos; - VIsual_mode = 'v'; -*************** -*** 3872,3878 **** - { - oap->start = start_pos; - oap->motion_type = MCHAR; -! oap->inclusive = TRUE; - } - retval = OK; - ---- 3879,3893 ---- - { - oap->start = start_pos; - oap->motion_type = MCHAR; -! if (lt(end_pos, start_pos)) -! { -! /* End is before the start: there is no text between tags; operate -! * on an empty area. */ -! curwin->w_cursor = start_pos; -! oap->inclusive = FALSE; -! } -! else -! oap->inclusive = TRUE; - } - retval = OK; - -*** ../vim-7.1.004/src/version.c Tue Jun 19 11:54:23 2007 ---- src/version.c Tue Jun 19 12:57:03 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 5, - /**/ - --- -Life would be so much easier if we could just look at the source code. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.006 b/7.1.006 deleted file mode 100644 index 510c9017..00000000 --- a/7.1.006 +++ /dev/null @@ -1,85 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.006 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.006 -Problem: Resetting 'modified' in a StdinReadPost autocommand doesn't work. -Solution: Set 'modified' before the autocommands instead of after it. -Files: src/buffer.c - - -*** ../vim-7.1.005/src/buffer.c Thu May 10 18:43:46 2007 ---- src/buffer.c Fri Jun 8 20:59:04 2007 -*************** -*** 171,176 **** ---- 171,183 ---- - /* Put the cursor on the first line. */ - curwin->w_cursor.lnum = 1; - curwin->w_cursor.col = 0; -+ -+ /* Set or reset 'modified' before executing autocommands, so that -+ * it can be changed there. */ -+ if (!readonlymode && !bufempty()) -+ changed(); -+ else if (retval != FAIL) -+ unchanged(curbuf, FALSE); - #ifdef FEAT_AUTOCMD - # ifdef FEAT_EVAL - apply_autocmds_retval(EVENT_STDINREADPOST, NULL, NULL, FALSE, -*************** -*** 194,209 **** - /* When reading stdin, the buffer contents always needs writing, so set - * the changed flag. Unless in readonly mode: "ls | gview -". - * When interrupted and 'cpoptions' contains 'i' set changed flag. */ -! if ((read_stdin && !readonlymode && !bufempty()) - #ifdef FEAT_AUTOCMD - || modified_was_set /* ":set modified" used in autocmd */ - # ifdef FEAT_EVAL - || (aborting() && vim_strchr(p_cpo, CPO_INTMOD) != NULL) - # endif - #endif -! || (got_int && vim_strchr(p_cpo, CPO_INTMOD) != NULL)) - changed(); -! else if (retval != FAIL) - unchanged(curbuf, FALSE); - save_file_ff(curbuf); /* keep this fileformat */ - ---- 201,216 ---- - /* When reading stdin, the buffer contents always needs writing, so set - * the changed flag. Unless in readonly mode: "ls | gview -". - * When interrupted and 'cpoptions' contains 'i' set changed flag. */ -! if ((got_int && vim_strchr(p_cpo, CPO_INTMOD) != NULL) - #ifdef FEAT_AUTOCMD - || modified_was_set /* ":set modified" used in autocmd */ - # ifdef FEAT_EVAL - || (aborting() && vim_strchr(p_cpo, CPO_INTMOD) != NULL) - # endif - #endif -! ) - changed(); -! else if (retval != FAIL && !read_stdin) - unchanged(curbuf, FALSE); - save_file_ff(curbuf); /* keep this fileformat */ - -*** ../vim-7.1.005/src/version.c Tue Jun 19 12:58:55 2007 ---- src/version.c Tue Jun 19 15:37:53 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 6, - /**/ - --- -If I tell you "you have a beautiful body", would you hold it against me? - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.007 b/7.1.007 deleted file mode 100644 index cdd1d4d4..00000000 --- a/7.1.007 +++ /dev/null @@ -1,221 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.007 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.007 (extra) -Problem: Mac: Context menu doesn't work on Intel Macs. - Scrollbars are not dimmed when Vim is not the active application. -Solution: Remove the test whether context menus are supported. They are - always there in OS/X. Handle the dimming. (Nicolas Weber) -Files: src/gui_mac.c, src/gui.h - - -*** ../vim-7.1.006/src/gui_mac.c Thu May 10 20:07:25 2007 ---- src/gui_mac.c Sat Jun 9 14:19:25 2007 -*************** -*** 1676,1688 **** - /* TODO: NEEDED? */ - clickIsPopup = FALSE; - -! if ((gui.MacOSHaveCntxMenu) && (mouse_model_popup())) -! if (IsShowContextualMenuClick(theEvent)) -! { -! vimMouseButton = MOUSE_RIGHT; -! vimModifiers &= ~MOUSE_CTRL; -! clickIsPopup = TRUE; -! } - - /* Is it a double click ? */ - dblClick = ((theEvent->when - lastMouseTick) < GetDblTime()); ---- 1676,1687 ---- - /* TODO: NEEDED? */ - clickIsPopup = FALSE; - -! if (mouse_model_popup() && IsShowContextualMenuClick(theEvent)) -! { -! vimMouseButton = MOUSE_RIGHT; -! vimModifiers &= ~MOUSE_CTRL; -! clickIsPopup = TRUE; -! } - - /* Is it a double click ? */ - dblClick = ((theEvent->when - lastMouseTick) < GetDblTime()); -*************** -*** 1920,1943 **** - WindowPtr whichWindow; - - whichWindow = (WindowPtr) event->message; -! if ((event->modifiers) & activeFlag) -! /* Activate */ -! gui_focus_change(TRUE); -! else - { -! /* Deactivate */ -! gui_focus_change(FALSE); -! /* DON'T KNOW what the code below was doing -! found in the deactivate clause, but the -! clause writing TRUE into in_focus (BUG) -! */ -! -! #if 0 /* Removed by Dany as per above June 2001 */ -! a_bool = false; -! SetPreserveGlyph(a_bool); -! SetOutlinePreferred(a_bool); -! #endif - } - } - - ---- 1919,1937 ---- - WindowPtr whichWindow; - - whichWindow = (WindowPtr) event->message; -! /* Dim scrollbars */ -! if (whichWindow == gui.VimWindow) - { -! ControlRef rootControl; -! GetRootControl(gui.VimWindow, &rootControl); -! if ((event->modifiers) & activeFlag) -! ActivateControl(rootControl); -! else -! DeactivateControl(rootControl); - } -+ -+ /* Activate */ -+ gui_focus_change((event->modifiers) & activeFlag); - } - - -*************** -*** 2559,2574 **** - OSErr error; - - /* Handle contextual menu right now (if needed) */ -! if (gui.MacOSHaveCntxMenu) -! if (IsShowContextualMenuClick(event)) -! { - # if 0 -! gui_mac_handle_contextual_menu(event); - # else -! gui_mac_doMouseDownEvent(event); - # endif -! return; -! } - - /* Handle normal event */ - switch (event->what) ---- 2553,2567 ---- - OSErr error; - - /* Handle contextual menu right now (if needed) */ -! if (IsShowContextualMenuClick(event)) -! { - # if 0 -! gui_mac_handle_contextual_menu(event); - # else -! gui_mac_doMouseDownEvent(event); - # endif -! return; -! } - - /* Handle normal event */ - switch (event->what) -*************** -*** 2782,2795 **** - (void) InstallAEHandlers(); - #endif - -- if (Gestalt(gestaltContextualMenuAttr, &gestalt_rc) == noErr) -- gui.MacOSHaveCntxMenu = BitTst(&gestalt_rc, 31-gestaltContextualMenuTrapAvailable); -- else -- gui.MacOSHaveCntxMenu = false; -- -- if (gui.MacOSHaveCntxMenu) -- gui.MacOSHaveCntxMenu = (InitContextualMenus()==noErr); -- - pomme = NewMenu(256, "\p\024"); /* 0x14= = Apple Menu */ - - AppendMenu(pomme, "\pAbout VIM"); ---- 2775,2780 ---- -*************** -*** 2941,2946 **** ---- 2926,2932 ---- - #ifdef USE_CARBONKEYHANDLER - EventHandlerRef keyEventHandlerRef; - #endif -+ ControlRef rootControl; - - if (Gestalt(gestaltSystemVersion, &gMacSystemVersion) != noErr) - gMacSystemVersion = 0x1000; /* TODO: Default to minimum sensible value */ -*************** -*** 2954,2968 **** - (void) InstallAEHandlers(); - #endif - -- /* Ctrl click */ -- if (Gestalt(gestaltContextualMenuAttr, &gestalt_rc) == noErr) -- gui.MacOSHaveCntxMenu = BitTst(&gestalt_rc, 31-gestaltContextualMenuTrapAvailable); -- else -- gui.MacOSHaveCntxMenu = false; -- -- if (gui.MacOSHaveCntxMenu) -- gui.MacOSHaveCntxMenu = (InitContextualMenus()==noErr); -- - pomme = NewMenu(256, "\p\024"); /* 0x14= = Apple Menu */ - - AppendMenu(pomme, "\pAbout VIM"); ---- 2940,2945 ---- -*************** -*** 2981,2986 **** ---- 2958,2964 ---- - gui.VimWindow = NewCWindow(nil, &windRect, "\pgVim on Macintosh", true, - zoomDocProc, - (WindowPtr)-1L, true, 0); -+ CreateRootControl(gui.VimWindow, &rootControl); - InstallReceiveHandler((DragReceiveHandlerUPP)receiveHandler, - gui.VimWindow, NULL); - SetPortWindowPort(gui.VimWindow); -*** ../vim-7.1.006/src/gui.h Thu May 10 19:18:46 2007 ---- src/gui.h Sat Jun 9 14:10:34 2007 -*************** -*** 460,466 **** - WindowPtr VimWindow; - MenuHandle MacOSHelpMenu; /* Help menu provided by the MacOS */ - int MacOSHelpItems; /* Nr of help-items supplied by MacOS */ -- int MacOSHaveCntxMenu; /* Contextual menu available */ - WindowPtr wid; /* Window id of text area */ - int visibility; /* Is window partially/fully obscured? */ - #endif ---- 460,465 ---- -*** ../vim-7.1.006/src/version.c Tue Jun 19 15:40:51 2007 ---- src/version.c Tue Jun 19 15:44:15 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 7, - /**/ - --- - When danger reared its ugly head, - He bravely turned his tail and fled - Yes, Brave Sir Robin turned about - And gallantly he chickened out - Bravely taking to his feet - He beat a very brave retreat - Bravest of the brave Sir Robin - Petrified of being dead - Soiled his pants then brave Sir Robin - Turned away and fled. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.008 b/7.1.008 deleted file mode 100644 index 092009d3..00000000 --- a/7.1.008 +++ /dev/null @@ -1,82 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.008 (correction -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Oops, forgot the src/version.c change. - -Patch 7.1.008 -Problem: getfsize() returns a negative number for very big files. -Solution: Check for overflow and return -2. -Files: runtime/doc/eval.txt, src/eval.c - - -*** ../vim-7.1.007/runtime/doc/eval.txt Sat May 12 16:38:23 2007 ---- runtime/doc/eval.txt Sat Jun 9 15:48:40 2007 -*************** -*** 1,4 **** -! *eval.txt* For Vim version 7.1. Last change: 2007 May 11 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *eval.txt* For Vim version 7.1. Last change: 2007 Jun 09 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 2824,2829 **** ---- 2824,2831 ---- - given file {fname}. - If {fname} is a directory, 0 is returned. - If the file {fname} can't be found, -1 is returned. -+ If the size of {fname} is too big to fit in a Number then -2 -+ is returned. - - getfontname([{name}]) *getfontname()* - Without an argument returns the name of the normal font being -*** ../vim-7.1.007/src/eval.c Thu May 10 21:30:00 2007 ---- src/eval.c Sat Jun 9 15:46:46 2007 -*************** -*** 10136,10142 **** ---- 10136,10148 ---- - if (mch_isdir(fname)) - rettv->vval.v_number = 0; - else -+ { - rettv->vval.v_number = (varnumber_T)st.st_size; -+ -+ /* non-perfect check for overflow */ -+ if ((off_t)rettv->vval.v_number != (off_t)st.st_size) -+ rettv->vval.v_number = -2; -+ } - } - else - rettv->vval.v_number = -1; -*** ../vim-7.1.007/src/version.c Tue Jun 19 16:33:53 2007 ---- src/version.c Tue Jun 19 17:30:50 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 8, - /**/ - - --- -ZOOT: I'm afraid our life must seem very dull and quiet compared to yours. - We are but eightscore young blondes, all between sixteen and - nineteen-and-a-half, cut off in this castle, with no one to protect us. - Oooh. It is a lonely life ... bathing ... dressing ... undressing ... - making exciting underwear.... - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.009 b/7.1.009 deleted file mode 100644 index a81c1bee..00000000 --- a/7.1.009 +++ /dev/null @@ -1,58 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.009 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.009 -Problem: In diff mode, displaying the difference between a tab and spaces - is not highlighted correctly. -Solution: Only change highlighting at the end of displaying a tab. -Files: src/screen.c - - -*** ../vim-7.1.008/src/screen.c Thu May 10 20:15:31 2007 ---- src/screen.c Mon Jun 11 21:49:44 2007 -*************** -*** 3459,3467 **** - #ifdef FEAT_DIFF - if (diff_hlf != (hlf_T)0) - { -! if (diff_hlf == HLF_CHD && ptr - line >= change_start) - diff_hlf = HLF_TXD; /* changed text */ -! if (diff_hlf == HLF_TXD && ptr - line > change_end) - diff_hlf = HLF_CHD; /* changed line */ - line_attr = hl_attr(diff_hlf); - } ---- 3459,3469 ---- - #ifdef FEAT_DIFF - if (diff_hlf != (hlf_T)0) - { -! if (diff_hlf == HLF_CHD && ptr - line >= change_start -! && n_extra == 0) - diff_hlf = HLF_TXD; /* changed text */ -! if (diff_hlf == HLF_TXD && ptr - line > change_end -! && n_extra == 0) - diff_hlf = HLF_CHD; /* changed line */ - line_attr = hl_attr(diff_hlf); - } -*** ../vim-7.1.008/src/version.c Tue Jun 19 17:33:52 2007 ---- src/version.c Tue Jun 19 17:36:36 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 9, - /**/ - --- -Linux is just like a wigwam: no Windows, no Gates and an Apache inside. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.010 b/7.1.010 deleted file mode 100644 index ee8c03a8..00000000 --- a/7.1.010 +++ /dev/null @@ -1,75 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.010 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.010 -Problem: The Gnome session file doesn't restore tab pages. -Solution: Add SSOP_TABPAGES to the session flags. (Matias D'Ambrosio) -Files: src/gui_gtk_x11.c - - -*** ../vim-7.1.009/src/gui_gtk_x11.c Mon May 14 19:35:51 2007 ---- src/gui_gtk_x11.c Sat Jun 9 16:54:13 2007 -*************** -*** 2188,2195 **** - escaped_filename = vim_strsave_escaped(filename, escape_chars); - if (escaped_filename == NULL) - return FALSE; -! mksession_cmdline = g_strconcat("mksession ", (char *)escaped_filename, NULL); - vim_free(escaped_filename); - /* - * Use a reasonable hardcoded set of 'sessionoptions' flags to avoid - * unpredictable effects when the session is saved automatically. Also, ---- 2188,2197 ---- - escaped_filename = vim_strsave_escaped(filename, escape_chars); - if (escaped_filename == NULL) - return FALSE; -! mksession_cmdline = g_strconcat("mksession ", (char *)escaped_filename, -! NULL); - vim_free(escaped_filename); -+ - /* - * Use a reasonable hardcoded set of 'sessionoptions' flags to avoid - * unpredictable effects when the session is saved automatically. Also, -*************** -*** 2199,2205 **** - */ - save_ssop_flags = ssop_flags; - ssop_flags = (SSOP_BLANK|SSOP_CURDIR|SSOP_FOLDS|SSOP_GLOBALS -! |SSOP_HELP|SSOP_OPTIONS|SSOP_WINSIZE); - - do_cmdline_cmd((char_u *)"let Save_VV_this_session = v:this_session"); - failed = (do_cmdline_cmd((char_u *)mksession_cmdline) == FAIL); ---- 2201,2207 ---- - */ - save_ssop_flags = ssop_flags; - ssop_flags = (SSOP_BLANK|SSOP_CURDIR|SSOP_FOLDS|SSOP_GLOBALS -! |SSOP_HELP|SSOP_OPTIONS|SSOP_WINSIZE|SSOP_TABPAGES); - - do_cmdline_cmd((char_u *)"let Save_VV_this_session = v:this_session"); - failed = (do_cmdline_cmd((char_u *)mksession_cmdline) == FAIL); -*** ../vim-7.1.009/src/version.c Tue Jun 19 17:49:12 2007 ---- src/version.c Tue Jun 19 18:07:09 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 10, - /**/ - --- -GALAHAD: No look, really, this isn't nescess ... -PIGLET: We must examine you. -GALAHAD: There's nothing wrong with ... that. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.011 b/7.1.011 deleted file mode 100644 index 6322cb15..00000000 --- a/7.1.011 +++ /dev/null @@ -1,58 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.011 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.011 -Problem: Possible buffer overflow when $VIMRUNTIME is very long. (Victor - Stinner) -Solution: Use vim_snprintf(). -Files: src/main.c - - -*** ../vim-7.1.010/src/main.c Thu May 10 21:12:25 2007 ---- src/main.c Sat Jun 9 22:37:46 2007 -*************** -*** 1360,1367 **** - p = vim_getenv((char_u *)"VIMRUNTIME", &mustfree); - if (p != NULL && *p != NUL) - { -! STRCPY(NameBuff, p); -! STRCAT(NameBuff, "/lang"); - bindtextdomain(VIMPACKAGE, (char *)NameBuff); - } - if (mustfree) ---- 1360,1366 ---- - p = vim_getenv((char_u *)"VIMRUNTIME", &mustfree); - if (p != NULL && *p != NUL) - { -! vim_snprintf((char *)NameBuff, MAXPATHL, "%s/lang", p); - bindtextdomain(VIMPACKAGE, (char *)NameBuff); - } - if (mustfree) -*** ../vim-7.1.010/src/version.c Tue Jun 19 18:07:52 2007 ---- src/version.c Tue Jun 19 20:29:44 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 11, - /**/ - --- - GALAHAD hurries to the door and pushes through it. As he leaves the room - we CUT TO the reverse to show that he is now in a room full of bathing - and romping GIRLIES, all innocent, wide-eyed and beautiful. They smile - enchantingly at him as he tries to keep walking without being diverted by - the lovely sights assaulting his eyeballs. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.012 b/7.1.012 deleted file mode 100644 index 97ce9040..00000000 --- a/7.1.012 +++ /dev/null @@ -1,62 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.012 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.012 -Problem: ":let &shiftwidth = 'asdf'" doesn't produce an error message. -Solution: Check for a string argument. (Chris Lubinski) -Files: src/option.c - - -*** ../vim-7.1.011/src/option.c Sun May 6 15:37:32 2007 ---- src/option.c Tue Jun 19 20:56:36 2007 -*************** -*** 8219,8224 **** ---- 8219,8243 ---- - varp = get_varp(&options[opt_idx]); - if (varp != NULL) /* hidden option is not changed */ - { -+ if (number == 0 && string != NULL) -+ { -+ int index; -+ -+ /* Either we are given a string or we are setting option -+ * to zero. */ -+ for (index = 0; string[index] == '0'; ++index) -+ ; -+ if (string[index] != NUL || index == 0) -+ { -+ /* There's another character after zeros or the string -+ * is empty. In both cases, we are trying to set a -+ * num option using a string. */ -+ EMSG3(_("E521: Number required: &%s = '%s'"), -+ name, string); -+ return; /* do nothing as we hit an error */ -+ -+ } -+ } - if (flags & P_NUM) - (void)set_num_option(opt_idx, varp, number, - NULL, 0, opt_flags); -*** ../vim-7.1.011/src/version.c Tue Jun 19 20:30:46 2007 ---- src/version.c Tue Jun 19 20:53:15 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 12, - /**/ - --- -Ten million Linux users can't be wrong! - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.013 b/7.1.013 deleted file mode 100644 index 83b224a1..00000000 --- a/7.1.013 +++ /dev/null @@ -1,60 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.013 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.013 -Problem: ":syn include" only loads the first file, while it is documented - as doing the equivalent of ":runtime!". -Solution: Change the argument to source_runtime(). (James Vega) -Files: src/syntax.c - - -*** ../vim-7.1.012/src/syntax.c Thu May 10 20:54:33 2007 ---- src/syntax.c Sun Jun 17 22:03:30 2007 -*************** -*** 4460,4467 **** - current_syn_inc_tag = ++running_syn_inc_tag; - prev_toplvl_grp = curbuf->b_syn_topgrp; - curbuf->b_syn_topgrp = sgl_id; -! if (source ? do_source(eap->arg, FALSE, FALSE) == FAIL -! : source_runtime(eap->arg, DOSO_NONE) == FAIL) - EMSG2(_(e_notopen), eap->arg); - curbuf->b_syn_topgrp = prev_toplvl_grp; - current_syn_inc_tag = prev_syn_inc_tag; ---- 4460,4467 ---- - current_syn_inc_tag = ++running_syn_inc_tag; - prev_toplvl_grp = curbuf->b_syn_topgrp; - curbuf->b_syn_topgrp = sgl_id; -! if (source ? do_source(eap->arg, FALSE, DOSO_NONE) == FAIL -! : source_runtime(eap->arg, TRUE) == FAIL) - EMSG2(_(e_notopen), eap->arg); - curbuf->b_syn_topgrp = prev_toplvl_grp; - current_syn_inc_tag = prev_syn_inc_tag; -*** ../vim-7.1.012/src/version.c Tue Jun 19 20:56:52 2007 ---- src/version.c Thu Jun 28 11:58:25 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 13, - /**/ - --- -MORTICIAN: What? -CUSTOMER: Nothing -- here's your nine pence. -DEAD PERSON: I'm not dead! -MORTICIAN: Here -- he says he's not dead! -CUSTOMER: Yes, he is. -DEAD PERSON: I'm not! - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.014 b/7.1.014 deleted file mode 100644 index 5b5b1dee..00000000 --- a/7.1.014 +++ /dev/null @@ -1,46 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.014 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.014 -Problem: Crash when doing C indenting. (Chris Monson) -Solution: Obtain the current line again after invoking cin_islabel(). -Files: src/edit.c - - -*** ../vim-7.1.013/src/edit.c Thu May 10 20:44:18 2007 ---- src/edit.c Wed Jun 20 18:25:54 2007 -*************** -*** 7215,7220 **** ---- 7215,7222 ---- - p = ml_get_curline(); - if (cin_iscase(p) || cin_isscopedecl(p) || cin_islabel(30)) - return TRUE; -+ /* Need to get the line again after cin_islabel(). */ -+ p = ml_get_curline(); - if (curwin->w_cursor.col > 2 - && p[curwin->w_cursor.col - 1] == ':' - && p[curwin->w_cursor.col - 2] == ':') -*** ../vim-7.1.013/src/version.c Thu Jun 28 11:59:13 2007 ---- src/version.c Thu Jun 28 12:26:52 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 14, - /**/ - --- -Have you heard about the new Barbie doll? It's called Divorce -Barbie. It comes with all of Ken's stuff. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.015 b/7.1.015 deleted file mode 100644 index 0dedb235..00000000 --- a/7.1.015 +++ /dev/null @@ -1,97 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.015 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.015 -Problem: MzScheme interface: current-library-collection-paths produces no - list. Interface doesn't build on a Mac. -Solution: Use a list instead of a pair. (Bernhard Fisseni) Use "-framework" - argument for MZSCHEME_LIBS in configure. -Files: src/configure.in, src/if_mzsch.c, src/auto/configure - - -*** ../vim-7.1.014/src/configure.in Sat May 12 16:30:49 2007 ---- src/configure.in Sun Jun 10 16:47:43 2007 -*************** -*** 423,429 **** - fi - - if test "X$vi_cv_path_mzscheme_pfx" != "X"; then -! if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then - MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a" - else - MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc" ---- 423,431 ---- - fi - - if test "X$vi_cv_path_mzscheme_pfx" != "X"; then -! if test "x$MACOSX" = "xyes"; then -! MZSCHEME_LIBS="-framework PLT_MzScheme" -! elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then - MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a" - else - MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc" -*** ../vim-7.1.014/src/if_mzsch.c Sat May 12 17:29:20 2007 ---- src/if_mzsch.c Sun Jun 10 16:39:51 2007 -*************** -*** 773,780 **** - #ifdef MZSCHEME_COLLECTS - /* setup 'current-library-collection-paths' parameter */ - scheme_set_param(scheme_config, MZCONFIG_COLLECTION_PATHS, -! scheme_make_pair(scheme_make_string(MZSCHEME_COLLECTS), -! scheme_null)); - #endif - #ifdef HAVE_SANDBOX - /* setup sandbox guards */ ---- 773,779 ---- - #ifdef MZSCHEME_COLLECTS - /* setup 'current-library-collection-paths' parameter */ - scheme_set_param(scheme_config, MZCONFIG_COLLECTION_PATHS, -! scheme_build_list(0, scheme_make_string(MZSCHEME_COLLECTS))); - #endif - #ifdef HAVE_SANDBOX - /* setup sandbox guards */ -*** ../vim-7.1.014/src/auto/configure Sat May 12 16:23:27 2007 ---- src/auto/configure Sun Jun 10 16:49:58 2007 -*************** -*** 3843,3849 **** - fi - - if test "X$vi_cv_path_mzscheme_pfx" != "X"; then -! if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then - MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a" - else - MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc" ---- 3843,3851 ---- - fi - - if test "X$vi_cv_path_mzscheme_pfx" != "X"; then -! if test "x$MACOSX" = "xyes"; then -! MZSCHEME_LIBS="-framework PLT_MzScheme" -! elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then - MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a" - else - MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc" -*** ../vim-7.1.014/src/version.c Thu Jun 28 12:44:56 2007 ---- src/version.c Thu Jun 28 13:00:52 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 15, - /**/ - --- -You know you use Vim too much when you have this alias in your -~/.bashrc file: alias :e=/bin/vim (Eljay Love-Jensen) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.016 b/7.1.016 deleted file mode 100644 index 220f780b..00000000 --- a/7.1.016 +++ /dev/null @@ -1,72 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.016 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.016 (after patch 7.1.012) -Problem: Error message about setting 'diff' to a string. -Solution: Don't pass an empty string to set_option_value() when setting - 'diff'. -Files: src/quickfix.c, src/popupmnu.c - - -*** ../vim-7.1.015/src/quickfix.c Sun Feb 4 02:58:00 2007 ---- src/quickfix.c Thu Jun 28 18:56:16 2007 -*************** -*** 2331,2337 **** - set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix", - OPT_LOCAL); - set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL); -! set_option_value((char_u *)"diff", 0L, (char_u *)"", OPT_LOCAL); - } - - /* Only set the height when still in the same tab page and there is no ---- 2331,2337 ---- - set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix", - OPT_LOCAL); - set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL); -! set_option_value((char_u *)"diff", 0L, NULL, OPT_LOCAL); - } - - /* Only set the height when still in the same tab page and there is no -*** ../vim-7.1.015/src/popupmnu.c Tue Mar 27 12:42:05 2007 ---- src/popupmnu.c Thu Jun 28 19:00:51 2007 -*************** -*** 466,472 **** - set_option_value((char_u *)"bh", 0L, - (char_u *)"wipe", OPT_LOCAL); - set_option_value((char_u *)"diff", 0L, -! (char_u *)"", OPT_LOCAL); - } - } - if (res == OK) ---- 466,472 ---- - set_option_value((char_u *)"bh", 0L, - (char_u *)"wipe", OPT_LOCAL); - set_option_value((char_u *)"diff", 0L, -! NULL, OPT_LOCAL); - } - } - if (res == OK) -*** ../vim-7.1.015/src/version.c Thu Jun 28 13:02:22 2007 ---- src/version.c Thu Jun 28 21:20:20 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 16, - /**/ - --- -We do not stumble over mountains, but over molehills. - Confucius - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.017 b/7.1.017 deleted file mode 100644 index aa2a3477..00000000 --- a/7.1.017 +++ /dev/null @@ -1,212 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.017 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.017 -Problem: ":confirm w" does give a prompt when 'readonly' is set, but not - when the file permissions are read-only. (Michael Schaap) -Solution: Provide a dialog in both situations. (Chris Lubinski) -Files: src/ex_cmds.c, src/fileio.c, src/proto/fileio.pro - - -*** ../vim-7.1.016/src/ex_cmds.c Tue Jun 19 11:54:23 2007 ---- src/ex_cmds.c Tue Jun 19 22:37:25 2007 -*************** -*** 2912,2933 **** - } - - /* -! * Check if a buffer is read-only. Ask for overruling in a dialog. -! * Return TRUE and give an error message when the buffer is readonly. - */ - static int - check_readonly(forceit, buf) - int *forceit; - buf_T *buf; - { -! if (!*forceit && buf->b_p_ro) - { - #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) - if ((p_confirm || cmdmod.confirm) && buf->b_fname != NULL) - { - char_u buff[IOSIZE]; - -! dialog_msg(buff, _("'readonly' option is set for \"%s\".\nDo you wish to write anyway?"), - buf->b_fname); - - if (vim_dialog_yesno(VIM_QUESTION, NULL, buff, 2) == VIM_YES) ---- 2912,2946 ---- - } - - /* -! * Check if a buffer is read-only (either 'readonly' option is set or file is -! * read-only). Ask for overruling in a dialog. Return TRUE and give an error -! * message when the buffer is readonly. - */ - static int - check_readonly(forceit, buf) - int *forceit; - buf_T *buf; - { -! struct stat st; -! -! /* Handle a file being readonly when the 'readonly' option is set or when -! * the file exists and permissions are read-only. -! * We will send 0777 to check_file_readonly(), as the "perm" variable is -! * important for device checks but not here. */ -! if (!*forceit && (buf->b_p_ro -! || (mch_stat((char *)buf->b_ffname, &st) >= 0 -! && check_file_readonly(buf->b_ffname, 0777)))) - { - #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) - if ((p_confirm || cmdmod.confirm) && buf->b_fname != NULL) - { - char_u buff[IOSIZE]; - -! if (buf->b_p_ro) -! dialog_msg(buff, _("'readonly' option is set for \"%s\".\nDo you wish to write anyway?"), -! buf->b_fname); -! else -! dialog_msg(buff, _("File permissions of \"%s\" are read-only.\nIt may still be possible to write it.\nDo you wish to try?"), - buf->b_fname); - - if (vim_dialog_yesno(VIM_QUESTION, NULL, buff, 2) == VIM_YES) -*************** -*** 2941,2949 **** ---- 2954,2967 ---- - } - else - #endif -+ if (buf->b_p_ro) - EMSG(_(e_readonly)); -+ else -+ EMSG2(_("E505: \"%s\" is read-only (add ! to override)"), -+ buf->b_fname); - return TRUE; - } -+ - return FALSE; - } - -*** ../vim-7.1.016/src/fileio.c Thu May 10 19:32:17 2007 ---- src/fileio.c Thu Jun 28 21:54:18 2007 -*************** -*** 424,430 **** - */ - if (!p_odev && mch_nodetype(fname) == NODE_WRITABLE) - { -! filemess(curbuf, fname, (char_u *)_("is a device (disabled with 'opendevice' option"), 0); - msg_end(); - msg_scroll = msg_save; - return FAIL; ---- 424,430 ---- - */ - if (!p_odev && mch_nodetype(fname) == NODE_WRITABLE) - { -! filemess(curbuf, fname, (char_u *)_("is a device (disabled with 'opendevice' option)"), 0); - msg_end(); - msg_scroll = msg_save; - return FAIL; -*************** -*** 2734,2739 **** ---- 2734,2765 ---- - #endif - - /* -+ * Return TRUE if a file appears to be read-only from the file permissions. -+ */ -+ int -+ check_file_readonly(fname, perm) -+ char_u *fname; /* full path to file */ -+ int perm; /* known permissions on file */ -+ { -+ #ifndef USE_MCH_ACCESS -+ int fd = 0; -+ #endif -+ -+ return ( -+ #ifdef USE_MCH_ACCESS -+ # ifdef UNIX -+ (perm & 0222) == 0 || -+ # endif -+ mch_access((char *)fname, W_OK) -+ #else -+ (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0 -+ ? TRUE : (close(fd), FALSE) -+ #endif -+ ); -+ } -+ -+ -+ /* - * buf_write() - write to file "fname" lines "start" through "end" - * - * We do our own buffering here because fwrite() is so slow. -*************** -*** 3219,3235 **** - * Check if the file is really writable (when renaming the file to - * make a backup we won't discover it later). - */ -! file_readonly = ( -! # ifdef USE_MCH_ACCESS -! # ifdef UNIX -! (perm & 0222) == 0 || -! # endif -! mch_access((char *)fname, W_OK) -! # else -! (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0 -! ? TRUE : (close(fd), FALSE) -! # endif -! ); - if (!forceit && file_readonly) - { - if (vim_strchr(p_cpo, CPO_FWRITE) != NULL) ---- 3245,3252 ---- - * Check if the file is really writable (when renaming the file to - * make a backup we won't discover it later). - */ -! file_readonly = check_file_readonly(fname, (int)perm); -! - if (!forceit && file_readonly) - { - if (vim_strchr(p_cpo, CPO_FWRITE) != NULL) -*** ../vim-7.1.016/src/proto/fileio.pro Sat May 5 19:59:00 2007 ---- src/proto/fileio.pro Thu Jun 28 21:09:59 2007 -*************** -*** 2,7 **** ---- 2,8 ---- - void filemess __ARGS((buf_T *buf, char_u *name, char_u *s, int attr)); - int readfile __ARGS((char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_skip, linenr_T lines_to_read, exarg_T *eap, int flags)); - int prep_exarg __ARGS((exarg_T *eap, buf_T *buf)); -+ int check_file_readonly __ARGS((char_u *fname, int perm)); - int buf_write __ARGS((buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_T end, exarg_T *eap, int append, int forceit, int reset_changed, int filtering)); - void msg_add_fname __ARGS((buf_T *buf, char_u *fname)); - void msg_add_lines __ARGS((int insert_space, long lnum, long nchars)); -*** ../vim-7.1.016/src/version.c Thu Jun 28 21:23:52 2007 ---- src/version.c Thu Jun 28 21:49:29 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 17, - /**/ - --- -CUSTOMER: Well, can you hang around a couple of minutes? He won't be - long. -MORTICIAN: Naaah, I got to go on to Robinson's -- they've lost nine today. -CUSTOMER: Well, when is your next round? -MORTICIAN: Thursday. -DEAD PERSON: I think I'll go for a walk. - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.018 b/7.1.018 deleted file mode 100644 index 0d4c032c..00000000 --- a/7.1.018 +++ /dev/null @@ -1,60 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.018 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.018 -Problem: When 'virtualedit' is set a "p" of a block just past the end of - the line inserts before the cursor. (Engelke) -Solution: Check for the cursor being just after the line (Chris Lubinski) -Files: src/ops.c - - -*** ../vim-7.1.017/src/ops.c Thu May 10 20:34:55 2007 ---- src/ops.c Tue Jun 19 22:40:45 2007 -*************** -*** 3404,3410 **** - - #ifdef FEAT_VIRTUALEDIT - col += curwin->w_cursor.coladd; -! if (ve_flags == VE_ALL && curwin->w_cursor.coladd > 0) - { - if (dir == FORWARD && c == NUL) - ++col; ---- 3404,3412 ---- - - #ifdef FEAT_VIRTUALEDIT - col += curwin->w_cursor.coladd; -! if (ve_flags == VE_ALL -! && (curwin->w_cursor.coladd > 0 -! || endcol2 == curwin->w_cursor.col)) - { - if (dir == FORWARD && c == NUL) - ++col; -*** ../vim-7.1.017/src/version.c Thu Jun 28 21:57:08 2007 ---- src/version.c Thu Jun 28 22:12:49 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 18, - /**/ - --- - [clop clop] -MORTICIAN: Who's that then? -CUSTOMER: I don't know. -MORTICIAN: Must be a king. -CUSTOMER: Why? -MORTICIAN: He hasn't got shit all over him. - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.019 b/7.1.019 deleted file mode 100644 index d0c10ce9..00000000 --- a/7.1.019 +++ /dev/null @@ -1,55 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.019 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.019 -Problem: ":py" asks for an argument, ":py asd" then gives the error that - ":py" isn't implemented. Should already happen for ":py". -Solution: Compare with ex_script_ni. (Chris Lubinski) -Files: src/ex_docmd.c - - -*** ../vim-7.1.018/src/ex_docmd.c Thu May 10 18:53:03 2007 ---- src/ex_docmd.c Sat Jun 23 13:36:37 2007 -*************** -*** 2118,2124 **** - #ifdef FEAT_USR_CMDS - !USER_CMDIDX(ea.cmdidx) && - #endif -! cmdnames[ea.cmdidx].cmd_func == ex_ni); - - #ifndef FEAT_EVAL - /* ---- 2118,2125 ---- - #ifdef FEAT_USR_CMDS - !USER_CMDIDX(ea.cmdidx) && - #endif -! (cmdnames[ea.cmdidx].cmd_func == ex_ni -! || cmdnames[ea.cmdidx].cmd_func == ex_script_ni)); - - #ifndef FEAT_EVAL - /* -*** ../vim-7.1.018/src/version.c Thu Jun 28 22:14:28 2007 ---- src/version.c Thu Jul 5 09:48:11 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 19, - /**/ - --- -MARTHA'S WAY: Don't throw out all that leftover wine. Freeze into ice cubes - for future use in casseroles and sauces. -MY WAY: What leftover wine? - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.020 b/7.1.020 deleted file mode 100644 index c343cb03..00000000 --- a/7.1.020 +++ /dev/null @@ -1,115 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.020 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.020 -Problem: Reading from uninitialized memory when using a dialog. (Dominique - Pelle) -Solution: In msg_show_console_dialog() append a NUL after every appended - character. -Files: src/message.c - - -*** ../vim-7.1.019/src/message.c Thu May 10 18:49:39 2007 ---- src/message.c Sun Jul 1 12:06:52 2007 -*************** -*** 3456,3466 **** - /* advance to next hotkey and set default hotkey */ - #ifdef FEAT_MBYTE - if (has_mbyte) -! hotkp += (*mb_ptr2len)(hotkp); - else - #endif - ++hotkp; -! (void)copy_char(r + 1, hotkp, TRUE); - if (dfltbutton) - --dfltbutton; - ---- 3456,3466 ---- - /* advance to next hotkey and set default hotkey */ - #ifdef FEAT_MBYTE - if (has_mbyte) -! hotkp += STRLEN(hotkp); - else - #endif - ++hotkp; -! hotkp[copy_char(r + 1, hotkp, TRUE)] = NUL; - if (dfltbutton) - --dfltbutton; - -*************** -*** 3493,3499 **** - *msgp++ = (dfltbutton == 1) ? ']' : ')'; - - /* redefine hotkey */ -! (void)copy_char(r, hotkp, TRUE); - } - } - else ---- 3493,3499 ---- - *msgp++ = (dfltbutton == 1) ? ']' : ')'; - - /* redefine hotkey */ -! hotkp[copy_char(r, hotkp, TRUE)] = NUL; - } - } - else -*************** -*** 3519,3526 **** - *msgp++ = ':'; - *msgp++ = ' '; - *msgp = NUL; -- mb_ptr_adv(hotkp); -- *hotkp = NUL; - } - else - { ---- 3519,3524 ---- -*************** -*** 3555,3562 **** - msgp = confirm_msg + 1 + STRLEN(message); - hotkp = hotk; - -! /* define first default hotkey */ -! (void)copy_char(buttons, hotkp, TRUE); - - /* Remember where the choices start, displaying starts here when - * "hotkp" typed at the more prompt. */ ---- 3553,3561 ---- - msgp = confirm_msg + 1 + STRLEN(message); - hotkp = hotk; - -! /* Define first default hotkey. Keep the hotkey string NUL -! * terminated to avoid reading past the end. */ -! hotkp[copy_char(buttons, hotkp, TRUE)] = NUL; - - /* Remember where the choices start, displaying starts here when - * "hotkp" typed at the more prompt. */ -*** ../vim-7.1.019/src/version.c Thu Jul 5 09:53:20 2007 ---- src/version.c Thu Jul 5 10:09:34 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 20, - /**/ - --- -BLACK KNIGHT: Come on you pansy! - [hah] [parry thrust] - [ARTHUR chops the BLACK KNIGHT's right arm off] -ARTHUR: Victory is mine! [kneeling] - We thank thee Lord, that in thy merc- - [Black Knight kicks Arthur in the head while he is praying] - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.021 b/7.1.021 deleted file mode 100644 index 1f537ea3..00000000 --- a/7.1.021 +++ /dev/null @@ -1,92 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.021 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.021 (after 7.1.015) -Problem: Mzscheme interface doesn't compile on Win32. -Solution: Fix the problem that 7.1.015 fixed in a better way. (Sergey Khorev) -Files: src/if_mzsch.c - - -*** ../vim-7.1.020/src/if_mzsch.c Thu Jun 28 13:02:22 2007 ---- src/if_mzsch.c Sun Jul 1 18:44:49 2007 -*************** -*** 308,313 **** ---- 308,315 ---- - static Scheme_Config *(*dll_scheme_current_config)(void); - static Scheme_Object *(*dll_scheme_char_string_to_byte_string) - (Scheme_Object *s); -+ static Scheme_Object *(*dll_scheme_char_string_to_path) -+ (Scheme_Object *s); - # endif - - /* arrays are imported directly */ -*************** -*** 398,403 **** ---- 400,407 ---- - # define scheme_current_config dll_scheme_current_config - # define scheme_char_string_to_byte_string \ - dll_scheme_char_string_to_byte_string -+ # define scheme_char_string_to_path \ -+ dll_scheme_char_string_to_path - # endif - - typedef struct -*************** -*** 498,503 **** ---- 502,509 ---- - {"scheme_current_config", (void **)&dll_scheme_current_config}, - {"scheme_char_string_to_byte_string", - (void **)&dll_scheme_char_string_to_byte_string}, -+ {"scheme_char_string_to_path", -+ (void **)&dll_scheme_char_string_to_path}, - # endif - {NULL, NULL}}; - -*************** -*** 773,779 **** - #ifdef MZSCHEME_COLLECTS - /* setup 'current-library-collection-paths' parameter */ - scheme_set_param(scheme_config, MZCONFIG_COLLECTION_PATHS, -! scheme_build_list(0, scheme_make_string(MZSCHEME_COLLECTS))); - #endif - #ifdef HAVE_SANDBOX - /* setup sandbox guards */ ---- 779,793 ---- - #ifdef MZSCHEME_COLLECTS - /* setup 'current-library-collection-paths' parameter */ - scheme_set_param(scheme_config, MZCONFIG_COLLECTION_PATHS, -! scheme_make_pair( -! # if MZSCHEME_VERSION_MAJOR >= 299 -! scheme_char_string_to_path( -! scheme_byte_string_to_char_string( -! scheme_make_byte_string(MZSCHEME_COLLECTS))), -! # else -! scheme_make_string(MZSCHEME_COLLECTS), -! # endif -! scheme_null)); - #endif - #ifdef HAVE_SANDBOX - /* setup sandbox guards */ -*** ../vim-7.1.020/src/version.c Thu Jul 5 10:10:29 2007 ---- src/version.c Fri Jul 6 19:41:04 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 21, - /**/ - --- -Advice to worms: Sleep late. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.022 b/7.1.022 deleted file mode 100644 index 1357982b..00000000 --- a/7.1.022 +++ /dev/null @@ -1,67 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.022 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.022 -Problem: When setting 'keymap' twice the b:keymap_name variable isn't set. - (Milan Berta) -Solution: Don't unlet b:keymap_name for ":loadkeymap". (Martin Toft) -Files: src/digraph.c - - -*** ../vim-7.1.021/src/digraph.c Wed May 3 00:07:11 2006 ---- src/digraph.c Mon Jul 2 21:24:30 2007 -*************** -*** 2349,2356 **** - - if (*curbuf->b_p_keymap == NUL) - { -! /* Stop any active keymap and clear the table. */ - keymap_unload(); - } - else - { ---- 2349,2358 ---- - - if (*curbuf->b_p_keymap == NUL) - { -! /* Stop any active keymap and clear the table. Also remove -! * b:keymap_unload, as no keymap is active now. */ - keymap_unload(); -+ do_cmdline_cmd((char_u *)"unlet! b:keymap_name"); - } - else - { -*************** -*** 2500,2506 **** - - ga_clear(&curbuf->b_kmap_ga); - curbuf->b_kmap_state &= ~KEYMAP_LOADED; -- do_cmdline_cmd((char_u *)"unlet! b:keymap_name"); - #ifdef FEAT_WINDOWS - status_redraw_curbuf(); - #endif ---- 2502,2507 ---- -*** ../vim-7.1.021/src/version.c Fri Jul 6 19:42:09 2007 ---- src/version.c Sat Jul 7 13:56:52 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 22, - /**/ - --- -If your life is a hard drive, -Christ can be your backup. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.023 b/7.1.023 deleted file mode 100644 index 28fe3506..00000000 --- a/7.1.023 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.023 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.023 -Problem: "dw" in a line with one character deletes the line. Vi and nvi - don't do this. (Kjell Arne Rekaa) -Solution: Check for one-character words especially. -Files: src/search.c - - -*** ../vim-7.1.022/src/search.c Tue Jun 19 12:58:55 2007 ---- src/search.c Thu Jul 5 21:18:55 2007 -*************** -*** 2795,2801 **** - i = inc_cursor(); - if (i == -1 || (i >= 1 && last_line)) /* started at last char in file */ - return FAIL; -! if (i == 1 && eol && count == 0) /* started at last char in line */ - return OK; - - /* ---- 2802,2808 ---- - i = inc_cursor(); - if (i == -1 || (i >= 1 && last_line)) /* started at last char in file */ - return FAIL; -! if (i >= 1 && eol && count == 0) /* started at last char in line */ - return OK; - - /* -*** ../vim-7.1.022/src/version.c Sat Jul 7 13:57:39 2007 ---- src/version.c Tue Jul 10 12:35:36 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 23, - /**/ - --- -BRIDGEKEEPER: What is your favorite editor? -GAWAIN: Emacs ... No, Viiiiiiiiiiimmmmmmm! - "Monty Python and the Holy editor wars" PYTHON (MONTY) SOFTWARE LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.024 b/7.1.024 deleted file mode 100644 index 6bde6009..00000000 --- a/7.1.024 +++ /dev/null @@ -1,47 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.024 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.024 -Problem: Using a pointer that has become invalid. (Chris Monson) -Solution: Obtain the line pointer again after we looked at another line. -Files: src/search.c - - -*** ../vim-7.1.023/src/search.c Tue Jul 10 12:36:51 2007 ---- src/search.c Thu Jul 5 21:18:55 2007 -*************** -*** 2124,2129 **** ---- 2128,2136 ---- - else if (!backwards) - inquote = TRUE; - } -+ -+ /* ml_get() only keeps one line, need to get linep again */ -+ linep = ml_get(pos.lnum); - } - } - } -*** ../vim-7.1.023/src/version.c Tue Jul 10 12:36:51 2007 ---- src/version.c Tue Jul 10 13:06:02 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 24, - /**/ - --- -Q: Why does /dev/null accept only integers? -A: You can't sink a float. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.025 b/7.1.025 deleted file mode 100644 index 54e292cc..00000000 --- a/7.1.025 +++ /dev/null @@ -1,72 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.025 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.025 -Problem: search() and searchpos() don't use match under cursor at start of - line when using 'bc' flags. (Viktor Kojouharov) -Solution: Don't go to the previous line when the 'c' flag is present. - Also fix that "j" doesn't move the cursor to the right column. -Files: src/eval.c, src/search.c - - -*** ../vim-7.1.024/src/eval.c Tue Jun 19 17:23:46 2007 ---- src/eval.c Thu Jul 5 21:16:31 2007 -*************** -*** 13925,13930 **** ---- 13925,13932 ---- - /* If 'n' flag is used: restore cursor position. */ - if (flags & SP_NOMOVE) - curwin->w_cursor = save_cursor; -+ else -+ curwin->w_set_curswant = TRUE; - theend: - p_ws = save_p_ws; - -*** ../vim-7.1.024/src/search.c Tue Jul 10 13:07:08 2007 ---- src/search.c Thu Jul 5 21:18:55 2007 -*************** -*** 573,580 **** - /* - * Start searching in current line, unless searching backwards and - * we're in column 0. - */ -! if (dir == BACKWARD && start_pos.col == 0) - { - lnum = pos->lnum - 1; - at_first_line = FALSE; ---- 573,584 ---- - /* - * Start searching in current line, unless searching backwards and - * we're in column 0. -+ * If we are searching backwards, in column 0, and not including the -+ * current position, gain some efficiency by skipping back a line. -+ * Otherwise begin the search in the current line. - */ -! if (dir == BACKWARD && start_pos.col == 0 -! && (options & SEARCH_START) == 0) - { - lnum = pos->lnum - 1; - at_first_line = FALSE; -*** ../vim-7.1.024/src/version.c Tue Jul 10 13:07:08 2007 ---- src/version.c Tue Jul 10 13:26:13 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 25, - /**/ - --- -SIGFUN -- signature too funny (core dumped) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.026 b/7.1.026 deleted file mode 100644 index 071331ae..00000000 --- a/7.1.026 +++ /dev/null @@ -1,55 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.026 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.026 -Problem: "[p" doesn't work in Visual mode. (David Brown) -Solution: Use checkclearop() instead of checkclearopq(). -Files: src/normal.c - - -*** ../vim-7.1.025/src/normal.c Thu May 10 18:45:26 2007 ---- src/normal.c Wed Jul 4 21:16:36 2007 -*************** -*** 6379,6385 **** - */ - else if (cap->nchar == 'p' || cap->nchar == 'P') - { -! if (!checkclearopq(cap->oap)) - { - prep_redo_cmd(cap); - do_put(cap->oap->regname, ---- 6379,6385 ---- - */ - else if (cap->nchar == 'p' || cap->nchar == 'P') - { -! if (!checkclearop(cap->oap)) - { - prep_redo_cmd(cap); - do_put(cap->oap->regname, -*** ../vim-7.1.025/src/version.c Tue Jul 10 13:27:46 2007 ---- src/version.c Tue Jul 10 14:01:52 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 26, - /**/ - --- -BRIDGEKEEPER: What is the air-speed velocity of an unladen swallow? -ARTHUR: What do you mean? An African or European swallow? -BRIDGEKEEPER: Er ... I don't know that ... Aaaaarrrrrrggghhh! - BRIDGEKEEPER is cast into the gorge. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.027 b/7.1.027 deleted file mode 100644 index b13676f0..00000000 --- a/7.1.027 +++ /dev/null @@ -1,120 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.027 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.027 -Problem: On Sun systems opening /dev/fd/N doesn't work, and they are used - by process substitutions. -Solution: Allow opening specific character special files for Sun systems. - (Gary Johnson) -Files: src/fileio.c, src/os_unix.h - - -*** ../vim-7.1.026/src/fileio.c Thu Jun 28 21:57:08 2007 ---- src/fileio.c Mon Jul 9 11:19:50 2007 -*************** -*** 44,49 **** ---- 44,53 ---- - /* Is there any system that doesn't have access()? */ - #define USE_MCH_ACCESS - -+ #if defined(sun) && defined(S_ISCHR) -+ # define OPEN_CHR_FILES -+ static int is_dev_fd_file(char_u *fname); -+ #endif - #ifdef FEAT_MBYTE - static char_u *next_fenc __ARGS((char_u **pp)); - # ifdef FEAT_EVAL -*************** -*** 406,411 **** ---- 410,419 ---- - # ifdef S_ISSOCK - && !S_ISSOCK(perm) /* ... or socket */ - # endif -+ # ifdef OPEN_CHR_FILES -+ && !(S_ISCHR(perm) && is_dev_fd_file(fname)) -+ /* ... or a character special file named /dev/fd/ */ -+ # endif - ) - { - if (S_ISDIR(perm)) -*************** -*** 2265,2270 **** ---- 2273,2285 ---- - } - # endif - # endif -+ # ifdef OPEN_CHR_FILES -+ if (S_ISCHR(perm)) /* or character special */ -+ { -+ STRCAT(IObuff, _("[character special]")); -+ c = TRUE; -+ } -+ # endif - #endif - if (curbuf->b_p_ro) - { -*************** -*** 2463,2468 **** ---- 2478,2502 ---- - return FAIL; - return OK; - } -+ -+ #ifdef OPEN_CHR_FILES -+ /* -+ * Returns TRUE if the file name argument is of the form "/dev/fd/\d\+", -+ * which is the name of files used for process substitution output by -+ * some shells on some operating systems, e.g., bash on SunOS. -+ * Do not accept "/dev/fd/[012]", opening these may hang Vim. -+ */ -+ static int -+ is_dev_fd_file(fname) -+ char_u *fname; -+ { -+ return (STRNCMP(fname, "/dev/fd/", 8) == 0 -+ && VIM_ISDIGIT(fname[8]) -+ && *skipdigits(fname + 9) == NUL -+ && (fname[9] != NUL -+ || (fname[8] != '0' && fname[8] != '1' && fname[8] != '2'))); -+ } -+ #endif - - #ifdef FEAT_MBYTE - -*** ../vim-7.1.026/src/os_unix.h Thu May 10 19:43:10 2007 ---- src/os_unix.h Sat Jul 7 13:08:56 2007 -*************** -*** 508,513 **** ---- 508,516 ---- - #if !defined(S_ISFIFO) && defined(S_IFIFO) - # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) - #endif -+ #if !defined(S_ISCHR) && defined(S_IFCHR) -+ # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) -+ #endif - - /* Note: Some systems need both string.h and strings.h (Savage). However, - * some systems can't handle both, only use string.h in that case. */ -*** ../vim-7.1.026/src/version.c Tue Jul 10 14:02:51 2007 ---- src/version.c Tue Jul 10 17:00:43 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 27, - /**/ - --- -Every exit is an entrance into something else. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.028 b/7.1.028 deleted file mode 100644 index a1b4e7aa..00000000 --- a/7.1.028 +++ /dev/null @@ -1,71 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.028 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.028 -Problem: Can't use last search pattern for ":sort". (Brian McKee) -Solution: When the pattern is emtpy use the last search pattern. (Martin - Toft) -Files: runtime/doc/change.txt, src/ex_cmds.c - - -*** ../vim-7.1.027/runtime/doc/change.txt Sat May 12 16:10:12 2007 ---- runtime/doc/change.txt Tue Jul 10 11:30:56 2007 -*************** -*** 1571,1576 **** ---- 1571,1580 ---- - in their original order, right before the sorted - lines. - -+ If {pattern} is empty (e.g. // is specified), the -+ last search pattern is used. This allows trying out -+ a pattern first. -+ - Note that using ":sort" with ":global" doesn't sort the matching lines, it's - quite useless. - -*** ../vim-7.1.027/src/ex_cmds.c Thu Jun 28 21:57:08 2007 ---- src/ex_cmds.c Tue Jul 10 17:25:10 2007 -*************** -*** 408,414 **** - goto sortend; - } - *s = NUL; -! regmatch.regprog = vim_regcomp(p + 1, RE_MAGIC); - if (regmatch.regprog == NULL) - goto sortend; - p = s; /* continue after the regexp */ ---- 408,418 ---- - goto sortend; - } - *s = NUL; -! /* Use last search pattern if sort pattern is empty. */ -! if (s == p + 1 && last_search_pat() != NULL) -! regmatch.regprog = vim_regcomp(last_search_pat(), RE_MAGIC); -! else -! regmatch.regprog = vim_regcomp(p + 1, RE_MAGIC); - if (regmatch.regprog == NULL) - goto sortend; - p = s; /* continue after the regexp */ -*** ../vim-7.1.027/src/version.c Tue Jul 10 17:09:51 2007 ---- src/version.c Tue Jul 10 17:20:01 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 28, - /**/ - --- -Every person is responsible for the choices he makes. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.029 b/7.1.029 deleted file mode 100644 index 069e19ed..00000000 --- a/7.1.029 +++ /dev/null @@ -1,84 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.029 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.029 (after 7.1.019) -Problem: Can't compile when all interfaces are used. (Taylor Venable) -Solution: Only check for ex_script_ni when it's defined. -Files: src/ex_docmd.c - - -*** ../vim-7.1.028/src/ex_docmd.c Thu Jul 5 09:53:20 2007 ---- src/ex_docmd.c Sun Jul 15 17:20:09 2007 -*************** -*** 133,138 **** ---- 133,139 ---- - static void get_flags __ARGS((exarg_T *eap)); - #if !defined(FEAT_PERL) || !defined(FEAT_PYTHON) || !defined(FEAT_TCL) \ - || !defined(FEAT_RUBY) || !defined(FEAT_MZSCHEME) -+ # define HAVE_EX_SCRIPT_NI - static void ex_script_ni __ARGS((exarg_T *eap)); - #endif - static char_u *invalid_range __ARGS((exarg_T *eap)); -*************** -*** 2119,2125 **** - !USER_CMDIDX(ea.cmdidx) && - #endif - (cmdnames[ea.cmdidx].cmd_func == ex_ni -! || cmdnames[ea.cmdidx].cmd_func == ex_script_ni)); - - #ifndef FEAT_EVAL - /* ---- 2120,2129 ---- - !USER_CMDIDX(ea.cmdidx) && - #endif - (cmdnames[ea.cmdidx].cmd_func == ex_ni -! #ifdef HAVE_EX_SCRIPT_NI -! || cmdnames[ea.cmdidx].cmd_func == ex_script_ni -! #endif -! )); - - #ifndef FEAT_EVAL - /* -*************** -*** 3998,4005 **** - eap->errmsg = (char_u *)N_("E319: Sorry, the command is not available in this version"); - } - -! #if !defined(FEAT_PERL) || !defined(FEAT_PYTHON) || !defined(FEAT_TCL) \ -! || !defined(FEAT_RUBY) || !defined(FEAT_MZSCHEME) - /* - * Function called for script command which is Not Implemented. NI! - * Skips over ":perl <errmsg = (char_u *)N_("E319: Sorry, the command is not available in this version"); - } - -! #ifdef HAVE_EX_SCRIPT_NI - /* - * Function called for script command which is Not Implemented. NI! - * Skips over ":perl < -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.030 -Problem: The "vimtutor" shell script checks for "vim6" but not for "vim7". - (Christian Robinson) -Solution: Check for more versions, but prefer using "vim". -Files: src/vimtutor - - -*** ../vim-7.1.029/src/vimtutor Sun Jun 13 20:37:33 2004 ---- src/vimtutor Sun Jul 8 17:16:29 2007 -*************** -*** 39,56 **** - # remove the copy of the tutor on exit - trap "rm -rf $TODELETE" 0 1 2 3 9 11 13 15 - -! # Vim could be called "vim" or "vi". Also check for "vim6", for people who -! # have Vim 5.x installed as "vim" and Vim 6.0 as "vim6". -! testvim=`which vim6 2>/dev/null` -! if test -f "$testvim"; then -! VIM=vim6 -! else -! testvim=`which vim` - if test -f "$testvim"; then -! VIM=vim -! else -! VIM=vi - fi - fi - - # Use Vim to copy the tutor, it knows the value of $VIMRUNTIME ---- 39,60 ---- - # remove the copy of the tutor on exit - trap "rm -rf $TODELETE" 0 1 2 3 9 11 13 15 - -! # Vim could be called "vim" or "vi". Also check for "vimN", for people who -! # have Vim installed with its version number. -! # We anticipate up to a future Vim 8 version :-). -! seq="vim vim8 vim75 vim74 vim73 vim72 vim71 vim70 vim7 vim6 vi" -! for i in $seq; do -! testvim=`which $i 2>/dev/null` - if test -f "$testvim"; then -! VIM=$i -! break - fi -+ done -+ -+ # When no Vim version was found fall back to "vim", you'll get an error message -+ # below. -+ if test -z "$VIM"; then -+ VIM=vim - fi - - # Use Vim to copy the tutor, it knows the value of $VIMRUNTIME -*** ../vim-7.1.029/src/version.c Mon Jul 16 20:38:56 2007 ---- src/version.c Tue Jul 17 14:30:51 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 30, - /**/ - --- -BLACK KNIGHT: I'm invincible! -ARTHUR: You're a looney. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.031 b/7.1.031 deleted file mode 100644 index a03ac8ce..00000000 --- a/7.1.031 +++ /dev/null @@ -1,191 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.031 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.031 -Problem: virtcol([123, '$']) doesn't work. (Michael Schaap) -Solution: When '$' is used for the column number get the last column. -Files: runtime/doc/eval.txt, src/eval.c - - -*** ../vim-7.1.030/runtime/doc/eval.txt Tue Jun 19 17:23:46 2007 ---- runtime/doc/eval.txt Wed Jul 11 21:21:28 2007 -*************** -*** 1,4 **** -! *eval.txt* For Vim version 7.1. Last change: 2007 Jun 09 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *eval.txt* For Vim version 7.1. Last change: 2007 Jul 11 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 2020,2025 **** ---- 2020,2029 ---- - number of characters in the cursor line plus one) - 'x position of mark x (if the mark is not set, 0 is - returned) -+ Additionally {expr} can be [lnum, col]: a |List| with the line -+ and column number. Most useful when the column is "$", to get -+ the las column of a specific line. When "lnum" or "col" is -+ out of range then col() returns zero. - To get the line number use |line()|. To get both use - |getpos()|. - For the screen column position use |virtcol()|. -*************** -*** 5024,5037 **** - position, the returned Number will be the column at the end of - the . For example, for a in column 1, with 'ts' - set to 8, it returns 8. -! For the use of {expr} see |col()|. Additionally you can use -! [lnum, col]: a |List| with the line and column number. When -! "lnum" or "col" is out of range then virtcol() returns zero. -! When 'virtualedit' is used it can be [lnum, col, off], where - "off" is the offset in screen columns from the start of the - character. E.g., a position within a or after the last - character. -- For the byte position use |col()|. - When Virtual editing is active in the current mode, a position - beyond the end of the line can be returned. |'virtualedit'| - The accepted positions are: ---- 5029,5040 ---- - position, the returned Number will be the column at the end of - the . For example, for a in column 1, with 'ts' - set to 8, it returns 8. -! For the byte position use |col()|. -! For the use of {expr} see |col()|. -! When 'virtualedit' is used {expr} can be [lnum, col, off], where - "off" is the offset in screen columns from the start of the - character. E.g., a position within a or after the last - character. - When Virtual editing is active in the current mode, a position - beyond the end of the line can be returned. |'virtualedit'| - The accepted positions are: -*** ../vim-7.1.030/src/eval.c Tue Jul 10 13:27:46 2007 ---- src/eval.c Wed Jul 11 19:50:27 2007 -*************** -*** 672,678 **** - static void f_writefile __ARGS((typval_T *argvars, typval_T *rettv)); - - static int list2fpos __ARGS((typval_T *arg, pos_T *posp, int *fnump)); -! static pos_T *var2fpos __ARGS((typval_T *varp, int lnum, int *fnum)); - static int get_env_len __ARGS((char_u **arg)); - static int get_id_len __ARGS((char_u **arg)); - static int get_name_len __ARGS((char_u **arg, char_u **alias, int evaluate, int verbose)); ---- 672,678 ---- - static void f_writefile __ARGS((typval_T *argvars, typval_T *rettv)); - - static int list2fpos __ARGS((typval_T *arg, pos_T *posp, int *fnump)); -! static pos_T *var2fpos __ARGS((typval_T *varp, int dollar_lnum, int *fnum)); - static int get_env_len __ARGS((char_u **arg)); - static int get_id_len __ARGS((char_u **arg)); - static int get_name_len __ARGS((char_u **arg, char_u **alias, int evaluate, int verbose)); -*************** -*** 16505,16513 **** - * Returns NULL when there is an error. - */ - static pos_T * -! var2fpos(varp, lnum, fnum) - typval_T *varp; -! int lnum; /* TRUE when $ is last line */ - int *fnum; /* set to fnum for '0, 'A, etc. */ - { - char_u *name; ---- 16508,16516 ---- - * Returns NULL when there is an error. - */ - static pos_T * -! var2fpos(varp, dollar_lnum, fnum) - typval_T *varp; -! int dollar_lnum; /* TRUE when $ is last line */ - int *fnum; /* set to fnum for '0, 'A, etc. */ - { - char_u *name; -*************** -*** 16520,16525 **** ---- 16523,16529 ---- - list_T *l; - int len; - int error = FALSE; -+ listitem_T *li; - - l = varp->vval.v_list; - if (l == NULL) -*************** -*** 16535,16540 **** ---- 16539,16552 ---- - if (error) - return NULL; - len = (long)STRLEN(ml_get(pos.lnum)); -+ -+ /* We accept "$" for the column number: last column. */ -+ li = list_find(l, 1L); -+ if (li != NULL && li->li_tv.v_type == VAR_STRING -+ && li->li_tv.vval.v_string != NULL -+ && STRCMP(li->li_tv.vval.v_string, "$") == 0) -+ pos.col = len + 1; -+ - /* Accept a position up to the NUL after the line. */ - if (pos.col == 0 || (int)pos.col > len + 1) - return NULL; /* invalid column number */ -*************** -*** 16567,16573 **** - pos.coladd = 0; - #endif - -! if (name[0] == 'w' && lnum) - { - pos.col = 0; - if (name[1] == '0') /* "w0": first visible line */ ---- 16579,16585 ---- - pos.coladd = 0; - #endif - -! if (name[0] == 'w' && dollar_lnum) - { - pos.col = 0; - if (name[1] == '0') /* "w0": first visible line */ -*************** -*** 16585,16591 **** - } - else if (name[0] == '$') /* last column or line */ - { -! if (lnum) - { - pos.lnum = curbuf->b_ml.ml_line_count; - pos.col = 0; ---- 16597,16603 ---- - } - else if (name[0] == '$') /* last column or line */ - { -! if (dollar_lnum) - { - pos.lnum = curbuf->b_ml.ml_line_count; - pos.col = 0; -*** ../vim-7.1.030/src/version.c Tue Jul 17 14:32:07 2007 ---- src/version.c Tue Jul 17 16:24:54 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 31, - /**/ - --- -CRONE: Who sent you? -ARTHUR: The Knights Who Say GNU! -CRONE: Aaaagh! (she looks around in rear) No! We have no licenses here. - "Monty Python and the Holy editor wars" PYTHON (MONTY) SOFTWARE LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.032 b/7.1.032 deleted file mode 100644 index f2ed6996..00000000 --- a/7.1.032 +++ /dev/null @@ -1,97 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.032 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.032 -Problem: Potential crash when editing a command line. (Chris Monson) -Solution: Check the position to avoid access before the start of an array. -Files: src/ex_getln.c - - -*** ../vim-7.1.031/src/ex_getln.c Thu May 10 20:22:29 2007 ---- src/ex_getln.c Tue Jul 17 18:05:49 2007 -*************** -*** 484,490 **** - if (xpc.xp_context == EXPAND_MENUNAMES && p_wmnu) - { - /* Hitting after "emenu Name.": complete submenu */ -! if (ccline.cmdbuff[ccline.cmdpos - 1] == '.' && c == K_DOWN) - c = p_wc; - else if (c == K_UP) - { ---- 486,493 ---- - if (xpc.xp_context == EXPAND_MENUNAMES && p_wmnu) - { - /* Hitting after "emenu Name.": complete submenu */ -! if (c == K_DOWN && ccline.cmdpos > 0 -! && ccline.cmdbuff[ccline.cmdpos - 1] == '.') - c = p_wc; - else if (c == K_UP) - { -*************** -*** 533,541 **** - upseg[3] = PATHSEP; - upseg[4] = NUL; - -! if (ccline.cmdbuff[ccline.cmdpos - 1] == PATHSEP -! && c == K_DOWN -! && (ccline.cmdbuff[ccline.cmdpos - 2] != '.' - || ccline.cmdbuff[ccline.cmdpos - 3] != '.')) - { - /* go down a directory */ ---- 536,546 ---- - upseg[3] = PATHSEP; - upseg[4] = NUL; - -! if (c == K_DOWN -! && ccline.cmdpos > 0 -! && ccline.cmdbuff[ccline.cmdpos - 1] == PATHSEP -! && (ccline.cmdpos < 3 -! || ccline.cmdbuff[ccline.cmdpos - 2] != '.' - || ccline.cmdbuff[ccline.cmdpos - 3] != '.')) - { - /* go down a directory */ -*************** -*** 730,737 **** - /* In Ex mode a backslash escapes a newline. */ - if (exmode_active - && c != ESC -- && ccline.cmdpos > 0 - && ccline.cmdpos == ccline.cmdlen - && ccline.cmdbuff[ccline.cmdpos - 1] == '\\') - { - if (c == K_KENTER) ---- 735,742 ---- - /* In Ex mode a backslash escapes a newline. */ - if (exmode_active - && c != ESC - && ccline.cmdpos == ccline.cmdlen -+ && ccline.cmdpos > 0 - && ccline.cmdbuff[ccline.cmdpos - 1] == '\\') - { - if (c == K_KENTER) -*** ../vim-7.1.031/src/version.c Tue Jul 17 16:31:15 2007 ---- src/version.c Tue Jul 17 18:10:37 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 32, - /**/ - --- -ALL: A witch! A witch! -WITCH: It's a fair cop. -ALL: Burn her! Burn her! Let's make her into a ladder. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.033 b/7.1.033 deleted file mode 100644 index 9b7c73bb..00000000 --- a/7.1.033 +++ /dev/null @@ -1,48 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.033 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.033 -Problem: A buffer is marked modified when it was first deleted and then - added again using a ":next" command. (John Mullin) -Solution: When checking if a buffer is modified use the BF_NEVERLOADED flag. -Files: src/option.c - - -*** ../vim-7.1.032/src/option.c Tue Jun 19 20:56:52 2007 ---- src/option.c Sun Jul 22 16:42:47 2007 -*************** -*** 10624,10629 **** ---- 10624,10632 ---- - file_ff_differs(buf) - buf_T *buf; - { -+ /* In a buffer that was never loaded the options are not valid. */ -+ if (buf->b_flags & BF_NEVERLOADED) -+ return FALSE; - if ((buf->b_flags & BF_NEW) - && buf->b_ml.ml_line_count == 1 - && *ml_get_buf(buf, (linenr_T)1, FALSE) == NUL) -*** ../vim-7.1.032/src/version.c Tue Jul 17 18:14:14 2007 ---- src/version.c Mon Jul 23 09:45:44 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 33, - /**/ - --- -How To Keep A Healthy Level Of Insanity: -8. Don't use any punctuation marks. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.034 b/7.1.034 deleted file mode 100644 index 5801c941..00000000 --- a/7.1.034 +++ /dev/null @@ -1,116 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.034 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.034 -Problem: Win64: A few compiler warnings. Problems with optimizer. -Solution: Use int instead of size_t. Disable the optimizer in one function. - (George V. Reilly) -Files: src/eval.c, src/spell.c - - -*** ../vim-7.1.033/src/eval.c Tue Jul 17 16:31:15 2007 ---- src/eval.c Wed Jul 11 19:50:27 2007 -*************** -*** 992,1011 **** - char_u *value; - int value_len; - { -! size_t len; - - if (redir_lval == NULL) - return; - - if (value_len == -1) -! len = STRLEN(value); /* Append the entire string */ - else -! len = value_len; /* Append only "value_len" characters */ - -! if (ga_grow(&redir_ga, (int)len) == OK) - { - mch_memmove((char *)redir_ga.ga_data + redir_ga.ga_len, value, len); -! redir_ga.ga_len += (int)len; - } - else - var_redir_stop(); ---- 992,1011 ---- - char_u *value; - int value_len; - { -! int len; - - if (redir_lval == NULL) - return; - - if (value_len == -1) -! len = (int)STRLEN(value); /* Append the entire string */ - else -! len = value_len; /* Append only "value_len" characters */ - -! if (ga_grow(&redir_ga, len) == OK) - { - mch_memmove((char *)redir_ga.ga_data + redir_ga.ga_len, value, len); -! redir_ga.ga_len += len; - } - else - var_redir_stop(); -*** ../vim-7.1.033/src/spell.c Thu May 10 18:45:53 2007 ---- src/spell.c Sat Jul 14 17:17:52 2007 -*************** -*** 7829,7835 **** - # if (_MSC_VER <= 1200) - /* This line is required for VC6 without the service pack. Also see the - * matching #pragma below. */ -! /* # pragma optimize("", off) */ - # endif - #endif - ---- 7829,7835 ---- - # if (_MSC_VER <= 1200) - /* This line is required for VC6 without the service pack. Also see the - * matching #pragma below. */ -! # pragma optimize("", off) - # endif - #endif - -*************** -*** 7859,7865 **** - - #ifdef _MSC_VER - # if (_MSC_VER <= 1200) -! /* # pragma optimize("", on) */ - # endif - #endif - ---- 7859,7865 ---- - - #ifdef _MSC_VER - # if (_MSC_VER <= 1200) -! # pragma optimize("", on) - # endif - #endif - -*** ../vim-7.1.033/src/version.c Tue Jul 24 09:50:22 2007 ---- src/version.c Tue Jul 24 09:47:17 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 34, - /**/ - --- -How To Keep A Healthy Level Of Insanity: -17. When the money comes out the ATM, scream "I won!, I won! 3rd - time this week!!!!!" - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.035 b/7.1.035 deleted file mode 100644 index 77fcb72b..00000000 --- a/7.1.035 +++ /dev/null @@ -1,52 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.035 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.035 -Problem: After ":s/./&/#" all listed lines have a line number. (Yakov - Lerner) -Solution: Reset the line number flag when not using the "&" flag. -Files: src/ex_cmds.c - - -*** ../vim-7.1.034/src/ex_cmds.c Tue Jul 10 17:25:20 2007 ---- src/ex_cmds.c Sat Jul 14 14:39:38 2007 -*************** -*** 4316,4321 **** ---- 4316,4322 ---- - do_error = TRUE; - do_print = FALSE; - do_count = FALSE; -+ do_number = FALSE; - do_ic = 0; - } - while (*cmd) -*** ../vim-7.1.034/src/version.c Tue Jul 24 10:44:10 2007 ---- src/version.c Tue Jul 24 11:15:09 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 35, - /**/ - --- -The startling truth finally became apparent, and it was this: Numbers -written on restaurant checks within the confines of restaurants do not follow -the same mathematical laws as numbers written on any other pieces of paper in -any other parts of the Universe. This single statement took the scientific -world by storm. So many mathematical conferences got held in such good -restaurants that many of the finest minds of a generation died of obesity and -heart failure, and the science of mathematics was put back by years. - -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy" - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.036 b/7.1.036 deleted file mode 100644 index 5366b3e4..00000000 --- a/7.1.036 +++ /dev/null @@ -1,461 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.036 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.036 -Problem: Completing ":echohl" argument should include "None". (Ori - Avtalion) ":match" should have "none" too. -Solution: Add flags to use expand_highlight(). Also fix that when disabling - FEAT_CMDL_COMPL compilation fails. (Chris Lubinski) -Files: src/eval.c, src/ex_docmd.c, src/ex_getln.c, src/proto/syntax.pro - src/syntax.c - - -*** ../vim-7.1.035/src/eval.c Tue Jul 24 10:44:10 2007 ---- src/eval.c Wed Jul 11 19:50:27 2007 -*************** -*** 1411,1417 **** - } - - -! #if (defined(FEAT_USR_CMDS) && defined(FEAT_CMDL_COMPL)) || defined(PROTO) - /* - * Call some vimL function and return the result in "*rettv". - * Uses argv[argc] for the function arguments. ---- 1411,1418 ---- - } - - -! #if (defined(FEAT_USR_CMDS) && defined(FEAT_CMDL_COMPL)) \ -! || defined(FEAT_COMPL_FUNC) || defined(PROTO) - /* - * Call some vimL function and return the result in "*rettv". - * Uses argv[argc] for the function arguments. -*************** -*** 1484,1489 **** ---- 1485,1491 ---- - return ret; - } - -+ # if (defined(FEAT_USR_CMDS) && defined(FEAT_CMDL_COMPL)) || defined(PROTO) - /* - * Call vimL function "func" and return the result as a string. - * Returns NULL when calling the function fails. -*************** -*** 1506,1513 **** - clear_tv(&rettv); - return retval; - } - -! #if defined(FEAT_COMPL_FUNC) || defined(PROTO) - /* - * Call vimL function "func" and return the result as a number. - * Returns -1 when calling the function fails. ---- 1508,1516 ---- - clear_tv(&rettv); - return retval; - } -+ # endif - -! # if defined(FEAT_COMPL_FUNC) || defined(PROTO) - /* - * Call vimL function "func" and return the result as a number. - * Returns -1 when calling the function fails. -*************** -*** 1530,1536 **** - clear_tv(&rettv); - return retval; - } -! #endif - - /* - * Call vimL function "func" and return the result as a list ---- 1533,1539 ---- - clear_tv(&rettv); - return retval; - } -! # endif - - /* - * Call vimL function "func" and return the result as a list -*************** -*** 1556,1563 **** - - return rettv.vval.v_list; - } -- - #endif - - /* - * Save the current function call pointer, and set it to NULL. ---- 1559,1566 ---- - - return rettv.vval.v_list; - } - #endif -+ - - /* - * Save the current function call pointer, and set it to NULL. -*** ../vim-7.1.035/src/ex_docmd.c Mon Jul 16 20:38:56 2007 ---- src/ex_docmd.c Sun Jul 15 17:20:09 2007 -*************** -*** 3406,3419 **** - case CMD_windo: - return arg; - -! #ifdef FEAT_SEARCH_EXTRA - case CMD_match: - if (*arg == NUL || !ends_excmd(*arg)) - { -! /* Dummy call to clear variables. */ -! set_context_in_highlight_cmd(xp, (char_u *)"link n"); -! xp->xp_context = EXPAND_HIGHLIGHT; -! xp->xp_pattern = arg; - arg = skipwhite(skiptowhite(arg)); - if (*arg != NUL) - { ---- 3406,3418 ---- - case CMD_windo: - return arg; - -! #ifdef FEAT_CMDL_COMPL -! # ifdef FEAT_SEARCH_EXTRA - case CMD_match: - if (*arg == NUL || !ends_excmd(*arg)) - { -! /* also complete "None" */ -! set_context_in_echohl_cmd(xp, arg); - arg = skipwhite(skiptowhite(arg)); - if (*arg != NUL) - { -*************** -*** 3422,3430 **** - } - } - return find_nextcmd(arg); -! #endif - -- #ifdef FEAT_CMDL_COMPL - /* - * All completion for the +cmdline_compl feature goes here. - */ ---- 3421,3428 ---- - } - } - return find_nextcmd(arg); -! # endif - - /* - * All completion for the +cmdline_compl feature goes here. - */ -*************** -*** 3622,3629 **** - break; - - case CMD_echohl: -! xp->xp_context = EXPAND_HIGHLIGHT; -! xp->xp_pattern = arg; - break; - #endif - case CMD_highlight: ---- 3620,3626 ---- - break; - - case CMD_echohl: -! set_context_in_echohl_cmd(xp, arg); - break; - #endif - case CMD_highlight: -*** ../vim-7.1.035/src/ex_getln.c Tue Jul 17 18:14:14 2007 ---- src/ex_getln.c Tue Jul 17 18:05:49 2007 -*************** -*** 268,274 **** ---- 268,276 ---- - { - xpc.xp_context = ccline.xp_context; - xpc.xp_pattern = ccline.cmdbuff; -+ # if defined(FEAT_USR_CMDS) && defined(FEAT_CMDL_COMPL) - xpc.xp_arg = ccline.xp_arg; -+ # endif - } - #endif - -*************** -*** 4151,4163 **** ---- 4153,4171 ---- - - #ifdef FEAT_EVAL - if (ccline.cmdfirstc == '=') -+ { -+ # ifdef FEAT_CMDL_COMPL - /* pass CMD_SIZE because there is no real command */ - set_context_for_expression(xp, str, CMD_SIZE); -+ # endif -+ } - else if (ccline.input_fn) - { - xp->xp_context = ccline.xp_context; - xp->xp_pattern = ccline.cmdbuff; -+ # if defined(FEAT_USR_CMDS) && defined(FEAT_CMDL_COMPL) - xp->xp_arg = ccline.xp_arg; -+ # endif - } - else - #endif -*************** -*** 4504,4509 **** ---- 4512,4523 ---- - /* Sort the results. Keep menu's in the specified order. */ - if (xp->xp_context != EXPAND_MENUNAMES && xp->xp_context != EXPAND_MENUS) - sort_strings(*file, *num_file); -+ -+ #ifdef FEAT_CMDL_COMPL -+ /* Reset the variables used for special highlight names expansion, so that -+ * they don't show up when getting normal highlight names by ID. */ -+ reset_expand_highlight(); -+ #endif - - return OK; - } -*** ../vim-7.1.035/src/proto/syntax.pro Sat May 5 19:23:52 2007 ---- src/proto/syntax.pro Fri Jul 13 19:51:43 2007 -*************** -*** 8,13 **** ---- 8,15 ---- - void syntax_clear __ARGS((buf_T *buf)); - void ex_syntax __ARGS((exarg_T *eap)); - int syntax_present __ARGS((buf_T *buf)); -+ void reset_expand_highlight __ARGS((void)); -+ void set_context_in_echohl_cmd __ARGS((expand_T *xp, char_u *arg)); - void set_context_in_syntax_cmd __ARGS((expand_T *xp, char_u *arg)); - char_u *get_syntax_name __ARGS((expand_T *xp, int idx)); - int syn_get_id __ARGS((win_T *wp, long lnum, colnr_T col, int trans, int *spellp)); -*** ../vim-7.1.035/src/syntax.c Thu Jun 28 11:59:13 2007 ---- src/syntax.c Fri Jul 13 19:51:39 2007 -*************** -*** 66,73 **** - #define HL_TABLE() ((struct hl_group *)((highlight_ga.ga_data))) - - #ifdef FEAT_CMDL_COMPL -! static int include_default = FALSE; /* include "default" for expansion */ -! static int include_link = FALSE; /* include "link" for expansion */ - #endif - - /* ---- 66,75 ---- - #define HL_TABLE() ((struct hl_group *)((highlight_ga.ga_data))) - - #ifdef FEAT_CMDL_COMPL -! /* Flags to indicate an additional string for highlight name completion. */ -! static int include_none = 0; /* when 1 include "None" */ -! static int include_default = 0; /* when 1 include "default" */ -! static int include_link = 0; /* when 2 include "link" and "clear" */ - #endif - - /* -*************** -*** 5968,5973 **** ---- 5970,5998 ---- - EXP_CASE /* expand ":syn case" arguments */ - } expand_what; - -+ /* -+ * Reset include_link, include_default, include_none to 0. -+ * Called when we are done expanding. -+ */ -+ void -+ reset_expand_highlight() -+ { -+ include_link = include_default = include_none = 0; -+ } -+ -+ /* -+ * Handle command line completion for :match and :echohl command: Add "None" -+ * as highlight group. -+ */ -+ void -+ set_context_in_echohl_cmd(xp, arg) -+ expand_T *xp; -+ char_u *arg; -+ { -+ xp->xp_context = EXPAND_HIGHLIGHT; -+ xp->xp_pattern = arg; -+ include_none = 1; -+ } - - /* - * Handle command line completion for :syntax command. -*************** -*** 5983,5990 **** - xp->xp_context = EXPAND_SYNTAX; - expand_what = EXP_SUBCMD; - xp->xp_pattern = arg; -! include_link = FALSE; -! include_default = FALSE; - - /* (part of) subcommand already typed */ - if (*arg != NUL) ---- 6008,6015 ---- - xp->xp_context = EXPAND_SYNTAX; - expand_what = EXP_SUBCMD; - xp->xp_pattern = arg; -! include_link = 0; -! include_default = 0; - - /* (part of) subcommand already typed */ - if (*arg != NUL) -*************** -*** 8949,8955 **** - return OK; - } - -! #ifdef FEAT_CMDL_COMPL - - static void highlight_list __ARGS((void)); - static void highlight_list_two __ARGS((int cnt, int attr)); ---- 8974,8980 ---- - return OK; - } - -! #if defined(FEAT_CMDL_COMPL) || defined(PROTO) - - static void highlight_list __ARGS((void)); - static void highlight_list_two __ARGS((int cnt, int attr)); -*************** -*** 8967,8974 **** - /* Default: expand group names */ - xp->xp_context = EXPAND_HIGHLIGHT; - xp->xp_pattern = arg; -! include_link = TRUE; -! include_default = TRUE; - - /* (part of) subcommand already typed */ - if (*arg != NUL) ---- 8992,8999 ---- - /* Default: expand group names */ - xp->xp_context = EXPAND_HIGHLIGHT; - xp->xp_pattern = arg; -! include_link = 2; -! include_default = 1; - - /* (part of) subcommand already typed */ - if (*arg != NUL) -*************** -*** 8976,8982 **** - p = skiptowhite(arg); - if (*p != NUL) /* past "default" or group name */ - { -! include_default = FALSE; - if (STRNCMP("default", arg, p - arg) == 0) - { - arg = skipwhite(p); ---- 9001,9007 ---- - p = skiptowhite(arg); - if (*p != NUL) /* past "default" or group name */ - { -! include_default = 0; - if (STRNCMP("default", arg, p - arg) == 0) - { - arg = skipwhite(p); -*************** -*** 8985,8991 **** - } - if (*p != NUL) /* past group name */ - { -! include_link = FALSE; - if (arg[1] == 'i' && arg[0] == 'N') - highlight_list(); - if (STRNCMP("link", arg, p - arg) == 0 ---- 9010,9016 ---- - } - if (*p != NUL) /* past group name */ - { -! include_link = 0; - if (arg[1] == 'i' && arg[0] == 'N') - highlight_list(); - if (STRNCMP("link", arg, p - arg) == 0 -*************** -*** 9045,9075 **** - expand_T *xp; - int idx; - { -- if (idx == highlight_ga.ga_len - #ifdef FEAT_CMDL_COMPL -! && include_link -! #endif -! ) - return (char_u *)"link"; -! if (idx == highlight_ga.ga_len + 1 -! #ifdef FEAT_CMDL_COMPL -! && include_link -! #endif -! ) - return (char_u *)"clear"; -- if (idx == highlight_ga.ga_len + 2 -- #ifdef FEAT_CMDL_COMPL -- && include_default - #endif -- ) -- return (char_u *)"default"; - if (idx < 0 || idx >= highlight_ga.ga_len) - return NULL; - return HL_TABLE()[idx].sg_name; - } - #endif - -! #ifdef FEAT_GUI - /* - * Free all the highlight group fonts. - * Used when quitting for systems which need it. ---- 9070,9094 ---- - expand_T *xp; - int idx; - { - #ifdef FEAT_CMDL_COMPL -! if (idx == highlight_ga.ga_len && include_none != 0) -! return (char_u *)"none"; -! if (idx == highlight_ga.ga_len + include_none && include_default != 0) -! return (char_u *)"default"; -! if (idx == highlight_ga.ga_len + include_none + include_default -! && include_link != 0) - return (char_u *)"link"; -! if (idx == highlight_ga.ga_len + include_none + include_default + 1 -! && include_link != 0) - return (char_u *)"clear"; - #endif - if (idx < 0 || idx >= highlight_ga.ga_len) - return NULL; - return HL_TABLE()[idx].sg_name; - } - #endif - -! #if defined(FEAT_GUI) || defined(PROTO) - /* - * Free all the highlight group fonts. - * Used when quitting for systems which need it. -*** ../vim-7.1.035/src/version.c Tue Jul 24 11:15:46 2007 ---- src/version.c Tue Jul 24 14:30:18 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 36, - /**/ - --- -Apparently, 1 in 5 people in the world are Chinese. And there are 5 -people in my family, so it must be one of them. It's either my mum -or my dad. Or my older brother Colin. Or my younger brother -Ho-Cha-Chu. But I think it's Colin. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.037 b/7.1.037 deleted file mode 100644 index 4b6b1b69..00000000 --- a/7.1.037 +++ /dev/null @@ -1,57 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.037 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.037 -Problem: strcpy() used for overlapping strings. (Chris Monson) -Solution: Use mch_memmove() instead. -Files: src/option.c - - -*** ../vim-7.1.036/src/option.c Tue Jul 24 09:50:22 2007 ---- src/option.c Sun Jul 22 16:42:47 2007 -*************** -*** 4628,4634 **** - if ((!(flags & P_COMMA) || *s != ',') - && vim_strchr(s + 1, *s) != NULL) - { -! STRCPY(s, s + 1); - --s; - } - } ---- 4628,4634 ---- - if ((!(flags & P_COMMA) || *s != ',') - && vim_strchr(s + 1, *s) != NULL) - { -! mch_memmove(s, s + 1, STRLEN(s)); - --s; - } - } -*** ../vim-7.1.036/src/version.c Tue Jul 24 14:32:44 2007 ---- src/version.c Tue Jul 24 14:56:03 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 37, - /**/ - --- -This planet has -- or rather had -- a problem, which was this: most -of the people living on it were unhappy for pretty much of the time. -Many solutions were suggested for this problem, but most of these -were largely concerned with the movements of small green pieces of -paper, which is odd because on the whole it wasn't the small green -pieces of paper that were unhappy. - -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy" - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.038 b/7.1.038 deleted file mode 100644 index cdb3d665..00000000 --- a/7.1.038 +++ /dev/null @@ -1,205 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.038 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.038 -Problem: When 'expandtab' is set then a Tab copied for 'copyindent' is - expanded to spaces, even when 'preserveindent' is set. (Alexei - Alexandrov) -Solution: Remove the check for 'expandtab'. Also fix that ">>" doesn't obey - 'preserveindent'. (Chris Lubinski) -Files: src/misc1.c - - -*** ../vim-7.1.037/src/misc1.c Thu May 10 21:03:33 2007 ---- src/misc1.c Tue Jul 24 15:24:50 2007 -*************** -*** 90,96 **** - */ - int - set_indent(size, flags) -! int size; - int flags; - { - char_u *p; ---- 90,96 ---- - */ - int - set_indent(size, flags) -! int size; /* measured in spaces */ - int flags; - { - char_u *p; -*************** -*** 98,109 **** - char_u *oldline; - char_u *s; - int todo; -! int ind_len; - int line_len; - int doit = FALSE; -! int ind_done; - int tab_pad; - int retval = FALSE; - - /* - * First check if there is anything to do and compute the number of ---- 98,111 ---- - char_u *oldline; - char_u *s; - int todo; -! int ind_len; /* measured in characters */ - int line_len; - int doit = FALSE; -! int ind_done = 0; /* measured in spaces */ - int tab_pad; - int retval = FALSE; -+ int orig_char_len = 0; /* number of initial whitespace chars when -+ 'et' and 'pi' are both set */ - - /* - * First check if there is anything to do and compute the number of -*************** -*** 116,123 **** - /* Calculate the buffer size for the new indent, and check to see if it - * isn't already set */ - -! /* if 'expandtab' isn't set: use TABs */ -! if (!curbuf->b_p_et) - { - /* If 'preserveindent' is set then reuse as much as possible of - * the existing indent structure for the new indent */ ---- 118,127 ---- - /* Calculate the buffer size for the new indent, and check to see if it - * isn't already set */ - -! /* if 'expandtab' isn't set: use TABs; if both 'expandtab' and -! * 'preserveindent' are set count the number of characters at the -! * beginning of the line to be copied */ -! if (!curbuf->b_p_et || (!(flags & SIN_INSERT) && curbuf->b_p_pi)) - { - /* If 'preserveindent' is set then reuse as much as possible of - * the existing indent structure for the new indent */ -*************** -*** 148,156 **** - ++p; - } - - /* Fill to next tabstop with a tab, if possible */ - tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts); -! if (todo >= tab_pad) - { - doit = TRUE; - todo -= tab_pad; ---- 152,165 ---- - ++p; - } - -+ /* Set initial number of whitespace chars to copy if we are -+ * preserving indent but expandtab is set */ -+ if (curbuf->b_p_et) -+ orig_char_len = ind_len; -+ - /* Fill to next tabstop with a tab, if possible */ - tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts); -! if (todo >= tab_pad && orig_char_len == 0) - { - doit = TRUE; - todo -= tab_pad; -*************** -*** 193,205 **** - else - p = skipwhite(p); - line_len = (int)STRLEN(p) + 1; -! newline = alloc(ind_len + line_len); -! if (newline == NULL) -! return FALSE; - - /* Put the characters in the new line. */ -- s = newline; -- todo = size; - /* if 'expandtab' isn't set: use TABs */ - if (!curbuf->b_p_et) - { ---- 202,239 ---- - else - p = skipwhite(p); - line_len = (int)STRLEN(p) + 1; -! -! /* If 'preserveindent' and 'expandtab' are both set keep the original -! * characters and allocate accordingly. We will fill the rest with spaces -! * after the if (!curbuf->b_p_et) below. */ -! if (orig_char_len != 0) -! { -! newline = alloc(orig_char_len + size - ind_done + line_len); -! if (newline == NULL) -! return FALSE; -! p = oldline; -! s = newline; -! while (orig_char_len > 0) -! { -! *s++ = *p++; -! orig_char_len--; -! } -! /* Skip over any additional white space (useful when newindent is less -! * than old) */ -! while (vim_iswhite(*p)) -! (void)*p++; -! todo = size-ind_done; -! } -! else -! { -! todo = size; -! newline = alloc(ind_len + line_len); -! if (newline == NULL) -! return FALSE; -! s = newline; -! } - - /* Put the characters in the new line. */ - /* if 'expandtab' isn't set: use TABs */ - if (!curbuf->b_p_et) - { -*************** -*** 1320,1327 **** - newindent += (int)curbuf->b_p_sw; - } - #endif -! /* Copy the indent only if expand tab is disabled */ -! if (curbuf->b_p_ci && !curbuf->b_p_et) - { - (void)copy_indent(newindent, saved_line); - ---- 1354,1361 ---- - newindent += (int)curbuf->b_p_sw; - } - #endif -! /* Copy the indent */ -! if (curbuf->b_p_ci) - { - (void)copy_indent(newindent, saved_line); - -*** ../vim-7.1.037/src/version.c Tue Jul 24 14:57:16 2007 ---- src/version.c Tue Jul 24 15:22:44 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 38, - /**/ - --- -Time is an illusion. Lunchtime doubly so. - -- Ford Prefect, in Douglas Adams' - "The Hitchhiker's Guide to the Galaxy" - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.039 b/7.1.039 deleted file mode 100644 index 5ce096d2..00000000 --- a/7.1.039 +++ /dev/null @@ -1,57 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.039 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.039 -Problem: A tag in a help file that starts with "help-tags" and contains a - percent sign may make Vim crash. (Ulf Harnhammar) -Solution: Use puts() instead of fprintf(). -Files: src/ex_cmds.c - - -*** ../vim-7.1.038/src/ex_cmds.c Tue Jul 24 11:15:46 2007 ---- src/ex_cmds.c Wed Jul 25 20:06:20 2007 -*************** -*** 6374,6382 **** - for (i = 0; i < ga.ga_len; ++i) - { - s = ((char_u **)ga.ga_data)[i]; -! if (STRNCMP(s, "help-tags", 9) == 0) - /* help-tags entry was added in formatted form */ -! fprintf(fd_tags, (char *)s); - else - { - fprintf(fd_tags, "%s\t/*", s); ---- 6374,6382 ---- - for (i = 0; i < ga.ga_len; ++i) - { - s = ((char_u **)ga.ga_data)[i]; -! if (STRNCMP(s, "help-tags\t", 10) == 0) - /* help-tags entry was added in formatted form */ -! fputs((char *)s, fd_tags); - else - { - fprintf(fd_tags, "%s\t/*", s); -*** ../vim-7.1.038/src/version.c Tue Jul 24 15:25:27 2007 ---- src/version.c Wed Jul 25 22:41:18 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 39, - /**/ - --- -On the other hand, you have different fingers. - -- Steven Wright - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.040 b/7.1.040 deleted file mode 100644 index febac6a0..00000000 --- a/7.1.040 +++ /dev/null @@ -1,1843 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.040 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.040 -Problem: ":match" only supports three matches. -Solution: Add functions clearmatches(), getmatches(), matchadd(), - matchdelete() and setmatches(). Changed the data structures for - this. A small bug in syntax.c is fixed, so newly created - highlight groups can have their name resolved correctly from their - ID. (Martin Toft) -Files: runtime/doc/eval.txt, runtime/doc/pattern.txt, - runtime/doc/usr_41.txt, src/eval.c, src/ex_docmd.c, - src/proto/window.pro, src/screen.c, src/structs.h, src/syntax.c, - src/testdir/Makefile, src/testdir/test63.in, - src/testdir/test63.ok, src/window.c - - -*** ../vim-7.1.039/runtime/doc/eval.txt Tue Jul 17 16:31:15 2007 ---- runtime/doc/eval.txt Wed Jul 25 21:05:56 2007 -*************** -*** 1,4 **** -! *eval.txt* For Vim version 7.1. Last change: 2007 Jul 11 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *eval.txt* For Vim version 7.1. Last change: 2007 Jul 25 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 1557,1562 **** ---- 1557,1563 ---- - changenr() Number current change number - char2nr( {expr}) Number ASCII value of first char in {expr} - cindent( {lnum}) Number C indent for line {lnum} -+ clearmatches() None clear all matches - col( {expr}) Number column nr of cursor or mark - complete({startcol}, {matches}) String set Insert mode completion - complete_add( {expr}) Number add completion match -*************** -*** 1622,1627 **** ---- 1623,1629 ---- - getline( {lnum}) String line {lnum} of current buffer - getline( {lnum}, {end}) List lines {lnum} to {end} of current buffer - getloclist({nr}) List list of location list items -+ getmatches() List list of current matches - getpos( {expr}) List position of cursor, mark, etc. - getqflist() List list of quickfix items - getreg( [{regname} [, 1]]) String contents of register -*************** -*** 1676,1682 **** ---- 1678,1687 ---- - String check for mappings matching {name} - match( {expr}, {pat}[, {start}[, {count}]]) - Number position where {pat} matches in {expr} -+ matchadd( {group}, {pattern}[, {priority}[, {id}]]) -+ Number highlight {pattern} with {group} - matcharg( {nr}) List arguments of |:match| -+ matchdelete( {id}) Number delete match identified by {id} - matchend( {expr}, {pat}[, {start}[, {count}]]) - Number position where {pat} ends in {expr} - matchlist( {expr}, {pat}[, {start}[, {count}]]) -*************** -*** 1731,1736 **** ---- 1736,1742 ---- - setline( {lnum}, {line}) Number set line {lnum} to {line} - setloclist( {nr}, {list}[, {action}]) - Number modify location list using {list} -+ setmatches( {list}) Number restore a list of matches - setpos( {expr}, {list}) none set the {expr} position to {list} - setqflist( {list}[, {action}]) Number modify quickfix list using {list} - setreg( {n}, {v}[, {opt}]) Number set register to value and type -*************** -*** 2012,2017 **** ---- 2018,2027 ---- - feature, -1 is returned. - See |C-indenting|. - -+ clearmatches() *clearmatches()* -+ Clears all matches previously defined by |matchadd()| and the -+ |:match| commands. -+ - *col()* - col({expr}) The result is a Number, which is the byte index of the column - position given with {expr}. The accepted positions are: -*************** -*** 2918,2923 **** ---- 2928,2955 ---- - returned. For an invalid window number {nr}, an empty list is - returned. Otherwise, same as getqflist(). - -+ getmatches() *getmatches()* -+ Returns a |List| with all matches previously defined by -+ |matchadd()| and the |:match| commands. |getmatches()| is -+ useful in combination with |setmatches()|, as |setmatches()| -+ can restore a list of matches saved by |getmatches()|. -+ Example: > -+ :echo getmatches() -+ < [{'group': 'MyGroup1', 'pattern': 'TODO', -+ 'priority': 10, 'id': 1}, {'group': 'MyGroup2', -+ 'pattern': 'FIXME', 'priority': 10, 'id': 2}] > -+ :let m = getmatches() -+ :call clearmatches() -+ :echo getmatches() -+ < [] > -+ :call setmatches(m) -+ :echo getmatches() -+ < [{'group': 'MyGroup1', 'pattern': 'TODO', -+ 'priority': 10, 'id': 1}, {'group': 'MyGroup2', -+ 'pattern': 'FIXME', 'priority': 10, 'id': 2}] > -+ :unlet m -+ < -+ - getqflist() *getqflist()* - Returns a list with all the current quickfix errors. Each - list item is a dictionary with these entries: -*************** -*** 3622,3627 **** ---- 3654,3697 ---- - the pattern. 'smartcase' is NOT used. The matching is always - done like 'magic' is set and 'cpoptions' is empty. - -+ *matchadd()* *E798* *E799* *E801* -+ matchadd({group}, {pattern}[, {priority}[, {id}]]) -+ Defines a pattern to be highlighted in the current window (a -+ "match"). It will be highlighted with {group}. Returns an -+ identification number (ID), which can be used to delete the -+ match using |matchdelete()|. -+ -+ The optional {priority} argument assigns a priority to the -+ match. A match with a high priority will have its -+ highlighting overrule that of a match with a lower priority. -+ A priority is specified as an integer (negative numbers are no -+ exception). If the {priority} argument is not specified, the -+ default priority is 10. The priority of 'hlsearch' is zero, -+ hence all matches with a priority greater than zero will -+ overrule it. Syntax highlighting (see 'syntax') is a separate -+ mechanism, and regardless of the chosen priority a match will -+ always overrule syntax highlighting. -+ -+ The optional {id} argument allows the request for a specific -+ match ID. If a specified ID is already taken, an error -+ message will appear and the match will not be added. An ID -+ is specified as a positive integer (zero excluded). IDs 1, 2 -+ and 3 are reserved for |:match|, |:2match| and |:3match|, -+ respectively. If the {id} argument is not specified, -+ |matchadd()| automatically chooses a free ID. -+ -+ The number of matches is not limited, as it is the case with -+ the |:match| commands. -+ -+ Example: > -+ :highlight MyGroup ctermbg=green guibg=green -+ :let m = matchadd("MyGroup", "TODO") -+ < Deletion of the pattern: > -+ :call matchdelete(m) -+ -+ < A list of matches defined by |matchadd()| and |:match| are -+ available from |getmatches()|. All matches can be deleted in -+ one operation by |clearmatches()|. - - matcharg({nr}) *matcharg()* - Selects the {nr} match item, as set with a |:match|, -*************** -*** 3631,3638 **** - The pattern used. - When {nr} is not 1, 2 or 3 returns an empty |List|. - When there is no match item set returns ['', '']. -! This is usef to save and restore a |:match|. -! - - matchend({expr}, {pat}[, {start}[, {count}]]) *matchend()* - Same as match(), but return the index of first character after ---- 3701,3715 ---- - The pattern used. - When {nr} is not 1, 2 or 3 returns an empty |List|. - When there is no match item set returns ['', '']. -! This is useful to save and restore a |:match|. -! Highlighting matches using the |:match| commands are limited -! to three matches. |matchadd()| does not have this limitation. -! -! matchdelete({id}) *matchdelete()* *E802* *E803* -! Deletes a match with ID {id} previously defined by |matchadd()| -! or one of the |:match| commands. Returns 0 if succesfull, -! otherwise -1. See example for |matchadd()|. All matches can -! be deleted in one operation by |clearmatches()|. - - matchend({expr}, {pat}[, {start}[, {count}]]) *matchend()* - Same as match(), but return the index of first character after -*************** -*** 4385,4391 **** - When {nr} is zero the current window is used. For a location - list window, the displayed location list is modified. For an - invalid window number {nr}, -1 is returned. -! Otherwise, same as setqflist(). - - *setpos()* - setpos({expr}, {list}) ---- 4462,4474 ---- - When {nr} is zero the current window is used. For a location - list window, the displayed location list is modified. For an - invalid window number {nr}, -1 is returned. -! Otherwise, same as |setqflist()|. -! Also see |location-list|. -! -! setmatches({list}) *setmatches()* -! Restores a list of matches saved by |getmatches()|. Returns 0 -! if succesfull, otherwise -1. All current matches are cleared -! before the list is restored. See example for |getmatches()|. - - *setpos()* - setpos({expr}, {list}) -*** ../vim-7.1.039/runtime/doc/pattern.txt Sat May 12 16:57:31 2007 ---- runtime/doc/pattern.txt Tue Jul 24 15:47:01 2007 -*************** -*** 1212,1218 **** - {group} must exist at the moment this command is executed. - - The {group} highlighting still applies when a character is -! to be highlighted for 'hlsearch'. - - Note that highlighting the last used search pattern with - 'hlsearch' is used in all windows, while the pattern defined ---- 1212,1221 ---- - {group} must exist at the moment this command is executed. - - The {group} highlighting still applies when a character is -! to be highlighted for 'hlsearch', as the highlighting for -! matches is given higher priority than that of 'hlsearch'. -! Syntax highlighting (see 'syntax') is also overruled by -! matches. - - Note that highlighting the last used search pattern with - 'hlsearch' is used in all windows, while the pattern defined -*************** -*** 1226,1233 **** - display you may get unexpected results. That is because Vim - looks for a match in the line where redrawing starts. - -! Also see |matcharg()|, it returns the highlight group and -! pattern of a previous :match command. - - Another example, which highlights all characters in virtual - column 72 and more: > ---- 1229,1243 ---- - display you may get unexpected results. That is because Vim - looks for a match in the line where redrawing starts. - -! Also see |matcharg()|and |getmatches()|. The former returns -! the highlight group and pattern of a previous |:match| -! command. The latter returns a list with highlight groups and -! patterns defined by both |matchadd()| and |:match|. -! -! Highlighting matches using |:match| are limited to three -! matches (aside from |:match|, |:2match| and |:3match|are -! available). |matchadd()| does not have this limitation and in -! addition makes it possible to prioritize matches. - - Another example, which highlights all characters in virtual - column 72 and more: > -*** ../vim-7.1.039/runtime/doc/usr_41.txt Sat May 12 15:54:55 2007 ---- runtime/doc/usr_41.txt Tue Jul 24 15:47:01 2007 -*************** -*** 763,775 **** ---- 763,784 ---- - foldtextresult() get the text displayed for a closed fold - - Syntax and highlighting: -+ clearmatches() clear all matches defined by |matchadd()| and -+ the |:match| commands -+ getmatches() get all matches defined by |matchadd()| and -+ the |:match| commands - hlexists() check if a highlight group exists - hlID() get ID of a highlight group - synID() get syntax ID at a specific position - synIDattr() get a specific attribute of a syntax ID - synIDtrans() get translated syntax ID - diff_hlID() get highlight ID for diff mode at a position -+ matchadd() define a pattern to highlight (a "match") - matcharg() get info about |:match| arguments -+ matchdelete() delete a match defined by |matchadd()| or a -+ |:match| command -+ setmatches() restore a list of matches saved by -+ |getmatches()| - - Spelling: - spellbadword() locate badly spelled word at or after cursor -*** ../vim-7.1.039/src/eval.c Tue Jul 24 14:32:44 2007 ---- src/eval.c Tue Jul 24 20:40:52 2007 -*************** -*** 475,480 **** ---- 475,481 ---- - static void f_changenr __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_char2nr __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_cindent __ARGS((typval_T *argvars, typval_T *rettv)); -+ static void f_clearmatches __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_col __ARGS((typval_T *argvars, typval_T *rettv)); - #if defined(FEAT_INS_EXPAND) - static void f_complete __ARGS((typval_T *argvars, typval_T *rettv)); -*************** -*** 529,534 **** ---- 530,536 ---- - static void f_getftime __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_getftype __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_getline __ARGS((typval_T *argvars, typval_T *rettv)); -+ static void f_getmatches __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_getpos __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_getqflist __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_getreg __ARGS((typval_T *argvars, typval_T *rettv)); -*************** -*** 577,583 **** ---- 579,587 ---- - static void f_maparg __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_mapcheck __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_match __ARGS((typval_T *argvars, typval_T *rettv)); -+ static void f_matchadd __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_matcharg __ARGS((typval_T *argvars, typval_T *rettv)); -+ static void f_matchdelete __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_matchend __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_matchlist __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_matchstr __ARGS((typval_T *argvars, typval_T *rettv)); -*************** -*** 618,623 **** ---- 622,628 ---- - static void f_setcmdpos __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_setline __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_setloclist __ARGS((typval_T *argvars, typval_T *rettv)); -+ static void f_setmatches __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_setpos __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_setqflist __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_setreg __ARGS((typval_T *argvars, typval_T *rettv)); -*************** -*** 7046,7051 **** ---- 7051,7057 ---- - {"changenr", 0, 0, f_changenr}, - {"char2nr", 1, 1, f_char2nr}, - {"cindent", 1, 1, f_cindent}, -+ {"clearmatches", 0, 0, f_clearmatches}, - {"col", 1, 1, f_col}, - #if defined(FEAT_INS_EXPAND) - {"complete", 2, 2, f_complete}, -*************** -*** 7102,7107 **** ---- 7108,7114 ---- - {"getftype", 1, 1, f_getftype}, - {"getline", 1, 2, f_getline}, - {"getloclist", 1, 1, f_getqflist}, -+ {"getmatches", 0, 0, f_getmatches}, - {"getpos", 1, 1, f_getpos}, - {"getqflist", 0, 0, f_getqflist}, - {"getreg", 0, 2, f_getreg}, -*************** -*** 7152,7158 **** ---- 7159,7167 ---- - {"maparg", 1, 3, f_maparg}, - {"mapcheck", 1, 3, f_mapcheck}, - {"match", 2, 4, f_match}, -+ {"matchadd", 2, 4, f_matchadd}, - {"matcharg", 1, 1, f_matcharg}, -+ {"matchdelete", 1, 1, f_matchdelete}, - {"matchend", 2, 4, f_matchend}, - {"matchlist", 2, 4, f_matchlist}, - {"matchstr", 2, 4, f_matchstr}, -*************** -*** 7193,7198 **** ---- 7202,7208 ---- - {"setcmdpos", 1, 1, f_setcmdpos}, - {"setline", 2, 2, f_setline}, - {"setloclist", 2, 3, f_setloclist}, -+ {"setmatches", 1, 1, f_setmatches}, - {"setpos", 2, 2, f_setpos}, - {"setqflist", 1, 2, f_setqflist}, - {"setreg", 2, 3, f_setreg}, -*************** -*** 8243,8248 **** ---- 8253,8272 ---- - } - - /* -+ * "clearmatches()" function -+ */ -+ /*ARGSUSED*/ -+ static void -+ f_clearmatches(argvars, rettv) -+ typval_T *argvars; -+ typval_T *rettv; -+ { -+ #ifdef FEAT_SEARCH_EXTRA -+ clear_matches(curwin); -+ #endif -+ } -+ -+ /* - * "col(string)" function - */ - static void -*************** -*** 10278,10283 **** ---- 10302,10341 ---- - } - - /* -+ * "getmatches()" function -+ */ -+ /*ARGSUSED*/ -+ static void -+ f_getmatches(argvars, rettv) -+ typval_T *argvars; -+ typval_T *rettv; -+ { -+ #ifdef FEAT_SEARCH_EXTRA -+ dict_T *dict; -+ matchitem_T *cur = curwin->w_match_head; -+ -+ rettv->vval.v_number = 0; -+ -+ if (rettv_list_alloc(rettv) == OK) -+ { -+ while (cur != NULL) -+ { -+ dict = dict_alloc(); -+ if (dict == NULL) -+ return; -+ ++dict->dv_refcount; -+ dict_add_nr_str(dict, "group", 0L, syn_id2name(cur->hlg_id)); -+ dict_add_nr_str(dict, "pattern", 0L, cur->pattern); -+ dict_add_nr_str(dict, "priority", (long)cur->priority, NULL); -+ dict_add_nr_str(dict, "id", (long)cur->id, NULL); -+ list_append_dict(rettv->vval.v_list, dict); -+ cur = cur->next; -+ } -+ } -+ #endif -+ } -+ -+ /* - * "getpos(string)" function - */ - static void -*************** -*** 12448,12453 **** ---- 12506,12547 ---- - } - - /* -+ * "matchadd()" function -+ */ -+ static void -+ f_matchadd(argvars, rettv) -+ typval_T *argvars; -+ typval_T *rettv; -+ { -+ #ifdef FEAT_SEARCH_EXTRA -+ char_u buf[NUMBUFLEN]; -+ char_u *grp = get_tv_string_buf_chk(&argvars[0], buf); /* group */ -+ char_u *pat = get_tv_string_buf_chk(&argvars[1], buf); /* pattern */ -+ int prio = 10; /* default priority */ -+ int id = -1; -+ int error = FALSE; -+ -+ rettv->vval.v_number = -1; -+ -+ if (grp == NULL || pat == NULL) -+ return; -+ if (argvars[2].v_type != VAR_UNKNOWN) -+ prio = get_tv_number_chk(&argvars[2], &error); -+ if (argvars[3].v_type != VAR_UNKNOWN) -+ id = get_tv_number_chk(&argvars[3], &error); -+ if (error == TRUE) -+ return; -+ if (id >= 1 && id <= 3) -+ { -+ EMSGN("E798: ID is reserved for \":match\": %ld", id); -+ return; -+ } -+ -+ rettv->vval.v_number = match_add(curwin, grp, pat, prio, id); -+ #endif -+ } -+ -+ /* - * "matcharg()" function - */ - static void -*************** -*** 12458,12477 **** - if (rettv_list_alloc(rettv) == OK) - { - #ifdef FEAT_SEARCH_EXTRA -! int mi = get_tv_number(&argvars[0]); - -! if (mi >= 1 && mi <= 3) - { -! list_append_string(rettv->vval.v_list, -! syn_id2name(curwin->w_match_id[mi - 1]), -1); -! list_append_string(rettv->vval.v_list, -! curwin->w_match_pat[mi - 1], -1); - } - #endif - } - } - - /* - * "matchend()" function - */ - static void ---- 12552,12593 ---- - if (rettv_list_alloc(rettv) == OK) - { - #ifdef FEAT_SEARCH_EXTRA -! int id = get_tv_number(&argvars[0]); -! matchitem_T *m; - -! if (id >= 1 && id <= 3) - { -! if ((m = (matchitem_T *)get_match(curwin, id)) != NULL) -! { -! list_append_string(rettv->vval.v_list, -! syn_id2name(m->hlg_id), -1); -! list_append_string(rettv->vval.v_list, m->pattern, -1); -! } -! else -! { -! list_append_string(rettv->vval.v_list, NUL, -1); -! list_append_string(rettv->vval.v_list, NUL, -1); -! } - } - #endif - } - } - - /* -+ * "matchdelete()" function -+ */ -+ static void -+ f_matchdelete(argvars, rettv) -+ typval_T *argvars; -+ typval_T *rettv; -+ { -+ #ifdef FEAT_SEARCH_EXTRA -+ rettv->vval.v_number = match_delete(curwin, -+ (int)get_tv_number(&argvars[0]), TRUE); -+ #endif -+ } -+ -+ /* - * "matchend()" function - */ - static void -*************** -*** 14506,14511 **** ---- 14622,14687 ---- - win = find_win_by_nr(&argvars[0], NULL); - if (win != NULL) - set_qf_ll_list(win, &argvars[1], &argvars[2], rettv); -+ } -+ -+ /* -+ * "setmatches()" function -+ */ -+ static void -+ f_setmatches(argvars, rettv) -+ typval_T *argvars; -+ typval_T *rettv; -+ { -+ #ifdef FEAT_SEARCH_EXTRA -+ list_T *l; -+ listitem_T *li; -+ dict_T *d; -+ -+ rettv->vval.v_number = -1; -+ if (argvars[0].v_type != VAR_LIST) -+ { -+ EMSG(_(e_listreq)); -+ return; -+ } -+ if ((l = argvars[0].vval.v_list) != NULL) -+ { -+ -+ /* To some extent make sure that we are dealing with a list from -+ * "getmatches()". */ -+ li = l->lv_first; -+ while (li != NULL) -+ { -+ if (li->li_tv.v_type != VAR_DICT -+ || (d = li->li_tv.vval.v_dict) == NULL) -+ { -+ EMSG(_(e_invarg)); -+ return; -+ } -+ if (!(dict_find(d, (char_u *)"group", -1) != NULL -+ && dict_find(d, (char_u *)"pattern", -1) != NULL -+ && dict_find(d, (char_u *)"priority", -1) != NULL -+ && dict_find(d, (char_u *)"id", -1) != NULL)) -+ { -+ EMSG(_(e_invarg)); -+ return; -+ } -+ li = li->li_next; -+ } -+ -+ clear_matches(curwin); -+ li = l->lv_first; -+ while (li != NULL) -+ { -+ d = li->li_tv.vval.v_dict; -+ match_add(curwin, get_dict_string(d, (char_u *)"group", FALSE), -+ get_dict_string(d, (char_u *)"pattern", FALSE), -+ (int)get_dict_number(d, (char_u *)"priority"), -+ (int)get_dict_number(d, (char_u *)"id")); -+ li = li->li_next; -+ } -+ rettv->vval.v_number = 0; -+ } -+ #endif - } - - /* -*** ../vim-7.1.039/src/ex_docmd.c Tue Jul 24 14:32:44 2007 ---- src/ex_docmd.c Tue Jul 24 15:47:01 2007 -*************** -*** 10817,10828 **** - exarg_T *eap; - { - char_u *p; - char_u *end; - int c; -! int mi; - - if (eap->line2 <= 3) -! mi = eap->line2 - 1; - else - { - EMSG(e_invcmd); ---- 10817,10829 ---- - exarg_T *eap; - { - char_u *p; -+ char_u *g; - char_u *end; - int c; -! int id; - - if (eap->line2 <= 3) -! id = eap->line2; - else - { - EMSG(e_invcmd); -*************** -*** 10831,10843 **** - - /* First clear any old pattern. */ - if (!eap->skip) -! { -! vim_free(curwin->w_match[mi].regprog); -! curwin->w_match[mi].regprog = NULL; -! vim_free(curwin->w_match_pat[mi]); -! curwin->w_match_pat[mi] = NULL; -! redraw_later(SOME_VALID); /* always need a redraw */ -! } - - if (ends_excmd(*eap->arg)) - end = eap->arg; ---- 10832,10838 ---- - - /* First clear any old pattern. */ - if (!eap->skip) -! match_delete(curwin, id, FALSE); - - if (ends_excmd(*eap->arg)) - end = eap->arg; -*************** -*** 10848,10862 **** - { - p = skiptowhite(eap->arg); - if (!eap->skip) -! { -! curwin->w_match_id[mi] = syn_namen2id(eap->arg, -! (int)(p - eap->arg)); -! if (curwin->w_match_id[mi] == 0) -! { -! EMSG2(_(e_nogroup), eap->arg); -! return; -! } -! } - p = skipwhite(p); - if (*p == NUL) - { ---- 10843,10849 ---- - { - p = skiptowhite(eap->arg); - if (!eap->skip) -! g = vim_strnsave(eap->arg, (int)(p - eap->arg)); - p = skipwhite(p); - if (*p == NUL) - { -*************** -*** 10880,10893 **** - - c = *end; - *end = NUL; -! curwin->w_match[mi].regprog = vim_regcomp(p + 1, RE_MAGIC); -! if (curwin->w_match[mi].regprog == NULL) -! { -! EMSG2(_(e_invarg2), p); -! *end = c; -! return; -! } -! curwin->w_match_pat[mi] = vim_strsave(p + 1); - *end = c; - } - } ---- 10867,10874 ---- - - c = *end; - *end = NUL; -! match_add(curwin, g, p + 1, 10, id); -! vim_free(g); - *end = c; - } - } -*** ../vim-7.1.039/src/proto/window.pro Sat May 5 19:52:36 2007 ---- src/proto/window.pro Tue Jul 24 16:38:19 2007 -*************** -*** 59,62 **** ---- 59,66 ---- - int only_one_window __ARGS((void)); - void check_lnums __ARGS((int do_curwin)); - int win_hasvertsplit __ARGS((void)); -+ int match_add __ARGS((win_T *wp, char_u *grp, char_u *pat, int prio, int id)); -+ int match_delete __ARGS((win_T *wp, int id, int perr)); -+ void clear_matches __ARGS((win_T *wp)); -+ matchitem_T *get_match __ARGS((win_T *wp, int id)); - /* vim: set ft=c : */ -*** ../vim-7.1.039/src/screen.c Tue Jun 19 17:49:12 2007 ---- src/screen.c Thu Jul 26 21:55:40 2007 -*************** -*** 100,126 **** - static int screen_cur_row, screen_cur_col; /* last known cursor position */ - - #ifdef FEAT_SEARCH_EXTRA -- /* -- * Struct used for highlighting 'hlsearch' matches for the last use search -- * pattern or a ":match" item. -- * For 'hlsearch' there is one pattern for all windows. For ":match" there is -- * a different pattern for each window. -- */ -- typedef struct -- { -- regmmatch_T rm; /* points to the regexp program; contains last found -- match (may continue in next line) */ -- buf_T *buf; /* the buffer to search for a match */ -- linenr_T lnum; /* the line to search for a match */ -- int attr; /* attributes to be used for a match */ -- int attr_cur; /* attributes currently active in win_line() */ -- linenr_T first_lnum; /* first lnum to search for multi-line pat */ -- colnr_T startcol; /* in win_line() points to char where HL starts */ -- colnr_T endcol; /* in win_line() points to char where HL ends */ -- } match_T; -- - static match_T search_hl; /* used for 'hlsearch' highlight matching */ -- static match_T match_hl[3]; /* used for ":match" highlight matching */ - #endif - - #ifdef FEAT_FOLDING ---- 100,106 ---- -*************** -*** 155,160 **** ---- 135,141 ---- - static void redraw_custum_statusline __ARGS((win_T *wp)); - #endif - #ifdef FEAT_SEARCH_EXTRA -+ #define SEARCH_HL_PRIORITY 0 - static void start_search_hl __ARGS((void)); - static void end_search_hl __ARGS((void)); - static void prepare_search_hl __ARGS((win_T *wp, linenr_T lnum)); -*************** -*** 787,792 **** ---- 768,774 ---- - w_topline got smaller a bit */ - #endif - #ifdef FEAT_SEARCH_EXTRA -+ matchitem_T *cur; /* points to the match list */ - int top_to_mod = FALSE; /* redraw above mod_top */ - #endif - -*************** -*** 848,865 **** - #endif - - #ifdef FEAT_SEARCH_EXTRA -! /* Setup for ":match" and 'hlsearch' highlighting. Disable any previous - * match */ -! for (i = 0; i < 3; ++i) - { -! match_hl[i].rm = wp->w_match[i]; -! if (wp->w_match_id[i] == 0) -! match_hl[i].attr = 0; - else -! match_hl[i].attr = syn_id2attr(wp->w_match_id[i]); -! match_hl[i].buf = buf; -! match_hl[i].lnum = 0; -! match_hl[i].first_lnum = 0; - } - search_hl.buf = buf; - search_hl.lnum = 0; ---- 830,849 ---- - #endif - - #ifdef FEAT_SEARCH_EXTRA -! /* Setup for match and 'hlsearch' highlighting. Disable any previous - * match */ -! cur = wp->w_match_head; -! while (cur != NULL) - { -! cur->hl.rm = cur->match; -! if (cur->hlg_id == 0) -! cur->hl.attr = 0; - else -! cur->hl.attr = syn_id2attr(cur->hlg_id); -! cur->hl.buf = buf; -! cur->hl.lnum = 0; -! cur->hl.first_lnum = 0; -! cur = cur->next; - } - search_hl.buf = buf; - search_hl.lnum = 0; -*************** -*** 923,941 **** - * change in one line may make the Search highlighting in a - * previous line invalid. Simple solution: redraw all visible - * lines above the change. -! * Same for a ":match" pattern. - */ - if (search_hl.rm.regprog != NULL - && re_multiline(search_hl.rm.regprog)) - top_to_mod = TRUE; - else -! for (i = 0; i < 3; ++i) -! if (match_hl[i].rm.regprog != NULL -! && re_multiline(match_hl[i].rm.regprog)) - { - top_to_mod = TRUE; - break; - } - #endif - } - #ifdef FEAT_FOLDING ---- 907,931 ---- - * change in one line may make the Search highlighting in a - * previous line invalid. Simple solution: redraw all visible - * lines above the change. -! * Same for a match pattern. - */ - if (search_hl.rm.regprog != NULL - && re_multiline(search_hl.rm.regprog)) - top_to_mod = TRUE; - else -! { -! cur = wp->w_match_head; -! while (cur != NULL) -! { -! if (cur->match.regprog != NULL -! && re_multiline(cur->match.regprog)) - { - top_to_mod = TRUE; - break; - } -+ cur = cur->next; -+ } -+ } - #endif - } - #ifdef FEAT_FOLDING -*************** -*** 2626,2635 **** - int line_attr = 0; /* atrribute for the whole line */ - #endif - #ifdef FEAT_SEARCH_EXTRA -! match_T *shl; /* points to search_hl or match_hl */ -! #endif -! #if defined(FEAT_SEARCH_EXTRA) || defined(FEAT_MBYTE) -! int i; - #endif - #ifdef FEAT_ARABIC - int prev_c = 0; /* previous Arabic character */ ---- 2634,2646 ---- - int line_attr = 0; /* atrribute for the whole line */ - #endif - #ifdef FEAT_SEARCH_EXTRA -! matchitem_T *cur; /* points to the match list */ -! match_T *shl; /* points to search_hl or a match */ -! int shl_flag; /* flag to indicate whether search_hl -! has been processed or not */ -! int prevcol_hl_flag; /* flag to indicate whether prevcol -! equals startcol of search_hl or one -! of the matches */ - #endif - #ifdef FEAT_ARABIC - int prev_c = 0; /* previous Arabic character */ -*************** -*** 3074,3085 **** - - #ifdef FEAT_SEARCH_EXTRA - /* -! * Handle highlighting the last used search pattern and ":match". -! * Do this for both search_hl and match_hl[3]. - */ -! for (i = 3; i >= 0; --i) - { -! shl = (i == 3) ? &search_hl : &match_hl[i]; - shl->startcol = MAXCOL; - shl->endcol = MAXCOL; - shl->attr_cur = 0; ---- 3085,3104 ---- - - #ifdef FEAT_SEARCH_EXTRA - /* -! * Handle highlighting the last used search pattern and matches. -! * Do this for both search_hl and the match list. - */ -! cur = wp->w_match_head; -! shl_flag = FALSE; -! while (cur != NULL || shl_flag == FALSE) - { -! if (shl_flag == FALSE) -! { -! shl = &search_hl; -! shl_flag = TRUE; -! } -! else -! shl = &cur->hl; - shl->startcol = MAXCOL; - shl->endcol = MAXCOL; - shl->attr_cur = 0; -*************** -*** 3122,3127 **** ---- 3141,3148 ---- - area_highlighting = TRUE; - } - } -+ if (shl != &search_hl && cur != NULL) -+ cur = cur->next; - } - #endif - -*************** -*** 3388,3400 **** - * After end, check for start/end of next match. - * When another match, have to check for start again. - * Watch out for matching an empty string! -! * Do this first for search_hl, then for match_hl, so that -! * ":match" overrules 'hlsearch'. - */ - v = (long)(ptr - line); -! for (i = 3; i >= 0; --i) -! { -! shl = (i == 3) ? &search_hl : &match_hl[i]; - while (shl->rm.regprog != NULL) - { - if (shl->startcol != MAXCOL ---- 3409,3432 ---- - * After end, check for start/end of next match. - * When another match, have to check for start again. - * Watch out for matching an empty string! -! * Do this for 'search_hl' and the match list (ordered by -! * priority). - */ - v = (long)(ptr - line); -! cur = wp->w_match_head; -! shl_flag = FALSE; -! while (cur != NULL || shl_flag == FALSE) -! { -! if (shl_flag == FALSE -! && ((cur != NULL -! && cur->priority > SEARCH_HL_PRIORITY) -! || cur == NULL)) -! { -! shl = &search_hl; -! shl_flag = TRUE; -! } -! else -! shl = &cur->hl; - while (shl->rm.regprog != NULL) - { - if (shl->startcol != MAXCOL -*************** -*** 3442,3458 **** - } - break; - } - } - -! /* ":match" highlighting overrules 'hlsearch' */ -! for (i = 0; i <= 3; ++i) -! if (i == 3) -! search_attr = search_hl.attr_cur; -! else if (match_hl[i].attr_cur != 0) - { -! search_attr = match_hl[i].attr_cur; -! break; - } - } - #endif - ---- 3474,3505 ---- - } - break; - } -+ if (shl != &search_hl && cur != NULL) -+ cur = cur->next; - } - -! /* Use attributes from match with highest priority among -! * 'search_hl' and the match list. */ -! search_attr = search_hl.attr_cur; -! cur = wp->w_match_head; -! shl_flag = FALSE; -! while (cur != NULL || shl_flag == FALSE) -! { -! if (shl_flag == FALSE -! && ((cur != NULL -! && cur->priority > SEARCH_HL_PRIORITY) -! || cur == NULL)) - { -! shl = &search_hl; -! shl_flag = TRUE; - } -+ else -+ shl = &cur->hl; -+ if (shl->attr_cur != 0) -+ search_attr = shl->attr_cur; -+ if (shl != &search_hl && cur != NULL) -+ cur = cur->next; -+ } - } - #endif - -*************** -*** 3613,3618 **** ---- 3660,3667 ---- - * Draw it as a space with a composing char. */ - if (utf_iscomposing(mb_c)) - { -+ int i; -+ - for (i = Screen_mco - 1; i > 0; --i) - u8cc[i] = u8cc[i - 1]; - u8cc[0] = mb_c; -*************** -*** 4256,4269 **** - * highlight match at end of line. If it's beyond the last - * char on the screen, just overwrite that one (tricky!) Not - * needed when a '$' was displayed for 'list'. */ - if (lcs_eol == lcs_eol_one - && ((area_attr != 0 && vcol == fromcol && c == NUL) - #ifdef FEAT_SEARCH_EXTRA - /* highlight 'hlsearch' match at end of line */ -! || ((prevcol == (long)search_hl.startcol -! || prevcol == (long)match_hl[0].startcol -! || prevcol == (long)match_hl[1].startcol -! || prevcol == (long)match_hl[2].startcol) - # if defined(LINE_ATTR) - && did_line_attr <= 1 - # endif ---- 4305,4333 ---- - * highlight match at end of line. If it's beyond the last - * char on the screen, just overwrite that one (tricky!) Not - * needed when a '$' was displayed for 'list'. */ -+ #ifdef FEAT_SEARCH_EXTRA -+ prevcol_hl_flag = FALSE; -+ if (prevcol == (long)search_hl.startcol) -+ prevcol_hl_flag = TRUE; -+ else -+ { -+ cur = wp->w_match_head; -+ while (cur != NULL) -+ { -+ if (prevcol == (long)cur->hl.startcol) -+ { -+ prevcol_hl_flag = TRUE; -+ break; -+ } -+ cur = cur->next; -+ } -+ } -+ #endif - if (lcs_eol == lcs_eol_one - && ((area_attr != 0 && vcol == fromcol && c == NUL) - #ifdef FEAT_SEARCH_EXTRA - /* highlight 'hlsearch' match at end of line */ -! || (prevcol_hl_flag == TRUE - # if defined(LINE_ATTR) - && did_line_attr <= 1 - # endif -*************** -*** 4304,4318 **** - #ifdef FEAT_SEARCH_EXTRA - if (area_attr == 0) - { -! for (i = 0; i <= 3; ++i) -! { -! if (i == 3) -! char_attr = search_hl.attr; -! else if ((ptr - line) - 1 == (long)match_hl[i].startcol) - { -! char_attr = match_hl[i].attr; -! break; - } - } - } - #endif ---- 4368,4394 ---- - #ifdef FEAT_SEARCH_EXTRA - if (area_attr == 0) - { -! /* Use attributes from match with highest priority among -! * 'search_hl' and the match list. */ -! char_attr = search_hl.attr; -! cur = wp->w_match_head; -! shl_flag = FALSE; -! while (cur != NULL || shl_flag == FALSE) -! { -! if (shl_flag == FALSE -! && ((cur != NULL -! && cur->priority > SEARCH_HL_PRIORITY) -! || cur == NULL)) - { -! shl = &search_hl; -! shl_flag = TRUE; - } -+ else -+ shl = &cur->hl; -+ if ((ptr - line) - 1 == (long)shl->startcol) -+ char_attr = shl->attr; -+ if (shl != &search_hl && cur != NULL) -+ cur = cur->next; - } - } - #endif -*************** -*** 4462,4467 **** ---- 4538,4545 ---- - { - if (mb_utf8) - { -+ int i; -+ - ScreenLinesUC[off] = mb_c; - if ((c & 0xff) == 0) - ScreenLines[off] = 0x80; /* avoid storing zero */ -*************** -*** 6320,6326 **** - - #ifdef FEAT_SEARCH_EXTRA - /* -! * Prepare for 'searchhl' highlighting. - */ - static void - start_search_hl() ---- 6398,6404 ---- - - #ifdef FEAT_SEARCH_EXTRA - /* -! * Prepare for 'hlsearch' highlighting. - */ - static void - start_search_hl() -*************** -*** 6333,6339 **** - } - - /* -! * Clean up for 'searchhl' highlighting. - */ - static void - end_search_hl() ---- 6411,6417 ---- - } - - /* -! * Clean up for 'hlsearch' highlighting. - */ - static void - end_search_hl() -*************** -*** 6353,6370 **** - win_T *wp; - linenr_T lnum; - { -! match_T *shl; /* points to search_hl or match_hl */ - int n; -- int i; - - /* - * When using a multi-line pattern, start searching at the top - * of the window or just after a closed fold. -! * Do this both for search_hl and match_hl[3]. - */ -! for (i = 3; i >= 0; --i) - { -! shl = (i == 3) ? &search_hl : &match_hl[i]; - if (shl->rm.regprog != NULL - && shl->lnum == 0 - && re_multiline(shl->rm.regprog)) ---- 6431,6458 ---- - win_T *wp; - linenr_T lnum; - { -! matchitem_T *cur; /* points to the match list */ -! match_T *shl; /* points to search_hl or a match */ -! int shl_flag; /* flag to indicate whether search_hl -! has been processed or not */ - int n; - - /* - * When using a multi-line pattern, start searching at the top - * of the window or just after a closed fold. -! * Do this both for search_hl and the match list. - */ -! cur = wp->w_match_head; -! shl_flag = FALSE; -! while (cur != NULL || shl_flag == FALSE) - { -! if (shl_flag == FALSE) -! { -! shl = &search_hl; -! shl_flag = TRUE; -! } -! else -! shl = &cur->hl; - if (shl->rm.regprog != NULL - && shl->lnum == 0 - && re_multiline(shl->rm.regprog)) -*************** -*** 6399,6409 **** - } - } - } - } - } - - /* -! * Search for a next 'searchl' or ":match" match. - * Uses shl->buf. - * Sets shl->lnum and shl->rm contents. - * Note: Assumes a previous match is always before "lnum", unless ---- 6487,6499 ---- - } - } - } -+ if (shl != &search_hl && cur != NULL) -+ cur = cur->next; - } - } - - /* -! * Search for a next 'hlsearch' or match. - * Uses shl->buf. - * Sets shl->lnum and shl->rm contents. - * Note: Assumes a previous match is always before "lnum", unless -*************** -*** 6413,6419 **** - static void - next_search_hl(win, shl, lnum, mincol) - win_T *win; -! match_T *shl; /* points to search_hl or match_hl */ - linenr_T lnum; - colnr_T mincol; /* minimal column for a match */ - { ---- 6503,6509 ---- - static void - next_search_hl(win, shl, lnum, mincol) - win_T *win; -! match_T *shl; /* points to search_hl or a match */ - linenr_T lnum; - colnr_T mincol; /* minimal column for a match */ - { -*************** -*** 6481,6487 **** - /* Error while handling regexp: stop using this regexp. */ - if (shl == &search_hl) - { -! /* don't free the regprog in match_hl[], it's a copy */ - vim_free(shl->rm.regprog); - no_hlsearch = TRUE; - } ---- 6571,6577 ---- - /* Error while handling regexp: stop using this regexp. */ - if (shl == &search_hl) - { -! /* don't free regprog in the match list, it's a copy */ - vim_free(shl->rm.regprog); - no_hlsearch = TRUE; - } -*** ../vim-7.1.039/src/structs.h Thu May 10 20:32:30 2007 ---- src/structs.h Wed Jul 25 21:08:46 2007 -*************** -*** 1694,1699 **** ---- 1694,1734 ---- - #define FR_COL 2 /* frame with a column of windows */ - - /* -+ * Struct used for highlighting 'hlsearch' matches, matches defined by -+ * ":match" and matches defined by match functions. -+ * For 'hlsearch' there is one pattern for all windows. For ":match" and the -+ * match functions there is a different pattern for each window. -+ */ -+ typedef struct -+ { -+ regmmatch_T rm; /* points to the regexp program; contains last found -+ match (may continue in next line) */ -+ buf_T *buf; /* the buffer to search for a match */ -+ linenr_T lnum; /* the line to search for a match */ -+ int attr; /* attributes to be used for a match */ -+ int attr_cur; /* attributes currently active in win_line() */ -+ linenr_T first_lnum; /* first lnum to search for multi-line pat */ -+ colnr_T startcol; /* in win_line() points to char where HL starts */ -+ colnr_T endcol; /* in win_line() points to char where HL ends */ -+ } match_T; -+ -+ /* -+ * matchitem_T provides a linked list for storing match items for ":match" and -+ * the match functions. -+ */ -+ typedef struct matchitem matchitem_T; -+ struct matchitem -+ { -+ matchitem_T *next; -+ int id; /* match ID */ -+ int priority; /* match priority */ -+ char_u *pattern; /* pattern to highlight */ -+ int hlg_id; /* highlight group ID */ -+ regmmatch_T match; /* regexp program for pattern */ -+ match_T hl; /* struct for doing the actual highlighting */ -+ }; -+ -+ /* - * Structure which contains all information that belongs to a window - * - * All row numbers are relative to the start of the window, except w_winrow. -*************** -*** 1934,1942 **** - #endif - - #ifdef FEAT_SEARCH_EXTRA -! regmmatch_T w_match[3]; /* regexp programs for ":match" */ -! char_u *(w_match_pat[3]); /* patterns for ":match" */ -! int w_match_id[3]; /* highlight IDs for ":match" */ - #endif - - /* ---- 1969,1976 ---- - #endif - - #ifdef FEAT_SEARCH_EXTRA -! matchitem_T *w_match_head; /* head of match list */ -! int w_next_match_id; /* next match ID */ - #endif - - /* -*** ../vim-7.1.039/src/syntax.c Tue Jul 24 14:32:44 2007 ---- src/syntax.c Tue Jul 24 15:47:01 2007 -*************** -*** 8504,8510 **** - syn_id2name(id) - int id; - { -! if (id <= 0 || id >= highlight_ga.ga_len) - return (char_u *)""; - return HL_TABLE()[id - 1].sg_name; - } ---- 8504,8510 ---- - syn_id2name(id) - int id; - { -! if (id <= 0 || id > highlight_ga.ga_len) - return (char_u *)""; - return HL_TABLE()[id - 1].sg_name; - } -*** ../vim-7.1.039/src/testdir/Makefile Sun Apr 30 20:48:47 2006 ---- src/testdir/Makefile Tue Jul 24 15:34:33 2007 -*************** -*** 1,5 **** - # -! # Makefile to run al tests for Vim - # - - VIMPROG = ../vim ---- 1,5 ---- - # -! # Makefile to run all tests for Vim - # - - VIMPROG = ../vim -*************** -*** 15,21 **** - test43.out test44.out test45.out test46.out test47.out \ - test48.out test49.out test51.out test52.out test53.out \ - test54.out test55.out test56.out test57.out test58.out \ -! test59.out test60.out test61.out test62.out - - SCRIPTS_GUI = test16.out - ---- 15,21 ---- - test43.out test44.out test45.out test46.out test47.out \ - test48.out test49.out test51.out test52.out test53.out \ - test54.out test55.out test56.out test57.out test58.out \ -! test59.out test60.out test61.out test62.out test63.out - - SCRIPTS_GUI = test16.out - -*** ../vim-7.1.039/src/testdir/test63.in Tue Jul 24 16:45:02 2007 ---- src/testdir/test63.in Tue Jul 24 15:32:30 2007 -*************** -*** 0 **** ---- 1,157 ---- -+ Test for ":match", ":2match", ":3match", "clearmatches()", "getmatches()", -+ "matchadd()", "matcharg()", "matchdelete()", and "setmatches()". -+ -+ STARTTEST -+ :so small.vim -+ :" --- Check that "matcharg()" returns the correct group and pattern if a match -+ :" --- is defined. -+ :let @r = "*** Test 1: " -+ :highlight MyGroup1 ctermbg=red -+ :highlight MyGroup2 ctermbg=green -+ :highlight MyGroup3 ctermbg=blue -+ :match MyGroup1 /TODO/ -+ :2match MyGroup2 /FIXME/ -+ :3match MyGroup3 /XXX/ -+ :if matcharg(1) == ['MyGroup1', 'TODO'] && matcharg(2) == ['MyGroup2', 'FIXME'] && matcharg(3) == ['MyGroup3', 'XXX'] -+ : let @r .= "OK\n" -+ :else -+ : let @r .= "FAILED\n" -+ :endif -+ :" --- Check that "matcharg()" returns an empty list if the argument is not 1, -+ :" --- 2 or 3 (only 0 and 4 are tested). -+ :let @r .= "*** Test 2: " -+ :if matcharg(0) == [] && matcharg(4) == [] -+ : let @r .= "OK\n" -+ :else -+ : let @r .= "FAILED\n" -+ :endif -+ :" --- Check that "matcharg()" returns ['', ''] if a match is not defined. -+ :let @r .= "*** Test 3: " -+ :match -+ :2match -+ :3match -+ :if matcharg(1) == ['', ''] && matcharg(2) == ['', ''] && matcharg(3) == ['', ''] -+ : let @r .= "OK\n" -+ :else -+ : let @r .= "FAILED\n" -+ :endif -+ :" --- Check that "matchadd()" and "getmatches()" agree on added matches and -+ :" --- that default values apply. -+ :let @r .= "*** Test 4: " -+ :let m1 = matchadd("MyGroup1", "TODO") -+ :let m2 = matchadd("MyGroup2", "FIXME", 42) -+ :let m3 = matchadd("MyGroup3", "XXX", 60, 17) -+ :if getmatches() == [{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 4}, {'group': 'MyGroup2', 'pattern': 'FIXME', 'priority': 42, 'id': 5}, {'group': 'MyGroup3', 'pattern': 'XXX', 'priority': 60, 'id': 17}] -+ : let @r .= "OK\n" -+ :else -+ : let @r .= "FAILED\n" -+ :endif -+ :" --- Check that "matchdelete()" deletes the matches defined in the previous -+ :" --- test correctly. -+ :let @r .= "*** Test 5: " -+ :call matchdelete(m1) -+ :call matchdelete(m2) -+ :call matchdelete(m3) -+ :unlet m1 -+ :unlet m2 -+ :unlet m3 -+ :if getmatches() == [] -+ : let @r .= "OK\n" -+ :else -+ : let @r .= "FAILED\n" -+ :endif -+ :" --- Check that "matchdelete()" returns 0 if succesfull and otherwise -1. -+ :let @r .= "*** Test 6: " -+ :let m = matchadd("MyGroup1", "TODO") -+ :let r1 = matchdelete(m) -+ :let r2 = matchdelete(42) -+ :if r1 == 0 && r2 == -1 -+ : let @r .= "OK\n" -+ :else -+ : let @r .= "FAILED\n" -+ :endif -+ :unlet m -+ :unlet r1 -+ :unlet r2 -+ :" --- Check that "clearmatches()" clears all matches defined by ":match" and -+ :" --- "matchadd()". -+ :let @r .= "*** Test 7: " -+ :let m1 = matchadd("MyGroup1", "TODO") -+ :let m2 = matchadd("MyGroup2", "FIXME", 42) -+ :let m3 = matchadd("MyGroup3", "XXX", 60, 17) -+ :match MyGroup1 /COFFEE/ -+ :2match MyGroup2 /HUMPPA/ -+ :3match MyGroup3 /VIM/ -+ :call clearmatches() -+ :if getmatches() == [] -+ : let @r .= "OK\n" -+ :else -+ : let @r .= "FAILED\n" -+ :endif -+ :unlet m1 -+ :unlet m2 -+ :unlet m3 -+ :" --- Check that "setmatches()" restores a list of matches saved by -+ :" --- "getmatches()" without changes. (Matches with equal priority must also -+ :" --- remain in the same order.) -+ :let @r .= "*** Test 8: " -+ :let m1 = matchadd("MyGroup1", "TODO") -+ :let m2 = matchadd("MyGroup2", "FIXME", 42) -+ :let m3 = matchadd("MyGroup3", "XXX", 60, 17) -+ :match MyGroup1 /COFFEE/ -+ :2match MyGroup2 /HUMPPA/ -+ :3match MyGroup3 /VIM/ -+ :let ml = getmatches() -+ :call clearmatches() -+ :call setmatches(ml) -+ :if getmatches() == ml -+ : let @r .= "OK\n" -+ :else -+ : let @r .= "FAILED\n" -+ :endif -+ :call clearmatches() -+ :unlet m1 -+ :unlet m2 -+ :unlet m3 -+ :unlet ml -+ :" --- Check that "setmatches()" will not add two matches with the same ID. The -+ :" --- expected behaviour (for now) is to add the first match but not the -+ :" --- second and to return 0 (even though it is a matter of debate whether -+ :" --- this can be considered succesfull behaviour). -+ :let @r .= "*** Test 9: " -+ :let r1 = setmatches([{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}, {'group': 'MyGroup2', 'pattern': 'FIXME', 'priority': 10, 'id': 1}]) -+ :if getmatches() == [{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}] && r1 == 0 -+ : let @r .= "OK\n" -+ :else -+ : let @r .= "FAILED\n" -+ :endif -+ :call clearmatches() -+ :unlet r1 -+ :" --- Check that "setmatches()" returns 0 if succesfull and otherwise -1. -+ :" --- (A range of valid and invalid input values are tried out to generate the -+ :" --- return values.) -+ :let @r .= "*** Test 10: " -+ :let rs1 = setmatches([]) -+ :let rs2 = setmatches([{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}]) -+ :call clearmatches() -+ :let rf1 = setmatches(0) -+ :let rf2 = setmatches([0]) -+ :let rf3 = setmatches([{'wrong key': 'wrong value'}]) -+ :if rs1 == 0 && rs2 == 0 && rf1 == -1 && rf2 == -1 && rf3 == -1 -+ : let @r .= "OK\n" -+ :else -+ : let @r .= "FAILED\n" -+ :endif -+ :unlet rs1 -+ :unlet rs2 -+ :unlet rf1 -+ :unlet rf2 -+ :unlet rf3 -+ :highlight clear MyGroup1 -+ :highlight clear MyGroup2 -+ :highlight clear MyGroup3 -+ G"rp -+ :/^Results/,$wq! test.out -+ ENDTEST -+ -+ Results of test63: -*** ../vim-7.1.039/src/testdir/test63.ok Tue Jul 24 16:45:02 2007 ---- src/testdir/test63.ok Tue Jul 24 15:32:30 2007 -*************** -*** 0 **** ---- 1,11 ---- -+ Results of test63: -+ *** Test 1: OK -+ *** Test 2: OK -+ *** Test 3: OK -+ *** Test 4: OK -+ *** Test 5: OK -+ *** Test 6: OK -+ *** Test 7: OK -+ *** Test 8: OK -+ *** Test 9: OK -+ *** Test 10: OK -*** ../vim-7.1.039/src/window.c Thu May 10 18:42:26 2007 ---- src/window.c Tue Jul 24 20:38:58 2007 -*************** -*** 75,80 **** ---- 75,81 ---- - static win_T *restore_snapshot_rec __ARGS((frame_T *sn, frame_T *fr)); - - #endif /* FEAT_WINDOWS */ -+ - static win_T *win_alloc __ARGS((win_T *after)); - static void win_new_height __ARGS((win_T *, int)); - -*************** -*** 4128,4133 **** ---- 4129,4138 ---- - #ifdef FEAT_AUTOCMD - --autocmd_block; - #endif -+ #ifdef FEAT_SEARCH_EXTRA -+ newwin->w_match_head = NULL; -+ newwin->w_next_match_id = 4; -+ #endif - } - return newwin; - } -*************** -*** 4185,4195 **** - vim_free(wp->w_tagstack[i].tagname); - - vim_free(wp->w_localdir); - #ifdef FEAT_SEARCH_EXTRA -! vim_free(wp->w_match[0].regprog); -! vim_free(wp->w_match[1].regprog); -! vim_free(wp->w_match[2].regprog); - #endif - #ifdef FEAT_JUMPLIST - free_jumplist(wp); - #endif ---- 4190,4200 ---- - vim_free(wp->w_tagstack[i].tagname); - - vim_free(wp->w_localdir); -+ - #ifdef FEAT_SEARCH_EXTRA -! clear_matches(wp); - #endif -+ - #ifdef FEAT_JUMPLIST - free_jumplist(wp); - #endif -*************** -*** 6172,6176 **** ---- 6177,6351 ---- - return TRUE; - - return FALSE; -+ } -+ #endif -+ -+ #if defined(FEAT_SEARCH_EXTRA) || defined(PROTO) -+ /* -+ * Add match to the match list of window 'wp'. The pattern 'pat' will be -+ * highligted with the group 'grp' with priority 'prio'. -+ * Optionally, a desired ID 'id' can be specified (greater than or equal to 1). -+ * If no particular ID is desired, -1 must be specified for 'id'. -+ * Return ID of added match, -1 on failure. -+ */ -+ int -+ match_add(wp, grp, pat, prio, id) -+ win_T *wp; -+ char_u *grp; -+ char_u *pat; -+ int prio; -+ int id; -+ { -+ matchitem_T *cur; -+ matchitem_T *prev; -+ matchitem_T *m; -+ int hlg_id; -+ regmmatch_T match; -+ -+ if (*grp == NUL || *pat == NUL) -+ return -1; -+ if (id < -1 || id == 0) -+ { -+ EMSGN("E799: Invalid ID: %ld (must be greater than or equal to 1)", id); -+ return -1; -+ } -+ if (id != -1) -+ { -+ cur = wp->w_match_head; -+ while (cur != NULL) -+ { -+ if (cur->id == id) -+ { -+ EMSGN("E801: ID already taken: %ld", id); -+ return -1; -+ } -+ cur = cur->next; -+ } -+ } -+ if ((hlg_id = syn_namen2id(grp, STRLEN(grp))) == 0) -+ { -+ EMSG2(_(e_nogroup), grp); -+ return -1; -+ } -+ if ((match.regprog = vim_regcomp(pat, RE_MAGIC)) == NULL) -+ { -+ EMSG2(_(e_invarg2), pat); -+ return -1; -+ } -+ -+ /* Find available match ID. */ -+ while (id == -1) -+ { -+ cur = wp->w_match_head; -+ while (cur != NULL && cur->id != wp->w_next_match_id) -+ cur = cur->next; -+ if (cur == NULL) -+ id = wp->w_next_match_id; -+ wp->w_next_match_id++; -+ } -+ -+ /* Build new match. */ -+ m = (matchitem_T *)alloc(sizeof(matchitem_T)); -+ m->id = id; -+ m->priority = prio; -+ m->pattern = vim_strsave(pat); -+ m->hlg_id = hlg_id; -+ m->match.regprog = match.regprog; -+ -+ /* Insert new match. The match list is in ascending order with regard to -+ * the match priorities. */ -+ cur = wp->w_match_head; -+ prev = cur; -+ while (cur != NULL && prio >= cur->priority) -+ { -+ prev = cur; -+ cur = cur->next; -+ } -+ if (cur == prev) -+ wp->w_match_head = m; -+ else -+ prev->next = m; -+ m->next = cur; -+ -+ redraw_later(SOME_VALID); -+ return id; -+ } -+ -+ /* -+ * Delete match with ID 'id' in the match list of window 'wp'. -+ * Print error messages if 'perr' is TRUE. -+ */ -+ int -+ match_delete(wp, id, perr) -+ win_T *wp; -+ int id; -+ int perr; -+ { -+ matchitem_T *cur = wp->w_match_head; -+ matchitem_T *prev = cur; -+ -+ if (id < 1) -+ { -+ if (perr == TRUE) -+ EMSGN("E802: Invalid ID: %ld (must be greater than or equal to 1)", -+ id); -+ return -1; -+ } -+ while (cur != NULL && cur->id != id) -+ { -+ prev = cur; -+ cur = cur->next; -+ } -+ if (cur == NULL) -+ { -+ if (perr == TRUE) -+ EMSGN("E803: ID not found: %ld", id); -+ return -1; -+ } -+ if (cur == prev) -+ wp->w_match_head = cur->next; -+ else -+ prev->next = cur->next; -+ vim_free(cur->match.regprog); -+ vim_free(cur->pattern); -+ vim_free(cur); -+ redraw_later(SOME_VALID); -+ return 0; -+ } -+ -+ /* -+ * Delete all matches in the match list of window 'wp'. -+ */ -+ void -+ clear_matches(wp) -+ win_T *wp; -+ { -+ matchitem_T *m; -+ -+ while (wp->w_match_head != NULL) -+ { -+ m = wp->w_match_head->next; -+ vim_free(wp->w_match_head->match.regprog); -+ vim_free(wp->w_match_head->pattern); -+ vim_free(wp->w_match_head); -+ wp->w_match_head = m; -+ } -+ redraw_later(SOME_VALID); -+ } -+ -+ /* -+ * Get match from ID 'id' in window 'wp'. -+ * Return NULL if match not found. -+ */ -+ matchitem_T * -+ get_match(wp, id) -+ win_T *wp; -+ int id; -+ { -+ matchitem_T *cur = wp->w_match_head; -+ -+ while (cur != NULL && cur->id != id) -+ cur = cur->next; -+ return cur; - } - #endif -*** ../vim-7.1.039/src/version.c Wed Jul 25 22:55:22 2007 ---- src/version.c Thu Jul 26 22:50:54 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 40, - /**/ - --- -It is hard to understand how a cemetery raised its burial -cost and blamed it on the cost of living. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.041 b/7.1.041 deleted file mode 100644 index a0e545e3..00000000 --- a/7.1.041 +++ /dev/null @@ -1,133 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.041 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.041 (extra, after 7.1.040) -Problem: Some changes for patch 7.1.0 are in extra files. -Solution: Update the extra files. -Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak, - src/testdir/Make_os2.mak, src/testdir/Make_vms.mms - - -*** ../vim-7.1.040/src/testdir/Make_amiga.mak Sun Apr 30 20:42:49 2006 ---- src/testdir/Make_amiga.mak Tue Jul 24 15:36:00 2007 -*************** -*** 25,31 **** - test43.out test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out - - .SUFFIXES: .in .out - ---- 25,31 ---- - test43.out test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out test63.out - - .SUFFIXES: .in .out - -*************** -*** 107,109 **** ---- 107,110 ---- - test60.out: test60.in - test61.out: test61.in - test62.out: test62.in -+ test63.out: test63.in -*** ../vim-7.1.040/src/testdir/Make_dos.mak Sun Apr 30 20:41:13 2006 ---- src/testdir/Make_dos.mak Tue Jul 24 15:37:47 2007 -*************** -*** 19,25 **** - test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out \ - test55.out test56.out test57.out test58.out test59.out \ -! test60.out test61.out test62.out - - SCRIPTS = test3.out test4.out test5.out test6.out test7.out \ - test8.out test9.out test11.out test13.out test14.out \ ---- 19,25 ---- - test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out \ - test55.out test56.out test57.out test58.out test59.out \ -! test60.out test61.out test62.out test63.out - - SCRIPTS = test3.out test4.out test5.out test6.out test7.out \ - test8.out test9.out test11.out test13.out test14.out \ -*** ../vim-7.1.040/src/testdir/Make_os2.mak Sun Apr 30 20:29:29 2006 ---- src/testdir/Make_os2.mak Tue Jul 24 15:39:15 2007 -*************** -*** 25,31 **** - test43.out test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out - - .SUFFIXES: .in .out - ---- 25,31 ---- - test43.out test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out test63.out - - .SUFFIXES: .in .out - -*** ../vim-7.1.040/src/testdir/Make_vms.mms Sun Apr 30 20:51:12 2006 ---- src/testdir/Make_vms.mms Tue Jul 24 15:39:23 2007 -*************** -*** 4,10 **** - # Authors: Zoltan Arpadffy, - # Sandor Kopanyi, - # -! # Last change: 2006 Apr 30 - # - # This has been tested on VMS 6.2 to 7.2 on DEC Alpha and VAX. - # Edit the lines in the Configuration section below to select. ---- 4,10 ---- - # Authors: Zoltan Arpadffy, - # Sandor Kopanyi, - # -! # Last change: 2007 Jul 24 - # - # This has been tested on VMS 6.2 to 7.2 on DEC Alpha and VAX. - # Edit the lines in the Configuration section below to select. -*************** -*** 59,65 **** - test43.out test44.out test45.out test46.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out - - .IFDEF WANT_GUI - SCRIPT_GUI = test16.out ---- 59,65 ---- - test43.out test44.out test45.out test46.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out test63.out - - .IFDEF WANT_GUI - SCRIPT_GUI = test16.out -*** ../vim-7.1.040/src/version.c Thu Jul 26 22:55:11 2007 ---- src/version.c Thu Jul 26 22:58:57 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 41, - /**/ - --- -Just remember...if the world didn't suck, we'd all fall off. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.042 b/7.1.042 deleted file mode 100644 index f3383695..00000000 --- a/7.1.042 +++ /dev/null @@ -1,75 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.042 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.042 (after 7.1.040) -Problem: Internal error when using matchadd(). (David Larson) -Solution: Check the third argument to be present before using the fourth - argument. (Martin Toft) -Files: src/eval.c - - -*** ../vim-7.1.041/src/eval.c Thu Jul 26 22:55:11 2007 ---- src/eval.c Fri Jul 27 21:29:39 2007 -*************** -*** 7108,7114 **** - {"getftype", 1, 1, f_getftype}, - {"getline", 1, 2, f_getline}, - {"getloclist", 1, 1, f_getqflist}, -! {"getmatches", 0, 0, f_getmatches}, - {"getpos", 1, 1, f_getpos}, - {"getqflist", 0, 0, f_getqflist}, - {"getreg", 0, 2, f_getreg}, ---- 7108,7114 ---- - {"getftype", 1, 1, f_getftype}, - {"getline", 1, 2, f_getline}, - {"getloclist", 1, 1, f_getqflist}, -! {"getmatches", 0, 0, f_getmatches}, - {"getpos", 1, 1, f_getpos}, - {"getqflist", 0, 0, f_getqflist}, - {"getreg", 0, 2, f_getreg}, -*************** -*** 12526,12534 **** - if (grp == NULL || pat == NULL) - return; - if (argvars[2].v_type != VAR_UNKNOWN) - prio = get_tv_number_chk(&argvars[2], &error); -! if (argvars[3].v_type != VAR_UNKNOWN) -! id = get_tv_number_chk(&argvars[3], &error); - if (error == TRUE) - return; - if (id >= 1 && id <= 3) ---- 12526,12536 ---- - if (grp == NULL || pat == NULL) - return; - if (argvars[2].v_type != VAR_UNKNOWN) -+ { - prio = get_tv_number_chk(&argvars[2], &error); -! if (argvars[3].v_type != VAR_UNKNOWN) -! id = get_tv_number_chk(&argvars[3], &error); -! } - if (error == TRUE) - return; - if (id >= 1 && id <= 3) -*** ../vim-7.1.041/src/version.c Thu Jul 26 23:10:50 2007 ---- src/version.c Fri Jul 27 21:31:13 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 42, - /**/ - --- -The future isn't what it used to be. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.043 b/7.1.043 deleted file mode 100644 index 7009f2f6..00000000 --- a/7.1.043 +++ /dev/null @@ -1,103 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.043 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.043 -Problem: In Ex mode using CTRL-D twice may cause a crash. Cursor isn't - positioned properly after CTRL-D. -Solution: Set prev_char properly. Position the cursor correctly. (Antony - Scriven) -Files: src/ex_getln.c - - -*** ../vim-7.1.042/src/ex_getln.c Tue Jul 24 14:32:44 2007 ---- src/ex_getln.c Wed Jul 25 20:57:05 2007 -*************** -*** 2095,2105 **** - garray_T line_ga; - char_u *pend; - int startcol = 0; -! int c1; - int escaped = FALSE; /* CTRL-V typed */ - int vcol = 0; - char_u *p; -! int prev_char = 0; - - /* Switch cursor on now. This avoids that it happens after the "\n", which - * confuses the system function that computes tabstops. */ ---- 2095,2105 ---- - garray_T line_ga; - char_u *pend; - int startcol = 0; -! int c1 = 0; - int escaped = FALSE; /* CTRL-V typed */ - int vcol = 0; - char_u *p; -! int prev_char; - - /* Switch cursor on now. This avoids that it happens after the "\n", which - * confuses the system function that computes tabstops. */ -*************** -*** 2152,2157 **** ---- 2152,2158 ---- - - /* Get one character at a time. Don't use inchar(), it can't handle - * special characters. */ -+ prev_char = c1; - c1 = vgetc(); - - /* -*************** -*** 2209,2215 **** - redraw: - /* redraw the line */ - msg_col = startcol; -- windgoto(msg_row, msg_col); - vcol = 0; - for (p = (char_u *)line_ga.ga_data; - p < (char_u *)line_ga.ga_data + line_ga.ga_len; ++p) ---- 2210,2215 ---- -*************** -*** 2228,2233 **** ---- 2228,2234 ---- - } - } - msg_clr_eos(); -+ windgoto(msg_row, msg_col); - continue; - } - -*************** -*** 2273,2279 **** - if (IS_SPECIAL(c1)) - c1 = '?'; - ((char_u *)line_ga.ga_data)[line_ga.ga_len] = c1; -- prev_char = c1; - if (c1 == '\n') - msg_putchar('\n'); - else if (c1 == TAB) ---- 2274,2279 ---- -*** ../vim-7.1.042/src/version.c Fri Jul 27 21:32:13 2007 ---- src/version.c Sat Jul 28 14:19:37 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 43, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -48. You get a tatoo that says "This body best viewed with Netscape 3.1 or - higher." - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.044 b/7.1.044 deleted file mode 100644 index 81b4f16d..00000000 --- a/7.1.044 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.044 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.044 -Problem: In Insert mode 0 CTRL-T deletes all indent, it should add indent. - (Gautam Iyer) -Solution: Check for CTRL-D typed. -Files: src/edit.c - - -*** ../vim-7.1.043/src/edit.c Thu Jun 28 12:44:56 2007 ---- src/edit.c Wed Jul 25 22:50:28 2007 -*************** -*** 8000,8006 **** - /* - * 0^D and ^^D: remove all indent. - */ -! if ((lastc == '0' || lastc == '^') && curwin->w_cursor.col) - { - --curwin->w_cursor.col; - (void)del_char(FALSE); /* delete the '^' or '0' */ ---- 8000,8007 ---- - /* - * 0^D and ^^D: remove all indent. - */ -! if (c == Ctrl_D && (lastc == '0' || lastc == '^') -! && curwin->w_cursor.col > 0) - { - --curwin->w_cursor.col; - (void)del_char(FALSE); /* delete the '^' or '0' */ -*** ../vim-7.1.043/src/version.c Sat Jul 28 14:21:04 2007 ---- src/version.c Sun Jul 29 14:14:36 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 44, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -54. You start tilting your head sideways to smile. :-) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.045 b/7.1.045 deleted file mode 100644 index 32307d2b..00000000 --- a/7.1.045 +++ /dev/null @@ -1,101 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.045 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.045 -Problem: Unnecessary screen redrawing. (Jjgod Jiang) -Solution: Reset "must_redraw" after clearing the screen. -Files: src/screen.c - - -*** ../vim-7.1.044/src/screen.c Thu Jul 26 22:55:11 2007 ---- src/screen.c Mon Jul 30 21:39:32 2007 -*************** -*** 331,336 **** ---- 331,341 ---- - { - if (type < must_redraw) /* use maximal type */ - type = must_redraw; -+ -+ /* must_redraw is reset here, so that when we run into some weird -+ * reason to redraw while busy redrawing (e.g., asynchronous -+ * scrolling), or update_topline() in win_update() will cause a -+ * scroll, the screen will be redrawn later or in win_update(). */ - must_redraw = 0; - } - -*************** -*** 1019,1024 **** ---- 1024,1036 ---- - type = VALID; - } - -+ /* Trick: we want to avoid clearning the screen twice. screenclear() will -+ * set "screen_cleared" to TRUE. The special value MAYBE (which is still -+ * non-zero and thus not FALSE) will indicate that screenclear() was not -+ * called. */ -+ if (screen_cleared) -+ screen_cleared = MAYBE; -+ - /* - * If there are no changes on the screen that require a complete redraw, - * handle three cases: -*************** -*** 1220,1226 **** - mid_end = wp->w_height; - if (lastwin == firstwin) - { -! screenclear(); - #ifdef FEAT_WINDOWS - /* The screen was cleared, redraw the tab pages line. */ - if (redraw_tabline) ---- 1232,1242 ---- - mid_end = wp->w_height; - if (lastwin == firstwin) - { -! /* Clear the screen when it was not done by win_del_lines() or -! * win_ins_lines() above, "screen_cleared" is FALSE or MAYBE -! * then. */ -! if (screen_cleared != TRUE) -! screenclear(); - #ifdef FEAT_WINDOWS - /* The screen was cleared, redraw the tab pages line. */ - if (redraw_tabline) -*************** -*** 1228,1233 **** ---- 1244,1256 ---- - #endif - } - } -+ -+ /* When win_del_lines() or win_ins_lines() caused the screen to be -+ * cleared (only happens for the first window) or when screenclear() -+ * was called directly above, "must_redraw" will have been set to -+ * NOT_VALID, need to reset it here to avoid redrawing twice. */ -+ if (screen_cleared == TRUE) -+ must_redraw = 0; - } - else - { -*** ../vim-7.1.044/src/version.c Sun Jul 29 15:02:34 2007 ---- src/version.c Mon Jul 30 21:58:06 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 45, - /**/ - --- -Be thankful to be in a traffic jam, because it means you own a car. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.046 b/7.1.046 deleted file mode 100644 index 349b6b1d..00000000 --- a/7.1.046 +++ /dev/null @@ -1,60 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.046 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.046 -Problem: ":s" command removes combining characters. (Ron Aaron) -Solution: Copy composing characters individually. (Chris Lubinski) -Files: src/regexp.c - - -*** ../vim-7.1.045/src/regexp.c Thu May 10 19:58:01 2007 ---- src/regexp.c Fri Jul 27 21:17:47 2007 -*************** -*** 7014,7020 **** - #ifdef FEAT_MBYTE - if (has_mbyte) - { -! int l = mb_ptr2len(s) - 1; - - s += l; - len -= l; ---- 7014,7027 ---- - #ifdef FEAT_MBYTE - if (has_mbyte) - { -! int l; -! -! /* Copy composing characters separately, one -! * at a time. */ -! if (enc_utf8) -! l = utf_ptr2len(s) - 1; -! else -! l = mb_ptr2len(s) - 1; - - s += l; - len -= l; -*** ../vim-7.1.045/src/version.c Mon Jul 30 21:59:50 2007 ---- src/version.c Mon Jul 30 22:30:02 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 46, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -57. You begin to wonder how on earth your service provider is allowed to call - 200 hours per month "unlimited." - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.047 b/7.1.047 deleted file mode 100644 index e41bbbea..00000000 --- a/7.1.047 +++ /dev/null @@ -1,52 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.047 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.047 -Problem: vim_regcomp() called with invalid argument. (Xiaozhou Liu) -Solution: Change TRUE to RE_MAGIC + RE_STRING. -Files: src/ex_eval.c - - -*** ../vim-7.1.046/src/ex_eval.c Thu May 10 20:23:50 2007 ---- src/ex_eval.c Sat Jul 28 13:09:00 2007 -*************** -*** 1551,1557 **** - } - save_cpo = p_cpo; - p_cpo = (char_u *)""; -! regmatch.regprog = vim_regcomp(pat, TRUE); - regmatch.rm_ic = FALSE; - if (end != NULL) - *end = save_char; ---- 1551,1557 ---- - } - save_cpo = p_cpo; - p_cpo = (char_u *)""; -! regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); - regmatch.rm_ic = FALSE; - if (end != NULL) - *end = save_char; -*** ../vim-7.1.046/src/version.c Mon Jul 30 22:32:11 2007 ---- src/version.c Wed Aug 1 15:46:28 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 47, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -80. At parties, you introduce your spouse as your "service provider." - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.048 b/7.1.048 deleted file mode 100644 index 3ff6a97c..00000000 --- a/7.1.048 +++ /dev/null @@ -1,135 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.048 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.048 -Problem: The matchparen plugin doesn't update the match when scrolling with - the mouse wheel. (Ilya Bobir) -Solution: Set the match highlighting for text that can be scrolled into the - viewable area without moving the cursor. (Chris Lubinski) -Files: runtime/plugin/matchparen.vim - - -*** ../vim-7.1.047/runtime/plugin/matchparen.vim Sun May 6 14:26:16 2007 ---- runtime/plugin/matchparen.vim Mon Jul 30 21:14:06 2007 -*************** -*** 1,6 **** - " Vim plugin for showing matching parens - " Maintainer: Bram Moolenaar -! " Last Change: 2006 Oct 12 - - " Exit quickly when: - " - this plugin was already loaded (or disabled) ---- 1,6 ---- - " Vim plugin for showing matching parens - " Maintainer: Bram Moolenaar -! " Last Change: 2007 Jul 30 - - " Exit quickly when: - " - this plugin was already loaded (or disabled) -*************** -*** 62,86 **** - " Figure out the arguments for searchpairpos(). - " Restrict the search to visible lines with "stopline". - " And avoid searching very far (e.g., for closed folds and long lines) - if i % 2 == 0 - let s_flags = 'nW' - let c2 = plist[i + 1] - if has("byte_offset") && has("syntax_items") && &smc > 0 - let stopbyte = min([line2byte("$"), line2byte(".") + col(".") + &smc * 2]) -! let stopline = min([line('w$'), byte2line(stopbyte)]) - else -! let stopline = min([line('w$'), c_lnum + 100]) - endif - else - let s_flags = 'nbW' - let c2 = c - let c = plist[i - 1] - if has("byte_offset") && has("syntax_items") && &smc > 0 - let stopbyte = max([1, line2byte(".") + col(".") - &smc * 2]) -! let stopline = max([line('w0'), byte2line(stopbyte)]) - else -! let stopline = max([line('w0'), c_lnum - 100]) - endif - endif - if c == '[' - let c = '\[' ---- 62,98 ---- - " Figure out the arguments for searchpairpos(). - " Restrict the search to visible lines with "stopline". - " And avoid searching very far (e.g., for closed folds and long lines) -+ " The "viewable" variables give a range in which we can scroll while keeping -+ " the cursor at the same position -+ " adjustedScrolloff accounts for very large numbers of scrolloff -+ let adjustedScrolloff = min([&scrolloff, (line('w$') - line('w0')) / 2]) -+ let bottom_viewable = min([line('$'), c_lnum + &lines - adjustedScrolloff - 2]) -+ let top_viewable = max([1, c_lnum-&lines+adjustedScrolloff + 2]) -+ " one of these stoplines will be adjusted below, but the current values are -+ " minimal boundaries within the current window -+ let stoplinebottom = line('w$') -+ let stoplinetop = line('w0') - if i % 2 == 0 - let s_flags = 'nW' - let c2 = plist[i + 1] - if has("byte_offset") && has("syntax_items") && &smc > 0 - let stopbyte = min([line2byte("$"), line2byte(".") + col(".") + &smc * 2]) -! let stopline = min([bottom_viewable, byte2line(stopbyte)]) - else -! let stopline = min([bottom_viewable, c_lnum + 100]) - endif -+ let stoplinebottom = stopline - else - let s_flags = 'nbW' - let c2 = c - let c = plist[i - 1] - if has("byte_offset") && has("syntax_items") && &smc > 0 - let stopbyte = max([1, line2byte(".") + col(".") - &smc * 2]) -! let stopline = max([top_viewable, byte2line(stopbyte)]) - else -! let stopline = max([top_viewable, c_lnum - 100]) - endif -+ let stoplinetop = stopline - endif - if c == '[' - let c = '\[' -*************** -*** 106,112 **** - endif - - " If a match is found setup match highlighting. -! if m_lnum > 0 && m_lnum >= line('w0') && m_lnum <= line('w$') - exe '3match MatchParen /\(\%' . c_lnum . 'l\%' . (c_col - before) . - \ 'c\)\|\(\%' . m_lnum . 'l\%' . m_col . 'c\)/' - let w:paren_hl_on = 1 ---- 118,124 ---- - endif - - " If a match is found setup match highlighting. -! if m_lnum > 0 && m_lnum >= stoplinetop && m_lnum <= stoplinebottom - exe '3match MatchParen /\(\%' . c_lnum . 'l\%' . (c_col - before) . - \ 'c\)\|\(\%' . m_lnum . 'l\%' . m_col . 'c\)/' - let w:paren_hl_on = 1 -*** ../vim-7.1.047/src/version.c Wed Aug 1 15:47:06 2007 ---- src/version.c Thu Aug 2 22:59:07 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 48, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -91. It's Saturday afternoon in the middle of May and you - are on computer. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.049 b/7.1.049 deleted file mode 100644 index f60f908e..00000000 --- a/7.1.049 +++ /dev/null @@ -1,52 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.049 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.049 -Problem: Cannot compile GTK2 version with Hangul input feature. -Solution: Don't define FEAT_XFONTSET when using GTK2. -Files: src/feature.h - - -*** ../vim-7.1.048/src/feature.h Thu May 10 19:43:24 2007 ---- src/feature.h Fri Aug 3 19:32:56 2007 -*************** -*** 673,679 **** - # define ESC_CHG_TO_ENG_MODE /* if defined, when ESC pressed, - * turn to english mode - */ -! # if !defined(FEAT_XFONTSET) && defined(HAVE_X11) - # define FEAT_XFONTSET /* Hangul input requires xfontset */ - # endif - # if defined(FEAT_XIM) && !defined(LINT) ---- 673,679 ---- - # define ESC_CHG_TO_ENG_MODE /* if defined, when ESC pressed, - * turn to english mode - */ -! # if !defined(FEAT_XFONTSET) && defined(HAVE_X11) && !defined(HAVE_GTK2) - # define FEAT_XFONTSET /* Hangul input requires xfontset */ - # endif - # if defined(FEAT_XIM) && !defined(LINT) -*** ../vim-7.1.048/src/version.c Thu Aug 2 23:00:06 2007 ---- src/version.c Fri Aug 3 21:58:23 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 49, - /**/ - --- -From "know your smileys": - :-O>-o Smiley American tourist (note big mouth and camera) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.050 b/7.1.050 deleted file mode 100644 index 7d9af869..00000000 --- a/7.1.050 +++ /dev/null @@ -1,172 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.050 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.050 -Problem: Possible crash when using C++ indenting. (Chris Monson) -Solution: Keep the line pointer to the line to compare with. Avoid going - past the end of line. -Files: src/misc1.c - - -*** ../vim-7.1.049/src/misc1.c Tue Jul 24 15:25:27 2007 ---- src/misc1.c Fri Aug 3 21:07:17 2007 -*************** -*** 4820,4826 **** - static int cin_iswhileofdo __ARGS((char_u *, linenr_T, int)); - static int cin_iswhileofdo_end __ARGS((int terminated, int ind_maxparen, int ind_maxcomment)); - static int cin_isbreak __ARGS((char_u *)); -! static int cin_is_cpp_baseclass __ARGS((char_u *line, colnr_T *col)); - static int get_baseclass_amount __ARGS((int col, int ind_maxparen, int ind_maxcomment, int ind_cpp_baseclass)); - static int cin_ends_in __ARGS((char_u *, char_u *, char_u *)); - static int cin_skip2pos __ARGS((pos_T *trypos)); ---- 4820,4826 ---- - static int cin_iswhileofdo __ARGS((char_u *, linenr_T, int)); - static int cin_iswhileofdo_end __ARGS((int terminated, int ind_maxparen, int ind_maxcomment)); - static int cin_isbreak __ARGS((char_u *)); -! static int cin_is_cpp_baseclass __ARGS((colnr_T *col)); - static int get_baseclass_amount __ARGS((int col, int ind_maxparen, int ind_maxcomment, int ind_cpp_baseclass)); - static int cin_ends_in __ARGS((char_u *, char_u *, char_u *)); - static int cin_skip2pos __ARGS((pos_T *trypos)); -*************** -*** 5585,5597 **** - * This is a lot of guessing. Watch out for "cond ? func() : foo". - */ - static int -! cin_is_cpp_baseclass(line, col) -! char_u *line; - colnr_T *col; /* return: column to align with */ - { - char_u *s; - int class_or_struct, lookfor_ctor_init, cpp_base_class; - linenr_T lnum = curwin->w_cursor.lnum; - - *col = 0; - ---- 5585,5597 ---- - * This is a lot of guessing. Watch out for "cond ? func() : foo". - */ - static int -! cin_is_cpp_baseclass(col) - colnr_T *col; /* return: column to align with */ - { - char_u *s; - int class_or_struct, lookfor_ctor_init, cpp_base_class; - linenr_T lnum = curwin->w_cursor.lnum; -+ char_u *line = ml_get_curline(); - - *col = 0; - -*************** -*** 5619,5625 **** - */ - while (lnum > 1) - { -! s = skipwhite(ml_get(lnum - 1)); - if (*s == '#' || *s == NUL) - break; - while (*s != NUL) ---- 5619,5626 ---- - */ - while (lnum > 1) - { -! line = ml_get(lnum - 1); -! s = skipwhite(line); - if (*s == '#' || *s == NUL) - break; - while (*s != NUL) -*************** -*** 5636,5642 **** - --lnum; - } - -! s = cin_skipcomment(ml_get(lnum)); - for (;;) - { - if (*s == NUL) ---- 5637,5644 ---- - --lnum; - } - -! line = ml_get(lnum); -! s = cin_skipcomment(line); - for (;;) - { - if (*s == NUL) -*************** -*** 5644,5650 **** - if (lnum == curwin->w_cursor.lnum) - break; - /* Continue in the cursor line. */ -! s = cin_skipcomment(ml_get(++lnum)); - } - - if (s[0] == ':') ---- 5646,5655 ---- - if (lnum == curwin->w_cursor.lnum) - break; - /* Continue in the cursor line. */ -! line = ml_get(++lnum); -! s = cin_skipcomment(line); -! if (*s == NUL) -! continue; - } - - if (s[0] == ':') -*************** -*** 7113,7119 **** - n = FALSE; - if (lookfor != LOOKFOR_TERM && ind_cpp_baseclass > 0) - { -! n = cin_is_cpp_baseclass(l, &col); - l = ml_get_curline(); - } - if (n) ---- 7118,7124 ---- - n = FALSE; - if (lookfor != LOOKFOR_TERM && ind_cpp_baseclass > 0) - { -! n = cin_is_cpp_baseclass(&col); - l = ml_get_curline(); - } - if (n) -*************** -*** 7704,7710 **** - n = FALSE; - if (ind_cpp_baseclass != 0 && theline[0] != '{') - { -! n = cin_is_cpp_baseclass(l, &col); - l = ml_get_curline(); - } - if (n) ---- 7709,7715 ---- - n = FALSE; - if (ind_cpp_baseclass != 0 && theline[0] != '{') - { -! n = cin_is_cpp_baseclass(&col); - l = ml_get_curline(); - } - if (n) -*** ../vim-7.1.049/src/version.c Fri Aug 3 22:01:35 2007 ---- src/version.c Sat Aug 4 12:11:51 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 50, - /**/ - --- -From "know your smileys": - |-P Reaction to unusually ugly C code - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.051 b/7.1.051 deleted file mode 100644 index bee1c1e7..00000000 --- a/7.1.051 +++ /dev/null @@ -1,86 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.051 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.051 -Problem: Accessing uninitialized memory when finding spell suggestions. -Solution: Don't try swapping characters at the end of a word. -Files: src/spell.c - - -*** ../vim-7.1.050/src/spell.c Tue Jul 24 10:44:10 2007 ---- src/spell.c Sun Aug 5 16:59:48 2007 -*************** -*** 12182,12188 **** - { - n = mb_cptr2len(p); - c = mb_ptr2char(p); -! if (!soundfold && !spell_iswordp(p + n, curbuf)) - c2 = c; /* don't swap non-word char */ - else - c2 = mb_ptr2char(p + n); ---- 12182,12190 ---- - { - n = mb_cptr2len(p); - c = mb_ptr2char(p); -! if (p[n] == NUL) -! c2 = NUL; -! else if (!soundfold && !spell_iswordp(p + n, curbuf)) - c2 = c; /* don't swap non-word char */ - else - c2 = mb_ptr2char(p + n); -*************** -*** 12190,12199 **** - else - #endif - { -! if (!soundfold && !spell_iswordp(p + 1, curbuf)) - c2 = c; /* don't swap non-word char */ - else - c2 = p[1]; - } - - /* When characters are identical, swap won't do anything. ---- 12192,12210 ---- - else - #endif - { -! if (p[1] == NUL) -! c2 = NUL; -! else if (!soundfold && !spell_iswordp(p + 1, curbuf)) - c2 = c; /* don't swap non-word char */ - else - c2 = p[1]; -+ } -+ -+ /* When the second character is NUL we can't swap. */ -+ if (c2 == NUL) -+ { -+ sp->ts_state = STATE_REP_INI; -+ break; - } - - /* When characters are identical, swap won't do anything. -*** ../vim-7.1.050/src/version.c Sat Aug 4 12:14:04 2007 ---- src/version.c Sun Aug 5 18:31:09 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 51, - /**/ - --- -From "know your smileys": - 8<}} Glasses, big nose, beard - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.052 b/7.1.052 deleted file mode 100644 index d4da9f00..00000000 --- a/7.1.052 +++ /dev/null @@ -1,89 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.052 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.052 -Problem: When creating a new match not all fields are initialized, which - may lead to unpredictable results. -Solution: Initialise rmm_ic and rmm_maxcol. -Files: src/window.c - - -*** ../vim-7.1.051/src/window.c Thu Jul 26 22:55:11 2007 ---- src/window.c Sun Aug 5 17:17:51 2007 -*************** -*** 6200,6206 **** - matchitem_T *prev; - matchitem_T *m; - int hlg_id; -! regmmatch_T match; - - if (*grp == NUL || *pat == NUL) - return -1; ---- 6243,6249 ---- - matchitem_T *prev; - matchitem_T *m; - int hlg_id; -! regprog_T *regprog; - - if (*grp == NUL || *pat == NUL) - return -1; -*************** -*** 6227,6233 **** - EMSG2(_(e_nogroup), grp); - return -1; - } -! if ((match.regprog = vim_regcomp(pat, RE_MAGIC)) == NULL) - { - EMSG2(_(e_invarg2), pat); - return -1; ---- 6270,6276 ---- - EMSG2(_(e_nogroup), grp); - return -1; - } -! if ((regprog = vim_regcomp(pat, RE_MAGIC)) == NULL) - { - EMSG2(_(e_invarg2), pat); - return -1; -*************** -*** 6250,6256 **** - m->priority = prio; - m->pattern = vim_strsave(pat); - m->hlg_id = hlg_id; -! m->match.regprog = match.regprog; - - /* Insert new match. The match list is in ascending order with regard to - * the match priorities. */ ---- 6293,6301 ---- - m->priority = prio; - m->pattern = vim_strsave(pat); - m->hlg_id = hlg_id; -! m->match.regprog = regprog; -! m->match.rmm_ic = FALSE; -! m->match.rmm_maxcol = 0; - - /* Insert new match. The match list is in ascending order with regard to - * the match priorities. */ -*** ../vim-7.1.051/src/version.c Sun Aug 5 18:32:21 2007 ---- src/version.c Sun Aug 5 18:47:55 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 52, - /**/ - --- -From "know your smileys": - 8-O "Omigod!!" (done "rm -rf *" ?) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.053 b/7.1.053 deleted file mode 100644 index 22a4a089..00000000 --- a/7.1.053 +++ /dev/null @@ -1,52 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.053 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.053 -Problem: Accessing uninitialized memory when giving a message. -Solution: Check going the length before checking for a NUL byte. -Files: src/message.c - - -*** ../vim-7.1.052/src/message.c Thu Jul 5 10:10:29 2007 ---- src/message.c Sat Aug 4 23:13:58 2007 -*************** -*** 1842,1848 **** - int wrap; - - did_wait_return = FALSE; -! while (*s != NUL && (maxlen < 0 || (int)(s - str) < maxlen)) - { - /* - * We are at the end of the screen line when: ---- 1842,1848 ---- - int wrap; - - did_wait_return = FALSE; -! while ((maxlen < 0 || (int)(s - str) < maxlen) && *s != NUL) - { - /* - * We are at the end of the screen line when: -*** ../vim-7.1.052/src/version.c Sun Aug 5 18:49:07 2007 ---- src/version.c Sun Aug 5 19:18:46 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 53, - /**/ - --- -From "know your smileys": - <>:-) Bishop - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.054 b/7.1.054 deleted file mode 100644 index 42d60bba..00000000 --- a/7.1.054 +++ /dev/null @@ -1,148 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.054 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.054 -Problem: Accessing uninitialized memory when displaying the fold column. -Solution: Add a NUL to the extra array. (Dominique Pelle). Also do this in - a couple of other situations. -Files: src/screen.c - - -*** ../vim-7.1.053/src/screen.c Mon Jul 30 21:59:50 2007 ---- src/screen.c Sun Aug 5 16:10:53 2007 -*************** -*** 2555,2561 **** - - char_u extra[18]; /* "%ld" and 'fdc' must fit in here */ - int n_extra = 0; /* number of extra chars */ -! char_u *p_extra = NULL; /* string of extra chars */ - int c_extra = NUL; /* extra chars, all the same */ - int extra_attr = 0; /* attributes when n_extra != 0 */ - static char_u *at_end_str = (char_u *)""; /* used for p_extra when ---- 2555,2561 ---- - - char_u extra[18]; /* "%ld" and 'fdc' must fit in here */ - int n_extra = 0; /* number of extra chars */ -! char_u *p_extra = NULL; /* string of extra chars, plus NUL */ - int c_extra = NUL; /* extra chars, all the same */ - int extra_attr = 0; /* attributes when n_extra != 0 */ - static char_u *at_end_str = (char_u *)""; /* used for p_extra when -*************** -*** 3189,3198 **** - if (cmdwin_type != 0 && wp == curwin) - { - /* Draw the cmdline character. */ -- *extra = cmdwin_type; - n_extra = 1; -! p_extra = extra; -! c_extra = NUL; - char_attr = hl_attr(HLF_AT); - } - } ---- 3189,3196 ---- - if (cmdwin_type != 0 && wp == curwin) - { - /* Draw the cmdline character. */ - n_extra = 1; -! c_extra = cmdwin_type; - char_attr = hl_attr(HLF_AT); - } - } -*************** -*** 3208,3213 **** ---- 3206,3212 ---- - fill_foldcolumn(extra, wp, FALSE, lnum); - n_extra = wp->w_p_fdc; - p_extra = extra; -+ p_extra[n_extra] = NUL; - c_extra = NUL; - char_attr = hl_attr(HLF_FC); - } -*************** -*** 3550,3558 **** - * Get the next character to put on the screen. - */ - /* -! * The 'extra' array contains the extra stuff that is inserted to -! * represent special characters (non-printable stuff). When all -! * characters are the same, c_extra is used. - * For the '$' of the 'list' option, n_extra == 1, p_extra == "". - */ - if (n_extra > 0) ---- 3549,3559 ---- - * Get the next character to put on the screen. - */ - /* -! * The "p_extra" points to the extra stuff that is inserted to -! * represent special characters (non-printable stuff) and other -! * things. When all characters are the same, c_extra is used. -! * "p_extra" must end in a NUL to avoid mb_ptr2len() reads past -! * "p_extra[n_extra]". - * For the '$' of the 'list' option, n_extra == 1, p_extra == "". - */ - if (n_extra > 0) -*************** -*** 3808,3817 **** - * a '<' in the first column. */ - if (n_skip > 0 && mb_l > 1) - { -- extra[0] = '<'; -- p_extra = extra; - n_extra = 1; -! c_extra = NUL; - c = ' '; - if (area_attr == 0 && search_attr == 0) - { ---- 3809,3816 ---- - * a '<' in the first column. */ - if (n_skip > 0 && mb_l > 1) - { - n_extra = 1; -! c_extra = '<'; - c = ' '; - if (area_attr == 0 && search_attr == 0) - { -*************** -*** 6204,6211 **** - return; - - off = LineOffset[row] + col; -! while (*ptr != NUL && col < screen_Columns -! && (len < 0 || (int)(ptr - text) < len)) - { - c = *ptr; - #ifdef FEAT_MBYTE ---- 6203,6211 ---- - return; - - off = LineOffset[row] + col; -! while (col < screen_Columns -! && (len < 0 || (int)(ptr - text) < len) -! && *ptr != NUL) - { - c = *ptr; - #ifdef FEAT_MBYTE -*** ../vim-7.1.053/src/version.c Sun Aug 5 19:20:04 2007 ---- src/version.c Sun Aug 5 20:07:47 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 54, - /**/ - --- -From "know your smileys": - +<(:-) The Pope - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.055 b/7.1.055 deleted file mode 100644 index 654797a6..00000000 --- a/7.1.055 +++ /dev/null @@ -1,216 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.055 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.055 -Problem: Using strcpy() with arguments that overlap. -Solution: Use mch_memmove() instead. -Files: src/buffer.c, src/charset.c, src/eval.c, src/ex_getln.c, - src/misc1.c, src/regexp.c, src/termlib.c - - -*** ../vim-7.1.054/src/buffer.c Tue Jun 19 15:40:51 2007 ---- src/buffer.c Sun Aug 5 16:14:03 2007 -*************** -*** 4860,4866 **** - */ - for (e = s; *e != ':' && *e != NUL; ++e) - if (e[0] == '\\' && e[1] == ':') -! STRCPY(e, e + 1); - if (*e == NUL) - end = TRUE; - ---- 4860,4866 ---- - */ - for (e = s; *e != ':' && *e != NUL; ++e) - if (e[0] == '\\' && e[1] == ':') -! mch_memmove(e, e + 1, STRLEN(e)); - if (*e == NUL) - end = TRUE; - -*** ../vim-7.1.054/src/charset.c Tue Mar 27 12:41:45 2007 ---- src/charset.c Sun Aug 5 21:53:44 2007 -*************** -*** 1898,1904 **** - { - for ( ; *p; ++p) - if (rem_backslash(p)) -! STRCPY(p, p + 1); - } - - /* ---- 1898,1904 ---- - { - for ( ; *p; ++p) - if (rem_backslash(p)) -! mch_memmove(p, p + 1, STRLEN(p)); - } - - /* -*** ../vim-7.1.054/src/eval.c Fri Jul 27 21:32:13 2007 ---- src/eval.c Sun Aug 5 16:25:03 2007 -*************** -*** 13807,13813 **** - } - /* Shorten "remain". */ - if (*q != NUL) -! STRCPY(remain, q - 1); - else - { - vim_free(remain); ---- 13807,13813 ---- - } - /* Shorten "remain". */ - if (*q != NUL) -! mch_memmove(remain, q - 1, STRLEN(q - 1) + 1); - else - { - vim_free(remain); -*** ../vim-7.1.054/src/ex_getln.c Sat Jul 28 14:21:04 2007 ---- src/ex_getln.c Sun Aug 5 21:55:56 2007 -*************** -*** 4306,4315 **** - && pat[i + 1] == '\\' - && pat[i + 2] == '\\' - && pat[i + 3] == ' ') -! STRCPY(pat + i, pat + i + 3); - if (xp->xp_backslash == XP_BS_ONE - && pat[i + 1] == ' ') -! STRCPY(pat + i, pat + i + 1); - } - } - ---- 4306,4316 ---- - && pat[i + 1] == '\\' - && pat[i + 2] == '\\' - && pat[i + 3] == ' ') -! mch_memmove(pat + i, pat + i + 3, -! STRLEN(pat + i + 3) + 1); - if (xp->xp_backslash == XP_BS_ONE - && pat[i + 1] == ' ') -! mch_memmove(pat + i, pat + i + 1, STRLEN(pat + i)); - } - } - -*************** -*** 4552,4558 **** - pat = vim_strsave(filepat); - for (i = 0; pat[i]; ++i) - if (pat[i] == '\\' && pat[i + 1] == ' ') -! STRCPY(pat + i, pat + i + 1); - - flags |= EW_FILE | EW_EXEC; - ---- 4553,4559 ---- - pat = vim_strsave(filepat); - for (i = 0; pat[i]; ++i) - if (pat[i] == '\\' && pat[i + 1] == ' ') -! mch_memmove(pat + i, pat + i + 1, STRLEN(pat + i)); - - flags |= EW_FILE | EW_EXEC; - -*** ../vim-7.1.054/src/misc1.c Sat Aug 4 12:14:04 2007 ---- src/misc1.c Sun Aug 5 21:57:15 2007 -*************** -*** 8635,8641 **** - for (p = buf + wildoff; p < s; ++p) - if (rem_backslash(p)) - { -! STRCPY(p, p + 1); - --e; - --s; - } ---- 8635,8641 ---- - for (p = buf + wildoff; p < s; ++p) - if (rem_backslash(p)) - { -! mch_memmove(p, p + 1, STRLEN(p)); - --e; - --s; - } -*************** -*** 8936,8942 **** - for (p = buf + wildoff; p < s; ++p) - if (rem_backslash(p)) - { -! STRCPY(p, p + 1); - --e; - --s; - } ---- 8936,8942 ---- - for (p = buf + wildoff; p < s; ++p) - if (rem_backslash(p)) - { -! mch_memmove(p, p + 1, STRLEN(p)); - --e; - --s; - } -*** ../vim-7.1.054/src/regexp.c Mon Jul 30 22:32:11 2007 ---- src/regexp.c Sun Aug 5 15:43:27 2007 -*************** -*** 6637,6645 **** - } - } - else if (magic) -! STRCPY(p, p + 1); /* remove '~' */ - else -! STRCPY(p, p + 2); /* remove '\~' */ - --p; - } - else ---- 6638,6646 ---- - } - } - else if (magic) -! mch_memmove(p, p + 1, STRLEN(p)); /* remove '~' */ - else -! mch_memmove(p, p + 2, STRLEN(p) - 1); /* remove '\~' */ - --p; - } - else -*** ../vim-7.1.054/src/termlib.c Thu May 10 20:20:59 2007 ---- src/termlib.c Sun Aug 5 21:52:41 2007 -*************** -*** 191,197 **** - lbuf[0] == '\t' && - lbuf[1] == ':') - { -! strcpy(lbuf, lbuf+2); - llen -= 2; - } - if (lbuf[llen-2] == '\\') /* and continuations */ ---- 191,197 ---- - lbuf[0] == '\t' && - lbuf[1] == ':') - { -! mch_memmove(lbuf, lbuf + 2, strlen(lbuf + 2) + 1); - llen -= 2; - } - if (lbuf[llen-2] == '\\') /* and continuations */ -*** ../vim-7.1.054/src/version.c Sun Aug 5 20:10:16 2007 ---- src/version.c Mon Aug 6 21:34:54 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 55, - /**/ - --- -From "know your smileys": - % Bike accident. A bit far-fetched, I suppose; although... - o _ _ _ - _o /\_ _ \\o (_)\__/o (_) - _< \_ _>(_) (_)/<_ \_| \ _|/' \/ - (_)>(_) (_) (_) (_) (_)' _\o_ - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.056 b/7.1.056 deleted file mode 100644 index 3986b5e6..00000000 --- a/7.1.056 +++ /dev/null @@ -1,106 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.056 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.056 -Problem: More prompt does not behave correctly after scrolling back. - (Randall W. Morris) -Solution: Avoid lines_left becomes negative. (Chris Lubinski) Don't check - mp_last when deciding to show the more prompt. (Martin Toft) -Files: src/message.c - - -*** ../vim-7.1.055/src/message.c Sun Aug 5 19:20:04 2007 ---- src/message.c Tue Aug 7 21:52:10 2007 -*************** -*** 1878,1884 **** - /* output postponed text */ - t_puts(&t_col, t_s, s, attr); - -! /* When no more prompt an no more room, truncate here */ - if (msg_no_more && lines_left == 0) - break; - ---- 1878,1884 ---- - /* output postponed text */ - t_puts(&t_col, t_s, s, attr); - -! /* When no more prompt and no more room, truncate here */ - if (msg_no_more && lines_left == 0) - break; - -*************** -*** 1927,1933 **** - * If screen is completely filled and 'more' is set then wait - * for a character. - */ -! --lines_left; - if (p_more && lines_left == 0 && State != HITRETURN - && !msg_no_more && !exmode_active) - { ---- 1927,1934 ---- - * If screen is completely filled and 'more' is set then wait - * for a character. - */ -! if (lines_left > 0) -! --lines_left; - if (p_more && lines_left == 0 && State != HITRETURN - && !msg_no_more && !exmode_active) - { -*************** -*** 2234,2240 **** - { - msgchunk_T *mp; - -! /* Only show somethign if there is more than one line, otherwise it looks - * weird, typing a command without output results in one line. */ - mp = msg_sb_start(last_msgchunk); - if (mp == NULL || mp->sb_prev == NULL) ---- 2235,2241 ---- - { - msgchunk_T *mp; - -! /* Only show something if there is more than one line, otherwise it looks - * weird, typing a command without output results in one line. */ - mp = msg_sb_start(last_msgchunk); - if (mp == NULL || mp->sb_prev == NULL) -*************** -*** 2622,2628 **** - } - } - -! if (scroll < 0 || (scroll == 0 && mp_last != NULL)) - { - /* displayed the requested text, more prompt again */ - screen_fill((int)Rows - 1, (int)Rows, 0, ---- 2623,2629 ---- - } - } - -! if (scroll <= 0) - { - /* displayed the requested text, more prompt again */ - screen_fill((int)Rows - 1, (int)Rows, 0, -*** ../vim-7.1.055/src/version.c Mon Aug 6 22:27:13 2007 ---- src/version.c Tue Aug 7 21:57:02 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 56, - /**/ - --- -From "know your smileys": - :-| :-| Deja' vu! - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.057 b/7.1.057 deleted file mode 100644 index daa4ae8a..00000000 --- a/7.1.057 +++ /dev/null @@ -1,91 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.057 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.057 -Problem: Problem with CursorHoldI when using "r" in Visual mode (Max - Dyckhoff) -Solution: Ignore CursorHold(I) when getting a second character for a Normal - mode command. Also abort the "r" command in Visual when a special - key is typed. -Files: src/normal.c - - -*** ../vim-7.1.056/src/normal.c Tue Jul 10 14:02:51 2007 ---- src/normal.c Sun Aug 5 21:57:43 2007 -*************** -*** 889,894 **** ---- 889,899 ---- - - ++no_mapping; - ++allow_keys; /* no mapping for nchar, but allow key codes */ -+ #ifdef FEAT_AUTOCMD -+ /* Don't generate a CursorHold event here, most commands can't handle -+ * it, e.g., nv_replace(), nv_csearch(). */ -+ did_cursorhold = TRUE; -+ #endif - if (ca.cmdchar == 'g') - { - /* -*************** -*** 6662,6667 **** ---- 6668,6680 ---- - else - had_ctrl_v = NUL; - -+ /* Abort if the character is a special key. */ -+ if (IS_SPECIAL(cap->nchar)) -+ { -+ clearopbeep(cap->oap); -+ return; -+ } -+ - #ifdef FEAT_VISUAL - /* Visual mode "r" */ - if (VIsual_active) -*************** -*** 6688,6698 **** - } - #endif - -! /* -! * Check for a special key or not enough characters to replace. -! */ - ptr = ml_get_cursor(); -! if (IS_SPECIAL(cap->nchar) || STRLEN(ptr) < (unsigned)cap->count1 - #ifdef FEAT_MBYTE - || (has_mbyte && mb_charlen(ptr) < cap->count1) - #endif ---- 6701,6709 ---- - } - #endif - -! /* Abort if not enough characters to replace. */ - ptr = ml_get_cursor(); -! if (STRLEN(ptr) < (unsigned)cap->count1 - #ifdef FEAT_MBYTE - || (has_mbyte && mb_charlen(ptr) < cap->count1) - #endif -*** ../vim-7.1.056/src/version.c Tue Aug 7 21:59:26 2007 ---- src/version.c Wed Aug 8 21:39:43 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 57, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -95. Only communication in your household is through email. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.058 b/7.1.058 deleted file mode 100644 index f4e3864a..00000000 --- a/7.1.058 +++ /dev/null @@ -1,397 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.058 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.058 -Problem: When 'rightleft' is set the completion menu is positioned wrong. - (Baha-Eddine MOKADEM) -Solution: Fix the completion menu. (Martin Toft) -Files: src/popupmnu.c, src/proto/search.pro, src/search.c - - -*** ../vim-7.1.057/src/popupmnu.c Thu Jun 28 21:23:52 2007 ---- src/popupmnu.c Wed Aug 1 15:43:06 2007 -*************** -*** 75,81 **** - - row = curwin->w_cline_row + W_WINROW(curwin); - height = curwin->w_cline_height; -- col = curwin->w_wcol + W_WINCOL(curwin) - curwin->w_leftcol; - - if (firstwin->w_p_pvw) - top_clear = firstwin->w_height; ---- 75,80 ---- -*************** -*** 167,172 **** ---- 166,180 ---- - pum_base_width = max_width; - pum_kind_width = kind_width; - -+ /* Calculate column */ -+ #ifdef FEAT_RIGHTLEFT -+ if (curwin->w_p_rl) -+ col = W_WINCOL(curwin) + W_WIDTH(curwin) - curwin->w_wcol - -+ curwin->w_leftcol - 1; -+ else -+ #endif -+ col = W_WINCOL(curwin) + curwin->w_wcol - curwin->w_leftcol; -+ - /* if there are more items than room we need a scrollbar */ - if (pum_height < size) - { -*************** -*** 179,189 **** - if (def_width < max_width) - def_width = max_width; - -! if (col < Columns - PUM_DEF_WIDTH || col < Columns - max_width) - { - /* align pum column with "col" */ - pum_col = col; -! pum_width = Columns - pum_col - pum_scrollbar; - if (pum_width > max_width + kind_width + extra_width + 1 - && pum_width > PUM_DEF_WIDTH) - { ---- 187,209 ---- - if (def_width < max_width) - def_width = max_width; - -! if (((col < Columns - PUM_DEF_WIDTH || col < Columns - max_width) -! #ifdef FEAT_RIGHTLEFT -! && !curwin->w_p_rl) -! || (curwin->w_p_rl && (col > PUM_DEF_WIDTH || col > max_width) -! #endif -! )) - { - /* align pum column with "col" */ - pum_col = col; -! -! #ifdef FEAT_RIGHTLEFT -! if (curwin->w_p_rl) -! pum_width = pum_col - pum_scrollbar + 1; -! else -! #endif -! pum_width = Columns - pum_col - pum_scrollbar; -! - if (pum_width > max_width + kind_width + extra_width + 1 - && pum_width > PUM_DEF_WIDTH) - { -*************** -*** 195,208 **** - else if (Columns < def_width) - { - /* not enough room, will use what we have */ -! pum_col = 0; - pum_width = Columns - 1; - } - else - { - if (max_width > PUM_DEF_WIDTH) - max_width = PUM_DEF_WIDTH; /* truncate */ -! pum_col = Columns - max_width; - pum_width = max_width - pum_scrollbar; - } - ---- 215,238 ---- - else if (Columns < def_width) - { - /* not enough room, will use what we have */ -! #ifdef FEAT_RIGHTLEFT -! if (curwin->w_p_rl) -! pum_col = Columns - 1; -! else -! #endif -! pum_col = 0; - pum_width = Columns - 1; - } - else - { - if (max_width > PUM_DEF_WIDTH) - max_width = PUM_DEF_WIDTH; /* truncate */ -! #ifdef FEAT_RIGHTLEFT -! if (curwin->w_p_rl) -! pum_col = max_width - 1; -! else -! #endif -! pum_col = Columns - max_width; - pum_width = max_width - pum_scrollbar; - } - -*************** -*** 255,262 **** - attr = (idx == pum_selected) ? attr_select : attr_norm; - - /* prepend a space if there is room */ -! if (pum_col > 0) -! screen_putchar(' ', row, pum_col - 1, attr); - - /* Display each entry, use two spaces for a Tab. - * Do this 3 times: For the main text, kind and extra info */ ---- 285,300 ---- - attr = (idx == pum_selected) ? attr_select : attr_norm; - - /* prepend a space if there is room */ -! #ifdef FEAT_RIGHTLEFT -! if (curwin->w_p_rl) -! { -! if (pum_col < W_WINCOL(curwin) + W_WIDTH(curwin) - 1) -! screen_putchar(' ', row, pum_col + 1, attr); -! } -! else -! #endif -! if (pum_col > 0) -! screen_putchar(' ', row, pum_col - 1, attr); - - /* Display each entry, use two spaces for a Tab. - * Do this 3 times: For the main text, kind and extra info */ -*************** -*** 282,307 **** - { - /* Display the text that fits or comes before a Tab. - * First convert it to printable characters. */ -! char_u *st; -! int saved = *p; - - *p = NUL; - st = transstr(s); - *p = saved; -! if (st != NULL) - { -! screen_puts_len(st, (int)STRLEN(st), row, col, - attr); -! vim_free(st); - } -- col += width; - - if (*p != TAB) - break; - - /* Display two spaces for a Tab. */ -! screen_puts_len((char_u *)" ", 2, row, col, attr); -! col += 2; - totwidth += 2; - s = NULL; /* start text at next char */ - width = 0; ---- 320,386 ---- - { - /* Display the text that fits or comes before a Tab. - * First convert it to printable characters. */ -! char_u *st; -! int saved = *p; - - *p = NUL; - st = transstr(s); - *p = saved; -! #ifdef FEAT_RIGHTLEFT -! if (curwin->w_p_rl) - { -! if (st != NULL) -! { -! char_u *rt = reverse_text(st); -! char_u *rt_saved = rt; -! int len, j; -! -! if (rt != NULL) -! { -! len = STRLEN(rt); -! if (len > pum_width) -! { -! for (j = pum_width; j < len; ++j) -! mb_ptr_adv(rt); -! len = pum_width; -! } -! screen_puts_len(rt, len, row, -! col - len + 1, attr); -! vim_free(rt_saved); -! } -! vim_free(st); -! } -! col -= width; -! } -! else -! #endif -! { -! if (st != NULL) -! { -! screen_puts_len(st, (int)STRLEN(st), row, col, - attr); -! vim_free(st); -! } -! col += width; - } - - if (*p != TAB) - break; - - /* Display two spaces for a Tab. */ -! #ifdef FEAT_RIGHTLEFT -! if (curwin->w_p_rl) -! { -! screen_puts_len((char_u *)" ", 2, row, col - 1, -! attr); -! col -= 2; -! } -! else -! #endif -! { -! screen_puts_len((char_u *)" ", 2, row, col, attr); -! col += 2; -! } - totwidth += 2; - s = NULL; /* start text at next char */ - width = 0; -*************** -*** 322,338 **** - && pum_array[idx].pum_extra == NULL) - || pum_base_width + n >= pum_width) - break; -! screen_fill(row, row + 1, col, pum_col + pum_base_width + n, - ' ', ' ', attr); -! col = pum_col + pum_base_width + n; - totwidth = pum_base_width + n; - } - -! screen_fill(row, row + 1, col, pum_col + pum_width, ' ', ' ', attr); - if (pum_scrollbar > 0) -! screen_putchar(' ', row, pum_col + pum_width, -! i >= thumb_pos && i < thumb_pos + thumb_heigth - ? attr_thumb : attr_scroll); - - ++row; - } ---- 401,444 ---- - && pum_array[idx].pum_extra == NULL) - || pum_base_width + n >= pum_width) - break; -! #ifdef FEAT_RIGHTLEFT -! if (curwin->w_p_rl) -! { -! screen_fill(row, row + 1, pum_col - pum_base_width - n + 1, -! col + 1, ' ', ' ', attr); -! col = pum_col - pum_base_width - n + 1; -! } -! else -! #endif -! { -! screen_fill(row, row + 1, col, pum_col + pum_base_width + n, - ' ', ' ', attr); -! col = pum_col + pum_base_width + n; -! } - totwidth = pum_base_width + n; - } - -! #ifdef FEAT_RIGHTLEFT -! if (curwin->w_p_rl) -! screen_fill(row, row + 1, pum_col - pum_width + 1, col + 1, ' ', -! ' ', attr); -! else -! #endif -! screen_fill(row, row + 1, col, pum_col + pum_width, ' ', ' ', -! attr); - if (pum_scrollbar > 0) -! { -! #ifdef FEAT_RIGHTLEFT -! if (curwin->w_p_rl) -! screen_putchar(' ', row, pum_col - pum_width, -! i >= thumb_pos && i < thumb_pos + thumb_heigth - ? attr_thumb : attr_scroll); -+ else -+ #endif -+ screen_putchar(' ', row, pum_col + pum_width, -+ i >= thumb_pos && i < thumb_pos + thumb_heigth -+ ? attr_thumb : attr_scroll); -+ } - - ++row; - } -*** ../vim-7.1.057/src/proto/search.pro Sat May 5 20:20:36 2007 ---- src/proto/search.pro Wed Aug 1 12:41:25 2007 -*************** -*** 1,6 **** ---- 1,7 ---- - /* search.c */ - int search_regcomp __ARGS((char_u *pat, int pat_save, int pat_use, int options, regmmatch_T *regmatch)); - char_u *get_search_pat __ARGS((void)); -+ char_u *reverse_text __ARGS((char_u *s)); - void save_search_patterns __ARGS((void)); - void restore_search_patterns __ARGS((void)); - void free_search_patterns __ARGS((void)); -*** ../vim-7.1.057/src/search.c Tue Jul 10 13:27:46 2007 ---- src/search.c Wed Aug 1 12:39:22 2007 -*************** -*** 101,107 **** - static char_u *mr_pattern = NULL; /* pattern used by search_regcomp() */ - #ifdef FEAT_RIGHTLEFT - static int mr_pattern_alloced = FALSE; /* mr_pattern was allocated */ -- static char_u *reverse_text __ARGS((char_u *s)); - #endif - - #ifdef FEAT_FIND_ID ---- 101,106 ---- -*************** -*** 228,239 **** - return mr_pattern; - } - -! #ifdef FEAT_RIGHTLEFT - /* - * Reverse text into allocated memory. - * Returns the allocated string, NULL when out of memory. - */ -! static char_u * - reverse_text(s) - char_u *s; - { ---- 227,238 ---- - return mr_pattern; - } - -! #if defined(FEAT_RIGHTLEFT) || defined(PROTO) - /* - * Reverse text into allocated memory. - * Returns the allocated string, NULL when out of memory. - */ -! char_u * - reverse_text(s) - char_u *s; - { -*************** -*** 1898,1904 **** - } - - #ifdef FEAT_RIGHTLEFT -! /* This is just guessing: when 'rightleft' is set, search for a maching - * paren/brace in the other direction. */ - if (curwin->w_p_rl && vim_strchr((char_u *)"()[]{}<>", initc) != NULL) - backwards = !backwards; ---- 1897,1903 ---- - } - - #ifdef FEAT_RIGHTLEFT -! /* This is just guessing: when 'rightleft' is set, search for a matching - * paren/brace in the other direction. */ - if (curwin->w_p_rl && vim_strchr((char_u *)"()[]{}<>", initc) != NULL) - backwards = !backwards; -*** ../vim-7.1.057/src/version.c Wed Aug 8 21:41:19 2007 ---- src/version.c Wed Aug 8 22:44:49 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 58, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -99. The hum of a cooling fan and the click of keys is comforting to you. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.059 b/7.1.059 deleted file mode 100644 index 8e19558a..00000000 --- a/7.1.059 +++ /dev/null @@ -1,104 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.059 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.059 -Problem: When in Ex mode and doing "g/^/vi" and then pressing CTRL-C Vim - hangs and beeps. (Antony Scriven) -Solution: Clear "got_int" in the main loop to avoid the hang. When typing - CTRL-C twice in a row abort the ":g" command. This is Vi - compatible. -Files: src/main.c - - -*** ../vim-7.1.058/src/main.c Tue Jun 19 20:30:46 2007 ---- src/main.c Tue Aug 7 22:40:35 2007 -*************** -*** 954,960 **** - int cmdwin; /* TRUE when working in the command-line window */ - int noexmode; /* TRUE when return on entering Ex mode */ - { -! oparg_T oa; /* operator arguments */ - - #if defined(FEAT_X11) && defined(FEAT_XCLIPBOARD) - /* Setup to catch a terminating error from the X server. Just ignore ---- 954,961 ---- - int cmdwin; /* TRUE when working in the command-line window */ - int noexmode; /* TRUE when return on entering Ex mode */ - { -! oparg_T oa; /* operator arguments */ -! int previous_got_int = FALSE; /* "got_int" was TRUE */ - - #if defined(FEAT_X11) && defined(FEAT_XCLIPBOARD) - /* Setup to catch a terminating error from the X server. Just ignore -*************** -*** 1015,1026 **** - need_fileinfo = FALSE; - } - } -! if (got_int && !global_busy) - { -! if (!quit_more) -! (void)vgetc(); /* flush all buffers */ -! got_int = FALSE; - } - if (!exmode_active) - msg_scroll = FALSE; - quit_more = FALSE; ---- 1016,1047 ---- - need_fileinfo = FALSE; - } - } -! -! /* Reset "got_int" now that we got back to the main loop. Except when -! * inside a ":g/pat/cmd" command, then the "got_int" needs to abort -! * the ":g" command. -! * For ":g/pat/vi" we reset "got_int" when used once. When used -! * a second time we go back to Ex mode and abort the ":g" command. */ -! if (got_int) - { -! if (noexmode && global_busy && !exmode_active && previous_got_int) -! { -! /* Typed two CTRL-C in a row: go back to ex mode as if "Q" was -! * used and keep "got_int" set, so that it aborts ":g". */ -! exmode_active = EXMODE_NORMAL; -! State = NORMAL; -! } -! else if (!global_busy || !exmode_active) -! { -! if (!quit_more) -! (void)vgetc(); /* flush all buffers */ -! got_int = FALSE; -! } -! previous_got_int = TRUE; - } -+ else -+ previous_got_int = FALSE; -+ - if (!exmode_active) - msg_scroll = FALSE; - quit_more = FALSE; -*** ../vim-7.1.058/src/version.c Wed Aug 8 22:48:16 2007 ---- src/version.c Fri Aug 10 21:30:39 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 59, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -116. You are living with your boyfriend who networks your respective - computers so you can sit in separate rooms and email each other - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.060 b/7.1.060 deleted file mode 100644 index 8c3cb33c..00000000 --- a/7.1.060 +++ /dev/null @@ -1,176 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.060 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.060 -Problem: Splitting quickfix window messes up window layout. (Marius - Gedminas) -Solution: Compute the window size in a smarter way. (Martin Toft) -Files: src/window.c - - -*** ../vim-7.1.059/src/window.c Sun Aug 5 18:49:07 2007 ---- src/window.c Sun Aug 5 17:17:51 2007 -*************** -*** 2121,2127 **** - if (wp->w_p_pvw || bt_quickfix(wp->w_buffer)) - { - /* -! * The cursor goes to the preview or the quickfix window, try - * finding another window to go to. - */ - for (;;) ---- 2121,2127 ---- - if (wp->w_p_pvw || bt_quickfix(wp->w_buffer)) - { - /* -! * If the cursor goes to the preview or the quickfix window, try - * finding another window to go to. - */ - for (;;) -*************** -*** 2308,2314 **** - frame_T *frp, *frp2, *frp3; - frame_T *frp_close = win->w_frame; - win_T *wp; -- int old_size = 0; - - /* - * If there is only one window there is nothing to remove. ---- 2308,2313 ---- -*************** -*** 2329,2361 **** - if (frp_close->fr_parent->fr_layout == FR_COL) - { - #endif -! /* When 'winfixheight' is set, remember its old size and restore -! * it later (it's a simplistic solution...). Don't do this if the -! * window will occupy the full height of the screen. */ -! if (frp2->fr_win != NULL -! && (frp2->fr_next != NULL || frp2->fr_prev != NULL) -! && frp2->fr_win->w_p_wfh) -! old_size = frp2->fr_win->w_height; - frame_new_height(frp2, frp2->fr_height + frp_close->fr_height, - frp2 == frp_close->fr_next ? TRUE : FALSE, FALSE); -- if (old_size != 0) -- win_setheight_win(old_size, frp2->fr_win); - #ifdef FEAT_VERTSPLIT - *dirp = 'v'; - } - else - { -! /* When 'winfixwidth' is set, remember its old size and restore -! * it later (it's a simplistic solution...). Don't do this if the -! * window will occupy the full width of the screen. */ -! if (frp2->fr_win != NULL -! && (frp2->fr_next != NULL || frp2->fr_prev != NULL) -! && frp2->fr_win->w_p_wfw) -! old_size = frp2->fr_win->w_width; - frame_new_width(frp2, frp2->fr_width + frp_close->fr_width, - frp2 == frp_close->fr_next ? TRUE : FALSE, FALSE); -- if (old_size != 0) -- win_setwidth_win(old_size, frp2->fr_win); - *dirp = 'h'; - } - #endif ---- 2328,2404 ---- - if (frp_close->fr_parent->fr_layout == FR_COL) - { - #endif -! /* When 'winfixheight' is set, try to find another frame in the column -! * (as close to the closed frame as possible) to distribute the height -! * to. */ -! if (frp2->fr_win != NULL && frp2->fr_win->w_p_wfh) -! { -! frp = frp_close->fr_prev; -! frp3 = frp_close->fr_next; -! while (frp != NULL || frp3 != NULL) -! { -! if (frp != NULL) -! { -! if (frp->fr_win != NULL && !frp->fr_win->w_p_wfh) -! { -! frp2 = frp; -! wp = frp->fr_win; -! break; -! } -! frp = frp->fr_prev; -! } -! if (frp3 != NULL) -! { -! if (frp3->fr_win != NULL && !frp3->fr_win->w_p_wfh) -! { -! frp2 = frp3; -! wp = frp3->fr_win; -! break; -! } -! frp3 = frp3->fr_next; -! } -! } -! } - frame_new_height(frp2, frp2->fr_height + frp_close->fr_height, - frp2 == frp_close->fr_next ? TRUE : FALSE, FALSE); - #ifdef FEAT_VERTSPLIT - *dirp = 'v'; - } - else - { -! /* When 'winfixwidth' is set, try to find another frame in the column -! * (as close to the closed frame as possible) to distribute the width -! * to. */ -! if (frp2->fr_win != NULL && frp2->fr_win->w_p_wfw) -! { -! frp = frp_close->fr_prev; -! frp3 = frp_close->fr_next; -! while (frp != NULL || frp3 != NULL) -! { -! if (frp != NULL) -! { -! if (frp->fr_win != NULL && !frp->fr_win->w_p_wfw) -! { -! frp2 = frp; -! wp = frp->fr_win; -! break; -! } -! frp = frp->fr_prev; -! } -! if (frp3 != NULL) -! { -! if (frp3->fr_win != NULL && !frp3->fr_win->w_p_wfw) -! { -! frp2 = frp3; -! wp = frp3->fr_win; -! break; -! } -! frp3 = frp3->fr_next; -! } -! } -! } - frame_new_width(frp2, frp2->fr_width + frp_close->fr_width, - frp2 == frp_close->fr_next ? TRUE : FALSE, FALSE); - *dirp = 'h'; - } - #endif -*** ../vim-7.1.059/src/version.c Fri Aug 10 21:32:41 2007 ---- src/version.c Sat Aug 11 13:34:42 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 60, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -117. You are more comfortable typing in html. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.061 b/7.1.061 deleted file mode 100644 index e5cb28a8..00000000 --- a/7.1.061 +++ /dev/null @@ -1,222 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.061 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.061 -Problem: Win32: When 'encoding' is "latin1" 'ignorecase' doesn't work for - characters with umlaut. (Joachim Hofmann) -Solution: Do not use islower()/isupper()/tolower()/toupper() but our own - functions. (Chris Lubinski) -Files: src/mbyte.c, src/regexp.c, src/vim.h - - -*** ../vim-7.1.060/src/mbyte.c Thu May 10 19:45:20 2007 ---- src/mbyte.c Sat Aug 4 13:44:36 2007 -*************** -*** 2320,2326 **** - /* Single byte: first check normally, then with ignore case. */ - if (s1[i] != s2[i]) - { -! cdiff = TOLOWER_LOC(s1[i]) - TOLOWER_LOC(s2[i]); - if (cdiff != 0) - return cdiff; - } ---- 2320,2326 ---- - /* Single byte: first check normally, then with ignore case. */ - if (s1[i] != s2[i]) - { -! cdiff = MB_TOLOWER(s1[i]) - MB_TOLOWER(s2[i]); - if (cdiff != 0) - return cdiff; - } -*** ../vim-7.1.060/src/regexp.c Mon Aug 6 22:27:13 2007 ---- src/regexp.c Sun Aug 5 15:43:27 2007 -*************** -*** 2220,2226 **** - break; - case CLASS_LOWER: - for (cu = 1; cu <= 255; cu++) -! if (islower(cu)) - regc(cu); - break; - case CLASS_PRINT: ---- 2220,2226 ---- - break; - case CLASS_LOWER: - for (cu = 1; cu <= 255; cu++) -! if (MB_ISLOWER(cu)) - regc(cu); - break; - case CLASS_PRINT: -*************** -*** 2240,2246 **** - break; - case CLASS_UPPER: - for (cu = 1; cu <= 255; cu++) -! if (isupper(cu)) - regc(cu); - break; - case CLASS_XDIGIT: ---- 2240,2246 ---- - break; - case CLASS_UPPER: - for (cu = 1; cu <= 255; cu++) -! if (MB_ISUPPER(cu)) - regc(cu); - break; - case CLASS_XDIGIT: -*************** -*** 3465,3471 **** - (enc_utf8 && utf_fold(prog->regstart) == utf_fold(c))) - || (c < 255 && prog->regstart < 255 && - #endif -! TOLOWER_LOC(prog->regstart) == TOLOWER_LOC(c))))) - retval = regtry(prog, col); - else - retval = 0; ---- 3465,3471 ---- - (enc_utf8 && utf_fold(prog->regstart) == utf_fold(c))) - || (c < 255 && prog->regstart < 255 && - #endif -! MB_TOLOWER(prog->regstart) == MB_TOLOWER(c))))) - retval = regtry(prog, col); - else - retval = 0; -*************** -*** 4200,4206 **** - #ifdef FEAT_MBYTE - !enc_utf8 && - #endif -! TOLOWER_LOC(*opnd) != TOLOWER_LOC(*reginput)))) - status = RA_NOMATCH; - else if (*opnd == NUL) - { ---- 4200,4206 ---- - #ifdef FEAT_MBYTE - !enc_utf8 && - #endif -! MB_TOLOWER(*opnd) != MB_TOLOWER(*reginput)))) - status = RA_NOMATCH; - else if (*opnd == NUL) - { -*************** -*** 4733,4742 **** - rst.nextb = *OPERAND(next); - if (ireg_ic) - { -! if (isupper(rst.nextb)) -! rst.nextb_ic = TOLOWER_LOC(rst.nextb); - else -! rst.nextb_ic = TOUPPER_LOC(rst.nextb); - } - else - rst.nextb_ic = rst.nextb; ---- 4733,4742 ---- - rst.nextb = *OPERAND(next); - if (ireg_ic) - { -! if (MB_ISUPPER(rst.nextb)) -! rst.nextb_ic = MB_TOLOWER(rst.nextb); - else -! rst.nextb_ic = MB_TOUPPER(rst.nextb); - } - else - rst.nextb_ic = rst.nextb; -*************** -*** 5558,5568 **** - int cu, cl; - - /* This doesn't do a multi-byte character, because a MULTIBYTECODE -! * would have been used for it. */ - if (ireg_ic) - { -! cu = TOUPPER_LOC(*opnd); -! cl = TOLOWER_LOC(*opnd); - while (count < maxcount && (*scan == cu || *scan == cl)) - { - count++; ---- 5558,5569 ---- - int cu, cl; - - /* This doesn't do a multi-byte character, because a MULTIBYTECODE -! * would have been used for it. It does handle single-byte -! * characters, such as latin1. */ - if (ireg_ic) - { -! cu = MB_TOUPPER(*opnd); -! cl = MB_TOLOWER(*opnd); - while (count < maxcount && (*scan == cu || *scan == cl)) - { - count++; -*************** -*** 6490,6499 **** - cc = utf_fold(c); - else - #endif -! if (isupper(c)) -! cc = TOLOWER_LOC(c); -! else if (islower(c)) -! cc = TOUPPER_LOC(c); - else - return vim_strchr(s, c); - ---- 6491,6500 ---- - cc = utf_fold(c); - else - #endif -! if (MB_ISUPPER(c)) -! cc = MB_TOLOWER(c); -! else if (MB_ISLOWER(c)) -! cc = MB_TOUPPER(c); - else - return vim_strchr(s, c); - -*** ../vim-7.1.060/src/vim.h Sat May 12 15:08:22 2007 ---- src/vim.h Sat Aug 4 13:57:36 2007 -*************** -*** 1380,1387 **** - #endif - - #ifdef FEAT_MBYTE -! # define MB_STRICMP(d, s) (has_mbyte ? mb_strnicmp((char_u *)(d), (char_u *)(s), (int)MAXCOL) : STRICMP((d), (s))) -! # define MB_STRNICMP(d, s, n) (has_mbyte ? mb_strnicmp((char_u *)(d), (char_u *)(s), (int)(n)) : STRNICMP((d), (s), (n))) - #else - # define MB_STRICMP(d, s) STRICMP((d), (s)) - # define MB_STRNICMP(d, s, n) STRNICMP((d), (s), (n)) ---- 1380,1393 ---- - #endif - - #ifdef FEAT_MBYTE -! /* We need to call mb_stricmp() even when we aren't dealing with a multi-byte -! * encoding because mb_stricmp() takes care of all ascii and non-ascii -! * encodings, including characters with umluats in latin1, etc., while -! * STRICMP() only handles the system locale version, which often does not -! * handle non-ascii properly. */ -! -! # define MB_STRICMP(d, s) mb_strnicmp((char_u *)(d), (char_u *)(s), (int)MAXCOL) -! # define MB_STRNICMP(d, s, n) mb_strnicmp((char_u *)(d), (char_u *)(s), (int)(n)) - #else - # define MB_STRICMP(d, s) STRICMP((d), (s)) - # define MB_STRNICMP(d, s, n) STRNICMP((d), (s), (n)) -*** ../vim-7.1.060/src/version.c Sat Aug 11 13:37:36 2007 ---- src/version.c Sat Aug 11 13:55:24 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 61, - /**/ - --- -Support your right to bare arms! Wear short sleeves! - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.062 b/7.1.062 deleted file mode 100644 index 683b304a..00000000 --- a/7.1.062 +++ /dev/null @@ -1,55 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.062 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.062 (after 7.1.038) -Problem: Indents of C comments can be wrong. (John Mullin) -Solution: Adjust ind_len. (Chris Lubinski) -Files: src/misc1.c - - -*** ../vim-7.1.061/src/misc1.c Mon Aug 6 22:27:13 2007 ---- src/misc1.c Fri Aug 10 19:41:42 2007 -*************** -*** 222,228 **** - * than old) */ - while (vim_iswhite(*p)) - (void)*p++; -! todo = size-ind_done; - } - else - { ---- 222,231 ---- - * than old) */ - while (vim_iswhite(*p)) - (void)*p++; -! todo = size - ind_done; -! ind_len += todo; /* Set total length of indent in characters, -! * which may have been undercounted until now */ -! - } - else - { -*** ../vim-7.1.061/src/version.c Sat Aug 11 13:57:31 2007 ---- src/version.c Sat Aug 11 14:30:52 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 62, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -120. You ask a friend, "What's that big shiny thing?" He says, "It's the sun." - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.063 b/7.1.063 deleted file mode 100644 index d276d54d..00000000 --- a/7.1.063 +++ /dev/null @@ -1,52 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.063 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.063 (after 7.1.040) -Problem: Warning for unitialized variable. -Solution: Initialise it to NULL. -Files: src/ex_docmd.c - - -*** ../vim-7.1.062/src/ex_docmd.c Thu Jul 26 22:55:11 2007 ---- src/ex_docmd.c Wed Aug 8 22:28:33 2007 -*************** -*** 10817,10823 **** - exarg_T *eap; - { - char_u *p; -! char_u *g; - char_u *end; - int c; - int id; ---- 10818,10824 ---- - exarg_T *eap; - { - char_u *p; -! char_u *g = NULL; - char_u *end; - int c; - int id; -*** ../vim-7.1.062/src/version.c Sat Aug 11 14:32:10 2007 ---- src/version.c Sat Aug 11 15:58:55 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 63, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -124. You begin conversations with, "Who is your internet service provider?" - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.064 b/7.1.064 deleted file mode 100644 index f1fb1309..00000000 --- a/7.1.064 +++ /dev/null @@ -1,50 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.064 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.064 -Problem: On Interix some files appear not to exist. -Solution: Remove the top bit from st_mode. (Ligesh) -Files: src/os_unix.c - - -*** ../vim-7.1.063/src/os_unix.c Thu May 10 19:42:47 2007 ---- src/os_unix.c Fri Aug 10 19:32:20 2007 -*************** -*** 2499,2505 **** ---- 2499,2511 ---- - if (stat((char *)name, &statb)) - #endif - return -1; -+ #ifdef __INTERIX -+ /* The top bit makes the value negative, which means the file doesn't -+ * exist. Remove the bit, we don't use it. */ -+ return statb.st_mode & ~S_ADDACE; -+ #else - return statb.st_mode; -+ #endif - } - - /* -*** ../vim-7.1.063/src/version.c Sat Aug 11 15:59:44 2007 ---- src/version.c Sat Aug 11 22:21:35 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 64, - /**/ - --- -I have a watch cat! Just break in and she'll watch. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.065 b/7.1.065 deleted file mode 100644 index 57c7f224..00000000 --- a/7.1.065 +++ /dev/null @@ -1,113 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.065 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.065 (extra) -Problem: Win32: Compilation problem for newer version of w32api. -Solution: Only define __IID_DEFINED__ when needed. (Chris Sutcliffe) -Files: src/Make_ming.mak, src/iid_ole.c - - -*** ../vim-7.1.064/src/Make_ming.mak Thu May 10 19:35:54 2007 ---- src/Make_ming.mak Sat Aug 11 14:52:11 2007 -*************** -*** 572,579 **** - $(OUTDIR)/if_cscope.o: if_cscope.c $(INCL) if_cscope.h - $(CC) -c $(CFLAGS) if_cscope.c -o $(OUTDIR)/if_cscope.o - - $(OUTDIR)/if_ole.o: if_ole.cpp $(INCL) -! $(CC) $(CFLAGS) -D__IID_DEFINED__ -c -o $(OUTDIR)/if_ole.o if_ole.cpp - - $(OUTDIR)/if_ruby.o: if_ruby.c $(INCL) - ifeq (16, $(RUBY)) ---- 572,580 ---- - $(OUTDIR)/if_cscope.o: if_cscope.c $(INCL) if_cscope.h - $(CC) -c $(CFLAGS) if_cscope.c -o $(OUTDIR)/if_cscope.o - -+ # Remove -D__IID_DEFINED__ for newer versions of the w32api - $(OUTDIR)/if_ole.o: if_ole.cpp $(INCL) -! $(CC) $(CFLAGS) -c -o $(OUTDIR)/if_ole.o if_ole.cpp - - $(OUTDIR)/if_ruby.o: if_ruby.c $(INCL) - ifeq (16, $(RUBY)) -*** ../vim-7.1.064/src/iid_ole.c Sun Jun 13 18:45:30 2004 ---- src/iid_ole.c Sat Aug 11 14:57:58 2007 -*************** -*** 16,24 **** - extern "C"{ - #endif - - - #ifndef __IID_DEFINED__ -! #define __IID_DEFINED__ - - typedef struct _IID - { ---- 16,33 ---- - extern "C"{ - #endif - -+ #ifdef __MINGW32__ -+ # include -+ -+ # if __W32API_MAJOR_VERSION == 3 && __W32API_MINOR_VERSION < 10 -+ /* This define is missing from older MingW versions of w32api, even though -+ * IID is defined. */ -+ # define __IID_DEFINED__ -+ # endif -+ #endif - - #ifndef __IID_DEFINED__ -! # define __IID_DEFINED__ - - typedef struct _IID - { -*************** -*** 28,39 **** - unsigned char c[8]; - } IID; - -! #endif // __IID_DEFINED__ - - #ifndef CLSID_DEFINED -! #define CLSID_DEFINED - typedef IID CLSID; -! #endif // CLSID_DEFINED - - const IID IID_IVim = {0x0F0BFAE2,0x4C90,0x11d1,{0x82,0xD7,0x00,0x04,0xAC,0x36,0x85,0x19}}; - ---- 37,48 ---- - unsigned char c[8]; - } IID; - -! #endif - - #ifndef CLSID_DEFINED -! # define CLSID_DEFINED - typedef IID CLSID; -! #endif - - const IID IID_IVim = {0x0F0BFAE2,0x4C90,0x11d1,{0x82,0xD7,0x00,0x04,0xAC,0x36,0x85,0x19}}; - -*** ../vim-7.1.064/src/version.c Sat Aug 11 22:22:56 2007 ---- src/version.c Sun Aug 12 15:21:34 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 65, - /**/ - --- -I'm writing a book. I've got the page numbers done. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.066 b/7.1.066 deleted file mode 100644 index c9f16294..00000000 --- a/7.1.066 +++ /dev/null @@ -1,152 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.066 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.066 -Problem: When 'bomb' is set or reset the file should be considered - modified. (Tony Mechelynck) -Solution: Handle like 'endofline'. (Martin Toft) -Files: src/buffer.c, src/fileio.c, src/option.c, src/structs.h - - -*** ../vim-7.1.065/src/buffer.c Mon Aug 6 22:27:12 2007 ---- src/buffer.c Sat Aug 11 16:56:57 2007 -*************** -*** 502,507 **** ---- 502,508 ---- - buf->b_start_eol = TRUE; - #ifdef FEAT_MBYTE - buf->b_p_bomb = FALSE; -+ buf->b_start_bomb = FALSE; - #endif - buf->b_ml.ml_mfp = NULL; - buf->b_ml.ml_flags = ML_EMPTY; /* empty buffer */ -*** ../vim-7.1.065/src/fileio.c Tue Jul 10 17:09:51 2007 ---- src/fileio.c Sat Aug 11 16:56:57 2007 -*************** -*** 654,659 **** ---- 654,660 ---- - curbuf->b_start_eol = TRUE; - #ifdef FEAT_MBYTE - curbuf->b_p_bomb = FALSE; -+ curbuf->b_start_bomb = FALSE; - #endif - } - -*************** -*** 912,918 **** ---- 913,922 ---- - file_rewind = FALSE; - #ifdef FEAT_MBYTE - if (set_options) -+ { - curbuf->b_p_bomb = FALSE; -+ curbuf->b_start_bomb = FALSE; -+ } - conv_error = 0; - #endif - } -*************** -*** 1361,1367 **** ---- 1365,1374 ---- - size -= blen; - mch_memmove(ptr, ptr + blen, (size_t)size); - if (set_options) -+ { - curbuf->b_p_bomb = TRUE; -+ curbuf->b_start_bomb = TRUE; -+ } - } - - if (fio_flags == FIO_UCSBOM) -*** ../vim-7.1.065/src/option.c Tue Jul 24 14:57:16 2007 ---- src/option.c Sat Aug 11 16:56:57 2007 -*************** -*** 7118,7123 **** ---- 7118,7128 ---- - /* when 'endofline' is changed, redraw the window title */ - else if ((int *)varp == &curbuf->b_p_eol) - need_maketitle = TRUE; -+ #ifdef FEAT_MBYTE -+ /* when 'bomb' is changed, redraw the window title */ -+ else if ((int *)varp == &curbuf->b_p_bomb) -+ need_maketitle = TRUE; -+ #endif - #endif - - /* when 'bin' is set also set some other options */ -*************** -*** 10604,10609 **** ---- 10609,10616 ---- - buf->b_start_ffc = *buf->b_p_ff; - buf->b_start_eol = buf->b_p_eol; - #ifdef FEAT_MBYTE -+ buf->b_start_bomb = buf->b_p_bomb; -+ - /* Only use free/alloc when necessary, they take time. */ - if (buf->b_start_fenc == NULL - || STRCMP(buf->b_start_fenc, buf->b_p_fenc) != 0) -*************** -*** 10617,10623 **** - /* - * Return TRUE if 'fileformat' and/or 'fileencoding' has a different value - * from when editing started (save_file_ff() called). -! * Also when 'endofline' was changed and 'binary' is set. - * Don't consider a new, empty buffer to be changed. - */ - int ---- 10624,10631 ---- - /* - * Return TRUE if 'fileformat' and/or 'fileencoding' has a different value - * from when editing started (save_file_ff() called). -! * Also when 'endofline' was changed and 'binary' is set, or when 'bomb' was -! * changed and 'binary' is not set. - * Don't consider a new, empty buffer to be changed. - */ - int -*************** -*** 10636,10641 **** ---- 10644,10651 ---- - if (buf->b_p_bin && buf->b_start_eol != buf->b_p_eol) - return TRUE; - #ifdef FEAT_MBYTE -+ if (!buf->b_p_bin && buf->b_start_bomb != buf->b_p_bomb) -+ return TRUE; - if (buf->b_start_fenc == NULL) - return (*buf->b_p_fenc != NUL); - return (STRCMP(buf->b_start_fenc, buf->b_p_fenc) != 0); -*** ../vim-7.1.065/src/structs.h Thu Jul 26 22:55:11 2007 ---- src/structs.h Sat Aug 11 16:56:57 2007 -*************** -*** 1453,1458 **** ---- 1453,1459 ---- - #ifdef FEAT_MBYTE - char_u *b_start_fenc; /* 'fileencoding' when edit started or NULL */ - int b_bad_char; /* "++bad=" argument when edit started or 0 */ -+ int b_start_bomb; /* 'bomb' when it was read */ - #endif - - #ifdef FEAT_EVAL -*** ../vim-7.1.065/src/version.c Sun Aug 12 15:24:05 2007 ---- src/version.c Sun Aug 12 15:48:34 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 66, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -127. You bring your laptop and cellular phone to church. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.067 b/7.1.067 deleted file mode 100644 index 6da49e3f..00000000 --- a/7.1.067 +++ /dev/null @@ -1,302 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.067 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.067 -Problem: 'thesaurus' doesn't work when 'infercase' is set. (Mohsin) -Solution: Don't copy the characters being completed but check the case and - apply it to the suggested word. Also fix that the first word in - the thesaurus line is not used. (Martin Toft) -Files: src/edit.c - - -*** ../vim-7.1.066/src/edit.c Sun Jul 29 15:02:34 2007 ---- src/edit.c Sat Aug 11 17:16:51 2007 -*************** -*** 2057,2063 **** - * case of the originally typed text is used, and the case of the completed - * text is inferred, ie this tries to work out what case you probably wanted - * the rest of the word to be in -- webb -- * TODO: make this work for multi-byte characters. - */ - int - ins_compl_add_infercase(str, len, icase, fname, dir, flags) ---- 2057,2062 ---- -*************** -*** 2068,2121 **** - int dir; - int flags; - { - int has_lower = FALSE; - int was_letter = FALSE; -- int idx; - -! if (p_ic && curbuf->b_p_inf && len < IOSIZE) - { -! /* Infer case of completed part -- webb */ -! /* Use IObuff, str would change text in buffer! */ -! vim_strncpy(IObuff, str, len); - -! /* Rule 1: Were any chars converted to lower? */ -! for (idx = 0; idx < compl_length; ++idx) - { -! if (islower(compl_orig_text[idx])) - { -! has_lower = TRUE; -! if (isupper(IObuff[idx])) -! { -! /* Rule 1 is satisfied */ -! for (idx = compl_length; idx < len; ++idx) -! IObuff[idx] = TOLOWER_LOC(IObuff[idx]); -! break; -! } - } - } - -! /* -! * Rule 2: No lower case, 2nd consecutive letter converted to -! * upper case. -! */ -! if (!has_lower) - { -! for (idx = 0; idx < compl_length; ++idx) - { -! if (was_letter && isupper(compl_orig_text[idx]) -! && islower(IObuff[idx])) - { -! /* Rule 2 is satisfied */ -! for (idx = compl_length; idx < len; ++idx) -! IObuff[idx] = TOUPPER_LOC(IObuff[idx]); -! break; - } -- was_letter = isalpha(compl_orig_text[idx]); - } -- } - -! /* Copy the original case of the part we typed */ -! STRNCPY(IObuff, compl_orig_text, compl_length); - - return ins_compl_add(IObuff, len, icase, fname, NULL, dir, - flags, FALSE); ---- 2067,2213 ---- - int dir; - int flags; - { -+ char_u *p; -+ int i, c; -+ int actual_len; /* Take multi-byte characters */ -+ int actual_compl_length; /* into account. */ -+ int *wca; /* Wide character array. */ - int has_lower = FALSE; - int was_letter = FALSE; - -! if (p_ic && curbuf->b_p_inf) - { -! /* Infer case of completed part. */ - -! /* Find actual length of completion. */ -! #ifdef FEAT_MBYTE -! if (has_mbyte) - { -! p = str; -! actual_len = 0; -! while (*p != NUL) - { -! mb_ptr_adv(p); -! ++actual_len; - } - } -+ else -+ #endif -+ actual_len = len; - -! /* Find actual length of original text. */ -! #ifdef FEAT_MBYTE -! if (has_mbyte) - { -! p = compl_orig_text; -! actual_compl_length = 0; -! while (*p != NUL) - { -! mb_ptr_adv(p); -! ++actual_compl_length; -! } -! } -! else -! #endif -! actual_compl_length = compl_length; -! -! /* Allocate wide character array for the completion and fill it. */ -! wca = (int *)alloc(actual_len * sizeof(int)); -! if (wca != NULL) -! { -! p = str; -! for (i = 0; i < actual_len; ++i) -! #ifdef FEAT_MBYTE -! if (has_mbyte) -! wca[i] = mb_ptr2char_adv(&p); -! else -! #endif -! wca[i] = *(p++); -! -! /* Rule 1: Were any chars converted to lower? */ -! p = compl_orig_text; -! for (i = 0; i < actual_compl_length; ++i) -! { -! #ifdef FEAT_MBYTE -! if (has_mbyte) -! c = mb_ptr2char_adv(&p); -! else -! #endif -! c = *(p++); -! if (MB_ISLOWER(c)) - { -! has_lower = TRUE; -! if (MB_ISUPPER(wca[i])) -! { -! /* Rule 1 is satisfied. */ -! for (i = actual_compl_length; i < actual_len; ++i) -! wca[i] = MB_TOLOWER(wca[i]); -! break; -! } - } - } - -! /* -! * Rule 2: No lower case, 2nd consecutive letter converted to -! * upper case. -! */ -! if (!has_lower) -! { -! p = compl_orig_text; -! for (i = 0; i < actual_compl_length; ++i) -! { -! #ifdef FEAT_MBYTE -! if (has_mbyte) -! c = mb_ptr2char_adv(&p); -! else -! #endif -! c = *(p++); -! if (was_letter && MB_ISUPPER(c) && MB_ISLOWER(wca[i])) -! { -! /* Rule 2 is satisfied. */ -! for (i = actual_compl_length; i < actual_len; ++i) -! wca[i] = MB_TOUPPER(wca[i]); -! break; -! } -! was_letter = MB_ISLOWER(c) || MB_ISUPPER(c); -! } -! } -! -! /* Copy the original case of the part we typed. */ -! p = compl_orig_text; -! for (i = 0; i < actual_compl_length; ++i) -! { -! #ifdef FEAT_MBYTE -! if (has_mbyte) -! c = mb_ptr2char_adv(&p); -! else -! #endif -! c = *(p++); -! if (MB_ISLOWER(c)) -! wca[i] = MB_TOLOWER(wca[i]); -! else if (MB_ISUPPER(c)) -! wca[i] = MB_TOUPPER(wca[i]); -! } -! -! /* -! * Generate encoding specific output from wide character array. -! * Multi-byte characters can occupy up to five bytes more than -! * ASCII characters, and we also need one byte for NUL, so stay -! * six bytes away from the edge of IObuff. -! */ -! p = IObuff; -! i = 0; -! while (i < actual_len && (p - IObuff + 6) < IOSIZE) -! #ifdef FEAT_MBYTE -! if (has_mbyte) -! p += mb_char2bytes(wca[i++], p); -! else -! #endif -! *(p++) = wca[i++]; -! *p = NUL; -! -! vim_free(wca); -! } - - return ins_compl_add(IObuff, len, icase, fname, NULL, dir, - flags, FALSE); -*************** -*** 2842,2847 **** ---- 2934,2940 ---- - /* - * Add the other matches on the line - */ -+ ptr = buf; - while (!got_int) - { - /* Find start of the next word. Skip white -*************** -*** 2851,2857 **** - break; - wstart = ptr; - -! /* Find end of the word and add it. */ - #ifdef FEAT_MBYTE - if (has_mbyte) - /* Japanese words may have characters in ---- 2944,2950 ---- - break; - wstart = ptr; - -! /* Find end of the word. */ - #ifdef FEAT_MBYTE - if (has_mbyte) - /* Japanese words may have characters in -*************** -*** 2868,2876 **** - else - #endif - ptr = find_word_end(ptr); -! add_r = ins_compl_add_infercase(wstart, -! (int)(ptr - wstart), -! p_ic, files[i], *dir, 0); - } - } - if (add_r == OK) ---- 2961,2972 ---- - else - #endif - ptr = find_word_end(ptr); -! -! /* Add the word. Skip the regexp match. */ -! if (wstart != regmatch->startp[0]) -! add_r = ins_compl_add_infercase(wstart, -! (int)(ptr - wstart), -! p_ic, files[i], *dir, 0); - } - } - if (add_r == OK) -*** ../vim-7.1.066/src/version.c Sun Aug 12 15:50:26 2007 ---- src/version.c Sun Aug 12 16:36:34 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 67, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -128. You can access the Net -- via your portable and cellular phone. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.068 b/7.1.068 deleted file mode 100644 index 5f0d6851..00000000 --- a/7.1.068 +++ /dev/null @@ -1,206 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.068 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.068 -Problem: When 'equalalways' is set and splitting a window, it's possible - that another small window gets bigger. -Solution: Only equalize window sizes when after a split the windows are - smaller than another window. (Martin Toft) -Files: runtime/doc/options.txt, runtime/doc/windows.txt, src/window.c - - -*** ../vim-7.1.067/runtime/doc/options.txt Sat May 12 16:27:04 2007 ---- runtime/doc/options.txt Sat Aug 11 17:25:38 2007 -*************** -*** 1,4 **** -! *options.txt* For Vim version 7.1. Last change: 2007 May 11 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *options.txt* For Vim version 7.1. Last change: 2007 Aug 10 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 2415,2422 **** - When mixing vertically and horizontally split windows, a minimal size - is computed and some windows may be larger if there is room. The - 'eadirection' option tells in which direction the size is affected. -! Changing the height of a window can be avoided by setting -! 'winfixheight'. - - *'equalprg'* *'ep'* - 'equalprg' 'ep' string (default "") ---- 2418,2425 ---- - When mixing vertically and horizontally split windows, a minimal size - is computed and some windows may be larger if there is room. The - 'eadirection' option tells in which direction the size is affected. -! Changing the height and width of a window can be avoided by setting -! 'winfixheight' and 'winfixwidth', respectively. - - *'equalprg'* *'ep'* - 'equalprg' 'ep' string (default "") -*** ../vim-7.1.067/runtime/doc/windows.txt Sat May 12 16:42:48 2007 ---- runtime/doc/windows.txt Sat Aug 11 17:25:38 2007 -*************** -*** 132,138 **** - the same file. Make new window N high (default is to use half - the height of the current window). Reduces the current window - height to create room (and others, if the 'equalalways' option -! is set and 'eadirection' isn't "hor"). - Note: CTRL-S does not work on all terminals and might block - further input, use CTRL-Q to get going again. - Also see |++opt| and |+cmd|. ---- 132,139 ---- - the same file. Make new window N high (default is to use half - the height of the current window). Reduces the current window - height to create room (and others, if the 'equalalways' option -! is set, 'eadirection' isn't "hor", and one of them is higher -! than the current or the new window). - Note: CTRL-S does not work on all terminals and might block - further input, use CTRL-Q to get going again. - Also see |++opt| and |+cmd|. -*************** -*** 140,148 **** - CTRL-W CTRL-V *CTRL-W_CTRL-V* - CTRL-W v *CTRL-W_v* - :[N]vs[plit] [++opt] [+cmd] [file] *:vs* *:vsplit* -! Like |:split|, but split vertically. If 'equalalways' is set -! and 'eadirection' isn't "ver" the windows will be spread out -! horizontally, unless a width was specified. - Note: In other places CTRL-Q does the same as CTRL-V, but here - it doesn't! - ---- 141,153 ---- - CTRL-W CTRL-V *CTRL-W_CTRL-V* - CTRL-W v *CTRL-W_v* - :[N]vs[plit] [++opt] [+cmd] [file] *:vs* *:vsplit* -! Like |:split|, but split vertically. The windows will be -! spread out horizontally if -! 1. a width was not specified, -! 2. 'equalalways' is set, -! 3. 'eadirection' isn't "ver", and -! 4. one of the other windows are wider than the current or new -! window. - Note: In other places CTRL-Q does the same as CTRL-V, but here - it doesn't! - -*** ../vim-7.1.067/src/window.c Sat Aug 11 13:37:36 2007 ---- src/window.c Sat Aug 11 17:25:38 2007 -*************** -*** 733,739 **** - if (flags & WSP_VERT) - { - layout = FR_ROW; -- do_equal = (p_ea && new_size == 0 && *p_ead != 'v'); - - /* - * Check if we are able to split the current window and compute its ---- 733,738 ---- -*************** -*** 770,785 **** - * instead, if possible. */ - if (oldwin->w_p_wfw) - win_setwidth_win(oldwin->w_width + new_size, oldwin); - } - else - #endif - { - layout = FR_COL; -- do_equal = (p_ea && new_size == 0 -- #ifdef FEAT_VERTSPLIT -- && *p_ead != 'h' -- #endif -- ); - - /* - * Check if we are able to split the current window and compute its ---- 769,799 ---- - * instead, if possible. */ - if (oldwin->w_p_wfw) - win_setwidth_win(oldwin->w_width + new_size, oldwin); -+ -+ /* Only make all windows the same width if one of them (except oldwin) -+ * is wider than one of the split windows. */ -+ if (!do_equal && p_ea && size == 0 && *p_ead != 'v' -+ && oldwin->w_frame->fr_parent != NULL) -+ { -+ frp = oldwin->w_frame->fr_parent->fr_child; -+ while (frp != NULL) -+ { -+ if (frp->fr_win != oldwin && frp->fr_win != NULL -+ && (frp->fr_win->w_width > new_size -+ || frp->fr_win->w_width > oldwin->w_width -+ - new_size - STATUS_HEIGHT)) -+ { -+ do_equal = TRUE; -+ break; -+ } -+ frp = frp->fr_next; -+ } -+ } - } - else - #endif - { - layout = FR_COL; - - /* - * Check if we are able to split the current window and compute its -*************** -*** 831,836 **** ---- 845,873 ---- - oldwin_height = oldwin->w_height; - if (need_status) - oldwin_height -= STATUS_HEIGHT; -+ } -+ -+ /* Only make all windows the same height if one of them (except oldwin) -+ * is higher than one of the split windows. */ -+ if (!do_equal && p_ea && size == 0 -+ #ifdef FEAT_VERTSPLIT -+ && *p_ead != 'h' -+ #endif -+ && oldwin->w_frame->fr_parent != NULL) -+ { -+ frp = oldwin->w_frame->fr_parent->fr_child; -+ while (frp != NULL) -+ { -+ if (frp->fr_win != oldwin && frp->fr_win != NULL -+ && (frp->fr_win->w_height > new_size -+ || frp->fr_win->w_height > oldwin_height - new_size -+ - STATUS_HEIGHT)) -+ { -+ do_equal = TRUE; -+ break; -+ } -+ frp = frp->fr_next; -+ } - } - } - -*** ../vim-7.1.067/src/version.c Sun Aug 12 16:38:03 2007 ---- src/version.c Sun Aug 12 16:51:36 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 68, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -129. You cancel your newspaper subscription. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.069 b/7.1.069 deleted file mode 100644 index 9de0d5be..00000000 --- a/7.1.069 +++ /dev/null @@ -1,82 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.069 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.069 -Problem: GTK GUI: When using confirm() without a default button there still - is a default choice. -Solution: Ignore Enter and Space when there is no default button. (Chris - Lubinski) -Files: src/gui_gtk.c - - -*** ../vim-7.1.068/src/gui_gtk.c Mon May 14 19:35:51 2007 ---- src/gui_gtk.c Sat Aug 11 17:38:03 2007 -*************** -*** 1630,1640 **** - */ - /*ARGSUSED*/ - static int -! dlg_key_press_event(GtkWidget * widget, GdkEventKey * event, CancelData *data) - { -! /* Ignore hitting Enter when there is no default button. */ -! if (data->ignore_enter && event->keyval == GDK_Return) - return TRUE; - - if (event->keyval != GDK_Escape && event->keyval != GDK_Return) - return FALSE; ---- 1630,1643 ---- - */ - /*ARGSUSED*/ - static int -! dlg_key_press_event(GtkWidget *widget, GdkEventKey *event, CancelData *data) - { -! /* Ignore hitting Enter (or Space) when there is no default button. */ -! if (data->ignore_enter && (event->keyval == GDK_Return -! || event->keyval == ' ')) - return TRUE; -+ else /* A different key was pressed, return to normal behavior */ -+ data->ignore_enter = FALSE; - - if (event->keyval != GDK_Escape && event->keyval != GDK_Return) - return FALSE; -*************** -*** 2223,2228 **** ---- 2226,2238 ---- - dialog_key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) - { - DialogInfo *di = (DialogInfo *)data; -+ -+ /* Ignore hitting Enter (or Space) when there is no default button. */ -+ if (di->ignore_enter && (event->keyval == GDK_Return -+ || event->keyval == ' ')) -+ return TRUE; -+ else /* A different key was pressed, return to normal behavior */ -+ di->ignore_enter = FALSE; - - /* Close the dialog when hitting "Esc". */ - if (event->keyval == GDK_Escape) -*** ../vim-7.1.068/src/version.c Sun Aug 12 16:55:01 2007 ---- src/version.c Tue Aug 14 14:58:36 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 69, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -148. You find it easier to dial-up the National Weather Service - Weather/your_town/now.html than to simply look out the window. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.070 b/7.1.070 deleted file mode 100644 index 4658c0ca..00000000 --- a/7.1.070 +++ /dev/null @@ -1,49 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.070 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.070 (extra) -Problem: Win32 GUI: When using confirm() without a default button there - still is a default choice. -Solution: Set focus on something else than a button. (Chris Lubinski) -Files: src/gui_w32.c - - -*** ../vim-7.1.069/src/gui_w32.c Tue Jun 19 10:09:15 2007 ---- src/gui_w32.c Sat Aug 11 17:39:50 2007 -*************** -*** 2894,2899 **** ---- 2894,2903 ---- - (void)SetFocus(hwnd); - if (dialog_default_button > IDCANCEL) - (void)SetFocus(GetDlgItem(hwnd, dialog_default_button)); -+ else -+ /* We don't have a default, set focus on another element of the -+ * dialog window, probably the icon */ -+ (void)SetFocus(GetDlgItem(hwnd, DLG_NONBUTTON_CONTROL)); - return FALSE; - } - -*** ../vim-7.1.069/src/version.c Tue Aug 14 14:59:41 2007 ---- src/version.c Tue Aug 14 16:55:41 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 70, - /**/ - --- -You are not really successful until someone claims he sat -beside you in school. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.071 b/7.1.071 deleted file mode 100644 index d7f3e86c..00000000 --- a/7.1.071 +++ /dev/null @@ -1,169 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.071 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.071 (after 7.1.040) -Problem: Regexp patterns are not tested. -Solution: Add a basic test, to be expanded later. - Also add (commented-out) support for valgrind. -Files: src/testdir/Makefile, src/testdir/test64.in, src/testdir/test64.ok - - -*** ../vim-7.1.070/src/testdir/Makefile Thu Jul 26 22:55:11 2007 ---- src/testdir/Makefile Tue Aug 14 15:16:08 2007 -*************** -*** 4,9 **** ---- 4,13 ---- - - VIMPROG = ../vim - -+ # Uncomment this line for using valgrind. -+ # The output goes into a file "valgrind.$PID" (sorry, no test number). -+ # VALGRIND = valgrind --tool=memcheck --num-callers=15 --logfile=valgrind -+ - SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \ - test7.out test8.out test9.out test10.out test11.out \ - test12.out test13.out test14.out test15.out test17.out \ -*************** -*** 15,21 **** - test43.out test44.out test45.out test46.out test47.out \ - test48.out test49.out test51.out test52.out test53.out \ - test54.out test55.out test56.out test57.out test58.out \ -! test59.out test60.out test61.out test62.out test63.out - - SCRIPTS_GUI = test16.out - ---- 19,26 ---- - test43.out test44.out test45.out test46.out test47.out \ - test48.out test49.out test51.out test52.out test53.out \ - test54.out test55.out test56.out test57.out test58.out \ -! test59.out test60.out test61.out test62.out test63.out \ -! test64.out - - SCRIPTS_GUI = test16.out - -*************** -*** 38,44 **** - - test1.out: test1.in - -rm -f $*.failed tiny.vim small.vim mbyte.vim test.ok X* viminfo -! $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in $*.in - @/bin/sh -c "if diff test.out $*.ok; \ - then mv -f test.out $*.out; \ - else echo; \ ---- 43,49 ---- - - test1.out: test1.in - -rm -f $*.failed tiny.vim small.vim mbyte.vim test.ok X* viminfo -! $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in $*.in - @/bin/sh -c "if diff test.out $*.ok; \ - then mv -f test.out $*.out; \ - else echo; \ -*************** -*** 51,57 **** - cp $*.ok test.ok - # Sleep a moment to avoid that the xterm title is messed up - @-sleep .2 -! -$(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in $*.in - @/bin/sh -c "if test -f test.out; then\ - if diff test.out $*.ok; \ - then mv -f test.out $*.out; \ ---- 56,62 ---- - cp $*.ok test.ok - # Sleep a moment to avoid that the xterm title is messed up - @-sleep .2 -! -$(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in $*.in - @/bin/sh -c "if test -f test.out; then\ - if diff test.out $*.ok; \ - then mv -f test.out $*.out; \ -*** ../vim-7.1.070/src/testdir/test64.in Tue Aug 14 17:26:28 2007 ---- src/testdir/test64.in Tue Aug 14 16:03:44 2007 -*************** -*** 0 **** ---- 1,52 ---- -+ Test for regexp patterns. -+ -+ A pattern that gives the expected result produces OK, so that we know it was -+ actually tried. -+ -+ STARTTEST -+ :so small.vim -+ :" tl is a List of Lists with: -+ :" regexp pattern -+ :" text to test the pattern on -+ :" expected match (optional) -+ :" expected submatch 1 (optional) -+ :" expected submatch 2 (optional) -+ :" etc. -+ :" When there is no match use only the first two items. -+ :let tl = [] -+ :call add(tl, ['b', 'abcdef', 'b']) -+ :call add(tl, ['bc*', 'abccccdef', 'bcccc']) -+ :call add(tl, ['bc\{-}', 'abccccdef', 'b']) -+ :call add(tl, ['bc\{-}\(d\)', 'abccccdef', 'bccccd', 'd']) -+ :call add(tl, ['x', 'abcdef']) -+ :" -+ :for t in tl -+ : let l = matchlist(t[1], t[0]) -+ :" check the match itself -+ : if len(l) == 0 && len(t) > 2 -+ : $put ='ERROR: pat: \"' . t[0] . '\", text: \"' . t[1] . '\", did not match, expected: \"' . t[2] . '\"' -+ : elseif len(l) > 0 && len(t) == 2 -+ : $put ='ERROR: pat: \"' . t[0] . '\", text: \"' . t[1] . '\", match: \"' . l[0] . '\", expected no match' -+ : elseif len(t) > 2 && l[0] != t[2] -+ : $put ='ERROR: pat: \"' . t[0] . '\", text: \"' . t[1] . '\", match: \"' . l[0] . '\", expected: \"' . t[2] . '\"' -+ : else -+ : $put ='OK' -+ : endif -+ : if len(l) > 0 -+ :" check all the nine submatches -+ : for i in range(1, 9) -+ : if len(t) <= i + 2 -+ : let e = '' -+ : else -+ : let e = t[i + 2] -+ : endif -+ : if l[i] != e -+ : $put ='ERROR: pat: \"' . t[0] . '\", text: \"' . t[1] . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"' -+ : endif -+ : endfor -+ : endif -+ :endfor -+ :/^Results/,$wq! test.out -+ ENDTEST -+ -+ Results of test64: -*** ../vim-7.1.070/src/testdir/test64.ok Tue Aug 14 17:26:28 2007 ---- src/testdir/test64.ok Tue Aug 14 16:01:47 2007 -*************** -*** 0 **** ---- 1,6 ---- -+ Results of test64: -+ OK -+ OK -+ OK -+ OK -+ OK -*** ../vim-7.1.070/src/version.c Tue Aug 14 16:57:04 2007 ---- src/version.c Tue Aug 14 17:25:20 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 71, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -150. You find yourself counting emoticons to get to sleep. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.072 b/7.1.072 deleted file mode 100644 index f909adcc..00000000 --- a/7.1.072 +++ /dev/null @@ -1,177 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.072 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.072 (extra, after 7.1.041 and 7.1.071) -Problem: Some changes for patch 7.1.071 are in extra files. -Solution: Update the extra files. Also fix a few warnings from the DOS test - makefile. -Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak, - src/testdir/Make_os2.mak, src/testdir/Make_vms.mms - - -*** ../vim-7.1.071/src/testdir/Make_amiga.mak Thu Jul 26 23:10:50 2007 ---- src/testdir/Make_amiga.mak Tue Aug 14 15:14:03 2007 -*************** -*** 25,31 **** - test43.out test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out test63.out - - .SUFFIXES: .in .out - ---- 25,31 ---- - test43.out test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out test63.out test64.out - - .SUFFIXES: .in .out - -*************** -*** 108,110 **** ---- 108,111 ---- - test61.out: test61.in - test62.out: test62.in - test63.out: test63.in -+ test64.out: test64.in -*** ../vim-7.1.071/src/testdir/Make_dos.mak Thu Jul 26 23:10:50 2007 ---- src/testdir/Make_dos.mak Tue Aug 14 15:14:25 2007 -*************** -*** 19,25 **** - test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out \ - test55.out test56.out test57.out test58.out test59.out \ -! test60.out test61.out test62.out test63.out - - SCRIPTS = test3.out test4.out test5.out test6.out test7.out \ - test8.out test9.out test11.out test13.out test14.out \ ---- 19,25 ---- - test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out \ - test55.out test56.out test57.out test58.out test59.out \ -! test60.out test61.out test62.out test63.out test64.out - - SCRIPTS = test3.out test4.out test5.out test6.out test7.out \ - test8.out test9.out test11.out test13.out test14.out \ -*************** -*** 51,69 **** - - clean: - -del *.out -! -del test.ok -! -del small.vim -! -del tiny.vim -! -del mbyte.vim - -del X* -! -del viminfo - - .in.out: - copy $*.ok test.ok - $(VIMPROG) -u dos.vim -U NONE --noplugin -s dotest.in $*.in - diff test.out $*.ok -! -del $*.out - rename test.out $*.out - -del X* - -del test.ok -! -del viminfo ---- 51,69 ---- - - clean: - -del *.out -! -if exist test.ok del test.ok -! -if exist small.vim del small.vim -! -if exist tiny.vim del tiny.vim -! -if exist mbyte.vim del mbyte.vim - -del X* -! -if exist viminfo del viminfo - - .in.out: - copy $*.ok test.ok - $(VIMPROG) -u dos.vim -U NONE --noplugin -s dotest.in $*.in - diff test.out $*.ok -! -if exist $*.out del $*.out - rename test.out $*.out - -del X* - -del test.ok -! -if exist viminfo del viminfo -*** ../vim-7.1.071/src/testdir/Make_os2.mak Thu Jul 26 23:10:50 2007 ---- src/testdir/Make_os2.mak Tue Aug 14 15:14:44 2007 -*************** -*** 25,31 **** - test43.out test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out test63.out - - .SUFFIXES: .in .out - ---- 25,31 ---- - test43.out test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out test63.out test64.out - - .SUFFIXES: .in .out - -*** ../vim-7.1.071/src/testdir/Make_vms.mms Thu Jul 26 23:10:50 2007 ---- src/testdir/Make_vms.mms Tue Aug 14 15:15:56 2007 -*************** -*** 4,10 **** - # Authors: Zoltan Arpadffy, - # Sandor Kopanyi, - # -! # Last change: 2007 Jul 24 - # - # This has been tested on VMS 6.2 to 7.2 on DEC Alpha and VAX. - # Edit the lines in the Configuration section below to select. ---- 4,10 ---- - # Authors: Zoltan Arpadffy, - # Sandor Kopanyi, - # -! # Last change: 2007 Aug 14 - # - # This has been tested on VMS 6.2 to 7.2 on DEC Alpha and VAX. - # Edit the lines in the Configuration section below to select. -*************** -*** 59,65 **** - test43.out test44.out test45.out test46.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out test63.out - - .IFDEF WANT_GUI - SCRIPT_GUI = test16.out ---- 59,65 ---- - test43.out test44.out test45.out test46.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -! test61.out test62.out test63.out test64.out - - .IFDEF WANT_GUI - SCRIPT_GUI = test16.out -*** ../vim-7.1.071/src/version.c Tue Aug 14 17:28:14 2007 ---- src/version.c Tue Aug 14 17:51:21 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 72, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -152. You find yourself falling for someone you've never seen or hardly - know, but, boy can he/she TYPE!!!!!! - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.073 b/7.1.073 deleted file mode 100644 index ff9a0168..00000000 --- a/7.1.073 +++ /dev/null @@ -1,113 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.073 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.073 (after 7.1.062) -Problem: Wrong cursor position and crash when 'preserveindent' is set. - (Charles Campbell) -Solution: Handle the situation that we start without indent. (Chris - Lubinski) -Files: src/misc1.c - - -*** ../vim-7.1.072/src/misc1.c Sat Aug 11 14:32:10 2007 ---- src/misc1.c Tue Aug 14 21:21:49 2007 -*************** -*** 104,110 **** - int ind_done = 0; /* measured in spaces */ - int tab_pad; - int retval = FALSE; -! int orig_char_len = 0; /* number of initial whitespace chars when - 'et' and 'pi' are both set */ - - /* ---- 104,110 ---- - int ind_done = 0; /* measured in spaces */ - int tab_pad; - int retval = FALSE; -! int orig_char_len = -1; /* number of initial whitespace chars when - 'et' and 'pi' are both set */ - - /* -*************** -*** 159,165 **** - - /* Fill to next tabstop with a tab, if possible */ - tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts); -! if (todo >= tab_pad && orig_char_len == 0) - { - doit = TRUE; - todo -= tab_pad; ---- 159,165 ---- - - /* Fill to next tabstop with a tab, if possible */ - tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts); -! if (todo >= tab_pad && orig_char_len == -1) - { - doit = TRUE; - todo -= tab_pad; -*************** -*** 206,216 **** - /* If 'preserveindent' and 'expandtab' are both set keep the original - * characters and allocate accordingly. We will fill the rest with spaces - * after the if (!curbuf->b_p_et) below. */ -! if (orig_char_len != 0) - { - newline = alloc(orig_char_len + size - ind_done + line_len); - if (newline == NULL) - return FALSE; - p = oldline; - s = newline; - while (orig_char_len > 0) ---- 206,220 ---- - /* If 'preserveindent' and 'expandtab' are both set keep the original - * characters and allocate accordingly. We will fill the rest with spaces - * after the if (!curbuf->b_p_et) below. */ -! if (orig_char_len != -1) - { - newline = alloc(orig_char_len + size - ind_done + line_len); - if (newline == NULL) - return FALSE; -+ todo = size - ind_done; -+ ind_len = orig_char_len + todo; /* Set total length of indent in -+ * characters, which may have been -+ * undercounted until now */ - p = oldline; - s = newline; - while (orig_char_len > 0) -*************** -*** 222,230 **** - * than old) */ - while (vim_iswhite(*p)) - (void)*p++; -- todo = size - ind_done; -- ind_len += todo; /* Set total length of indent in characters, -- * which may have been undercounted until now */ - - } - else ---- 226,231 ---- -*** ../vim-7.1.072/src/version.c Tue Aug 14 17:54:37 2007 ---- src/version.c Tue Aug 14 22:14:54 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 73, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -157. You fum through a magazine, you first check to see if it has a web - address. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.074 b/7.1.074 deleted file mode 100644 index 0911f4e1..00000000 --- a/7.1.074 +++ /dev/null @@ -1,171 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.074 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.074 -Problem: Crash when calling string() on a recurively nested List. -Solution: Check result value for being NULL. (Yukihiro Nakadaira) -Files: src/eval.c - - -*** ../vim-7.1.073/src/eval.c Mon Aug 6 22:27:12 2007 ---- src/eval.c Tue Aug 14 22:01:12 2007 -*************** -*** 6802,6808 **** - * "numbuf" is used for a number. - * Does not put quotes around strings, as ":echo" displays values. - * When "copyID" is not NULL replace recursive lists and dicts with "...". -! * May return NULL; - */ - static char_u * - echo_string(tv, tofree, numbuf, copyID) ---- 6802,6808 ---- - * "numbuf" is used for a number. - * Does not put quotes around strings, as ":echo" displays values. - * When "copyID" is not NULL replace recursive lists and dicts with "...". -! * May return NULL. - */ - static char_u * - echo_string(tv, tofree, numbuf, copyID) -*************** -*** 6887,6893 **** - * If the memory is allocated "tofree" is set to it, otherwise NULL. - * "numbuf" is used for a number. - * Puts quotes around strings, so that they can be parsed back by eval(). -! * May return NULL; - */ - static char_u * - tv2string(tv, tofree, numbuf, copyID) ---- 6887,6893 ---- - * If the memory is allocated "tofree" is set to it, otherwise NULL. - * "numbuf" is used for a number. - * Puts quotes around strings, so that they can be parsed back by eval(). -! * May return NULL. - */ - static char_u * - tv2string(tv, tofree, numbuf, copyID) -*************** -*** 14974,14979 **** ---- 14974,14983 ---- - - p1 = tv2string(&(*(listitem_T **)s1)->li_tv, &tofree1, numbuf1, 0); - p2 = tv2string(&(*(listitem_T **)s2)->li_tv, &tofree2, numbuf2, 0); -+ if (p1 == NULL) -+ p1 = (char_u *)""; -+ if (p2 == NULL) -+ p2 = (char_u *)""; - if (item_compare_ic) - res = STRICMP(p1, p2); - else -*************** -*** 15463,15469 **** - - rettv->v_type = VAR_STRING; - rettv->vval.v_string = tv2string(&argvars[0], &tofree, numbuf, 0); -! if (tofree == NULL) - rettv->vval.v_string = vim_strsave(rettv->vval.v_string); - } - ---- 15467,15474 ---- - - rettv->v_type = VAR_STRING; - rettv->vval.v_string = tv2string(&argvars[0], &tofree, numbuf, 0); -! /* Make a copy if we have a value but it's not in allocate memory. */ -! if (rettv->vval.v_string != NULL && tofree == NULL) - rettv->vval.v_string = vim_strsave(rettv->vval.v_string); - } - -*************** -*** 20167,20172 **** ---- 20174,20180 ---- - char_u buf[MSG_BUF_LEN]; - char_u numbuf2[NUMBUFLEN]; - char_u *tofree; -+ char_u *s; - - msg_puts((char_u *)"("); - for (i = 0; i < argcount; ++i) -*************** -*** 20177,20186 **** - msg_outnum((long)argvars[i].vval.v_number); - else - { -! trunc_string(tv2string(&argvars[i], &tofree, -! numbuf2, 0), buf, MSG_BUF_CLEN); -! msg_puts(buf); -! vim_free(tofree); - } - } - msg_puts((char_u *)")"); ---- 20185,20197 ---- - msg_outnum((long)argvars[i].vval.v_number); - else - { -! s = tv2string(&argvars[i], &tofree, numbuf2, 0); -! if (s != NULL) -! { -! trunc_string(s, buf, MSG_BUF_CLEN); -! msg_puts(buf); -! vim_free(tofree); -! } - } - } - msg_puts((char_u *)")"); -*************** -*** 20258,20271 **** - char_u buf[MSG_BUF_LEN]; - char_u numbuf2[NUMBUFLEN]; - char_u *tofree; - - /* The value may be very long. Skip the middle part, so that we - * have some idea how it starts and ends. smsg() would always - * truncate it at the end. */ -! trunc_string(tv2string(fc.rettv, &tofree, numbuf2, 0), -! buf, MSG_BUF_CLEN); -! smsg((char_u *)_("%s returning %s"), sourcing_name, buf); -! vim_free(tofree); - } - msg_puts((char_u *)"\n"); /* don't overwrite this either */ - ---- 20269,20286 ---- - char_u buf[MSG_BUF_LEN]; - char_u numbuf2[NUMBUFLEN]; - char_u *tofree; -+ char_u *s; - - /* The value may be very long. Skip the middle part, so that we - * have some idea how it starts and ends. smsg() would always - * truncate it at the end. */ -! s = tv2string(fc.rettv, &tofree, numbuf2, 0); -! if (s != NULL) -! { -! trunc_string(s, buf, MSG_BUF_CLEN); -! smsg((char_u *)_("%s returning %s"), sourcing_name, buf); -! vim_free(tofree); -! } - } - msg_puts((char_u *)"\n"); /* don't overwrite this either */ - -*** ../vim-7.1.073/src/version.c Tue Aug 14 22:15:53 2007 ---- src/version.c Tue Aug 14 22:27:24 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 74, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -159. You get excited whenever discussing your hard drive. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.075 b/7.1.075 deleted file mode 100644 index 40638e8c..00000000 --- a/7.1.075 +++ /dev/null @@ -1,55 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.075 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.075 -Problem: ":let v:statusmsg" reads memory already freed. -Solution: Don't set v:statusmsg when listing it. -Files: src/eval.c - - -*** ../vim-7.1.074/src/eval.c Tue Aug 14 22:28:35 2007 ---- src/eval.c Tue Aug 14 22:01:12 2007 -*************** -*** 18022,18028 **** - int type; - char_u *string; - { -! msg_attr(prefix, 0); /* don't use msg(), it overwrites "v:statusmsg" */ - if (name != NULL) /* "a:" vars don't have a name stored */ - msg_puts(name); - msg_putchar(' '); ---- 18022,18030 ---- - int type; - char_u *string; - { -! /* don't use msg() or msg_attr() to avoid overwriting "v:statusmsg" */ -! msg_start(); -! msg_puts(prefix); - if (name != NULL) /* "a:" vars don't have a name stored */ - msg_puts(name); - msg_putchar(' '); -*** ../vim-7.1.074/src/version.c Tue Aug 14 22:28:35 2007 ---- src/version.c Tue Aug 14 22:39:49 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 75, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -160. You get in the elevator and double-click the button for the floor - you want. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.076 b/7.1.076 deleted file mode 100644 index 39569552..00000000 --- a/7.1.076 +++ /dev/null @@ -1,74 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.076 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.076 -Problem: Another strcpy() with overlapping arguments. -Solution: Use mch_memmove(). (Dominique Pelle) And another one. -Files: src/ex_docmd.c, src/normal.c - - -*** ../vim-7.1.075/src/ex_docmd.c Sat Aug 11 15:59:44 2007 ---- src/ex_docmd.c Wed Aug 8 22:28:33 2007 -*************** -*** 4493,4499 **** - if (eap->argt & (USECTRLV | XFILE)) - ++p; /* skip CTRL-V and next char */ - else -! STRCPY(p, p + 1); /* remove CTRL-V and skip next char */ - if (*p == NUL) /* stop at NUL after CTRL-V */ - break; - } ---- 4493,4500 ---- - if (eap->argt & (USECTRLV | XFILE)) - ++p; /* skip CTRL-V and next char */ - else -! /* remove CTRL-V and skip next char */ -! mch_memmove(p, p + 1, STRLEN(p)); - if (*p == NUL) /* stop at NUL after CTRL-V */ - break; - } -*** ../vim-7.1.075/src/normal.c Wed Aug 8 21:41:19 2007 ---- src/normal.c Sun Aug 12 17:35:20 2007 -*************** -*** 3760,3766 **** - extra_len = (int)STRLEN(p); - overflow = old_len + extra_len - SHOWCMD_COLS; - if (overflow > 0) -! STRCPY(showcmd_buf, showcmd_buf + overflow); - STRCAT(showcmd_buf, p); - - if (char_avail()) ---- 3760,3767 ---- - extra_len = (int)STRLEN(p); - overflow = old_len + extra_len - SHOWCMD_COLS; - if (overflow > 0) -! mch_memmove(showcmd_buf, showcmd_buf + overflow, -! old_len - overflow + 1); - STRCAT(showcmd_buf, p); - - if (char_avail()) -*** ../vim-7.1.075/src/version.c Tue Aug 14 22:40:13 2007 ---- src/version.c Tue Aug 14 22:53:13 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 76, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -161. You get up before the sun rises to check your e-mail, and you - find yourself in the very same chair long after the sun has set. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.077 b/7.1.077 deleted file mode 100644 index 9cfcfeca..00000000 --- a/7.1.077 +++ /dev/null @@ -1,50 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.077 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.077 -Problem: Using "can_spell" without initializing it. (Dominique Pelle) -Solution: Set a default for get_syntax_attr(). -Files: src/syntax.c - - -*** ../vim-7.1.076/src/syntax.c Thu Jul 26 22:55:11 2007 ---- src/syntax.c Sun Aug 12 19:49:07 2007 -*************** -*** 1727,1732 **** ---- 1727,1739 ---- - { - int attr = 0; - -+ if (can_spell != NULL) -+ /* Default: Only do spelling when there is no @Spell cluster or when -+ * ":syn spell toplevel" was used. */ -+ *can_spell = syn_buf->b_syn_spell == SYNSPL_DEFAULT -+ ? (syn_buf->b_spell_cluster_id == 0) -+ : (syn_buf->b_syn_spell == SYNSPL_TOP); -+ - /* check for out of memory situation */ - if (syn_buf->b_sst_array == NULL) - return 0; -*** ../vim-7.1.076/src/version.c Tue Aug 14 22:54:00 2007 ---- src/version.c Tue Aug 14 23:06:26 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 77, - /**/ - --- -Send $25.00 for handy leaflet on how to make money by selling leaflets - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.078 b/7.1.078 deleted file mode 100644 index 74349a22..00000000 --- a/7.1.078 +++ /dev/null @@ -1,86 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.078 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.078 -Problem: Dropping a file name on gvim that contains a CSI byte doesn't work - when editing the command line. -Solution: Escape the CSI byte when inserting in the input buffer. (Yukihiro - Nakadaira) -Files: src/gui.c, src/ui.c - - -*** ../vim-7.1.077/src/gui.c Thu May 10 19:19:15 2007 ---- src/gui.c Tue Aug 14 12:41:43 2007 -*************** -*** 5117,5123 **** - p = vim_strsave_escaped(fnames[i], (char_u *)"\\ \t\"|"); - # endif - if (p != NULL) -! add_to_input_buf(p, (int)STRLEN(p)); - vim_free(p); - vim_free(fnames[i]); - } ---- 5117,5123 ---- - p = vim_strsave_escaped(fnames[i], (char_u *)"\\ \t\"|"); - # endif - if (p != NULL) -! add_to_input_buf_csi(p, (int)STRLEN(p)); - vim_free(p); - vim_free(fnames[i]); - } -*** ../vim-7.1.077/src/ui.c Thu May 10 21:14:11 2007 ---- src/ui.c Tue Aug 14 12:41:42 2007 -*************** -*** 1603,1610 **** - #if defined(FEAT_GUI) || defined(FEAT_MOUSE_GPM) \ - || defined(FEAT_XCLIPBOARD) || defined(VMS) \ - || defined(FEAT_SNIFF) || defined(FEAT_CLIENTSERVER) \ -- || (defined(FEAT_GUI) && (!defined(USE_ON_FLY_SCROLL) \ -- || defined(FEAT_MENU))) \ - || defined(PROTO) - /* - * Add the given bytes to the input buffer ---- 1603,1608 ---- -*************** -*** 1630,1636 **** - } - #endif - -! #if (defined(FEAT_XIM) && defined(FEAT_GUI_GTK)) \ - || (defined(FEAT_MBYTE) && defined(FEAT_MBYTE_IME)) \ - || (defined(FEAT_GUI) && (!defined(USE_ON_FLY_SCROLL) \ - || defined(FEAT_MENU))) \ ---- 1628,1636 ---- - } - #endif - -! #if ((defined(FEAT_XIM) || defined(FEAT_DND)) && defined(FEAT_GUI_GTK)) \ -! || defined(FEAT_GUI_MSWIN) \ -! || defined(FEAT_GUI_MAC) \ - || (defined(FEAT_MBYTE) && defined(FEAT_MBYTE_IME)) \ - || (defined(FEAT_GUI) && (!defined(USE_ON_FLY_SCROLL) \ - || defined(FEAT_MENU))) \ -*** ../vim-7.1.077/src/version.c Tue Aug 14 23:06:51 2007 ---- src/version.c Wed Aug 15 20:07:06 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 78, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -164. You got out to buy software, instead of going out for a beer. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.079 b/7.1.079 deleted file mode 100644 index 7f2a1fa4..00000000 --- a/7.1.079 +++ /dev/null @@ -1,84 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.079 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.079 -Problem: When the locale is "C" and 'encoding' is "latin1" then the "@" - character in 'isfname', 'isprint', etc. doesn't pick up accented - characters. -Solution: Instead of isalpha() use MB_ISLOWER() and MB_ISUPPER(). -Files: src/charset.c, src/macros.h - - -*** ../vim-7.1.078/src/charset.c Mon Aug 6 22:27:12 2007 ---- src/charset.c Tue Aug 14 13:43:30 2007 -*************** -*** 207,213 **** - } - while (c <= c2) - { -! if (!do_isalpha || isalpha(c) - #ifdef FEAT_FKMAP - || (p_altkeymap && (F_isalpha(c) || F_isdigit(c))) - #endif ---- 207,216 ---- - } - while (c <= c2) - { -! /* Use the MB_ functions here, because isalpha() doesn't -! * work properly when 'encoding' is "latin1" and the locale is -! * "C". */ -! if (!do_isalpha || MB_ISLOWER(c) || MB_ISUPPER(c) - #ifdef FEAT_FKMAP - || (p_altkeymap && (F_isalpha(c) || F_isdigit(c))) - #endif -*** ../vim-7.1.078/src/macros.h Thu May 10 19:21:00 2007 ---- src/macros.h Sat Aug 4 13:44:18 2007 -*************** -*** 54,63 **** - - /* - * toupper() and tolower() that use the current locale. -! * On some systems toupper()/tolower() only work on lower/uppercase characters - * Careful: Only call TOUPPER_LOC() and TOLOWER_LOC() with a character in the - * range 0 - 255. toupper()/tolower() on some systems can't handle others. -! * Note: for UTF-8 use utf_toupper() and utf_tolower(). - */ - #ifdef MSWIN - # define TOUPPER_LOC(c) toupper_tab[(c) & 255] ---- 54,65 ---- - - /* - * toupper() and tolower() that use the current locale. -! * On some systems toupper()/tolower() only work on lower/uppercase -! * characters, first use islower() or isupper() then. - * Careful: Only call TOUPPER_LOC() and TOLOWER_LOC() with a character in the - * range 0 - 255. toupper()/tolower() on some systems can't handle others. -! * Note: It is often better to use MB_TOLOWER() and MB_TOUPPER(), because many -! * toupper() and tolower() implementations only work for ASCII. - */ - #ifdef MSWIN - # define TOUPPER_LOC(c) toupper_tab[(c) & 255] -*** ../vim-7.1.078/src/version.c Wed Aug 15 20:07:53 2007 ---- src/version.c Wed Aug 15 20:39:18 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 79, - /**/ - --- -You're as much use as a condom machine at the Vatican. - -- Rimmer to Holly in Red Dwarf 'Queeg' - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.080 b/7.1.080 deleted file mode 100644 index 446ffc7d..00000000 --- a/7.1.080 +++ /dev/null @@ -1,104 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.080 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.080 (extra) -Problem: Compiler warnings for using "const char *" for "char *". -Solution: Add type casts. (Chris Sutcliffe) -Files: src/GvimExt/gvimext.cpp - - -*** ../vim-7.1.079/src/GvimExt/gvimext.cpp Thu May 10 21:09:38 2007 ---- src/GvimExt/gvimext.cpp Thu Aug 16 21:25:56 2007 -*************** -*** 69,82 **** - - // Registry didn't work, use the search path. - if (name[0] == 0) -! strcpy(name, searchpath("gvim.exe")); - - if (!runtime) - { - // Only when looking for the executable, not the runtime dir, we can - // search for the batch file or a name without a path. - if (name[0] == 0) -! strcpy(name, searchpath("gvim.bat")); - if (name[0] == 0) - strcpy(name, "gvim"); // finds gvim.bat or gvim.exe - ---- 69,82 ---- - - // Registry didn't work, use the search path. - if (name[0] == 0) -! strcpy(name, searchpath((char *)"gvim.exe")); - - if (!runtime) - { - // Only when looking for the executable, not the runtime dir, we can - // search for the batch file or a name without a path. - if (name[0] == 0) -! strcpy(name, searchpath((char *)"gvim.bat")); - if (name[0] == 0) - strcpy(name, "gvim"); // finds gvim.bat or gvim.exe - -*************** -*** 152,160 **** - FARPROC *ptr; - } libintl_entry[] = - { -! {"gettext", (FARPROC*)&dyn_libintl_gettext}, -! {"textdomain", (FARPROC*)&dyn_libintl_textdomain}, -! {"bindtextdomain", (FARPROC*)&dyn_libintl_bindtextdomain}, - {NULL, NULL} - }; - ---- 152,160 ---- - FARPROC *ptr; - } libintl_entry[] = - { -! {(char *)"gettext", (FARPROC*)&dyn_libintl_gettext}, -! {(char *)"textdomain", (FARPROC*)&dyn_libintl_textdomain}, -! {(char *)"bindtextdomain", (FARPROC*)&dyn_libintl_bindtextdomain}, - {NULL, NULL} - }; - -*************** -*** 835,841 **** - (LPTSTR)location) > (HINSTANCE)32) - return location; - } -! return ""; - } - # endif - #endif ---- 835,841 ---- - (LPTSTR)location) > (HINSTANCE)32) - return location; - } -! return (char *)""; - } - # endif - #endif -*** ../vim-7.1.079/src/version.c Wed Aug 15 20:40:45 2007 ---- src/version.c Sat Aug 18 16:58:36 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 80, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -192. Your boss asks you to "go fer" coffee and you come up with 235 FTP sites. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.081 b/7.1.081 deleted file mode 100644 index 85b7bbba..00000000 --- a/7.1.081 +++ /dev/null @@ -1,143 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.081 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.081 -Problem: Command line completion for a shell command: "cat " - doesn't work. -Solution: Start the file name at any character that can't be in a file name. - (Martin Toft) -Files: src/ex_docmd.c - - -*** ../vim-7.1.080/src/ex_docmd.c Tue Aug 14 22:54:00 2007 ---- src/ex_docmd.c Sat Aug 18 14:58:53 2007 -*************** -*** 3281,3319 **** - - if (ea.argt & XFILE) - { -! int in_quote = FALSE; -! char_u *bow = NULL; /* Beginning of word */ - - /* - * Allow spaces within back-quotes to count as part of the argument - * being expanded. - */ - xp->xp_pattern = skipwhite(arg); -! for (p = xp->xp_pattern; *p; ) - { -! if (*p == '\\' && p[1] != NUL) - ++p; - #ifdef SPACE_IN_FILENAME -! else if (vim_iswhite(*p) && (!(ea.argt & NOSPC) || usefilter)) - #else -! else if (vim_iswhite(*p)) - #endif - { -! p = skipwhite(p); - if (in_quote) - bow = p; - else - xp->xp_pattern = p; -! --p; -! } -! else if (*p == '`') -! { -! if (!in_quote) -! { -! xp->xp_pattern = p; -! bow = p + 1; -! } -! in_quote = !in_quote; - } - mb_ptr_adv(p); - } ---- 3281,3344 ---- - - if (ea.argt & XFILE) - { -! int c; -! int in_quote = FALSE; -! char_u *bow = NULL; /* Beginning of word */ - - /* - * Allow spaces within back-quotes to count as part of the argument - * being expanded. - */ - xp->xp_pattern = skipwhite(arg); -! p = xp->xp_pattern; -! while (*p != NUL) - { -! #ifdef FEAT_MBYTE -! if (has_mbyte) -! c = mb_ptr2char(p); -! else -! #endif -! c = *p; -! if (c == '\\' && p[1] != NUL) - ++p; -+ else if (c == '`') -+ { -+ if (!in_quote) -+ { -+ xp->xp_pattern = p; -+ bow = p + 1; -+ } -+ in_quote = !in_quote; -+ } - #ifdef SPACE_IN_FILENAME -! else if (!vim_isfilec(c) && (!(ea.argt & NOSPC) || usefilter)) - #else -! else if (!vim_isfilec(c)) - #endif - { -! while (*p != NUL) -! { -! #ifdef FEAT_MBYTE -! if (has_mbyte) -! c = mb_ptr2char(p); -! else -! #endif -! c = *p; -! if (c == '`' || vim_isfilec(c)) -! break; -! #ifdef FEAT_MBYTE -! if (has_mbyte) -! len = (*mb_ptr2len)(p); -! else -! #endif -! len = 1; -! mb_ptr_adv(p); -! } - if (in_quote) - bow = p; - else - xp->xp_pattern = p; -! p -= len; - } - mb_ptr_adv(p); - } -*** ../vim-7.1.080/src/version.c Sat Aug 18 16:59:43 2007 ---- src/version.c Sat Aug 18 17:45:54 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 81, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -194. Your business cards contain your e-mail and home page address. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.082 b/7.1.082 deleted file mode 100644 index 1c2dc4ed..00000000 --- a/7.1.082 +++ /dev/null @@ -1,107 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.082 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.082 -Problem: After a ":split" the matchparen highlighting isn't there. -Solution: Install a WinEnter autocommand. Also fixes that after - ":NoMatchParen" only the current window is updated. (Martin Toft) -Files: runtime/doc/pi_paren.txt, runtime/plugin/matchparen.vim - - -*** ../vim-7.1.081/runtime/doc/pi_paren.txt Sat May 12 16:23:41 2007 ---- runtime/doc/pi_paren.txt Sat Aug 18 15:08:32 2007 -*************** -*** 12,19 **** - You can avoid loading this plugin by setting the "loaded_matchparen" variable: > - :let loaded_matchparen = 1 - -! The plugin installs CursorMoved autocommands to redefine the match -! highlighting. - - To disable the plugin after it was loaded use this command: > - ---- 12,19 ---- - You can avoid loading this plugin by setting the "loaded_matchparen" variable: > - :let loaded_matchparen = 1 - -! The plugin installs CursorMoved, CursorMovedI and WinEnter autocommands to -! redefine the match highlighting. - - To disable the plugin after it was loaded use this command: > - -*** ../vim-7.1.081/runtime/plugin/matchparen.vim Thu Aug 2 23:00:06 2007 ---- runtime/plugin/matchparen.vim Sat Aug 18 15:08:32 2007 -*************** -*** 1,6 **** - " Vim plugin for showing matching parens - " Maintainer: Bram Moolenaar -! " Last Change: 2007 Jul 30 - - " Exit quickly when: - " - this plugin was already loaded (or disabled) ---- 1,6 ---- - " Vim plugin for showing matching parens - " Maintainer: Bram Moolenaar -! " Last Change: 2007 Aug 8 - - " Exit quickly when: - " - this plugin was already loaded (or disabled) -*************** -*** 13,19 **** - - augroup matchparen - " Replace all matchparen autocommands -! autocmd! CursorMoved,CursorMovedI * call s:Highlight_Matching_Pair() - augroup END - - " Skip the rest if it was already done. ---- 13,19 ---- - - augroup matchparen - " Replace all matchparen autocommands -! autocmd! CursorMoved,CursorMovedI,WinEnter * call s:Highlight_Matching_Pair() - augroup END - - " Skip the rest if it was already done. -*************** -*** 126,132 **** - endfunction - - " Define commands that will disable and enable the plugin. -! command! NoMatchParen 3match none | unlet! g:loaded_matchparen | au! matchparen -! command! DoMatchParen runtime plugin/matchparen.vim | doau CursorMoved - - let &cpo = cpo_save ---- 126,133 ---- - endfunction - - " Define commands that will disable and enable the plugin. -! command! NoMatchParen windo 3match none | unlet! g:loaded_matchparen | -! \ au! matchparen -! command! DoMatchParen runtime plugin/matchparen.vim | windo doau CursorMoved - - let &cpo = cpo_save -*** ../vim-7.1.081/src/version.c Sat Aug 18 17:46:50 2007 ---- src/version.c Sat Aug 18 18:19:20 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 82, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -195. Your cat has its own home page. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.083 b/7.1.083 deleted file mode 100644 index 61073205..00000000 --- a/7.1.083 +++ /dev/null @@ -1,123 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.083 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.083 (after 7.1.081) -Problem: Command line completion doesn't work with wildcards. -Solution: Add vim_isfilec_or_wc() and use it. (Martin Toft) -Files: src/charset.c, src/proto/charset.pro, src/ex_docmd.c - - -*** ../vim-7.1.082/src/charset.c Wed Aug 15 20:40:45 2007 ---- src/charset.c Sun Aug 19 22:30:25 2007 -*************** -*** 932,937 **** ---- 932,954 ---- - } - - /* -+ * return TRUE if 'c' is a valid file-name character or a wildcard character -+ * Assume characters above 0x100 are valid (multi-byte). -+ * Explicitly interpret ']' as a wildcard character as mch_has_wildcard("]") -+ * returns false. -+ */ -+ int -+ vim_isfilec_or_wc(c) -+ int c; -+ { -+ char_u buf[2]; -+ -+ buf[0] = (char_u)c; -+ buf[1] = NUL; -+ return vim_isfilec(c) || c == ']' || mch_has_wildcard(buf); -+ } -+ -+ /* - * return TRUE if 'c' is a printable character - * Assume characters above 0x100 are printable (multi-byte), except for - * Unicode. -*** ../vim-7.1.082/src/proto/charset.pro Sat May 5 19:21:32 2007 ---- src/proto/charset.pro Sun Aug 19 22:30:28 2007 -*************** -*** 21,26 **** ---- 21,27 ---- - int vim_iswordp __ARGS((char_u *p)); - int vim_iswordc_buf __ARGS((char_u *p, buf_T *buf)); - int vim_isfilec __ARGS((int c)); -+ int vim_isfilec_or_wc __ARGS((int c)); - int vim_isprintc __ARGS((int c)); - int vim_isprintc_strict __ARGS((int c)); - int lbr_chartabsize __ARGS((unsigned char *s, colnr_T col)); -*** ../vim-7.1.082/src/ex_docmd.c Sat Aug 18 17:46:50 2007 ---- src/ex_docmd.c Sun Aug 19 22:29:17 2007 -*************** -*** 3311,3319 **** - in_quote = !in_quote; - } - #ifdef SPACE_IN_FILENAME -! else if (!vim_isfilec(c) && (!(ea.argt & NOSPC) || usefilter)) - #else -! else if (!vim_isfilec(c)) - #endif - { - while (*p != NUL) ---- 3311,3320 ---- - in_quote = !in_quote; - } - #ifdef SPACE_IN_FILENAME -! else if (!vim_isfilec_or_wc(c) -! && (!(ea.argt & NOSPC) || usefilter)) - #else -! else if (!vim_isfilec_or_wc(c)) - #endif - { - while (*p != NUL) -*************** -*** 3324,3330 **** - else - #endif - c = *p; -! if (c == '`' || vim_isfilec(c)) - break; - #ifdef FEAT_MBYTE - if (has_mbyte) ---- 3325,3331 ---- - else - #endif - c = *p; -! if (c == '`' || vim_isfilec_or_wc(c)) - break; - #ifdef FEAT_MBYTE - if (has_mbyte) -*** ../vim-7.1.082/src/version.c Sat Aug 18 18:20:57 2007 ---- src/version.c Sun Aug 19 22:31:43 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 83, - /**/ - --- - "You mean there really is an answer?" - "Yes! But you're not going to like it!" - "Oh do please tell us!" - "You're really not going to like it!" - "but we MUST know - tell us" - "Alright, the answer is...." - "yes..." - "... is ..." - "yes... come on!" - "is 42!" - (Douglas Adams - The Hitchhiker's Guide to the Galaxy) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.084 b/7.1.084 deleted file mode 100644 index 119c94f3..00000000 --- a/7.1.084 +++ /dev/null @@ -1,53 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.084 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.084 -Problem: Using the "-nb" argument twice causes netbeans not to get - fileOpened events. -Solution: Change "&" to "&&". (Xavier de Gaye) -Files: src/ex_cmds.c - - -*** ../vim-7.1.083/src/ex_cmds.c Wed Jul 25 22:55:22 2007 ---- src/ex_cmds.c Tue Aug 21 15:02:43 2007 -*************** -*** 3776,3782 **** - workshop_file_opened((char *)curbuf->b_ffname, curbuf->b_p_ro); - # endif - # ifdef FEAT_NETBEANS_INTG -! if (usingNetbeans & ((flags & ECMD_SET_HELP) != ECMD_SET_HELP)) - netbeans_file_opened(curbuf); - # endif - } ---- 3787,3793 ---- - workshop_file_opened((char *)curbuf->b_ffname, curbuf->b_p_ro); - # endif - # ifdef FEAT_NETBEANS_INTG -! if (usingNetbeans && ((flags & ECMD_SET_HELP) != ECMD_SET_HELP)) - netbeans_file_opened(curbuf); - # endif - } -*** ../vim-7.1.083/src/version.c Sun Aug 19 22:42:27 2007 ---- src/version.c Tue Aug 21 15:04:03 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 84, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -220. Your wife asks for sex and you tell her where to find you on IRC. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.085 b/7.1.085 deleted file mode 100644 index 47502638..00000000 --- a/7.1.085 +++ /dev/null @@ -1,85 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.085 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.085 -Problem: ":e fold.c" then ":sp fold.c" results in folds of original window - to disappear. (Akita Noek) -Solution: Invoke foldUpdateAll() for all windows of the changed buffer. - (Martin Toft) -Files: src/ex_cmds.c - - -*** ../vim-7.1.084/src/ex_cmds.c Tue Aug 21 15:05:54 2007 ---- src/ex_cmds.c Tue Aug 21 15:02:43 2007 -*************** -*** 2974,2980 **** - * 'fnum' is the number of the file, if zero use ffname/sfname. - * - * Return 1 for "normal" error, 2 for "not written" error, 0 for success -! * -1 for succesfully opening another file. - * 'lnum' is the line number for the cursor in the new file (if non-zero). - */ - int ---- 2974,2980 ---- - * 'fnum' is the number of the file, if zero use ffname/sfname. - * - * Return 1 for "normal" error, 2 for "not written" error, 0 for success -! * -1 for successfully opening another file. - * 'lnum' is the line number for the cursor in the new file (if non-zero). - */ - int -*************** -*** 3584,3592 **** - curwin_init(); - - #ifdef FEAT_FOLDING -! /* It's like all lines in the buffer changed. Need to update -! * automatic folding. */ - foldUpdateAll(curwin); - #endif - - /* Change directories when the 'acd' option is set. */ ---- 3584,3603 ---- - curwin_init(); - - #ifdef FEAT_FOLDING -! /* It's possible that all lines in the buffer changed. Need to update -! * automatic folding for all windows where it's used. */ -! # ifdef FEAT_WINDOWS -! { -! win_T *win; -! tabpage_T *tp; -! -! FOR_ALL_TAB_WINDOWS(tp, win) -! if (win->w_buffer == curbuf) -! foldUpdateAll(win); -! } -! # else - foldUpdateAll(curwin); -+ # endif - #endif - - /* Change directories when the 'acd' option is set. */ -*** ../vim-7.1.084/src/version.c Tue Aug 21 15:05:54 2007 ---- src/version.c Tue Aug 21 15:26:43 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 85, - /**/ - --- -Your fault: core dumped - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.086 b/7.1.086 deleted file mode 100644 index 8d9ac8d9..00000000 --- a/7.1.086 +++ /dev/null @@ -1,123 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.086 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.086 -Problem: Crash when using specific Python syntax highlighting. (Quirk) -Solution: Check for a negative index, coming from a keyword match at the - start of a line from a saved state. -Files: src/syntax.c - - -*** ../vim-7.1.085/src/syntax.c Tue Aug 14 23:06:51 2007 ---- src/syntax.c Tue Aug 21 17:13:51 2007 -*************** -*** 279,285 **** - */ - typedef struct state_item - { -! int si_idx; /* index of syntax pattern */ - int si_id; /* highlight group ID for keywords */ - int si_trans_id; /* idem, transparancy removed */ - int si_m_lnum; /* lnum of the match */ ---- 279,286 ---- - */ - typedef struct state_item - { -! int si_idx; /* index of syntax pattern or -! KEYWORD_IDX */ - int si_id; /* highlight group ID for keywords */ - int si_trans_id; /* idem, transparancy removed */ - int si_m_lnum; /* lnum of the match */ -*************** -*** 837,845 **** - current_lnum = end_lnum; - break; - } -! spp = &(SYN_ITEMS(syn_buf)[cur_si->si_idx]); -! found_flags = spp->sp_flags; -! found_match_idx = spp->sp_sync_idx; - found_current_lnum = current_lnum; - found_current_col = current_col; - found_m_endpos = cur_si->si_m_endpos; ---- 838,855 ---- - current_lnum = end_lnum; - break; - } -! if (cur_si->si_idx < 0) -! { -! /* Cannot happen? */ -! found_flags = 0; -! found_match_idx = KEYWORD_IDX; -! } -! else -! { -! spp = &(SYN_ITEMS(syn_buf)[cur_si->si_idx]); -! found_flags = spp->sp_flags; -! found_match_idx = spp->sp_sync_idx; -! } - found_current_lnum = current_lnum; - found_current_col = current_col; - found_m_endpos = cur_si->si_m_endpos; -*************** -*** 2533,2538 **** ---- 2543,2552 ---- - stateitem_T *sip = &CUR_STATE(idx); - synpat_T *spp; - -+ /* This should not happen... */ -+ if (sip->si_idx < 0) -+ return; -+ - spp = &(SYN_ITEMS(syn_buf)[sip->si_idx]); - if (sip->si_flags & HL_MATCH) - sip->si_id = spp->sp_syn_match_id; -*************** -*** 2648,2653 **** ---- 2662,2671 ---- - lpos_T end_endpos; - int end_idx; - -+ /* return quickly for a keyword */ -+ if (sip->si_idx < 0) -+ return; -+ - /* Don't update when it's already done. Can be a match of an end pattern - * that started in a previous line. Watch out: can also be a "keepend" - * from a containing item. */ -*************** -*** 2759,2764 **** ---- 2777,2786 ---- - lpos_T pos; - char_u *line; - int had_match = FALSE; -+ -+ /* just in case we are invoked for a keyword */ -+ if (idx < 0) -+ return; - - /* - * Check for being called with a START pattern. -*** ../vim-7.1.085/src/version.c Tue Aug 21 15:28:32 2007 ---- src/version.c Tue Aug 21 17:21:06 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 86, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -222. You send more than 20 personal e-mails a day. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.087 b/7.1.087 deleted file mode 100644 index 3ba731e6..00000000 --- a/7.1.087 +++ /dev/null @@ -1,151 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.087 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.087 -Problem: Reading past ":cscope find" command. Writing past end of a buffer. -Solution: Check length of the argument before using the pattern. Use - vim_strncpy(). (Dominique Pelle) -Files: if_cscope.c - - -*** ../vim-7.1.086/src/if_cscope.c Sun Mar 11 15:48:29 2007 ---- src/if_cscope.c Sun Aug 19 22:17:09 2007 -*************** -*** 73,78 **** ---- 73,80 ---- - - - static csinfo_T csinfo[CSCOPE_MAX_CONNECTIONS]; -+ static int eap_arg_len; /* length of eap->arg, set in -+ cs_lookup_cmd() */ - static cscmd_T cs_cmds[] = - { - { "add", cs_add, -*************** -*** 260,273 **** - - if ((p = cs_manage_matches(NULL, NULL, -1, Get)) == NULL) - return TRUE; -! -! if ((int)strlen(p) > size) -! { -! strncpy((char *)buf, p, size - 1); -! buf[size] = '\0'; -! } -! else -! (void)strcpy((char *)buf, p); - - return FALSE; - } /* cs_fgets */ ---- 262,268 ---- - - if ((p = cs_manage_matches(NULL, NULL, -1, Get)) == NULL) - return TRUE; -! vim_strncpy(buf, (char_u *)p, size - 1); - - return FALSE; - } /* cs_fgets */ -*************** -*** 386,392 **** - * PRIVATE: cs_add - * - * add cscope database or a directory name (to look for cscope.out) -! * the the cscope connection list - * - * MAXPATHL 256 - */ ---- 381,387 ---- - * PRIVATE: cs_add - * - * add cscope database or a directory name (to look for cscope.out) -! * to the cscope connection list - * - * MAXPATHL 256 - */ -*************** -*** 966,972 **** - } - - pat = opt + strlen(opt) + 1; -! if (pat == NULL || (pat != NULL && pat[0] == '\0')) - { - cs_usage_msg(Find); - return FALSE; ---- 961,967 ---- - } - - pat = opt + strlen(opt) + 1; -! if (pat >= (char *)eap->arg + eap_arg_len) - { - cs_usage_msg(Find); - return FALSE; -*************** -*** 1317,1323 **** - #else - /* compare pathnames first */ - && ((fullpathcmp(csinfo[j].fname, fname, FALSE) & FPC_SAME) -! /* if not Windows 9x, test index file atributes too */ - || (!mch_windows95() - && csinfo[j].nVolume == bhfi.dwVolumeSerialNumber - && csinfo[j].nIndexHigh == bhfi.nFileIndexHigh ---- 1312,1318 ---- - #else - /* compare pathnames first */ - && ((fullpathcmp(csinfo[j].fname, fname, FALSE) & FPC_SAME) -! /* if not Windows 9x, test index file attributes too */ - || (!mch_windows95() - && csinfo[j].nVolume == bhfi.dwVolumeSerialNumber - && csinfo[j].nIndexHigh == bhfi.nFileIndexHigh -*************** -*** 1401,1406 **** ---- 1396,1404 ---- - if (eap->arg == NULL) - return NULL; - -+ /* Store length of eap->arg before it gets modified by strtok(). */ -+ eap_arg_len = STRLEN(eap->arg); -+ - if ((stok = strtok((char *)(eap->arg), (const char *)" ")) == NULL) - return NULL; - -*************** -*** 2195,2201 **** - cs_add_common(dblist[i], pplist[i], fllist[i]); - if (p_csverbose) - { -! /* dont' use smsg_attr because want to display - * connection number in the same line as - * "Added cscope database..." - */ ---- 2193,2199 ---- - cs_add_common(dblist[i], pplist[i], fllist[i]); - if (p_csverbose) - { -! /* don't use smsg_attr() because we want to display the - * connection number in the same line as - * "Added cscope database..." - */ -*** ../vim-7.1.086/src/version.c Tue Aug 21 17:29:04 2007 ---- src/version.c Tue Aug 21 17:59:42 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 87, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -223. You set up a web-cam as your home's security system. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.088 b/7.1.088 deleted file mode 100644 index fc07d601..00000000 --- a/7.1.088 +++ /dev/null @@ -1,70 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.088 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.088 (extra) -Problem: The coordinates used by ":winpos" differ from what getwinposx() - and getwinposy() return. -Solution: Use MoveWindowStructure() instead of MoveWindow(). (Michael Henry) -Files: src/gui_mac.c - - -*** ../vim-7.1.087/src/gui_mac.c Tue Jun 19 16:33:53 2007 ---- src/gui_mac.c Wed Aug 29 20:33:34 2007 -*************** -*** 3149,3155 **** - /* TODO: Should make sure the window is move within range - * e.g.: y > ~16 [Menu bar], x > 0, x < screen width - */ -! MoveWindow(gui.VimWindow, x, y, TRUE); - } - - void ---- 3149,3155 ---- - /* TODO: Should make sure the window is move within range - * e.g.: y > ~16 [Menu bar], x > 0, x < screen width - */ -! MoveWindowStructure(gui.VimWindow, x, y, TRUE); - } - - void -*************** -*** 5556,5562 **** - * SetDialogTracksCursor() : Get the I-beam cursor over input box - * MoveDialogItem(): Probably better than SetDialogItem - * SizeDialogItem(): (but is it Carbon Only?) -! * AutoSizeDialog(): Magic resize of dialog based on text lenght - */ - } - #endif /* FEAT_DIALOG_GUI */ ---- 5556,5562 ---- - * SetDialogTracksCursor() : Get the I-beam cursor over input box - * MoveDialogItem(): Probably better than SetDialogItem - * SizeDialogItem(): (but is it Carbon Only?) -! * AutoSizeDialog(): Magic resize of dialog based on text length - */ - } - #endif /* FEAT_DIALOG_GUI */ -*** ../vim-7.1.087/src/version.c Tue Aug 21 18:02:58 2007 ---- src/version.c Thu Aug 30 10:32:28 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 88, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -10E. You start counting in hex. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.089 b/7.1.089 deleted file mode 100644 index 50773af7..00000000 --- a/7.1.089 +++ /dev/null @@ -1,494 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.089 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.089 -Problem: ":let loaded_getscriptPlugin" doesn't clear to eol, result is - "#1in". -Solution: Clear to the end of the screen after displaying the first variable - value. -Files: src/eval.c - - -*** ../vim-7.1.088/src/eval.c Tue Aug 14 22:40:13 2007 ---- src/eval.c Wed Aug 29 22:40:15 2007 -*************** -*** 369,385 **** - static int ex_let_vars __ARGS((char_u *arg, typval_T *tv, int copy, int semicolon, int var_count, char_u *nextchars)); - static char_u *skip_var_list __ARGS((char_u *arg, int *var_count, int *semicolon)); - static char_u *skip_var_one __ARGS((char_u *arg)); -! static void list_hashtable_vars __ARGS((hashtab_T *ht, char_u *prefix, int empty)); -! static void list_glob_vars __ARGS((void)); -! static void list_buf_vars __ARGS((void)); -! static void list_win_vars __ARGS((void)); - #ifdef FEAT_WINDOWS -! static void list_tab_vars __ARGS((void)); - #endif -! static void list_vim_vars __ARGS((void)); -! static void list_script_vars __ARGS((void)); -! static void list_func_vars __ARGS((void)); -! static char_u *list_arg_vars __ARGS((exarg_T *eap, char_u *arg)); - static char_u *ex_let_one __ARGS((char_u *arg, typval_T *tv, int copy, char_u *endchars, char_u *op)); - static int check_changedtick __ARGS((char_u *arg)); - static char_u *get_lval __ARGS((char_u *name, typval_T *rettv, lval_T *lp, int unlet, int skip, int quiet, int fne_flags)); ---- 369,385 ---- - static int ex_let_vars __ARGS((char_u *arg, typval_T *tv, int copy, int semicolon, int var_count, char_u *nextchars)); - static char_u *skip_var_list __ARGS((char_u *arg, int *var_count, int *semicolon)); - static char_u *skip_var_one __ARGS((char_u *arg)); -! static void list_hashtable_vars __ARGS((hashtab_T *ht, char_u *prefix, int empty, int *first)); -! static void list_glob_vars __ARGS((int *first)); -! static void list_buf_vars __ARGS((int *first)); -! static void list_win_vars __ARGS((int *first)); - #ifdef FEAT_WINDOWS -! static void list_tab_vars __ARGS((int *first)); - #endif -! static void list_vim_vars __ARGS((int *first)); -! static void list_script_vars __ARGS((int *first)); -! static void list_func_vars __ARGS((int *first)); -! static char_u *list_arg_vars __ARGS((exarg_T *eap, char_u *arg, int *first)); - static char_u *ex_let_one __ARGS((char_u *arg, typval_T *tv, int copy, char_u *endchars, char_u *op)); - static int check_changedtick __ARGS((char_u *arg)); - static char_u *get_lval __ARGS((char_u *name, typval_T *rettv, lval_T *lp, int unlet, int skip, int quiet, int fne_flags)); -*************** -*** 704,711 **** - static hashtab_T *find_var_ht __ARGS((char_u *name, char_u **varname)); - static void vars_clear_ext __ARGS((hashtab_T *ht, int free_val)); - static void delete_var __ARGS((hashtab_T *ht, hashitem_T *hi)); -! static void list_one_var __ARGS((dictitem_T *v, char_u *prefix)); -! static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string)); - static void set_var __ARGS((char_u *name, typval_T *varp, int copy)); - static int var_check_ro __ARGS((int flags, char_u *name)); - static int var_check_fixed __ARGS((int flags, char_u *name)); ---- 704,711 ---- - static hashtab_T *find_var_ht __ARGS((char_u *name, char_u **varname)); - static void vars_clear_ext __ARGS((hashtab_T *ht, int free_val)); - static void delete_var __ARGS((hashtab_T *ht, hashitem_T *hi)); -! static void list_one_var __ARGS((dictitem_T *v, char_u *prefix, int *first)); -! static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string, int *first)); - static void set_var __ARGS((char_u *name, typval_T *varp, int copy)); - static int var_check_ro __ARGS((int flags, char_u *name)); - static int var_check_fixed __ARGS((int flags, char_u *name)); -*************** -*** 1699,1704 **** ---- 1699,1705 ---- - int semicolon = 0; - char_u op[2]; - char_u *argend; -+ int first = TRUE; - - argend = skip_var_list(arg, &var_count, &semicolon); - if (argend == NULL) -*************** -*** 1715,1733 **** - EMSG(_(e_invarg)); - else if (!ends_excmd(*arg)) - /* ":let var1 var2" */ -! arg = list_arg_vars(eap, arg); - else if (!eap->skip) - { - /* ":let" */ -! list_glob_vars(); -! list_buf_vars(); -! list_win_vars(); - #ifdef FEAT_WINDOWS -! list_tab_vars(); - #endif -! list_script_vars(); -! list_func_vars(); -! list_vim_vars(); - } - eap->nextcmd = check_nextcmd(arg); - } ---- 1716,1734 ---- - EMSG(_(e_invarg)); - else if (!ends_excmd(*arg)) - /* ":let var1 var2" */ -! arg = list_arg_vars(eap, arg, &first); - else if (!eap->skip) - { - /* ":let" */ -! list_glob_vars(&first); -! list_buf_vars(&first); -! list_win_vars(&first); - #ifdef FEAT_WINDOWS -! list_tab_vars(&first); - #endif -! list_script_vars(&first); -! list_func_vars(&first); -! list_vim_vars(&first); - } - eap->nextcmd = check_nextcmd(arg); - } -*************** -*** 1932,1941 **** - * If "empty" is TRUE also list NULL strings as empty strings. - */ - static void -! list_hashtable_vars(ht, prefix, empty) - hashtab_T *ht; - char_u *prefix; - int empty; - { - hashitem_T *hi; - dictitem_T *di; ---- 1933,1943 ---- - * If "empty" is TRUE also list NULL strings as empty strings. - */ - static void -! list_hashtable_vars(ht, prefix, empty, first) - hashtab_T *ht; - char_u *prefix; - int empty; -+ int *first; - { - hashitem_T *hi; - dictitem_T *di; -*************** -*** 1950,1956 **** - di = HI2DI(hi); - if (empty || di->di_tv.v_type != VAR_STRING - || di->di_tv.vval.v_string != NULL) -! list_one_var(di, prefix); - } - } - } ---- 1952,1958 ---- - di = HI2DI(hi); - if (empty || di->di_tv.v_type != VAR_STRING - || di->di_tv.vval.v_string != NULL) -! list_one_var(di, prefix, first); - } - } - } -*************** -*** 1959,1990 **** - * List global variables. - */ - static void -! list_glob_vars() - { -! list_hashtable_vars(&globvarht, (char_u *)"", TRUE); - } - - /* - * List buffer variables. - */ - static void -! list_buf_vars() - { - char_u numbuf[NUMBUFLEN]; - -! list_hashtable_vars(&curbuf->b_vars.dv_hashtab, (char_u *)"b:", TRUE); - - sprintf((char *)numbuf, "%ld", (long)curbuf->b_changedtick); -! list_one_var_a((char_u *)"b:", (char_u *)"changedtick", VAR_NUMBER, numbuf); - } - - /* - * List window variables. - */ - static void -! list_win_vars() - { -! list_hashtable_vars(&curwin->w_vars.dv_hashtab, (char_u *)"w:", TRUE); - } - - #ifdef FEAT_WINDOWS ---- 1961,1998 ---- - * List global variables. - */ - static void -! list_glob_vars(first) -! int *first; - { -! list_hashtable_vars(&globvarht, (char_u *)"", TRUE, first); - } - - /* - * List buffer variables. - */ - static void -! list_buf_vars(first) -! int *first; - { - char_u numbuf[NUMBUFLEN]; - -! list_hashtable_vars(&curbuf->b_vars.dv_hashtab, (char_u *)"b:", -! TRUE, first); - - sprintf((char *)numbuf, "%ld", (long)curbuf->b_changedtick); -! list_one_var_a((char_u *)"b:", (char_u *)"changedtick", VAR_NUMBER, -! numbuf, first); - } - - /* - * List window variables. - */ - static void -! list_win_vars(first) -! int *first; - { -! list_hashtable_vars(&curwin->w_vars.dv_hashtab, -! (char_u *)"w:", TRUE, first); - } - - #ifdef FEAT_WINDOWS -*************** -*** 1992,2000 **** - * List tab page variables. - */ - static void -! list_tab_vars() - { -! list_hashtable_vars(&curtab->tp_vars.dv_hashtab, (char_u *)"t:", TRUE); - } - #endif - ---- 2000,2010 ---- - * List tab page variables. - */ - static void -! list_tab_vars(first) -! int *first; - { -! list_hashtable_vars(&curtab->tp_vars.dv_hashtab, -! (char_u *)"t:", TRUE, first); - } - #endif - -*************** -*** 2002,2040 **** - * List Vim variables. - */ - static void -! list_vim_vars() - { -! list_hashtable_vars(&vimvarht, (char_u *)"v:", FALSE); - } - - /* - * List script-local variables, if there is a script. - */ - static void -! list_script_vars() - { - if (current_SID > 0 && current_SID <= ga_scripts.ga_len) -! list_hashtable_vars(&SCRIPT_VARS(current_SID), (char_u *)"s:", FALSE); - } - - /* - * List function variables, if there is a function. - */ - static void -! list_func_vars() - { - if (current_funccal != NULL) - list_hashtable_vars(¤t_funccal->l_vars.dv_hashtab, -! (char_u *)"l:", FALSE); - } - - /* - * List variables in "arg". - */ - static char_u * -! list_arg_vars(eap, arg) - exarg_T *eap; - char_u *arg; - { - int error = FALSE; - int len; ---- 2012,2055 ---- - * List Vim variables. - */ - static void -! list_vim_vars(first) -! int *first; - { -! list_hashtable_vars(&vimvarht, (char_u *)"v:", FALSE, first); - } - - /* - * List script-local variables, if there is a script. - */ - static void -! list_script_vars(first) -! int *first; - { - if (current_SID > 0 && current_SID <= ga_scripts.ga_len) -! list_hashtable_vars(&SCRIPT_VARS(current_SID), -! (char_u *)"s:", FALSE, first); - } - - /* - * List function variables, if there is a function. - */ - static void -! list_func_vars(first) -! int *first; - { - if (current_funccal != NULL) - list_hashtable_vars(¤t_funccal->l_vars.dv_hashtab, -! (char_u *)"l:", FALSE, first); - } - - /* - * List variables in "arg". - */ - static char_u * -! list_arg_vars(eap, arg, first) - exarg_T *eap; - char_u *arg; -+ int *first; - { - int error = FALSE; - int len; -*************** -*** 2091,2105 **** - { - switch (*name) - { -! case 'g': list_glob_vars(); break; -! case 'b': list_buf_vars(); break; -! case 'w': list_win_vars(); break; - #ifdef FEAT_WINDOWS -! case 't': list_tab_vars(); break; - #endif -! case 'v': list_vim_vars(); break; -! case 's': list_script_vars(); break; -! case 'l': list_func_vars(); break; - default: - EMSG2(_("E738: Can't list variables for %s"), name); - } ---- 2106,2120 ---- - { - switch (*name) - { -! case 'g': list_glob_vars(first); break; -! case 'b': list_buf_vars(first); break; -! case 'w': list_win_vars(first); break; - #ifdef FEAT_WINDOWS -! case 't': list_tab_vars(first); break; - #endif -! case 'v': list_vim_vars(first); break; -! case 's': list_script_vars(first); break; -! case 'l': list_func_vars(first); break; - default: - EMSG2(_("E738: Can't list variables for %s"), name); - } -*************** -*** 2116,2122 **** - *arg = NUL; - list_one_var_a((char_u *)"", - arg == arg_subsc ? name : name_start, -! tv.v_type, s == NULL ? (char_u *)"" : s); - *arg = c; - vim_free(tf); - } ---- 2131,2139 ---- - *arg = NUL; - list_one_var_a((char_u *)"", - arg == arg_subsc ? name : name_start, -! tv.v_type, -! s == NULL ? (char_u *)"" : s, -! first); - *arg = c; - vim_free(tf); - } -*************** -*** 18001,18009 **** - * List the value of one internal variable. - */ - static void -! list_one_var(v, prefix) - dictitem_T *v; - char_u *prefix; - { - char_u *tofree; - char_u *s; ---- 18024,18033 ---- - * List the value of one internal variable. - */ - static void -! list_one_var(v, prefix, first) - dictitem_T *v; - char_u *prefix; -+ int *first; - { - char_u *tofree; - char_u *s; -*************** -*** 18011,18026 **** - - s = echo_string(&v->di_tv, &tofree, numbuf, ++current_copyID); - list_one_var_a(prefix, v->di_key, v->di_tv.v_type, -! s == NULL ? (char_u *)"" : s); - vim_free(tofree); - } - - static void -! list_one_var_a(prefix, name, type, string) - char_u *prefix; - char_u *name; - int type; - char_u *string; - { - /* don't use msg() or msg_attr() to avoid overwriting "v:statusmsg" */ - msg_start(); ---- 18035,18051 ---- - - s = echo_string(&v->di_tv, &tofree, numbuf, ++current_copyID); - list_one_var_a(prefix, v->di_key, v->di_tv.v_type, -! s == NULL ? (char_u *)"" : s, first); - vim_free(tofree); - } - - static void -! list_one_var_a(prefix, name, type, string, first) - char_u *prefix; - char_u *name; - int type; - char_u *string; -+ int *first; /* when TRUE clear rest of screen and set to FALSE */ - { - /* don't use msg() or msg_attr() to avoid overwriting "v:statusmsg" */ - msg_start(); -*************** -*** 18052,18057 **** ---- 18077,18087 ---- - - if (type == VAR_FUNC) - msg_puts((char_u *)"()"); -+ if (*first) -+ { -+ msg_clr_eos(); -+ *first = FALSE; -+ } - } - - /* -*** ../vim-7.1.088/src/version.c Thu Aug 30 10:34:19 2007 ---- src/version.c Thu Aug 30 11:06:32 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 89, - /**/ - --- -Edison's greatest achievement came in 1879, when he invented the -electric company. Edison's design was a brilliant adaptation of the -simple electrical circuit: the electric company sends electricity -through a wire to a customer, then immediately gets the electricity -back through another wire - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.090 b/7.1.090 deleted file mode 100644 index 319483ac..00000000 --- a/7.1.090 +++ /dev/null @@ -1,75 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.090 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.090 -Problem: Compiler warning on Mac OS X 10.5. -Solution: Don't redeclare sigaltstack(). (Hisashi T Fujinaka) -Files: src/os_unix.c - - -*** ../vim-7.1.089/src/os_unix.c Sat Aug 11 22:22:56 2007 ---- src/os_unix.c Wed Aug 22 22:28:48 2007 -*************** -*** 753,759 **** - if (signal_stack != NULL) - { - # ifdef HAVE_SIGALTSTACK -! # ifdef __APPLE__ - /* missing prototype. Adding it to osdef?.h.in doesn't work, because - * "struct sigaltstack" needs to be declared. */ - extern int sigaltstack __ARGS((const struct sigaltstack *ss, struct sigaltstack *oss)); ---- 753,760 ---- - if (signal_stack != NULL) - { - # ifdef HAVE_SIGALTSTACK -! # if defined(__APPLE__) && (!defined(MAC_OS_X_VERSION_MAX_ALLOWED) \ -! || MAC_OS_X_VERSION_MAX_ALLOWED <= 1040) - /* missing prototype. Adding it to osdef?.h.in doesn't work, because - * "struct sigaltstack" needs to be declared. */ - extern int sigaltstack __ARGS((const struct sigaltstack *ss, struct sigaltstack *oss)); -*************** -*** 5688,5694 **** - - /* - * Closes connection to gpm -! * returns non-zero if connection succesfully closed - */ - static void - gpm_close() ---- 5689,5695 ---- - - /* - * Closes connection to gpm -! * returns non-zero if connection successfully closed - */ - static void - gpm_close() -*** ../vim-7.1.089/src/version.c Thu Aug 30 11:10:38 2007 ---- src/version.c Thu Aug 30 11:46:07 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 90, - /**/ - --- - We're knights of the round table - We dance whene'er we're able - We do routines and chorus scenes - With footwork impeccable. - We dine well here in Camelot - We eat ham and jam and spam a lot. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.091 b/7.1.091 deleted file mode 100644 index 041286c2..00000000 --- a/7.1.091 +++ /dev/null @@ -1,355 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.091 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.091 (extra) -Problem: Win32: Can't embed Vim inside another application. -Solution: Add the --windowid argument. (Nageshwar) -Files: runtime/doc/gui_w32.txt, runtime/doc/starting.txt, - runtime/doc/vi_diff.txt, src/globals.h, src/gui_w32.c, src/main.c - - -*** ../vim-7.1.090/runtime/doc/gui_w32.txt Sat May 12 15:35:53 2007 ---- runtime/doc/gui_w32.txt Tue Aug 14 17:32:27 2007 -*************** -*** 1,4 **** -! *gui_w32.txt* For Vim version 7.1. Last change: 2007 May 03 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *gui_w32.txt* For Vim version 7.1. Last change: 2007 Aug 14 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 52,57 **** ---- 52,67 ---- - *gui-w32s* - There is a specific version of gvim.exe that runs under the Win32s subsystem - of Windows 3.1 or 3.11. See |win32s|. -+ -+ -+ Using Vim as a plugin *gui-w32-windowid* -+ -+ When gvim starts up normally, it creates its own top level window. If you -+ pass Vim the command-line option |--windowid| with a decimal or hexadecimal -+ value, Vim will create a window that is a child of the window with the given -+ ID. This enables Vim to act as a plugin in another application. This really -+ is a programmer's interface, and is of no use without a supporting application -+ to spawn Vim correctly. - - ============================================================================== - 2. Vim as default editor *vim-default-editor* -*** ../vim-7.1.090/runtime/doc/starting.txt Sat May 12 16:56:17 2007 ---- runtime/doc/starting.txt Tue Aug 14 17:34:22 2007 -*************** -*** 1,4 **** -! *starting.txt* For Vim version 7.1. Last change: 2007 May 12 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *starting.txt* For Vim version 7.1. Last change: 2007 Aug 14 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 547,552 **** ---- 547,557 ---- - GTK+ GUI Vim only. Make gvim try to use GtkPlug mechanism, so - that it runs inside another window. See |gui-gtk-socketid| - for details. {not in Vi} -+ -+ --windowid {id} *--windowid* -+ Win32 GUI Vim only. Make gvim try to use the window {id} as a -+ parent, so that it runs inside that window. See -+ |gui-w32-windowid| for details. {not in Vi} - - --echo-wid *--echo-wid* - GTK+ GUI Vim only. Make gvim echo the Window ID on stdout, -*** ../vim-7.1.090/runtime/doc/vi_diff.txt Sat May 12 14:54:28 2007 ---- runtime/doc/vi_diff.txt Tue Aug 14 17:35:10 2007 -*************** -*** 1,4 **** -! *vi_diff.txt* For Vim version 7.1. Last change: 2007 May 07 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *vi_diff.txt* For Vim version 7.1. Last change: 2007 Aug 14 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 826,831 **** ---- 826,833 ---- - --servername {name} Vim: Specify Vim server name - - --socketid {id} Vim: GTK window socket to run Vim in -+ -+ --windowid {id} Vim: Win32 window ID to run Vim in - - --version Vim: show version message and exit. - -*** ../vim-7.1.090/src/globals.h Thu May 10 19:26:02 2007 ---- src/globals.h Wed Aug 29 22:27:45 2007 -*************** -*** 876,882 **** - EXTERN int no_mapping INIT(= FALSE); /* currently no mapping allowed */ - EXTERN int no_zero_mapping INIT(= 0); /* mapping zero not allowed */ - EXTERN int allow_keys INIT(= FALSE); /* allow key codes when no_mapping -! * is set */ - EXTERN int no_u_sync INIT(= 0); /* Don't call u_sync() */ - - EXTERN int restart_edit INIT(= 0); /* call edit when next cmd finished */ ---- 876,882 ---- - EXTERN int no_mapping INIT(= FALSE); /* currently no mapping allowed */ - EXTERN int no_zero_mapping INIT(= 0); /* mapping zero not allowed */ - EXTERN int allow_keys INIT(= FALSE); /* allow key codes when no_mapping -! * is set */ - EXTERN int no_u_sync INIT(= 0); /* Don't call u_sync() */ - - EXTERN int restart_edit INIT(= 0); /* call edit when next cmd finished */ -*************** -*** 1250,1255 **** ---- 1250,1263 ---- - #ifdef FEAT_GUI_GTK - EXTERN guint32 gtk_socket_id INIT(= 0); - EXTERN int echo_wid_arg INIT(= FALSE); /* --echo-wid argument */ -+ #endif -+ -+ #ifdef FEAT_GUI_W32 -+ /* -+ * The value of the --windowid argument. -+ * For embedding gvim inside another application. -+ */ -+ EXTERN int win_socket_id INIT(= 0); - #endif - - #if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL) -*** ../vim-7.1.090/src/gui_w32.c Tue Aug 14 16:57:04 2007 ---- src/gui_w32.c Tue Aug 14 17:13:41 2007 -*************** -*** 23,28 **** ---- 23,30 ---- - * e.g., replace LONG with LONG_PTR, etc. - */ - -+ #include "vim.h" -+ - /* - * These are new in Windows ME/XP, only defined in recent compilers. - */ -*************** -*** 1432,1447 **** - } - } - else -! /* Open toplevel window. */ - s_hwnd = CreateWindow( -! szVimWndClass, "Vim MSWindows GUI", -! WS_OVERLAPPEDWINDOW, -! gui_win_x == -1 ? CW_USEDEFAULT : gui_win_x, -! gui_win_y == -1 ? CW_USEDEFAULT : gui_win_y, -! 100, /* Any value will do */ -! 100, /* Any value will do */ -! NULL, NULL, -! s_hinst, NULL); - - if (s_hwnd == NULL) - return FAIL; ---- 1434,1462 ---- - } - } - else -! { -! /* If the provided windowid is not valid reset it to zero, so that it -! * is ignored and we open our own window. */ -! if (IsWindow((HWND)win_socket_id) <= 0) -! win_socket_id = 0; -! -! /* Create a window. If win_socket_id is not zero without border and -! * titlebar, it will be reparented below. */ - s_hwnd = CreateWindow( -! szVimWndClass, "Vim MSWindows GUI", -! win_socket_id == 0 ? WS_OVERLAPPEDWINDOW : WS_POPUP, -! gui_win_x == -1 ? CW_USEDEFAULT : gui_win_x, -! gui_win_y == -1 ? CW_USEDEFAULT : gui_win_y, -! 100, /* Any value will do */ -! 100, /* Any value will do */ -! NULL, NULL, -! s_hinst, NULL); -! if (s_hwnd != NULL && win_socket_id != 0) -! { -! SetParent(s_hwnd, (HWND)win_socket_id); -! ShowWindow(s_hwnd, SW_SHOWMAXIMIZED); -! } -! } - - if (s_hwnd == NULL) - return FAIL; -*** ../vim-7.1.090/src/main.c Fri Aug 10 21:32:41 2007 ---- src/main.c Tue Aug 14 17:22:52 2007 -*************** -*** 275,280 **** ---- 275,281 ---- - * -display or --display - * --server... - * --socketid -+ * --windowid - */ - early_arg_scan(¶ms); - -*************** -*** 1489,1495 **** - * Get the name of the display, before gui_prepare() removes it from - * argv[]. Used for the xterm-clipboard display. - * -! * Also find the --server... arguments and --socketid - */ - /*ARGSUSED*/ - static void ---- 1490,1496 ---- - * Get the name of the display, before gui_prepare() removes it from - * argv[]. Used for the xterm-clipboard display. - * -! * Also find the --server... arguments and --socketid and --windowid - */ - /*ARGSUSED*/ - static void -*************** -*** 1536,1559 **** - # endif - } - # endif -! # ifdef FEAT_GUI_GTK - else if (STRICMP(argv[i], "--socketid") == 0) - { -! unsigned int socket_id; - int count; - - if (i == argc - 1) - mainerr_arg_missing((char_u *)argv[i]); - if (STRNICMP(argv[i+1], "0x", 2) == 0) -! count = sscanf(&(argv[i + 1][2]), "%x", &socket_id); - else -! count = sscanf(argv[i+1], "%u", &socket_id); - if (count != 1) - mainerr(ME_INVALID_ARG, (char_u *)argv[i]); - else -! gtk_socket_id = socket_id; - i++; - } - else if (STRICMP(argv[i], "--echo-wid") == 0) - echo_wid_arg = TRUE; - # endif ---- 1537,1571 ---- - # endif - } - # endif -! -! # if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32) -! # ifdef FEAT_GUI_W32 -! else if (STRICMP(argv[i], "--windowid") == 0) -! # else - else if (STRICMP(argv[i], "--socketid") == 0) -+ # endif - { -! unsigned int id; - int count; - - if (i == argc - 1) - mainerr_arg_missing((char_u *)argv[i]); - if (STRNICMP(argv[i+1], "0x", 2) == 0) -! count = sscanf(&(argv[i + 1][2]), "%x", &id); - else -! count = sscanf(argv[i+1], "%u", &id); - if (count != 1) - mainerr(ME_INVALID_ARG, (char_u *)argv[i]); - else -! # ifdef FEAT_GUI_W32 -! win_socket_id = id; -! # else -! gtk_socket_id = id; -! # endif - i++; - } -+ # endif -+ # ifdef FEAT_GUI_GTK - else if (STRICMP(argv[i], "--echo-wid") == 0) - echo_wid_arg = TRUE; - # endif -*************** -*** 1683,1690 **** - } - } - #endif -! #ifdef FEAT_GUI_GTK - else if (STRNICMP(argv[0] + argv_idx, "socketid", 8) == 0) - { - /* already processed -- snatch the following arg */ - if (argc > 1) ---- 1695,1706 ---- - } - } - #endif -! #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32) -! # ifdef FEAT_GUI_GTK - else if (STRNICMP(argv[0] + argv_idx, "socketid", 8) == 0) -+ # else -+ else if (STRNICMP(argv[0] + argv_idx, "windowid", 8) == 0) -+ # endif - { - /* already processed -- snatch the following arg */ - if (argc > 1) -*************** -*** 1693,1698 **** ---- 1709,1716 ---- - ++argv; - } - } -+ #endif -+ #ifdef FEAT_GUI_GTK - else if (STRNICMP(argv[0] + argv_idx, "echo-wid", 8) == 0) - { - /* already processed, skip */ -*************** -*** 3120,3125 **** ---- 3138,3144 ---- - #endif - #ifdef FEAT_GUI_W32 - main_msg(_("-P \tOpen Vim inside parent application")); -+ main_msg(_("--windowid \tOpen Vim inside another win32 widget")); - #endif - - #ifdef FEAT_GUI_GNOME -*** ../vim-7.1.090/src/version.c Thu Aug 30 11:46:46 2007 ---- src/version.c Thu Aug 30 12:21:02 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 91, - /**/ - --- - We're knights of the Round Table - Our shows are formidable - But many times - We're given rhymes - That are quite unsingable - We're opera mad in Camelot - We sing from the diaphragm a lot. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.092 b/7.1.092 deleted file mode 100644 index e2638552..00000000 --- a/7.1.092 +++ /dev/null @@ -1,92 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.092 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.092 (extra, after 7.1.088) -Problem: Wrong arguments for MoveWindowStructure(). -Solution: Remove "TRUE". (Michael Henry) -Files: src/gui_mac.c - - -*** ../vim-7.1.091/src/gui_mac.c Thu Aug 30 10:34:19 2007 ---- src/gui_mac.c Thu Aug 30 12:48:41 2007 -*************** -*** 3149,3155 **** - /* TODO: Should make sure the window is move within range - * e.g.: y > ~16 [Menu bar], x > 0, x < screen width - */ -! MoveWindowStructure(gui.VimWindow, x, y, TRUE); - } - - void ---- 3149,3155 ---- - /* TODO: Should make sure the window is move within range - * e.g.: y > ~16 [Menu bar], x > 0, x < screen width - */ -! MoveWindowStructure(gui.VimWindow, x, y); - } - - void -*************** -*** 5293,5299 **** - short itemType; - short useIcon; - short width; -! short totalButtonWidth = 0; /* the width of all button together - including spacing */ - short widestButton = 0; - short dfltButtonEdge = 20; /* gut feeling */ ---- 5293,5299 ---- - short itemType; - short useIcon; - short width; -! short totalButtonWidth = 0; /* the width of all buttons together - including spacing */ - short widestButton = 0; - short dfltButtonEdge = 20; /* gut feeling */ -*************** -*** 5483,5489 **** - { - - macMoveDialogItem(theDialog, button, buttonItm.box.left, buttonItm.box.top, &box); -! /* With vertical, it's better to have all button the same lenght */ - if (vertical) - { - macSizeDialogItem(theDialog, button, widestButton, 0); ---- 5483,5489 ---- - { - - macMoveDialogItem(theDialog, button, buttonItm.box.left, buttonItm.box.top, &box); -! /* With vertical, it's better to have all buttons the same length */ - if (vertical) - { - macSizeDialogItem(theDialog, button, widestButton, 0); -*** ../vim-7.1.091/src/version.c Thu Aug 30 12:24:21 2007 ---- src/version.c Thu Aug 30 12:47:24 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 92, - /**/ - --- - In war we're tough and able. - Quite indefatigable - Between our quests - We sequin vests - And impersonate Clark Gable - It's a busy life in Camelot. - I have to push the pram a lot. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.093 b/7.1.093 deleted file mode 100644 index 8c3c6b29..00000000 --- a/7.1.093 +++ /dev/null @@ -1,551 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.093 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.093 -Problem: Reading past end of a screen line when determining cell width. - (Dominique Pelle) -Solution: Add an argument to mb_off2cells() for the maximum offset. -Files: src/globals.h, src/gui.c, src/mbyte.c, src/proto/mbyte.pro, - src/screen.c - - -*** ../vim-7.1.092/src/globals.h Thu Aug 30 12:24:21 2007 ---- src/globals.h Wed Aug 29 22:27:45 2007 -*************** -*** 801,807 **** - EXTERN int (*mb_char2bytes) __ARGS((int c, char_u *buf)) INIT(= latin_char2bytes); - EXTERN int (*mb_ptr2cells) __ARGS((char_u *p)) INIT(= latin_ptr2cells); - EXTERN int (*mb_char2cells) __ARGS((int c)) INIT(= latin_char2cells); -! EXTERN int (*mb_off2cells) __ARGS((unsigned off)) INIT(= latin_off2cells); - EXTERN int (*mb_ptr2char) __ARGS((char_u *p)) INIT(= latin_ptr2char); - EXTERN int (*mb_head_off) __ARGS((char_u *base, char_u *p)) INIT(= latin_head_off); - ---- 801,807 ---- - EXTERN int (*mb_char2bytes) __ARGS((int c, char_u *buf)) INIT(= latin_char2bytes); - EXTERN int (*mb_ptr2cells) __ARGS((char_u *p)) INIT(= latin_ptr2cells); - EXTERN int (*mb_char2cells) __ARGS((int c)) INIT(= latin_char2cells); -! EXTERN int (*mb_off2cells) __ARGS((unsigned off, unsigned max_off)) INIT(= latin_off2cells); - EXTERN int (*mb_ptr2char) __ARGS((char_u *p)) INIT(= latin_ptr2char); - EXTERN int (*mb_head_off) __ARGS((char_u *base, char_u *p)) INIT(= latin_head_off); - -*** ../vim-7.1.092/src/gui.c Wed Aug 15 20:07:53 2007 ---- src/gui.c Wed Aug 29 22:16:51 2007 -*************** -*** 1080,1086 **** - cur_width = gui.char_width; - } - #ifdef FEAT_MBYTE -! if (has_mbyte && (*mb_off2cells)(LineOffset[gui.row] + gui.col) > 1) - { - /* Double wide character. */ - if (shape_table[idx].shape != SHAPE_VER) ---- 1080,1087 ---- - cur_width = gui.char_width; - } - #ifdef FEAT_MBYTE -! if (has_mbyte && (*mb_off2cells)(LineOffset[gui.row] + gui.col, -! LineOffset[gui.row] + screen_Columns) > 1) - { - /* Double wide character. */ - if (shape_table[idx].shape != SHAPE_VER) -*************** -*** 1159,1165 **** - #endif - - # if defined(FEAT_GUI_TABLINE) && (defined(FEAT_GUI_MSWIN) \ -! || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_MAC)) - if (gui_has_tabline()) - text_area_y += gui.tabline_height; - #endif ---- 1160,1166 ---- - #endif - - # if defined(FEAT_GUI_TABLINE) && (defined(FEAT_GUI_MSWIN) \ -! || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_MAC)) - if (gui_has_tabline()) - text_area_y += gui.tabline_height; - #endif -*** ../vim-7.1.092/src/mbyte.c Sat Aug 11 13:57:31 2007 ---- src/mbyte.c Thu Aug 30 13:48:30 2007 -*************** -*** 1310,1329 **** - /* - * mb_off2cells() function pointer. - * Return number of display cells for char at ScreenLines[off]. -! * Caller must make sure "off" and "off + 1" are valid! - */ - /*ARGSUSED*/ - int -! latin_off2cells(off) - unsigned off; - { - return 1; - } - - int -! dbcs_off2cells(off) - unsigned off; - { - /* Number of cells is equal to number of bytes, except for euc-jp when - * the first byte is 0x8e. */ - if (enc_dbcs == DBCS_JPNU && ScreenLines[off] == 0x8e) ---- 1310,1335 ---- - /* - * mb_off2cells() function pointer. - * Return number of display cells for char at ScreenLines[off]. -! * We make sure that the offset used is less than "max_off". - */ - /*ARGSUSED*/ - int -! latin_off2cells(off, max_off) - unsigned off; -+ unsigned max_off; - { - return 1; - } - - int -! dbcs_off2cells(off, max_off) - unsigned off; -+ unsigned max_off; - { -+ /* never check beyond end of the line */ -+ if (off >= max_off) -+ return 1; -+ - /* Number of cells is equal to number of bytes, except for euc-jp when - * the first byte is 0x8e. */ - if (enc_dbcs == DBCS_JPNU && ScreenLines[off] == 0x8e) -*************** -*** 1332,1341 **** - } - - int -! utf_off2cells(off) - unsigned off; - { -! return ScreenLines[off + 1] == 0 ? 2 : 1; - } - - /* ---- 1338,1348 ---- - } - - int -! utf_off2cells(off, max_off) - unsigned off; -+ unsigned max_off; - { -! return (off + 1 < max_off && ScreenLines[off + 1] == 0) ? 2 : 1; - } - - /* -*************** -*** 2899,2910 **** - if (composing_hangul) - return TRUE; - #endif -! if (enc_dbcs != 0) -! return dbcs_off2cells(LineOffset[row] + col) > 1; -! if (enc_utf8) -! return (col + 1 < Columns -! && ScreenLines[LineOffset[row] + col + 1] == 0); -! return FALSE; - } - - # if defined(FEAT_CLIPBOARD) || defined(FEAT_GUI) || defined(FEAT_RIGHTLEFT) \ ---- 2906,2913 ---- - if (composing_hangul) - return TRUE; - #endif -! return (*mb_off2cells)(LineOffset[row] + col, -! LineOffset[row] + screen_Columns) > 1; - } - - # if defined(FEAT_CLIPBOARD) || defined(FEAT_GUI) || defined(FEAT_RIGHTLEFT) \ -*** ../vim-7.1.092/src/proto/mbyte.pro Sat May 5 20:02:52 2007 ---- src/proto/mbyte.pro Wed Aug 29 20:49:02 2007 -*************** -*** 12,20 **** - int utf_ptr2cells __ARGS((char_u *p)); - int dbcs_ptr2cells __ARGS((char_u *p)); - int latin_char2cells __ARGS((int c)); -! int latin_off2cells __ARGS((unsigned off)); -! int dbcs_off2cells __ARGS((unsigned off)); -! int utf_off2cells __ARGS((unsigned off)); - int latin_ptr2char __ARGS((char_u *p)); - int utf_ptr2char __ARGS((char_u *p)); - int mb_ptr2char_adv __ARGS((char_u **pp)); ---- 12,20 ---- - int utf_ptr2cells __ARGS((char_u *p)); - int dbcs_ptr2cells __ARGS((char_u *p)); - int latin_char2cells __ARGS((int c)); -! int latin_off2cells __ARGS((unsigned off, unsigned max_off)); -! int dbcs_off2cells __ARGS((unsigned off, unsigned max_off)); -! int utf_off2cells __ARGS((unsigned off, unsigned max_off)); - int latin_ptr2char __ARGS((char_u *p)); - int utf_ptr2char __ARGS((char_u *p)); - int mb_ptr2char_adv __ARGS((char_u **pp)); -*** ../vim-7.1.092/src/screen.c Sun Aug 5 20:10:16 2007 ---- src/screen.c Thu Aug 30 10:31:26 2007 -*************** -*** 1024,1030 **** - type = VALID; - } - -! /* Trick: we want to avoid clearning the screen twice. screenclear() will - * set "screen_cleared" to TRUE. The special value MAYBE (which is still - * non-zero and thus not FALSE) will indicate that screenclear() was not - * called. */ ---- 1024,1030 ---- - type = VALID; - } - -! /* Trick: we want to avoid clearing the screen twice. screenclear() will - * set "screen_cleared" to TRUE. The special value MAYBE (which is still - * non-zero and thus not FALSE) will indicate that screenclear() was not - * called. */ -*************** -*** 4632,4638 **** - - /* - * At end of screen line and there is more to come: Display the line -! * so far. If there is no more to display it is catched above. - */ - if (( - #ifdef FEAT_RIGHTLEFT ---- 4632,4638 ---- - - /* - * At end of screen line and there is more to come: Display the line -! * so far. If there is no more to display it is caught above. - */ - if (( - #ifdef FEAT_RIGHTLEFT -*************** -*** 4709,4717 **** - #endif - #ifdef FEAT_MBYTE - && !(has_mbyte -! && ((*mb_off2cells)(LineOffset[screen_row]) == 2 - || (*mb_off2cells)(LineOffset[screen_row - 1] -! + (int)Columns - 2) == 2)) - #endif - ) - { ---- 4709,4721 ---- - #endif - #ifdef FEAT_MBYTE - && !(has_mbyte -! && ((*mb_off2cells)(LineOffset[screen_row], -! LineOffset[screen_row] + screen_Columns) -! == 2 - || (*mb_off2cells)(LineOffset[screen_row - 1] -! + (int)Columns - 2, -! LineOffset[screen_row] + screen_Columns) -! == 2)) - #endif - ) - { -*************** -*** 4871,4876 **** ---- 4875,4884 ---- - { - unsigned off_from; - unsigned off_to; -+ #ifdef FEAT_MBYTE -+ unsigned max_off_from; -+ unsigned max_off_to; -+ #endif - int col = 0; - #if defined(FEAT_GUI) || defined(UNIX) || defined(FEAT_VERTSPLIT) - int hl; -*************** -*** 4897,4902 **** ---- 4905,4914 ---- - - off_from = (unsigned)(current_ScreenLine - ScreenLines); - off_to = LineOffset[row] + coloff; -+ #ifdef FEAT_MBYTE -+ max_off_from = off_from + screen_Columns; -+ max_off_to = LineOffset[row] + screen_Columns; -+ #endif - - #ifdef FEAT_RIGHTLEFT - if (rlflag) -*************** -*** 4931,4937 **** - { - #ifdef FEAT_MBYTE - if (has_mbyte && (col + 1 < endcol)) -! char_cells = (*mb_off2cells)(off_from); - else - char_cells = 1; - #endif ---- 4943,4949 ---- - { - #ifdef FEAT_MBYTE - if (has_mbyte && (col + 1 < endcol)) -! char_cells = (*mb_off2cells)(off_from, max_off_from); - else - char_cells = 1; - #endif -*************** -*** 5008,5014 **** - * ScreenLinesUC[] is sufficient. */ - if (char_cells == 1 - && col + 1 < endcol -! && (*mb_off2cells)(off_to) > 1) - { - /* Writing a single-cell character over a double-cell - * character: need to redraw the next cell. */ ---- 5020,5026 ---- - * ScreenLinesUC[] is sufficient. */ - if (char_cells == 1 - && col + 1 < endcol -! && (*mb_off2cells)(off_to, max_off_to) > 1) - { - /* Writing a single-cell character over a double-cell - * character: need to redraw the next cell. */ -*************** -*** 5017,5024 **** - } - else if (char_cells == 2 - && col + 2 < endcol -! && (*mb_off2cells)(off_to) == 1 -! && (*mb_off2cells)(off_to + 1) > 1) - { - /* Writing the second half of a double-cell character over - * a double-cell character: need to redraw the second ---- 5029,5036 ---- - } - else if (char_cells == 2 - && col + 2 < endcol -! && (*mb_off2cells)(off_to, max_off_to) == 1 -! && (*mb_off2cells)(off_to + 1, max_off_to) > 1) - { - /* Writing the second half of a double-cell character over - * a double-cell character: need to redraw the second -*************** -*** 5037,5046 **** - * char over the left halve of an existing one. */ - if (has_mbyte && col + char_cells == endcol - && ((char_cells == 1 -! && (*mb_off2cells)(off_to) > 1) - || (char_cells == 2 -! && (*mb_off2cells)(off_to) == 1 -! && (*mb_off2cells)(off_to + 1) > 1))) - clear_next = TRUE; - #endif - ---- 5049,5058 ---- - * char over the left halve of an existing one. */ - if (has_mbyte && col + char_cells == endcol - && ((char_cells == 1 -! && (*mb_off2cells)(off_to, max_off_to) > 1) - || (char_cells == 2 -! && (*mb_off2cells)(off_to, max_off_to) == 1 -! && (*mb_off2cells)(off_to + 1, max_off_to) > 1))) - clear_next = TRUE; - #endif - -*************** -*** 5180,5189 **** - /* find previous character by counting from first - * column and get its width. */ - unsigned off = LineOffset[row]; - - while (off < off_to) - { -! prev_cells = (*mb_off2cells)(off); - off += prev_cells; - } - } ---- 5192,5202 ---- - /* find previous character by counting from first - * column and get its width. */ - unsigned off = LineOffset[row]; -+ unsigned max_off = LineOffset[row] + screen_Columns; - - while (off < off_to) - { -! prev_cells = (*mb_off2cells)(off, max_off); - off += prev_cells; - } - } -*************** -*** 5369,5375 **** - static int skip_status_match_char __ARGS((expand_T *xp, char_u *s)); - - /* -! * Get the lenght of an item as it will be shown in the status line. - */ - static int - status_match_len(xp, s) ---- 5382,5388 ---- - static int skip_status_match_char __ARGS((expand_T *xp, char_u *s)); - - /* -! * Get the length of an item as it will be shown in the status line. - */ - static int - status_match_len(xp, s) -*************** -*** 5435,5441 **** - int row; - char_u *buf; - int len; -! int clen; /* lenght in screen cells */ - int fillchar; - int attr; - int i; ---- 5448,5454 ---- - int row; - char_u *buf; - int len; -! int clen; /* length in screen cells */ - int fillchar; - int attr; - int i; -*************** -*** 6187,6192 **** ---- 6200,6206 ---- - char_u *ptr = text; - int c; - #ifdef FEAT_MBYTE -+ unsigned max_off; - int mbyte_blen = 1; - int mbyte_cells = 1; - int u8c = 0; -*************** -*** 6203,6208 **** ---- 6217,6225 ---- - return; - - off = LineOffset[row] + col; -+ #ifdef FEAT_MBYTE -+ max_off = LineOffset[row] + screen_Columns; -+ #endif - while (col < screen_Columns - && (len < 0 || (int)(ptr - text) < len) - && *ptr != NUL) -*************** -*** 6326,6344 **** - else if (has_mbyte - && (len < 0 ? ptr[mbyte_blen] == NUL - : ptr + mbyte_blen >= text + len) -! && ((mbyte_cells == 1 && (*mb_off2cells)(off) > 1) - || (mbyte_cells == 2 -! && (*mb_off2cells)(off) == 1 -! && (*mb_off2cells)(off + 1) > 1))) - clear_next_cell = TRUE; - - /* Make sure we never leave a second byte of a double-byte behind, - * it confuses mb_off2cells(). */ - if (enc_dbcs -! && ((mbyte_cells == 1 && (*mb_off2cells)(off) > 1) - || (mbyte_cells == 2 -! && (*mb_off2cells)(off) == 1 -! && (*mb_off2cells)(off + 1) > 1))) - ScreenLines[off + mbyte_blen] = 0; - #endif - ScreenLines[off] = c; ---- 6343,6361 ---- - else if (has_mbyte - && (len < 0 ? ptr[mbyte_blen] == NUL - : ptr + mbyte_blen >= text + len) -! && ((mbyte_cells == 1 && (*mb_off2cells)(off, max_off) > 1) - || (mbyte_cells == 2 -! && (*mb_off2cells)(off, max_off) == 1 -! && (*mb_off2cells)(off + 1, max_off) > 1))) - clear_next_cell = TRUE; - - /* Make sure we never leave a second byte of a double-byte behind, - * it confuses mb_off2cells(). */ - if (enc_dbcs -! && ((mbyte_cells == 1 && (*mb_off2cells)(off, max_off) > 1) - || (mbyte_cells == 2 -! && (*mb_off2cells)(off, max_off) == 1 -! && (*mb_off2cells)(off + 1, max_off) > 1))) - ScreenLines[off + mbyte_blen] = 0; - #endif - ScreenLines[off] = c; -*************** -*** 6924,6929 **** ---- 6941,6949 ---- - { - int r, c; - int off; -+ #ifdef FEAT_MBYTE -+ int max_off; -+ #endif - - /* Can't use ScreenLines unless initialized */ - if (ScreenLines == NULL) -*************** -*** 6934,6943 **** - for (r = row; r < row + height; ++r) - { - off = LineOffset[r]; - for (c = col; c < col + width; ++c) - { - #ifdef FEAT_MBYTE -! if (enc_dbcs != 0 && dbcs_off2cells(off + c) > 1) - { - screen_char_2(off + c, r, c); - ++c; ---- 6954,6966 ---- - for (r = row; r < row + height; ++r) - { - off = LineOffset[r]; -+ #ifdef FEAT_MBYTE -+ max_off = off + screen_Columns; -+ #endif - for (c = col; c < col + width; ++c) - { - #ifdef FEAT_MBYTE -! if (enc_dbcs != 0 && dbcs_off2cells(off + c, max_off) > 1) - { - screen_char_2(off + c, r, c); - ++c; -*************** -*** 6947,6953 **** - { - screen_char(off + c, r, c); - #ifdef FEAT_MBYTE -! if (utf_off2cells(off + c) > 1) - ++c; - #endif - } ---- 6970,6976 ---- - { - screen_char(off + c, r, c); - #ifdef FEAT_MBYTE -! if (utf_off2cells(off + c, max_off) > 1) - ++c; - #endif - } -*** ../vim-7.1.092/src/version.c Thu Aug 30 12:50:00 2007 ---- src/version.c Thu Aug 30 13:45:25 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 93, - /**/ - --- -There is a fine line between courage and foolishness. -Unfortunately, it's not a fence. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.094 b/7.1.094 deleted file mode 100644 index 06318fce..00000000 --- a/7.1.094 +++ /dev/null @@ -1,58 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.094 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.094 -Problem: When checking if syntax highlighting is present, looking in the - current buffer instead of the specified one. -Solution: Use "buf" instead of "curbuf". -Files: src/syntax.c - - -*** ../vim-7.1.093/src/syntax.c Tue Aug 21 17:29:04 2007 ---- src/syntax.c Wed Aug 29 23:27:52 2007 -*************** -*** 5987,5994 **** - { - return (buf->b_syn_patterns.ga_len != 0 - || buf->b_syn_clusters.ga_len != 0 -! || curbuf->b_keywtab.ht_used > 0 -! || curbuf->b_keywtab_ic.ht_used > 0); - } - - #if defined(FEAT_CMDL_COMPL) || defined(PROTO) ---- 5987,5994 ---- - { - return (buf->b_syn_patterns.ga_len != 0 - || buf->b_syn_clusters.ga_len != 0 -! || buf->b_keywtab.ht_used > 0 -! || buf->b_keywtab_ic.ht_used > 0); - } - - #if defined(FEAT_CMDL_COMPL) || defined(PROTO) -*** ../vim-7.1.093/src/version.c Thu Aug 30 13:51:52 2007 ---- src/version.c Thu Aug 30 19:35:52 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 94, - /**/ - --- -MAN: You don't frighten us, English pig-dog! Go and boil your bottoms, - son of a silly person. I blow my nose on you, so-called Arthur-king, - you and your silly English K...kaniggets. - He puts hands to his ears and blows a raspberry. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.095 b/7.1.095 deleted file mode 100644 index 1b6fe273..00000000 --- a/7.1.095 +++ /dev/null @@ -1,210 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.095 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.095 -Problem: The FocusLost and FocusGained autocommands are triggered - asynchronously in the GUI. This may cause arbitrary problems. -Solution: Put the focus event in the input buffer and handle it when ready - for it. -Files: src/eval.c, src/getchar.c, src/gui.c, src/gui_gtk_x11.c, - src/keymap.h - - -*** ../vim-7.1.094/src/eval.c Thu Aug 30 11:10:38 2007 ---- src/eval.c Mon Sep 3 22:48:09 2007 -*************** -*** 9912,9929 **** - - ++no_mapping; - ++allow_keys; -! if (argvars[0].v_type == VAR_UNKNOWN) -! /* getchar(): blocking wait. */ -! n = safe_vgetc(); -! else if (get_tv_number_chk(&argvars[0], &error) == 1) -! /* getchar(1): only check if char avail */ -! n = vpeekc(); -! else if (error || vpeekc() == NUL) -! /* illegal argument or getchar(0) and no char avail: return zero */ -! n = 0; -! else -! /* getchar(0) and char avail: return char */ -! n = safe_vgetc(); - --no_mapping; - --allow_keys; - ---- 9912,9935 ---- - - ++no_mapping; - ++allow_keys; -! for (;;) -! { -! if (argvars[0].v_type == VAR_UNKNOWN) -! /* getchar(): blocking wait. */ -! n = safe_vgetc(); -! else if (get_tv_number_chk(&argvars[0], &error) == 1) -! /* getchar(1): only check if char avail */ -! n = vpeekc(); -! else if (error || vpeekc() == NUL) -! /* illegal argument or getchar(0) and no char avail: return zero */ -! n = 0; -! else -! /* getchar(0) and char avail: return char */ -! n = safe_vgetc(); -! if (n == K_IGNORE) -! continue; -! break; -! } - --no_mapping; - --allow_keys; - -*** ../vim-7.1.094/src/getchar.c Thu May 10 18:43:02 2007 ---- src/getchar.c Wed Aug 29 22:38:49 2007 -*************** -*** 1596,1603 **** - continue; - } - #endif -- - #ifdef FEAT_GUI - /* Translate K_CSI to CSI. The special key is only used to avoid - * it being recognized as the start of a special key. */ - if (c == K_CSI) ---- 1596,1610 ---- - continue; - } - #endif - #ifdef FEAT_GUI -+ /* The caller doesn't need to know that the focus event is delayed -+ * until getting a character. */ -+ if (c == K_FOCUSGAINED || c == K_FOCUSLOST) -+ { -+ ui_focus_change(c == K_FOCUSGAINED); -+ continue; -+ } -+ - /* Translate K_CSI to CSI. The special key is only used to avoid - * it being recognized as the start of a special key. */ - if (c == K_CSI) -*** ../vim-7.1.094/src/gui.c Thu Aug 30 13:51:52 2007 ---- src/gui.c Thu Aug 30 14:10:48 2007 -*************** -*** 4519,4525 **** - xim_set_focus(in_focus); - # endif - -! ui_focus_change(in_focus); - #endif - } - ---- 4519,4536 ---- - xim_set_focus(in_focus); - # endif - -! /* Put events in the input queue only when allowed. -! * ui_focus_change() isn't called directly, because it invokes -! * autocommands and that must not happen asynchronously. */ -! if (!hold_gui_events) -! { -! char_u bytes[3]; -! -! bytes[0] = CSI; -! bytes[1] = KS_EXTRA; -! bytes[2] = in_focus ? (int)KE_FOCUSGAINED : (int)KE_FOCUSLOST; -! add_to_input_buf(bytes, 3); -! } - #endif - } - -*** ../vim-7.1.094/src/gui_gtk_x11.c Tue Jun 19 18:07:52 2007 ---- src/gui_gtk_x11.c Wed Aug 29 22:43:34 2007 -*************** -*** 813,822 **** - if (blink_state == BLINK_NONE) - gui_mch_start_blink(); - -! /* make sure keyboard input goes to the draw area (if this is focus for a window) */ - if (widget != gui.drawarea) - gtk_widget_grab_focus(gui.drawarea); - - return TRUE; - } - ---- 813,827 ---- - if (blink_state == BLINK_NONE) - gui_mch_start_blink(); - -! /* make sure keyboard input goes to the draw area (if this is focus for a -! * window) */ - if (widget != gui.drawarea) - gtk_widget_grab_focus(gui.drawarea); - -+ /* make sure the input buffer is read */ -+ if (gtk_main_level() > 0) -+ gtk_main_quit(); -+ - return TRUE; - } - -*************** -*** 828,833 **** ---- 833,842 ---- - - if (blink_state != BLINK_NONE) - gui_mch_stop_blink(); -+ -+ /* make sure the input buffer is read */ -+ if (gtk_main_level() > 0) -+ gtk_main_quit(); - - return TRUE; - } -*** ../vim-7.1.094/src/keymap.h Sat May 5 19:34:22 2007 ---- src/keymap.h Wed Aug 29 22:17:51 2007 -*************** -*** 254,259 **** ---- 254,261 ---- - , KE_DROP /* DnD data is available */ - , KE_CURSORHOLD /* CursorHold event */ - , KE_NOP /* doesn't do something */ -+ , KE_FOCUSGAINED /* focus gained */ -+ , KE_FOCUSLOST /* focus lost */ - }; - - /* -*************** -*** 445,450 **** ---- 447,454 ---- - #define K_CMDWIN TERMCAP2KEY(KS_EXTRA, KE_CMDWIN) - - #define K_DROP TERMCAP2KEY(KS_EXTRA, KE_DROP) -+ #define K_FOCUSGAINED TERMCAP2KEY(KS_EXTRA, KE_FOCUSGAINED) -+ #define K_FOCUSLOST TERMCAP2KEY(KS_EXTRA, KE_FOCUSLOST) - - #define K_CURSORHOLD TERMCAP2KEY(KS_EXTRA, KE_CURSORHOLD) - -*** ../vim-7.1.094/src/version.c Thu Aug 30 19:36:52 2007 ---- src/version.c Wed Sep 5 21:42:41 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 95, - /**/ - --- -ARTHUR: Who are you? -TALL KNIGHT: We are the Knights Who Say "Ni"! -BEDEVERE: No! Not the Knights Who Say "Ni"! - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.096 b/7.1.096 deleted file mode 100644 index 3eabea47..00000000 --- a/7.1.096 +++ /dev/null @@ -1,89 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.096 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.096 -Problem: Reading past end of a string when resizing Vim. (Dominique Pelle) -Solution: Check the string pointer before getting the char it points to. -Files: src/message.c - - -*** ../vim-7.1.095/src/message.c Tue Aug 7 21:59:26 2007 ---- src/message.c Thu Aug 30 22:53:03 2007 -*************** -*** 944,949 **** ---- 944,950 ---- - c = K_IGNORE; - } - #endif -+ - /* - * Allow scrolling back in the messages. - * Also accept scroll-down commands when messages fill the screen, -*************** -*** 1840,1845 **** ---- 1841,1847 ---- - char_u *sb_str = str; - int sb_col = msg_col; - int wrap; -+ int did_last_char; - - did_wait_return = FALSE; - while ((maxlen < 0 || (int)(s - str) < maxlen) && *s != NUL) -*************** -*** 1909,1915 **** ---- 1911,1920 ---- - else - #endif - msg_screen_putchar(*s++, attr); -+ did_last_char = TRUE; - } -+ else -+ did_last_char = FALSE; - - if (p_more) - /* store text for scrolling back */ -*************** -*** 1944,1954 **** - - /* When we displayed a char in last column need to check if there - * is still more. */ -! if (*s >= ' ' -! #ifdef FEAT_RIGHTLEFT -! && !cmdmsg_rl -! #endif -! ) - continue; - } - ---- 1949,1955 ---- - - /* When we displayed a char in last column need to check if there - * is still more. */ -! if (did_last_char) - continue; - } - -*** ../vim-7.1.095/src/version.c Wed Sep 5 21:45:54 2007 ---- src/version.c Thu Sep 6 12:31:28 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 96, - /**/ - --- -Yah, well, we had to carve our electrons out of driftwood we'd -find. In the winter. Uphill. Both ways. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.097 b/7.1.097 deleted file mode 100644 index 52438939..00000000 --- a/7.1.097 +++ /dev/null @@ -1,51 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.097 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.097 -Problem: ":setlocal stl=%!1+1" does not work. -Solution: Adjust check for pointer. (Politz) -Files: src/option.c - - -*** ../vim-7.1.096/src/option.c Sun Aug 12 15:50:26 2007 ---- src/option.c Wed Sep 5 22:34:27 2007 -*************** -*** 6348,6354 **** - errmsg = check_stl_option(p_ruf); - } - /* check 'statusline' only if it doesn't start with "%!" */ -! else if (varp != &p_stl || s[0] != '%' || s[1] != '!') - errmsg = check_stl_option(s); - if (varp == &p_ruf && errmsg == NULL) - comp_col(); ---- 6352,6358 ---- - errmsg = check_stl_option(p_ruf); - } - /* check 'statusline' only if it doesn't start with "%!" */ -! else if (varp == &p_ruf || s[0] != '%' || s[1] != '!') - errmsg = check_stl_option(s); - if (varp == &p_ruf && errmsg == NULL) - comp_col(); -*** ../vim-7.1.096/src/version.c Thu Sep 6 12:53:59 2007 ---- src/version.c Thu Sep 6 13:31:37 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 97, - /**/ - --- -Not too long ago, cut and paste was done with scissors and glue... - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.098 b/7.1.098 deleted file mode 100644 index 608bd628..00000000 --- a/7.1.098 +++ /dev/null @@ -1,65 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.098 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.098 -Problem: ":call s:var()" doesn't work if "s:var" is a Funcref. (Andy Wokula) -Solution: Before converting "s:" into a script ID, check if it is a Funcref. -Files: src/eval.c - - -*** ../vim-7.1.097/src/eval.c Wed Sep 5 21:45:54 2007 ---- src/eval.c Thu Sep 6 12:11:19 2007 -*************** -*** 19367,19372 **** ---- 19367,19394 ---- - if (lv.ll_name == NULL) - { - /* Error found, but continue after the function name. */ -+ *pp = end; -+ goto theend; -+ } -+ -+ /* Check if the name is a Funcref. If so, use the value. */ -+ if (lv.ll_exp_name != NULL) -+ { -+ len = (int)STRLEN(lv.ll_exp_name); -+ name = deref_func_name(lv.ll_exp_name, &len); -+ if (name == lv.ll_exp_name) -+ name = NULL; -+ } -+ else -+ { -+ len = (int)(end - *pp); -+ name = deref_func_name(*pp, &len); -+ if (name == *pp) -+ name = NULL; -+ } -+ if (name != NULL) -+ { -+ name = vim_strsave(name); - *pp = end; - goto theend; - } -*** ../vim-7.1.097/src/version.c Thu Sep 6 13:32:53 2007 ---- src/version.c Thu Sep 6 14:24:10 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 98, - /**/ - --- -Not too long ago, a program was something you watched on TV... - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.099 b/7.1.099 deleted file mode 100644 index 77e02e62..00000000 --- a/7.1.099 +++ /dev/null @@ -1,137 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.099 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.099 -Problem: When the 'keymap' and 'paste' options have a non-default value, - ":mkexrc" and ":mksession" do not correctly set the options. -Solution: Set the options with side effects before other options. -Files: src/option.c - - -*** ../vim-7.1.098/src/option.c Thu Sep 6 13:32:53 2007 ---- src/option.c Wed Sep 5 22:34:27 2007 -*************** -*** 427,432 **** ---- 427,434 ---- - #define P_NOGLOB 0x100000L/* do not use local value for global vimrc */ - #define P_NFNAME 0x200000L/* only normal file name chars allowed */ - #define P_INSECURE 0x400000L/* option was set from a modeline */ -+ #define P_PRI_MKRC 0x800000L/* priority for :mkvimrc (setting option has -+ side effects) */ - - #define ISK_LATIN1 (char_u *)"@,48-57,_,192-255" - -*************** -*** 773,778 **** ---- 775,782 ---- - {(char_u *)0L, (char_u *)0L} - #endif - }, -+ /* P_PRI_MKRC isn't needed here, optval_default() -+ * always returns TRUE for 'compatible' */ - {"compatible", "cp", P_BOOL|P_RALL, - (char_u *)&p_cp, PV_NONE, - {(char_u *)TRUE, (char_u *)FALSE}}, -*************** -*** 1515,1521 **** - {(char_u *)0L, (char_u *)0L} - #endif - }, -! {"keymap", "kmp", P_STRING|P_ALLOCED|P_VI_DEF|P_RBUF|P_RSTAT|P_NFNAME, - #ifdef FEAT_KEYMAP - (char_u *)&p_keymap, PV_KMAP, - {(char_u *)"", (char_u *)0L} ---- 1519,1525 ---- - {(char_u *)0L, (char_u *)0L} - #endif - }, -! {"keymap", "kmp", P_STRING|P_ALLOCED|P_VI_DEF|P_RBUF|P_RSTAT|P_NFNAME|P_PRI_MKRC, - #ifdef FEAT_KEYMAP - (char_u *)&p_keymap, PV_KMAP, - {(char_u *)"", (char_u *)0L} -*************** -*** 1836,1842 **** - {"paragraphs", "para", P_STRING|P_VI_DEF, - (char_u *)&p_para, PV_NONE, - {(char_u *)"IPLPPPQPP LIpplpipbp", (char_u *)0L}}, -! {"paste", NULL, P_BOOL|P_VI_DEF, - (char_u *)&p_paste, PV_NONE, - {(char_u *)FALSE, (char_u *)0L}}, - {"pastetoggle", "pt", P_STRING|P_VI_DEF, ---- 1840,1846 ---- - {"paragraphs", "para", P_STRING|P_VI_DEF, - (char_u *)&p_para, PV_NONE, - {(char_u *)"IPLPPPQPP LIpplpipbp", (char_u *)0L}}, -! {"paste", NULL, P_BOOL|P_VI_DEF|P_PRI_MKRC, - (char_u *)&p_paste, PV_NONE, - {(char_u *)FALSE, (char_u *)0L}}, - {"pastetoggle", "pt", P_STRING|P_VI_DEF, -*************** -*** 8535,8547 **** - char_u *varp_local = NULL; /* fresh value */ - char *cmd; - int round; - - /* - * The options that don't have a default (terminal name, columns, lines) - * are never written. Terminal options are also not written. - */ -! for (p = &options[0]; !istermoption(p); p++) -! if (!(p->flags & P_NO_MKRC) && !istermoption(p)) - { - /* skip global option when only doing locals */ - if (p->indir == PV_NONE && !(opt_flags & OPT_GLOBAL)) ---- 8539,8558 ---- - char_u *varp_local = NULL; /* fresh value */ - char *cmd; - int round; -+ int pri; - - /* - * The options that don't have a default (terminal name, columns, lines) - * are never written. Terminal options are also not written. -+ * Do the loop over "options[]" twice: once for options with the -+ * P_PRI_MKRC flag and once without. - */ -! for (pri = 1; pri >= 0; --pri) -! { -! for (p = &options[0]; !istermoption(p); p++) -! if (!(p->flags & P_NO_MKRC) -! && !istermoption(p) -! && ((pri == 1) == ((p->flags & P_PRI_MKRC) != 0))) - { - /* skip global option when only doing locals */ - if (p->indir == PV_NONE && !(opt_flags & OPT_GLOBAL)) -*************** -*** 8637,8642 **** ---- 8648,8654 ---- - } - } - } -+ } - return OK; - } - -*** ../vim-7.1.098/src/version.c Thu Sep 6 14:25:50 2007 ---- src/version.c Thu Sep 6 16:32:31 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 99, - /**/ - --- -Not too long ago, a keyboard was something to make music with... - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.100 b/7.1.100 deleted file mode 100644 index 86e6fa49..00000000 --- a/7.1.100 +++ /dev/null @@ -1,513 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.100 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.100 -Problem: Win32: Executing cscope doesn't always work properly. -Solution: Use another way to invoke cscope. (Mike Williams) -Files: src/if_cscope.c, src/if_cscope.h, src/main.c, - src/proto/if_cscope.pro - - -*** ../vim-7.1.099/src/if_cscope.c Tue Aug 21 18:02:58 2007 ---- src/if_cscope.c Sun Sep 2 16:50:50 2007 -*************** -*** 24,34 **** - /* not UNIX, must be WIN32 */ - # include "vimio.h" - # include -- # include -- # define STDIN_FILENO 0 -- # define STDOUT_FILENO 1 -- # define STDERR_FILENO 2 -- # define pipe(fds) _pipe(fds, 256, O_TEXT|O_NOINHERIT) - #endif - #include "if_cscope.h" - ---- 24,29 ---- -*************** -*** 65,71 **** - static char * cs_parse_results __ARGS((int cnumber, char *buf, int bufsize, char **context, char **linenumber, char **search)); - static char * cs_pathcomponents __ARGS((char *path)); - static void cs_print_tags_priv __ARGS((char **, char **, int)); -! static int cs_read_prompt __ARGS((int )); - static void cs_release_csp __ARGS((int, int freefnpp)); - static int cs_reset __ARGS((exarg_T *eap)); - static char * cs_resolve_file __ARGS((int, char *)); ---- 60,66 ---- - static char * cs_parse_results __ARGS((int cnumber, char *buf, int bufsize, char **context, char **linenumber, char **search)); - static char * cs_pathcomponents __ARGS((char *path)); - static void cs_print_tags_priv __ARGS((char **, char **, int)); -! static int cs_read_prompt __ARGS((int)); - static void cs_release_csp __ARGS((int, int freefnpp)); - static int cs_reset __ARGS((exarg_T *eap)); - static char * cs_resolve_file __ARGS((int, char *)); -*************** -*** 504,510 **** - #if defined(UNIX) - else if (S_ISREG(statbuf.st_mode) || S_ISLNK(statbuf.st_mode)) - #else -! /* substitute define S_ISREG from os_unix.h */ - else if (((statbuf.st_mode) & S_IFMT) == S_IFREG) - #endif - { ---- 499,505 ---- - #if defined(UNIX) - else if (S_ISREG(statbuf.st_mode) || S_ISLNK(statbuf.st_mode)) - #else -! /* WIN32 - substitute define S_ISREG from os_unix.h */ - else if (((statbuf.st_mode) & S_IFMT) == S_IFREG) - #endif - { -*************** -*** 717,733 **** - cs_create_connection(i) - int i; - { -! int to_cs[2], from_cs[2], len; -! char *prog, *cmd, *ppath = NULL; -! #ifndef UNIX -! int in_save, out_save, err_save; -! long_i ph; -! # ifdef FEAT_GUI -! HWND activewnd = NULL; -! HWND consolewnd = NULL; -! # endif - #endif - - /* - * Cscope reads from to_cs[0] and writes to from_cs[1]; vi reads from - * from_cs[0] and writes to to_cs[1]. ---- 712,734 ---- - cs_create_connection(i) - int i; - { -! #ifdef UNIX -! int to_cs[2], from_cs[2]; -! #endif -! int len; -! char *prog, *cmd, *ppath = NULL; -! #ifdef WIN32 -! int fd; -! SECURITY_ATTRIBUTES sa; -! PROCESS_INFORMATION pi; -! STARTUPINFO si; -! BOOL pipe_stdin = FALSE, pipe_stdout = FALSE; -! HANDLE stdin_rd, stdout_rd; -! HANDLE stdout_wr, stdin_wr; -! BOOL created; - #endif - -+ #if defined(UNIX) - /* - * Cscope reads from to_cs[0] and writes to from_cs[1]; vi reads from - * from_cs[0] and writes to to_cs[1]. -*************** -*** 748,765 **** - return CSCOPE_FAILURE; - } - -- #if defined(UNIX) - switch (csinfo[i].pid = fork()) - { - case -1: - (void)EMSG(_("E622: Could not fork for cscope")); - goto err_closing; - case 0: /* child: run cscope. */ -- #else -- in_save = dup(STDIN_FILENO); -- out_save = dup(STDOUT_FILENO); -- err_save = dup(STDERR_FILENO); -- #endif - if (dup2(to_cs[0], STDIN_FILENO) == -1) - PERROR("cs_create_connection 1"); - if (dup2(from_cs[1], STDOUT_FILENO) == -1) ---- 749,760 ---- -*************** -*** 768,782 **** - PERROR("cs_create_connection 3"); - - /* close unused */ -- #if defined(UNIX) - (void)close(to_cs[1]); - (void)close(from_cs[0]); - #else -! /* On win32 we must close opposite ends because we are the parent */ -! (void)close(to_cs[0]); -! to_cs[0] = -1; -! (void)close(from_cs[1]); -! from_cs[1] = -1; - #endif - /* expand the cscope exec for env var's */ - if ((prog = (char *)alloc(MAXPATHL + 1)) == NULL) ---- 763,794 ---- - PERROR("cs_create_connection 3"); - - /* close unused */ - (void)close(to_cs[1]); - (void)close(from_cs[0]); - #else -! /* WIN32 */ -! /* Create pipes to communicate with cscope */ -! sa.nLength = sizeof(SECURITY_ATTRIBUTES); -! sa.bInheritHandle = TRUE; -! sa.lpSecurityDescriptor = NULL; -! -! if (!(pipe_stdin = CreatePipe(&stdin_rd, &stdin_wr, &sa, 0)) -! || !(pipe_stdout = CreatePipe(&stdout_rd, &stdout_wr, &sa, 0))) -! { -! (void)EMSG(_("E566: Could not create cscope pipes")); -! err_closing: -! if (pipe_stdin) -! { -! CloseHandle(stdin_rd); -! CloseHandle(stdin_wr); -! } -! if (pipe_stdout) -! { -! CloseHandle(stdout_rd); -! CloseHandle(stdout_wr); -! } -! return CSCOPE_FAILURE; -! } - #endif - /* expand the cscope exec for env var's */ - if ((prog = (char *)alloc(MAXPATHL + 1)) == NULL) -*************** -*** 784,789 **** ---- 796,802 ---- - #ifdef UNIX - return CSCOPE_FAILURE; - #else -+ /* WIN32 */ - goto err_closing; - #endif - } -*************** -*** 800,805 **** ---- 813,819 ---- - #ifdef UNIX - return CSCOPE_FAILURE; - #else -+ /* WIN32 */ - goto err_closing; - #endif - } -*************** -*** 818,823 **** ---- 832,838 ---- - #ifdef UNIX - return CSCOPE_FAILURE; - #else -+ /* WIN32 */ - goto err_closing; - #endif - } -*************** -*** 826,831 **** ---- 841,847 ---- - #if defined(UNIX) - (void)sprintf(cmd, "exec %s -dl -f %s", prog, csinfo[i].fname); - #else -+ /* WIN32 */ - (void)sprintf(cmd, "%s -dl -f %s", prog, csinfo[i].fname); - #endif - if (csinfo[i].ppath != NULL) -*************** -*** 851,910 **** - exit(127); - /* NOTREACHED */ - default: /* parent. */ -- #else -- # ifdef FEAT_GUI -- activewnd = GetForegroundWindow(); /* on win9x cscope steals focus */ -- /* Dirty hack to hide annoying console window */ -- if (AllocConsole()) -- { -- char *title; -- title = (char *)alloc(1024); -- if (title == NULL) -- FreeConsole(); -- else -- { -- GetConsoleTitle(title, 1024); /* save for future restore */ -- SetConsoleTitle( -- "GVIMCS{5499421B-CBEF-45b0-85EF-38167FDEA5C5}GVIMCS"); -- Sleep(40); /* as stated in MS KB we must wait 40 ms */ -- consolewnd = FindWindow(NULL, -- "GVIMCS{5499421B-CBEF-45b0-85EF-38167FDEA5C5}GVIMCS"); -- if (consolewnd != NULL) -- ShowWindow(consolewnd, SW_HIDE); -- SetConsoleTitle(title); -- vim_free(title); -- } -- } -- # endif -- /* May be use &shell, &shellquote etc */ -- # ifdef __BORLANDC__ -- /* BCC 5.5 uses a different function name for spawnlp */ -- ph = (long_i)spawnlp(P_NOWAIT, prog, cmd, NULL); -- # else -- ph = (long_i)_spawnlp(_P_NOWAIT, prog, cmd, NULL); -- # endif -- vim_free(prog); -- vim_free(cmd); -- # ifdef FEAT_GUI -- /* Dirty hack part two */ -- if (activewnd != NULL) -- /* restoring focus */ -- SetForegroundWindow(activewnd); -- if (consolewnd != NULL) -- FreeConsole(); -- -- # endif -- if (ph == -1) -- { -- PERROR(_("cs_create_connection exec failed")); -- (void)EMSG(_("E623: Could not spawn cscope process")); -- goto err_closing; -- } -- /* else */ -- csinfo[i].pid = 0; -- csinfo[i].hProc = (HANDLE)ph; -- -- #endif /* !UNIX */ - /* - * Save the file descriptors for later duplication, and - * reopen as streams. ---- 867,872 ---- -*************** -*** 914,935 **** - if ((csinfo[i].fr_fp = fdopen(from_cs[0], "r")) == NULL) - PERROR(_("cs_create_connection: fdopen for fr_fp failed")); - -- #if defined(UNIX) - /* close unused */ - (void)close(to_cs[0]); - (void)close(from_cs[1]); - - break; - } - #else -! /* restore stdhandles */ -! dup2(in_save, STDIN_FILENO); -! dup2(out_save, STDOUT_FILENO); -! dup2(err_save, STDERR_FILENO); -! close(in_save); -! close(out_save); -! close(err_save); -! #endif - return CSCOPE_SUCCESS; - } /* cs_create_connection */ - ---- 876,927 ---- - if ((csinfo[i].fr_fp = fdopen(from_cs[0], "r")) == NULL) - PERROR(_("cs_create_connection: fdopen for fr_fp failed")); - - /* close unused */ - (void)close(to_cs[0]); - (void)close(from_cs[1]); - - break; - } -+ - #else -! /* WIN32 */ -! /* Create a new process to run cscope and use pipes to talk with it */ -! GetStartupInfo(&si); -! si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; -! si.wShowWindow = SW_HIDE; /* Hide child application window */ -! si.hStdOutput = stdout_wr; -! si.hStdError = stdout_wr; -! si.hStdInput = stdin_rd; -! created = CreateProcess(NULL, cmd, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, -! NULL, NULL, &si, &pi); -! vim_free(prog); -! vim_free(cmd); -! -! if (!created) -! { -! PERROR(_("cs_create_connection exec failed")); -! (void)EMSG(_("E623: Could not spawn cscope process")); -! goto err_closing; -! } -! /* else */ -! csinfo[i].pid = pi.dwProcessId; -! csinfo[i].hProc = pi.hProcess; -! CloseHandle(pi.hThread); -! -! /* TODO - tidy up after failure to create files on pipe handles. */ -! if (((fd = _open_osfhandle((intptr_t)stdin_wr, _O_TEXT|_O_APPEND)) < 0) -! || ((csinfo[i].to_fp = _fdopen(fd, "w")) == NULL)) -! PERROR(_("cs_create_connection: fdopen for to_fp failed")); -! if (((fd = _open_osfhandle((intptr_t)stdout_rd, _O_TEXT|_O_RDONLY)) < 0) -! || ((csinfo[i].fr_fp = _fdopen(fd, "r")) == NULL)) -! PERROR(_("cs_create_connection: fdopen for fr_fp failed")); -! -! /* Close handles for file descriptors inherited by the cscope process */ -! CloseHandle(stdin_rd); -! CloseHandle(stdout_wr); -! -! #endif /* !UNIX */ -! - return CSCOPE_SUCCESS; - } /* cs_create_connection */ - -*************** -*** 2097,2104 **** - /* - * PRIVATE: cs_release_csp - * -! * does the actual free'ing for the cs ptr with an optional flag of whether -! * or not to free the filename. called by cs_kill and cs_reset. - */ - static void - cs_release_csp(i, freefnpp) ---- 2089,2096 ---- - /* - * PRIVATE: cs_release_csp - * -! * Does the actual free'ing for the cs ptr with an optional flag of whether -! * or not to free the filename. Called by cs_kill and cs_reset. - */ - static void - cs_release_csp(i, freefnpp) -*************** -*** 2116,2125 **** - (void)fputs("q\n", csinfo[i].to_fp); - (void)fflush(csinfo[i].to_fp); - } -! /* give cscope chance to exit normally */ -! if (csinfo[i].hProc != NULL -! && WaitForSingleObject(csinfo[i].hProc, 1000) == WAIT_TIMEOUT) -! TerminateProcess(csinfo[i].hProc, 0); - #endif - - if (csinfo[i].fr_fp != NULL) ---- 2108,2120 ---- - (void)fputs("q\n", csinfo[i].to_fp); - (void)fflush(csinfo[i].to_fp); - } -! if (csinfo[i].hProc != NULL) -! { -! /* Give cscope a chance to exit normally */ -! if (WaitForSingleObject(csinfo[i].hProc, 1000) == WAIT_TIMEOUT) -! TerminateProcess(csinfo[i].hProc, 0); -! CloseHandle(csinfo[i].hProc); -! } - #endif - - if (csinfo[i].fr_fp != NULL) -*************** -*** 2301,2306 **** ---- 2296,2316 ---- - wait_return(TRUE); - return CSCOPE_SUCCESS; - } /* cs_show */ -+ -+ -+ /* -+ * PUBLIC: cs_end -+ * -+ * Only called when VIM exits to quit any cscope sessions. -+ */ -+ void -+ cs_end() -+ { -+ int i; -+ -+ for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ cs_release_csp(i, TRUE); -+ } - - #endif /* FEAT_CSCOPE */ - -*** ../vim-7.1.099/src/if_cscope.h Thu Jun 30 23:59:58 2005 ---- src/if_cscope.h Sun Sep 2 16:51:08 2007 -*************** -*** 72,78 **** - ino_t st_ino; /* inode number of cscope db */ - #else - # if defined(WIN32) -! int pid; /* Can't get pid so set it to 0 ;) */ - HANDLE hProc; /* cscope process handle */ - DWORD nVolume; /* Volume serial number, instead of st_dev */ - DWORD nIndexHigh; /* st_ino has no meaning in the Windows */ ---- 72,78 ---- - ino_t st_ino; /* inode number of cscope db */ - #else - # if defined(WIN32) -! DWORD pid; /* PID of the connected cscope process. */ - HANDLE hProc; /* cscope process handle */ - DWORD nVolume; /* Volume serial number, instead of st_dev */ - DWORD nIndexHigh; /* st_ino has no meaning in the Windows */ -*** ../vim-7.1.099/src/main.c Thu Aug 30 12:24:21 2007 ---- src/main.c Sun Sep 2 16:44:36 2007 -*************** -*** 1331,1336 **** ---- 1331,1339 ---- - #ifdef FEAT_NETBEANS_INTG - netbeans_end(); - #endif -+ #ifdef FEAT_CSCOPE -+ cs_end(); -+ #endif - - mch_exit(exitval); - } -*************** -*** 3671,3677 **** - mainerr_arg_missing((char_u *)filev[-1]); - if (mch_dirname(cwd, MAXPATHL) != OK) - return NULL; -! if ((p = vim_strsave_escaped_ext(cwd, PATH_ESC_CHARS, '\\', TRUE)) == NULL) - return NULL; - ga_init2(&ga, 1, 100); - ga_concat(&ga, (char_u *)":cd "); ---- 3674,3686 ---- - mainerr_arg_missing((char_u *)filev[-1]); - if (mch_dirname(cwd, MAXPATHL) != OK) - return NULL; -! if ((p = vim_strsave_escaped_ext(cwd, -! #ifdef BACKSLASH_IN_FILENAME -! "", /* rem_backslash() will tell what chars to escape */ -! #else -! PATH_ESC_CHARS, -! #endif -! '\\', TRUE)) == NULL) - return NULL; - ga_init2(&ga, 1, 100); - ga_concat(&ga, (char_u *)":cd "); -*** ../vim-7.1.099/src/proto/if_cscope.pro Sat May 5 19:15:39 2007 ---- src/proto/if_cscope.pro Sun Sep 2 16:51:34 2007 -*************** -*** 6,9 **** ---- 6,10 ---- - void cs_free_tags __ARGS((void)); - void cs_print_tags __ARGS((void)); - int cs_connection __ARGS((int num, char_u *dbpath, char_u *ppath)); -+ void cs_end __ARGS((void)); - /* vim: set ft=c : */ -*** ../vim-7.1.099/src/version.c Thu Sep 6 16:33:47 2007 ---- src/version.c Thu Sep 6 17:27:51 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 100, - /**/ - --- -I have to exercise early in the morning before my brain -figures out what I'm doing. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.101 b/7.1.101 deleted file mode 100644 index 65ea8c62..00000000 --- a/7.1.101 +++ /dev/null @@ -1,53 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.101 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.101 -Problem: Ruby: The Buffer.line= method does not work. -Solution: Add the "self" argument to set_current_line(). (Jonathan Hankins) -Files: src/if_ruby.c - - -*** ../vim-7.1.100/src/if_ruby.c Sat May 12 15:01:49 2007 ---- src/if_ruby.c Mon Sep 10 10:40:38 2007 -*************** -*** 789,795 **** - return get_buffer_line(curbuf, curwin->w_cursor.lnum); - } - -! static VALUE set_current_line(VALUE str) - { - return set_buffer_line(curbuf, curwin->w_cursor.lnum, str); - } ---- 789,795 ---- - return get_buffer_line(curbuf, curwin->w_cursor.lnum); - } - -! static VALUE set_current_line(VALUE self, VALUE str) - { - return set_buffer_line(curbuf, curwin->w_cursor.lnum, str); - } -*** ../vim-7.1.100/src/version.c Thu Sep 6 17:38:06 2007 ---- src/version.c Thu Sep 13 14:59:47 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 101, - /**/ - --- -The question is: What do you do with your life? -The wrong answer is: Become the richest guy in the graveyard. - (billionaire and Oracle founder Larry Ellison) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.102 b/7.1.102 deleted file mode 100644 index 5f58d85d..00000000 --- a/7.1.102 +++ /dev/null @@ -1,103 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.102 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.102 -Problem: Perl interface doesn't compile with new version of Perl. -Solution: Add two variables to the dynamic library loading. (Suresh - Govindachar) -Files: src/if_perl.xs - - -*** ../vim-7.1.101/src/if_perl.xs Wed Aug 16 19:33:57 2006 ---- src/if_perl.xs Wed Sep 5 22:00:36 2007 -*************** -*** 40,45 **** ---- 40,65 ---- - # define PERL_SUBVERSION SUBVERSION - #endif - -+ /* -+ * Quoting Jan Dubois of Active State: -+ * ActivePerl build 822 still identifies itself as 5.8.8 but already -+ * contains many of the changes from the upcoming Perl 5.8.9 release. -+ * -+ * The changes include addition of two symbols (Perl_sv_2iv_flags, -+ * Perl_newXS_flags) not present in earlier releases. -+ * -+ * Jan Dubois suggested the following guarding scheme: -+ */ -+ #if (ACTIVEPERL_VERSION >= 822) -+ # define PERL589_OR_LATER -+ #endif -+ #if (PERL_REVISION == 5) && (PERL_VERSION == 8) && (PERL_SUBVERSION >= 9) -+ # define PERL589_OR_LATER -+ #endif -+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 9) -+ # define PERL589_OR_LATER -+ #endif -+ - #ifndef pTHX - # define pTHX void - # define pTHX_ -*************** -*** 109,114 **** ---- 129,138 ---- - # else - # define Perl_sv_catpvn dll_Perl_sv_catpvn - # endif -+ #ifdef PERL589_OR_LATER -+ # define Perl_sv_2iv_flags dll_Perl_sv_2iv_flags -+ # define Perl_newXS_flags dll_Perl_newXS_flags -+ #endif - # define Perl_sv_free dll_Perl_sv_free - # define Perl_sv_isa dll_Perl_sv_isa - # define Perl_sv_magic dll_Perl_sv_magic -*************** -*** 192,197 **** ---- 216,225 ---- - #else - static void (*Perl_sv_catpvn)(pTHX_ SV*, const char*, STRLEN); - #endif -+ #ifdef PERL589_OR_LATER -+ static IV (*Perl_sv_2iv_flags)(pTHX_ SV* sv, I32 flags); -+ static CV * (*Perl_newXS_flags)(pTHX_ const char *name, XSUBADDR_t subaddr, const char *const filename, const char *const proto, U32 flags); -+ #endif - static void (*Perl_sv_free)(pTHX_ SV*); - static int (*Perl_sv_isa)(pTHX_ SV*, const char*); - static void (*Perl_sv_magic)(pTHX_ SV*, SV*, int, const char*, I32); -*************** -*** 266,271 **** ---- 294,303 ---- - {"Perl_sv_2pv_nolen", (PERL_PROC*)&Perl_sv_2pv_nolen}, - #else - {"Perl_sv_2pv", (PERL_PROC*)&Perl_sv_2pv}, -+ #endif -+ #ifdef PERL589_OR_LATER -+ {"Perl_sv_2iv_flags", (PERL_PROC*)&Perl_sv_2iv_flags}, -+ {"Perl_newXS_flags", (PERL_PROC*)&Perl_newXS_flags}, - #endif - {"Perl_sv_bless", (PERL_PROC*)&Perl_sv_bless}, - #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) -*** ../vim-7.1.101/src/version.c Thu Sep 13 15:00:28 2007 ---- src/version.c Thu Sep 13 15:18:36 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 102, - /**/ - --- -Witches prefer brooms: vacuum-cleaners need extension cords! - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.103 b/7.1.103 deleted file mode 100644 index 9c391165..00000000 --- a/7.1.103 +++ /dev/null @@ -1,57 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.103 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.103 -Problem: Using "dw" with the cursor past the end of the last line (using - CTRL-\ CTRL-O from Insert mode) deletes a character. (Tim Chase) -Solution: Don't move the cursor back when the movement failed. -Files: src/normal.c - - -*** ../vim-7.1.102/src/normal.c Tue Aug 14 22:54:00 2007 ---- src/normal.c Tue Sep 11 19:32:42 2007 -*************** -*** 8364,8370 **** - n = fwd_word(cap->count1, cap->arg, cap->oap->op_type != OP_NOP); - - /* Don't leave the cursor on the NUL past a line */ -! if (curwin->w_cursor.col && gchar_cursor() == NUL) - { - --curwin->w_cursor.col; - cap->oap->inclusive = TRUE; ---- 8364,8370 ---- - n = fwd_word(cap->count1, cap->arg, cap->oap->op_type != OP_NOP); - - /* Don't leave the cursor on the NUL past a line */ -! if (n != FAIL && curwin->w_cursor.col > 0 && gchar_cursor() == NUL) - { - --curwin->w_cursor.col; - cap->oap->inclusive = TRUE; -*** ../vim-7.1.102/src/version.c Thu Sep 13 15:19:32 2007 ---- src/version.c Thu Sep 13 15:32:05 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 103, - /**/ - --- -ARTHUR: Then who is your lord? -WOMAN: We don't have a lord. -ARTHUR: What? -DENNIS: I told you. We're an anarcho-syndicalist commune. We take it in - turns to act as a sort of executive officer for the week. - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.104 b/7.1.104 deleted file mode 100644 index 2c330f89..00000000 --- a/7.1.104 +++ /dev/null @@ -1,538 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.104 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.104 (after 7.1.095) -Problem: When 'lazyredraw' is set a focus event causes redraw to be - postponed until a key is pressed. -Solution: Instead of not returning from vgetc() when a focus event is - encountered return K_IGNORE. Add plain_vgetc() for when the - caller doesn't want to get K_IGNORE. -Files: src/digraph.c, src/edit.c, src/ex_cmds.c, src/ex_getln.c, - src/getchar.c, src/normal.c, src/proto/getchar.pro, src/window.c - - -*** ../vim-7.1.103/src/digraph.c Sat Jul 7 13:57:39 2007 ---- src/digraph.c Thu Sep 13 16:11:54 2007 -*************** -*** 2028,2034 **** - - ++no_mapping; - ++allow_keys; -! c = safe_vgetc(); - --no_mapping; - --allow_keys; - if (c != ESC) /* ESC cancels CTRL-K */ ---- 2028,2034 ---- - - ++no_mapping; - ++allow_keys; -! c = plain_vgetc(); - --no_mapping; - --allow_keys; - if (c != ESC) /* ESC cancels CTRL-K */ -*************** -*** 2050,2056 **** - #endif - ++no_mapping; - ++allow_keys; -! cc = safe_vgetc(); - --no_mapping; - --allow_keys; - if (cc != ESC) /* ESC cancels CTRL-K */ ---- 2050,2056 ---- - #endif - ++no_mapping; - ++allow_keys; -! cc = plain_vgetc(); - --no_mapping; - --allow_keys; - if (cc != ESC) /* ESC cancels CTRL-K */ -*************** -*** 2350,2356 **** - if (*curbuf->b_p_keymap == NUL) - { - /* Stop any active keymap and clear the table. Also remove -! * b:keymap_unload, as no keymap is active now. */ - keymap_unload(); - do_cmdline_cmd((char_u *)"unlet! b:keymap_name"); - } ---- 2350,2356 ---- - if (*curbuf->b_p_keymap == NUL) - { - /* Stop any active keymap and clear the table. Also remove -! * b:keymap_name, as no keymap is active now. */ - keymap_unload(); - do_cmdline_cmd((char_u *)"unlet! b:keymap_name"); - } -*** ../vim-7.1.103/src/edit.c Sun Aug 12 16:38:03 2007 ---- src/edit.c Thu Sep 13 16:17:54 2007 -*************** -*** 788,794 **** - ins_redraw(FALSE); - ++no_mapping; - ++allow_keys; -! c = safe_vgetc(); - --no_mapping; - --allow_keys; - if (c != Ctrl_N && c != Ctrl_G && c != Ctrl_O) ---- 788,794 ---- - ins_redraw(FALSE); - ++no_mapping; - ++allow_keys; -! c = plain_vgetc(); - --no_mapping; - --allow_keys; - if (c != Ctrl_N && c != Ctrl_G && c != Ctrl_O) -*************** -*** 981,987 **** - #ifdef FEAT_NETBEANS_INTG - case K_F21: /* NetBeans command */ - ++no_mapping; /* don't map the next key hits */ -! i = safe_vgetc(); - --no_mapping; - netbeans_keycommand(i); - break; ---- 981,987 ---- - #ifdef FEAT_NETBEANS_INTG - case K_F21: /* NetBeans command */ - ++no_mapping; /* don't map the next key hits */ -! i = plain_vgetc(); - --no_mapping; - netbeans_keycommand(i); - break; -*************** -*** 5224,5233 **** - i = 0; - for (;;) - { -! do -! nc = safe_vgetc(); -! while (nc == K_IGNORE || nc == K_VER_SCROLLBAR -! || nc == K_HOR_SCROLLBAR); - #ifdef FEAT_CMDL_INFO - if (!(State & CMDLINE) - # ifdef FEAT_MBYTE ---- 5224,5230 ---- - i = 0; - for (;;) - { -! nc = plain_vgetc(); - #ifdef FEAT_CMDL_INFO - if (!(State & CMDLINE) - # ifdef FEAT_MBYTE -*************** -*** 7575,7581 **** - * deleted when ESC is hit. - */ - ++no_mapping; -! regname = safe_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(regname, TRUE); - #endif ---- 7572,7578 ---- - * deleted when ESC is hit. - */ - ++no_mapping; -! regname = plain_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(regname, TRUE); - #endif -*************** -*** 7586,7592 **** - #ifdef FEAT_CMDL_INFO - add_to_showcmd_c(literally); - #endif -! regname = safe_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(regname, TRUE); - #endif ---- 7583,7589 ---- - #ifdef FEAT_CMDL_INFO - add_to_showcmd_c(literally); - #endif -! regname = plain_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(regname, TRUE); - #endif -*************** -*** 7677,7683 **** - * deleted when ESC is hit. - */ - ++no_mapping; -! c = safe_vgetc(); - --no_mapping; - switch (c) - { ---- 7674,7680 ---- - * deleted when ESC is hit. - */ - ++no_mapping; -! c = plain_vgetc(); - --no_mapping; - switch (c) - { -*************** -*** 9356,9362 **** - * mode message to be deleted when ESC is hit */ - ++no_mapping; - ++allow_keys; -! c = safe_vgetc(); - --no_mapping; - --allow_keys; - if (IS_SPECIAL(c) || mod_mask) /* special key */ ---- 9353,9359 ---- - * mode message to be deleted when ESC is hit */ - ++no_mapping; - ++allow_keys; -! c = plain_vgetc(); - --no_mapping; - --allow_keys; - if (IS_SPECIAL(c) || mod_mask) /* special key */ -*************** -*** 9388,9394 **** - } - ++no_mapping; - ++allow_keys; -! cc = safe_vgetc(); - --no_mapping; - --allow_keys; - if (cc != ESC) ---- 9385,9391 ---- - } - ++no_mapping; - ++allow_keys; -! cc = plain_vgetc(); - --no_mapping; - --allow_keys; - if (cc != ESC) -*** ../vim-7.1.103/src/ex_cmds.c Tue Aug 21 15:28:32 2007 ---- src/ex_cmds.c Thu Sep 13 16:19:40 2007 -*************** -*** 4498,4504 **** - * - * The new text is built up in new_start[]. It has some extra - * room to avoid using alloc()/free() too often. new_start_len is -! * the lenght of the allocated memory at new_start. - * - * Make a copy of the old line, so it won't be taken away when - * updating the screen or handling a multi-line match. The "old_" ---- 4499,4505 ---- - * - * The new text is built up in new_start[]. It has some extra - * room to avoid using alloc()/free() too often. new_start_len is -! * the length of the allocated memory at new_start. - * - * Make a copy of the old line, so it won't be taken away when - * updating the screen or handling a multi-line match. The "old_" -*************** -*** 4669,4675 **** - #endif - ++no_mapping; /* don't map this key */ - ++allow_keys; /* allow special keys */ -! i = safe_vgetc(); - --allow_keys; - --no_mapping; - ---- 4670,4676 ---- - #endif - ++no_mapping; /* don't map this key */ - ++allow_keys; /* allow special keys */ -! i = plain_vgetc(); - --allow_keys; - --no_mapping; - -*** ../vim-7.1.103/src/ex_getln.c Mon Aug 6 22:27:12 2007 ---- src/ex_getln.c Thu Sep 13 16:20:49 2007 -*************** -*** 641,647 **** - { - ++no_mapping; - ++allow_keys; -! c = safe_vgetc(); - --no_mapping; - --allow_keys; - /* CTRL-\ e doesn't work when obtaining an expression. */ ---- 641,647 ---- - { - ++no_mapping; - ++allow_keys; -! c = plain_vgetc(); - --no_mapping; - --allow_keys; - /* CTRL-\ e doesn't work when obtaining an expression. */ -*************** -*** 1091,1101 **** - #endif - putcmdline('"', TRUE); - ++no_mapping; -! i = c = safe_vgetc(); /* CTRL-R */ - if (i == Ctrl_O) - i = Ctrl_R; /* CTRL-R CTRL-O == CTRL-R CTRL-R */ - if (i == Ctrl_R) -! c = safe_vgetc(); /* CTRL-R CTRL-R */ - --no_mapping; - #ifdef FEAT_EVAL - /* ---- 1091,1101 ---- - #endif - putcmdline('"', TRUE); - ++no_mapping; -! i = c = plain_vgetc(); /* CTRL-R */ - if (i == Ctrl_O) - i = Ctrl_R; /* CTRL-R CTRL-O == CTRL-R CTRL-R */ - if (i == Ctrl_R) -! c = plain_vgetc(); /* CTRL-R CTRL-R */ - --no_mapping; - #ifdef FEAT_EVAL - /* -*** ../vim-7.1.103/src/getchar.c Wed Sep 5 21:45:54 2007 ---- src/getchar.c Thu Sep 13 16:16:53 2007 -*************** -*** 1597,1608 **** - } - #endif - #ifdef FEAT_GUI -! /* The caller doesn't need to know that the focus event is delayed -! * until getting a character. */ - if (c == K_FOCUSGAINED || c == K_FOCUSLOST) - { - ui_focus_change(c == K_FOCUSGAINED); -! continue; - } - - /* Translate K_CSI to CSI. The special key is only used to avoid ---- 1597,1609 ---- - } - #endif - #ifdef FEAT_GUI -! /* Handle focus event here, so that the caller doesn't need to -! * know about it. Return K_IGNORE so that we loop once (needed if -! * 'lazyredraw' is set). */ - if (c == K_FOCUSGAINED || c == K_FOCUSLOST) - { - ui_focus_change(c == K_FOCUSGAINED); -! c = K_IGNORE; - } - - /* Translate K_CSI to CSI. The special key is only used to avoid -*************** -*** 1744,1749 **** ---- 1745,1766 ---- - c = vgetc(); - if (c == NUL) - c = get_keystroke(); -+ return c; -+ } -+ -+ /* -+ * Like safe_vgetc(), but loop to handle K_IGNORE. -+ * Also ignore scrollbar events. -+ */ -+ int -+ plain_vgetc() -+ { -+ int c; -+ -+ do -+ { -+ c = safe_vgetc(); -+ } while (c == K_IGNORE || c == K_VER_SCROLLBAR || c == K_HOR_SCROLLBAR); - return c; - } - -*** ../vim-7.1.103/src/normal.c Thu Sep 13 15:33:18 2007 ---- src/normal.c Thu Sep 13 16:24:51 2007 -*************** -*** 696,702 **** - ++allow_keys; /* no mapping for nchar, but keys */ - } - ++no_zero_mapping; /* don't map zero here */ -! c = safe_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(c, TRUE); - #endif ---- 696,702 ---- - ++allow_keys; /* no mapping for nchar, but keys */ - } - ++no_zero_mapping; /* don't map zero here */ -! c = plain_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(c, TRUE); - #endif -*************** -*** 721,727 **** - ca.count0 = 0; - ++no_mapping; - ++allow_keys; /* no mapping for nchar, but keys */ -! c = safe_vgetc(); /* get next character */ - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(c, TRUE); - #endif ---- 721,727 ---- - ca.count0 = 0; - ++no_mapping; - ++allow_keys; /* no mapping for nchar, but keys */ -! c = plain_vgetc(); /* get next character */ - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(c, TRUE); - #endif -*************** -*** 900,906 **** - * For 'g' get the next character now, so that we can check for - * "gr", "g'" and "g`". - */ -! ca.nchar = safe_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(ca.nchar, TRUE); - #endif ---- 900,906 ---- - * For 'g' get the next character now, so that we can check for - * "gr", "g'" and "g`". - */ -! ca.nchar = plain_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(ca.nchar, TRUE); - #endif -*************** -*** 957,963 **** - im_set_active(TRUE); - #endif - -! *cp = safe_vgetc(); - - if (langmap_active) - { ---- 957,963 ---- - im_set_active(TRUE); - #endif - -! *cp = plain_vgetc(); - - if (langmap_active) - { -*************** -*** 1045,1051 **** - } - if (c > 0) - { -! c = safe_vgetc(); - if (c != Ctrl_N && c != Ctrl_G) - vungetc(c); - else ---- 1045,1051 ---- - } - if (c > 0) - { -! c = plain_vgetc(); - if (c != Ctrl_N && c != Ctrl_G) - vungetc(c); - else -*************** -*** 1064,1070 **** - while (enc_utf8 && lang && (c = vpeekc()) > 0 - && (c >= 0x100 || MB_BYTE2LEN(vpeekc()) > 1)) - { -! c = safe_vgetc(); - if (!utf_iscomposing(c)) - { - vungetc(c); /* it wasn't, put it back */ ---- 1064,1070 ---- - while (enc_utf8 && lang && (c = vpeekc()) > 0 - && (c >= 0x100 || MB_BYTE2LEN(vpeekc()) > 1)) - { -! c = plain_vgetc(); - if (!utf_iscomposing(c)) - { - vungetc(c); /* it wasn't, put it back */ -*************** -*** 4564,4570 **** - #endif - ++no_mapping; - ++allow_keys; /* no mapping for nchar, but allow key codes */ -! nchar = safe_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(nchar, TRUE); - #endif ---- 4564,4570 ---- - #endif - ++no_mapping; - ++allow_keys; /* no mapping for nchar, but allow key codes */ -! nchar = plain_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(nchar, TRUE); - #endif -*************** -*** 4922,4928 **** - case 'u': /* "zug" and "zuw": undo "zg" and "zw" */ - ++no_mapping; - ++allow_keys; /* no mapping for nchar, but allow key codes */ -! nchar = safe_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(nchar, TRUE); - #endif ---- 4922,4928 ---- - case 'u': /* "zug" and "zuw": undo "zg" and "zw" */ - ++no_mapping; - ++allow_keys; /* no mapping for nchar, but allow key codes */ -! nchar = plain_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(nchar, TRUE); - #endif -*** ../vim-7.1.103/src/proto/getchar.pro Sun May 6 15:04:24 2007 ---- src/proto/getchar.pro Thu Sep 13 16:13:19 2007 -*************** -*** 38,43 **** ---- 38,44 ---- - void updatescript __ARGS((int c)); - int vgetc __ARGS((void)); - int safe_vgetc __ARGS((void)); -+ int plain_vgetc __ARGS((void)); - int vpeekc __ARGS((void)); - int vpeekc_nomap __ARGS((void)); - int vpeekc_any __ARGS((void)); -*** ../vim-7.1.103/src/window.c Sun Aug 12 16:55:01 2007 ---- src/window.c Thu Sep 13 16:25:01 2007 -*************** -*** 584,590 **** - ++no_mapping; - ++allow_keys; /* no mapping for xchar, but allow key codes */ - if (xchar == NUL) -! xchar = safe_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(xchar, TRUE); - #endif ---- 584,590 ---- - ++no_mapping; - ++allow_keys; /* no mapping for xchar, but allow key codes */ - if (xchar == NUL) -! xchar = plain_vgetc(); - #ifdef FEAT_LANGMAP - LANGMAP_ADJUST(xchar, TRUE); - #endif -*** ../vim-7.1.103/src/version.c Thu Sep 13 15:33:18 2007 ---- src/version.c Thu Sep 13 18:22:59 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 104, - /**/ - --- -ARTHUR: I am your king! -WOMAN: Well, I didn't vote for you. -ARTHUR: You don't vote for kings. -WOMAN: Well, 'ow did you become king then? - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.105 b/7.1.105 deleted file mode 100644 index 34b6aad3..00000000 --- a/7.1.105 +++ /dev/null @@ -1,86 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.105 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.105 -Problem: Internal error when using "0 ? {'a': 1} : {}". (A.Politz) -Solution: When parsing a dictionary value without using the value, don't try - obtaining the key name. -Files: src/eval.c - - -*** ../vim-7.1.104/src/eval.c Thu Sep 6 14:25:50 2007 ---- src/eval.c Thu Sep 13 20:29:31 2007 -*************** -*** 6746,6765 **** - clear_tv(&tvkey); - goto failret; - } -! key = get_tv_string_buf_chk(&tvkey, buf); -! if (key == NULL || *key == NUL) - { -! /* "key" is NULL when get_tv_string_buf_chk() gave an errmsg */ -! if (key != NULL) -! EMSG(_(e_emptykey)); -! clear_tv(&tvkey); -! goto failret; - } - - *arg = skipwhite(*arg + 1); - if (eval1(arg, &tv, evaluate) == FAIL) /* recursive! */ - { -! clear_tv(&tvkey); - goto failret; - } - if (evaluate) ---- 6746,6769 ---- - clear_tv(&tvkey); - goto failret; - } -! if (evaluate) - { -! key = get_tv_string_buf_chk(&tvkey, buf); -! if (key == NULL || *key == NUL) -! { -! /* "key" is NULL when get_tv_string_buf_chk() gave an errmsg */ -! if (key != NULL) -! EMSG(_(e_emptykey)); -! clear_tv(&tvkey); -! goto failret; -! } - } - - *arg = skipwhite(*arg + 1); - if (eval1(arg, &tv, evaluate) == FAIL) /* recursive! */ - { -! if (evaluate) -! clear_tv(&tvkey); - goto failret; - } - if (evaluate) -*** ../vim-7.1.104/src/version.c Thu Sep 13 18:25:08 2007 ---- src/version.c Thu Sep 13 20:36:38 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 105, - /**/ - --- -DENNIS: Listen -- strange women lying in ponds distributing swords is no - basis for a system of government. Supreme executive power derives - from a mandate from the masses, not from some farcical aquatic - ceremony. - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.106 b/7.1.106 deleted file mode 100644 index 359c54eb..00000000 --- a/7.1.106 +++ /dev/null @@ -1,53 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.106 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.106 -Problem: ":messages" doesn't quit listing on ":". -Solution: Break the loop when "got_int" is set. -Files: src/message.c - - -*** ../vim-7.1.105/src/message.c Thu Sep 6 12:53:59 2007 ---- src/message.c Thu Sep 13 21:45:57 2007 -*************** -*** 828,834 **** - _("Messages maintainer: Bram Moolenaar "), - hl_attr(HLF_T)); - -! for (p = first_msg_hist; p != NULL; p = p->next) - if (p->msg != NULL) - msg_attr(p->msg, p->attr); - ---- 828,834 ---- - _("Messages maintainer: Bram Moolenaar "), - hl_attr(HLF_T)); - -! for (p = first_msg_hist; p != NULL && !got_int; p = p->next) - if (p->msg != NULL) - msg_attr(p->msg, p->attr); - -*** ../vim-7.1.105/src/version.c Thu Sep 13 20:39:58 2007 ---- src/version.c Thu Sep 13 21:57:40 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 106, - /**/ - --- -I'm sure that I asked CBuilder to do a "full" install. Looks like I got -a "fool" install, instead. Charles E Campbell, Jr, PhD - - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.107 b/7.1.107 deleted file mode 100644 index 586219d9..00000000 --- a/7.1.107 +++ /dev/null @@ -1,130 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.107 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.107 -Problem: When doing a block selection and using "s" to change the text, - while triggering auto-indenting, causes the wrong text to be - repeated in other lines. (Adri Verhoef) -Solution: Compute the change of indent and compensate for that. -Files: src/ops.c - - -*** ../vim-7.1.106/src/ops.c Thu Jun 28 22:14:28 2007 ---- src/ops.c Thu Aug 30 11:41:10 2007 -*************** -*** 2477,2483 **** - - /* - * Spaces and tabs in the indent may have changed to other spaces and -! * tabs. Get the starting column again and correct the lenght. - * Don't do this when "$" used, end-of-line will have changed. - */ - block_prep(oap, &bd2, oap->start.lnum, TRUE); ---- 2477,2483 ---- - - /* - * Spaces and tabs in the indent may have changed to other spaces and -! * tabs. Get the starting column again and correct the length. - * Don't do this when "$" used, end-of-line will have changed. - */ - block_prep(oap, &bd2, oap->start.lnum, TRUE); -*************** -*** 2534,2540 **** - #ifdef FEAT_VISUALEXTRA - long offset; - linenr_T linenr; -! long ins_len, pre_textlen = 0; - char_u *firstline; - char_u *ins_text, *newp, *oldp; - struct block_def bd; ---- 2534,2542 ---- - #ifdef FEAT_VISUALEXTRA - long offset; - linenr_T linenr; -! long ins_len; -! long pre_textlen = 0; -! long pre_indent = 0; - char_u *firstline; - char_u *ins_text, *newp, *oldp; - struct block_def bd; -*************** -*** 2579,2585 **** - || gchar_cursor() == NUL)) - coladvance_force(getviscol()); - # endif -! pre_textlen = (long)STRLEN(ml_get(oap->start.lnum)); - bd.textcol = curwin->w_cursor.col; - } - #endif ---- 2581,2589 ---- - || gchar_cursor() == NUL)) - coladvance_force(getviscol()); - # endif -! firstline = ml_get(oap->start.lnum); -! pre_textlen = (long)STRLEN(firstline); -! pre_indent = (long)(skipwhite(firstline) - firstline); - bd.textcol = curwin->w_cursor.col; - } - #endif -*************** -*** 2598,2610 **** - */ - if (oap->block_mode && oap->start.lnum != oap->end.lnum) - { - firstline = ml_get(oap->start.lnum); -! /* -! * Subsequent calls to ml_get() flush the firstline data - take a -! * copy of the required bit. -! */ -! if ((ins_len = (long)STRLEN(firstline) - pre_textlen) > 0) - { - if ((ins_text = alloc_check((unsigned)(ins_len + 1))) != NULL) - { - vim_strncpy(ins_text, firstline + bd.textcol, (size_t)ins_len); ---- 2602,2623 ---- - */ - if (oap->block_mode && oap->start.lnum != oap->end.lnum) - { -+ /* Auto-indenting may have changed the indent. If the cursor was past -+ * the indent, exclude that indent change from the inserted text. */ - firstline = ml_get(oap->start.lnum); -! if (bd.textcol > pre_indent) -! { -! long new_indent = (long)(skipwhite(firstline) - firstline); -! -! pre_textlen += new_indent - pre_indent; -! bd.textcol += new_indent - pre_indent; -! } -! -! ins_len = (long)STRLEN(firstline) - pre_textlen; -! if (ins_len > 0) - { -+ /* Subsequent calls to ml_get() flush the firstline data - take a -+ * copy of the inserted text. */ - if ((ins_text = alloc_check((unsigned)(ins_len + 1))) != NULL) - { - vim_strncpy(ins_text, firstline + bd.textcol, (size_t)ins_len); -*** ../vim-7.1.106/src/version.c Thu Sep 13 22:04:30 2007 ---- src/version.c Thu Sep 13 22:38:28 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 107, - /**/ - --- -Windows -M!uqoms - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.108 b/7.1.108 deleted file mode 100644 index a70620ad..00000000 --- a/7.1.108 +++ /dev/null @@ -1,78 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.108 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.108 (after 7.1.100) -Problem: Win32: Compilation problems in Cscope code. (Jeff Lanzarotta) -Solution: Use (long) instead of (intptr_t) when it's not defined. -Files: src/if_cscope.c - - -*** ../vim-7.1.107/src/if_cscope.c Thu Sep 6 17:38:06 2007 ---- src/if_cscope.c Wed Sep 12 20:32:17 2007 -*************** -*** 726,731 **** ---- 726,740 ---- - HANDLE stdin_rd, stdout_rd; - HANDLE stdout_wr, stdin_wr; - BOOL created; -+ # ifdef __BORLANDC__ -+ # define OPEN_OH_ARGTYPE long -+ # else -+ # if (_MSC_VER >= 1300) -+ # define OPEN_OH_ARGTYPE intptr_t -+ # else -+ # define OPEN_OH_ARGTYPE long -+ # endif -+ # endif - #endif - - #if defined(UNIX) -*************** -*** 909,918 **** - CloseHandle(pi.hThread); - - /* TODO - tidy up after failure to create files on pipe handles. */ -! if (((fd = _open_osfhandle((intptr_t)stdin_wr, _O_TEXT|_O_APPEND)) < 0) - || ((csinfo[i].to_fp = _fdopen(fd, "w")) == NULL)) - PERROR(_("cs_create_connection: fdopen for to_fp failed")); -! if (((fd = _open_osfhandle((intptr_t)stdout_rd, _O_TEXT|_O_RDONLY)) < 0) - || ((csinfo[i].fr_fp = _fdopen(fd, "r")) == NULL)) - PERROR(_("cs_create_connection: fdopen for fr_fp failed")); - ---- 918,929 ---- - CloseHandle(pi.hThread); - - /* TODO - tidy up after failure to create files on pipe handles. */ -! if (((fd = _open_osfhandle((OPEN_OH_ARGTYPE)stdin_wr, -! _O_TEXT|_O_APPEND)) < 0) - || ((csinfo[i].to_fp = _fdopen(fd, "w")) == NULL)) - PERROR(_("cs_create_connection: fdopen for to_fp failed")); -! if (((fd = _open_osfhandle((OPEN_OH_ARGTYPE)stdout_rd, -! _O_TEXT|_O_RDONLY)) < 0) - || ((csinfo[i].fr_fp = _fdopen(fd, "r")) == NULL)) - PERROR(_("cs_create_connection: fdopen for fr_fp failed")); - -*** ../vim-7.1.107/src/version.c Thu Sep 13 22:40:47 2007 ---- src/version.c Fri Sep 14 19:55:12 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 108, - /**/ - --- -Q: How many hardware engineers does it take to change a lightbulb? -A: None. We'll fix it in software. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.109 b/7.1.109 deleted file mode 100644 index 22367e93..00000000 --- a/7.1.109 +++ /dev/null @@ -1,69 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.109 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.109 -Problem: GTK: when there are many tab pages, clicking on the arrow left of - the labels moves to the next tab page on the right. (Simeon Bird) -Solution: Check the X coordinate of the click and pass -1 as value for the - left arrow. -Files: src/gui_gtk_x11.c, src/term.c - - -*** ../vim-7.1.108/src/gui_gtk_x11.c Wed Sep 5 21:45:54 2007 ---- src/gui_gtk_x11.c Fri Sep 14 20:59:55 2007 -*************** -*** 3223,3230 **** - { - if (clicked_page == 0) - { -! /* Click after all tabs moves to next tab page. */ -! if (send_tabline_event(0) && gtk_main_level() > 0) - gtk_main_quit(); - } - #ifndef HAVE_GTK2 ---- 3223,3231 ---- - { - if (clicked_page == 0) - { -! /* Click after all tabs moves to next tab page. When "x" is -! * small guess it's the left button. */ -! if (send_tabline_event(x < 50 ? -1 : 0) && gtk_main_level() > 0) - gtk_main_quit(); - } - #ifndef HAVE_GTK2 -*** ../vim-7.1.108/src/term.c Thu May 10 20:48:32 2007 ---- src/term.c Fri Sep 14 20:56:40 2007 -*************** -*** 4809,4814 **** ---- 4809,4816 ---- - if (num_bytes == -1) - return -1; - current_tab = (int)bytes[0]; -+ if (current_tab == 255) /* -1 in a byte gives 255 */ -+ current_tab = -1; - slen += num_bytes; - } - else if (key_name[0] == (int)KS_TABMENU) -*** ../vim-7.1.108/src/version.c Fri Sep 14 19:56:18 2007 ---- src/version.c Sat Sep 15 14:05:25 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 109, - /**/ - --- -No letters of the alphabet were harmed in the creation of this message. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.110 b/7.1.110 deleted file mode 100644 index e8ff715c..00000000 --- a/7.1.110 +++ /dev/null @@ -1,66 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.110 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.110 (after 7.1.102) -Problem: Win32: Still compilation problems with Perl. -Solution: Change the #ifdefs. (Suresh Govindachar) -Files: src/if_perl.xs - - -*** ../vim-7.1.109/src/if_perl.xs Thu Sep 13 15:19:32 2007 ---- src/if_perl.xs Fri Sep 14 21:23:38 2007 -*************** -*** 48,60 **** - * The changes include addition of two symbols (Perl_sv_2iv_flags, - * Perl_newXS_flags) not present in earlier releases. - * -! * Jan Dubois suggested the following guarding scheme: - */ -! #if (ACTIVEPERL_VERSION >= 822) -! # define PERL589_OR_LATER -! #endif -! #if (PERL_REVISION == 5) && (PERL_VERSION == 8) && (PERL_SUBVERSION >= 9) -! # define PERL589_OR_LATER - #endif - #if (PERL_REVISION == 5) && (PERL_VERSION >= 9) - # define PERL589_OR_LATER ---- 48,62 ---- - * The changes include addition of two symbols (Perl_sv_2iv_flags, - * Perl_newXS_flags) not present in earlier releases. - * -! * Jan Dubois suggested the following guarding scheme. -! * -! * Active State defined ACTIVEPERL_VERSION as a string in versions before -! * 5.8.8; and so the comparison to 822 below needs to be guarded. - */ -! #if (PERL_REVISION == 5) && (PERL_VERSION == 8) && (PERL_SUBVERSION >= 8) -! # if (ACTIVEPERL_VERSION >= 822) || (PERL_SUBVERSION >= 9) -! # define PERL589_OR_LATER -! # endif - #endif - #if (PERL_REVISION == 5) && (PERL_VERSION >= 9) - # define PERL589_OR_LATER -*** ../vim-7.1.109/src/version.c Sat Sep 15 14:06:41 2007 ---- src/version.c Sat Sep 15 14:48:05 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 110, - /**/ - --- -"It's so simple to be wise. Just think of something stupid to say -and then don't say it." -- Sam Levenson - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.111 b/7.1.111 deleted file mode 100644 index e2b89921..00000000 --- a/7.1.111 +++ /dev/null @@ -1,105 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.111 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.111 -Problem: When using ":vimgrep" with the "j" flag folds from another buffer - may be displayed. (A.Politz) -Solution: When not jumping to another buffer update the folds. -Files: src/quickfix.c - - -*** ../vim-7.1.110/src/quickfix.c Thu Jun 28 21:23:52 2007 ---- src/quickfix.c Fri Sep 14 22:16:23 2007 -*************** -*** 1612,1619 **** - } - - /* -! * If there is only one window and is the quickfix window, create a new -! * one above the quickfix window. - */ - if (((firstwin == lastwin) && bt_quickfix(curbuf)) || !usable_win) - { ---- 1612,1619 ---- - } - - /* -! * If there is only one window and it is the quickfix window, create a -! * new one above the quickfix window. - */ - if (((firstwin == lastwin) && bt_quickfix(curbuf)) || !usable_win) - { -*************** -*** 2981,2986 **** ---- 2981,2987 ---- - buf_T *buf; - int duplicate_name = FALSE; - int using_dummy; -+ int redraw_for_dummy = FALSE; - int found_match; - buf_T *first_match_buf = NULL; - time_t seconds = 0; -*************** -*** 3097,3102 **** ---- 3098,3104 ---- - /* Remember that a buffer with this name already exists. */ - duplicate_name = (buf != NULL); - using_dummy = TRUE; -+ redraw_for_dummy = TRUE; - - #if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL) - /* Don't do Filetype autocommands to avoid loading syntax and -*************** -*** 3243,3252 **** ---- 3245,3272 ---- - if (qi->qf_lists[qi->qf_curlist].qf_count > 0) - { - if ((flags & VGR_NOJUMP) == 0) -+ { -+ buf = curbuf; - qf_jump(qi, 0, 0, eap->forceit); -+ if (buf != curbuf) -+ /* If we jumped to another buffer redrawing will already be -+ * taken care of. */ -+ redraw_for_dummy = FALSE; -+ } - } - else - EMSG2(_(e_nomatch2), s); -+ -+ /* If we loaded a dummy buffer into the current window, the autocommands -+ * may have messed up things, need to redraw and recompute folds. */ -+ if (redraw_for_dummy) -+ { -+ #ifdef FEAT_FOLDING -+ foldUpdateAll(curwin); -+ #else -+ redraw_later(NOT_VALID); -+ #endif -+ } - - theend: - vim_free(regmatch.regprog); -*** ../vim-7.1.110/src/version.c Sat Sep 15 14:48:57 2007 ---- src/version.c Sun Sep 16 13:23:48 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 111, - /**/ - --- -Trees moving back and forth is what makes the wind blow. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.112 b/7.1.112 deleted file mode 100644 index 24f192b2..00000000 --- a/7.1.112 +++ /dev/null @@ -1,64 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.112 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.112 -Problem: Using input() with a wrong argument may crash Vim. (A.Politz) -Solution: Init the input() return value to NULL. -Files: src/eval.c - - -*** ../vim-7.1.111/src/eval.c Thu Sep 13 20:39:58 2007 ---- src/eval.c Sat Sep 15 19:04:51 2007 -*************** -*** 11565,11578 **** - char_u *xp_arg = NULL; - - rettv->v_type = VAR_STRING; - - #ifdef NO_CONSOLE_INPUT - /* While starting up, there is no place to enter text. */ - if (no_console_input()) -- { -- rettv->vval.v_string = NULL; - return; -- } - #endif - - cmd_silent = FALSE; /* Want to see the prompt. */ ---- 11566,11577 ---- - char_u *xp_arg = NULL; - - rettv->v_type = VAR_STRING; -+ rettv->vval.v_string = NULL; - - #ifdef NO_CONSOLE_INPUT - /* While starting up, there is no place to enter text. */ - if (no_console_input()) - return; - #endif - - cmd_silent = FALSE; /* Want to see the prompt. */ -*** ../vim-7.1.111/src/version.c Sun Sep 16 13:26:56 2007 ---- src/version.c Sun Sep 16 14:19:04 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 112, - /**/ - --- -The early bird gets the worm. If you want something else for -breakfast, get up later. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.113 b/7.1.113 deleted file mode 100644 index 5eed3067..00000000 --- a/7.1.113 +++ /dev/null @@ -1,114 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.113 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.113 -Problem: Using map() to go over an empty list causes memory to be freed - twice. (A.Politz) -Solution: Don't clear the typeval in restore_vimvar(). -Files: src/eval.c - - -*** ../vim-7.1.112/src/eval.c Sun Sep 16 14:20:18 2007 ---- src/eval.c Sun Sep 16 19:24:49 2007 -*************** -*** 1318,1324 **** - { - hashitem_T *hi; - -- clear_tv(&vimvars[idx].vv_tv); - vimvars[idx].vv_tv = *save_tv; - if (vimvars[idx].vv_type == VAR_UNKNOWN) - { ---- 1318,1323 ---- -*************** -*** 1362,1368 **** - - if (p_verbose == 0) - --emsg_off; -- vimvars[VV_VAL].vv_str = NULL; - restore_vimvar(VV_VAL, &save_val); - - return list; ---- 1361,1366 ---- -*************** -*** 9387,9401 **** - { - typval_T rettv; - char_u *s; - - copy_tv(tv, &vimvars[VV_VAL].vv_tv); - s = expr; - if (eval1(&s, &rettv, TRUE) == FAIL) -! return FAIL; - if (*s != NUL) /* check for trailing chars after expr */ - { - EMSG2(_(e_invexpr2), s); -! return FAIL; - } - if (map) - { ---- 9386,9401 ---- - { - typval_T rettv; - char_u *s; -+ int retval = FAIL; - - copy_tv(tv, &vimvars[VV_VAL].vv_tv); - s = expr; - if (eval1(&s, &rettv, TRUE) == FAIL) -! goto theend; - if (*s != NUL) /* check for trailing chars after expr */ - { - EMSG2(_(e_invexpr2), s); -! goto theend; - } - if (map) - { -*************** -*** 9414,9423 **** - /* On type error, nothing has been removed; return FAIL to stop the - * loop. The error message was given by get_tv_number_chk(). */ - if (error) -! return FAIL; - } - clear_tv(&vimvars[VV_VAL].vv_tv); -! return OK; - } - - /* ---- 9414,9425 ---- - /* On type error, nothing has been removed; return FAIL to stop the - * loop. The error message was given by get_tv_number_chk(). */ - if (error) -! goto theend; - } -+ retval = OK; -+ theend: - clear_tv(&vimvars[VV_VAL].vv_tv); -! return retval; - } - - /* -*** ../vim-7.1.112/src/version.c Sun Sep 16 14:20:18 2007 ---- src/version.c Mon Sep 17 21:33:52 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 113, - /**/ - --- -Mental Floss prevents moral decay! - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.114 b/7.1.114 deleted file mode 100644 index fe7c5a73..00000000 --- a/7.1.114 +++ /dev/null @@ -1,44 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.114 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.114 -Problem: Memory leak in getmatches(). -Solution: Don't increment the refcount twice. -Files: src/eval.c - - -*** ../vim-7.1.113/src/eval.c Mon Sep 17 21:37:09 2007 ---- src/eval.c Sun Sep 16 19:24:49 2007 -*************** -*** 10351,10357 **** - dict = dict_alloc(); - if (dict == NULL) - return; -- ++dict->dv_refcount; - dict_add_nr_str(dict, "group", 0L, syn_id2name(cur->hlg_id)); - dict_add_nr_str(dict, "pattern", 0L, cur->pattern); - dict_add_nr_str(dict, "priority", (long)cur->priority, NULL); ---- 10355,10360 ---- -*** ../vim-7.1.113/src/version.c Mon Sep 17 21:37:09 2007 ---- src/version.c Mon Sep 17 21:54:08 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 114, - /**/ - --- -Be nice to your kids... they'll be the ones choosing your nursing home. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.115 b/7.1.115 deleted file mode 100644 index ec960241..00000000 --- a/7.1.115 +++ /dev/null @@ -1,51 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.115 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.115 (after 7.1.105) -Problem: Compiler warning for uninitialized variable. (Tony Mechelynck) -Solution: Init variable to NULL. -Files: src/eval.c - - -*** ../vim-7.1.114/src/eval.c Mon Sep 17 21:55:02 2007 ---- src/eval.c Sun Sep 16 19:24:49 2007 -*************** -*** 6704,6710 **** - dict_T *d = NULL; - typval_T tvkey; - typval_T tv; -! char_u *key; - dictitem_T *item; - char_u *start = skipwhite(*arg + 1); - char_u buf[NUMBUFLEN]; ---- 6705,6711 ---- - dict_T *d = NULL; - typval_T tvkey; - typval_T tv; -! char_u *key = NULL; - dictitem_T *item; - char_u *start = skipwhite(*arg + 1); - char_u buf[NUMBUFLEN]; -*** ../vim-7.1.114/src/version.c Mon Sep 17 21:55:02 2007 ---- src/version.c Mon Sep 17 22:18:42 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 115, - /**/ - --- -Proofread carefully to see if you any words out. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.116 b/7.1.116 deleted file mode 100644 index f7310db9..00000000 --- a/7.1.116 +++ /dev/null @@ -1,119 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.116 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.116 -Problem: Cannot display Unicode characters above 0x10000. -Solution: Remove the replacement with a question mark when UNICODE16 is not - defined. (partly by Nicolas Weber) -Files: src/screen.c - - -*** ../vim-7.1.115/src/screen.c Thu Aug 30 13:51:52 2007 ---- src/screen.c Mon Sep 10 22:29:42 2007 -*************** -*** 2305,2313 **** ---- 2305,2315 ---- - prev_c = u8c; - #endif - /* Non-BMP character: display as ? or fullwidth ?. */ -+ #ifdef UNICODE16 - if (u8c >= 0x10000) - ScreenLinesUC[idx] = (cells == 2) ? 0xff1f : (int)'?'; - else -+ #endif - ScreenLinesUC[idx] = u8c; - for (i = 0; i < Screen_mco; ++i) - { -*************** -*** 3678,3690 **** - if ((mb_l == 1 && c >= 0x80) - || (mb_l >= 1 && mb_c == 0) - || (mb_l > 1 && (!vim_isprintc(mb_c) -! || mb_c >= 0x10000))) - { - /* - * Illegal UTF-8 byte: display as . - * Non-BMP character : display as ? or fullwidth ?. - */ - if (mb_c < 0x10000) - { - transchar_hex(extra, mb_c); - # ifdef FEAT_RIGHTLEFT ---- 3680,3697 ---- - if ((mb_l == 1 && c >= 0x80) - || (mb_l >= 1 && mb_c == 0) - || (mb_l > 1 && (!vim_isprintc(mb_c) -! # ifdef UNICODE16 -! || mb_c >= 0x10000 -! # endif -! ))) - { - /* - * Illegal UTF-8 byte: display as . - * Non-BMP character : display as ? or fullwidth ?. - */ -+ # ifdef UNICODE16 - if (mb_c < 0x10000) -+ # endif - { - transchar_hex(extra, mb_c); - # ifdef FEAT_RIGHTLEFT -*************** -*** 3692,3702 **** ---- 3699,3711 ---- - rl_mirror(extra); - # endif - } -+ # ifdef UNICODE16 - else if (utf_char2cells(mb_c) != 2) - STRCPY(extra, "?"); - else - /* 0xff1f in UTF-8: full-width '?' */ - STRCPY(extra, "\357\274\237"); -+ # endif - - p_extra = extra; - c = *p_extra; -*************** -*** 6245,6250 **** ---- 6254,6260 ---- - else - u8c = utfc_ptr2char(ptr, u8cc); - mbyte_cells = utf_char2cells(u8c); -+ # ifdef UNICODE16 - /* Non-BMP character: display as ? or fullwidth ?. */ - if (u8c >= 0x10000) - { -*************** -*** 6252,6257 **** ---- 6262,6268 ---- - if (attr == 0) - attr = hl_attr(HLF_8); - } -+ # endif - # ifdef FEAT_ARABIC - if (p_arshape && !p_tbidi && ARABIC_CHAR(u8c)) - { -*** ../vim-7.1.116/src/version.c Mon Sep 17 22:19:43 2007 ---- src/version.c Mon Sep 17 22:37:31 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 116, - /**/ - --- -There can't be a crisis today, my schedule is already full. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.117 b/7.1.117 deleted file mode 100644 index dcb291b5..00000000 --- a/7.1.117 +++ /dev/null @@ -1,49 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.117 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.117 -Problem: Can't check wether Vim was compiled with Gnome. (Tony Mechelynck) -Solution: Add gui_gnome to the has() list. -Files: src/eval.c - - -*** ../vim-7.1.116/src/eval.c Mon Sep 17 22:19:43 2007 ---- src/eval.c Sun Sep 16 19:24:49 2007 -*************** -*** 10879,10884 **** ---- 10883,10891 ---- - "gui_gtk2", - # endif - #endif -+ #ifdef FEAT_GUI_GNOME -+ "gui_gnome", -+ #endif - #ifdef FEAT_GUI_MAC - "gui_mac", - #endif -*** ../vim-7.1.116/src/version.c Mon Sep 17 22:38:49 2007 ---- src/version.c Tue Sep 25 12:48:59 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 117, - /**/ - --- -ARTHUR: No, hang on! Just answer the five questions ... -GALAHAD: Three questions ... -ARTHUR: Three questions ... And we shall watch ... and pray. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.118 b/7.1.118 deleted file mode 100644 index 2b08815b..00000000 --- a/7.1.118 +++ /dev/null @@ -1,53 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.118 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.118 (after 7.1.107) -Problem: Compiler warning for Visual C compiler. -Solution: Add typecast. (Mike Williams) -Files: src/ops.c - - -*** ../vim-7.1.117/src/ops.c Thu Sep 13 22:40:47 2007 ---- src/ops.c Mon Sep 24 18:30:09 2007 -*************** -*** 2605,2611 **** - /* Auto-indenting may have changed the indent. If the cursor was past - * the indent, exclude that indent change from the inserted text. */ - firstline = ml_get(oap->start.lnum); -! if (bd.textcol > pre_indent) - { - long new_indent = (long)(skipwhite(firstline) - firstline); - ---- 2605,2611 ---- - /* Auto-indenting may have changed the indent. If the cursor was past - * the indent, exclude that indent change from the inserted text. */ - firstline = ml_get(oap->start.lnum); -! if (bd.textcol > (colnr_T)pre_indent) - { - long new_indent = (long)(skipwhite(firstline) - firstline); - -*** ../vim-7.1.117/src/version.c Tue Sep 25 12:50:00 2007 ---- src/version.c Tue Sep 25 14:18:37 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 118, - /**/ - --- -BRIDGEKEEPER: What is your favorite editor? -GAWAIN: Emacs ... No, Viiiiiiiiiiimmmmmmm! - "Monty Python and the Holy editor wars" PYTHON (MONTY) SOFTWARE LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.119 b/7.1.119 deleted file mode 100644 index 20159fc8..00000000 --- a/7.1.119 +++ /dev/null @@ -1,59 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.119 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.119 -Problem: Crash when 'cmdheight' set to very large value. (A.Politz) -Solution: Limit 'cmdheight' to 'lines' minus one. Store right value of - 'cmdheight' when running out of room. -Files: src/option.c, src/window.c - - -*** ../vim-7.1.118/src/option.c Thu Sep 6 16:33:47 2007 ---- src/option.c Tue Sep 25 12:17:35 2007 -*************** -*** 7824,7829 **** ---- 7824,7831 ---- - errmsg = e_positive; - p_ch = 1; - } -+ if (p_ch > Rows - min_rows() + 1) -+ p_ch = Rows - min_rows() + 1; - - /* Only compute the new window layout when startup has been - * completed. Otherwise the frame sizes may be wrong. */ -*** ../vim-7.1.118/src/window.c Thu Sep 13 18:25:08 2007 ---- src/window.c Tue Sep 25 12:13:56 2007 -*************** -*** 5523,5528 **** ---- 5523,5529 ---- - { - EMSG(_(e_noroom)); - p_ch = old_p_ch; -+ curtab->tp_ch_used = p_ch; - cmdline_row = Rows - p_ch; - break; - } -*** ../vim-7.1.118/src/version.c Tue Sep 25 14:19:35 2007 ---- src/version.c Tue Sep 25 14:48:14 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 119, - /**/ - --- -Q: Why does /dev/null accept only integers? -A: You can't sink a float. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.120 b/7.1.120 deleted file mode 100644 index e2ff367e..00000000 --- a/7.1.120 +++ /dev/null @@ -1,558 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.120 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.120 -Problem: Can't properly check memory leaks while running tests. -Solution: Add an argument to garbagecollect(). Delete functions and - variables in the test scripts. -Files: runtime/doc/eval.txt, src/eval.c, src/globals.h, src/main.c, - src/testdir/Makefile, src/testdir/test14.in, - src/testdir/test26.in, src/testdir/test34.in, - src/testdir/test45.in, src/testdir/test47.in, - src/testdir/test49.in, src/testdir/test55.in, - src/testdir/test56.in, src/testdir/test58.in, - src/testdir/test59.in, src/testdir/test60.in, - src/testdir/test60.vim, src/testdir/test62.in, - src/testdir/test63.in, src/testdir/test64.in - - -*** ../vim-7.1.119/runtime/doc/eval.txt Thu Jul 26 22:55:11 2007 ---- runtime/doc/eval.txt Tue Sep 25 17:40:30 2007 -*************** -*** 1,4 **** -! *eval.txt* For Vim version 7.1. Last change: 2007 Jul 25 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *eval.txt* For Vim version 7.1. Last change: 2007 Sep 25 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 1603,1609 **** - foldtextresult( {lnum}) String text for closed fold at {lnum} - foreground( ) Number bring the Vim window to the foreground - function( {name}) Funcref reference to function {name} -! garbagecollect() none free memory, breaking cyclic references - get( {list}, {idx} [, {def}]) any get item {idx} from {list} or {def} - get( {dict}, {key} [, {def}]) any get item {key} from {dict} or {def} - getbufline( {expr}, {lnum} [, {end}]) ---- 1603,1609 ---- - foldtextresult( {lnum}) String text for closed fold at {lnum} - foreground( ) Number bring the Vim window to the foreground - function( {name}) Funcref reference to function {name} -! garbagecollect( [at_exit]) none free memory, breaking cyclic references - get( {list}, {idx} [, {def}]) any get item {idx} from {list} or {def} - get( {dict}, {key} [, {def}]) any get item {key} from {dict} or {def} - getbufline( {expr}, {lnum} [, {end}]) -*************** -*** 2673,2679 **** - {name} can be a user defined function or an internal function. - - -! garbagecollect() *garbagecollect()* - Cleanup unused |Lists| and |Dictionaries| that have circular - references. There is hardly ever a need to invoke this - function, as it is automatically done when Vim runs out of ---- 2673,2679 ---- - {name} can be a user defined function or an internal function. - - -! garbagecollect([at_exit]) *garbagecollect()* - Cleanup unused |Lists| and |Dictionaries| that have circular - references. There is hardly ever a need to invoke this - function, as it is automatically done when Vim runs out of -*************** -*** 2683,2688 **** ---- 2683,2691 ---- - This is useful if you have deleted a very big |List| and/or - |Dictionary| with circular references in a script that runs - for a long time. -+ When the optional "at_exit" argument is one, garbage -+ collection will also be done when exiting Vim, if it wasn't -+ done before. This is useful when checking for memory leaks. - - get({list}, {idx} [, {default}]) *get()* - Get item {idx} from |List| {list}. When this item is not -*** ../vim-7.1.119/src/eval.c Tue Sep 25 12:50:00 2007 ---- src/eval.c Sun Sep 16 19:24:49 2007 -*************** -*** 6128,6133 **** ---- 6128,6134 ---- - /* Only do this once. */ - want_garbage_collect = FALSE; - may_garbage_collect = FALSE; -+ garbage_collect_at_exit = FALSE; - - /* - * 1. Go through all accessible variables and mark all lists and dicts -*************** -*** 7110,7116 **** - {"foldtextresult", 1, 1, f_foldtextresult}, - {"foreground", 0, 0, f_foreground}, - {"function", 1, 1, f_function}, -! {"garbagecollect", 0, 0, f_garbagecollect}, - {"get", 2, 3, f_get}, - {"getbufline", 2, 3, f_getbufline}, - {"getbufvar", 2, 2, f_getbufvar}, ---- 7111,7117 ---- - {"foldtextresult", 1, 1, f_foldtextresult}, - {"foreground", 0, 0, f_foreground}, - {"function", 1, 1, f_function}, -! {"garbagecollect", 0, 1, f_garbagecollect}, - {"get", 2, 3, f_get}, - {"getbufline", 2, 3, f_getbufline}, - {"getbufvar", 2, 2, f_getbufvar}, -*************** -*** 9719,9724 **** ---- 9720,9728 ---- - /* This is postponed until we are back at the toplevel, because we may be - * using Lists and Dicts internally. E.g.: ":echo [garbagecollect()]". */ - want_garbage_collect = TRUE; -+ -+ if (argvars[0].v_type != VAR_UNKNOWN && get_tv_number(&argvars[0]) == 1) -+ garbage_collect_at_exit = TRUE; - } - - /* -*** ../vim-7.1.119/src/globals.h Thu Aug 30 13:51:52 2007 ---- src/globals.h Sun Sep 16 18:42:41 2007 -*************** -*** 301,313 **** - #endif - - #ifdef FEAT_EVAL -! /* Garbage collection can only take place when we are sure there are no Lists - * or Dictionaries being used internally. This is flagged with - * "may_garbage_collect" when we are at the toplevel. - * "want_garbage_collect" is set by the garbagecollect() function, which means -! * we do garbage collection before waiting for a char at the toplevel. */ - EXTERN int may_garbage_collect INIT(= FALSE); - EXTERN int want_garbage_collect INIT(= FALSE); - - /* ID of script being sourced or was sourced to define the current function. */ - EXTERN scid_T current_SID INIT(= 0); ---- 301,317 ---- - #endif - - #ifdef FEAT_EVAL -! /* -! * Garbage collection can only take place when we are sure there are no Lists - * or Dictionaries being used internally. This is flagged with - * "may_garbage_collect" when we are at the toplevel. - * "want_garbage_collect" is set by the garbagecollect() function, which means -! * we do garbage collection before waiting for a char at the toplevel. -! * "garbage_collect_at_exit" indicates garbagecollect(1) was called. -! */ - EXTERN int may_garbage_collect INIT(= FALSE); - EXTERN int want_garbage_collect INIT(= FALSE); -+ EXTERN int garbage_collect_at_exit INIT(= FALSE); - - /* ID of script being sourced or was sourced to define the current function. */ - EXTERN scid_T current_SID INIT(= 0); -*** ../vim-7.1.119/src/main.c Thu Sep 6 17:38:06 2007 ---- src/main.c Sun Sep 16 18:44:54 2007 -*************** -*** 1334,1339 **** ---- 1334,1343 ---- - #ifdef FEAT_CSCOPE - cs_end(); - #endif -+ #ifdef FEAT_EVAL -+ if (garbage_collect_at_exit) -+ garbage_collect(); -+ #endif - - mch_exit(exitval); - } -*** ../vim-7.1.119/src/testdir/Makefile Tue Aug 14 17:28:14 2007 ---- src/testdir/Makefile Mon Sep 17 20:04:13 2007 -*************** -*** 6,12 **** - - # Uncomment this line for using valgrind. - # The output goes into a file "valgrind.$PID" (sorry, no test number). -! # VALGRIND = valgrind --tool=memcheck --num-callers=15 --logfile=valgrind - - SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \ - test7.out test8.out test9.out test10.out test11.out \ ---- 6,12 ---- - - # Uncomment this line for using valgrind. - # The output goes into a file "valgrind.$PID" (sorry, no test number). -! # VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=15 --logfile=valgrind - - SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \ - test7.out test8.out test9.out test10.out test11.out \ -*************** -*** 39,45 **** - $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG) - - clean: -! -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim test.ok X* viminfo - - test1.out: test1.in - -rm -f $*.failed tiny.vim small.vim mbyte.vim test.ok X* viminfo ---- 39,45 ---- - $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG) - - clean: -! -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim test.ok X* valgrind.pid* viminfo - - test1.out: test1.in - -rm -f $*.failed tiny.vim small.vim mbyte.vim test.ok X* viminfo -*************** -*** 65,70 **** ---- 65,74 ---- - else echo $* NO OUTPUT >>test.log; \ - fi" - -rm -rf X* test.ok viminfo -+ -+ test49.out: test49.vim -+ -+ test60.out: test60.vim - - nolog: - -echo Test results: >test.log -*** ../vim-7.1.119/src/testdir/test14.in Sun Jun 13 20:24:08 2004 ---- src/testdir/test14.in Sun Sep 16 15:57:54 2007 -*************** -*** 18,23 **** ---- 18,24 ---- - : let tt = "o\65\x42\o103 \33a\xfg\o78\" - :endif - :exe "normal " . tt -+ :unlet tt - :.w >>test.out - :set vb - /^Piece -*** ../vim-7.1.119/src/testdir/test26.in Sun Jun 13 17:05:48 2004 ---- src/testdir/test26.in Sun Sep 16 16:54:19 2007 -*************** -*** 37,42 **** ---- 37,43 ---- - : endif - : endif - :endwhile -+ :unlet i j - :'t,$w! test.out - :qa! - ENDTEST -*** ../vim-7.1.119/src/testdir/test34.in Sun Apr 30 20:46:14 2006 ---- src/testdir/test34.in Sun Sep 16 21:25:47 2007 -*************** -*** 52,58 **** - ---*--- - (one - (two -! [(one again:$-5,$wq! test.out - ENDTEST - - here ---- 52,66 ---- - ---*--- - (one - (two -! [(one again:$-5,$w! test.out -! :delfunc Table -! :delfunc Compute -! :delfunc Expr1 -! :delfunc Expr2 -! :delfunc ListItem -! :delfunc ListReset -! :unlet retval counter -! :q! - ENDTEST - - here -*** ../vim-7.1.119/src/testdir/test45.in Sun Jun 13 19:57:02 2004 ---- src/testdir/test45.in Sun Sep 16 18:27:20 2007 -*************** -*** 55,60 **** ---- 55,61 ---- - /kk$ - :call append("$", foldlevel(".")) - :/^last/+1,$w! test.out -+ :delfun Flvl - :qa! - ENDTEST - -*** ../vim-7.1.119/src/testdir/test47.in Sun Jun 13 18:40:29 2004 ---- src/testdir/test47.in Sun Sep 16 18:32:03 2007 -*************** -*** 34,39 **** ---- 34,40 ---- - :call append("$", two) - :call append("$", three) - :$-2,$w! test.out -+ :unlet one two three - :qa! - ENDTEST - -*** ../vim-7.1.119/src/testdir/test49.in Sun Jun 13 18:10:00 2004 ---- src/testdir/test49.in Sun Sep 16 23:30:35 2007 -*************** -*** 1,13 **** - This is a test of the script language. - - If after adding a new test, the test output doesn't appear properly in -! test49.failed, try to add one ore more "G"s at the line before ENDTEST. - - STARTTEST - :so small.vim - :se nocp nomore viminfo+=nviminfo - :so test49.vim -! GGGGGGGGGG"rp:.-,$wq! test.out - ENDTEST - - Results of test49.vim: ---- 1,29 ---- - This is a test of the script language. - - If after adding a new test, the test output doesn't appear properly in -! test49.failed, try to add one ore more "G"s at the line ending in "test.out" - - STARTTEST - :so small.vim - :se nocp nomore viminfo+=nviminfo - :so test49.vim -! GGGGGGGGGGGGGG"rp:.-,$w! test.out -! :" -! :" make valgrind happy -! :redir => funclist -! :silent func -! :redir END -! :for line in split(funclist, "\n") -! : let name = matchstr(line, 'function \zs[A-Z]\w*\ze(') -! : if name != '' -! : exe "delfunc " . name -! : endif -! :endfor -! :for v in keys(g:) -! : silent! exe "unlet " . v -! :endfor -! :unlet v -! :qa! - ENDTEST - - Results of test49.vim: -*** ../vim-7.1.119/src/testdir/test55.in Sat May 5 20:03:56 2007 ---- src/testdir/test55.in Mon Sep 17 19:53:48 2007 -*************** -*** 345,350 **** ---- 345,354 ---- - :endfun - :call Test(1, 2, [3, 4], {5: 6}) " This may take a while - :" -+ :delfunc Test -+ :unlet dict -+ :call garbagecollect(1) -+ :" - :/^start:/,$wq! test.out - ENDTEST - -*** ../vim-7.1.119/src/testdir/test56.in Tue Sep 5 13:36:02 2006 ---- src/testdir/test56.in Sun Sep 16 17:54:20 2007 -*************** -*** 17,21 **** - fun s:DoNothing() - call append(line('$'), "nothing line") - endfun -! nnoremap _x :call DoNothing()call DoLast() - end: ---- 17,21 ---- - fun s:DoNothing() - call append(line('$'), "nothing line") - endfun -! nnoremap _x :call DoNothing()call DoLast()delfunc DoNothingdelfunc DoLast - end: -*** ../vim-7.1.119/src/testdir/test58.in Wed Apr 5 22:38:56 2006 ---- src/testdir/test58.in Sun Sep 16 18:17:03 2007 -*************** -*** 86,91 **** ---- 86,92 ---- - :$put =str - `m]s:let [str, a] = spellbadword() - :$put =str -+ :unlet str a - :" - :" Postponed prefixes - :call TestOne('2', '1') -*************** -*** 99,104 **** ---- 100,109 ---- - :" - :" NOSLITSUGS - :call TestOne('8', '8') -+ :" -+ :" clean up for valgrind -+ :delfunc TestOne -+ :set spl= enc=latin1 - :" - gg:/^test output:/,$wq! test.out - ENDTEST -*** ../vim-7.1.119/src/testdir/test59.in Wed Apr 5 22:27:11 2006 ---- src/testdir/test59.in Sun Sep 16 18:17:23 2007 -*************** -*** 90,95 **** ---- 90,96 ---- - :$put =str - `m]s:let [str, a] = spellbadword() - :$put =str -+ :unlet str a - :" - :" Postponed prefixes - :call TestOne('2', '1') -*************** -*** 100,105 **** ---- 101,110 ---- - :call TestOne('5', '5') - :call TestOne('6', '6') - :call TestOne('7', '7') -+ :" -+ :" clean up for valgrind -+ :delfunc TestOne -+ :set spl= enc=latin1 - :" - gg:/^test output:/,$wq! test.out - ENDTEST -*** ../vim-7.1.119/src/testdir/test60.in Fri May 5 23:11:11 2006 ---- src/testdir/test60.in Mon Sep 17 19:58:43 2007 -*************** -*** 569,574 **** ---- 569,577 ---- - redir END - endfunction - :call TestExists() -+ :delfunc TestExists -+ :delfunc RunTest -+ :delfunc TestFuncArg - :edit! test.out - :set ff=unix - :w -*** ../vim-7.1.119/src/testdir/test60.vim Fri Jan 13 00:14:55 2006 ---- src/testdir/test60.vim Mon Sep 17 19:56:02 2007 -*************** -*** 94,97 **** ---- 94,98 ---- - else - echo "FAILED" - endif -+ unlet str - -*** ../vim-7.1.119/src/testdir/test62.in Sun Apr 30 20:28:14 2006 ---- src/testdir/test62.in Sun Sep 16 17:24:04 2007 -*************** -*** 7,12 **** ---- 7,13 ---- - :let nr = tabpagenr() - :q - :call append(line('$'), 'tab page ' . nr) -+ :unlet nr - :" - :" Open three tab pages and use ":tabdo" - :0tabnew -*************** -*** 23,28 **** ---- 24,30 ---- - :q! - :call append(line('$'), line1) - :call append(line('$'), line2) -+ :unlet line1 line2 - :" - :" - :/^Results/,$w! test.out -*** ../vim-7.1.119/src/testdir/test63.in Thu Jul 26 22:55:11 2007 ---- src/testdir/test63.in Sun Sep 16 17:11:07 2007 -*************** -*** 60,66 **** - :else - : let @r .= "FAILED\n" - :endif -! :" --- Check that "matchdelete()" returns 0 if succesfull and otherwise -1. - :let @r .= "*** Test 6: " - :let m = matchadd("MyGroup1", "TODO") - :let r1 = matchdelete(m) ---- 60,66 ---- - :else - : let @r .= "FAILED\n" - :endif -! :" --- Check that "matchdelete()" returns 0 if successful and otherwise -1. - :let @r .= "*** Test 6: " - :let m = matchadd("MyGroup1", "TODO") - :let r1 = matchdelete(m) -*************** -*** 117,123 **** - :" --- Check that "setmatches()" will not add two matches with the same ID. The - :" --- expected behaviour (for now) is to add the first match but not the - :" --- second and to return 0 (even though it is a matter of debate whether -! :" --- this can be considered succesfull behaviour). - :let @r .= "*** Test 9: " - :let r1 = setmatches([{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}, {'group': 'MyGroup2', 'pattern': 'FIXME', 'priority': 10, 'id': 1}]) - :if getmatches() == [{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}] && r1 == 0 ---- 117,123 ---- - :" --- Check that "setmatches()" will not add two matches with the same ID. The - :" --- expected behaviour (for now) is to add the first match but not the - :" --- second and to return 0 (even though it is a matter of debate whether -! :" --- this can be considered successful behaviour). - :let @r .= "*** Test 9: " - :let r1 = setmatches([{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}, {'group': 'MyGroup2', 'pattern': 'FIXME', 'priority': 10, 'id': 1}]) - :if getmatches() == [{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}] && r1 == 0 -*************** -*** 127,133 **** - :endif - :call clearmatches() - :unlet r1 -! :" --- Check that "setmatches()" returns 0 if succesfull and otherwise -1. - :" --- (A range of valid and invalid input values are tried out to generate the - :" --- return values.) - :let @r .= "*** Test 10: " ---- 127,133 ---- - :endif - :call clearmatches() - :unlet r1 -! :" --- Check that "setmatches()" returns 0 if successful and otherwise -1. - :" --- (A range of valid and invalid input values are tried out to generate the - :" --- return values.) - :let @r .= "*** Test 10: " -*** ../vim-7.1.119/src/testdir/test64.in Tue Aug 14 17:28:14 2007 ---- src/testdir/test64.in Sun Sep 16 17:43:03 2007 -*************** -*** 44,51 **** ---- 44,53 ---- - : $put ='ERROR: pat: \"' . t[0] . '\", text: \"' . t[1] . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"' - : endif - : endfor -+ : unlet i - : endif - :endfor -+ :unlet t tl e l - :/^Results/,$wq! test.out - ENDTEST - -*** ../vim-7.1.119/src/version.c Tue Sep 25 14:50:19 2007 ---- src/version.c Tue Sep 25 17:36:22 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 120, - /**/ - --- -BEDEVERE: How do you know so much about swallows? -ARTHUR: Well you have to know these things when you're a king, you know. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.121 b/7.1.121 deleted file mode 100644 index ab6f878d..00000000 --- a/7.1.121 +++ /dev/null @@ -1,81 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.121 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.121 -Problem: Using ":cd %:h" when editing a file in the current directory - results in an error message for using an empty string. -Solution: When "%:h" results in an empty string use ".". -Files: src/eval.c - - -*** ../vim-7.1.120/src/eval.c Tue Sep 25 17:54:41 2007 ---- src/eval.c Sun Sep 16 19:24:49 2007 -*************** -*** 21308,21321 **** - *usedlen += 2; - s = get_past_head(*fnamep); - while (tail > s && after_pathsep(s, tail)) -! --tail; - *fnamelen = (int)(tail - *fnamep); - #ifdef VMS - if (*fnamelen > 0) - *fnamelen += 1; /* the path separator is part of the path */ - #endif -! while (tail > s && !after_pathsep(s, tail)) -! mb_ptr_back(*fnamep, tail); - } - - /* ":8" - shortname */ ---- 21308,21334 ---- - *usedlen += 2; - s = get_past_head(*fnamep); - while (tail > s && after_pathsep(s, tail)) -! mb_ptr_back(*fnamep, tail); - *fnamelen = (int)(tail - *fnamep); - #ifdef VMS - if (*fnamelen > 0) - *fnamelen += 1; /* the path separator is part of the path */ - #endif -! if (*fnamelen == 0) -! { -! /* Result is empty. Turn it into "." to make ":cd %:h" work. */ -! p = vim_strsave((char_u *)"."); -! if (p == NULL) -! return -1; -! vim_free(*bufp); -! *bufp = *fnamep = tail = p; -! *fnamelen = 1; -! } -! else -! { -! while (tail > s && !after_pathsep(s, tail)) -! mb_ptr_back(*fnamep, tail); -! } - } - - /* ":8" - shortname */ -*** ../vim-7.1.120/src/version.c Tue Sep 25 17:54:41 2007 ---- src/version.c Tue Sep 25 20:38:08 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 121, - /**/ - --- -It is illegal for anyone to try and stop a child from playfully jumping over -puddles of water. - [real standing law in California, United States of America] - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.122 b/7.1.122 deleted file mode 100644 index ade147c6..00000000 --- a/7.1.122 +++ /dev/null @@ -1,98 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.122 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.122 -Problem: Mac: building Vim.app fails. Using wrong architecture. -Solution: Use line continuation for the gui_bundle dependency. Detect the - system architecture with "uname -a". -Files: src/main.aap - - -*** ../vim-7.1.121/src/main.aap Thu May 10 18:48:19 2007 ---- src/main.aap Tue Sep 25 21:26:03 2007 -*************** -*** 56,64 **** - config {virtual} auto/config.h auto/config.aap : - auto/configure.aap configure.aap - config.arg config.h.in config.aap.in - :sys CONFIG_STATUS=auto/config.status - ./configure.aap `file2string("config.arg")` -! --with-mac-arch=ppc - --cache-file=auto/config.cache - - # Configure arguments: create an empty "config.arg" file when its missing ---- 56,71 ---- - config {virtual} auto/config.h auto/config.aap : - auto/configure.aap configure.aap - config.arg config.h.in config.aap.in -+ # Use "uname -a" to detect the architecture of the system. -+ @ok, uname = redir_system('uname -a', 0) -+ @if string.find(uname, "i386") >= 0: -+ @ arch = "i386" -+ @else: -+ @ arch = "ppc" -+ :print Building for $arch system - :sys CONFIG_STATUS=auto/config.status - ./configure.aap `file2string("config.arg")` -! --with-mac-arch=$arch - --cache-file=auto/config.cache - - # Configure arguments: create an empty "config.arg" file when its missing -*************** -*** 1167,1173 **** - :symlink `os.getcwd()`/../runtime $RESDIR/vim/runtime - # TODO: Create the vimtutor application. - -! gui_bundle {virtual}: $(RESDIR) bundle-dir bundle-executable bundle-info - bundle-resource bundle-language - - bundle-dir {virtual}: $(APPDIR)/Contents $(VIMTARGET) ---- 1174,1180 ---- - :symlink `os.getcwd()`/../runtime $RESDIR/vim/runtime - # TODO: Create the vimtutor application. - -! gui_bundle {virtual}: $(RESDIR) bundle-dir bundle-executable bundle-info \ - bundle-resource bundle-language - - bundle-dir {virtual}: $(APPDIR)/Contents $(VIMTARGET) -*************** -*** 1187,1193 **** - :sys m4 $(M4FLAGSX) infplist.xml > $(APPDIR)/Contents/Info.plist - - bundle-resource {virtual}: bundle-dir bundle-rsrc -! :copy {force} $(RSRC_DIR)/*.icns $(RESDIR) - - ### Classic resources - # Resource fork (in the form of a .rsrc file) for Classic Vim (Mac OS 9) ---- 1194,1200 ---- - :sys m4 $(M4FLAGSX) infplist.xml > $(APPDIR)/Contents/Info.plist - - bundle-resource {virtual}: bundle-dir bundle-rsrc -! :copy {force} $(RSRC_DIR)/*.icns $(RESDIR) - - ### Classic resources - # Resource fork (in the form of a .rsrc file) for Classic Vim (Mac OS 9) -*** ../vim-7.1.121/src/version.c Tue Sep 25 20:39:14 2007 ---- src/version.c Tue Sep 25 22:12:16 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 122, - /**/ - --- -Men may not be seen publicly in any kind of strapless gown. - [real standing law in Florida, United States of America] - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.123 b/7.1.123 deleted file mode 100644 index 6b3ee044..00000000 --- a/7.1.123 +++ /dev/null @@ -1,259 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.123 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.123 -Problem: Win32: ":edit foo ~ foo" expands "~". -Solution: Change the call to expand_env(). -Files: src/ex_docmd.c, src/misc1.c, src/proto/misc1.pro, src/option.c - - -*** ../vim-7.1.122/src/ex_docmd.c Sun Aug 19 22:42:27 2007 ---- src/ex_docmd.c Wed Sep 26 20:29:36 2007 -*************** -*** 4403,4409 **** - || vim_strchr(eap->arg, '~') != NULL) - { - expand_env_esc(eap->arg, NameBuff, MAXPATHL, -! TRUE, NULL); - has_wildcards = mch_has_wildcard(NameBuff); - p = NameBuff; - } ---- 4402,4408 ---- - || vim_strchr(eap->arg, '~') != NULL) - { - expand_env_esc(eap->arg, NameBuff, MAXPATHL, -! TRUE, TRUE, NULL); - has_wildcards = mch_has_wildcard(NameBuff); - p = NameBuff; - } -*** ../vim-7.1.122/src/misc1.c Tue Aug 14 22:15:53 2007 ---- src/misc1.c Tue Sep 25 17:30:01 2007 -*************** -*** 3506,3514 **** - #endif - - /* - * Expand environment variable with path name. - * "~/" is also expanded, using $HOME. For Unix "~user/" is expanded. -! * Skips over "\ ", "\~" and "\$". - * If anything fails no expansion is done and dst equals src. - */ - void ---- 3506,3543 ---- - #endif - - /* -+ * Call expand_env() and store the result in an allocated string. -+ * This is not very memory efficient, this expects the result to be freed -+ * again soon. -+ */ -+ char_u * -+ expand_env_save(src) -+ char_u *src; -+ { -+ return expand_env_save_opt(src, FALSE); -+ } -+ -+ /* -+ * Idem, but when "one" is TRUE handle the string as one file name, only -+ * expand "~" at the start. -+ */ -+ char_u * -+ expand_env_save_opt(src, one) -+ char_u *src; -+ int one; -+ { -+ char_u *p; -+ -+ p = alloc(MAXPATHL); -+ if (p != NULL) -+ expand_env_esc(src, p, MAXPATHL, FALSE, one, NULL); -+ return p; -+ } -+ -+ /* - * Expand environment variable with path name. - * "~/" is also expanded, using $HOME. For Unix "~user/" is expanded. -! * Skips over "\ ", "\~" and "\$" (not for Win32 though). - * If anything fails no expansion is done and dst equals src. - */ - void -*************** -*** 3517,3531 **** - char_u *dst; /* where to put the result */ - int dstlen; /* maximum length of the result */ - { -! expand_env_esc(src, dst, dstlen, FALSE, NULL); - } - - void -! expand_env_esc(srcp, dst, dstlen, esc, startstr) - char_u *srcp; /* input string e.g. "$HOME/vim.hlp" */ - char_u *dst; /* where to put the result */ - int dstlen; /* maximum length of the result */ - int esc; /* escape spaces in expanded variables */ - char_u *startstr; /* start again after this (can be NULL) */ - { - char_u *src; ---- 3546,3561 ---- - char_u *dst; /* where to put the result */ - int dstlen; /* maximum length of the result */ - { -! expand_env_esc(src, dst, dstlen, FALSE, FALSE, NULL); - } - - void -! expand_env_esc(srcp, dst, dstlen, esc, one, startstr) - char_u *srcp; /* input string e.g. "$HOME/vim.hlp" */ - char_u *dst; /* where to put the result */ - int dstlen; /* maximum length of the result */ - int esc; /* escape spaces in expanded variables */ -+ int one; /* "srcp" is one file name */ - char_u *startstr; /* start again after this (can be NULL) */ - { - char_u *src; -*************** -*** 3766,3771 **** ---- 3796,3803 ---- - { - /* - * Recognize the start of a new name, for '~'. -+ * Don't do this when "one" is TRUE, to avoid expanding "~" in -+ * ":edit foo ~ foo". - */ - at_start = FALSE; - if (src[0] == '\\' && src[1] != NUL) -*************** -*** 3773,3779 **** - *dst++ = *src++; - --dstlen; - } -! else if (src[0] == ' ' || src[0] == ',') - at_start = TRUE; - *dst++ = *src++; - --dstlen; ---- 3805,3811 ---- - *dst++ = *src++; - --dstlen; - } -! else if ((src[0] == ' ' || src[0] == ',') && !one) - at_start = TRUE; - *dst++ = *src++; - --dstlen; -*************** -*** 4070,4092 **** - } - - /* -- * Call expand_env() and store the result in an allocated string. -- * This is not very memory efficient, this expects the result to be freed -- * again soon. -- */ -- char_u * -- expand_env_save(src) -- char_u *src; -- { -- char_u *p; -- -- p = alloc(MAXPATHL); -- if (p != NULL) -- expand_env(src, p, MAXPATHL); -- return p; -- } -- -- /* - * Our portable version of setenv. - */ - void ---- 4102,4107 ---- -*************** -*** 9139,9145 **** - */ - if (vim_strpbrk(p, (char_u *)"$~") != NULL) - { -! p = expand_env_save(p); - if (p == NULL) - p = pat[i]; - #ifdef UNIX ---- 9154,9160 ---- - */ - if (vim_strpbrk(p, (char_u *)"$~") != NULL) - { -! p = expand_env_save_opt(p, TRUE); - if (p == NULL) - p = pat[i]; - #ifdef UNIX -*** ../vim-7.1.122/src/proto/misc1.pro Sat May 5 20:15:33 2007 ---- src/proto/misc1.pro Tue Sep 25 17:22:36 2007 -*************** -*** 48,57 **** - void vim_beep __ARGS((void)); - void init_homedir __ARGS((void)); - void free_homedir __ARGS((void)); - void expand_env __ARGS((char_u *src, char_u *dst, int dstlen)); -! void expand_env_esc __ARGS((char_u *srcp, char_u *dst, int dstlen, int esc, char_u *startstr)); - char_u *vim_getenv __ARGS((char_u *name, int *mustfree)); -- char_u *expand_env_save __ARGS((char_u *src)); - void vim_setenv __ARGS((char_u *name, char_u *val)); - char_u *get_env_name __ARGS((expand_T *xp, int idx)); - void home_replace __ARGS((buf_T *buf, char_u *src, char_u *dst, int dstlen, int one)); ---- 48,58 ---- - void vim_beep __ARGS((void)); - void init_homedir __ARGS((void)); - void free_homedir __ARGS((void)); -+ char_u *expand_env_save __ARGS((char_u *src)); -+ char_u *expand_env_save_opt __ARGS((char_u *src, int one)); - void expand_env __ARGS((char_u *src, char_u *dst, int dstlen)); -! void expand_env_esc __ARGS((char_u *srcp, char_u *dst, int dstlen, int esc, int one, char_u *startstr)); - char_u *vim_getenv __ARGS((char_u *name, int *mustfree)); - void vim_setenv __ARGS((char_u *name, char_u *val)); - char_u *get_env_name __ARGS((expand_T *xp, int idx)); - void home_replace __ARGS((buf_T *buf, char_u *src, char_u *dst, int dstlen, int one)); -*** ../vim-7.1.122/src/option.c Tue Sep 25 14:50:19 2007 ---- src/option.c Tue Sep 25 17:20:05 2007 -*************** -*** 4996,5002 **** - * For 'spellsuggest' expand after "file:". - */ - expand_env_esc(val, NameBuff, MAXPATHL, -! (char_u **)options[opt_idx].var == &p_tags, - #ifdef FEAT_SPELL - (char_u **)options[opt_idx].var == &p_sps ? (char_u *)"file:" : - #endif ---- 4996,5002 ---- - * For 'spellsuggest' expand after "file:". - */ - expand_env_esc(val, NameBuff, MAXPATHL, -! (char_u **)options[opt_idx].var == &p_tags, FALSE, - #ifdef FEAT_SPELL - (char_u **)options[opt_idx].var == &p_sps ? (char_u *)"file:" : - #endif -*** ../vim-7.1.122/src/version.c Tue Sep 25 22:13:14 2007 ---- src/version.c Wed Sep 26 22:30:59 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 123, - /**/ - --- -So when I saw the post to comp.editors, I rushed over to the FTP site to -grab it. So I yank apart the tarball, light x candles, where x= the -vim version multiplied by the md5sum of the source divided by the MAC of -my NIC (8A3FA78155A8A1D346C3C4A), put on black robes, dim the lights, -wave a dead chicken over the hard drive, and summon the power of GNU GCC -with the magic words "make config ; make!". - [Jason Spence, compiling Vim 5.0] - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.124 b/7.1.124 deleted file mode 100644 index 6e524265..00000000 --- a/7.1.124 +++ /dev/null @@ -1,82 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.124 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.124 (extra) -Problem: Mac: When dropping a file on Vim.app that is already in the buffer - list (from .viminfo) results in editing an empty, unnamed buffer. - (Axel Kielhorn) Also: warning for unused variable. -Solution: Move to the buffer of the first agument. Delete unused variable. -Files: src/gui_mac.c - - -*** ../vim-7.1.123/src/gui_mac.c Thu Aug 30 12:50:00 2007 ---- src/gui_mac.c Sat Sep 29 13:12:26 2007 -*************** -*** 1046,1051 **** ---- 1046,1052 ---- - { - int i; - char_u *p; -+ int fnum = -1; - - /* these are the initial files dropped on the Vim icon */ - for (i = 0 ; i < numFiles; i++) -*************** -*** 1055,1060 **** ---- 1056,1073 ---- - mch_exit(2); - else - alist_add(&global_alist, p, 2); -+ if (fnum == -1) -+ fnum = GARGLIST[GARGCOUNT - 1].ae_fnum; -+ } -+ -+ /* If the file name was already in the buffer list we need to switch -+ * to it. */ -+ if (curbuf->b_fnum != fnum) -+ { -+ char_u cmd[30]; -+ -+ vim_snprintf((char *)cmd, 30, "silent %dbuffer", fnum); -+ do_cmdline_cmd(cmd); - } - - /* Change directory to the location of the first file. */ -*************** -*** 2920,2926 **** - /* TODO: Move most of this stuff toward gui_mch_init */ - Rect windRect; - MenuHandle pomme; -- long gestalt_rc; - EventTypeSpec eventTypeSpec; - EventHandlerRef mouseWheelHandlerRef; - #ifdef USE_CARBONKEYHANDLER ---- 2933,2938 ---- -*** ../vim-7.1.123/src/version.c Wed Sep 26 22:35:06 2007 ---- src/version.c Sat Sep 29 13:13:16 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 124, - /**/ - --- -ERIC IDLE PLAYED: THE DEAD COLLECTOR, MR BINT (A VILLAGE NE'ER-DO -WELL VERY - KEEN ON BURNING WITCHES), SIR ROBIN, THE GUARD WHO DOESN'T - HICOUGH BUT TRIES TO GET THINGS STRAIGHT, CONCORDE (SIR - LAUNCELOT'S TRUSTY STEED), ROGER THE SHRUBBER (A SHRUBBER), - BROTHER MAYNARD - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.125 b/7.1.125 deleted file mode 100644 index f202db43..00000000 --- a/7.1.125 +++ /dev/null @@ -1,454 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.125 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.125 -Problem: The TermResponse autocommand event is not always triggered. (Aron - Griffis) -Solution: When unblocking autocommands check if v:termresponse changed and - trigger the event then. -Files: src/buffer.c, src/diff.c, src/ex_getln.c, src/fileio.c, - src/globals.h, src/misc2.c, src/proto/fileio.pro, src/window.c - - -*** ../vim-7.1.124/src/buffer.c Sun Aug 12 15:50:26 2007 ---- src/buffer.c Wed Sep 26 20:05:38 2007 -*************** -*** 5515,5525 **** - - #ifdef FEAT_AUTOCMD - if (!aucmd) /* Don't trigger BufDelete autocommands here. */ -! ++autocmd_block; - #endif - close_buffer(NULL, buf, DOBUF_WIPE); - #ifdef FEAT_AUTOCMD - if (!aucmd) -! --autocmd_block; - #endif - } ---- 5512,5522 ---- - - #ifdef FEAT_AUTOCMD - if (!aucmd) /* Don't trigger BufDelete autocommands here. */ -! block_autocmds(); - #endif - close_buffer(NULL, buf, DOBUF_WIPE); - #ifdef FEAT_AUTOCMD - if (!aucmd) -! unblock_autocmds(); - #endif - } -*** ../vim-7.1.124/src/diff.c Tue Feb 20 04:43:13 2007 ---- src/diff.c Tue Sep 25 22:01:40 2007 -*************** -*** 840,850 **** - tmp_orig, tmp_new); - append_redir(cmd, p_srr, tmp_diff); - #ifdef FEAT_AUTOCMD -! ++autocmd_block; /* Avoid ShellCmdPost stuff */ - #endif - (void)call_shell(cmd, SHELL_FILTER|SHELL_SILENT|SHELL_DOOUT); - #ifdef FEAT_AUTOCMD -! --autocmd_block; - #endif - vim_free(cmd); - } ---- 840,850 ---- - tmp_orig, tmp_new); - append_redir(cmd, p_srr, tmp_diff); - #ifdef FEAT_AUTOCMD -! block_autocmds(); /* Avoid ShellCmdPost stuff */ - #endif - (void)call_shell(cmd, SHELL_FILTER|SHELL_SILENT|SHELL_DOOUT); - #ifdef FEAT_AUTOCMD -! unblock_autocmds(); - #endif - vim_free(cmd); - } -*************** -*** 949,959 **** - # endif - eap->arg); - #ifdef FEAT_AUTOCMD -! ++autocmd_block; /* Avoid ShellCmdPost stuff */ - #endif - (void)call_shell(buf, SHELL_FILTER | SHELL_COOKED); - #ifdef FEAT_AUTOCMD -! --autocmd_block; - #endif - } - ---- 949,959 ---- - # endif - eap->arg); - #ifdef FEAT_AUTOCMD -! block_autocmds(); /* Avoid ShellCmdPost stuff */ - #endif - (void)call_shell(buf, SHELL_FILTER | SHELL_COOKED); - #ifdef FEAT_AUTOCMD -! unblock_autocmds(); - #endif - } - -*** ../vim-7.1.124/src/ex_getln.c Thu Sep 13 18:25:08 2007 ---- src/ex_getln.c Tue Sep 25 22:03:05 2007 -*************** -*** 5925,5931 **** - - # ifdef FEAT_AUTOCMD - /* Don't execute autocommands while creating the window. */ -! ++autocmd_block; - # endif - /* don't use a new tab page */ - cmdmod.tab = 0; ---- 5925,5931 ---- - - # ifdef FEAT_AUTOCMD - /* Don't execute autocommands while creating the window. */ -! block_autocmds(); - # endif - /* don't use a new tab page */ - cmdmod.tab = 0; -*************** -*** 5934,5939 **** ---- 5934,5942 ---- - if (win_split((int)p_cwh, WSP_BOT) == FAIL) - { - beep_flush(); -+ # ifdef FEAT_AUTOCMD -+ unblock_autocmds(); -+ # endif - return K_IGNORE; - } - cmdwin_type = ccline.cmdfirstc; -*************** -*** 5956,5962 **** - - # ifdef FEAT_AUTOCMD - /* Do execute autocommands for setting the filetype (load syntax). */ -! --autocmd_block; - # endif - - /* Showing the prompt may have set need_wait_return, reset it. */ ---- 5959,5965 ---- - - # ifdef FEAT_AUTOCMD - /* Do execute autocommands for setting the filetype (load syntax). */ -! unblock_autocmds(); - # endif - - /* Showing the prompt may have set need_wait_return, reset it. */ -*************** -*** 6110,6116 **** - - # ifdef FEAT_AUTOCMD - /* Don't execute autocommands while deleting the window. */ -! ++autocmd_block; - # endif - wp = curwin; - bp = curbuf; ---- 6113,6119 ---- - - # ifdef FEAT_AUTOCMD - /* Don't execute autocommands while deleting the window. */ -! block_autocmds(); - # endif - wp = curwin; - bp = curbuf; -*************** -*** 6122,6128 **** - win_size_restore(&winsizes); - - # ifdef FEAT_AUTOCMD -! --autocmd_block; - # endif - } - ---- 6125,6131 ---- - win_size_restore(&winsizes); - - # ifdef FEAT_AUTOCMD -! unblock_autocmds(); - # endif - } - -*** ../vim-7.1.124/src/fileio.c Sun Aug 12 15:50:26 2007 ---- src/fileio.c Wed Sep 26 20:02:54 2007 -*************** -*** 7165,7170 **** ---- 7187,7193 ---- - - static event_T last_event; - static int last_group; -+ static int autocmd_blocked = 0; /* block all autocmds */ - - /* - * Show the autocommands for one AutoPat. -*************** -*** 8454,8460 **** - * Quickly return if there are no autocommands for this event or - * autocommands are blocked. - */ -! if (first_autopat[(int)event] == NULL || autocmd_block > 0) - goto BYPASS_AU; - - /* ---- 8477,8483 ---- - * Quickly return if there are no autocommands for this event or - * autocommands are blocked. - */ -! if (first_autopat[(int)event] == NULL || autocmd_blocked > 0) - goto BYPASS_AU; - - /* -*************** -*** 8766,8771 **** ---- 8789,8828 ---- - aubuflocal_remove(buf); - - return retval; -+ } -+ -+ # ifdef FEAT_EVAL -+ static char_u *old_termresponse = NULL; -+ # endif -+ -+ /* -+ * Block triggering autocommands until unblock_autocmd() is called. -+ * Can be used recursively, so long as it's symmetric. -+ */ -+ void -+ block_autocmds() -+ { -+ # ifdef FEAT_EVAL -+ /* Remember the value of v:termresponse. */ -+ if (autocmd_blocked == 0) -+ old_termresponse = get_vim_var_str(VV_TERMRESPONSE); -+ # endif -+ ++autocmd_blocked; -+ } -+ -+ void -+ unblock_autocmds() -+ { -+ --autocmd_blocked; -+ -+ # ifdef FEAT_EVAL -+ /* When v:termresponse was set while autocommands were blocked, trigger -+ * the autocommands now. Esp. useful when executing a shell command -+ * during startup (vimdiff). */ -+ if (autocmd_blocked == 0 -+ && get_vim_var_str(VV_TERMRESPONSE) != old_termresponse) -+ apply_autocmds(EVENT_TERMRESPONSE, NULL, NULL, FALSE, curbuf); -+ # endif - } - - /* -*** ../vim-7.1.124/src/globals.h Tue Sep 25 17:54:41 2007 ---- src/globals.h Tue Sep 25 22:03:39 2007 -*************** -*** 366,372 **** - EXTERN int autocmd_busy INIT(= FALSE); /* Is apply_autocmds() busy? */ - EXTERN int autocmd_no_enter INIT(= FALSE); /* *Enter autocmds disabled */ - EXTERN int autocmd_no_leave INIT(= FALSE); /* *Leave autocmds disabled */ -- EXTERN int autocmd_block INIT(= 0); /* block all autocmds */ - EXTERN int modified_was_set; /* did ":set modified" */ - EXTERN int did_filetype INIT(= FALSE); /* FileType event found */ - EXTERN int keep_filetype INIT(= FALSE); /* value for did_filetype when ---- 366,371 ---- -*** ../vim-7.1.124/src/misc2.c Thu May 10 19:58:47 2007 ---- src/misc2.c Tue Sep 25 22:04:39 2007 -*************** -*** 972,978 **** - return; - entered = TRUE; - -! ++autocmd_block; /* don't want to trigger autocommands here */ - - #ifdef FEAT_WINDOWS - /* close all tabs and windows */ ---- 973,979 ---- - return; - entered = TRUE; - -! block_autocmds(); /* don't want to trigger autocommands here */ - - #ifdef FEAT_WINDOWS - /* close all tabs and windows */ -*** ../vim-7.1.124/src/proto/fileio.pro Thu Jun 28 21:57:08 2007 ---- src/proto/fileio.pro Wed Sep 26 20:05:02 2007 -*************** -*** 40,45 **** ---- 41,48 ---- - int trigger_cursorhold __ARGS((void)); - int has_cursormoved __ARGS((void)); - int has_cursormovedI __ARGS((void)); -+ void block_autocmds __ARGS((void)); -+ void unblock_autocmds __ARGS((void)); - int has_autocmd __ARGS((event_T event, char_u *sfname, buf_T *buf)); - char_u *get_augroup_name __ARGS((expand_T *xp, int idx)); - char_u *set_context_in_autocmd __ARGS((expand_T *xp, char_u *arg, int doautocmd)); -*** ../vim-7.1.124/src/window.c Tue Sep 25 14:50:19 2007 ---- src/window.c Tue Sep 25 22:05:45 2007 -*************** -*** 1291,1297 **** - * Don't execute autocommands while creating the windows. Must do that - * when putting the buffers in the windows. - */ -! ++autocmd_block; - #endif - - /* todo is number of windows left to create */ ---- 1291,1297 ---- - * Don't execute autocommands while creating the windows. Must do that - * when putting the buffers in the windows. - */ -! block_autocmds(); - #endif - - /* todo is number of windows left to create */ -*************** -*** 1313,1319 **** - } - - #ifdef FEAT_AUTOCMD -! --autocmd_block; - #endif - - /* return actual number of windows */ ---- 1313,1319 ---- - } - - #ifdef FEAT_AUTOCMD -! unblock_autocmds(); - #endif - - /* return actual number of windows */ -*************** -*** 3415,3421 **** - * Don't execute autocommands while creating the tab pages. Must do that - * when putting the buffers in the windows. - */ -! ++autocmd_block; - #endif - - for (todo = count - 1; todo > 0; --todo) ---- 3415,3421 ---- - * Don't execute autocommands while creating the tab pages. Must do that - * when putting the buffers in the windows. - */ -! block_autocmds(); - #endif - - for (todo = count - 1; todo > 0; --todo) -*************** -*** 3423,3429 **** - break; - - #ifdef FEAT_AUTOCMD -! --autocmd_block; - #endif - - /* return actual number of tab pages */ ---- 3423,3429 ---- - break; - - #ifdef FEAT_AUTOCMD -! unblock_autocmds(); - #endif - - /* return actual number of tab pages */ -*************** -*** 4162,4168 **** - /* Don't execute autocommands while the window is not properly - * initialized yet. gui_create_scrollbar() may trigger a FocusGained - * event. */ -! ++autocmd_block; - #endif - /* - * link the window in the window list ---- 4162,4168 ---- - /* Don't execute autocommands while the window is not properly - * initialized yet. gui_create_scrollbar() may trigger a FocusGained - * event. */ -! block_autocmds(); - #endif - /* - * link the window in the window list -*************** -*** 4207,4213 **** - foldInitWin(newwin); - #endif - #ifdef FEAT_AUTOCMD -! --autocmd_block; - #endif - #ifdef FEAT_SEARCH_EXTRA - newwin->w_match_head = NULL; ---- 4207,4213 ---- - foldInitWin(newwin); - #endif - #ifdef FEAT_AUTOCMD -! unblock_autocmds(); - #endif - #ifdef FEAT_SEARCH_EXTRA - newwin->w_match_head = NULL; -*************** -*** 4232,4238 **** - #ifdef FEAT_AUTOCMD - /* Don't execute autocommands while the window is halfway being deleted. - * gui_mch_destroy_scrollbar() may trigger a FocusGained event. */ -! ++autocmd_block; - #endif - - #ifdef FEAT_MZSCHEME ---- 4232,4238 ---- - #ifdef FEAT_AUTOCMD - /* Don't execute autocommands while the window is halfway being deleted. - * gui_mch_destroy_scrollbar() may trigger a FocusGained event. */ -! block_autocmds(); - #endif - - #ifdef FEAT_MZSCHEME -*************** -*** 4295,4301 **** - vim_free(wp); - - #ifdef FEAT_AUTOCMD -! --autocmd_block; - #endif - } - ---- 4295,4301 ---- - vim_free(wp); - - #ifdef FEAT_AUTOCMD -! unblock_autocmds(); - #endif - } - -*** ../vim-7.1.124/src/version.c Sat Sep 29 13:15:29 2007 ---- src/version.c Sat Sep 29 14:08:31 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 125, - /**/ - --- -MICHAEL PALIN PLAYED: 1ST SOLDIER WITH A KEEN INTEREST IN BIRDS, DENNIS, MR - DUCK (A VILLAGE CARPENTER WHO IS ALMOST KEENER THAN - ANYONE ELSE TO BURN WITCHES), THREE-HEADED KNIGHT, SIR - GALAHAD, KING OF SWAMP CASTLE, BROTHER MAYNARD'S ROOMATE - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.126 b/7.1.126 deleted file mode 100644 index 4246b148..00000000 --- a/7.1.126 +++ /dev/null @@ -1,469 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.126 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.126 -Problem: ":vimgrep */*" fails when a BufRead autocommand changes directory. - (Bernhard Kuhn) -Solution: Change back to the original directory after loading a file. - Also: use shorten_fname1() to avoid duplicating code. -Files: src/buffer.c, src/ex_docmd.c, src/fileio.c, src/gui_gtk.c, - src/gui_w48.c, src/proto/ex_docmd.pro, src/proto/fileio.pro, - src/quickfix.c - - -*** ../vim-7.1.125/src/buffer.c Sat Sep 29 14:15:00 2007 ---- src/buffer.c Wed Sep 26 20:05:38 2007 -*************** -*** 4261,4272 **** - do_arg_all(count, forceit, keep_tabs) - int count; - int forceit; /* hide buffers in current windows */ -! int keep_tabs; /* keep curren tabs, for ":tab drop file" */ - { - int i; - win_T *wp, *wpnext; - char_u *opened; /* array of flags for which args are open */ -! int opened_len; /* lenght of opened[] */ - int use_firstwin = FALSE; /* use first window for arglist */ - int split_ret = OK; - int p_ea_save; ---- 4261,4272 ---- - do_arg_all(count, forceit, keep_tabs) - int count; - int forceit; /* hide buffers in current windows */ -! int keep_tabs; /* keep current tabs, for ":tab drop file" */ - { - int i; - win_T *wp, *wpnext; - char_u *opened; /* array of flags for which args are open */ -! int opened_len; /* length of opened[] */ - int use_firstwin = FALSE; /* use first window for arglist */ - int split_ret = OK; - int p_ea_save; -*************** -*** 4946,4955 **** - /* Expand "~/" in the file name at "line + 1" to a full path. - * Then try shortening it by comparing with the current directory */ - expand_env(xline, NameBuff, MAXPATHL); -! mch_dirname(IObuff, IOSIZE); -! sfname = shorten_fname(NameBuff, IObuff); -! if (sfname == NULL) -! sfname = NameBuff; - - buf = buflist_new(NameBuff, sfname, (linenr_T)0, BLN_LISTED); - if (buf != NULL) /* just in case... */ ---- 4946,4952 ---- - /* Expand "~/" in the file name at "line + 1" to a full path. - * Then try shortening it by comparing with the current directory */ - expand_env(xline, NameBuff, MAXPATHL); -! sfname = shorten_fname1(NameBuff); - - buf = buflist_new(NameBuff, sfname, (linenr_T)0, BLN_LISTED); - if (buf != NULL) /* just in case... */ -*** ../vim-7.1.125/src/ex_docmd.c Wed Sep 26 22:35:06 2007 ---- src/ex_docmd.c Wed Sep 26 20:29:36 2007 -*************** -*** 276,282 **** - static void ex_swapname __ARGS((exarg_T *eap)); - static void ex_syncbind __ARGS((exarg_T *eap)); - static void ex_read __ARGS((exarg_T *eap)); -- static void ex_cd __ARGS((exarg_T *eap)); - static void ex_pwd __ARGS((exarg_T *eap)); - static void ex_equal __ARGS((exarg_T *eap)); - static void ex_sleep __ARGS((exarg_T *eap)); ---- 276,281 ---- -*************** -*** 7778,7784 **** - /* - * ":cd", ":lcd", ":chdir" and ":lchdir". - */ -! static void - ex_cd(eap) - exarg_T *eap; - { ---- 7777,7783 ---- - /* - * ":cd", ":lcd", ":chdir" and ":lchdir". - */ -! void - ex_cd(eap) - exarg_T *eap; - { -*** ../vim-7.1.125/src/fileio.c Sat Sep 29 14:15:00 2007 ---- src/fileio.c Wed Sep 26 20:02:54 2007 -*************** -*** 114,120 **** - { - int bw_fd; /* file descriptor */ - char_u *bw_buf; /* buffer with data to be written */ -! int bw_len; /* lenght of data */ - #ifdef HAS_BW_FLAGS - int bw_flags; /* FIO_ flags */ - #endif ---- 114,120 ---- - { - int bw_fd; /* file descriptor */ - char_u *bw_buf; /* buffer with data to be written */ -! int bw_len; /* length of data */ - #ifdef HAS_BW_FLAGS - int bw_flags; /* FIO_ flags */ - #endif -*************** -*** 5552,5557 **** ---- 5553,5579 ---- - return (int)(p - buf); - } - #endif -+ -+ /* -+ * Try to find a shortname by comparing the fullname with the current -+ * directory. -+ * Returns "full_path" or pointer into "full_path" if shortened. -+ */ -+ char_u * -+ shorten_fname1(full_path) -+ char_u *full_path; -+ { -+ char_u dirname[MAXPATHL]; -+ char_u *p = full_path; -+ -+ if (mch_dirname(dirname, MAXPATHL) == OK) -+ { -+ p = shorten_fname(full_path, dirname); -+ if (p == NULL || *p == NUL) -+ p = full_path; -+ } -+ return p; -+ } - - /* - * Try to find a shortname by comparing the fullname with the current -*** ../vim-7.1.125/src/gui_gtk.c Tue Aug 14 14:59:41 2007 ---- src/gui_gtk.c Wed Sep 26 20:07:58 2007 -*************** -*** 1272,1278 **** - GtkWidget *fc; - #endif - char_u dirbuf[MAXPATHL]; -- char_u *p; - - # ifdef HAVE_GTK2 - title = CONVERT_TO_UTF8(title); ---- 1272,1277 ---- -*************** -*** 1363,1373 **** - return NULL; - - /* shorten the file name if possible */ -! mch_dirname(dirbuf, MAXPATHL); -! p = shorten_fname(gui.browse_fname, dirbuf); -! if (p == NULL) -! p = gui.browse_fname; -! return vim_strsave(p); - } - - #if defined(HAVE_GTK2) || defined(PROTO) ---- 1362,1368 ---- - return NULL; - - /* shorten the file name if possible */ -! return vim_strsave(shorten_fname1(gui.browse_fname)); - } - - #if defined(HAVE_GTK2) || defined(PROTO) -*************** -*** 1427,1437 **** - return NULL; - - /* shorten the file name if possible */ -! mch_dirname(dirbuf, MAXPATHL); -! p = shorten_fname(dirname, dirbuf); -! if (p == NULL || *p == NUL) -! p = dirname; -! p = vim_strsave(p); - g_free(dirname); - return p; - ---- 1422,1428 ---- - return NULL; - - /* shorten the file name if possible */ -! p = vim_strsave(shorten_fname1(dirname)); - g_free(dirname); - return p; - -*** ../vim-7.1.125/src/gui_w48.c Thu May 10 19:17:07 2007 ---- src/gui_w48.c Wed Sep 26 20:09:33 2007 -*************** -*** 3301,3311 **** - SetFocus(s_hwnd); - - /* Shorten the file name if possible */ -! mch_dirname(IObuff, IOSIZE); -! p = shorten_fname((char_u *)fileBuf, IObuff); -! if (p == NULL) -! p = (char_u *)fileBuf; -! return vim_strsave(p); - } - # endif /* FEAT_MBYTE */ - ---- 3301,3307 ---- - SetFocus(s_hwnd); - - /* Shorten the file name if possible */ -! return vim_strsave(shorten_fname1((char_u *)fileBuf)); - } - # endif /* FEAT_MBYTE */ - -*************** -*** 3450,3460 **** - SetFocus(s_hwnd); - - /* Shorten the file name if possible */ -! mch_dirname(IObuff, IOSIZE); -! p = shorten_fname((char_u *)fileBuf, IObuff); -! if (p == NULL) -! p = (char_u *)fileBuf; -! return vim_strsave(p); - } - #endif /* FEAT_BROWSE */ - ---- 3446,3452 ---- - SetFocus(s_hwnd); - - /* Shorten the file name if possible */ -! return vim_strsave(shorten_fname1((char_u *)fileBuf)); - } - #endif /* FEAT_BROWSE */ - -*** ../vim-7.1.125/src/proto/ex_docmd.pro Sun May 6 14:46:22 2007 ---- src/proto/ex_docmd.pro Wed Sep 26 20:30:10 2007 -*************** -*** 39,44 **** ---- 39,45 ---- - void tabpage_new __ARGS((void)); - void do_exedit __ARGS((exarg_T *eap, win_T *old_curwin)); - void free_cd_dir __ARGS((void)); -+ void ex_cd __ARGS((exarg_T *eap)); - void do_sleep __ARGS((long msec)); - int vim_mkdir_emsg __ARGS((char_u *name, int prot)); - FILE *open_exfile __ARGS((char_u *fname, int forceit, char *mode)); -*** ../vim-7.1.125/src/proto/fileio.pro Sat Sep 29 14:15:00 2007 ---- src/proto/fileio.pro Wed Sep 26 20:05:02 2007 -*************** -*** 6,11 **** ---- 6,12 ---- - int buf_write __ARGS((buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_T end, exarg_T *eap, int append, int forceit, int reset_changed, int filtering)); - void msg_add_fname __ARGS((buf_T *buf, char_u *fname)); - void msg_add_lines __ARGS((int insert_space, long lnum, long nchars)); -+ char_u *shorten_fname1 __ARGS((char_u *full_path)); - char_u *shorten_fname __ARGS((char_u *full_path, char_u *dir_name)); - void shorten_fnames __ARGS((int force)); - void shorten_filenames __ARGS((char_u **fnames, int count)); -*** ../vim-7.1.125/src/quickfix.c Sun Sep 16 13:26:56 2007 ---- src/quickfix.c Sun Sep 30 13:58:38 2007 -*************** -*** 2972,2977 **** ---- 2972,2978 ---- - regmmatch_T regmatch; - int fcount; - char_u **fnames; -+ char_u *fname; - char_u *s; - char_u *p; - int fi; -*************** -*** 2995,3000 **** ---- 2996,3004 ---- - int flags = 0; - colnr_T col; - long tomatch; -+ char_u dirname_start[MAXPATHL]; -+ char_u dirname_now[MAXPATHL]; -+ char_u *target_dir = NULL; - - switch (eap->cmdidx) - { -*************** -*** 3069,3085 **** - goto theend; - } - - seconds = (time_t)0; - for (fi = 0; fi < fcount && !got_int && tomatch > 0; ++fi) - { - if (time(NULL) > seconds) - { -! /* Display the file name every second or so. */ - seconds = time(NULL); - msg_start(); -! p = msg_strtrunc(fnames[fi], TRUE); - if (p == NULL) -! msg_outtrans(fnames[fi]); - else - { - msg_outtrans(p); ---- 3073,3095 ---- - goto theend; - } - -+ /* Remember the current directory, because a BufRead autocommand that does -+ * ":lcd %:p:h" changes the meaning of short path names. */ -+ mch_dirname(dirname_start, MAXPATHL); -+ - seconds = (time_t)0; - for (fi = 0; fi < fcount && !got_int && tomatch > 0; ++fi) - { -+ fname = shorten_fname1(fnames[fi]); - if (time(NULL) > seconds) - { -! /* Display the file name every second or so, show the user we are -! * working on it. */ - seconds = time(NULL); - msg_start(); -! p = msg_strtrunc(fname, TRUE); - if (p == NULL) -! msg_outtrans(fname); - else - { - msg_outtrans(p); -*************** -*** 3111,3117 **** - - /* Load file into a buffer, so that 'fileencoding' is detected, - * autocommands applied, etc. */ -! buf = load_dummy_buffer(fnames[fi]); - - p_mls = save_mls; - #if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL) ---- 3121,3139 ---- - - /* Load file into a buffer, so that 'fileencoding' is detected, - * autocommands applied, etc. */ -! buf = load_dummy_buffer(fname); -! -! /* When autocommands changed directory: go back. We assume it was -! * ":lcd %:p:h". */ -! mch_dirname(dirname_now, MAXPATHL); -! if (STRCMP(dirname_start, dirname_now) != 0) -! { -! exarg_T ea; -! -! ea.arg = dirname_start; -! ea.cmdidx = CMD_lcd; -! ex_cd(&ea); -! } - - p_mls = save_mls; - #if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL) -*************** -*** 3125,3131 **** - if (buf == NULL) - { - if (!got_int) -! smsg((char_u *)_("Cannot open file \"%s\""), fnames[fi]); - } - else - { ---- 3147,3153 ---- - if (buf == NULL) - { - if (!got_int) -! smsg((char_u *)_("Cannot open file \"%s\""), fname); - } - else - { -*************** -*** 3139,3147 **** - while (vim_regexec_multi(®match, curwin, buf, lnum, - col) > 0) - { - if (qf_add_entry(qi, &prevp, - NULL, /* dir */ -! fnames[fi], - 0, - ml_get_buf(buf, - regmatch.startpos[0].lnum + lnum, FALSE), ---- 3161,3170 ---- - while (vim_regexec_multi(®match, curwin, buf, lnum, - col) > 0) - { -+ ; - if (qf_add_entry(qi, &prevp, - NULL, /* dir */ -! fname, - 0, - ml_get_buf(buf, - regmatch.startpos[0].lnum + lnum, FALSE), -*************** -*** 3209,3214 **** ---- 3232,3244 ---- - - if (buf != NULL) - { -+ /* If the buffer is still loaded we need to use the -+ * directory we jumped to below. */ -+ if (buf == first_match_buf -+ && target_dir == NULL -+ && STRCMP(dirname_start, dirname_now) != 0) -+ target_dir = vim_strsave(dirname_now); -+ - /* The buffer is still loaded, the Filetype autocommands - * need to be done now, in that buffer. And the modelines - * need to be done (again). But not the window-local -*************** -*** 3252,3257 **** ---- 3282,3297 ---- - /* If we jumped to another buffer redrawing will already be - * taken care of. */ - redraw_for_dummy = FALSE; -+ -+ /* Jump to the directory used after loading the buffer. */ -+ if (curbuf == first_match_buf && target_dir != NULL) -+ { -+ exarg_T ea; -+ -+ ea.arg = target_dir; -+ ea.cmdidx = CMD_lcd; -+ ex_cd(&ea); -+ } - } - } - else -*************** -*** 3269,3274 **** ---- 3309,3315 ---- - } - - theend: -+ vim_free(target_dir); - vim_free(regmatch.regprog); - } - -*** ../vim-7.1.125/src/version.c Sat Sep 29 14:15:00 2007 ---- src/version.c Sun Sep 30 13:41:30 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 126, - /**/ - --- -The MS-Windows registry is no more hostile than any other bunch of state -information... that is held in a binary format... a format that nobody -understands... and is replicated and cached in a complex and largely -undocumented way... and contains large amounts of duplicate and obfuscated -information... (Ben Peterson) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.127 b/7.1.127 deleted file mode 100644 index 5f161fcd..00000000 --- a/7.1.127 +++ /dev/null @@ -1,78 +0,0 @@ -To: vim-dev@vim.org -Subject: About patch 7.1.127 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.127 -Problem: Memory leak when doing cmdline completion. (Dominique Pelle) -Solution: Free "orig" argument of ExpandOne() when it's not used. -Files: src/ex_getln.c - - -*** ../vim-7.1.126/src/ex_getln.c Sat Sep 29 14:15:00 2007 ---- src/ex_getln.c Sun Sep 30 17:55:47 2007 -*************** -*** 3316,3321 **** ---- 3316,3325 ---- - * Return a pointer to alloced memory containing the new string. - * Return NULL for failure. - * -+ * "orig" is the originally expanded string, copied to allocated memory. It -+ * should either be kept in orig_save or freed. When "mode" is WILD_NEXT or -+ * WILD_PREV "orig" should be NULL. -+ * - * Results are cached in xp->xp_files and xp->xp_numfiles, except when "mode" - * is WILD_EXPAND_FREE or WILD_ALL. - * -*************** -*** 3400,3406 **** - return NULL; - } - -! /* free old names */ - if (xp->xp_numfiles != -1 && mode != WILD_ALL && mode != WILD_LONGEST) - { - FreeWild(xp->xp_numfiles, xp->xp_files); ---- 3404,3410 ---- - return NULL; - } - -! /* free old names */ - if (xp->xp_numfiles != -1 && mode != WILD_ALL && mode != WILD_LONGEST) - { - FreeWild(xp->xp_numfiles, xp->xp_files); -*************** -*** 3540,3545 **** ---- 3544,3553 ---- - - if (mode == WILD_EXPAND_FREE || mode == WILD_ALL) - ExpandCleanup(xp); -+ -+ /* Free "orig" if it wasn't stored in "orig_save". */ -+ if (orig != orig_save) -+ vim_free(orig); - - return ss; - } -*** ../vim-7.1.126/src/version.c Sun Sep 30 14:00:41 2007 ---- src/version.c Sun Sep 30 14:20:14 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 127, - /**/ - --- -A M00se once bit my sister ... - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.128 b/7.1.128 deleted file mode 100644 index 6750de40..00000000 --- a/7.1.128 +++ /dev/null @@ -1,67 +0,0 @@ -To: vim-dev@vim.org -Subject: About patch 7.1.128 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.128 (extra) -Problem: Build problems with new version of Cygwin. -Solution: Remove -D__IID_DEFINED__, like with MingW. (Guopeng Wen) -Files: src/Make_cyg.mak - - -*** ../vim-7.1.127/src/Make_cyg.mak Sun Apr 30 20:46:49 2006 ---- src/Make_cyg.mak Sat Sep 29 13:09:34 2007 -*************** -*** 1,6 **** - # - # Makefile for VIM on Win32, using Cygnus gcc -! # Last updated by Dan Sharp. Last Change: 2006 Apr 30 - # - # Also read INSTALLpc.txt! - # ---- 1,6 ---- - # - # Makefile for VIM on Win32, using Cygnus gcc -! # Last updated by Dan Sharp. Last Change: 2007 Sep 29 - # - # Also read INSTALLpc.txt! - # -*************** -*** 503,509 **** - $(CC) -c $(CFLAGS) if_cscope.c -o $(OUTDIR)/if_cscope.o - - $(OUTDIR)/if_ole.o: if_ole.cpp $(INCL) -! $(CC) -c $(CFLAGS) -D__IID_DEFINED__ if_ole.cpp -o $(OUTDIR)/if_ole.o - - if_perl.c: if_perl.xs typemap - $(PERL)/bin/perl `cygpath -d $(PERL)/lib/ExtUtils/xsubpp` \ ---- 503,509 ---- - $(CC) -c $(CFLAGS) if_cscope.c -o $(OUTDIR)/if_cscope.o - - $(OUTDIR)/if_ole.o: if_ole.cpp $(INCL) -! $(CC) -c $(CFLAGS) if_ole.cpp -o $(OUTDIR)/if_ole.o - - if_perl.c: if_perl.xs typemap - $(PERL)/bin/perl `cygpath -d $(PERL)/lib/ExtUtils/xsubpp` \ -*** ../vim-7.1.127/src/version.c Sun Sep 30 22:10:45 2007 ---- src/version.c Sun Sep 30 22:27:51 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 128, - /**/ - --- -Mynd you, m00se bites Kan be pretty nasti ... - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.129 b/7.1.129 deleted file mode 100644 index f1da884f..00000000 --- a/7.1.129 +++ /dev/null @@ -1,56 +0,0 @@ -To: vim-dev@vim.org -Subject: About patch 7.1.129 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.129 (extra) -Problem: Win32: Can't get the user name when it is longer than 15 - characters. -Solution: Use UNLEN instead of MAX_COMPUTERNAME_LENGTH. (Alexei Alexandrov) -Files: src/os_win32.c - - -*** ../vim-7.1.128/src/os_win32.c Thu May 10 19:22:59 2007 ---- src/os_win32.c Mon Oct 1 20:07:24 2007 -*************** -*** 2378,2384 **** - char_u *s, - int len) - { -! char szUserName[MAX_COMPUTERNAME_LENGTH + 1]; - DWORD cch = sizeof szUserName; - - if (GetUserName(szUserName, &cch)) ---- 2378,2384 ---- - char_u *s, - int len) - { -! char szUserName[256 + 1]; /* UNLEN is 256 */ - DWORD cch = sizeof szUserName; - - if (GetUserName(szUserName, &cch)) -*** ../vim-7.1.128/src/version.c Sun Sep 30 22:28:08 2007 ---- src/version.c Mon Oct 1 20:32:52 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 129, - /**/ - --- -ARTHUR: It is I, Arthur, son of Uther Pendragon, from the castle of Camelot. - King of all Britons, defeator of the Saxons, sovereign of all England! - [Pause] -SOLDIER: Get away! - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.130 b/7.1.130 deleted file mode 100644 index f3c098de..00000000 --- a/7.1.130 +++ /dev/null @@ -1,363 +0,0 @@ -To: vim-dev@vim.org -Subject: About patch 7.1.130 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.130 -Problem: Crash with specific order of undo and redo. (A.Politz) -Solution: Clear and adjust pointers properly. Add u_check() for debugging. -Files: src/undo.c, src/structs.h - - -*** ../vim-7.1.129/src/undo.c Thu May 10 20:01:43 2007 ---- src/undo.c Mon Oct 1 22:49:16 2007 -*************** -*** 76,81 **** ---- 76,87 ---- - * buffer is unloaded. - */ - -+ /* Uncomment the next line for including the u_check() function. This warns -+ * for errors in the debug information. */ -+ /* #define U_DEBUG 1 */ -+ #define UH_MAGIC 0x18dade /* value for uh_magic when in use */ -+ #define UE_MAGIC 0xabc123 /* value for ue_magic when in use */ -+ - #include "vim.h" - - /* See below: use malloc()/free() for memory management. */ -*************** -*** 113,118 **** ---- 119,213 ---- - */ - static int undo_undoes = FALSE; - -+ #ifdef U_DEBUG -+ /* -+ * Check the undo structures for being valid. Print a warning when something -+ * looks wrong. -+ */ -+ static int seen_b_u_curhead; -+ static int seen_b_u_newhead; -+ static int header_count; -+ -+ static void -+ u_check_tree(u_header_T *uhp, -+ u_header_T *exp_uh_next, -+ u_header_T *exp_uh_alt_prev) -+ { -+ u_entry_T *uep; -+ -+ if (uhp == NULL) -+ return; -+ ++header_count; -+ if (uhp == curbuf->b_u_curhead && ++seen_b_u_curhead > 1) -+ { -+ EMSG("b_u_curhead found twice (looping?)"); -+ return; -+ } -+ if (uhp == curbuf->b_u_newhead && ++seen_b_u_newhead > 1) -+ { -+ EMSG("b_u_newhead found twice (looping?)"); -+ return; -+ } -+ -+ if (uhp->uh_magic != UH_MAGIC) -+ EMSG("uh_magic wrong (may be using freed memory)"); -+ else -+ { -+ /* Check pointers back are correct. */ -+ if (uhp->uh_next != exp_uh_next) -+ { -+ EMSG("uh_next wrong"); -+ smsg((char_u *)"expected: 0x%x, actual: 0x%x", -+ exp_uh_next, uhp->uh_next); -+ } -+ if (uhp->uh_alt_prev != exp_uh_alt_prev) -+ { -+ EMSG("uh_alt_prev wrong"); -+ smsg((char_u *)"expected: 0x%x, actual: 0x%x", -+ exp_uh_alt_prev, uhp->uh_alt_prev); -+ } -+ -+ /* Check the undo tree at this header. */ -+ for (uep = uhp->uh_entry; uep != NULL; uep = uep->ue_next) -+ { -+ if (uep->ue_magic != UE_MAGIC) -+ { -+ EMSG("ue_magic wrong (may be using freed memory)"); -+ break; -+ } -+ } -+ -+ /* Check the next alt tree. */ -+ u_check_tree(uhp->uh_alt_next, uhp->uh_next, uhp); -+ -+ /* Check the next header in this branch. */ -+ u_check_tree(uhp->uh_prev, uhp, NULL); -+ } -+ } -+ -+ void -+ u_check(int newhead_may_be_NULL) -+ { -+ seen_b_u_newhead = 0; -+ seen_b_u_curhead = 0; -+ header_count = 0; -+ -+ u_check_tree(curbuf->b_u_oldhead, NULL, NULL); -+ -+ if (seen_b_u_newhead == 0 && curbuf->b_u_oldhead != NULL -+ && !(newhead_may_be_NULL && curbuf->b_u_newhead == NULL)) -+ EMSGN("b_u_newhead invalid: 0x%x", curbuf->b_u_newhead); -+ if (curbuf->b_u_curhead != NULL && seen_b_u_curhead == 0) -+ EMSGN("b_u_curhead invalid: 0x%x", curbuf->b_u_curhead); -+ if (header_count != curbuf->b_u_numhead) -+ { -+ EMSG("b_u_numhead invalid"); -+ smsg((char_u *)"expected: %ld, actual: %ld", -+ (long)header_count, (long)curbuf->b_u_numhead); -+ } -+ } -+ #endif -+ - /* - * Save the current line for both the "u" and "U" command. - * Returns OK or FAIL. -*************** -*** 243,248 **** ---- 338,346 ---- - if (!undo_allowed()) - return FAIL; - -+ #ifdef U_DEBUG -+ u_check(FALSE); -+ #endif - #ifdef FEAT_NETBEANS_INTG - /* - * Netbeans defines areas that cannot be modified. Bail out here when -*************** -*** 294,299 **** ---- 392,400 ---- - uhp = (u_header_T *)U_ALLOC_LINE((unsigned)sizeof(u_header_T)); - if (uhp == NULL) - goto nomem; -+ #ifdef U_DEBUG -+ uhp->uh_magic = UH_MAGIC; -+ #endif - } - else - uhp = NULL; -*************** -*** 316,323 **** - { - u_header_T *uhfree = curbuf->b_u_oldhead; - -! /* If there is no branch only free one header. */ -! if (uhfree->uh_alt_next == NULL) - u_freeheader(curbuf, uhfree, &old_curhead); - else - { ---- 417,427 ---- - { - u_header_T *uhfree = curbuf->b_u_oldhead; - -! if (uhfree == old_curhead) -! /* Can't reconnect the branch, delete all of it. */ -! u_freebranch(curbuf, uhfree, &old_curhead); -! else if (uhfree->uh_alt_next == NULL) -! /* There is no branch, only free one header. */ - u_freeheader(curbuf, uhfree, &old_curhead); - else - { -*************** -*** 326,331 **** ---- 430,438 ---- - uhfree = uhfree->uh_alt_next; - u_freebranch(curbuf, uhfree, &old_curhead); - } -+ #ifdef U_DEBUG -+ u_check(TRUE); -+ #endif - } - - if (uhp == NULL) /* no undo at all */ -*************** -*** 478,483 **** ---- 585,593 ---- - uep = (u_entry_T *)U_ALLOC_LINE((unsigned)sizeof(u_entry_T)); - if (uep == NULL) - goto nomem; -+ #ifdef U_DEBUG -+ uep->ue_magic = UE_MAGIC; -+ #endif - - uep->ue_size = size; - uep->ue_top = top; -*************** -*** 525,530 **** ---- 635,643 ---- - curbuf->b_u_synced = FALSE; - undo_undoes = FALSE; - -+ #ifdef U_DEBUG -+ u_check(FALSE); -+ #endif - return OK; - - nomem: -*************** -*** 955,960 **** ---- 1068,1076 ---- - int empty_buffer; /* buffer became empty */ - u_header_T *curhead = curbuf->b_u_curhead; - -+ #ifdef U_DEBUG -+ u_check(FALSE); -+ #endif - old_flags = curhead->uh_flags; - new_flags = (curbuf->b_changed ? UH_CHANGED : 0) + - ((curbuf->b_ml.ml_flags & ML_EMPTY) ? UH_EMPTYBUF : 0); -*************** -*** 1186,1191 **** ---- 1302,1310 ---- - /* The timestamp can be the same for multiple changes, just use the one of - * the undone/redone change. */ - curbuf->b_u_seq_time = curhead->uh_time; -+ #ifdef U_DEBUG -+ u_check(FALSE); -+ #endif - } - - /* -*************** -*** 1515,1521 **** - } - - /* -! * Free one header and its entry list and adjust the pointers. - */ - static void - u_freeheader(buf, uhp, uhpp) ---- 1634,1640 ---- - } - - /* -! * Free one header "uhp" and its entry list and adjust the pointers. - */ - static void - u_freeheader(buf, uhp, uhpp) -*************** -*** 1523,1528 **** ---- 1642,1649 ---- - u_header_T *uhp; - u_header_T **uhpp; /* if not NULL reset when freeing this header */ - { -+ u_header_T *uhap; -+ - /* When there is an alternate redo list free that branch completely, - * because we can never go there. */ - if (uhp->uh_alt_next != NULL) -*************** -*** 1540,1546 **** - if (uhp->uh_prev == NULL) - buf->b_u_newhead = uhp->uh_next; - else -! uhp->uh_prev->uh_next = uhp->uh_next; - - u_freeentries(buf, uhp, uhpp); - } ---- 1661,1668 ---- - if (uhp->uh_prev == NULL) - buf->b_u_newhead = uhp->uh_next; - else -! for (uhap = uhp->uh_prev; uhap != NULL; uhap = uhap->uh_alt_next) -! uhap->uh_next = uhp->uh_next; - - u_freeentries(buf, uhp, uhpp); - } -*************** -*** 1585,1590 **** ---- 1707,1714 ---- - /* Check for pointers to the header that become invalid now. */ - if (buf->b_u_curhead == uhp) - buf->b_u_curhead = NULL; -+ if (buf->b_u_newhead == uhp) -+ buf->b_u_newhead = NULL; /* freeing the newest entry */ - if (uhpp != NULL && uhp == *uhpp) - *uhpp = NULL; - -*************** -*** 1594,1599 **** ---- 1718,1726 ---- - u_freeentry(uep, uep->ue_size); - } - -+ #ifdef U_DEBUG -+ uhp->uh_magic = 0; -+ #endif - U_FREE_LINE((char_u *)uhp); - --buf->b_u_numhead; - } -*************** -*** 1609,1614 **** ---- 1736,1744 ---- - while (n > 0) - U_FREE_LINE(uep->ue_array[--n]); - U_FREE_LINE((char_u *)uep->ue_array); -+ #ifdef U_DEBUG -+ uep->ue_magic = 0; -+ #endif - U_FREE_LINE((char_u *)uep); - } - -*** ../vim-7.1.129/src/structs.h Sun Aug 12 15:50:26 2007 ---- src/structs.h Sat Sep 29 15:03:38 2007 -*************** -*** 278,283 **** ---- 278,286 ---- - linenr_T ue_lcount; /* linecount when u_save called */ - char_u **ue_array; /* array of lines in undo block */ - long ue_size; /* number of lines in ue_array */ -+ #ifdef U_DEBUG -+ int ue_magic; /* magic number to check allocation */ -+ #endif - }; - - struct u_header -*************** -*** 300,305 **** ---- 303,311 ---- - visualinfo_T uh_visual; /* Visual areas before undo/after redo */ - #endif - time_t uh_time; /* timestamp when the change was made */ -+ #ifdef U_DEBUG -+ int uh_magic; /* magic number to check allocation */ -+ #endif - }; - - /* values for uh_flags */ -*** ../vim-7.1.129/src/version.c Mon Oct 1 20:33:45 2007 ---- src/version.c Mon Oct 1 22:50:23 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 130, - /**/ - --- -FIRST SOLDIER: So they wouldn't be able to bring a coconut back anyway. -SECOND SOLDIER: Wait a minute! Suppose two swallows carried it together? -FIRST SOLDIER: No, they'd have to have it on a line. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.131 b/7.1.131 deleted file mode 100644 index 830a7dc1..00000000 --- a/7.1.131 +++ /dev/null @@ -1,50 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.131 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.131 -Problem: ":mksession" always adds ":setlocal autoread". (Christian J. - Robinson) -Solution: Skip boolean global/local option using global value. -Files: src/option.c - - -*** ../vim-7.1.130/src/option.c Wed Sep 26 22:35:06 2007 ---- src/option.c Sun Sep 30 16:21:08 2007 -*************** -*** 8753,8758 **** ---- 8753,8760 ---- - char *name; - int value; - { -+ if (value < 0) /* global/local option using global value */ -+ return OK; - if (fprintf(fd, "%s %s%s", cmd, value ? "" : "no", name) < 0 - || put_eol(fd) < 0) - return FAIL; -*** ../vim-7.1.130/src/version.c Mon Oct 1 22:53:27 2007 ---- src/version.c Tue Oct 2 20:39:02 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 131, - /**/ - --- -ARTHUR: Old woman! -DENNIS: Man! -ARTHUR: Man. I'm sorry. Old man, What knight live in that castle over there? -DENNIS: I'm thirty-seven. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.132 b/7.1.132 deleted file mode 100644 index 0d549d0e..00000000 --- a/7.1.132 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.132 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.132 -Problem: getpos("'>") may return a negative column number for a Linewise - selection. (A.Politz) -Solution: Don't add one to MAXCOL. -Files: src/eval.c - - -*** ../vim-7.1.131/src/eval.c Tue Sep 25 20:39:14 2007 ---- src/eval.c Mon Oct 1 20:56:09 2007 -*************** -*** 10388,10394 **** - list_append_number(l, (varnumber_T)0); - list_append_number(l, (fp != NULL) ? (varnumber_T)fp->lnum - : (varnumber_T)0); -! list_append_number(l, (fp != NULL) ? (varnumber_T)fp->col + 1 - : (varnumber_T)0); - list_append_number(l, - #ifdef FEAT_VIRTUALEDIT ---- 10388,10395 ---- - list_append_number(l, (varnumber_T)0); - list_append_number(l, (fp != NULL) ? (varnumber_T)fp->lnum - : (varnumber_T)0); -! list_append_number(l, (fp != NULL) -! ? (varnumber_T)(fp->col == MAXCOL ? MAXCOL : fp->col + 1) - : (varnumber_T)0); - list_append_number(l, - #ifdef FEAT_VIRTUALEDIT -*** ../vim-7.1.131/src/version.c Tue Oct 2 20:40:01 2007 ---- src/version.c Tue Oct 2 22:07:17 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 132, - /**/ - --- -"The future's already arrived - it's just not evenly distributed yet." - -- William Gibson - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.133 b/7.1.133 deleted file mode 100644 index c41190d9..00000000 --- a/7.1.133 +++ /dev/null @@ -1,56 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.133 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.133 (after 7.1.126) -Problem: shorten_fname1() linked when it's not needed. -Solution: Add #ifdef. -Files: src/fileio.c - - -*** ../vim-7.1.132/src/fileio.c Sun Sep 30 14:00:41 2007 ---- src/fileio.c Sun Sep 30 16:32:43 2007 -*************** -*** 5553,5558 **** ---- 5554,5561 ---- - } - #endif - -+ #if defined(FEAT_VIMINFO) || defined(FEAT_BROWSE) || \ -+ defined(FEAT_QUICKFIX) || defined(PROTO) - /* - * Try to find a shortname by comparing the fullname with the current - * directory. -*************** -*** 5573,5578 **** ---- 5576,5582 ---- - } - return p; - } -+ #endif - - /* - * Try to find a shortname by comparing the fullname with the current -*** ../vim-7.1.132/src/version.c Tue Oct 2 22:07:58 2007 ---- src/version.c Wed Oct 3 12:46:59 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 133, - /**/ - --- -"Beware of bugs in the above code; I have only proved -it correct, not tried it." -- Donald Knuth - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.134 b/7.1.134 deleted file mode 100644 index 7fbf6650..00000000 --- a/7.1.134 +++ /dev/null @@ -1,377 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.134 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.134 (extra) -Problem: Win32: Can't build with VC8 -Solution: Detect the MSVC version instead of using NMAKE_VER. - (Mike Williams) -Files: src/Make_mvc.mak - - -*** ../vim-7.1.133/src/Make_mvc.mak Tue Feb 20 03:15:08 2007 ---- src/Make_mvc.mak Mon Oct 1 21:37:20 2007 -*************** -*** 92,97 **** ---- 92,99 ---- - # Netbeans Debugging Support: NBDEBUG=[yes or no] (should be no, yes - # doesn't work) - # -+ # Visual C Version: MSVCVER=m.n (default derived from nmake if undefined) -+ # - # You can combine any of these interfaces - # - # Example: To build the non-debug, GUI version with Perl interface: -*************** -*** 101,107 **** - # This makefile gives a fineness of control which is not supported in - # Visual C++ configuration files. Therefore, debugging requires a bit of - # extra work. -! # Make_dvc.mak is a Visual C++ project to access that support. - # To use Make_dvc.mak: - # 1) Build Vim with Make_mvc.mak. - # Use a "DEBUG=yes" argument to build Vim with debug support. ---- 103,110 ---- - # This makefile gives a fineness of control which is not supported in - # Visual C++ configuration files. Therefore, debugging requires a bit of - # extra work. -! # Make_dvc.mak is a Visual C++ project to access that support. It may be -! # badly out of date for the Visual C++ you are using... - # To use Make_dvc.mak: - # 1) Build Vim with Make_mvc.mak. - # Use a "DEBUG=yes" argument to build Vim with debug support. -*************** -*** 198,211 **** - !if "$(DEBUG)" != "yes" - NODEBUG = 1 - !else - MAKEFLAGS_GVIMEXT = DEBUG=yes - !endif - - -! # Get all sorts of useful, standard macros from the SDK. (Note that -! # MSVC 2.2 does not install in the \msvc20\include -! # directory, but you can find it in \msvc20\include on the CD-ROM. -! # You may also need from the same place.) - - !include - ---- 201,212 ---- - !if "$(DEBUG)" != "yes" - NODEBUG = 1 - !else -+ !undef NODEBUG - MAKEFLAGS_GVIMEXT = DEBUG=yes - !endif - - -! # Get all sorts of useful, standard macros from the Platform SDK. - - !include - -*************** -*** 272,283 **** - - # Set which version of the CRT to use - !if defined(USE_MSVCRT) -! CVARS = $(cvarsdll) - # !elseif defined(MULTITHREADED) - # CVARS = $(cvarsmt) - !else - # CVARS = $(cvars) -! CVARS = $(cvarsmt) - !endif - - # need advapi32.lib for GetUserName() ---- 273,284 ---- - - # Set which version of the CRT to use - !if defined(USE_MSVCRT) -! # CVARS = $(cvarsdll) - # !elseif defined(MULTITHREADED) - # CVARS = $(cvarsmt) - !else - # CVARS = $(cvars) -! # CVARS = $(cvarsmt) - !endif - - # need advapi32.lib for GetUserName() -*************** -*** 320,326 **** ---- 321,364 ---- - INTDIR=$(OBJDIR) - OUTDIR=$(OBJDIR) - -+ # Derive version of VC being used from nmake if not specified -+ !if "$(MSVCVER)" == "" -+ !if "$(_NMAKE_VER)" == "" -+ MSVCVER = 4.0 -+ !endif -+ !if "$(_NMAKE_VER)" == "162" -+ MSVCVER = 5.0 -+ !endif -+ !if "$(_NMAKE_VER)" == "6.00.8168.0" -+ MSVCVER = 6.0 -+ !endif -+ !if "$(_NMAKE_VER)" == "7.00.9466" -+ MSVCVER = 7.0 -+ !endif -+ !if "$(_NMAKE_VER)" == "7.10.3077" -+ MSVCVER = 7.1 -+ !endif -+ !if "$(_NMAKE_VER)" == "8.00.50727.42" -+ MSVCVER = 8.0 -+ !endif -+ !if "$(_NMAKE_VER)" == "8.00.50727.762" -+ MSVCVER = 8.0 -+ !endif -+ !endif -+ -+ # Abort bulding VIM if version of VC is unrecognised. -+ !ifndef MSVCVER -+ !message *** ERROR -+ !message Cannot determine Visual C version being used. If you are using the -+ !message Windows SDK then you must have the environment variable MSVCVER set to -+ !message your version of the VC compiler. If you are not using the Express -+ !message version of Visual C you van either set MSVCVER or update this makefile -+ !message to handle the new value for _NMAKE_VER. -+ !error Make aborted. -+ !endif -+ - # Convert processor ID to MVC-compatible number -+ !if "$(MSVCVER)" != "8.0" - !if "$(CPUNR)" == "i386" - CPUARG = /G3 - !elseif "$(CPUNR)" == "i486" -*************** -*** 334,339 **** ---- 372,386 ---- - !else - CPUARG = - !endif -+ !else -+ # VC8 only allows specifying SSE architecture -+ !if "$(CPUNR)" == "pentium4" -+ CPUARG = /arch:SSE2 -+ !endif -+ !endif -+ -+ LIBC = -+ DEBUGINFO = /Zi - - !ifdef NODEBUG - VIM = vim -*************** -*** 344,384 **** - !else # MAXSPEED - OPTFLAG = /Ox - !endif - CFLAGS = $(CFLAGS) $(OPTFLAG) -DNDEBUG $(CPUARG) - RCFLAGS = $(rcflags) $(rcvars) -DNDEBUG - ! ifdef USE_MSVCRT -! CFLAGS = $(CFLAGS) -MD - LIBC = msvcrt.lib -- # CFLAGS = $(CFLAGS) $(cvarsdll) -- # ! elseif defined(MULTITHREADED) -- # LIBC = libcmt.lib -- # CFLAGS = $(CFLAGS) $(cvarsmt) - ! else -- # LIBC = libc.lib - LIBC = libcmt.lib -! # CFLAGS = $(CFLAGS) $(cvars) - ! endif - !else # DEBUG - VIM = vimd - CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG /Od - RCFLAGS = $(rcflags) $(rcvars) -D_DEBUG -DDEBUG - # The /fixed:no is needed for Quantify. Assume not 4.? as unsupported in VC4.0. -! ! if "$(_NMAKE_VER)" == "" - LIBC = - ! else - LIBC = /fixed:no - ! endif - ! ifdef USE_MSVCRT -! CFLAGS = $(CFLAGS) -MDd - LIBC = $(LIBC) msvcrtd.lib -- # CFLAGS = $(CFLAGS) $(cvarsdll) -- # ! elseif defined(MULTITHREADED) -- # LIBC = $(LIBC) libcmtd.lib -- # CFLAGS = $(CFLAGS) $(cvarsmt) - ! else -- # LIBC = $(LIBC) libcd.lib - LIBC = $(LIBC) libcmtd.lib -! # CFLAGS = $(CFLAGS) $(cvars) - ! endif - !endif # DEBUG - ---- 391,430 ---- - !else # MAXSPEED - OPTFLAG = /Ox - !endif -+ !if "$(MSVCVER)" == "8.0" -+ # Use link time code generation if not worried about size -+ !if "$(OPTIMIZE)" != "SPACE" -+ OPTFLAG = $(OPTFLAG) /GL -+ !endif -+ !endif - CFLAGS = $(CFLAGS) $(OPTFLAG) -DNDEBUG $(CPUARG) - RCFLAGS = $(rcflags) $(rcvars) -DNDEBUG - ! ifdef USE_MSVCRT -! CFLAGS = $(CFLAGS) /MD - LIBC = msvcrt.lib - ! else - LIBC = libcmt.lib -! CFLAGS = $(CFLAGS) /MT - ! endif - !else # DEBUG - VIM = vimd -+ ! if "$(CPU)" == "i386" -+ DEBUGINFO = /ZI -+ ! endif - CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG /Od - RCFLAGS = $(rcflags) $(rcvars) -D_DEBUG -DDEBUG - # The /fixed:no is needed for Quantify. Assume not 4.? as unsupported in VC4.0. -! ! if "$(MSVCVER)" == "4.0" - LIBC = - ! else - LIBC = /fixed:no - ! endif - ! ifdef USE_MSVCRT -! CFLAGS = $(CFLAGS) /MDd - LIBC = $(LIBC) msvcrtd.lib - ! else - LIBC = $(LIBC) libcmtd.lib -! CFLAGS = $(CFLAGS) /MTd - ! endif - !endif # DEBUG - -*************** -*** 681,696 **** - # - # Always generate the .pdb file, so that we get debug symbols that can be used - # on a crash (doesn't add overhead to the executable). - # -! CFLAGS = $(CFLAGS) /Zi /Fd$(OUTDIR)/ -! LINK_PDB = /PDB:$(VIM).pdb -debug # -debug:full -debugtype:cv,fixup - - # - # End extra feature include - # - !message - -! conflags = /nologo /subsystem:$(SUBSYSTEM) /incremental:no - - PATHDEF_SRC = $(OUTDIR)\pathdef.c - ---- 727,744 ---- - # - # Always generate the .pdb file, so that we get debug symbols that can be used - # on a crash (doesn't add overhead to the executable). -+ # Generate edit-and-continue debug info when no optimization - allows to -+ # debug more conveniently (able to look at variables which are in registers) - # -! CFLAGS = $(CFLAGS) /Fd$(OUTDIR)/ $(DEBUGINFO) -! LINK_PDB = /PDB:$(VIM).pdb -debug - - # - # End extra feature include - # - !message - -! conflags = /nologo /subsystem:$(SUBSYSTEM) - - PATHDEF_SRC = $(OUTDIR)\pathdef.c - -*************** -*** 702,712 **** - conflags = $(conflags) /map /mapinfo:lines - !ENDIF - -! LINKARGS1 = $(linkdebug) $(conflags) /nodefaultlib:libc - LINKARGS2 = $(CON_LIB) $(GUI_LIB) $(LIBC) $(OLE_LIB) user32.lib $(SNIFF_LIB) \ - $(MZSCHEME_LIB) $(PERL_LIB) $(PYTHON_LIB) $(RUBY_LIB) \ - $(TCL_LIB) $(NETBEANS_LIB) $(XPM_LIB) $(LINK_PDB) - - all: $(VIM).exe vimrun.exe install.exe uninstal.exe xxd/xxd.exe \ - GvimExt/gvimext.dll - ---- 750,769 ---- - conflags = $(conflags) /map /mapinfo:lines - !ENDIF - -! LINKARGS1 = $(linkdebug) $(conflags) - LINKARGS2 = $(CON_LIB) $(GUI_LIB) $(LIBC) $(OLE_LIB) user32.lib $(SNIFF_LIB) \ - $(MZSCHEME_LIB) $(PERL_LIB) $(PYTHON_LIB) $(RUBY_LIB) \ - $(TCL_LIB) $(NETBEANS_LIB) $(XPM_LIB) $(LINK_PDB) - -+ # Report link time code generation progress if used. -+ !ifdef NODEBUG -+ !if "$(MSVCVER)" == "8.0" -+ !if "$(OPTIMIZE)" != "SPACE" -+ LINKARGS1 = $(LINKARGS1) /LTCG:STATUS -+ !endif -+ !endif -+ !endif -+ - all: $(VIM).exe vimrun.exe install.exe uninstal.exe xxd/xxd.exe \ - GvimExt/gvimext.dll - -*************** -*** 794,800 **** - - # Create a default rule for transforming .c files to .obj files in $(OUTDIR) - # Batch compilation is supported by nmake 1.62 (part of VS 5.0) and later) -! !IF "$(_NMAKE_VER)" == "" - .c{$(OUTDIR)/}.obj: - !ELSE - .c{$(OUTDIR)/}.obj:: ---- 851,857 ---- - - # Create a default rule for transforming .c files to .obj files in $(OUTDIR) - # Batch compilation is supported by nmake 1.62 (part of VS 5.0) and later) -! !IF "$(MSVCVER)" == "4.0" - .c{$(OUTDIR)/}.obj: - !ELSE - .c{$(OUTDIR)/}.obj:: -*************** -*** 803,809 **** - - # Create a default rule for transforming .cpp files to .obj files in $(OUTDIR) - # Batch compilation is supported by nmake 1.62 (part of VS 5.0) and later) -! !IF "$(_NMAKE_VER)" == "" - .cpp{$(OUTDIR)/}.obj: - !ELSE - .cpp{$(OUTDIR)/}.obj:: ---- 860,866 ---- - - # Create a default rule for transforming .cpp files to .obj files in $(OUTDIR) - # Batch compilation is supported by nmake 1.62 (part of VS 5.0) and later) -! !IF "$(MSVCVER)" == "4.0" - .cpp{$(OUTDIR)/}.obj: - !ELSE - .cpp{$(OUTDIR)/}.obj:: -*** ../vim-7.1.133/src/version.c Wed Oct 3 12:49:24 2007 ---- src/version.c Wed Oct 3 13:23:51 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 134, - /**/ - --- -BLACK KNIGHT: The Black Knight always triumphs. Have at you! - ARTHUR takes his last leg off. The BLACK KNIGHT's body lands upright. -BLACK KNIGHT: All right, we'll call it a draw. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.135 b/7.1.135 deleted file mode 100644 index db9b0ccb..00000000 --- a/7.1.135 +++ /dev/null @@ -1,106 +0,0 @@ -To: vim-dev@vim.org -Subject: patch 7.1.135 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.135 -Problem: Win32: When editing a file c:\tmp\foo and c:\tmp\\foo we have two - buffers for the same file. (Suresh Govindachar) -Solution: Invoke FullName_save() when a path contains "//" or "\\". -Files: src/buffer.c - - -*** ../vim-7.1.134/src/buffer.c Sun Sep 30 14:00:41 2007 ---- src/buffer.c Wed Oct 3 14:24:52 2007 -*************** -*** 4175,4203 **** - * mess up the full path name, even though it starts with a '/'. - * Also expand when there is ".." in the file name, try to remove it, - * because "c:/src/../README" is equal to "c:/README". - * For MS-Windows also expand names like "longna~1" to "longname". - */ - #ifdef UNIX - return FullName_save(fname, TRUE); - #else -! if (!vim_isAbsName(fname) || strstr((char *)fname, "..") != NULL -! #if defined(MSWIN) || defined(DJGPP) - || vim_strchr(fname, '~') != NULL -! #endif - ) - return FullName_save(fname, FALSE); - - fname = vim_strsave(fname); - -! #ifdef USE_FNAME_CASE -! # ifdef USE_LONG_FNAME - if (USE_LONG_FNAME) -! # endif - { - if (fname != NULL) - fname_case(fname, 0); /* set correct case for file name */ - } -! #endif - - return fname; - #endif ---- 4175,4209 ---- - * mess up the full path name, even though it starts with a '/'. - * Also expand when there is ".." in the file name, try to remove it, - * because "c:/src/../README" is equal to "c:/README". -+ * Similarly "c:/src//file" is equal to "c:/src/file". - * For MS-Windows also expand names like "longna~1" to "longname". - */ - #ifdef UNIX - return FullName_save(fname, TRUE); - #else -! if (!vim_isAbsName(fname) -! || strstr((char *)fname, "..") != NULL -! || strstr((char *)fname, "//") != NULL -! # ifdef BACKSLASH_IN_FILENAME -! || strstr((char *)fname, "\\\\") != NULL -! # endif -! # if defined(MSWIN) || defined(DJGPP) - || vim_strchr(fname, '~') != NULL -! # endif - ) - return FullName_save(fname, FALSE); - - fname = vim_strsave(fname); - -! # ifdef USE_FNAME_CASE -! # ifdef USE_LONG_FNAME - if (USE_LONG_FNAME) -! # endif - { - if (fname != NULL) - fname_case(fname, 0); /* set correct case for file name */ - } -! # endif - - return fname; - #endif -*** ../vim-7.1.134/src/version.c Wed Oct 3 13:28:40 2007 ---- src/version.c Wed Oct 3 14:26:54 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 135, - /**/ - --- - A village. Sound of chanting of Latin canon, punctuated by short, sharp - cracks. It comes nearer. We see it is a line of MONKS ala SEVENTH SEAL - flagellation scene, chanting and banging themselves on the foreheads with - wooden boards. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.136 b/7.1.136 deleted file mode 100644 index c1a9a82c..00000000 --- a/7.1.136 +++ /dev/null @@ -1,47 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.136 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.136 -Problem: Memory leak when using Ruby syntax highlighting. (Dominique Pelle) -Solution: Free the contained-in list. -Files: src/syntax.c - - -*** ../vim-7.1.135/src/syntax.c Thu Aug 30 19:36:52 2007 ---- src/syntax.c Sun Oct 7 15:10:54 2007 -*************** -*** 3354,3359 **** ---- 3354,3360 ---- - { - vim_free(SYN_ITEMS(buf)[i].sp_cont_list); - vim_free(SYN_ITEMS(buf)[i].sp_next_list); -+ vim_free(SYN_ITEMS(buf)[i].sp_syn.cont_in_list); - } - } - -*** ../vim-7.1.135/src/version.c Wed Oct 3 14:30:54 2007 ---- src/version.c Sun Oct 7 15:20:22 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 136, - /**/ - --- -Every engineer dreams about saving the universe and having sex with aliens. -This is much more glamorous than the real life of an engineer, which consists -of hiding from the universe and having sex without the participation of other -life forms. (Scott Adams - The Dilbert principle) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.137 b/7.1.137 deleted file mode 100644 index 7e3a53f6..00000000 --- a/7.1.137 +++ /dev/null @@ -1,49 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.137 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.137 -Problem: Build failure when using EXITFREE. (Dominique Pelle) -Solution: Add an #ifdef around using clip_exclude_prog. -Files: src/misc2.c - - -*** ../vim-7.1.136/src/misc2.c Sat Sep 29 14:15:00 2007 ---- src/misc2.c Sun Sep 30 18:00:09 2007 -*************** -*** 1037,1043 **** ---- 1038,1046 ---- - - /* Free some global vars. */ - vim_free(username); -+ # ifdef FEAT_CLIPBOARD - vim_free(clip_exclude_prog); -+ # endif - vim_free(last_cmdline); - vim_free(new_last_cmdline); - set_keep_msg(NULL, 0); -*** ../vim-7.1.136/src/version.c Sun Oct 7 15:21:31 2007 ---- src/version.c Sun Oct 7 15:42:26 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 137, - /**/ - --- -For society, it's probably a good thing that engineers value function over -appearance. For example, you wouldn't want engineers to build nuclear power -plants that only _look_ like they would keep all the radiation inside. - (Scott Adams - The Dilbert principle) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.138 b/7.1.138 deleted file mode 100644 index 792cdbc6..00000000 --- a/7.1.138 +++ /dev/null @@ -1,66 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.138 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.138 -Problem: The Perl Msg() function doesn't stop when "q" is typed at the more - prompt. (Hari Krishna Dara) -Solution: Check got_int. -Files: src/if_perl.xs - - -*** ../vim-7.1.137/src/if_perl.xs Sat Sep 15 14:48:57 2007 ---- src/if_perl.xs Wed Oct 3 17:00:16 2007 -*************** -*** 445,457 **** - char *next; - char *token = (char *)s; - -! while ((next = strchr(token, '\n'))) - { - *next++ = '\0'; /* replace \n with \0 */ - msg_attr((char_u *)token, attr); - token = next; - } -! if (*token) - msg_attr((char_u *)token, attr); - } - ---- 445,457 ---- - char *next; - char *token = (char *)s; - -! while ((next = strchr(token, '\n')) && !got_int) - { - *next++ = '\0'; /* replace \n with \0 */ - msg_attr((char_u *)token, attr); - token = next; - } -! if (*token && !got_int) - msg_attr((char_u *)token, attr); - } - -*** ../vim-7.1.137/src/version.c Sun Oct 7 15:44:28 2007 ---- src/version.c Tue Oct 9 10:45:08 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 138, - /**/ - --- -A consultant is a person who takes your money and annoys your employees while -tirelessly searching for the best way to extend the consulting contract. - (Scott Adams - The Dilbert principle) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.139 b/7.1.139 deleted file mode 100644 index 27671514..00000000 --- a/7.1.139 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.139 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.139 -Problem: When using marker folding and ending Insert mode with CTRL-C the - current fold is truncated. (Fred Kater) -Solution: Ignore got_int while updating folds. -Files: src/fold.c - - -*** ../vim-7.1.138/src/fold.c Thu May 10 21:02:13 2007 ---- src/fold.c Sun Oct 14 15:27:13 2007 -*************** -*** 858,864 **** ---- 858,871 ---- - || foldmethodIsDiff(wp) - #endif - || foldmethodIsSyntax(wp)) -+ { -+ int save_got_int = got_int; -+ -+ /* reset got_int here, otherwise it won't work */ -+ got_int = FALSE; - foldUpdateIEMS(wp, top, bot); -+ got_int |= save_got_int; -+ } - } - - /* foldUpdateAll() {{{2 */ -*** ../vim-7.1.138/src/version.c Tue Oct 9 10:46:39 2007 ---- src/version.c Sun Oct 14 15:31:18 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 139, - /**/ - --- -If Pacman had affected us as kids we'd be running around in dark rooms, -munching pills and listening to repetitive music. - -- Marcus Brigstocke - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.140 b/7.1.140 deleted file mode 100644 index d10c1884..00000000 --- a/7.1.140 +++ /dev/null @@ -1,52 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.140 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.140 -Problem: v:count is set only after typing a non-digit, that makes it - difficult to make a nice mapping. -Solution: Set v:count while still typing the count. -Files: src/normal.c - - -*** ../vim-7.1.139/src/normal.c Thu Sep 13 18:25:08 2007 ---- src/normal.c Sun Oct 14 17:15:36 2007 -*************** -*** 690,695 **** ---- 690,702 ---- - ca.count0 = ca.count0 * 10 + (c - '0'); - if (ca.count0 < 0) /* got too large! */ - ca.count0 = 999999999L; -+ #ifdef FEAT_EVAL -+ /* Set v:count here, when called from main() and not a stuffed -+ * command, so that v:count can be used in an expression mapping -+ * right after the count. */ -+ if (toplevel && stuff_empty()) -+ set_vcount(ca.count0, ca.count0 == 0 ? 1 : ca.count0); -+ #endif - if (ctrl_w) - { - ++no_mapping; -*** ../vim-7.1.139/src/version.c Sun Oct 14 15:32:10 2007 ---- src/version.c Sun Oct 14 17:13:15 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 140, - /**/ - --- -How To Keep A Healthy Level Of Insanity: -11. Specify that your drive-through order is "to go". - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.141 b/7.1.141 deleted file mode 100644 index 7b3c5d9f..00000000 --- a/7.1.141 +++ /dev/null @@ -1,97 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.141 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.141 -Problem: GTK: -geom argument doesn't support a negative offset. -Solution: Compute position from the right/lower corner. -Files: src/gui_gtk_x11.c - - -*** ../vim-7.1.140/src/gui_gtk_x11.c Sat Sep 15 14:06:41 2007 ---- src/gui_gtk_x11.c Mon Oct 8 21:26:50 2007 -*************** -*** 4044,4049 **** ---- 4044,4051 ---- - unsigned int w, h; - int x = 0; - int y = 0; -+ guint pixel_width; -+ guint pixel_height; - - mask = XParseGeometry((char *)gui.geom, &x, &y, &w, &h); - -*************** -*** 4055,4066 **** ---- 4057,4087 ---- - p_window = h - 1; - Rows = h; - } -+ -+ pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width); -+ pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height); -+ -+ #ifdef HAVE_GTK2 -+ pixel_width += get_menu_tool_width(); -+ pixel_height += get_menu_tool_height(); -+ #endif -+ - if (mask & (XValue | YValue)) -+ { -+ int w, h; -+ gui_mch_get_screen_dimensions(&w, &h); -+ h += p_ghr + get_menu_tool_height(); -+ w += get_menu_tool_width(); -+ if (mask & XNegative) -+ x += w - pixel_width; -+ if (mask & YNegative) -+ y += h - pixel_height; - #ifdef HAVE_GTK2 - gtk_window_move(GTK_WINDOW(gui.mainwin), x, y); - #else - gtk_widget_set_uposition(gui.mainwin, x, y); - #endif -+ } - vim_free(gui.geom); - gui.geom = NULL; - -*************** -*** 4071,4084 **** - */ - if (gtk_socket_id != 0 && (mask & WidthValue || mask & HeightValue)) - { -- guint pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width); -- guint pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height); -- -- #ifdef HAVE_GTK2 -- pixel_width += get_menu_tool_width(); -- pixel_height += get_menu_tool_height(); -- #endif -- - update_window_manager_hints(pixel_width, pixel_height); - init_window_hints_state = 1; - g_timeout_add(1000, check_startup_plug_hints, NULL); ---- 4092,4097 ---- -*** ../vim-7.1.140/src/version.c Sun Oct 14 17:15:45 2007 ---- src/version.c Fri Oct 19 14:28:52 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 141, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -35. Your husband tells you he's had the beard for 2 months. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.142 b/7.1.142 deleted file mode 100644 index 892cf99f..00000000 --- a/7.1.142 +++ /dev/null @@ -1,77 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.142 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.142 -Problem: ":redir @A>" doesn't work. -Solution: Ignore the extra ">" also when appending. (James Vega) -Files: src/ex_docmd.c - - -*** ../vim-7.1.141/src/ex_docmd.c Sun Sep 30 14:00:41 2007 ---- src/ex_docmd.c Tue Oct 9 11:09:09 2007 -*************** -*** 8426,8446 **** - || *arg == '"') - { - redir_reg = *arg++; -! if (*arg == '>' && arg[1] == '>') - arg += 2; -! else if ((*arg == NUL || (*arg == '>' && arg[1] == NUL)) && -! (islower(redir_reg) -! # ifdef FEAT_CLIPBOARD -! || redir_reg == '*' -! || redir_reg == '+' -! # endif -! || redir_reg == '"')) - { - if (*arg == '>') - arg++; -! -! /* make register empty */ -! write_reg_contents(redir_reg, (char_u *)"", -1, FALSE); - } - } - if (*arg != NUL) ---- 8426,8442 ---- - || *arg == '"') - { - redir_reg = *arg++; -! if (*arg == '>' && arg[1] == '>') /* append */ - arg += 2; -! else - { -+ /* Can use both "@a" and "@a>". */ - if (*arg == '>') - arg++; -! /* Make register empty when not using @A-@Z and the -! * command is valid. */ -! if (*arg == NUL && !isupper(redir_reg)) -! write_reg_contents(redir_reg, (char_u *)"", -1, FALSE); - } - } - if (*arg != NUL) -*** ../vim-7.1.141/src/version.c Fri Oct 19 14:32:50 2007 ---- src/version.c Fri Oct 19 16:18:36 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 142, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -36. You miss more than five meals a week downloading the latest games from - Apogee. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.143 b/7.1.143 deleted file mode 100644 index fa385afa..00000000 --- a/7.1.143 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.143 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.143 -Problem: Uninitialized memory read when diffing three files. (Dominique - Pelle) -Solution: Remove "+ !notset" so that we don't use fields that were not - computed. -Files: src/diff.c - - -*** ../vim-7.1.142/src/diff.c Sat Sep 29 14:15:00 2007 ---- src/diff.c Sun Oct 14 21:52:56 2007 -*************** -*** 1310,1316 **** - dp->df_count[idx_new] += -off; - off = 0; - } -! for (i = idx_orig; i < idx_new + !notset; ++i) - if (curtab->tp_diffbuf[i] != NULL) - dp->df_count[i] = dpl->df_lnum[i] + dpl->df_count[i] - - dp->df_lnum[i] + off; ---- 1310,1316 ---- - dp->df_count[idx_new] += -off; - off = 0; - } -! for (i = idx_orig; i < idx_new; ++i) - if (curtab->tp_diffbuf[i] != NULL) - dp->df_count[i] = dpl->df_lnum[i] + dpl->df_count[i] - - dp->df_lnum[i] + off; -*** ../vim-7.1.142/src/version.c Fri Oct 19 16:20:09 2007 ---- src/version.c Fri Oct 19 17:32:18 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 143, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -37. You start looking for hot HTML addresses in public restrooms. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.144 b/7.1.144 deleted file mode 100644 index d2bcfa0c..00000000 --- a/7.1.144 +++ /dev/null @@ -1,46 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.144 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.144 -Problem: After ":diffup" cursor can be in the wrong position. -Solution: Force recomputing the cursor position. -Files: src/diff.c - - -*** ../vim-7.1.143/src/diff.c Fri Oct 19 17:32:58 2007 ---- src/diff.c Fri Oct 19 18:54:13 2007 -*************** -*** 791,796 **** ---- 791,799 ---- - } - mch_remove(tmp_orig); - -+ /* force updating cursor position on screen */ -+ curwin->w_valid_cursor.lnum = 0; -+ - diff_redraw(TRUE); - - theend: -*** ../vim-7.1.143/src/version.c Fri Oct 19 17:32:58 2007 ---- src/version.c Fri Oct 19 18:56:49 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 144, - /**/ - --- -He who laughs last, thinks slowest. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.145 b/7.1.145 deleted file mode 100644 index cb947995..00000000 --- a/7.1.145 +++ /dev/null @@ -1,171 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.145 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.145 -Problem: Insert mode completion: When using the popup menu, after - completing a word and typing a non-word character Vim is still - completing the same word, following CTRL-N doesn't work. - Insert mode Completion: When using CTRL-X O and there is only - "struct." before the cursor, typing one char to reduce the - matches, then BS completion stops. -Solution: When typing a character that is not part of the item being - completed, stop complete mode. For whole line completion also - accept a space. For file name completion stop at a path - separator. - For omni completion stay in completion mode even if completing - with empty string. -Files: src/edit.c - - -*** ../vim-7.1.144/src/edit.c Thu Sep 13 18:25:08 2007 ---- src/edit.c Fri Oct 19 16:04:38 2007 -*************** -*** 129,134 **** ---- 129,135 ---- - - static void ins_ctrl_x __ARGS((void)); - static int has_compl_option __ARGS((int dict_opt)); -+ static int ins_compl_accept_char __ARGS((int c)); - static int ins_compl_add __ARGS((char_u *str, int len, int icase, char_u *fname, char_u **cptext, int cdir, int flags, int adup)); - static int ins_compl_equal __ARGS((compl_T *match, char_u *str, int len)); - static void ins_compl_longest_match __ARGS((compl_T *match)); -*************** -*** 754,761 **** - continue; - } - -! /* A printable, non-white character: Add to "compl_leader". */ -! if (vim_isprintc(c) && !vim_iswhite(c)) - { - ins_compl_addleader(c); - continue; ---- 755,763 ---- - continue; - } - -! /* A non-white character that fits in with the current -! * completion: Add to "compl_leader". */ -! if (ins_compl_accept_char(c)) - { - ins_compl_addleader(c); - continue; -*************** -*** 2053,2058 **** ---- 2055,2094 ---- - } - - /* -+ * Return TRUE when character "c" is part of the item currently being -+ * completed. Used to decide whether to abandon complete mode when the menu -+ * is visible. -+ */ -+ static int -+ ins_compl_accept_char(c) -+ int c; -+ { -+ if (ctrl_x_mode & CTRL_X_WANT_IDENT) -+ /* When expanding an identifier only accept identifier chars. */ -+ return vim_isIDc(c); -+ -+ switch (ctrl_x_mode) -+ { -+ case CTRL_X_FILES: -+ /* When expanding file name only accept file name chars. But not -+ * path separators, so that "proto/" expands files in -+ * "proto", not "proto/" as a whole */ -+ return vim_isfilec(c) && !vim_ispathsep(c); -+ -+ case CTRL_X_CMDLINE: -+ case CTRL_X_OMNI: -+ /* Command line and Omni completion can work with just about any -+ * printable character, but do stop at white space. */ -+ return vim_isprintc(c) && !vim_iswhite(c); -+ -+ case CTRL_X_WHOLE_LINE: -+ /* For while line completion a space can be part of the line. */ -+ return vim_isprintc(c); -+ } -+ return vim_iswordc(c); -+ } -+ -+ /* - * This is like ins_compl_add(), but if 'ic' and 'inf' are set, then the - * case of the originally typed text is used, and the case of the completed - * text is inferred, ie this tries to work out what case you probably wanted -*************** -*** 3128,3135 **** - p = line + curwin->w_cursor.col; - mb_ptr_back(line, p); - -! /* Stop completion when the whole word was deleted. */ -! if ((int)(p - line) - (int)compl_col <= 0) - return K_BS; - - /* Deleted more than what was used to find matches or didn't finish ---- 3164,3174 ---- - p = line + curwin->w_cursor.col; - mb_ptr_back(line, p); - -! /* Stop completion when the whole word was deleted. For Omni completion -! * allow the word to be deleted, we won't match everything. */ -! if ((int)(p - line) - (int)compl_col < 0 -! || ((int)(p - line) - (int)compl_col == 0 -! && (ctrl_x_mode & CTRL_X_OMNI) == 0)) - return K_BS; - - /* Deleted more than what was used to find matches or didn't finish -*************** -*** 4591,4604 **** - curs_col = curwin->w_cursor.col; - compl_pending = 0; - -! /* if this same ctrl_x_mode has been interrupted use the text from - * "compl_startpos" to the cursor as a pattern to add a new word - * instead of expand the one before the cursor, in word-wise if -! * "compl_startpos" -! * is not in the same line as the cursor then fix it (the line has -! * been split because it was longer than 'tw'). if SOL is set then -! * skip the previous pattern, a word at the beginning of the line has -! * been inserted, we'll look for that -- Acevedo. */ - if ((compl_cont_status & CONT_INTRPT) == CONT_INTRPT - && compl_cont_mode == ctrl_x_mode) - { ---- 4630,4642 ---- - curs_col = curwin->w_cursor.col; - compl_pending = 0; - -! /* If this same ctrl_x_mode has been interrupted use the text from - * "compl_startpos" to the cursor as a pattern to add a new word - * instead of expand the one before the cursor, in word-wise if -! * "compl_startpos" is not in the same line as the cursor then fix it -! * (the line has been split because it was longer than 'tw'). if SOL -! * is set then skip the previous pattern, a word at the beginning of -! * the line has been inserted, we'll look for that -- Acevedo. */ - if ((compl_cont_status & CONT_INTRPT) == CONT_INTRPT - && compl_cont_mode == ctrl_x_mode) - { -*** ../vim-7.1.144/src/version.c Fri Oct 19 18:57:33 2007 ---- src/version.c Fri Oct 19 20:38:21 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 145, - /**/ - --- -Micro$oft: where do you want to go today? - Linux: where do you want to go tomorrow? - FreeBSD: are you guys coming, or what? - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.146 b/7.1.146 deleted file mode 100644 index 75ce738f..00000000 --- a/7.1.146 +++ /dev/null @@ -1,92 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.146 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.146 (extra) -Problem: VMS: Files with a very rare record organization (VFC) cannot be - properly written by Vim. - On older VAX systems mms runs into a syntax error. -Solution: Check for this special situation. Do not wrap a comment, make it - one long line. (Zoltan Arpadffy) -Files: src/fileio.c, src/Make_vms.mms - - -*** ../vim-7.1.145/src/fileio.c Wed Oct 3 12:49:24 2007 ---- src/fileio.c Mon Oct 22 21:10:00 2007 -*************** -*** 4251,4257 **** - * they don't it adds one. - * With other RMS structures it works perfect without this fix. - */ -! if ((buf->b_fab_rat & (FAB$M_FTN | FAB$M_CR)) != 0) - { - int b2write; - ---- 4252,4259 ---- - * they don't it adds one. - * With other RMS structures it works perfect without this fix. - */ -! if (buf->b_fab_rfm == FAB$C_VFC -! || ((buf->b_fab_rat & (FAB$M_FTN | FAB$M_CR)) != 0)) - { - int b2write; - -*** ../vim-7.1.145/src/Make_vms.mms Thu May 10 20:47:35 2007 ---- src/Make_vms.mms Mon Oct 22 21:13:08 2007 -*************** -*** 2,8 **** - # Makefile for Vim on OpenVMS - # - # Maintainer: Zoltan Arpadffy -! # Last change: 2007 May 07 - # - # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64 - # with MMS and MMK ---- 2,8 ---- - # Makefile for Vim on OpenVMS - # - # Maintainer: Zoltan Arpadffy -! # Last change: 2007 Oct 22 - # - # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64 - # with MMS and MMK -*************** -*** 96,103 **** - - .IFDEF MMSVAX - .IFDEF DECC # VAX with DECC -! CC_DEF = cc # /decc # some system requires this switch -! # but when it is not required /ver might fail - PREFIX = /prefix=all - .ELSE # VAX with VAXC - CC_DEF = cc ---- 96,102 ---- - - .IFDEF MMSVAX - .IFDEF DECC # VAX with DECC -! CC_DEF = cc # /decc # some system requires this switch but when it is not required /ver might fail - PREFIX = /prefix=all - .ELSE # VAX with VAXC - CC_DEF = cc -*** ../vim-7.1.145/src/version.c Fri Oct 19 20:39:56 2007 ---- src/version.c Mon Oct 29 22:36:20 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 146, - /**/ - --- -Be thankful to be in a traffic jam, because it means you own a car. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.147 b/7.1.147 deleted file mode 100644 index 57e49659..00000000 --- a/7.1.147 +++ /dev/null @@ -1,75 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.147 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.147 (after 7.1.127) -Problem: Freeing memory already freed when completing user name. (Meino - Cramer) -Solution: Use a flag to remember if "orig" needs to be freed. -Files: src/ex_getln.c - - -*** ../vim-7.1.146/src/ex_getln.c Sun Sep 30 22:10:45 2007 ---- src/ex_getln.c Tue Oct 30 17:13:33 2007 -*************** -*** 3353,3358 **** ---- 3353,3359 ---- - char_u *ss = NULL; - static int findex; - static char_u *orig_save = NULL; /* kept value of orig */ -+ int orig_saved = FALSE; - int i; - long_u len; - int non_suf_match; /* number without matching suffix */ -*************** -*** 3421,3426 **** ---- 3422,3428 ---- - { - vim_free(orig_save); - orig_save = orig; -+ orig_saved = TRUE; - - /* - * Do the expansion. -*************** -*** 3546,3552 **** - ExpandCleanup(xp); - - /* Free "orig" if it wasn't stored in "orig_save". */ -! if (orig != orig_save) - vim_free(orig); - - return ss; ---- 3548,3554 ---- - ExpandCleanup(xp); - - /* Free "orig" if it wasn't stored in "orig_save". */ -! if (!orig_saved) - vim_free(orig); - - return ss; -*** ../vim-7.1.146/src/version.c Mon Oct 29 22:37:57 2007 ---- src/version.c Tue Oct 30 17:30:35 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 147, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -59. Your wife says communication is important in a marriage...so you buy - another computer and install a second phone line so the two of you can - chat. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.148 b/7.1.148 deleted file mode 100644 index 94872e59..00000000 --- a/7.1.148 +++ /dev/null @@ -1,73 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.148 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.148 -Problem: Some types are not found by configure. -Solution: Test for the sys/types.h header file. (Sean Boudreau) -Files: src/configure.in, src/auto/configure - - -*** ../vim-7.1.147/src/configure.in Thu Jun 28 13:02:22 2007 ---- src/configure.in Sat Oct 27 15:52:16 2007 -*************** -*** 2026,2032 **** - fi - - AC_CHECK_HEADERS(stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \ -! termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h termio.h \ - iconv.h langinfo.h unistd.h stropts.h errno.h \ - sys/resource.h sys/systeminfo.h locale.h \ - sys/stream.h sys/ptem.h termios.h libc.h sys/statfs.h \ ---- 2026,2032 ---- - fi - - AC_CHECK_HEADERS(stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \ -! termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h sys/types.h termio.h \ - iconv.h langinfo.h unistd.h stropts.h errno.h \ - sys/resource.h sys/systeminfo.h locale.h \ - sys/stream.h sys/ptem.h termios.h libc.h sys/statfs.h \ -*** ../vim-7.1.147/src/auto/configure Thu Jun 28 13:02:22 2007 ---- src/auto/configure Sun Nov 4 15:34:14 2007 -*************** -*** 10265,10272 **** - - - - for ac_header in stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \ -! termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h termio.h \ - iconv.h langinfo.h unistd.h stropts.h errno.h \ - sys/resource.h sys/systeminfo.h locale.h \ - sys/stream.h sys/ptem.h termios.h libc.h sys/statfs.h \ ---- 10265,10273 ---- - - - -+ - for ac_header in stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \ -! termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h sys/types.h termio.h \ - iconv.h langinfo.h unistd.h stropts.h errno.h \ - sys/resource.h sys/systeminfo.h locale.h \ - sys/stream.h sys/ptem.h termios.h libc.h sys/statfs.h \ -*** ../vim-7.1.147/src/version.c Tue Oct 30 17:36:31 2007 ---- src/version.c Sun Nov 4 15:34:26 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 148, - /**/ - --- -If your nose runs, and your feet smell, you might be upside down. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.149 b/7.1.149 deleted file mode 100644 index e6a0f5b6..00000000 --- a/7.1.149 +++ /dev/null @@ -1,180 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.149 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.149 -Problem: GTK GUI: When the completion popup menu is used scrolling another - window by the scrollbar is OK, but using the scroll wheel it - behaves line . -Solution: Ignore K_MOUSEDOWN and K_MOUSEUP. Fix redrawing the popup menu. -Files: src/edit.c, src/gui.c - - -*** ../vim-7.1.148/src/edit.c Fri Oct 19 20:39:56 2007 ---- src/edit.c Sun Nov 4 16:17:42 2007 -*************** -*** 3385,3392 **** - if (c != Ctrl_R && vim_is_ctrl_x_key(c)) - edit_submode_extra = NULL; - -! /* Ignore end of Select mode mapping */ -! if (c == K_SELECT) - return retval; - - /* Set "compl_get_longest" when finding the first matches. */ ---- 3385,3392 ---- - if (c != Ctrl_R && vim_is_ctrl_x_key(c)) - edit_submode_extra = NULL; - -! /* Ignore end of Select mode mapping and mouse scroll buttons. */ -! if (c == K_SELECT || c == K_MOUSEDOWN || c == K_MOUSEUP) - return retval; - - /* Set "compl_get_longest" when finding the first matches. */ -*************** -*** 8652,8666 **** - int up; - { - pos_T tpos; -! # if defined(FEAT_GUI) && defined(FEAT_WINDOWS) -! win_T *old_curwin; - # endif - - tpos = curwin->w_cursor; - - # if defined(FEAT_GUI) && defined(FEAT_WINDOWS) -- old_curwin = curwin; -- - /* Currently the mouse coordinates are only known in the GUI. */ - if (gui.in_use && mouse_row >= 0 && mouse_col >= 0) - { ---- 8652,8667 ---- - int up; - { - pos_T tpos; -! # if defined(FEAT_WINDOWS) -! win_T *old_curwin = curwin; -! # endif -! # ifdef FEAT_INS_EXPAND -! int did_scroll = FALSE; - # endif - - tpos = curwin->w_cursor; - - # if defined(FEAT_GUI) && defined(FEAT_WINDOWS) - /* Currently the mouse coordinates are only known in the GUI. */ - if (gui.in_use && mouse_row >= 0 && mouse_col >= 0) - { -*************** -*** 8677,8692 **** - # endif - undisplay_dollar(); - -! if (mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL)) -! scroll_redraw(up, (long)(curwin->w_botline - curwin->w_topline)); -! else -! scroll_redraw(up, 3L); - - # if defined(FEAT_GUI) && defined(FEAT_WINDOWS) - curwin->w_redr_status = TRUE; - - curwin = old_curwin; - curbuf = curwin->w_buffer; - # endif - - if (!equalpos(curwin->w_cursor, tpos)) ---- 8678,8717 ---- - # endif - undisplay_dollar(); - -! # ifdef FEAT_INS_EXPAND -! /* Don't scroll the window in which completion is being done. */ -! if (!pum_visible() -! # if defined(FEAT_WINDOWS) -! || curwin != old_curwin -! # endif -! ) -! # endif -! { -! if (mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL)) -! scroll_redraw(up, (long)(curwin->w_botline - curwin->w_topline)); -! else -! scroll_redraw(up, 3L); -! # ifdef FEAT_INS_EXPAND -! did_scroll = TRUE; -! # endif -! } - - # if defined(FEAT_GUI) && defined(FEAT_WINDOWS) - curwin->w_redr_status = TRUE; - - curwin = old_curwin; - curbuf = curwin->w_buffer; -+ # endif -+ -+ # ifdef FEAT_INS_EXPAND -+ /* The popup menu may overlay the window, need to redraw it. -+ * TODO: Would be more efficient to only redraw the windows that are -+ * overlapped by the popup menu. */ -+ if (pum_visible() && did_scroll) -+ { -+ redraw_all_later(NOT_VALID); -+ ins_compl_show_pum(); -+ } - # endif - - if (!equalpos(curwin->w_cursor, tpos)) -*** ../vim-7.1.148/src/gui.c Wed Sep 5 21:45:54 2007 ---- src/gui.c Fri Oct 19 16:14:57 2007 -*************** -*** 4214,4220 **** - #endif - ) - { -! redraw_win_later(wp, VALID); - updateWindow(wp); /* update window, status line, and cmdline */ - } - ---- 4214,4232 ---- - #endif - ) - { -! int type = VALID; -! -! #ifdef FEAT_INS_EXPAND -! if (pum_visible()) -! { -! type = NOT_VALID; -! wp->w_lines_valid = 0; -! } -! #endif -! /* Don't set must_redraw here, it may cause the popup menu to -! * disappear when losing focus after a scrollbar drag. */ -! if (wp->w_redr_type < type) -! wp->w_redr_type = type; - updateWindow(wp); /* update window, status line, and cmdline */ - } - -*** ../vim-7.1.148/src/version.c Sun Nov 4 15:35:23 2007 ---- src/version.c Tue Nov 6 22:21:03 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 149, - /**/ - --- -From "know your smileys": - ...---... SOS - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.150 b/7.1.150 deleted file mode 100644 index b0074a95..00000000 --- a/7.1.150 +++ /dev/null @@ -1,59 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.150 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.150 -Problem: When 'clipboard' has "unnamed" using "p" in Visual mode doesn't - work correctly. (Jianrong Yu) -Solution: When 'clipboard' has "unnamed" also obtain the selection when - getting the default register. -Files: src/ops.c - - -*** ../vim-7.1.149/src/ops.c Tue Sep 25 14:19:35 2007 ---- src/ops.c Sun Oct 28 13:58:35 2007 -*************** -*** 933,941 **** - #ifdef FEAT_CLIPBOARD - /* When Visual area changed, may have to update selection. Obtain the - * selection too. */ -! if (name == '*' && clip_star.available && clip_isautosel()) - { -! clip_update_selection(); - may_get_selection(name); - } - #endif ---- 933,942 ---- - #ifdef FEAT_CLIPBOARD - /* When Visual area changed, may have to update selection. Obtain the - * selection too. */ -! if (name == '*' && clip_star.available) - { -! if (clip_isautosel()) -! clip_update_selection(); - may_get_selection(name); - } - #endif -*** ../vim-7.1.149/src/version.c Tue Nov 6 22:26:39 2007 ---- src/version.c Thu Nov 8 10:34:18 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 150, - /**/ - --- -From "know your smileys": - 8<}} Glasses, big nose, beard - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.151 b/7.1.151 deleted file mode 100644 index 610bafb1..00000000 --- a/7.1.151 +++ /dev/null @@ -1,70 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.151 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.151 -Problem: Using whole line completion with 'ignorecase' and 'infercase' set - and the line is empty get an lalloc(0) error. -Solution: Don't try changing case for an empty match. (Matthew Wozniski) -Files: src/edit.c - - -*** ../vim-7.1.150/src/edit.c Tue Nov 6 22:26:39 2007 ---- src/edit.c Sun Nov 4 16:17:42 2007 -*************** -*** 2111,2117 **** - int has_lower = FALSE; - int was_letter = FALSE; - -! if (p_ic && curbuf->b_p_inf) - { - /* Infer case of completed part. */ - ---- 2111,2117 ---- - int has_lower = FALSE; - int was_letter = FALSE; - -! if (p_ic && curbuf->b_p_inf && len > 0) - { - /* Infer case of completed part. */ - -*************** -*** 2225,2231 **** - wca[i] = MB_TOUPPER(wca[i]); - } - -! /* - * Generate encoding specific output from wide character array. - * Multi-byte characters can occupy up to five bytes more than - * ASCII characters, and we also need one byte for NUL, so stay ---- 2225,2231 ---- - wca[i] = MB_TOUPPER(wca[i]); - } - -! /* - * Generate encoding specific output from wide character array. - * Multi-byte characters can occupy up to five bytes more than - * ASCII characters, and we also need one byte for NUL, so stay -*** ../vim-7.1.150/src/version.c Thu Nov 8 10:35:02 2007 ---- src/version.c Thu Nov 8 13:01:34 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 151, - /**/ - --- -From "know your smileys": - %-) After staring at screen for 15 hours - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.152 b/7.1.152 deleted file mode 100644 index d1a0f30b..00000000 --- a/7.1.152 +++ /dev/null @@ -1,118 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.152 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.152 -Problem: Display problem when 'hls' and 'cursorcolumn' are set and - searching for "$". (John Mullin) Also when scrolling - horizontally when 'wrap' is off. -Solution: Keep track of the column where highlighting was set. Check the - column offset when skipping characters. -Files: src/screen.c - - -*** ../vim-7.1.151/src/screen.c Mon Sep 17 22:37:05 2007 ---- src/screen.c Fri Oct 19 15:18:49 2007 -*************** -*** 2599,2604 **** ---- 2599,2605 ---- - int syntax_attr = 0; /* attributes desired by syntax */ - int has_syntax = FALSE; /* this buffer has syntax highl. */ - int save_did_emsg; -+ int eol_hl_off = 0; /* 1 if highlighted char after EOL */ - #endif - #ifdef FEAT_SPELL - int has_spell = FALSE; /* this buffer has spell checking */ -*************** -*** 4312,4317 **** ---- 4313,4322 ---- - { - #ifdef FEAT_SEARCH_EXTRA - long prevcol = (long)(ptr - line) - (c == NUL); -+ -+ /* we're not really at that column when skipping some text */ -+ if ((wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol) -+ ++prevcol; - #endif - - /* invert at least one char, used for Visual and empty line or -*************** -*** 4408,4418 **** ---- 4413,4432 ---- - ScreenAttrs[off] = char_attr; - #ifdef FEAT_RIGHTLEFT - if (wp->w_p_rl) -+ { - --col; -+ --off; -+ } - else - #endif -+ { - ++col; -+ ++off; -+ } - ++vcol; -+ #ifdef FEAT_SYN_HL -+ eol_hl_off = 1; -+ #endif - } - } - -*************** -*** 4422,4427 **** ---- 4436,4449 ---- - if (c == NUL) - { - #ifdef FEAT_SYN_HL -+ if (eol_hl_off > 0 && vcol - eol_hl_off == (long)wp->w_virtcol) -+ { -+ /* highlight last char after line */ -+ --col; -+ --off; -+ --vcol; -+ } -+ - /* Highlight 'cursorcolumn' past end of the line. */ - if (wp->w_p_wrap) - v = wp->w_skipcol; -*************** -*** 4432,4438 **** - - vcol = v + col - win_col_off(wp); - if (wp->w_p_cuc -! && (int)wp->w_virtcol >= vcol - && (int)wp->w_virtcol < W_WIDTH(wp) * (row - startrow + 1) - + v - && lnum != wp->w_cursor.lnum ---- 4454,4460 ---- - - vcol = v + col - win_col_off(wp); - if (wp->w_p_cuc -! && (int)wp->w_virtcol >= vcol - eol_hl_off - && (int)wp->w_virtcol < W_WIDTH(wp) * (row - startrow + 1) - + v - && lnum != wp->w_cursor.lnum -*** ../vim-7.1.151/src/version.c Thu Nov 8 13:03:33 2007 ---- src/version.c Thu Nov 8 14:48:59 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 152, - /**/ - --- -From "know your smileys": - 2B|^2B Message from Shakespeare - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.153 b/7.1.153 deleted file mode 100644 index 839977eb..00000000 --- a/7.1.153 +++ /dev/null @@ -1,143 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.153 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.153 -Problem: Compiler warnings on SGI. Undefined XpmAllocColor (Charles - Campbell) -Solution: Add type casts. Init st_dev and st_ino separately. Don't use - type casts for vim_snprintf() when HAVE_STDARG_H is defined. - Define XpmAllocColor when needed. -Files: src/eval.c, src/ex_cmds.c, src/fileio.c, src/misc2.c, - src/gui_xmebw.c - - -*** ../vim-7.1.152/src/eval.c Tue Oct 2 22:07:58 2007 ---- src/eval.c Mon Oct 1 20:56:09 2007 -*************** -*** 8729,8735 **** - static int fnum = 0; - static int change_start = 0; - static int change_end = 0; -! static hlf_T hlID = 0; - int filler_lines; - int col; - ---- 8729,8735 ---- - static int fnum = 0; - static int change_start = 0; - static int change_end = 0; -! static hlf_T hlID = (hlf_T)0; - int filler_lines; - int col; - -*** ../vim-7.1.152/src/ex_cmds.c Thu Sep 13 18:25:08 2007 ---- src/ex_cmds.c Thu Sep 13 16:19:40 2007 -*************** -*** 1774,1780 **** - * overwrite a user's viminfo file after a "su root", with a - * viminfo file that the user can't read. - */ -! st_old.st_dev = st_old.st_ino = 0; - st_old.st_mode = 0600; - if (mch_stat((char *)fname, &st_old) == 0 - && getuid() != ROOT_UID ---- 1774,1781 ---- - * overwrite a user's viminfo file after a "su root", with a - * viminfo file that the user can't read. - */ -! st_old.st_dev = 0; -! st_old.st_ino = 0; - st_old.st_mode = 0600; - if (mch_stat((char *)fname, &st_old) == 0 - && getuid() != ROOT_UID -*** ../vim-7.1.152/src/fileio.c Mon Oct 29 22:37:57 2007 ---- src/fileio.c Mon Oct 22 21:10:00 2007 -*************** -*** 3209,3215 **** - * Get information about original file (if there is one). - */ - #if defined(UNIX) && !defined(ARCHIE) -! st_old.st_dev = st_old.st_ino = 0; - perm = -1; - if (mch_stat((char *)fname, &st_old) < 0) - newfile = TRUE; ---- 3209,3216 ---- - * Get information about original file (if there is one). - */ - #if defined(UNIX) && !defined(ARCHIE) -! st_old.st_dev = 0; -! st_old.st_ino = 0; - perm = -1; - if (mch_stat((char *)fname, &st_old) < 0) - newfile = TRUE; -*** ../vim-7.1.152/src/misc2.c Sun Oct 7 15:44:28 2007 ---- src/misc2.c Sun Sep 30 18:00:09 2007 -*************** -*** 5924,5930 **** ---- 5925,5935 ---- - { - if (emsg_not_now()) - return TRUE; /* no error messages at the moment */ -+ #ifdef HAVE_STDARG_H -+ vim_snprintf((char *)IObuff, IOSIZE, (char *)s, a1, a2); -+ #else - vim_snprintf((char *)IObuff, IOSIZE, (char *)s, (long_u)a1, (long_u)a2); -+ #endif - return emsg(IObuff); - } - -*** ../vim-7.1.152/src/gui_xmebw.c Thu May 10 19:46:55 2007 ---- src/gui_xmebw.c Thu Sep 6 12:57:51 2007 -*************** -*** 395,405 **** - - /* Create the "highlight" pixmap. */ - color[4].pixel = eb->primitive.bottom_shadow_color; - attr.valuemask = XpmColorSymbols | XpmCloseness | XpmAllocColor; - attr.closeness = 65535; /* accuracy isn't crucial */ - attr.colorsymbols = color; - attr.numsymbols = XtNumber(color); -- attr.alloc_color = alloc_color; - - status = XpmCreatePixmapFromData(dpy, root, data, &pix, NULL, &attr); - XpmFreeAttributes(&attr); ---- 395,409 ---- - - /* Create the "highlight" pixmap. */ - color[4].pixel = eb->primitive.bottom_shadow_color; -+ #ifdef XpmAllocColor /* SGI doesn't have it */ - attr.valuemask = XpmColorSymbols | XpmCloseness | XpmAllocColor; -+ attr.alloc_color = alloc_color; -+ #else -+ attr.valuemask = XpmColorSymbols | XpmCloseness; -+ #endif - attr.closeness = 65535; /* accuracy isn't crucial */ - attr.colorsymbols = color; - attr.numsymbols = XtNumber(color); - - status = XpmCreatePixmapFromData(dpy, root, data, &pix, NULL, &attr); - XpmFreeAttributes(&attr); -*** ../vim-7.1.152/src/version.c Thu Nov 8 14:50:58 2007 ---- src/version.c Thu Nov 8 20:45:56 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 153, - /**/ - --- -From "know your smileys": - @:-() Elvis Presley - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.154 b/7.1.154 deleted file mode 100644 index f38ac016..00000000 --- a/7.1.154 +++ /dev/null @@ -1,52 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.154 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.154 -Problem: Compiler warning for signed/unsigned compare. -Solution: Add type cast. -Files: src/screen.c - - -*** ../vim-7.1.153/src/screen.c Thu Nov 8 14:50:58 2007 ---- src/screen.c Thu Nov 8 21:18:46 2007 -*************** -*** 4315,4321 **** - long prevcol = (long)(ptr - line) - (c == NUL); - - /* we're not really at that column when skipping some text */ -! if ((wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol) - ++prevcol; - #endif - ---- 4315,4321 ---- - long prevcol = (long)(ptr - line) - (c == NUL); - - /* we're not really at that column when skipping some text */ -! if ((long)(wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol) - ++prevcol; - #endif - -*** ../vim-7.1.153/src/version.c Thu Nov 8 20:47:34 2007 ---- src/version.c Thu Nov 8 21:19:59 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 154, - /**/ - --- -From "know your smileys": - :-F Bucktoothed vampire with one tooth missing - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.155 b/7.1.155 deleted file mode 100644 index c813fef6..00000000 --- a/7.1.155 +++ /dev/null @@ -1,53 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.155 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.155 -Problem: Crash when 'undolevels' is 0 and repeating "udd". (James Vega) -Solution: When there is only one branch use u_freeheader() to delete it. -Files: src/undo.c - - -*** ../vim-7.1.154/src/undo.c Mon Oct 1 22:53:27 2007 ---- src/undo.c Sat Nov 10 13:45:28 2007 -*************** -*** 1677,1682 **** ---- 1677,1690 ---- - u_header_T **uhpp; /* if not NULL reset when freeing this header */ - { - u_header_T *tofree, *next; -+ -+ /* If this is the top branch we may need to use u_freeheader() to update -+ * all the pointers. */ -+ if (uhp == buf->b_u_oldhead) -+ { -+ u_freeheader(buf, uhp, uhpp); -+ return; -+ } - - if (uhp->uh_alt_prev != NULL) - uhp->uh_alt_prev->uh_alt_next = NULL; -*** ../vim-7.1.154/src/version.c Thu Nov 8 21:23:34 2007 ---- src/version.c Sat Nov 10 22:49:40 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 155, - /**/ - --- -I AM THANKFUL... -...for the piles of laundry and ironing because it means I -have plenty of clothes to wear. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.156 b/7.1.156 deleted file mode 100644 index 4701e023..00000000 --- a/7.1.156 +++ /dev/null @@ -1,121 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.156 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.156 -Problem: Overlapping arguments for strcpy() when expanding command line - variables. -Solution: Use mch_memmove() instead of STRCPY(). Also fix a few typos. - (Dominique Pelle) -Files: src/ex_docmd.c - - -*** ../vim-7.1.155/src/ex_docmd.c Fri Oct 19 16:20:09 2007 ---- src/ex_docmd.c Sat Nov 10 12:39:51 2007 -*************** -*** 666,672 **** - if (ex_pressedreturn) - { - /* go up one line, to overwrite the ":" line, so the -! * output doensn't contain empty lines. */ - msg_row = prev_msg_row; - if (prev_msg_row == Rows - 1) - msg_row--; ---- 666,672 ---- - if (ex_pressedreturn) - { - /* go up one line, to overwrite the ":" line, so the -! * output doesn't contain empty lines. */ - msg_row = prev_msg_row; - if (prev_msg_row == Rows - 1) - msg_row--; -*************** -*** 2760,2766 **** - - /* - * Isolate the command and search for it in the command table. -! * Exeptions: - * - the 'k' command can directly be followed by any character. - * - the 's' command can be followed directly by 'c', 'g', 'i', 'I' or 'r' - * but :sre[wind] is another command, as are :scrip[tnames], ---- 2760,2766 ---- - - /* - * Isolate the command and search for it in the command table. -! * Exceptions: - * - the 'k' command can directly be followed by any character. - * - the 's' command can be followed directly by 'c', 'g', 'i', 'I' or 'r' - * but :sre[wind] is another command, as are :scrip[tnames], -*************** -*** 6677,6683 **** - * The list should be allocated using alloc(), as should each item in the - * list. This function takes over responsibility for freeing the list. - * -! * XXX The list is made into the arggument list. This is freed using - * FreeWild(), which does a series of vim_free() calls, unless the two defines - * __EMX__ and __ALWAYS_HAS_TRAILING_NUL_POINTER are set. In this case, a - * routine _fnexplodefree() is used. This may cause problems, but as the drop ---- 6677,6683 ---- - * The list should be allocated using alloc(), as should each item in the - * list. This function takes over responsibility for freeing the list. - * -! * XXX The list is made into the argument list. This is freed using - * FreeWild(), which does a series of vim_free() calls, unless the two defines - * __EMX__ and __ALWAYS_HAS_TRAILING_NUL_POINTER are set. In this case, a - * routine _fnexplodefree() is used. This may cause problems, but as the drop -*************** -*** 7795,7801 **** - if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged() - && !eap->forceit) - { -! EMSG(_("E747: Cannot change directory, buffer is modifed (add ! to override)")); - return; - } - ---- 7795,7801 ---- - if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged() - && !eap->forceit) - { -! EMSG(_("E747: Cannot change directory, buffer is modified (add ! to override)")); - return; - } - -*************** -*** 9391,9397 **** - if (src > srcstart && src[-1] == '\\') - { - *usedlen = 0; -! STRCPY(src - 1, src); /* remove backslash */ - return NULL; - } - ---- 9391,9397 ---- - if (src > srcstart && src[-1] == '\\') - { - *usedlen = 0; -! mch_memmove(src - 1, src, STRLEN(src) + 1); /* remove backslash */ - return NULL; - } - -*** ../vim-7.1.155/src/version.c Sat Nov 10 22:50:20 2007 ---- src/version.c Sun Nov 11 19:15:51 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 156, - /**/ - --- -Common sense is what tells you that the world is flat. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.157 b/7.1.157 deleted file mode 100644 index 071fdd8c..00000000 --- a/7.1.157 +++ /dev/null @@ -1,55 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.157 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.157 -Problem: In Ex mode, :" gives an error at end-of-file. (Michael Hordijk) -Solution: Only give an error for an empty line, not for a comment. -Files: src/ex_docmd.c - - -*** ../vim-7.1.156/src/ex_docmd.c Sun Nov 11 19:16:44 2007 ---- src/ex_docmd.c Sat Nov 17 20:23:38 2007 -*************** -*** 1741,1747 **** - } - - /* ignore comment and empty lines */ -! if (*ea.cmd == '"' || *ea.cmd == NUL) - { - ex_pressedreturn = TRUE; - goto doend; ---- 1741,1749 ---- - } - - /* ignore comment and empty lines */ -! if (*ea.cmd == '"') -! goto doend; -! if (*ea.cmd == NUL) - { - ex_pressedreturn = TRUE; - goto doend; -*** ../vim-7.1.156/src/version.c Sun Nov 11 19:16:44 2007 ---- src/version.c Tue Nov 20 12:28:22 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 157, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -119. You are reading a book and look for the scroll bar to get to - the next page. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.158 b/7.1.158 deleted file mode 100644 index 8bd2e8f6..00000000 --- a/7.1.158 +++ /dev/null @@ -1,157 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.158 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.158 (extra) -Problem: Win32 console: When 'encoding' is "utf-8" and typing Alt-y the - result is wrong. Win32 GUI: Alt-y results in "u" when 'encoding' - is "cp1250" (Lukas Cerman) -Solution: For utf-8 don't set the 7th bit in a byte, convert to the correct - byte sequence. For cp1250, when conversion to 'encoding' results - in the 7th bit not set, set the 7th bit after conversion. -Files: src/os_win32.c, src/gui_w48.c - - -*** ../vim-7.1.157/src/os_win32.c Mon Oct 1 20:33:45 2007 ---- src/os_win32.c Sat Oct 27 17:35:04 2007 -*************** -*** 1521,1527 **** ---- 1521,1532 ---- - #endif - ) - { -+ #ifdef FEAT_MBYTE -+ n = (*mb_char2bytes)(typeahead[typeaheadlen] | 0x80, -+ typeahead + typeaheadlen); -+ #else - typeahead[typeaheadlen] |= 0x80; -+ #endif - modifiers &= ~MOD_MASK_ALT; - } - -*** ../vim-7.1.157/src/gui_w48.c Sun Sep 30 14:00:41 2007 ---- src/gui_w48.c Mon Oct 29 20:00:25 2007 -*************** -*** 486,495 **** - - /* - * Convert Unicode character "ch" to bytes in "string[slen]". - * Return the length. - */ - static int -! char_to_string(int ch, char_u *string, int slen) - { - int len; - int i; ---- 486,496 ---- - - /* - * Convert Unicode character "ch" to bytes in "string[slen]". -+ * When "had_alt" is TRUE the ALT key was included in "ch". - * Return the length. - */ - static int -! char_to_string(int ch, char_u *string, int slen, int had_alt) - { - int len; - int i; -*************** -*** 522,529 **** ---- 523,544 ---- - * "enc_codepage" is non-zero use the standard Win32 function, - * otherwise use our own conversion function (e.g., for UTF-8). */ - if (enc_codepage > 0) -+ { - len = WideCharToMultiByte(enc_codepage, 0, wstring, len, - string, slen, 0, NULL); -+ /* If we had included the ALT key into the character but now the -+ * upper bit is no longer set, that probably means the conversion -+ * failed. Convert the original character and set the upper bit -+ * afterwards. */ -+ if (had_alt && len == 1 && ch >= 0x80 && string[0] < 0x80) -+ { -+ wstring[0] = ch & 0x7f; -+ len = WideCharToMultiByte(enc_codepage, 0, wstring, len, -+ string, slen, 0, NULL); -+ if (len == 1) /* safety check */ -+ string[0] |= 0x80; -+ } -+ } - else - { - len = 1; -*************** -*** 573,579 **** - char_u string[40]; - int len = 0; - -! len = char_to_string(ch, string, 40); - if (len == 1 && string[0] == Ctrl_C && ctrl_c_interrupts) - { - trash_input_buf(); ---- 588,594 ---- - char_u string[40]; - int len = 0; - -! len = char_to_string(ch, string, 40, FALSE); - if (len == 1 && string[0] == Ctrl_C && ctrl_c_interrupts) - { - trash_input_buf(); -*************** -*** 640,646 **** - { - /* Although the documentation isn't clear about it, we assume "ch" is - * a Unicode character. */ -! len += char_to_string(ch, string + len, 40 - len); - } - - add_to_input_buf(string, len); ---- 655,661 ---- - { - /* Although the documentation isn't clear about it, we assume "ch" is - * a Unicode character. */ -! len += char_to_string(ch, string + len, 40 - len, TRUE); - } - - add_to_input_buf(string, len); -*************** -*** 1775,1781 **** - int len; - - /* Handle "key" as a Unicode character. */ -! len = char_to_string(key, string, 40); - add_to_input_buf(string, len); - } - break; ---- 1790,1796 ---- - int len; - - /* Handle "key" as a Unicode character. */ -! len = char_to_string(key, string, 40, FALSE); - add_to_input_buf(string, len); - } - break; -*** ../vim-7.1.157/src/version.c Tue Nov 20 12:30:31 2007 ---- src/version.c Tue Nov 20 17:19:18 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 158, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -123. You ask the car dealer to install an extra cigarette lighter - on your new car to power your notebook. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.159 b/7.1.159 deleted file mode 100644 index e7f86991..00000000 --- a/7.1.159 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.159 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.159 -Problem: strcpy() has overlapping arguments. -Solution: Use mch_memmove() instead. (Dominique Pelle) -Files: src/ex_cmds.c - - -*** ../vim-7.1.158/src/ex_cmds.c Thu Nov 8 20:47:34 2007 ---- src/ex_cmds.c Sun Nov 18 14:11:58 2007 -*************** -*** 4885,4891 **** - ++line2; - /* move the cursor to the new line, like Vi */ - ++curwin->w_cursor.lnum; -! STRCPY(new_start, p1 + 1); /* copy the rest */ - p1 = new_start - 1; - } - } ---- 4885,4892 ---- - ++line2; - /* move the cursor to the new line, like Vi */ - ++curwin->w_cursor.lnum; -! /* copy the rest */ -! mch_memmove(new_start, p1 + 1, STRLEN(p1 + 1) + 1); - p1 = new_start - 1; - } - } -*** ../vim-7.1.158/src/version.c Tue Nov 20 17:21:28 2007 ---- src/version.c Tue Nov 20 18:01:45 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 159, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -125. You begin to wonder how often it REALLY is necessary to get up - and shower or bathe. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.160 b/7.1.160 deleted file mode 100644 index 48d0443d..00000000 --- a/7.1.160 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.160 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.160 -Problem: When a focus autocommand is defined, getting or losing focus - causes the hit-enter prompt to be redrawn. (Bjorn Winckler) -Solution: Overwrite the last line. -Files: src/message.c - - -*** ../vim-7.1.159/src/message.c Thu Sep 13 22:04:30 2007 ---- src/message.c Sun Nov 4 17:33:15 2007 -*************** -*** 2850,2855 **** ---- 2850,2864 ---- - } - else if (State == HITRETURN || State == SETWSIZE) - { -+ if (msg_row == Rows - 1) -+ { -+ /* Avoid drawing the "hit-enter" prompt below the previous one, -+ * overwrite it. Esp. useful when regaining focus and a -+ * FocusGained autocmd exists but didn't draw anything. */ -+ msg_didout = FALSE; -+ msg_col = 0; -+ msg_clr_eos(); -+ } - hit_return_msg(); - msg_row = Rows - 1; - } -*** ../vim-7.1.159/src/version.c Tue Nov 20 18:03:34 2007 ---- src/version.c Sat Nov 24 15:41:43 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 160, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -142. You dream about creating the world's greatest web site. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.161 b/7.1.161 deleted file mode 100644 index 69469ca3..00000000 --- a/7.1.161 +++ /dev/null @@ -1,176 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.161 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.161 -Problem: Compilation errors with tiny features and EXITFREE. -Solution: Add #ifdefs. (Dominique Pelle) -Files: src/edit.c, src/misc2.c - - -*** ../vim-7.1.160/src/edit.c Thu Nov 8 13:03:33 2007 ---- src/edit.c Sat Nov 24 14:57:46 2007 -*************** -*** 2236,2242 **** - while (i < actual_len && (p - IObuff + 6) < IOSIZE) - #ifdef FEAT_MBYTE - if (has_mbyte) -! p += mb_char2bytes(wca[i++], p); - else - #endif - *(p++) = wca[i++]; ---- 2236,2242 ---- - while (i < actual_len && (p - IObuff + 6) < IOSIZE) - #ifdef FEAT_MBYTE - if (has_mbyte) -! p += (*mb_char2bytes)(wca[i++], p); - else - #endif - *(p++) = wca[i++]; -*************** -*** 6444,6451 **** ---- 6444,6453 ---- - { - vim_free(last_insert); - last_insert = NULL; -+ # ifdef FEAT_INS_EXPAND - vim_free(compl_orig_text); - compl_orig_text = NULL; -+ # endif - } - #endif - -*** ../vim-7.1.160/src/misc2.c Thu Nov 8 20:47:34 2007 ---- src/misc2.c Sat Nov 24 15:01:46 2007 -*************** -*** 964,970 **** - { - buf_T *buf, *nextbuf; - static int entered = FALSE; -- win_T *win; - - /* When we cause a crash here it is caught and Vim tries to exit cleanly. - * Don't try freeing everything again. */ ---- 965,970 ---- -*************** -*** 972,986 **** - return; - entered = TRUE; - - block_autocmds(); /* don't want to trigger autocommands here */ - -! #ifdef FEAT_WINDOWS - /* close all tabs and windows */ - if (first_tabpage->tp_next != NULL) - do_cmdline_cmd((char_u *)"tabonly!"); - if (firstwin != lastwin) - do_cmdline_cmd((char_u *)"only!"); -! #endif - - # if defined(FEAT_SPELL) - /* Free all spell info. */ ---- 972,988 ---- - return; - entered = TRUE; - -+ # ifdef FEAT_AUTOCMD - block_autocmds(); /* don't want to trigger autocommands here */ -+ # endif - -! # ifdef FEAT_WINDOWS - /* close all tabs and windows */ - if (first_tabpage->tp_next != NULL) - do_cmdline_cmd((char_u *)"tabonly!"); - if (firstwin != lastwin) - do_cmdline_cmd((char_u *)"only!"); -! # endif - - # if defined(FEAT_SPELL) - /* Free all spell info. */ -*************** -*** 1031,1038 **** ---- 1033,1044 ---- - free_regexp_stuff(); - free_tag_stuff(); - free_cd_dir(); -+ # ifdef FEAT_EVAL - set_expr_line(NULL); -+ # endif -+ # ifdef FEAT_DIFF - diff_clear(curtab); -+ # endif - clear_sb_text(); /* free any scrollback text */ - - /* Free some global vars. */ -*************** -*** 1041,1059 **** - vim_free(clip_exclude_prog); - # endif - vim_free(last_cmdline); - vim_free(new_last_cmdline); - set_keep_msg(NULL, 0); - vim_free(ff_expand_buffer); - - /* Clear cmdline history. */ - p_hi = 0; - init_history(); - - #ifdef FEAT_QUICKFIX -! qf_free_all(NULL); -! /* Free all location lists */ -! FOR_ALL_WINDOWS(win) -! qf_free_all(win); - #endif - - /* Close all script inputs. */ ---- 1047,1073 ---- - vim_free(clip_exclude_prog); - # endif - vim_free(last_cmdline); -+ # ifdef FEAT_CMDHIST - vim_free(new_last_cmdline); -+ # endif - set_keep_msg(NULL, 0); - vim_free(ff_expand_buffer); - - /* Clear cmdline history. */ - p_hi = 0; -+ # ifdef FEAT_CMDHIST - init_history(); -+ # endif - - #ifdef FEAT_QUICKFIX -! { -! win_T *win; -! -! qf_free_all(NULL); -! /* Free all location lists */ -! FOR_ALL_WINDOWS(win) -! qf_free_all(win); -! } - #endif - - /* Close all script inputs. */ -*** ../vim-7.1.160/src/version.c Sat Nov 24 15:44:17 2007 ---- src/version.c Sat Nov 24 20:55:38 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 161, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -143. You dream in pallettes of 216 websafe colors. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.162 b/7.1.162 deleted file mode 100644 index b61631c3..00000000 --- a/7.1.162 +++ /dev/null @@ -1,172 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.162 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.162 -Problem: Crash when using a modifier before "while" or "for". (A.Politz) -Solution: Skip modifiers when checking for a loop command. -Files: src/proto/ex_docmd.pro, src/ex_docmd.c, src/ex_eval.c - - -*** ../vim-7.1.161/src/proto/ex_docmd.pro Sun Sep 30 14:00:41 2007 ---- src/proto/ex_docmd.pro Sat Nov 24 16:34:06 2007 -*************** -*** 5,10 **** ---- 5,11 ---- - int getline_equal __ARGS((char_u *(*fgetline)(int, void *, int), void *cookie, char_u *(*func)(int, void *, int))); - void *getline_cookie __ARGS((char_u *(*fgetline)(int, void *, int), void *cookie)); - int checkforcmd __ARGS((char_u **pp, char *cmd, int len)); -+ int modifier_len __ARGS((char_u *cmd)); - int cmd_exists __ARGS((char_u *name)); - char_u *set_one_cmd_context __ARGS((expand_T *xp, char_u *buff)); - char_u *skip_range __ARGS((char_u *cmd, int *ctx)); -*** ../vim-7.1.161/src/ex_docmd.c Tue Nov 20 12:30:31 2007 ---- src/ex_docmd.c Sat Nov 24 16:41:20 2007 -*************** -*** 2963,2968 **** ---- 2963,3019 ---- - #endif - - #if defined(FEAT_EVAL) || defined(PROTO) -+ static struct cmdmod -+ { -+ char *name; -+ int minlen; -+ int has_count; /* :123verbose :3tab */ -+ } cmdmods[] = { -+ {"aboveleft", 3, FALSE}, -+ {"belowright", 3, FALSE}, -+ {"botright", 2, FALSE}, -+ {"browse", 3, FALSE}, -+ {"confirm", 4, FALSE}, -+ {"hide", 3, FALSE}, -+ {"keepalt", 5, FALSE}, -+ {"keepjumps", 5, FALSE}, -+ {"keepmarks", 3, FALSE}, -+ {"leftabove", 5, FALSE}, -+ {"lockmarks", 3, FALSE}, -+ {"rightbelow", 6, FALSE}, -+ {"sandbox", 3, FALSE}, -+ {"silent", 3, FALSE}, -+ {"tab", 3, TRUE}, -+ {"topleft", 2, FALSE}, -+ {"verbose", 4, TRUE}, -+ {"vertical", 4, FALSE}, -+ }; -+ -+ /* -+ * Return length of a command modifier (including optional count). -+ * Return zero when it's not a modifier. -+ */ -+ int -+ modifier_len(cmd) -+ char_u *cmd; -+ { -+ int i, j; -+ char_u *p = cmd; -+ -+ if (VIM_ISDIGIT(*cmd)) -+ p = skipwhite(skipdigits(cmd)); -+ for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i) -+ { -+ for (j = 0; p[j] != NUL; ++j) -+ if (p[j] != cmdmods[i].name[j]) -+ break; -+ if (!isalpha(p[j]) && j >= cmdmods[i].minlen -+ && (p == cmd || cmdmods[i].has_count)) -+ return j + (p - cmd); -+ } -+ return 0; -+ } -+ - /* - * Return > 0 if an Ex command "name" exists. - * Return 2 if there is an exact match. -*************** -*** 2977,3006 **** - int i; - int j; - char_u *p; -- static struct cmdmod -- { -- char *name; -- int minlen; -- } cmdmods[] = { -- {"aboveleft", 3}, -- {"belowright", 3}, -- {"botright", 2}, -- {"browse", 3}, -- {"confirm", 4}, -- {"hide", 3}, -- {"keepalt", 5}, -- {"keepjumps", 5}, -- {"keepmarks", 3}, -- {"leftabove", 5}, -- {"lockmarks", 3}, -- {"rightbelow", 6}, -- {"sandbox", 3}, -- {"silent", 3}, -- {"tab", 3}, -- {"topleft", 2}, -- {"verbose", 4}, -- {"vertical", 4}, -- }; - - /* Check command modifiers. */ - for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i) ---- 3028,3033 ---- -*** ../vim-7.1.161/src/ex_eval.c Wed Aug 1 15:47:06 2007 ---- src/ex_eval.c Sat Nov 24 16:34:09 2007 -*************** -*** 2269,2277 **** - has_loop_cmd(p) - char_u *p; - { -! p = skipwhite(p); -! while (*p == ':') -! p = skipwhite(p + 1); - if ((p[0] == 'w' && p[1] == 'h') - || (p[0] == 'f' && p[1] == 'o' && p[2] == 'r')) - return TRUE; ---- 2269,2286 ---- - has_loop_cmd(p) - char_u *p; - { -! int len; -! -! /* skip modifiers, white space and ':' */ -! for (;;) -! { -! while (*p == ' ' || *p == '\t' || *p == ':') -! ++p; -! len = modifier_len(p); -! if (len == 0) -! break; -! p += len; -! } - if ((p[0] == 'w' && p[1] == 'h') - || (p[0] == 'f' && p[1] == 'o' && p[2] == 'r')) - return TRUE; -*** ../vim-7.1.161/src/version.c Sat Nov 24 21:27:33 2007 ---- src/version.c Sat Nov 24 21:48:38 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 162, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -144. You eagerly await the update of the "Cool Site of the Day." - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.163 b/7.1.163 deleted file mode 100644 index 433b2b3d..00000000 --- a/7.1.163 +++ /dev/null @@ -1,72 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.163 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.163 -Problem: Warning for the unknown option 'bufsecret'. -Solution: Remove the lines .vim that use this option. (Andy Wokula) -Files: runtime/menu.vim - - -*** ../vim-7.1.162/runtime/menu.vim Sun May 6 15:21:23 2007 ---- runtime/menu.vim Mon Nov 19 23:17:11 2007 -*************** -*** 2,8 **** - " You can also use this as a start for your own set of menus. - " - " Maintainer: Bram Moolenaar -! " Last Change: 2007 Jan 09 - - " Note that ":an" (short for ":anoremenu") is often used to make a menu work - " in all modes and avoid side effects from mappings defined by the user. ---- 2,8 ---- - " You can also use this as a start for your own set of menus. - " - " Maintainer: Bram Moolenaar -! " Last Change: 2007 Nov 19 - - " Note that ":an" (short for ":anoremenu") is often used to make a menu work - " in all modes and avoid side effects from mappings defined by the user. -*************** -*** 658,664 **** - let buf = 1 - while buf <= bufnr('$') - if bufexists(buf) && !isdirectory(bufname(buf)) && buflisted(buf) -- \ && !getbufvar(buf, "&bufsecret") - let s:bmenu_count = s:bmenu_count + 1 - endif - let buf = buf + 1 ---- 658,663 ---- -*************** -*** 671,677 **** - let buf = 1 - while buf <= bufnr('$') - if bufexists(buf) && !isdirectory(bufname(buf)) && buflisted(buf) -- \ && !getbufvar(buf, "&bufsecret") - call BMFilename(bufname(buf), buf) - endif - let buf = buf + 1 ---- 670,675 ---- -*** ../vim-7.1.162/src/version.c Sat Nov 24 21:49:19 2007 ---- src/version.c Thu Nov 29 17:44:08 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 163, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -158. You get a tuner card so you can watch TV while surfing. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.164 b/7.1.164 deleted file mode 100644 index 09aee5d3..00000000 --- a/7.1.164 +++ /dev/null @@ -1,52 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.164 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.164 -Problem: Reading past end of regexp pattern. (Dominique Pelle) -Solution: Use utf_ptr2len(). -Files: src/regexp.c - - -*** ../vim-7.1.163/src/regexp.c Sat Aug 11 13:57:31 2007 ---- src/regexp.c Sat Nov 24 13:23:53 2007 -*************** -*** 2770,2776 **** - { - #ifdef FEAT_MBYTE - if (enc_utf8) -! prevchr_len += utf_char2len(mb_ptr2char(regparse + prevchr_len)); - else if (has_mbyte) - prevchr_len += (*mb_ptr2len)(regparse + prevchr_len); - else ---- 2770,2777 ---- - { - #ifdef FEAT_MBYTE - if (enc_utf8) -! /* exclude composing chars that mb_ptr2len does include */ -! prevchr_len += utf_ptr2len(regparse + prevchr_len); - else if (has_mbyte) - prevchr_len += (*mb_ptr2len)(regparse + prevchr_len); - else -*** ../vim-7.1.163/src/version.c Thu Nov 29 17:46:01 2007 ---- src/version.c Thu Nov 29 21:25:45 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 164, - /**/ - --- -Send $25.00 for handy leaflet on how to make money by selling leaflets - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.165 b/7.1.165 deleted file mode 100644 index b2e8b303..00000000 --- a/7.1.165 +++ /dev/null @@ -1,177 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.165 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.165 -Problem: Crash related to getting X window ID. (Dominique Pelle) -Solution: Don't trust the window ID that we got in the past, check it every - time. -Files: src/os_unix.c - - -*** ../vim-7.1.164/src/os_unix.c Thu Aug 30 11:46:46 2007 ---- src/os_unix.c Thu Nov 29 18:19:56 2007 -*************** -*** 310,316 **** - } - - /* -! * mch_inchar(): low level input funcion. - * Get a characters from the keyboard. - * Return the number of characters that are available. - * If wtime == 0 do not wait for characters. ---- 310,316 ---- - } - - /* -! * mch_inchar(): low level input function. - * Get a characters from the keyboard. - * Return the number of characters that are available. - * If wtime == 0 do not wait for characters. -*************** -*** 1567,1584 **** - #ifdef FEAT_XCLIPBOARD - if (xterm_dpy != NULL && x11_window != 0) - { -! /* Checked it already. */ -! if (x11_display_from == XD_XTERM) -! return OK; -! -! /* -! * If the X11 display was opened here before, for the window where Vim -! * was started, close that one now to avoid a memory leak. -! */ -! if (x11_display_from == XD_HERE && x11_display != NULL) -! XCloseDisplay(x11_display); -! x11_display = xterm_dpy; -! x11_display_from = XD_XTERM; - if (test_x11_window(x11_display) == FAIL) - { - /* probably bad $WINDOWID */ ---- 1567,1585 ---- - #ifdef FEAT_XCLIPBOARD - if (xterm_dpy != NULL && x11_window != 0) - { -! /* We may have checked it already, but Gnome terminal can move us to -! * another window, so we need to check every time. */ -! if (x11_display_from != XD_XTERM) -! { -! /* -! * If the X11 display was opened here before, for the window where -! * Vim was started, close that one now to avoid a memory leak. -! */ -! if (x11_display_from == XD_HERE && x11_display != NULL) -! XCloseDisplay(x11_display); -! x11_display = xterm_dpy; -! x11_display_from = XD_XTERM; -! } - if (test_x11_window(x11_display) == FAIL) - { - /* probably bad $WINDOWID */ -*************** -*** 2421,2427 **** - /* - * Set the case of the file name, if it already exists. This will cause the - * file name to remain exactly the same. -! * Only required for file systems where case is ingored and preserved. - */ - /*ARGSUSED*/ - void ---- 2422,2428 ---- - /* - * Set the case of the file name, if it already exists. This will cause the - * file name to remain exactly the same. -! * Only required for file systems where case is ignored and preserved. - */ - /*ARGSUSED*/ - void -*************** -*** 4653,4659 **** - ret = poll(fds, nfd, towait); - # ifdef FEAT_MZSCHEME - if (ret == 0 && mzquantum_used) -! /* MzThreads scheduling is required and timeout occured */ - finished = FALSE; - # endif - ---- 4654,4660 ---- - ret = poll(fds, nfd, towait); - # ifdef FEAT_MZSCHEME - if (ret == 0 && mzquantum_used) -! /* MzThreads scheduling is required and timeout occurred */ - finished = FALSE; - # endif - -*************** -*** 4801,4807 **** - #endif - # ifdef FEAT_MZSCHEME - if (ret == 0 && mzquantum_used) -! /* loop if MzThreads must be scheduled and timeout occured */ - finished = FALSE; - # endif - ---- 4802,4808 ---- - #endif - # ifdef FEAT_MZSCHEME - if (ret == 0 && mzquantum_used) -! /* loop if MzThreads must be scheduled and timeout occurred */ - finished = FALSE; - # endif - -*************** -*** 5191,5197 **** - { - /* When using system() always add extra quotes, because the shell - * is started twice. Otherwise put a backslash before special -! * characters, except insice ``. */ - #ifdef USE_SYSTEM - STRCAT(command, " \""); - STRCAT(command, pat[i]); ---- 5192,5198 ---- - { - /* When using system() always add extra quotes, because the shell - * is started twice. Otherwise put a backslash before special -! * characters, except inside ``. */ - #ifdef USE_SYSTEM - STRCAT(command, " \""); - STRCAT(command, pat[i]); -*************** -*** 5675,5681 **** - /* gpm library tries to handling TSTP causes - * problems. Anyways, we close connection to Gpm whenever - * we are going to suspend or starting an external process -! * so we should'nt have problem with this - */ - signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); - return 1; /* succeed */ ---- 5676,5682 ---- - /* gpm library tries to handling TSTP causes - * problems. Anyways, we close connection to Gpm whenever - * we are going to suspend or starting an external process -! * so we shouldn't have problem with this - */ - signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); - return 1; /* succeed */ -*** ../vim-7.1.164/src/version.c Thu Nov 29 21:26:38 2007 ---- src/version.c Sat Dec 1 17:17:20 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 165, - /**/ - --- -"Hit any key to continue" is very confusing when you have two keyboards. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.166 b/7.1.166 deleted file mode 100644 index 14268d72..00000000 --- a/7.1.166 +++ /dev/null @@ -1,80 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.166 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.166 -Problem: Memory leak for using "gp" in Visual mode. -Solution: Free memory in put_register(). (Dominique Pelle) -Files: src/ops.c - - -*** ../vim-7.1.165/src/ops.c Thu Nov 8 10:35:02 2007 ---- src/ops.c Sun Nov 25 15:17:43 2007 -*************** -*** 927,934 **** - int name; - int copy; /* make a copy, if FALSE make register empty. */ - { -! static struct yankreg *reg; -! int i; - - #ifdef FEAT_CLIPBOARD - /* When Visual area changed, may have to update selection. Obtain the ---- 927,934 ---- - int name; - int copy; /* make a copy, if FALSE make register empty. */ - { -! struct yankreg *reg; -! int i; - - #ifdef FEAT_CLIPBOARD - /* When Visual area changed, may have to update selection. Obtain the -*************** -*** 967,973 **** - } - - /* -! * Put "reg" into register "name". Free any previous contents. - */ - void - put_register(name, reg) ---- 967,973 ---- - } - - /* -! * Put "reg" into register "name". Free any previous contents and "reg". - */ - void - put_register(name, reg) -*************** -*** 977,982 **** ---- 977,983 ---- - get_yank_register(name, 0); - free_yank_all(); - *y_current = *(struct yankreg *)reg; -+ vim_free(reg); - - # ifdef FEAT_CLIPBOARD - /* Send text written to clipboard register to the clipboard. */ -*** ../vim-7.1.165/src/version.c Sat Dec 1 17:18:45 2007 ---- src/version.c Sat Dec 1 21:11:25 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 166, - /**/ - --- -An error has occurred. Hit any user to continue. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.167 b/7.1.167 deleted file mode 100644 index 66426401..00000000 --- a/7.1.167 +++ /dev/null @@ -1,80 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.167 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.167 -Problem: Xxd crashes when using "xxd -b -c 110". (Debian bug 452789) -Solution: Allocate more memory. Fix check for maximum number of columns. -Files: src/xxd/xxd.c - - -*** ../vim-7.1.166/src/xxd/xxd.c Thu May 10 19:07:42 2007 ---- src/xxd/xxd.c Thu Nov 29 21:05:16 2007 -*************** -*** 212,218 **** - - #define TRY_SEEK /* attempt to use lseek, or skip forward by reading */ - #define COLS 256 /* change here, if you ever need more columns */ -! #define LLEN (9 + (5*COLS-1)/2 + 2 + COLS) - - char hexxa[] = "0123456789abcdef0123456789ABCDEF", *hexx = hexxa; - ---- 212,218 ---- - - #define TRY_SEEK /* attempt to use lseek, or skip forward by reading */ - #define COLS 256 /* change here, if you ever need more columns */ -! #define LLEN (11 + (9*COLS-1)/1 + COLS + 2) - - char hexxa[] = "0123456789abcdef0123456789ABCDEF", *hexx = hexxa; - -*************** -*** 590,596 **** - default: octspergrp = 0; break; - } - -! if (cols < 1 || (!hextype && (cols > COLS))) - { - fprintf(stderr, "%s: invalid number of columns (max. %d).\n", pname, COLS); - exit(1); ---- 590,597 ---- - default: octspergrp = 0; break; - } - -! if (cols < 1 || ((hextype == HEX_NORMAL || hextype == HEX_BITS) -! && (cols > COLS))) - { - fprintf(stderr, "%s: invalid number of columns (max. %d).\n", pname, COLS); - exit(1); -*************** -*** 750,755 **** ---- 751,757 ---- - } - if (ebcdic) - e = (e < 64) ? '.' : etoa64[e-64]; -+ /* When changing this update definition of LLEN above. */ - l[11 + (grplen * cols - 1)/octspergrp + p] = - #ifdef __MVS__ - (e >= 64) -*** ../vim-7.1.166/src/version.c Sat Dec 1 21:12:23 2007 ---- src/version.c Mon Dec 3 21:30:31 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 167, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -178. You look for an icon to double-click to open your bedroom window. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.168 b/7.1.168 deleted file mode 100644 index 07bf9c24..00000000 --- a/7.1.168 +++ /dev/null @@ -1,112 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.168 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.168 (extra) -Problem: Win32 GUI: Since patch 7.1.095, when the Vim window does not have - focus, clicking in it doesn't position the cursor. (Juergen - Kraemer) -Solution: Don't reset s_button_pending just after receiving focus. -Files: src/gui_w48.c - - -*** ../vim-7.1.167/src/gui_w48.c Tue Nov 20 17:21:28 2007 ---- src/gui_w48.c Mon Dec 3 22:13:16 2007 -*************** -*** 290,295 **** ---- 290,300 ---- - - /* Local variables */ - static int s_button_pending = -1; -+ -+ /* s_getting_focus is set when we got focus but didn't see mouse-up event yet, -+ * so don't reset s_button_pending. */ -+ static int s_getting_focus = FALSE; -+ - static int s_x_pending; - static int s_y_pending; - static UINT s_kFlags_pending; -*************** -*** 671,676 **** ---- 676,683 ---- - { - int vim_modifiers = 0x0; - -+ s_getting_focus = FALSE; -+ - if (keyFlags & MK_SHIFT) - vim_modifiers |= MOUSE_SHIFT; - if (keyFlags & MK_CONTROL) -*************** -*** 792,797 **** ---- 799,805 ---- - { - int button; - -+ s_getting_focus = FALSE; - if (s_button_pending > -1) - { - /* Delayed action for mouse down event */ -*************** -*** 1951,1958 **** - allow_scrollbar = FALSE; - - /* Clear pending mouse button, the release event may have been -! * taken by the dialog window. */ -! s_button_pending = -1; - - return OK; - } ---- 1959,1968 ---- - allow_scrollbar = FALSE; - - /* Clear pending mouse button, the release event may have been -! * taken by the dialog window. But don't do this when getting -! * focus, we need the mouse-up event then. */ -! if (!s_getting_focus) -! s_button_pending = -1; - - return OK; - } -*************** -*** 2702,2707 **** ---- 2712,2718 ---- - HWND hwndOldFocus) - { - gui_focus_change(TRUE); -+ s_getting_focus = TRUE; - (void)MyWindowProc(hwnd, WM_SETFOCUS, (WPARAM)hwndOldFocus, 0); - } - -*************** -*** 2711,2716 **** ---- 2722,2728 ---- - HWND hwndNewFocus) - { - gui_focus_change(FALSE); -+ s_getting_focus = FALSE; - (void)MyWindowProc(hwnd, WM_KILLFOCUS, (WPARAM)hwndNewFocus, 0); - } - -*** ../vim-7.1.167/src/version.c Mon Dec 3 21:31:56 2007 ---- src/version.c Mon Dec 3 22:16:32 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 168, - /**/ - --- -Rule #1: Don't give somebody a tool that he's going to hurt himself with. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.169 b/7.1.169 deleted file mode 100644 index 12f66df6..00000000 --- a/7.1.169 +++ /dev/null @@ -1,75 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.169 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.169 -Problem: Using uninitialized variable when system() fails. (Dominique - Pelle) -Solution: Let system() return an empty string when it fails. -Files: src/eval.c - - -*** ../vim-7.1.168/src/eval.c Thu Nov 8 20:47:34 2007 ---- src/eval.c Fri Nov 30 21:01:26 2007 -*************** -*** 15826,15832 **** - FILE *fd; - - if (check_restricted() || check_secure()) -! return; - - if (argvars[1].v_type != VAR_UNKNOWN) - { ---- 15826,15832 ---- - FILE *fd; - - if (check_restricted() || check_secure()) -! goto done; - - if (argvars[1].v_type != VAR_UNKNOWN) - { -*************** -*** 15837,15843 **** - if ((infile = vim_tempname('i')) == NULL) - { - EMSG(_(e_notmp)); -! return; - } - - fd = mch_fopen((char *)infile, WRITEBIN); ---- 15837,15843 ---- - if ((infile = vim_tempname('i')) == NULL) - { - EMSG(_(e_notmp)); -! goto done; - } - - fd = mch_fopen((char *)infile, WRITEBIN); -*** ../vim-7.1.168/src/version.c Mon Dec 3 22:20:17 2007 ---- src/version.c Fri Dec 7 17:07:32 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 169, - /**/ - --- -% cat /usr/include/sys/errno.h -#define EPERM 1 /* Operation not permitted */ -#define ENOENT 2 /* No such file or directory */ -#define ESRCH 3 /* No such process */ -[...] -#define EMACS 666 /* Too many macros */ -% - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.170 b/7.1.170 deleted file mode 100644 index fabeb110..00000000 --- a/7.1.170 +++ /dev/null @@ -1,58 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.170 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.170 -Problem: Valgrind warning for overlapping arguments for strcpy(). -Solution: Use mch_memmove() instead. (Dominique Pelle) -Files: src/getchar.c - - -*** ../vim-7.1.169/src/getchar.c Thu Sep 13 18:25:08 2007 ---- src/getchar.c Mon Dec 3 20:42:29 2007 -*************** -*** 253,260 **** - return; - } - else if (buf->bh_index != 0) -! STRCPY(buf->bh_first.b_next->b_str, -! buf->bh_first.b_next->b_str + buf->bh_index); - buf->bh_index = 0; - - if (buf->bh_space >= (int)slen) ---- 253,261 ---- - return; - } - else if (buf->bh_index != 0) -! mch_memmove(buf->bh_first.b_next->b_str, -! buf->bh_first.b_next->b_str + buf->bh_index, -! STRLEN(buf->bh_first.b_next->b_str + buf->bh_index) + 1); - buf->bh_index = 0; - - if (buf->bh_space >= (int)slen) -*** ../vim-7.1.169/src/version.c Fri Dec 7 17:08:35 2007 ---- src/version.c Fri Dec 7 17:27:13 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 170, - /**/ - --- -Some of the well know MS-Windows errors: - ESLEEP Operator fell asleep - ENOERR No error yet - EDOLLAR OS too expensive - EWINDOWS MS-Windows loaded, system in danger - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.171 b/7.1.171 deleted file mode 100644 index cad1edd4..00000000 --- a/7.1.171 +++ /dev/null @@ -1,79 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.171 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.171 -Problem: Reading one byte before allocated memory. -Solution: Check index not to become negative. (Dominique Pelle) -Files: src/ex_getln.c - - -*** ../vim-7.1.170/src/ex_getln.c Tue Oct 30 17:36:31 2007 ---- src/ex_getln.c Tue Dec 4 21:49:24 2007 -*************** -*** 1186,1195 **** - case K_LEFT: - case K_S_LEFT: - case K_C_LEFT: - do - { -- if (ccline.cmdpos == 0) -- break; - --ccline.cmdpos; - #ifdef FEAT_MBYTE - if (has_mbyte) /* move to first byte of char */ ---- 1186,1195 ---- - case K_LEFT: - case K_S_LEFT: - case K_C_LEFT: -+ if (ccline.cmdpos == 0) -+ goto cmdline_not_changed; - do - { - --ccline.cmdpos; - #ifdef FEAT_MBYTE - if (has_mbyte) /* move to first byte of char */ -*************** -*** 1198,1204 **** - #endif - ccline.cmdspos -= cmdline_charsize(ccline.cmdpos); - } -! while ((c == K_S_LEFT || c == K_C_LEFT - || (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))) - && ccline.cmdbuff[ccline.cmdpos - 1] != ' '); - #ifdef FEAT_MBYTE ---- 1198,1205 ---- - #endif - ccline.cmdspos -= cmdline_charsize(ccline.cmdpos); - } -! while (ccline.cmdpos > 0 -! && (c == K_S_LEFT || c == K_C_LEFT - || (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))) - && ccline.cmdbuff[ccline.cmdpos - 1] != ' '); - #ifdef FEAT_MBYTE -*** ../vim-7.1.170/src/version.c Fri Dec 7 17:30:04 2007 ---- src/version.c Fri Dec 7 20:00:06 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 171, - /**/ - --- -Some of the well know MS-Windows errors: - EMULTI Multitasking attempted, system confused - EKEYBOARD Keyboard locked, try getting out of this one! - EXPLAIN Unexplained error, please tell us what happened - EFUTURE Reserved for our future mistakes - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.172 b/7.1.172 deleted file mode 100644 index 9f608823..00000000 --- a/7.1.172 +++ /dev/null @@ -1,50 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.172 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.172 -Problem: When 'buftype' is "acwrite" Vim still checks if the file or - directory exists before overwriting. -Solution: Don't check for overwriting when the buffer name is not a file - name. -Files: src/ex_cmds.c - - -*** ../vim-7.1.171/src/ex_cmds.c Tue Nov 20 18:03:34 2007 ---- src/ex_cmds.c Fri Dec 7 22:13:32 2007 -*************** -*** 2732,2737 **** ---- 2732,2740 ---- - && vim_strchr(p_cpo, CPO_OVERNEW) == NULL) - || (buf->b_flags & BF_READERR)) - && !p_wa -+ #ifdef FEAT_QUICKFIX -+ && !bt_nofile(buf) -+ #endif - && vim_fexists(ffname)) - { - if (!eap->forceit && !eap->append) -*** ../vim-7.1.171/src/version.c Fri Dec 7 20:28:13 2007 ---- src/version.c Sat Dec 8 22:18:54 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 172, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -206. You religiously respond immediately to e-mail, while ignoring - your growing pile of snail mail. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.173 b/7.1.173 deleted file mode 100644 index e6a855d0..00000000 --- a/7.1.173 +++ /dev/null @@ -1,61 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.173 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.173 -Problem: Accessing freed memory. (Dominique Pelle) -Solution: Don't call reg_getline() to check if a line is the first in the - file. -Files: src/regexp.c - - -*** ../vim-7.1.172/src/regexp.c Thu Nov 29 21:26:38 2007 ---- src/regexp.c Sat Dec 8 15:54:05 2007 -*************** -*** 3810,3820 **** - break; - - case RE_BOF: -! /* Passing -1 to the getline() function provided for the search -! * should always return NULL if the current line is the first -! * line of the file. */ - if (reglnum != 0 || reginput != regline -! || (REG_MULTI && reg_getline((linenr_T)-1) != NULL)) - status = RA_NOMATCH; - break; - ---- 3810,3820 ---- - break; - - case RE_BOF: -! /* We're not at the beginning of the file when below the first -! * line where we started, not at the start of the line or we -! * didn't start at the first line of the buffer. */ - if (reglnum != 0 || reginput != regline -! || (REG_MULTI && reg_firstlnum > 1)) - status = RA_NOMATCH; - break; - -*** ../vim-7.1.172/src/version.c Sat Dec 8 22:20:24 2007 ---- src/version.c Sun Dec 9 19:24:36 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 173, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -213. Your kids start referring to you as "that guy in front of the monitor." - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.174 b/7.1.174 deleted file mode 100644 index 7eb4c218..00000000 --- a/7.1.174 +++ /dev/null @@ -1,71 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.174 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.174 -Problem: Writing NUL past end of a buffer. -Solution: Copy one byte less when using strncat(). (Dominuque Pelle) -Files: src/ex_cmds.c, src/ex_docmd.c - - -*** ../vim-7.1.173/src/ex_cmds.c Sat Dec 8 22:20:24 2007 ---- src/ex_cmds.c Fri Dec 7 22:13:32 2007 -*************** -*** 1650,1656 **** - { - vim_snprintf((char *)IObuff, IOSIZE, _("%sviminfo: %s in line: "), - errnum, message); -! STRNCAT(IObuff, line, IOSIZE - STRLEN(IObuff)); - if (IObuff[STRLEN(IObuff) - 1] == '\n') - IObuff[STRLEN(IObuff) - 1] = NUL; - emsg(IObuff); ---- 1650,1656 ---- - { - vim_snprintf((char *)IObuff, IOSIZE, _("%sviminfo: %s in line: "), - errnum, message); -! STRNCAT(IObuff, line, IOSIZE - STRLEN(IObuff) - 1); - if (IObuff[STRLEN(IObuff) - 1] == '\n') - IObuff[STRLEN(IObuff) - 1] = NUL; - emsg(IObuff); -*** ../vim-7.1.173/src/ex_docmd.c Sat Nov 24 21:49:19 2007 ---- src/ex_docmd.c Fri Dec 7 21:01:03 2007 -*************** -*** 2660,2666 **** - errormsg = IObuff; - } - STRCAT(errormsg, ": "); -! STRNCAT(errormsg, *cmdlinep, IOSIZE - STRLEN(IObuff)); - } - emsg(errormsg); - } ---- 2660,2666 ---- - errormsg = IObuff; - } - STRCAT(errormsg, ": "); -! STRNCAT(errormsg, *cmdlinep, IOSIZE - STRLEN(IObuff) - 1); - } - emsg(errormsg); - } -*** ../vim-7.1.173/src/version.c Sun Dec 9 19:25:35 2007 ---- src/version.c Sun Dec 9 19:36:50 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 174, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -214. Your MCI "Circle of Friends" are all Hayes-compatible. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.175 b/7.1.175 deleted file mode 100644 index 3ec00fd7..00000000 --- a/7.1.175 +++ /dev/null @@ -1,179 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.175 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.175 -Problem: doesn't work with some combination of 'sts', 'linebreak' and - 'backspace'. (Francois Ingelrest) -Solution: When adding white space results in not moving back delete one - character. -Files: src/edit.c - - -*** ../vim-7.1.174/src/edit.c Sat Nov 24 21:27:33 2007 ---- src/edit.c Fri Dec 7 21:32:48 2007 -*************** -*** 8189,8194 **** ---- 8189,8217 ---- - AppendCharToRedobuff(K_DEL); - } - -+ static void ins_bs_one __ARGS((colnr_T *vcolp)); -+ -+ /* -+ * Delete one character for ins_bs(). -+ */ -+ static void -+ ins_bs_one(vcolp) -+ colnr_T *vcolp; -+ { -+ dec_cursor(); -+ getvcol(curwin, &curwin->w_cursor, vcolp, NULL, NULL); -+ if (State & REPLACE_FLAG) -+ { -+ /* Don't delete characters before the insert point when in -+ * Replace mode */ -+ if (curwin->w_cursor.lnum != Insstart.lnum -+ || curwin->w_cursor.col >= Insstart.col) -+ replace_do_bs(); -+ } -+ else -+ (void)del_char(FALSE); -+ } -+ - /* - * Handle Backspace, delete-word and delete-line in Insert mode. - * Return TRUE when backspace was actually used. -*************** -*** 8418,8426 **** - int ts; - colnr_T vcol; - colnr_T want_vcol; -! #if 0 -! int extra = 0; -! #endif - - *inserted_space_p = FALSE; - if (p_sta && in_indent) ---- 8441,8447 ---- - int ts; - colnr_T vcol; - colnr_T want_vcol; -! colnr_T start_vcol; - - *inserted_space_p = FALSE; - if (p_sta && in_indent) -*************** -*** 8431,8436 **** ---- 8452,8458 ---- - * 'showbreak' may get in the way, need to get the last column of - * the previous character. */ - getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL); -+ start_vcol = vcol; - dec_cursor(); - getvcol(curwin, &curwin->w_cursor, NULL, NULL, &want_vcol); - inc_cursor(); -*************** -*** 8439,8468 **** - /* delete characters until we are at or before want_vcol */ - while (vcol > want_vcol - && (cc = *(ml_get_cursor() - 1), vim_iswhite(cc))) -! { -! dec_cursor(); -! getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL); -! if (State & REPLACE_FLAG) -! { -! /* Don't delete characters before the insert point when in -! * Replace mode */ -! if (curwin->w_cursor.lnum != Insstart.lnum -! || curwin->w_cursor.col >= Insstart.col) -! { -! #if 0 /* what was this for? It causes problems when sw != ts. */ -! if (State == REPLACE && (int)vcol < want_vcol) -! { -! (void)del_char(FALSE); -! extra = 2; /* don't pop too much */ -! } -! else -! #endif -! replace_do_bs(); -! } -! } -! else -! (void)del_char(FALSE); -! } - - /* insert extra spaces until we are at want_vcol */ - while (vcol < want_vcol) ---- 8461,8467 ---- - /* delete characters until we are at or before want_vcol */ - while (vcol > want_vcol - && (cc = *(ml_get_cursor() - 1), vim_iswhite(cc))) -! ins_bs_one(&vcol); - - /* insert extra spaces until we are at want_vcol */ - while (vcol < want_vcol) -*************** -*** 8479,8500 **** - #endif - { - ins_str((char_u *)" "); -! if ((State & REPLACE_FLAG) /* && extra <= 1 */) -! { -! #if 0 -! if (extra) -! replace_push_off(NUL); -! else -! #endif -! replace_push(NUL); -! } -! #if 0 -! if (extra == 2) -! extra = 1; -! #endif - } - getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL); - } - } - - /* ---- 8478,8493 ---- - #endif - { - ins_str((char_u *)" "); -! if ((State & REPLACE_FLAG)) -! replace_push(NUL); - } - getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL); - } -+ -+ /* If we are now back where we started delete one character. Can -+ * happen when using 'sts' and 'linebreak'. */ -+ if (vcol >= start_vcol) -+ ins_bs_one(&vcol); - } - - /* -*** ../vim-7.1.174/src/version.c Sun Dec 9 19:37:37 2007 ---- src/version.c Sun Dec 9 20:24:11 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 175, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -215. Your mouse-clicking forearm rivals Popeye's. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.176 b/7.1.176 deleted file mode 100644 index e752419f..00000000 --- a/7.1.176 +++ /dev/null @@ -1,88 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.176 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.176 -Problem: Building with Aap fails when the "compiledby" argument contains - '<' or '>' characters. (Alex Yeh) -Solution: Change how quoting is done in the Aap recipe. -Files: src/main.aap - - -*** ../vim-7.1.175/src/main.aap Tue Sep 25 22:13:14 2007 ---- src/main.aap Fri Dec 7 17:03:31 2007 -*************** -*** 63,70 **** - @else: - @ arch = "ppc" - :print Building for $arch system - :sys CONFIG_STATUS=auto/config.status -! ./configure.aap `file2string("config.arg")` - --with-mac-arch=$arch - --cache-file=auto/config.cache - ---- 63,71 ---- - @else: - @ arch = "ppc" - :print Building for $arch system -+ config_args = `file2string("config.arg")` - :sys CONFIG_STATUS=auto/config.status -! ./configure.aap $config_args - --with-mac-arch=$arch - --cache-file=auto/config.cache - -*************** -*** 440,450 **** - :print >> $target char_u *all_lflags = (char_u *)"$linkcmd"; - @if _no.get("COMPILEDBY"): - who = $COMPILEDBY -! where = '' - @else: - :syseval whoami | :eval re.sub("\n", "", stdin) | :assign who - - :syseval hostname | :eval re.sub("\n", "", stdin) | :assign where - :print >> $target char_u *compiled_user = (char_u *)"$who"; - :print >> $target char_u *compiled_sys = (char_u *)"$where"; - ---- 441,453 ---- - :print >> $target char_u *all_lflags = (char_u *)"$linkcmd"; - @if _no.get("COMPILEDBY"): - who = $COMPILEDBY -! where = - @else: - :syseval whoami | :eval re.sub("\n", "", stdin) | :assign who - - :syseval hostname | :eval re.sub("\n", "", stdin) | :assign where -+ @who = string.replace(who, '"', '\\"') -+ @where = string.replace(where, '"', '\\"') - :print >> $target char_u *compiled_user = (char_u *)"$who"; - :print >> $target char_u *compiled_sys = (char_u *)"$where"; - -*** ../vim-7.1.175/src/version.c Sun Dec 9 20:25:59 2007 ---- src/version.c Mon Dec 31 16:40:01 2007 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 176, - /**/ - --- -E M A C S -s e l o h -c t t n i -a a t f -p r t -e o - l - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.177 b/7.1.177 deleted file mode 100644 index cc3b13c5..00000000 --- a/7.1.177 +++ /dev/null @@ -1,193 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.177 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.177 -Problem: Freeing memory twice when in debug mode while reading a script. -Solution: Ignore script input while in debug mode. -Files: src/ex_cmds2.c, src/getchar.c, src/globals.h - - -*** ../vim-7.1.176/src/ex_cmds2.c Thu May 10 20:55:46 2007 ---- src/ex_cmds2.c Tue Jan 1 14:13:41 2008 -*************** -*** 93,98 **** ---- 93,100 ---- - int save_emsg_silent = emsg_silent; - int save_redir_off = redir_off; - tasave_T typeaheadbuf; -+ int typeahead_saved = FALSE; -+ int save_ignore_script; - # ifdef FEAT_EX_EXTRA - int save_ex_normal_busy; - # endif -*************** -*** 159,176 **** - * This makes sure we get input from the user here and don't interfere - * with the commands being executed. Reset "ex_normal_busy" to avoid - * the side effects of using ":normal". Save the stuff buffer and make -! * it empty. */ - # ifdef FEAT_EX_EXTRA - save_ex_normal_busy = ex_normal_busy; - ex_normal_busy = 0; - # endif - if (!debug_greedy) - save_typeahead(&typeaheadbuf); - - cmdline = getcmdline_prompt('>', NULL, 0, EXPAND_NOTHING, NULL); - -! if (!debug_greedy) - restore_typeahead(&typeaheadbuf); - # ifdef FEAT_EX_EXTRA - ex_normal_busy = save_ex_normal_busy; - # endif ---- 161,186 ---- - * This makes sure we get input from the user here and don't interfere - * with the commands being executed. Reset "ex_normal_busy" to avoid - * the side effects of using ":normal". Save the stuff buffer and make -! * it empty. Set ignore_script to avoid reading from script input. */ - # ifdef FEAT_EX_EXTRA - save_ex_normal_busy = ex_normal_busy; - ex_normal_busy = 0; - # endif - if (!debug_greedy) -+ { - save_typeahead(&typeaheadbuf); -+ typeahead_saved = TRUE; -+ save_ignore_script = ignore_script; -+ ignore_script = TRUE; -+ } - - cmdline = getcmdline_prompt('>', NULL, 0, EXPAND_NOTHING, NULL); - -! if (typeahead_saved) -! { - restore_typeahead(&typeaheadbuf); -+ ignore_script = save_ignore_script; -+ } - # ifdef FEAT_EX_EXTRA - ex_normal_busy = save_ex_normal_busy; - # endif -*** ../vim-7.1.176/src/getchar.c Fri Dec 7 17:30:04 2007 ---- src/getchar.c Tue Jan 1 14:11:42 2008 -*************** -*** 1279,1286 **** - void - free_typebuf() - { -! vim_free(typebuf.tb_buf); -! vim_free(typebuf.tb_noremap); - } - - /* ---- 1279,1292 ---- - void - free_typebuf() - { -! if (typebuf.tb_buf == typebuf_init) -! EMSG2(_(e_intern2), "Free typebuf 1"); -! else -! vim_free(typebuf.tb_buf); -! if (typebuf.tb_buf == noremapbuf_init) -! EMSG2(_(e_intern2), "Free typebuf 2"); -! else -! vim_free(typebuf.tb_noremap); - } - - /* -*************** -*** 1359,1364 **** ---- 1365,1375 ---- - EMSG(_(e_nesting)); - return; - } -+ #ifdef FEAT_EVAL -+ if (ignore_script) -+ /* Not reading from script, also don't open one. Warning message? */ -+ return; -+ #endif - - if (scriptin[curscript] != NULL) /* already reading script */ - ++curscript; -*************** -*** 2346,2352 **** - current_menu->silent[idx]); - } - } -! #endif /* FEAT_GUI */ - continue; /* try mapping again */ - } - ---- 2357,2363 ---- - current_menu->silent[idx]); - } - } -! #endif /* FEAT_GUI && FEAT_MENU */ - continue; /* try mapping again */ - } - -*************** -*** 2862,2872 **** - undo_off = FALSE; /* restart undo now */ - - /* -! * first try script file -! * If interrupted: Stop reading script files. - */ - script_char = -1; -! while (scriptin[curscript] != NULL && script_char < 0) - { - if (got_int || (script_char = getc(scriptin[curscript])) < 0) - { ---- 2873,2887 ---- - undo_off = FALSE; /* restart undo now */ - - /* -! * Get a character from a script file if there is one. -! * If interrupted: Stop reading script files, close them all. - */ - script_char = -1; -! while (scriptin[curscript] != NULL && script_char < 0 -! #ifdef FEAT_EVAL -! && !ignore_script -! #endif -! ) - { - if (got_int || (script_char = getc(scriptin[curscript])) < 0) - { -*** ../vim-7.1.176/src/globals.h Sat Sep 29 14:15:00 2007 ---- src/globals.h Mon Dec 31 17:00:21 2007 -*************** -*** 954,959 **** ---- 954,962 ---- - EXTERN int ex_normal_busy INIT(= 0); /* recursiveness of ex_normal() */ - EXTERN int ex_normal_lock INIT(= 0); /* forbid use of ex_normal() */ - #endif -+ #ifdef FEAT_EVAL -+ EXTERN int ignore_script INIT(= FALSE); /* ignore script input */ -+ #endif - EXTERN int stop_insert_mode; /* for ":stopinsert" and 'insertmode' */ - - EXTERN int KeyTyped; /* TRUE if user typed current char */ -*** ../vim-7.1.176/src/version.c Mon Dec 31 16:41:31 2007 ---- src/version.c Tue Jan 1 14:00:09 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 177, - /**/ - --- -Back up my hard drive? I can't find the reverse switch! - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.178 b/7.1.178 deleted file mode 100644 index 972e4951..00000000 --- a/7.1.178 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.178 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.178 -Problem: "%" doesn't work on "/* comment *//* comment */". -Solution: Don't handle the "//" in "*//*" as a C++ comment. (Markus - Heidelberg) -Files: src/search.c - - -*** ../vim-7.1.177/src/search.c Wed Aug 8 22:48:16 2007 ---- src/search.c Mon Dec 10 21:21:17 2007 -*************** -*** 2319,2325 **** - #endif - while ((p = vim_strchr(p, '/')) != NULL) - { -! if (p[1] == '/') - break; - ++p; - } ---- 2319,2327 ---- - #endif - while ((p = vim_strchr(p, '/')) != NULL) - { -! /* accept a double /, unless it's preceded with * and followed by *, -! * because * / / * is an end and start of a C comment */ -! if (p[1] == '/' && (p == line || p[-1] != '*' || p[2] != '*')) - break; - ++p; - } -*** ../vim-7.1.177/src/version.c Tue Jan 1 14:16:42 2008 ---- src/version.c Tue Jan 1 15:41:33 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 178, - /**/ - --- -I'd like to meet the man who invented sex and see what he's working on now. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.179 b/7.1.179 deleted file mode 100644 index 1e131759..00000000 --- a/7.1.179 +++ /dev/null @@ -1,189 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.179 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.179 -Problem: Need to check for TCL 8.5. -Solution: Adjust configure script. (Alexey Froloff) -Files: src/configure.in, src/auto/configure - - -*** ../vim-7.1.178/src/configure.in Sun Nov 4 15:35:23 2007 ---- src/configure.in Sun Dec 30 13:55:28 2007 -*************** -*** 759,773 **** - - if test "$enable_tclinterp" = "yes"; then - -! dnl on FreeBSD tclsh is a silly script, look for tclsh8.[420] - AC_MSG_CHECKING(--with-tclsh argument) - AC_ARG_WITH(tclsh, [ --with-tclsh=PATH which tclsh to use (default: tclsh8.0)], - tclsh_name="$withval"; AC_MSG_RESULT($tclsh_name), -! tclsh_name="tclsh8.4"; AC_MSG_RESULT(no)) - AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name) - AC_SUBST(vi_cv_path_tcl) - -! dnl when no specific version specified, also try 8.2 and 8.0 - if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.4"; then - tclsh_name="tclsh8.2" - AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name) ---- 759,777 ---- - - if test "$enable_tclinterp" = "yes"; then - -! dnl on FreeBSD tclsh is a silly script, look for tclsh8.[5420] - AC_MSG_CHECKING(--with-tclsh argument) - AC_ARG_WITH(tclsh, [ --with-tclsh=PATH which tclsh to use (default: tclsh8.0)], - tclsh_name="$withval"; AC_MSG_RESULT($tclsh_name), -! tclsh_name="tclsh8.5"; AC_MSG_RESULT(no)) - AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name) - AC_SUBST(vi_cv_path_tcl) - -! dnl when no specific version specified, also try 8.4, 8.2 and 8.0 -! if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.5"; then -! tclsh_name="tclsh8.4" -! AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name) -! fi - if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.4"; then - tclsh_name="tclsh8.2" - AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name) -*************** -*** 810,815 **** ---- 814,820 ---- - AC_MSG_CHECKING(for location of tclConfig.sh script) - if test "x$MACOSX" != "xyes"; then - tclcnf=`echo $tclinc | sed s/include/lib/g` -+ tclcnf="$tclcnf `echo $tclinc | sed s/include/lib64/g`" - else - dnl For Mac OS X 10.3, use the OS-provided framework location - tclcnf="/System/Library/Frameworks/Tcl.framework" -*************** -*** 830,835 **** ---- 835,841 ---- - AC_MSG_RESULT() - AC_MSG_CHECKING(for Tcl library by myself) - tcllib=`echo $tclinc | sed s/include/lib/g` -+ tcllib="$tcllib `echo $tclinc | sed s/include/lib64/g`" - for ext in .so .a ; do - for ver in "" $tclver ; do - for try in $tcllib ; do -*** ../vim-7.1.178/src/auto/configure Sun Nov 4 15:35:23 2007 ---- src/auto/configure Sun Dec 30 13:55:35 2007 -*************** -*** 4445,4451 **** - tclsh_name="$withval"; echo "$as_me:$LINENO: result: $tclsh_name" >&5 - echo "${ECHO_T}$tclsh_name" >&6 - else -! tclsh_name="tclsh8.4"; echo "$as_me:$LINENO: result: no" >&5 - echo "${ECHO_T}no" >&6 - fi; - # Extract the first word of "$tclsh_name", so it can be a program name with args. ---- 4445,4451 ---- - tclsh_name="$withval"; echo "$as_me:$LINENO: result: $tclsh_name" >&5 - echo "${ECHO_T}$tclsh_name" >&6 - else -! tclsh_name="tclsh8.5"; echo "$as_me:$LINENO: result: no" >&5 - echo "${ECHO_T}no" >&6 - fi; - # Extract the first word of "$tclsh_name", so it can be a program name with args. -*************** -*** 4489,4495 **** - - - -! if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.4"; then - tclsh_name="tclsh8.2" - # Extract the first word of "$tclsh_name", so it can be a program name with args. - set dummy $tclsh_name; ac_word=$2 ---- 4489,4537 ---- - - - -! if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.5"; then -! tclsh_name="tclsh8.4" -! # Extract the first word of "$tclsh_name", so it can be a program name with args. -! set dummy $tclsh_name; ac_word=$2 -! echo "$as_me:$LINENO: checking for $ac_word" >&5 -! echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -! if test "${ac_cv_path_vi_cv_path_tcl+set}" = set; then -! echo $ECHO_N "(cached) $ECHO_C" >&6 -! else -! case $vi_cv_path_tcl in -! [\\/]* | ?:[\\/]*) -! ac_cv_path_vi_cv_path_tcl="$vi_cv_path_tcl" # Let the user override the test with a path. -! ;; -! *) -! as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -! for as_dir in $PATH -! do -! IFS=$as_save_IFS -! test -z "$as_dir" && as_dir=. -! for ac_exec_ext in '' $ac_executable_extensions; do -! if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -! ac_cv_path_vi_cv_path_tcl="$as_dir/$ac_word$ac_exec_ext" -! echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -! break 2 -! fi -! done -! done -! -! ;; -! esac -! fi -! vi_cv_path_tcl=$ac_cv_path_vi_cv_path_tcl -! -! if test -n "$vi_cv_path_tcl"; then -! echo "$as_me:$LINENO: result: $vi_cv_path_tcl" >&5 -! echo "${ECHO_T}$vi_cv_path_tcl" >&6 -! else -! echo "$as_me:$LINENO: result: no" >&5 -! echo "${ECHO_T}no" >&6 -! fi -! -! fi -! if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.4"; then - tclsh_name="tclsh8.2" - # Extract the first word of "$tclsh_name", so it can be a program name with args. - set dummy $tclsh_name; ac_word=$2 -*************** -*** 4649,4654 **** ---- 4691,4697 ---- - echo $ECHO_N "checking for location of tclConfig.sh script... $ECHO_C" >&6 - if test "x$MACOSX" != "xyes"; then - tclcnf=`echo $tclinc | sed s/include/lib/g` -+ tclcnf="$tclcnf `echo $tclinc | sed s/include/lib64/g`" - else - tclcnf="/System/Library/Frameworks/Tcl.framework" - fi -*************** -*** 4668,4673 **** ---- 4711,4717 ---- - echo "$as_me:$LINENO: checking for Tcl library by myself" >&5 - echo $ECHO_N "checking for Tcl library by myself... $ECHO_C" >&6 - tcllib=`echo $tclinc | sed s/include/lib/g` -+ tcllib="$tcllib `echo $tclinc | sed s/include/lib64/g`" - for ext in .so .a ; do - for ver in "" $tclver ; do - for try in $tcllib ; do -*** ../vim-7.1.178/src/version.c Tue Jan 1 15:42:45 2008 ---- src/version.c Tue Jan 1 16:24:07 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 179, - /**/ - --- -Just think of all the things we haven't thought of yet. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.180 b/7.1.180 deleted file mode 100644 index db8ef5dd..00000000 --- a/7.1.180 +++ /dev/null @@ -1,266 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.180 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.180 -Problem: Regexp patterns not tested sufficiently. -Solution: Add more checks to the regexp test. -Files: src/testdir/test64.in, src/testdir/test64.ok - - -*** ../vim-7.1.179/src/testdir/test64.in Tue Sep 25 17:54:41 2007 ---- src/testdir/test64.in Mon Dec 31 14:20:23 2007 -*************** -*** 14,23 **** ---- 14,136 ---- - :" etc. - :" When there is no match use only the first two items. - :let tl = [] -+ :call add(tl, ['ab', 'aab', 'ab']) - :call add(tl, ['b', 'abcdef', 'b']) - :call add(tl, ['bc*', 'abccccdef', 'bcccc']) - :call add(tl, ['bc\{-}', 'abccccdef', 'b']) - :call add(tl, ['bc\{-}\(d\)', 'abccccdef', 'bccccd', 'd']) -+ :call add(tl, ['bc*', 'abbdef', 'b']) -+ :call add(tl, ['c*', 'ccc', 'ccc']) -+ :call add(tl, ['bc*', 'abdef', 'b']) -+ :call add(tl, ['c*', 'abdef', '']) -+ :call add(tl, ['bc\+', 'abccccdef', 'bcccc']) -+ :call add(tl, ['bc\+', 'abdef']) "no match -+ :" -+ :"operator \| -+ :call add(tl, ['a\|ab', 'cabd', 'a']) "alternation is ordered -+ :" -+ :call add(tl, ['c\?', 'ccb', 'c']) -+ :call add(tl, ['bc\?', 'abd', 'b']) -+ :call add(tl, ['bc\?', 'abccd', 'bc']) -+ :" -+ :call add(tl, ['\va{1}', 'ab', 'a']) -+ :" -+ :call add(tl, ['\va{2}', 'aa', 'aa']) -+ :call add(tl, ['\va{2}', 'caad', 'aa']) -+ :call add(tl, ['\va{2}', 'aba']) -+ :call add(tl, ['\va{2}', 'ab']) -+ :call add(tl, ['\va{2}', 'abaa', 'aa']) -+ :call add(tl, ['\va{2}', 'aaa', 'aa']) -+ :" -+ :call add(tl, ['\vb{1}', 'abca', 'b']) -+ :call add(tl, ['\vba{2}', 'abaa', 'baa']) -+ :call add(tl, ['\vba{3}', 'aabaac']) -+ :" -+ :call add(tl, ['\v(ab){1}', 'ab', 'ab', 'ab']) -+ :call add(tl, ['\v(ab){1}', 'dabc', 'ab', 'ab']) -+ :call add(tl, ['\v(ab){1}', 'acb']) -+ :" -+ :call add(tl, ['\v(ab){0,2}', 'acb', "", ""]) -+ :call add(tl, ['\v(ab){0,2}', 'ab', 'ab', 'ab']) -+ :call add(tl, ['\v(ab){1,2}', 'ab', 'ab', 'ab']) -+ :call add(tl, ['\v(ab){1,2}', 'ababc', 'abab', 'ab']) -+ :call add(tl, ['\v(ab){2,4}', 'ababcab', 'abab', 'ab']) -+ :call add(tl, ['\v(ab){2,4}', 'abcababa', 'abab', 'ab']) -+ :" -+ :call add(tl, ['\v(ab){2}', 'abab', 'abab', 'ab']) -+ :call add(tl, ['\v(ab){2}', 'cdababe', 'abab', 'ab']) -+ :call add(tl, ['\v(ab){2}', 'abac']) -+ :call add(tl, ['\v(ab){2}', 'abacabab', 'abab', 'ab']) -+ :call add(tl, ['\v((ab){2}){2}', 'abababab', 'abababab', 'abab', 'ab']) -+ :call add(tl, ['\v((ab){2}){2}', 'abacabababab', 'abababab', 'abab', 'ab']) -+ :" -+ :call add(tl, ['\v(a{1}){1}', 'a', 'a', 'a']) -+ :call add(tl, ['\v(a{2}){1}', 'aa', 'aa', 'aa']) -+ :call add(tl, ['\v(a{2}){1}', 'aaac', 'aa', 'aa']) -+ :call add(tl, ['\v(a{2}){1}', 'daaac', 'aa', 'aa']) -+ :call add(tl, ['\v(a{1}){2}', 'daaac', 'aa', 'a']) -+ :call add(tl, ['\v(a{1}){2}', 'aaa', 'aa', 'a']) -+ :call add(tl, ['\v(a{2})+', 'adaac', 'aa', 'aa']) -+ :call add(tl, ['\v(a{2})+', 'aa', 'aa', 'aa']) -+ :call add(tl, ['\v(a{2}){1}', 'aa', 'aa', 'aa']) -+ :call add(tl, ['\v(a{1}){2}', 'aa', 'aa', 'a']) -+ :call add(tl, ['\v(a{1}){1}', 'a', 'a', 'a']) -+ :call add(tl, ['\v(a{2}){2}', 'aaaa', 'aaaa', 'aa']) -+ :call add(tl, ['\v(a{2}){2}', 'aaabaaaa', 'aaaa', 'aa']) -+ :" -+ :call add(tl, ['\v(a+){2}', 'dadaac', 'aa', 'a']) -+ :call add(tl, ['\v(a{3}){2}', 'aaaaaaa', 'aaaaaa', 'aaa']) -+ :" -+ :call add(tl, ['\v(a{1,2}){2}', 'daaac', 'aaa', 'a']) -+ :call add(tl, ['\v(a{1,3}){2}', 'daaaac', 'aaaa', 'a']) -+ :call add(tl, ['\v(a{1,3}){2}', 'daaaaac', 'aaaaa', 'aa']) -+ :call add(tl, ['\v(a{1,3}){3}', 'daac']) -+ :call add(tl, ['\v(a{1,2}){2}', 'dac']) -+ :call add(tl, ['\v(a+)+', 'daac', 'aa', 'aa']) -+ :call add(tl, ['\v(a+)+', 'aaa', 'aaa', 'aaa']) -+ :call add(tl, ['\v(a+){1,2}', 'aaa', 'aaa', 'aaa']) -+ :call add(tl, ['\v(a+)(a+)', 'aaa', 'aaa', 'aa', 'a']) -+ :call add(tl, ['\v(a{3})+', 'daaaac', 'aaa', 'aaa']) -+ :call add(tl, ['\v(a|b|c)+', 'aacb', 'aacb', 'b']) -+ :call add(tl, ['\v(a|b|c){2}', 'abcb', 'ab', 'b']) -+ :call add(tl, ['\v(abc){2}', 'abcabd', ]) -+ :call add(tl, ['\v(abc){2}', 'abdabcabc','abcabc', 'abc']) -+ :" -+ :call add(tl, ['a*', 'cc', '']) -+ :call add(tl, ['\v(a*)+', 'cc', '']) -+ :call add(tl, ['\v((ab)+)+', 'ab', 'ab', 'ab', 'ab']) -+ :call add(tl, ['\v(((ab)+)+)+', 'ab', 'ab', 'ab', 'ab', 'ab']) -+ :call add(tl, ['\v(((ab)+)+)+', 'dababc', 'abab', 'abab', 'abab', 'ab']) -+ :call add(tl, ['\v(a{0,2})+', 'cc', '']) -+ :call add(tl, ['\v(a*)+', '', '']) -+ :call add(tl, ['\v((a*)+)+', '', '']) -+ :call add(tl, ['\v((ab)*)+', '', '']) -+ :call add(tl, ['\va{1,3}', 'aab', 'aa']) -+ :call add(tl, ['\va{2,3}', 'abaa', 'aa']) -+ :" -+ :call add(tl, ['\v((ab)+|c*)+', 'abcccaba', 'abcccab', '', 'ab']) -+ :call add(tl, ['\v(a{2})|(b{3})', 'bbabbbb', 'bbb', '', 'bbb']) -+ :call add(tl, ['\va{2}|b{2}', 'abab']) -+ :call add(tl, ['\v(a)+|(c)+', 'bbacbaacbbb', 'a', 'a']) -+ :call add(tl, ['\vab{2,3}c', 'aabbccccccccccccc', 'abbc']) -+ :call add(tl, ['\vab{2,3}c', 'aabbbccccccccccccc', 'abbbc']) -+ :call add(tl, ['\vab{2,3}cd{2,3}e', 'aabbbcddee', 'abbbcdde']) -+ :call add(tl, ['\va(bc){2}d', 'aabcbfbc' ]) -+ :call add(tl, ['\va*a{2}', 'a', ]) -+ :call add(tl, ['\va*a{2}', 'aa', 'aa' ]) -+ :call add(tl, ['\va*a{2}', 'aaa', 'aaa' ]) -+ :call add(tl, ['\va*a{2}', 'bbbabcc', ]) -+ :call add(tl, ['\va*b*|a*c*', 'a', 'a']) -+ :call add(tl, ['\va{1}b{1}|a{1}b{1}', '']) -+ :" -+ :"submatches -+ :call add(tl, ['\v(a)', 'ab', 'a', 'a']) -+ :call add(tl, ['\v(a)(b)', 'ab', 'ab', 'a', 'b']) -+ :call add(tl, ['\v(ab)(b)(c)', 'abbc', 'abbc', 'ab', 'b', 'c']) -+ :call add(tl, ['\v((a)(b))', 'ab', 'ab', 'ab', 'a', 'b']) -+ :call add(tl, ['\v(a)|(b)', 'ab', 'a', 'a']) -+ :" -+ :call add(tl, ['\v(a*)+', 'aaaa', 'aaaa', '']) - :call add(tl, ['x', 'abcdef']) - :" - :for t in tl -*** ../vim-7.1.179/src/testdir/test64.ok Tue Aug 14 17:28:14 2007 ---- src/testdir/test64.ok Mon Dec 31 14:20:26 2007 -*************** -*** 4,6 **** ---- 4,102 ---- - OK - OK - OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -+ OK -*** ../vim-7.1.179/src/version.c Tue Jan 1 16:25:33 2008 ---- src/version.c Tue Jan 1 17:34:32 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 180, - /**/ - --- -CONCORDE: Message for you, sir. - He falls forward revealing the arrow with the note. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.181 b/7.1.181 deleted file mode 100644 index 124ff2a8..00000000 --- a/7.1.181 +++ /dev/null @@ -1,62 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.181 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.181 -Problem: Accessing uninitialized memory in Farsi mode. (Dominuque Pelle) -Solution: Only invoke lrF_sub() when there is something to do. -Files: src/ex_cmds.c - - -*** ../vim-7.1.180/src/ex_cmds.c Sun Dec 9 19:37:37 2007 ---- src/ex_cmds.c Mon Dec 31 17:29:25 2007 -*************** -*** 4212,4222 **** - sub_nlines = 0; - } - -- #ifdef FEAT_FKMAP /* reverse the flow of the Farsi characters */ -- if (p_altkeymap && curwin->w_p_rl) -- lrF_sub(cmd); -- #endif -- - if (eap->cmdidx == CMD_tilde) - which_pat = RE_LAST; /* use last used regexp */ - else ---- 4212,4217 ---- -*************** -*** 4252,4257 **** ---- 4247,4256 ---- - } - else /* find the end of the regexp */ - { -+ #ifdef FEAT_FKMAP /* reverse the flow of the Farsi characters */ -+ if (p_altkeymap && curwin->w_p_rl) -+ lrF_sub(cmd); -+ #endif - which_pat = RE_LAST; /* use last used regexp */ - delimiter = *cmd++; /* remember delimiter character */ - pat = cmd; /* remember start of search pat */ -*** ../vim-7.1.180/src/version.c Tue Jan 1 17:37:01 2008 ---- src/version.c Wed Jan 2 13:57:31 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 181, - /**/ - --- -Yah, well, we had to carve our electrons out of driftwood we'd -find. In the winter. Uphill. Both ways. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.182 b/7.1.182 deleted file mode 100644 index 23ef997f..00000000 --- a/7.1.182 +++ /dev/null @@ -1,169 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.182 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.182 -Problem: When using tab pages and an argument list the session file may - contain wrong "next" commands. (Alexander Bluem) -Solution: Use "argu" commands and only when needed. -Files: src/ex_docmd.c - - -*** ../vim-7.1.181/src/ex_docmd.c Sun Dec 9 19:37:37 2007 ---- src/ex_docmd.c Mon Dec 31 18:24:16 2007 -*************** -*** 372,378 **** - static char_u *arg_all __ARGS((void)); - #ifdef FEAT_SESSION - static int makeopens __ARGS((FILE *fd, char_u *dirnow)); -! static int put_view __ARGS((FILE *fd, win_T *wp, int add_edit, unsigned *flagp)); - static void ex_loadview __ARGS((exarg_T *eap)); - static char_u *get_view_file __ARGS((int c)); - static int did_lcd; /* whether ":lcd" was produced for a session */ ---- 372,378 ---- - static char_u *arg_all __ARGS((void)); - #ifdef FEAT_SESSION - static int makeopens __ARGS((FILE *fd, char_u *dirnow)); -! static int put_view __ARGS((FILE *fd, win_T *wp, int add_edit, unsigned *flagp, int current_arg_idx)); - static void ex_loadview __ARGS((exarg_T *eap)); - static char_u *get_view_file __ARGS((int c)); - static int did_lcd; /* whether ":lcd" was produced for a session */ -*************** -*** 8762,8768 **** - } - else - { -! failed |= (put_view(fd, curwin, !using_vdir, flagp) == FAIL); - } - if (put_line(fd, "let &so = s:so_save | let &siso = s:siso_save") - == FAIL) ---- 8762,8769 ---- - } - else - { -! failed |= (put_view(fd, curwin, !using_vdir, flagp, -! -1) == FAIL); - } - if (put_line(fd, "let &so = s:so_save | let &siso = s:siso_save") - == FAIL) -*************** -*** 9761,9766 **** ---- 9762,9769 ---- - int tabnr; - win_T *tab_firstwin; - frame_T *tab_topframe; -+ int cur_arg_idx = 0; -+ int next_arg_idx; - - if (ssop_flags & SSOP_BUFFERS) - only_save_windows = FALSE; /* Save ALL buffers */ -*************** -*** 9976,9987 **** - { - if (!ses_do_win(wp)) - continue; -! if (put_view(fd, wp, wp != edited_win, &ssop_flags) == FAIL) - return FAIL; - if (nr > 1 && put_line(fd, "wincmd w") == FAIL) - return FAIL; - } - - /* - * Restore cursor to the current window if it's not the first one. - */ ---- 9979,9997 ---- - { - if (!ses_do_win(wp)) - continue; -! if (put_view(fd, wp, wp != edited_win, &ssop_flags, -! cur_arg_idx) == FAIL) - return FAIL; - if (nr > 1 && put_line(fd, "wincmd w") == FAIL) - return FAIL; -+ next_arg_idx = wp->w_arg_idx; - } - -+ /* The argument index in the first tab page is zero, need to set it in -+ * each window. For further tab pages it's the window where we do -+ * "tabedit". */ -+ cur_arg_idx = next_arg_idx; -+ - /* - * Restore cursor to the current window if it's not the first one. - */ -*************** -*** 10190,10200 **** - * Caller must make sure 'scrolloff' is zero. - */ - static int -! put_view(fd, wp, add_edit, flagp) - FILE *fd; - win_T *wp; - int add_edit; /* add ":edit" command to view */ - unsigned *flagp; /* vop_flags or ssop_flags */ - { - win_T *save_curwin; - int f; ---- 10200,10212 ---- - * Caller must make sure 'scrolloff' is zero. - */ - static int -! put_view(fd, wp, add_edit, flagp, current_arg_idx) - FILE *fd; - win_T *wp; - int add_edit; /* add ":edit" command to view */ - unsigned *flagp; /* vop_flags or ssop_flags */ -+ int current_arg_idx; /* current argument index of the window, use -+ * -1 if unknown */ - { - win_T *save_curwin; - int f; -*************** -*** 10224,10233 **** - - /* Only when part of a session: restore the argument index. Some - * arguments may have been deleted, check if the index is valid. */ -! if (wp->w_arg_idx != 0 && wp->w_arg_idx <= WARGCOUNT(wp) - && flagp == &ssop_flags) - { -! if (fprintf(fd, "%ldnext", (long)wp->w_arg_idx) < 0 - || put_eol(fd) == FAIL) - return FAIL; - did_next = TRUE; ---- 10236,10245 ---- - - /* Only when part of a session: restore the argument index. Some - * arguments may have been deleted, check if the index is valid. */ -! if (wp->w_arg_idx != current_arg_idx && wp->w_arg_idx <= WARGCOUNT(wp) - && flagp == &ssop_flags) - { -! if (fprintf(fd, "%ldargu", (long)wp->w_arg_idx + 1) < 0 - || put_eol(fd) == FAIL) - return FAIL; - did_next = TRUE; -*** ../vim-7.1.181/src/version.c Wed Jan 2 13:58:17 2008 ---- src/version.c Wed Jan 2 15:10:01 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 182, - /**/ - --- -You were lucky. We lived for three months in a brown paper bag in a -septic tank. We used to have to get up at six o'clock in the morning, -clean the bag, eat a crust of stale bread, go to work down mill for -fourteen hours a day week in-week out. When we got home, our Dad -would thrash us to sleep with his belt! - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.183 b/7.1.183 deleted file mode 100644 index 79fd6500..00000000 --- a/7.1.183 +++ /dev/null @@ -1,99 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.183 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.183 -Problem: "Internal error" for ":echo matchstr('a', 'a\%[\&]')" (Mitanu - Paul) -Solution: Inside "\%[]" detect \&, \| and \) as an error. -Files: src/regexp.c - - -*** ../vim-7.1.182/src/regexp.c Sun Dec 9 19:25:35 2007 ---- src/regexp.c Wed Jan 2 15:02:37 2008 -*************** -*** 1288,1295 **** - } - - /* -! * regbranch - one alternative of an | operator -! * - * Implements the & operator. - */ - static char_u * ---- 1288,1294 ---- - } - - /* -! * Handle one alternative of an | operator. - * Implements the & operator. - */ - static char_u * -*************** -*** 1330,1337 **** - } - - /* -! * regbranch - one alternative of an | or & operator -! * - * Implements the concatenation operator. - */ - static char_u * ---- 1329,1335 ---- - } - - /* -! * Handle one alternative of an | or & operator. - * Implements the concatenation operator. - */ - static char_u * -*************** -*** 1708,1713 **** ---- 1706,1713 ---- - case Magic('|'): - case Magic('&'): - case Magic(')'): -+ if (one_exactly) -+ EMSG_ONE_RET_NULL; - EMSG_RET_NULL(_(e_internal)); /* Supposed to be caught earlier. */ - /* NOTREACHED */ - -*************** -*** 3106,3112 **** - * slow, we keep one allocated piece of memory and only re-allocate it when - * it's too small. It's freed in vim_regexec_both() when finished. - */ -! static char_u *reg_tofree; - static unsigned reg_tofreelen; - - /* ---- 3106,3112 ---- - * slow, we keep one allocated piece of memory and only re-allocate it when - * it's too small. It's freed in vim_regexec_both() when finished. - */ -! static char_u *reg_tofree = NULL; - static unsigned reg_tofreelen; - - /* -*** ../vim-7.1.182/src/version.c Wed Jan 2 15:12:29 2008 ---- src/version.c Wed Jan 2 15:33:52 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 183, - /**/ - --- -Not too long ago, unzipping in public was illegal... - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.184 b/7.1.184 deleted file mode 100644 index 9afeff6a..00000000 --- a/7.1.184 +++ /dev/null @@ -1,63 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.184 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.184 -Problem: Crash when deleting backwards over a line break in Insert mode. -Solution: Don't advance the cursor when it's already on the NUL after a - line. (Matthew Wozniski) -Files: src/normal.c - - -*** ../vim-7.1.183/src/normal.c Sun Oct 14 17:15:45 2007 ---- src/normal.c Tue Jan 1 16:40:24 2008 -*************** -*** 5849,5860 **** - /* When the NL before the first char has to be deleted we - * put the cursor on the NUL after the previous line. - * This is a very special case, be careful! -! * don't adjust op_end now, otherwise it won't work */ - if ( (cap->oap->op_type == OP_DELETE - || cap->oap->op_type == OP_CHANGE) - && !lineempty(curwin->w_cursor.lnum)) - { -! ++curwin->w_cursor.col; - cap->retval |= CA_NO_ADJ_OP_END; - } - continue; ---- 5849,5861 ---- - /* When the NL before the first char has to be deleted we - * put the cursor on the NUL after the previous line. - * This is a very special case, be careful! -! * Don't adjust op_end now, otherwise it won't work. */ - if ( (cap->oap->op_type == OP_DELETE - || cap->oap->op_type == OP_CHANGE) - && !lineempty(curwin->w_cursor.lnum)) - { -! if (*ml_get_cursor() != NUL) -! ++curwin->w_cursor.col; - cap->retval |= CA_NO_ADJ_OP_END; - } - continue; -*** ../vim-7.1.183/src/version.c Wed Jan 2 15:34:48 2008 ---- src/version.c Wed Jan 2 16:24:19 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 184, - /**/ - --- -Not too long ago, cut and paste was done with scissors and glue... - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.185 b/7.1.185 deleted file mode 100644 index 0a1e0923..00000000 --- a/7.1.185 +++ /dev/null @@ -1,140 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.185 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.185 -Problem: Using "gR" with a multi-byte encoding and typing a CR pushes - characters onto the replace stack incorrectly, resulting in BS - putting back the wrong characters. (Paul B. Mahol) -Solution: Push multi-byte characters onto the replace stack in reverse byte - order. Add replace_push_mb(). -Files: src/edit.c, src/misc1.c, src/proto/edit.pro - - -*** ../vim-7.1.184/src/edit.c Sun Dec 9 20:25:59 2007 ---- src/edit.c Tue Jan 1 17:28:07 2008 -*************** -*** 6939,6944 **** ---- 6939,6963 ---- - ++replace_stack_nr; - } - -+ #if defined(FEAT_MBYTE) || defined(PROTO) -+ /* -+ * Push a character onto the replace stack. Handles a multi-byte character in -+ * reverse byte order, so that the first byte is popped off first. -+ * Return the number of bytes done (includes composing characters). -+ */ -+ int -+ replace_push_mb(p) -+ char_u *p; -+ { -+ int l = (*mb_ptr2len)(p); -+ int j; -+ -+ for (j = l - 1; j >= 0; --j) -+ replace_push(p[j]); -+ return l; -+ } -+ #endif -+ - #if 0 - /* - * call replace_push(c) with replace_offset set to the first NUL. -*** ../vim-7.1.184/src/misc1.c Wed Sep 26 22:35:06 2007 ---- src/misc1.c Wed Jan 2 17:48:00 2008 -*************** -*** 591,597 **** - replace_push(NUL); - p = saved_line + curwin->w_cursor.col; - while (*p != NUL) -! replace_push(*p++); - saved_line[curwin->w_cursor.col] = NUL; - } - #endif ---- 592,605 ---- - replace_push(NUL); - p = saved_line + curwin->w_cursor.col; - while (*p != NUL) -! { -! #ifdef FEAT_MBYTE -! if (has_mbyte) -! p += replace_push_mb(p); -! else -! #endif -! replace_push(*p++); -! } - saved_line[curwin->w_cursor.col] = NUL; - } - #endif -*************** -*** 1914,1920 **** - int charlen; - { - int c = buf[0]; -- int l, j; - #endif - int newlen; /* nr of bytes inserted */ - int oldlen; /* nr of bytes deleted (0 when not replacing) */ ---- 1922,1927 ---- -*************** -*** 2016,2028 **** - for (i = 0; i < oldlen; ++i) - { - #ifdef FEAT_MBYTE -! l = (*mb_ptr2len)(oldp + col + i) - 1; -! for (j = l; j >= 0; --j) -! replace_push(oldp[col + i + j]); -! i += l; -! #else -! replace_push(oldp[col + i]); - #endif - } - } - ---- 2023,2033 ---- - for (i = 0; i < oldlen; ++i) - { - #ifdef FEAT_MBYTE -! if (has_mbyte) -! i += replace_push_mb(oldp + col + i) - 1; -! else - #endif -+ replace_push(oldp[col + i]); - } - } - -*** ../vim-7.1.184/src/proto/edit.pro Sat May 5 20:21:34 2007 ---- src/proto/edit.pro Tue Jan 1 17:21:24 2008 -*************** -*** 32,37 **** ---- 32,38 ---- - char_u *get_last_insert __ARGS((void)); - char_u *get_last_insert_save __ARGS((void)); - void replace_push __ARGS((int c)); -+ int replace_push_mb __ARGS((char_u *p)); - void fixthisline __ARGS((int (*get_the_indent)(void))); - void fix_indent __ARGS((void)); - int in_cinkeys __ARGS((int keytyped, int when, int line_is_empty)); -*** ../vim-7.1.184/src/version.c Wed Jan 2 16:25:20 2008 ---- src/version.c Wed Jan 2 17:45:10 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 185, - /**/ - --- -Not too long ago, a keyboard was something to make music with... - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.186 b/7.1.186 deleted file mode 100644 index c848cbba..00000000 --- a/7.1.186 +++ /dev/null @@ -1,111 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.186 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.186 -Problem: "expand('')" returns a bogus value after changing - directory. (Dave Fishburn) -Solution: Copy "autocmd_fname" to allocated memory and expand to full - filename. Shorten the path when expanding . -Files: src/ex_docmd.c, src/fileio.c - - -*** ../vim-7.1.185/src/ex_docmd.c Wed Jan 2 15:12:29 2008 ---- src/ex_docmd.c Wed Jan 2 20:12:33 2008 -*************** -*** 7799,7804 **** ---- 7799,7805 ---- - free_cd_dir() - { - vim_free(prev_dir); -+ prev_dir = NULL; - } - #endif - -*************** -*** 9521,9526 **** ---- 9522,9528 ---- - *errormsg = (char_u *)_("E495: no autocommand file name to substitute for \"\""); - return NULL; - } -+ result = shorten_fname1(result); - break; - - case SPEC_ABUF: /* buffer number for autocommand */ -*** ../vim-7.1.185/src/fileio.c Thu Nov 8 20:47:34 2007 ---- src/fileio.c Wed Jan 2 20:21:43 2008 -*************** -*** 5556,5562 **** - #endif - - #if defined(FEAT_VIMINFO) || defined(FEAT_BROWSE) || \ -! defined(FEAT_QUICKFIX) || defined(PROTO) - /* - * Try to find a shortname by comparing the fullname with the current - * directory. ---- 5556,5562 ---- - #endif - - #if defined(FEAT_VIMINFO) || defined(FEAT_BROWSE) || \ -! defined(FEAT_QUICKFIX) || defined(FEAT_AUTOCMD) || defined(PROTO) - /* - * Try to find a shortname by comparing the fullname with the current - * directory. -*************** -*** 8546,8551 **** ---- 8546,8553 ---- - - /* - * Set the file name to be used for . -+ * Make a copy to avoid that changing a buffer name or directory makes it -+ * invalid. - */ - if (fname_io == NULL) - { -*************** -*** 8558,8563 **** ---- 8560,8567 ---- - } - else - autocmd_fname = fname_io; -+ if (autocmd_fname != NULL) -+ autocmd_fname = FullName_save(autocmd_fname, FALSE); - - /* - * Set the buffer number to be used for . -*************** -*** 8740,8745 **** ---- 8744,8750 ---- - vim_free(sourcing_name); - sourcing_name = save_sourcing_name; - sourcing_lnum = save_sourcing_lnum; -+ vim_free(autocmd_fname); - autocmd_fname = save_autocmd_fname; - autocmd_bufnr = save_autocmd_bufnr; - autocmd_match = save_autocmd_match; -*** ../vim-7.1.185/src/version.c Wed Jan 2 17:48:24 2008 ---- src/version.c Wed Jan 2 21:06:35 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 186, - /**/ - --- - LAUNCELOT leaps into SHOT with a mighty cry and runs the GUARD through and - hacks him to the floor. Blood. Swashbuckling music (perhaps). - LAUNCELOT races through into the castle screaming. -SECOND SENTRY: Hey! - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.187 b/7.1.187 deleted file mode 100644 index 421a42da..00000000 --- a/7.1.187 +++ /dev/null @@ -1,81 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.187 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.187 -Problem: Win32 GUI: Custom completion using system() no longer works - after patch 7.1.104. (Erik Falor) -Solution: Loop when safe_vgetc() returns K_IGNORE. -Files: src/ex_getln.c - - -*** ../vim-7.1.186/src/ex_getln.c Fri Dec 7 20:28:13 2007 ---- src/ex_getln.c Wed Jan 2 21:42:51 2008 -*************** -*** 335,341 **** - quit_more = FALSE; /* reset after CTRL-D which had a more-prompt */ - - cursorcmd(); /* set the cursor on the right spot */ -! c = safe_vgetc(); - if (KeyTyped) - { - some_key_typed = TRUE; ---- 335,348 ---- - quit_more = FALSE; /* reset after CTRL-D which had a more-prompt */ - - cursorcmd(); /* set the cursor on the right spot */ -! -! /* Get a character. Ignore K_IGNORE, it should not do anything, such -! * as stop completion. */ -! do -! { -! c = safe_vgetc(); -! } while (c == K_IGNORE); -! - if (KeyTyped) - { - some_key_typed = TRUE; -*************** -*** 1209,1215 **** - goto cmdline_not_changed; - - case K_IGNORE: -! goto cmdline_not_changed; /* Ignore mouse */ - - #ifdef FEAT_GUI_W32 - /* On Win32 ignore , we get it when closing the window was ---- 1216,1223 ---- - goto cmdline_not_changed; - - case K_IGNORE: -! /* Ignore mouse event or ex_window() result. */ -! goto cmdline_not_changed; - - #ifdef FEAT_GUI_W32 - /* On Win32 ignore , we get it when closing the window was -*** ../vim-7.1.186/src/version.c Wed Jan 2 21:07:32 2008 ---- src/version.c Wed Jan 2 21:53:24 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 187, - /**/ - --- -FATHER: Who are you? -PRINCE: I'm ... your son ... -FATHER: Not you. -LAUNCELOT: I'm ... er ... Sir Launcelot, sir. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.188 b/7.1.188 deleted file mode 100644 index 1af3bf2f..00000000 --- a/7.1.188 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.188 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.188 -Problem: When 'showmode' is off the message for changing a readonly file is - given in the second column instead of the first. (Payl B. Mahol) -Solution: Put the W10 message in the first column. -Files: src/edit.c - - -*** ../vim-7.1.187/src/edit.c Wed Jan 2 17:48:24 2008 ---- src/edit.c Wed Jan 2 20:56:46 2008 -*************** -*** 550,556 **** - i = showmode(); - - if (!p_im && did_restart_edit == 0) -! change_warning(i + 1); - - #ifdef CURSOR_SHAPE - ui_cursor_shape(); /* may show different cursor shape */ ---- 550,556 ---- - i = showmode(); - - if (!p_im && did_restart_edit == 0) -! change_warning(i == 0 ? 0 : i + 1); - - #ifdef CURSOR_SHAPE - ui_cursor_shape(); /* may show different cursor shape */ -*** ../vim-7.1.187/src/version.c Wed Jan 2 21:54:33 2008 ---- src/version.c Wed Jan 2 22:06:19 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 188, - /**/ - --- -PRINCE: He's come to rescue me, father. -LAUNCELOT: (embarrassed) Well, let's not jump to conclusions ... - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.189 b/7.1.189 deleted file mode 100644 index 86666158..00000000 --- a/7.1.189 +++ /dev/null @@ -1,76 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.189 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.189 (after 7.1.104) -Problem: Patch 7.1.104 was incomplete. -Solution: Also call plain_vgetc() in ask_yesno(). -Files: src/misc1.c - - -*** ../vim-7.1.188/src/misc1.c Wed Jan 2 17:48:24 2008 ---- src/misc1.c Wed Jan 2 17:48:00 2008 -*************** -*** 222,231 **** - *s++ = *p++; - orig_char_len--; - } - /* Skip over any additional white space (useful when newindent is less - * than old) */ - while (vim_iswhite(*p)) -! (void)*p++; - - } - else ---- 222,232 ---- - *s++ = *p++; - orig_char_len--; - } -+ - /* Skip over any additional white space (useful when newindent is less - * than old) */ - while (vim_iswhite(*p)) -! ++p; - - } - else -*************** -*** 3024,3030 **** - if (direct) - r = get_keystroke(); - else -! r = safe_vgetc(); - if (r == Ctrl_C || r == ESC) - r = 'n'; - msg_putchar(r); /* show what you typed */ ---- 3025,3031 ---- - if (direct) - r = get_keystroke(); - else -! r = plain_vgetc(); - if (r == Ctrl_C || r == ESC) - r = 'n'; - msg_putchar(r); /* show what you typed */ -*** ../vim-7.1.188/src/version.c Wed Jan 2 22:08:43 2008 ---- src/version.c Thu Jan 3 12:40:31 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 189, - /**/ - --- -Q: How does a UNIX Guru do Sex ? -A: unzip;strip;touch;finger;mount;fsck;more;yes;umount;sleep - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.190 b/7.1.190 deleted file mode 100644 index 6cf181c4..00000000 --- a/7.1.190 +++ /dev/null @@ -1,55 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.190 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.190 -Problem: Cursor after end-of-line: "iA sentence.)" -Solution: Move cursor back and make motion inclusive. -Files: src/normal.c - - -*** ../vim-7.1.189/src/normal.c Wed Jan 2 16:25:20 2008 ---- src/normal.c Wed Jan 2 22:04:38 2008 -*************** -*** 6564,6569 **** ---- 6564,6575 ---- - clearopbeep(cap->oap); - else - { -+ /* Don't leave the cursor on the NUL past a line */ -+ if (curwin->w_cursor.col > 0 && gchar_cursor() == NUL) -+ { -+ --curwin->w_cursor.col; -+ cap->oap->inclusive = TRUE; -+ } - #ifdef FEAT_VIRTUALEDIT - curwin->w_cursor.coladd = 0; - #endif -*** ../vim-7.1.189/src/version.c Thu Jan 3 12:42:39 2008 ---- src/version.c Thu Jan 3 13:19:03 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 190, - /**/ - --- - [clop clop] -GUARD #1: Halt! Who goes there? -ARTHUR: It is I, Arthur, son of Uther Pendragon, from the castle of - Camelot. King of the Britons, defeator of the Saxons, sovereign of - all England! -GUARD #1: Pull the other one! - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.191 b/7.1.191 deleted file mode 100644 index 4cbc35c3..00000000 --- a/7.1.191 +++ /dev/null @@ -1,61 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.191 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.191 -Problem: Win32 GUI: after patch 7.1.168 there is still a problem when - clicking in a scrollbar. (Juergen Jottkaerr) -Solution: Don't check the input buffer when dragging the scrollbar. -Files: src/gui.c - - -*** ../vim-7.1.190/src/gui.c Tue Nov 6 22:26:39 2007 ---- src/gui.c Thu Jan 3 13:16:29 2008 -*************** -*** 3734,3741 **** - sb->value = value; - - #ifdef USE_ON_FLY_SCROLL -! /* When not allowed to do the scrolling right now, return. */ -! if (dont_scroll || input_available()) - return; - #endif - #ifdef FEAT_INS_EXPAND ---- 3734,3743 ---- - sb->value = value; - - #ifdef USE_ON_FLY_SCROLL -! /* When not allowed to do the scrolling right now, return. -! * This also checked input_available(), but that causes the first click in -! * a scrollbar to be ignored when Vim doesn't have focus. */ -! if (dont_scroll) - return; - #endif - #ifdef FEAT_INS_EXPAND -*** ../vim-7.1.190/src/version.c Thu Jan 3 13:19:50 2008 ---- src/version.c Thu Jan 3 16:13:23 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 191, - /**/ - --- -GUARD #1: What -- a swallow carrying a coconut? -ARTHUR: It could grip it by the husk! -GUARD #1: It's not a question of where he grips it! It's a simple question - of weight ratios! A five ounce bird could not carry a 1 pound - coconut. - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.192 b/7.1.192 deleted file mode 100644 index 4dd16382..00000000 --- a/7.1.192 +++ /dev/null @@ -1,79 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.192 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.192 -Problem: With Visual block selection, "s" and typing something, CTRL-C - doesn't stop Vim from repeating the replacement in other lines, - like happens for "I". -Solution: Check for "got_int" to be set. -Files: src/ops.c - - -*** ../vim-7.1.191/src/ops.c Sat Dec 1 21:12:23 2007 ---- src/ops.c Thu Jan 3 16:26:37 2008 -*************** -*** 2468,2476 **** - - edit(NUL, FALSE, (linenr_T)count1); - -! /* if user has moved off this line, we don't know what to do, so do -! * nothing */ -! if (curwin->w_cursor.lnum != oap->start.lnum) - return; - - if (oap->block_mode) ---- 2468,2477 ---- - - edit(NUL, FALSE, (linenr_T)count1); - -! /* If user has moved off this line, we don't know what to do, so do -! * nothing. -! * Also don't repeat the insert when Insert mode ended with CTRL-C. */ -! if (curwin->w_cursor.lnum != oap->start.lnum || got_int) - return; - - if (oap->block_mode) -*************** -*** 2601,2608 **** - /* - * In Visual block mode, handle copying the new text to all lines of the - * block. - */ -! if (oap->block_mode && oap->start.lnum != oap->end.lnum) - { - /* Auto-indenting may have changed the indent. If the cursor was past - * the indent, exclude that indent change from the inserted text. */ ---- 2602,2610 ---- - /* - * In Visual block mode, handle copying the new text to all lines of the - * block. -+ * Don't repeat the insert when Insert mode ended with CTRL-C. - */ -! if (oap->block_mode && oap->start.lnum != oap->end.lnum && !got_int) - { - /* Auto-indenting may have changed the indent. If the cursor was past - * the indent, exclude that indent change from the inserted text. */ -*** ../vim-7.1.191/src/version.c Thu Jan 3 16:14:25 2008 ---- src/version.c Thu Jan 3 16:30:07 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 192, - /**/ - --- -"A mouse can be just as dangerous as a bullet or a bomb." - (US Representative Lamar Smith, R-Texas) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.193 b/7.1.193 deleted file mode 100644 index b3836f73..00000000 --- a/7.1.193 +++ /dev/null @@ -1,100 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.193 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.193 -Problem: Some Vim 5.x digraphs are missing in Vim 7, even though the - character pairs are not used. (Philippe de Muyter) -Solution: Add those Vim 5.x digraphs that don't conflict with others. -Files: src/digraph.c - - -*** ../vim-7.1.192/src/digraph.c Thu Sep 13 18:25:08 2007 ---- src/digraph.c Thu Jan 3 17:48:47 2008 -*************** -*** 1978,1983 **** ---- 1978,2038 ---- - {'f', 't', 0xfb05}, - {'s', 't', 0xfb06}, - # endif /* FEAT_MBYTE */ -+ -+ /* Vim 5.x compatible digraphs that don't conflict with the above */ -+ {'~', '!', 161}, /* ¡ */ -+ {'c', '|', 162}, /* ¢ */ -+ {'$', '$', 163}, /* £ */ -+ {'o', 'x', 164}, /* ¤ - currency symbol in ISO 8859-1 */ -+ {'Y', '-', 165}, /* ¥ */ -+ {'|', '|', 166}, /* ¦ */ -+ {'c', 'O', 169}, /* © */ -+ {'-', ',', 172}, /* ¬ */ -+ {'-', '=', 175}, /* ¯ */ -+ {'~', 'o', 176}, /* ° */ -+ {'2', '2', 178}, /* ² */ -+ {'3', '3', 179}, /* ³ */ -+ {'p', 'p', 182}, /* ¶ */ -+ {'~', '.', 183}, /* · */ -+ {'1', '1', 185}, /* ¹ */ -+ {'~', '?', 191}, /* ¿ */ -+ {'A', '`', 192}, /* À */ -+ {'A', '^', 194}, /*  */ -+ {'A', '~', 195}, /* à */ -+ {'A', '"', 196}, /* Ä */ -+ {'A', '@', 197}, /* Å */ -+ {'E', '`', 200}, /* È */ -+ {'E', '^', 202}, /* Ê */ -+ {'E', '"', 203}, /* Ë */ -+ {'I', '`', 204}, /* Ì */ -+ {'I', '^', 206}, /* Î */ -+ {'I', '"', 207}, /* Ï */ -+ {'N', '~', 209}, /* Ñ */ -+ {'O', '`', 210}, /* Ò */ -+ {'O', '^', 212}, /* Ô */ -+ {'O', '~', 213}, /* Õ */ -+ {'/', '\\', 215}, /* × - multiplication symbol in ISO 8859-1 */ -+ {'U', '`', 217}, /* Ù */ -+ {'U', '^', 219}, /* Û */ -+ {'I', 'p', 222}, /* Þ */ -+ {'a', '`', 224}, /* à */ -+ {'a', '^', 226}, /* â */ -+ {'a', '~', 227}, /* ã */ -+ {'a', '"', 228}, /* ä */ -+ {'a', '@', 229}, /* å */ -+ {'e', '`', 232}, /* è */ -+ {'e', '^', 234}, /* ê */ -+ {'e', '"', 235}, /* ë */ -+ {'i', '`', 236}, /* ì */ -+ {'i', '^', 238}, /* î */ -+ {'n', '~', 241}, /* ñ */ -+ {'o', '`', 242}, /* ò */ -+ {'o', '^', 244}, /* ô */ -+ {'o', '~', 245}, /* õ */ -+ {'u', '`', 249}, /* ù */ -+ {'u', '^', 251}, /* û */ -+ {'y', '"', 255}, /* x XX */ -+ - {NUL, NUL, NUL} - }; - -*** ../vim-7.1.192/src/version.c Thu Jan 3 16:31:17 2008 ---- src/version.c Thu Jan 3 17:52:51 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 193, - /**/ - --- -Futility Factor: No experiment is ever a complete failure - it can always -serve as a negative example. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.194 b/7.1.194 deleted file mode 100644 index b05ca9ed..00000000 --- a/7.1.194 +++ /dev/null @@ -1,55 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.194 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.194 -Problem: ":echo glob('~/{}')" results in /home/user//. -Solution: Don't add a slash if there already is one. -Files: src/os_unix.c - - -*** ../vim-7.1.193/src/os_unix.c Sat Dec 1 17:18:45 2007 ---- src/os_unix.c Thu Jan 3 18:52:22 2008 -*************** -*** 5482,5488 **** - { - STRCPY(p, (*file)[i]); - if (dir) -! STRCAT(p, "/"); /* add '/' to a directory name */ - (*file)[j++] = p; - } - } ---- 5482,5488 ---- - { - STRCPY(p, (*file)[i]); - if (dir) -! add_pathsep(p); /* add '/' to a directory name */ - (*file)[j++] = p; - } - } -*** ../vim-7.1.193/src/version.c Thu Jan 3 17:53:41 2008 ---- src/version.c Thu Jan 3 18:54:41 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 194, - /**/ - --- -ARTHUR: Will you ask your master if he wants to join my court at Camelot?! -GUARD #1: But then of course African swallows are not migratory. -GUARD #2: Oh, yeah... -GUARD #1: So they couldn't bring a coconut back anyway... - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.195 b/7.1.195 deleted file mode 100644 index 37e3264f..00000000 --- a/7.1.195 +++ /dev/null @@ -1,75 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.195 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.195 -Problem: '0 mark doesn't work for "~/foo ~ foo". -Solution: Don't expand the whole file name, only "~/". -Files: src/mark.c - - -*** ../vim-7.1.194/src/mark.c Thu May 10 18:48:03 2007 ---- src/mark.c Thu Jan 3 20:17:29 2008 -*************** -*** 505,513 **** - { - /* - * First expand "~/" in the file name to the home directory. -! * Try to shorten the file name. - */ -! expand_env(fm->fname, NameBuff, MAXPATHL); - mch_dirname(IObuff, IOSIZE); - p = shorten_fname(NameBuff, IObuff); - ---- 505,528 ---- - { - /* - * First expand "~/" in the file name to the home directory. -! * Don't expand the whole name, it may contain other '~' chars. - */ -! if (fm->fname[0] == '~' && (fm->fname[1] == '/' -! #ifdef BACKSLASH_IN_FILENAME -! || fm->fname[1] == '\\' -! #endif -! )) -! { -! int len; -! -! expand_env((char_u *)"~/", NameBuff, MAXPATHL); -! len = STRLEN(NameBuff); -! vim_strncpy(NameBuff + len, fm->fname + 2, MAXPATHL - len - 1); -! } -! else -! vim_strncpy(NameBuff, fm->fname, MAXPATHL - 1); -! -! /* Try to shorten the file name. */ - mch_dirname(IObuff, IOSIZE); - p = shorten_fname(NameBuff, IObuff); - -*** ../vim-7.1.194/src/version.c Thu Jan 3 18:55:21 2008 ---- src/version.c Thu Jan 3 20:10:16 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 195, - /**/ - --- -GUARD #2: Wait a minute -- supposing two swallows carried it together? -GUARD #1: No, they'd have to have it on a line. -GUARD #2: Well, simple! They'd just use a standard creeper! -GUARD #1: What, held under the dorsal guiding feathers? -GUARD #2: Well, why not? - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.196 b/7.1.196 deleted file mode 100644 index 087577a7..00000000 --- a/7.1.196 +++ /dev/null @@ -1,90 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.196 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.196 (extra) -Problem: Win32 GUI: "\n" in a tooltip doesn't cause a line break. (Erik - Falor) -Solution: Use the TTM_SETMAXTIPWIDTH message. -Files: src/gui_w32.c - - -*** ../vim-7.1.195/src/gui_w32.c Thu Aug 30 12:24:21 2007 ---- src/gui_w32.c Thu Jan 3 13:56:26 2008 -*************** -*** 987,992 **** ---- 987,997 ---- - { - LPNMTTDISPINFOW lpdi = (LPNMTTDISPINFOW)lParam; - -+ /* Set the maximum width, this also enables using -+ * \n for line break. */ -+ SendMessage(lpdi->hdr.hwndFrom, TTM_SETMAXTIPWIDTH, -+ 0, 500); -+ - tt_text = enc_to_ucs2(str, NULL); - lpdi->lpszText = tt_text; - /* can't show tooltip if failed */ -*************** -*** 996,1001 **** ---- 1001,1011 ---- - { - LPNMTTDISPINFO lpdi = (LPNMTTDISPINFO)lParam; - -+ /* Set the maximum width, this also enables using -+ * \n for line break. */ -+ SendMessage(lpdi->hdr.hwndFrom, TTM_SETMAXTIPWIDTH, -+ 0, 500); -+ - if (STRLEN(str) < sizeof(lpdi->szText) - || ((tt_text = vim_strsave(str)) == NULL)) - vim_strncpy(lpdi->szText, str, -*************** -*** 4734,4745 **** - cur_beval->showState = ShS_NEUTRAL; - break; - case TTN_GETDISPINFO: -! { -! /* if you get there then we have new common controls */ -! NMTTDISPINFO_NEW *info = (NMTTDISPINFO_NEW *)pnmh; -! info->lpszText = (LPSTR)info->lParam; -! info->uFlags |= TTF_DI_SETITEM; -! } - break; - } - } ---- 4744,4755 ---- - cur_beval->showState = ShS_NEUTRAL; - break; - case TTN_GETDISPINFO: -! { -! /* if you get there then we have new common controls */ -! NMTTDISPINFO_NEW *info = (NMTTDISPINFO_NEW *)pnmh; -! info->lpszText = (LPSTR)info->lParam; -! info->uFlags |= TTF_DI_SETITEM; -! } - break; - } - } -*** ../vim-7.1.195/src/version.c Thu Jan 3 20:21:34 2008 ---- src/version.c Thu Jan 3 20:43:22 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 196, - /**/ - --- -Shit makes the flowers grow and that's beautiful - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.197 b/7.1.197 deleted file mode 100644 index e9b58c23..00000000 --- a/7.1.197 +++ /dev/null @@ -1,62 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.197 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.197 -Problem: Mac: "make install" doesn't work when prefix defined. -Solution: Pass different arguments to "make installruntime". (Jjgod Jiang) -Files: src/Makefile - - -*** ../vim-7.1.196/src/Makefile Thu Jan 3 20:44:40 2008 ---- src/Makefile Thu Jan 3 18:30:02 2008 -*************** -*** 2559,2566 **** - # -mkdir $(DESTDIR)$(prefix)/$(APPDIR)/bin - srcdir=`pwd`; $(MAKE) -f Makefile installruntime \ - VIMEXE=$$srcdir/$(VIMTARGET) \ -! prefix=$(DESTDIR)$(prefix)/$(RESDIR)/vim \ -! VIMRTLOC=$(DESTDIR)$(prefix)/$(RESDIR)/vim/runtime - # Put the link back. - ln -s `pwd`/../runtime $(RESDIR)/vim - # Copy rgb.txt, Mac doesn't always have X11 ---- 2564,2574 ---- - # -mkdir $(DESTDIR)$(prefix)/$(APPDIR)/bin - srcdir=`pwd`; $(MAKE) -f Makefile installruntime \ - VIMEXE=$$srcdir/$(VIMTARGET) \ -! prefix=$(DESTDIR)$(prefix)/$(RESDIR)$(VIMDIR) \ -! exec_prefix=$(DESTDIR)$(prefix)/$(APPDIR)/Contents \ -! BINDIR=$(DESTDIR)$(prefix)/$(APPDIR)/Contents/MacOS \ -! VIMLOC=$(DESTDIR)$(prefix)/$(RESDIR)$(VIMDIR) \ -! VIMRTLOC=$(DESTDIR)$(prefix)/$(RESDIR)$(VIMDIR)/runtime - # Put the link back. - ln -s `pwd`/../runtime $(RESDIR)/vim - # Copy rgb.txt, Mac doesn't always have X11 -*** ../vim-7.1.196/src/version.c Thu Jan 3 20:44:35 2008 ---- src/version.c Fri Jan 4 11:52:46 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 197, - /**/ - --- -CUSTOMER: Well, can you hang around a couple of minutes? He won't be - long. -MORTICIAN: Naaah, I got to go on to Robinson's -- they've lost nine today. -CUSTOMER: Well, when is your next round? -MORTICIAN: Thursday. -DEAD PERSON: I think I'll go for a walk. - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.198 b/7.1.198 deleted file mode 100644 index d5c6f14d..00000000 --- a/7.1.198 +++ /dev/null @@ -1,51 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.198 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.198 -Problem: Hang when using ":s/\n//gn". (Burak Gorkemli) -Solution: Set "skip_match". -Files: src/ex_cmds.c - - -*** ../vim-7.1.197/src/ex_cmds.c Wed Jan 2 13:58:17 2008 ---- src/ex_cmds.c Fri Jan 4 14:46:34 2008 -*************** -*** 4575,4580 **** ---- 4575,4581 ---- - { - matchcol = (colnr_T)STRLEN(sub_firstline); - nmatch = 1; -+ skip_match = TRUE; - } - sub_nsubs++; - did_sub = TRUE; -*** ../vim-7.1.197/src/version.c Fri Jan 4 11:54:11 2008 ---- src/version.c Fri Jan 4 14:52:09 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 198, - /**/ - --- - [clop clop] -ARTHUR: Old woman! -DENNIS: Man! -ARTHUR: Man, sorry. What knight lives in that castle over there? -DENNIS: I'm thirty seven. -ARTHUR: What? -DENNIS: I'm thirty seven -- I'm not old! - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.199 b/7.1.199 deleted file mode 100644 index 18d731e6..00000000 --- a/7.1.199 +++ /dev/null @@ -1,105 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.199 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.199 -Problem: Can't do command line completion for a specific file name - extension. -Solution: When the pattern ends in "$" don't add a star for completion and - remove the "$" before matching with file names. -Files: runtime/doc/cmdline.txt, src/ex_getln.c - - -*** ../vim-7.1.198/runtime/doc/cmdline.txt Sat May 12 15:38:39 2007 ---- runtime/doc/cmdline.txt Fri Jan 4 15:13:06 2008 -*************** -*** 1,4 **** -! *cmdline.txt* For Vim version 7.1. Last change: 2006 Jul 18 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *cmdline.txt* For Vim version 7.1. Last change: 2008 Jan 04 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 316,322 **** - command-line is shown. (Note: the shifted arrow keys do not work on all - terminals) - -! *his* *:history* - :his[tory] Print the history of last entered commands. - {not in Vi} - {not available when compiled without the |+cmdline_hist| ---- 316,322 ---- - command-line is shown. (Note: the shifted arrow keys do not work on all - terminals) - -! *:his* *:history* - :his[tory] Print the history of last entered commands. - {not in Vi} - {not available when compiled without the |+cmdline_hist| -*************** -*** 447,452 **** ---- 447,457 ---- - - To completely ignore files with some extension use 'wildignore'. - -+ To match only files that end at the end of the typed text append a "$". For -+ example, to match only files that end in ".c": > -+ :e *.c$ -+ This will not match a file ending in ".cpp". Without the "$" it does match. -+ - The old value of an option can be obtained by hitting 'wildchar' just after - the '='. For example, typing 'wildchar' after ":set dir=" will insert the - current value of 'dir'. This overrules file name completion for the options -*** ../vim-7.1.198/src/ex_getln.c Wed Jan 2 21:54:33 2008 ---- src/ex_getln.c Fri Jan 4 15:05:31 2008 -*************** -*** 4078,4083 **** ---- 4078,4084 ---- - * ~ would be at the start of the file name, but not the tail. - * $ could be anywhere in the tail. - * ` could be anywhere in the file name. -+ * When the name ends in '$' don't add a star, remove the '$'. - */ - tail = gettail(retval); - if ((*retval != '~' || tail != retval) -*************** -*** 4085,4090 **** ---- 4086,4093 ---- - && vim_strchr(tail, '$') == NULL - && vim_strchr(retval, '`') == NULL) - retval[len++] = '*'; -+ else if (len > 0 && retval[len - 1] == '$') -+ --len; - retval[len] = NUL; - } - } -*** ../vim-7.1.198/src/version.c Fri Jan 4 14:52:14 2008 ---- src/version.c Fri Jan 4 15:14:29 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 199, - /**/ - --- -ARTHUR: Well, I can't just call you `Man'. -DENNIS: Well, you could say `Dennis'. -ARTHUR: Well, I didn't know you were called `Dennis.' -DENNIS: Well, you didn't bother to find out, did you? - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.200 b/7.1.200 deleted file mode 100644 index 8a0a1261..00000000 --- a/7.1.200 +++ /dev/null @@ -1,74 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.200 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.200 (after 7.1.177 and 7.1.182) -Problem: Compiler warnings for uninitialized variables. -Solution: Init variables. -Files: src/ex_cmds2.c, src/ex_docmd.c - - -*** ../vim-7.1.199/src/ex_cmds2.c Tue Jan 1 14:16:42 2008 ---- src/ex_cmds2.c Fri Jan 4 15:55:54 2008 -*************** -*** 94,100 **** - int save_redir_off = redir_off; - tasave_T typeaheadbuf; - int typeahead_saved = FALSE; -! int save_ignore_script; - # ifdef FEAT_EX_EXTRA - int save_ex_normal_busy; - # endif ---- 94,100 ---- - int save_redir_off = redir_off; - tasave_T typeaheadbuf; - int typeahead_saved = FALSE; -! int save_ignore_script = 0; - # ifdef FEAT_EX_EXTRA - int save_ex_normal_busy; - # endif -*** ../vim-7.1.199/src/ex_docmd.c Wed Jan 2 21:07:32 2008 ---- src/ex_docmd.c Fri Jan 4 15:57:28 2008 -*************** -*** 9765,9771 **** - win_T *tab_firstwin; - frame_T *tab_topframe; - int cur_arg_idx = 0; -! int next_arg_idx; - - if (ssop_flags & SSOP_BUFFERS) - only_save_windows = FALSE; /* Save ALL buffers */ ---- 9766,9772 ---- - win_T *tab_firstwin; - frame_T *tab_topframe; - int cur_arg_idx = 0; -! int next_arg_idx = 0; - - if (ssop_flags & SSOP_BUFFERS) - only_save_windows = FALSE; /* Save ALL buffers */ -*** ../vim-7.1.199/src/version.c Fri Jan 4 15:16:57 2008 ---- src/version.c Fri Jan 4 15:59:46 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 200, - /**/ - --- -ARTHUR: I did say sorry about the `old woman,' but from the behind you - looked-- -DENNIS: What I object to is you automatically treat me like an inferior! -ARTHUR: Well, I AM king... - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.201 b/7.1.201 deleted file mode 100644 index 6742191b..00000000 --- a/7.1.201 +++ /dev/null @@ -1,87 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.201 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.201 -Problem: When reading stdin 'fenc' and 'ff are not set. -Solution: Set the options after reading stdin. (Ben Schmidt) -Files: src/fileio.c - - -*** ../vim-7.1.200/src/fileio.c Wed Jan 2 21:07:32 2008 ---- src/fileio.c Fri Jan 4 16:18:27 2008 -*************** -*** 221,231 **** - { - int fd = 0; - int newfile = (flags & READ_NEW); -- int set_options = newfile || (eap != NULL && eap->read_edit); - int check_readonly; - int filtering = (flags & READ_FILTER); - int read_stdin = (flags & READ_STDIN); - int read_buffer = (flags & READ_BUFFER); - linenr_T read_buf_lnum = 1; /* next line to read from curbuf */ - colnr_T read_buf_col = 0; /* next char to read from this line */ - char_u c; ---- 221,232 ---- - { - int fd = 0; - int newfile = (flags & READ_NEW); - int check_readonly; - int filtering = (flags & READ_FILTER); - int read_stdin = (flags & READ_STDIN); - int read_buffer = (flags & READ_BUFFER); -+ int set_options = newfile || read_buffer -+ || (eap != NULL && eap->read_edit); - linenr_T read_buf_lnum = 1; /* next line to read from curbuf */ - colnr_T read_buf_col = 0; /* next char to read from this line */ - char_u c; -*************** -*** 650,657 **** - - if (set_options) - { -! curbuf->b_p_eol = TRUE; -! curbuf->b_start_eol = TRUE; - #ifdef FEAT_MBYTE - curbuf->b_p_bomb = FALSE; - curbuf->b_start_bomb = FALSE; ---- 651,663 ---- - - if (set_options) - { -! /* Don't change 'eol' if reading from buffer as it will already be -! * correctly set when reading stdin. */ -! if (!read_buffer) -! { -! curbuf->b_p_eol = TRUE; -! curbuf->b_start_eol = TRUE; -! } - #ifdef FEAT_MBYTE - curbuf->b_p_bomb = FALSE; - curbuf->b_start_bomb = FALSE; -*** ../vim-7.1.200/src/version.c Fri Jan 4 16:00:10 2008 ---- src/version.c Fri Jan 4 16:27:01 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 201, - /**/ - --- -A mathematician is a device for turning coffee into theorems. - Paul Erdos -A computer programmer is a device for turning coffee into bugs. - Bram Moolenaar - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.202 b/7.1.202 deleted file mode 100644 index 5e7006de..00000000 --- a/7.1.202 +++ /dev/null @@ -1,83 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.202 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.202 -Problem: Incomplete utf-8 byte sequence is not checked for validity. -Solution: Check the bytes that are present for being valid. (Ben Schmidt) -Files: src/mbyte.c - - -*** ../vim-7.1.201/src/mbyte.c Thu Aug 30 13:51:52 2007 ---- src/mbyte.c Fri Jan 4 17:30:16 2008 -*************** -*** 1642,1648 **** - * Get the length of UTF-8 byte sequence "p[size]". Does not include any - * following composing characters. - * Returns 1 for "". -! * Returns 1 for an illegal byte sequence. - * Returns number > "size" for an incomplete byte sequence. - */ - int ---- 1642,1648 ---- - * Get the length of UTF-8 byte sequence "p[size]". Does not include any - * following composing characters. - * Returns 1 for "". -! * Returns 1 for an illegal byte sequence (also in incomplete byte seq.). - * Returns number > "size" for an incomplete byte sequence. - */ - int -*************** -*** 1652,1664 **** - { - int len; - int i; - - if (*p == NUL) - return 1; -! len = utf8len_tab[*p]; - if (len > size) -! return len; /* incomplete byte sequence. */ -! for (i = 1; i < len; ++i) - if ((p[i] & 0xc0) != 0x80) - return 1; - return len; ---- 1652,1665 ---- - { - int len; - int i; -+ int m; - - if (*p == NUL) - return 1; -! m = len = utf8len_tab[*p]; - if (len > size) -! m = size; /* incomplete byte sequence. */ -! for (i = 1; i < m; ++i) - if ((p[i] & 0xc0) != 0x80) - return 1; - return len; -*** ../vim-7.1.201/src/version.c Fri Jan 4 16:30:40 2008 ---- src/version.c Fri Jan 4 17:45:33 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 202, - /**/ - --- -A computer programmer is a device for turning requirements into -undocumented features. It runs on cola, pizza and Dilbert cartoons. - Bram Moolenaar - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.203 b/7.1.203 deleted file mode 100644 index 92703946..00000000 --- a/7.1.203 +++ /dev/null @@ -1,68 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.203 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.203 -Problem: When 'virtualedit' is "onemore" then "99|" works but ":normal 99|" - doesn't. (Andy Wokula) -Solution: Check for "onemore" flag in check_cursor_col(). -Files: src/misc2.c - - -*** ../vim-7.1.202/src/misc2.c Sat Nov 24 21:27:33 2007 ---- src/misc2.c Fri Jan 4 21:24:46 2008 -*************** -*** 507,517 **** - curwin->w_cursor.col = 0; - else if (curwin->w_cursor.col >= len) - { -! /* Allow cursor past end-of-line in Insert mode, restarting Insert -! * mode or when in Visual mode and 'selection' isn't "old" */ - if ((State & INSERT) || restart_edit - #ifdef FEAT_VISUAL - || (VIsual_active && *p_sel != 'o') - #endif - || virtual_active()) - curwin->w_cursor.col = len; ---- 508,523 ---- - curwin->w_cursor.col = 0; - else if (curwin->w_cursor.col >= len) - { -! /* Allow cursor past end-of-line when: -! * - in Insert mode or restarting Insert mode -! * - in Visual mode and 'selection' isn't "old" -! * - 'virtualedit' is set */ - if ((State & INSERT) || restart_edit - #ifdef FEAT_VISUAL - || (VIsual_active && *p_sel != 'o') -+ #endif -+ #ifdef FEAT_VIRTUALEDIT -+ || (ve_flags & VE_ONEMORE) - #endif - || virtual_active()) - curwin->w_cursor.col = len; -*** ../vim-7.1.202/src/version.c Fri Jan 4 17:46:46 2008 ---- src/version.c Fri Jan 4 21:22:29 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 203, - /**/ - --- -`When any government, or any church for that matter, undertakes to say to - its subjects, "This you may not read, this you must not see, this you are - forbidden to know," the end result is tyranny and oppression no matter how - holy the motives' -- Robert A Heinlein, "If this goes on --" - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.204 b/7.1.204 deleted file mode 100644 index 085e88f5..00000000 --- a/7.1.204 +++ /dev/null @@ -1,74 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.204 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.204 (extra) -Problem: Win32: Using the example at 'balloonexpr' the balloon disappears - after four seconds and then comes back again. Also moves the - mouse pointer a little bit. (Yongwei Wu) -Solution: Set the autopop time to 30 seconds (the max value). (Sergey - Khorev) Move the mouse two pixels forward and one back to end up - in the same position (really!). -Files: src/gui_w32.c - - - -*** ../vim-7.1.203/src/gui_w32.c Thu Jan 3 20:44:35 2008 ---- src/gui_w32.c Sat Jan 5 13:09:56 2008 -*************** -*** 4575,4585 **** - SendMessage(beval->balloon, TTM_ADDTOOL, 0, (LPARAM)pti); - /* Make tooltip appear sooner */ - SendMessage(beval->balloon, TTM_SETDELAYTIME, TTDT_INITIAL, 10); - /* - * HACK: force tooltip to appear, because it'll not appear until - * first mouse move. D*mn M$ - */ -! mouse_event(MOUSEEVENTF_MOVE, 1, 1, 0, 0); - mouse_event(MOUSEEVENTF_MOVE, (DWORD)-1, (DWORD)-1, 0, 0); - vim_free(pti); - } ---- 4575,4589 ---- - SendMessage(beval->balloon, TTM_ADDTOOL, 0, (LPARAM)pti); - /* Make tooltip appear sooner */ - SendMessage(beval->balloon, TTM_SETDELAYTIME, TTDT_INITIAL, 10); -+ /* I've performed some tests and it seems the longest possible life time -+ * of tooltip is 30 seconds */ -+ SendMessage(beval->balloon, TTM_SETDELAYTIME, TTDT_AUTOPOP, 30000); - /* - * HACK: force tooltip to appear, because it'll not appear until - * first mouse move. D*mn M$ -+ * Amazingly moving (2, 2) and then (-1, -1) the mouse doesn't move. - */ -! mouse_event(MOUSEEVENTF_MOVE, 2, 2, 0, 0); - mouse_event(MOUSEEVENTF_MOVE, (DWORD)-1, (DWORD)-1, 0, 0); - vim_free(pti); - } -*** ../vim-7.1.203/src/version.c Fri Jan 4 21:25:01 2008 ---- src/version.c Sat Jan 5 13:12:22 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 204, - /**/ - --- -WOMAN: I didn't know we had a king. I thought we were an autonomous - collective. -DENNIS: You're fooling yourself. We're living in a dictatorship. A - self-perpetuating autocracy in which the working classes-- -WOMAN: Oh there you go, bringing class into it again. -DENNIS: That's what it's all about if only people would-- - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.205 b/7.1.205 deleted file mode 100644 index a1c15ed7..00000000 --- a/7.1.205 +++ /dev/null @@ -1,181 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.205 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.205 -Problem: Can't get the operator in an ":omap". -Solution: Add the "v:operator" variable. (Ben Schmidt) -Files: runtime/doc/eval.txt, src/eval.c, src/normal.c, src/vim.h - - -*** ../vim-7.1.204/runtime/doc/eval.txt Tue Sep 25 17:54:41 2007 ---- runtime/doc/eval.txt Fri Jan 4 20:38:55 2008 -*************** -*** 1,4 **** -! *eval.txt* For Vim version 7.1. Last change: 2007 Sep 25 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 04 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 1401,1410 **** - This is the screen column number, like with |virtcol()|. The - value is zero when there was no mouse button click. - - *v:prevcount* *prevcount-variable* - v:prevcount The count given for the last but one Normal mode command. - This is the v:count value of the previous command. Useful if -! you want to cancel Visual mode and then use the count. > - :vmap % :call MyFilter(v:prevcount) - < Read-only. - ---- 1401,1424 ---- - This is the screen column number, like with |virtcol()|. The - value is zero when there was no mouse button click. - -+ *v:operator* *operator-variable* -+ v:operator The last operator given in Normal mode. This is a single -+ character except for commands starting with or , -+ in which case it is two characters. Best used alongside -+ |v:prevcount| and |v:register|. Useful if you want to cancel -+ Operator-pending mode and then use the operator, e.g.: > -+ :omap O :call MyMotion(v:operator) -+ < The value remains set until another operator is entered, thus -+ don't expect it to be empty. -+ v:operator is not set for |:delete|, |:yank| or other Ex -+ commands. -+ Read-only. -+ - *v:prevcount* *prevcount-variable* - v:prevcount The count given for the last but one Normal mode command. - This is the v:count value of the previous command. Useful if -! you want to cancel Visual or Operator-pending mode and then -! use the count, e.g.: > - :vmap % :call MyFilter(v:prevcount) - < Read-only. - -*** ../vim-7.1.204/src/eval.c Fri Dec 7 17:08:35 2007 ---- src/eval.c Sat Jan 5 13:22:52 2008 -*************** -*** 345,350 **** ---- 345,351 ---- - {VV_NAME("mouse_win", VAR_NUMBER), 0}, - {VV_NAME("mouse_lnum", VAR_NUMBER), 0}, - {VV_NAME("mouse_col", VAR_NUMBER), 0}, -+ {VV_NAME("operator", VAR_STRING), VV_RO}, - }; - - /* shorthand */ -*** ../vim-7.1.204/src/normal.c Thu Jan 3 13:19:50 2008 ---- src/normal.c Fri Jan 4 20:53:43 2008 -*************** -*** 141,146 **** ---- 141,149 ---- - static void nv_Undo __ARGS((cmdarg_T *cap)); - static void nv_tilde __ARGS((cmdarg_T *cap)); - static void nv_operator __ARGS((cmdarg_T *cap)); -+ #ifdef FEAT_EVAL -+ static void set_op_var __ARGS((int optype)); -+ #endif - static void nv_lineop __ARGS((cmdarg_T *cap)); - static void nv_home __ARGS((cmdarg_T *cap)); - static void nv_pipe __ARGS((cmdarg_T *cap)); -*************** -*** 7180,7185 **** ---- 7183,7191 ---- - { - cap->oap->start = curwin->w_cursor; - cap->oap->op_type = OP_DELETE; -+ #ifdef FEAT_EVAL -+ set_op_var(OP_DELETE); -+ #endif - cap->count1 = 1; - nv_dollar(cap); - finish_op = TRUE; -*************** -*** 8219,8226 **** ---- 8225,8257 ---- - { - cap->oap->start = curwin->w_cursor; - cap->oap->op_type = op_type; -+ #ifdef FEAT_EVAL -+ set_op_var(op_type); -+ #endif -+ } -+ } -+ -+ #ifdef FEAT_EVAL -+ /* -+ * Set v:operator to the characters for "optype". -+ */ -+ static void -+ set_op_var(optype) -+ int optype; -+ { -+ char_u opchars[3]; -+ -+ if (optype == OP_NOP) -+ set_vim_var_string(VV_OP, NULL, 0); -+ else -+ { -+ opchars[0] = get_op_char(optype); -+ opchars[1] = get_extra_op_char(optype); -+ opchars[2] = NUL; -+ set_vim_var_string(VV_OP, opchars, -1); - } - } -+ #endif - - /* - * Handle linewise operator "dd", "yy", etc. -*** ../vim-7.1.204/src/vim.h Sat Aug 11 13:57:31 2007 ---- src/vim.h Fri Jan 4 19:11:31 2008 -*************** -*** 1688,1694 **** - #define VV_MOUSE_WIN 49 - #define VV_MOUSE_LNUM 50 - #define VV_MOUSE_COL 51 -! #define VV_LEN 52 /* number of v: vars */ - - #ifdef FEAT_CLIPBOARD - ---- 1688,1695 ---- - #define VV_MOUSE_WIN 49 - #define VV_MOUSE_LNUM 50 - #define VV_MOUSE_COL 51 -! #define VV_OP 52 -! #define VV_LEN 53 /* number of v: vars */ - - #ifdef FEAT_CLIPBOARD - -*** ../vim-7.1.204/src/version.c Sat Jan 5 13:15:08 2008 ---- src/version.c Sat Jan 5 13:31:49 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 205, - /**/ - --- -ARTHUR: Then who is your lord? -WOMAN: We don't have a lord. -ARTHUR: What? -DENNIS: I told you. We're an anarcho-syndicalist commune. We take it in - turns to act as a sort of executive officer for the week. - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.206 b/7.1.206 deleted file mode 100644 index 4531a002..00000000 --- a/7.1.206 +++ /dev/null @@ -1,59 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.206 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.206 -Problem: Compiler warnings when using MODIFIED_BY. -Solution: Add type casts. (Ben Schmidt) -Files: src/version.c - - -*** ../vim-7.1.205/src/version.c Sat Jan 5 13:34:01 2008 ---- src/version.c Sat Jan 5 13:56:55 2008 -*************** -*** 1587,1595 **** - - if (*mesg == ' ') - { -! vim_strncpy(modby, _("Modified by "), MODBY_LEN - 1); - l = STRLEN(modby); -! vim_strncpy(modby + l, MODIFIED_BY, MODBY_LEN - l - 1); - mesg = modby; - } - #endif ---- 1589,1597 ---- - - if (*mesg == ' ') - { -! vim_strncpy(modby, (char_u *)_("Modified by "), MODBY_LEN - 1); - l = STRLEN(modby); -! vim_strncpy(modby + l, (char_u *)MODIFIED_BY, MODBY_LEN - l - 1); - mesg = modby; - } - #endif -*** ../vim-7.1.205/src/version.c Sat Jan 5 13:34:01 2008 ---- src/version.c Sat Jan 5 13:56:55 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 206, - /**/ - --- -ARTHUR: I am your king! -WOMAN: Well, I didn't vote for you. -ARTHUR: You don't vote for kings. -WOMAN: Well, 'ow did you become king then? - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.207 b/7.1.207 deleted file mode 100644 index 1eba2ccf..00000000 --- a/7.1.207 +++ /dev/null @@ -1,253 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.207 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.207 -Problem: Netbeans: "remove" cannot delete one line. -Solution: Remove partial lines and whole lines properly. Avoid a memory - leak. (Xavier de Gaye) -Files: src/netbeans.c - - -*** ../vim-7.1.206/src/netbeans.c Thu May 10 18:40:48 2007 ---- src/netbeans.c Sat Jan 5 18:03:24 2008 -*************** -*** 1204,1209 **** ---- 1204,1257 ---- - return result; - } - -+ /* -+ * Remove from "first" byte to "last" byte (inclusive), at line "lnum" of the -+ * current buffer. Remove to end of line when "last" is MAXCOL. -+ */ -+ static void -+ nb_partialremove(linenr_T lnum, colnr_T first, colnr_T last) -+ { -+ char_u *oldtext, *newtext; -+ int oldlen; -+ int lastbyte = last; -+ -+ oldtext = ml_get(lnum); -+ oldlen = STRLEN(oldtext); -+ if (first >= oldlen || oldlen == 0) /* just in case */ -+ return; -+ if (lastbyte >= oldlen) -+ lastbyte = oldlen - 1; -+ newtext = alloc(oldlen - (int)(lastbyte - first)); -+ if (newtext != NULL) -+ { -+ mch_memmove(newtext, oldtext, first); -+ mch_memmove(newtext + first, oldtext + lastbyte + 1, STRLEN(oldtext + lastbyte + 1) + 1); -+ nbdebug((" NEW LINE %d: %s\n", lnum, newtext)); -+ ml_replace(lnum, newtext, FALSE); -+ } -+ } -+ -+ /* -+ * Replace the "first" line with the concatenation of the "first" and -+ * the "other" line. The "other" line is not removed. -+ */ -+ static void -+ nb_joinlines(linenr_T first, linenr_T other) -+ { -+ int len_first, len_other; -+ char_u *p; -+ -+ len_first = STRLEN(ml_get(first)); -+ len_other = STRLEN(ml_get(other)); -+ p = alloc((unsigned)(len_first + len_other + 1)); -+ if (p != NULL) -+ { -+ mch_memmove(p, ml_get(first), len_first); -+ mch_memmove(p + len_first, ml_get(other), len_other + 1); -+ ml_replace(first, p, FALSE); -+ } -+ } -+ - #define SKIP_STOP 2 - #define streq(a,b) (strcmp(a,b) == 0) - static int needupdate = 0; -*************** -*** 1371,1376 **** ---- 1419,1426 ---- - long count; - pos_T first, last; - pos_T *pos; -+ pos_T *next; -+ linenr_T del_from_lnum, del_to_lnum; /* lines to be deleted as a whole */ - int oldFire = netbeansFireChanges; - int oldSuppress = netbeansSuppressNoLines; - int wasChanged; -*************** -*** 1420,1444 **** - } - last = *pos; - nbdebug((" LAST POS: line %d, col %d\n", last.lnum, last.col)); -! curwin->w_cursor = first; - doupdate = 1; - -! /* keep part of first line */ -! if (first.lnum == last.lnum && first.col != last.col) - { -! /* deletion is within one line */ -! char_u *p = ml_get(first.lnum); -! mch_memmove(p + first.col, p + last.col + 1, STRLEN(p + last.col) + 1); -! nbdebug((" NEW LINE %d: %s\n", first.lnum, p)); -! ml_replace(first.lnum, p, TRUE); - } - -! if (first.lnum < last.lnum) - { - int i; - - /* delete signs from the lines being deleted */ -! for (i = first.lnum; i <= last.lnum; i++) - { - int id = buf_findsign_id(buf->bufp, (linenr_T)i); - if (id > 0) ---- 1470,1544 ---- - } - last = *pos; - nbdebug((" LAST POS: line %d, col %d\n", last.lnum, last.col)); -! del_from_lnum = first.lnum; -! del_to_lnum = last.lnum; - doupdate = 1; - -! /* Get the position of the first byte after the deleted -! * section. "next" is NULL when deleting to the end of the -! * file. */ -! next = off2pos(buf->bufp, off + count); -! -! /* Remove part of the first line. */ -! if (first.col != 0 || (next != NULL && first.lnum == next->lnum)) - { -! if (first.lnum != last.lnum -! || (next != NULL && first.lnum != next->lnum)) -! { -! /* remove to the end of the first line */ -! nb_partialremove(first.lnum, first.col, -! (colnr_T)MAXCOL); -! if (first.lnum == last.lnum) -! { -! /* Partial line to remove includes the end of -! * line. Join the line with the next one, have -! * the next line deleted below. */ -! nb_joinlines(first.lnum, next->lnum); -! del_to_lnum = next->lnum; -! } -! } -! else -! { -! /* remove within one line */ -! nb_partialremove(first.lnum, first.col, last.col); -! } -! ++del_from_lnum; /* don't delete the first line */ -! } -! -! /* Remove part of the last line. */ -! if (first.lnum != last.lnum && next != NULL -! && next->col != 0 && last.lnum == next->lnum) -! { -! nb_partialremove(last.lnum, 0, last.col); -! if (del_from_lnum > first.lnum) -! { -! /* Join end of last line to start of first line; last -! * line is deleted below. */ -! nb_joinlines(first.lnum, last.lnum); -! } -! else -! /* First line is deleted as a whole, keep the last -! * line. */ -! --del_to_lnum; - } - -! /* First is partial line; last line to remove includes -! * the end of line; join first line to line following last -! * line; line following last line is deleted below. */ -! if (first.lnum != last.lnum && del_from_lnum > first.lnum -! && next != NULL && last.lnum != next->lnum) -! { -! nb_joinlines(first.lnum, next->lnum); -! del_to_lnum = next->lnum; -! } -! -! /* Delete whole lines if there are any. */ -! if (del_to_lnum >= del_from_lnum) - { - int i; - - /* delete signs from the lines being deleted */ -! for (i = del_from_lnum; i <= del_to_lnum; i++) - { - int id = buf_findsign_id(buf->bufp, (linenr_T)i); - if (id > 0) -*************** -*** 1450,1459 **** - nbdebug((" No sign on line %d\n", i)); - } - -! /* delete whole lines */ -! nbdebug((" Deleting lines %d through %d\n", first.lnum, last.lnum)); -! del_lines(last.lnum - first.lnum + 1, FALSE); - } - buf->bufp->b_changed = wasChanged; /* logically unchanged */ - netbeansFireChanges = oldFire; - netbeansSuppressNoLines = oldSuppress; ---- 1550,1564 ---- - nbdebug((" No sign on line %d\n", i)); - } - -! nbdebug((" Deleting lines %d through %d\n", del_from_lnum, del_to_lnum)); -! curwin->w_cursor.lnum = del_from_lnum; -! curwin->w_cursor.col = 0; -! del_lines(del_to_lnum - del_from_lnum + 1, FALSE); - } -+ -+ /* Leave cursor at first deleted byte. */ -+ curwin->w_cursor = first; -+ check_cursor_lnum(); - buf->bufp->b_changed = wasChanged; /* logically unchanged */ - netbeansFireChanges = oldFire; - netbeansSuppressNoLines = oldSuppress; -*************** -*** 2374,2381 **** - * the current buffer as "buf". - */ - static void -! nb_set_curbuf(buf) -! buf_T *buf; - { - if (curbuf != buf && buf_jump_open_win(buf) == NULL) - set_curbuf(buf, DOBUF_GOTO); ---- 2479,2485 ---- - * the current buffer as "buf". - */ - static void -! nb_set_curbuf(buf_T *buf) - { - if (curbuf != buf && buf_jump_open_win(buf) == NULL) - set_curbuf(buf, DOBUF_GOTO); -*** ../vim-7.1.206/src/version.c Sat Jan 5 13:58:48 2008 ---- src/version.c Sat Jan 5 18:06:04 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 207, - /**/ - --- -Q: How many hardware engineers does it take to change a lightbulb? -A: None. We'll fix it in software. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.208 b/7.1.208 deleted file mode 100644 index 44f6633b..00000000 --- a/7.1.208 +++ /dev/null @@ -1,69 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.208 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.208 -Problem: On Alpha get an unaligned access error. -Solution: Store the dictitem pointer before using it. (Matthew Luckie) -Files: src/eval.c - - -*** ../vim-7.1.207/src/eval.c Sat Jan 5 13:34:01 2008 ---- src/eval.c Sat Jan 5 13:22:52 2008 -*************** -*** 3407,3412 **** ---- 3407,3413 ---- - hashtab_T *ht; - hashitem_T *hi; - char_u *varname; -+ dictitem_T *di; - - ht = find_var_ht(name, &varname); - if (ht != NULL && *varname != NUL) -*************** -*** 3414,3422 **** - hi = hash_find(ht, varname); - if (!HASHITEM_EMPTY(hi)) - { -! if (var_check_fixed(HI2DI(hi)->di_flags, name)) -! return FAIL; -! if (var_check_ro(HI2DI(hi)->di_flags, name)) - return FAIL; - delete_var(ht, hi); - return OK; ---- 3415,3423 ---- - hi = hash_find(ht, varname); - if (!HASHITEM_EMPTY(hi)) - { -! di = HI2DI(hi); -! if (var_check_fixed(di->di_flags, name) -! || var_check_ro(di->di_flags, name)) - return FAIL; - delete_var(ht, hi); - return OK; -*** ../vim-7.1.207/src/version.c Sat Jan 5 18:06:33 2008 ---- src/version.c Sat Jan 5 22:14:17 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 208, - /**/ - --- -ARTHUR: Bloody peasant! -DENNIS: Oh, what a give away. Did you here that, did you here that, eh? - That's what I'm on about -- did you see him repressing me, you saw it - didn't you? - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.209 b/7.1.209 deleted file mode 100644 index c62d2398..00000000 --- a/7.1.209 +++ /dev/null @@ -1,71 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.209 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.209 -Problem: GTK: When using the netrw plugin and doing ":gui" Vim hangs. -Solution: Stop getting a selection after three seconds. This is a hack. -Files: src/gui_gtk_x11.c - - -*** ../vim-7.1.208/src/gui_gtk_x11.c Fri Oct 19 14:32:50 2007 ---- src/gui_gtk_x11.c Sun Jan 6 15:15:52 2008 -*************** -*** 6660,6665 **** ---- 6660,6666 ---- - unsigned i; - int nbytes; - char_u *buffer; -+ time_t start; - - for (i = 0; i < N_SELECTION_TARGETS; ++i) - { -*************** -*** 6670,6676 **** - cbd->gtk_sel_atom, target, - (guint32)GDK_CURRENT_TIME); - -! while (received_selection == RS_NONE) - gtk_main(); /* wait for selection_received_cb */ - - if (received_selection != RS_FAIL) ---- 6671,6681 ---- - cbd->gtk_sel_atom, target, - (guint32)GDK_CURRENT_TIME); - -! /* Hack: Wait up to three seconds for the selection. A hang was -! * noticed here when using the netrw plugin combined with ":gui" -! * during the FocusGained event. */ -! start = time(NULL); -! while (received_selection == RS_NONE && time(NULL) < start + 3) - gtk_main(); /* wait for selection_received_cb */ - - if (received_selection != RS_FAIL) -*** ../vim-7.1.208/src/version.c Sat Jan 5 22:15:21 2008 ---- src/version.c Sun Jan 6 15:14:48 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 209, - /**/ - --- -BLACK KNIGHT: I move for no man. -ARTHUR: So be it! - [hah] [parry thrust] - [ARTHUR chops the BLACK KNIGHT's left arm off] -ARTHUR: Now stand aside, worthy adversary. -BLACK KNIGHT: 'Tis but a scratch. - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.210 b/7.1.210 deleted file mode 100644 index aa92ccdd..00000000 --- a/7.1.210 +++ /dev/null @@ -1,74 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.210 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.210 -Problem: Listing mapping for 0xdb fails when 'encoding' is utf-8. (Tony - Mechelynck) -Solution: Recognize K_SPECIAL KS_EXTRA KE_CSI as a CSI byte. -Files: src/mbyte.c - - -*** ../vim-7.1.209/src/mbyte.c Fri Jan 4 17:46:46 2008 ---- src/mbyte.c Sun Jan 6 17:13:51 2008 -*************** -*** 2863,2877 **** - buf[m++] = K_SPECIAL; - n += 2; - } - # ifdef FEAT_GUI -! else if (str[n] == CSI - && str[n + 1] == KS_EXTRA - && str[n + 2] == (int)KE_CSI) - { - buf[m++] = CSI; - n += 2; - } -- # endif - else if (str[n] == K_SPECIAL - # ifdef FEAT_GUI - || str[n] == CSI ---- 2882,2898 ---- - buf[m++] = K_SPECIAL; - n += 2; - } -+ else if ((str[n] == K_SPECIAL - # ifdef FEAT_GUI -! || str[n] == CSI -! # endif -! ) - && str[n + 1] == KS_EXTRA - && str[n + 2] == (int)KE_CSI) - { - buf[m++] = CSI; - n += 2; - } - else if (str[n] == K_SPECIAL - # ifdef FEAT_GUI - || str[n] == CSI -*** ../vim-7.1.209/src/version.c Sun Jan 6 15:16:12 2008 ---- src/version.c Sun Jan 6 17:17:25 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 210, - /**/ - --- -ARTHUR: A scratch? Your arm's off! -BLACK KNIGHT: No, it isn't. -ARTHUR: Well, what's that then? -BLACK KNIGHT: I've had worse. - The Quest for the Holy Grail (Monty Python) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.211 b/7.1.211 deleted file mode 100644 index 38e3ea1d..00000000 --- a/7.1.211 +++ /dev/null @@ -1,748 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.211 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.211 -Problem: The matchparen plugin may take an unexpected amount of time, so - that it looks like Vim hangs. -Solution: Add a timeout to searchpair(), searchpairpos(), search() and - searchpos(). Use half a second timeout in the plugin. -Files: runtime/doc/eval.txt, runtime/plugin/matchparen.vim, src/edit.c, - src/eval.c, src/ex_cmds2.c, src/ex_docmd.c, src/normal.c, - src/proto/eval.pro, src/proto/ex_cmds2.pro, src/proto/search.pro, - src/search.c - - -*** ../vim-7.1.210/runtime/doc/eval.txt Sat Jan 5 13:34:01 2008 ---- runtime/doc/eval.txt Sun Jan 6 16:27:33 2008 -*************** -*** 1,4 **** -! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 04 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 06 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 1733,1746 **** - repeat( {expr}, {count}) String repeat {expr} {count} times - resolve( {filename}) String get filename a shortcut points to - reverse( {list}) List reverse {list} in-place -! search( {pattern} [, {flags}]) Number search for {pattern} - searchdecl({name} [, {global} [, {thisblock}]]) - Number search for variable declaration -! searchpair( {start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]]) - Number search for other end of start/end pair -! searchpairpos( {start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]]) - List search for other end of start/end pair -! searchpos( {pattern} [, {flags} [, {stopline}]]) - List search for {pattern} - server2client( {clientid}, {string}) - Number send reply string ---- 1733,1747 ---- - repeat( {expr}, {count}) String repeat {expr} {count} times - resolve( {filename}) String get filename a shortcut points to - reverse( {list}) List reverse {list} in-place -! search( {pattern} [, {flags} [, {stopline} [, {timeout}]]]) -! Number search for {pattern} - searchdecl({name} [, {global} [, {thisblock}]]) - Number search for variable declaration -! searchpair( {start}, {middle}, {end} [, {flags} [, {skip} [...]]]) - Number search for other end of start/end pair -! searchpairpos( {start}, {middle}, {end} [, {flags} [, {skip} [...]]]) - List search for other end of start/end pair -! searchpos( {pattern} [, {flags} [, {stopline} [, {timeout}]]]) - List search for {pattern} - server2client( {clientid}, {string}) - Number send reply string -*************** -*** 4212,4218 **** - If you want a list to remain unmodified make a copy first: > - :let revlist = reverse(copy(mylist)) - -! search({pattern} [, {flags} [, {stopline}]]) *search()* - Search for regexp pattern {pattern}. The search starts at the - cursor position (you can use |cursor()| to set it). - ---- 4216,4222 ---- - If you want a list to remain unmodified make a copy first: > - :let revlist = reverse(copy(mylist)) - -! search({pattern} [, {flags} [, {stopline} [, {timeout}]]]) *search()* - Search for regexp pattern {pattern}. The search starts at the - cursor position (you can use |cursor()| to set it). - -*************** -*** 4240,4245 **** ---- 4244,4257 ---- - let end = search('END', '', line("w$")) - < When {stopline} is used and it is not zero this also implies - that the search does not wrap around the end of the file. -+ A zero value is equal to not giving the argument. -+ -+ When the {timeout} argument is given the search stops when -+ more than this many milli seconds have passed. Thus when -+ {timeout} is 500 the search stops after half a second. -+ The value must not be negative. A zero value is like not -+ giving the argument. -+ {only available when compiled with the +reltime feature} - - If there is no match a 0 is returned and the cursor doesn't - move. No error message is given. -*************** -*** 4302,4308 **** - endif - < - *searchpair()* -! searchpair({start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]]) - Search for the match of a nested start-end pair. This can be - used to find the "endif" that matches an "if", while other - if/endif pairs in between are ignored. ---- 4314,4321 ---- - endif - < - *searchpair()* -! searchpair({start}, {middle}, {end} [, {flags} [, {skip} -! [, {stopline} [, {timeout}]]]]) - Search for the match of a nested start-end pair. This can be - used to find the "endif" that matches an "if", while other - if/endif pairs in between are ignored. -*************** -*** 4337,4343 **** - When evaluating {skip} causes an error the search is aborted - and -1 returned. - -! For {stopline} see |search()|. - - The value of 'ignorecase' is used. 'magic' is ignored, the - patterns are used like it's on. ---- 4350,4356 ---- - When evaluating {skip} causes an error the search is aborted - and -1 returned. - -! For {stopline} and {timeout} see |search()|. - - The value of 'ignorecase' is used. 'magic' is ignored, the - patterns are used like it's on. -*************** -*** 4383,4389 **** - \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"') - < - *searchpairpos()* -! searchpairpos({start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]]) - Same as searchpair(), but returns a |List| with the line and - column position of the match. The first element of the |List| - is the line number and the second element is the byte index of ---- 4396,4403 ---- - \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"') - < - *searchpairpos()* -! searchpairpos({start}, {middle}, {end} [, {flags} [, {skip} -! [, {stopline} [, {timeout}]]]]) - Same as searchpair(), but returns a |List| with the line and - column position of the match. The first element of the |List| - is the line number and the second element is the byte index of -*************** -*** 4394,4400 **** - < - See |match-parens| for a bigger and more useful example. - -! searchpos({pattern} [, {flags} [, {stopline}]]) *searchpos()* - Same as |search()|, but returns a |List| with the line and - column position of the match. The first element of the |List| - is the line number and the second element is the byte index of ---- 4408,4414 ---- - < - See |match-parens| for a bigger and more useful example. - -! searchpos({pattern} [, {flags} [, {stopline} [, {timeout}]]]) *searchpos()* - Same as |search()|, but returns a |List| with the line and - column position of the match. The first element of the |List| - is the line number and the second element is the byte index of -*** ../vim-7.1.210/runtime/plugin/matchparen.vim Sat Aug 18 18:20:57 2007 ---- runtime/plugin/matchparen.vim Sun Jan 6 16:22:39 2008 -*************** -*** 1,6 **** - " Vim plugin for showing matching parens - " Maintainer: Bram Moolenaar -! " Last Change: 2007 Aug 8 - - " Exit quickly when: - " - this plugin was already loaded (or disabled) ---- 1,6 ---- - " Vim plugin for showing matching parens - " Maintainer: Bram Moolenaar -! " Last Change: 2008 Jan 06 - - " Exit quickly when: - " - this plugin was already loaded (or disabled) -*************** -*** 111,117 **** - \ '=~? "string\\|character\\|singlequote\\|comment"' - execute 'if' s_skip '| let s_skip = 0 | endif' - -! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline) - - if before > 0 - call winrestview(save_cursor) ---- 111,122 ---- - \ '=~? "string\\|character\\|singlequote\\|comment"' - execute 'if' s_skip '| let s_skip = 0 | endif' - -! try -! " Limit the search time to 500 msec to avoid a hang on very long lines. -! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 500) -! catch /E118/ -! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline) -! endtry - - if before > 0 - call winrestview(save_cursor) -*** ../vim-7.1.210/src/edit.c Wed Jan 2 22:08:43 2008 ---- src/edit.c Sun Jan 6 16:08:00 2008 -*************** -*** 4062,4068 **** - found_new_match = searchit(NULL, ins_buf, pos, - compl_direction, - compl_pattern, 1L, SEARCH_KEEP + SEARCH_NFMSG, -! RE_LAST, (linenr_T)0); - --msg_silent; - if (!compl_started) - { ---- 4062,4068 ---- - found_new_match = searchit(NULL, ins_buf, pos, - compl_direction, - compl_pattern, 1L, SEARCH_KEEP + SEARCH_NFMSG, -! RE_LAST, (linenr_T)0, NULL); - --msg_silent; - if (!compl_started) - { -*** ../vim-7.1.210/src/eval.c Sat Jan 5 22:15:21 2008 ---- src/eval.c Sun Jan 6 16:37:42 2008 -*************** -*** 7213,7223 **** - {"repeat", 2, 2, f_repeat}, - {"resolve", 1, 1, f_resolve}, - {"reverse", 1, 1, f_reverse}, -! {"search", 1, 3, f_search}, - {"searchdecl", 1, 3, f_searchdecl}, -! {"searchpair", 3, 6, f_searchpair}, -! {"searchpairpos", 3, 6, f_searchpairpos}, -! {"searchpos", 1, 3, f_searchpos}, - {"server2client", 2, 2, f_server2client}, - {"serverlist", 0, 0, f_serverlist}, - {"setbufvar", 3, 3, f_setbufvar}, ---- 7213,7223 ---- - {"repeat", 2, 2, f_repeat}, - {"resolve", 1, 1, f_resolve}, - {"reverse", 1, 1, f_reverse}, -! {"search", 1, 4, f_search}, - {"searchdecl", 1, 3, f_searchdecl}, -! {"searchpair", 3, 7, f_searchpair}, -! {"searchpairpos", 3, 7, f_searchpairpos}, -! {"searchpos", 1, 4, f_searchpos}, - {"server2client", 2, 2, f_server2client}, - {"serverlist", 0, 0, f_serverlist}, - {"setbufvar", 3, 3, f_setbufvar}, -*************** -*** 14020,14025 **** ---- 14020,14029 ---- - int dir; - int retval = 0; /* default: FAIL */ - long lnum_stop = 0; -+ proftime_T tm; -+ #ifdef FEAT_RELTIME -+ long time_limit = 0; -+ #endif - int options = SEARCH_KEEP; - int subpatnum; - -*************** -*** 14033,14047 **** - if (flags & SP_END) - options |= SEARCH_END; - -! /* Optional extra argument: line number to stop searching. */ -! if (argvars[1].v_type != VAR_UNKNOWN -! && argvars[2].v_type != VAR_UNKNOWN) - { - lnum_stop = get_tv_number_chk(&argvars[2], NULL); - if (lnum_stop < 0) - goto theend; - } - - /* - * This function does not accept SP_REPEAT and SP_RETCOUNT flags. - * Check to make sure only those flags are set. ---- 14037,14063 ---- - if (flags & SP_END) - options |= SEARCH_END; - -! /* Optional arguments: line number to stop searching and timeout. */ -! if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN) - { - lnum_stop = get_tv_number_chk(&argvars[2], NULL); - if (lnum_stop < 0) - goto theend; -+ #ifdef FEAT_RELTIME -+ if (argvars[3].v_type != VAR_UNKNOWN) -+ { -+ time_limit = get_tv_number_chk(&argvars[3], NULL); -+ if (time_limit < 0) -+ goto theend; -+ } -+ #endif - } - -+ #ifdef FEAT_RELTIME -+ /* Set the time limit, if there is one. */ -+ profile_setlimit(time_limit, &tm); -+ #endif -+ - /* - * This function does not accept SP_REPEAT and SP_RETCOUNT flags. - * Check to make sure only those flags are set. -*************** -*** 14057,14063 **** - - pos = save_cursor = curwin->w_cursor; - subpatnum = searchit(curwin, curbuf, &pos, dir, pat, 1L, -! options, RE_SEARCH, (linenr_T)lnum_stop); - if (subpatnum != FAIL) - { - if (flags & SP_SUBPAT) ---- 14073,14079 ---- - - pos = save_cursor = curwin->w_cursor; - subpatnum = searchit(curwin, curbuf, &pos, dir, pat, 1L, -! options, RE_SEARCH, (linenr_T)lnum_stop, &tm); - if (subpatnum != FAIL) - { - if (flags & SP_SUBPAT) -*************** -*** 14147,14152 **** ---- 14163,14169 ---- - char_u nbuf3[NUMBUFLEN]; - int retval = 0; /* default: FAIL */ - long lnum_stop = 0; -+ long time_limit = 0; - - /* Get the three pattern arguments: start, middle, end. */ - spat = get_tv_string_chk(&argvars[0]); -*************** -*** 14182,14194 **** - lnum_stop = get_tv_number_chk(&argvars[5], NULL); - if (lnum_stop < 0) - goto theend; - } - } - if (skip == NULL) - goto theend; /* type error */ - - retval = do_searchpair(spat, mpat, epat, dir, skip, flags, -! match_pos, lnum_stop); - - theend: - p_ws = save_p_ws; ---- 14199,14219 ---- - lnum_stop = get_tv_number_chk(&argvars[5], NULL); - if (lnum_stop < 0) - goto theend; -+ #ifdef FEAT_RELTIME -+ if (argvars[6].v_type != VAR_UNKNOWN) -+ { -+ time_limit = get_tv_number_chk(&argvars[6], NULL); -+ if (time_limit < 0) -+ goto theend; -+ } -+ #endif - } - } - if (skip == NULL) - goto theend; /* type error */ - - retval = do_searchpair(spat, mpat, epat, dir, skip, flags, -! match_pos, lnum_stop, time_limit); - - theend: - p_ws = save_p_ws; -*************** -*** 14240,14246 **** - * Returns 0 or -1 for no match, - */ - long -! do_searchpair(spat, mpat, epat, dir, skip, flags, match_pos, lnum_stop) - char_u *spat; /* start pattern */ - char_u *mpat; /* middle pattern */ - char_u *epat; /* end pattern */ ---- 14265,14272 ---- - * Returns 0 or -1 for no match, - */ - long -! do_searchpair(spat, mpat, epat, dir, skip, flags, match_pos, -! lnum_stop, time_limit) - char_u *spat; /* start pattern */ - char_u *mpat; /* middle pattern */ - char_u *epat; /* end pattern */ -*************** -*** 14249,14254 **** ---- 14275,14281 ---- - int flags; /* SP_SETPCMARK and other SP_ values */ - pos_T *match_pos; - linenr_T lnum_stop; /* stop at this line if not zero */ -+ long time_limit; /* stop after this many msec */ - { - char_u *save_cpo; - char_u *pat, *pat2 = NULL, *pat3 = NULL; -*************** -*** 14263,14273 **** ---- 14290,14306 ---- - int nest = 1; - int err; - int options = SEARCH_KEEP; -+ proftime_T tm; - - /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ - save_cpo = p_cpo; - p_cpo = (char_u *)""; - -+ #ifdef FEAT_RELTIME -+ /* Set the time limit, if there is one. */ -+ profile_setlimit(time_limit, &tm); -+ #endif -+ - /* Make two search patterns: start/end (pat2, for in nested pairs) and - * start/middle/end (pat3, for the top pair). */ - pat2 = alloc((unsigned)(STRLEN(spat) + STRLEN(epat) + 15)); -*************** -*** 14291,14297 **** - for (;;) - { - n = searchit(curwin, curbuf, &pos, dir, pat, 1L, -! options, RE_SEARCH, lnum_stop); - if (n == FAIL || (firstpos.lnum != 0 && equalpos(pos, firstpos))) - /* didn't find it or found the first match again: FAIL */ - break; ---- 14324,14330 ---- - for (;;) - { - n = searchit(curwin, curbuf, &pos, dir, pat, 1L, -! options, RE_SEARCH, lnum_stop, &tm); - if (n == FAIL || (firstpos.lnum != 0 && equalpos(pos, firstpos))) - /* didn't find it or found the first match again: FAIL */ - break; -*** ../vim-7.1.210/src/ex_cmds2.c Fri Jan 4 16:00:10 2008 ---- src/ex_cmds2.c Sun Jan 6 18:22:28 2008 -*************** -*** 895,913 **** - sprintf(buf, "%10.6lf", (double)tm->QuadPart / (double)fr.QuadPart); - # else - sprintf(buf, "%3ld.%06ld", (long)tm->tv_sec, (long)tm->tv_usec); -! #endif - return buf; - } - -! # endif /* FEAT_PROFILE || FEAT_RELTIME */ - -- # if defined(FEAT_PROFILE) || defined(PROTO) - /* -! * Functions for profiling. - */ -! static void script_do_profile __ARGS((scriptitem_T *si)); -! static void script_dump_profile __ARGS((FILE *fd)); -! static proftime_T prof_wait_time; - - /* - * Set the time in "tm" to zero. ---- 895,955 ---- - sprintf(buf, "%10.6lf", (double)tm->QuadPart / (double)fr.QuadPart); - # else - sprintf(buf, "%3ld.%06ld", (long)tm->tv_sec, (long)tm->tv_usec); -! # endif - return buf; - } - -! /* -! * Put the time "msec" past now in "tm". -! */ -! void -! profile_setlimit(msec, tm) -! long msec; -! proftime_T *tm; -! { -! if (msec <= 0) /* no limit */ -! profile_zero(tm); -! else -! { -! # ifdef WIN3264 -! LARGE_INTEGER fr; -! -! QueryPerformanceCounter(tm); -! QueryPerformanceFrequency(&fr); -! tm->QuadPart += (double)msec / 1000.0 * (double)fr.QuadPart; -! # else -! long usec; -! -! gettimeofday(tm, NULL); -! usec = (long)tm->tv_usec + (long)msec * 1000; -! tm->tv_usec = usec % 1000000L; -! tm->tv_sec += usec / 1000000L; -! # endif -! } -! } - - /* -! * Return TRUE if the current time is past "tm". - */ -! int -! profile_passed_limit(tm) -! proftime_T *tm; -! { -! proftime_T now; -! -! # ifdef WIN3264 -! if (tm->QuadPart == 0) /* timer was not set */ -! return FALSE; -! QueryPerformanceCounter(&now); -! return (now.QuadPart > tm->QuadPart); -! # else -! if (tm->tv_sec == 0) /* timer was not set */ -! return FALSE; -! gettimeofday(&now, NULL); -! return (now.tv_sec > tm->tv_sec -! || (now.tv_sec == tm->tv_sec && now.tv_usec > tm->tv_usec)); -! # endif -! } - - /* - * Set the time in "tm" to zero. -*************** -*** 923,928 **** ---- 965,980 ---- - tm->tv_sec = 0; - # endif - } -+ -+ # endif /* FEAT_PROFILE || FEAT_RELTIME */ -+ -+ # if defined(FEAT_PROFILE) || defined(PROTO) -+ /* -+ * Functions for profiling. -+ */ -+ static void script_do_profile __ARGS((scriptitem_T *si)); -+ static void script_dump_profile __ARGS((FILE *fd)); -+ static proftime_T prof_wait_time; - - /* - * Add the time "tm2" to "tm". -*** ../vim-7.1.210/src/ex_docmd.c Fri Jan 4 16:00:10 2008 ---- src/ex_docmd.c Sun Jan 6 16:08:29 2008 -*************** -*** 3979,3985 **** - *cmd == '?' ? BACKWARD : FORWARD, - (char_u *)"", 1L, - SEARCH_MSG + SEARCH_START, -! i, (linenr_T)0) != FAIL) - lnum = pos.lnum; - else - { ---- 3980,3986 ---- - *cmd == '?' ? BACKWARD : FORWARD, - (char_u *)"", 1L, - SEARCH_MSG + SEARCH_START, -! i, (linenr_T)0, NULL) != FAIL) - lnum = pos.lnum; - else - { -*** ../vim-7.1.210/src/normal.c Sat Jan 5 13:34:01 2008 ---- src/normal.c Sun Jan 6 16:08:54 2008 -*************** -*** 4194,4200 **** - for (;;) - { - t = searchit(curwin, curbuf, &curwin->w_cursor, FORWARD, -! pat, 1L, searchflags, RE_LAST, (linenr_T)0); - if (curwin->w_cursor.lnum >= old_pos.lnum) - t = FAIL; /* match after start is failure too */ - ---- 4194,4200 ---- - for (;;) - { - t = searchit(curwin, curbuf, &curwin->w_cursor, FORWARD, -! pat, 1L, searchflags, RE_LAST, (linenr_T)0, NULL); - if (curwin->w_cursor.lnum >= old_pos.lnum) - t = FAIL; /* match after start is failure too */ - -*** ../vim-7.1.210/src/proto/eval.pro Sun May 6 15:18:09 2007 ---- src/proto/eval.pro Sun Jan 6 15:55:47 2008 -*************** -*** 54,60 **** - long get_dict_number __ARGS((dict_T *d, char_u *key)); - char_u *get_function_name __ARGS((expand_T *xp, int idx)); - char_u *get_expr_name __ARGS((expand_T *xp, int idx)); -! long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop)); - void set_vim_var_nr __ARGS((int idx, long val)); - long get_vim_var_nr __ARGS((int idx)); - char_u *get_vim_var_str __ARGS((int idx)); ---- 54,60 ---- - long get_dict_number __ARGS((dict_T *d, char_u *key)); - char_u *get_function_name __ARGS((expand_T *xp, int idx)); - char_u *get_expr_name __ARGS((expand_T *xp, int idx)); -! long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit)); - void set_vim_var_nr __ARGS((int idx, long val)); - long get_vim_var_nr __ARGS((int idx)); - char_u *get_vim_var_str __ARGS((int idx)); -*** ../vim-7.1.210/src/proto/ex_cmds2.pro Sat May 5 20:21:13 2007 ---- src/proto/ex_cmds2.pro Sun Jan 6 16:42:24 2008 -*************** -*** 14,19 **** ---- 14,21 ---- - void profile_end __ARGS((proftime_T *tm)); - void profile_sub __ARGS((proftime_T *tm, proftime_T *tm2)); - char *profile_msg __ARGS((proftime_T *tm)); -+ void profile_setlimit __ARGS((long msec, proftime_T *tm)); -+ int profile_passed_limit __ARGS((proftime_T *tm)); - void profile_zero __ARGS((proftime_T *tm)); - void profile_add __ARGS((proftime_T *tm, proftime_T *tm2)); - void profile_self __ARGS((proftime_T *self, proftime_T *total, proftime_T *children)); -*** ../vim-7.1.210/src/proto/search.pro Wed Aug 8 22:48:16 2007 ---- src/proto/search.pro Sun Jan 6 16:11:53 2008 -*************** -*** 10,16 **** - void reset_search_dir __ARGS((void)); - void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast)); - void last_pat_prog __ARGS((regmmatch_T *regmatch)); -! int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum)); - int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options)); - int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat)); - int searchc __ARGS((cmdarg_T *cap, int t_cmd)); ---- 10,16 ---- - void reset_search_dir __ARGS((void)); - void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast)); - void last_pat_prog __ARGS((regmmatch_T *regmatch)); -! int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum, proftime_T *tm)); - int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options)); - int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat)); - int searchc __ARGS((cmdarg_T *cap, int t_cmd)); -*** ../vim-7.1.210/src/search.c Tue Jan 1 15:42:45 2008 ---- src/search.c Sun Jan 6 18:23:37 2008 -*************** -*** 494,501 **** - * When FEAT_EVAL is defined, returns the index of the first matching - * subpattern plus one; one if there was none. - */ - int -! searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum) - win_T *win; /* window to search in; can be NULL for a - buffer without a window! */ - buf_T *buf; ---- 494,502 ---- - * When FEAT_EVAL is defined, returns the index of the first matching - * subpattern plus one; one if there was none. - */ -+ /*ARGSUSED*/ - int -! searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum, tm) - win_T *win; /* window to search in; can be NULL for a - buffer without a window! */ - buf_T *buf; -*************** -*** 506,511 **** ---- 507,513 ---- - int options; - int pat_use; /* which pattern to use when "pat" is empty */ - linenr_T stop_lnum; /* stop after this line number when != 0 */ -+ proftime_T *tm; /* timeout limit or NULL */ - { - int found; - linenr_T lnum; /* no init to shut up Apollo cc */ -*************** -*** 594,599 **** ---- 596,606 ---- - if (stop_lnum != 0 && (dir == FORWARD - ? lnum > stop_lnum : lnum < stop_lnum)) - break; -+ #ifdef FEAT_RELTIME -+ /* Stop after passing the "tm" time limit. */ -+ if (tm != NULL && profile_passed_limit(tm)) -+ break; -+ #endif - - /* - * Look for a match somewhere in line "lnum". -*************** -*** 1249,1255 **** - (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS - + SEARCH_MSG + SEARCH_START - + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))), -! RE_LAST, (linenr_T)0); - - if (dircp != NULL) - *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */ ---- 1256,1262 ---- - (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS - + SEARCH_MSG + SEARCH_START - + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))), -! RE_LAST, (linenr_T)0, NULL); - - if (dircp != NULL) - *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */ -*************** -*** 3780,3786 **** - if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|\\_s\\=>\\)", - (char_u *)"", - (char_u *)"]*>", BACKWARD, (char_u *)"", 0, -! NULL, (linenr_T)0) <= 0) - { - curwin->w_cursor = old_pos; - goto theend; ---- 3787,3793 ---- - if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|\\_s\\=>\\)", - (char_u *)"", - (char_u *)"]*>", BACKWARD, (char_u *)"", 0, -! NULL, (linenr_T)0, 0L) <= 0) - { - curwin->w_cursor = old_pos; - goto theend; -*************** -*** 3814,3820 **** - sprintf((char *)epat, "\\c", len, p); - - r = do_searchpair(spat, (char_u *)"", epat, FORWARD, (char_u *)"", -! 0, NULL, (linenr_T)0); - - vim_free(spat); - vim_free(epat); ---- 3821,3827 ---- - sprintf((char *)epat, "\\c", len, p); - - r = do_searchpair(spat, (char_u *)"", epat, FORWARD, (char_u *)"", -! 0, NULL, (linenr_T)0, 0L); - - vim_free(spat); - vim_free(epat); -*** ../vim-7.1.210/src/version.c Sun Jan 6 17:18:16 2008 ---- src/version.c Sun Jan 6 20:00:03 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 211, - /**/ - --- -No letters of the alphabet were harmed in the creation of this message. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.212 b/7.1.212 deleted file mode 100644 index a9aa7f55..00000000 --- a/7.1.212 +++ /dev/null @@ -1,47 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.212 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.212 -Problem: Accessing a byte before a line. -Solution: Check that the column is 1 or more. (Dominuque Pelle) -Files: src/edit.c - - -*** ../vim-7.1.211/src/edit.c Sun Jan 6 20:05:36 2008 ---- src/edit.c Mon Jan 7 22:31:36 2008 -*************** -*** 8452,8457 **** ---- 8452,8458 ---- - if ( mode == BACKSPACE_CHAR - && ((p_sta && in_indent) - || (curbuf->b_p_sts != 0 -+ && curwin->w_cursor.col > 0 - && (*(ml_get_cursor() - 1) == TAB - || (*(ml_get_cursor() - 1) == ' ' - && (!*inserted_space_p -*** ../vim-7.1.211/src/version.c Sun Jan 6 20:05:36 2008 ---- src/version.c Wed Jan 9 10:11:49 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 212, - /**/ - --- -CRONE: Who sent you? -ARTHUR: The Knights Who Say Ni! -CRONE: Aaaagh! (she looks around in rear) No! We have no shrubberies here. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.213 b/7.1.213 deleted file mode 100644 index aee3248d..00000000 --- a/7.1.213 +++ /dev/null @@ -1,57 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.213 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.213 -Problem: A ":tabedit" command that results in the "swap file exists" dialog - and selecting "abort" doesn't close the new tab. (Al Budden) -Solution: Pass "old_curwin" to do_exedit(). -Files: src/ex_docmd.c - - -*** ../vim-7.1.212/src/ex_docmd.c Sun Jan 6 20:05:36 2008 ---- src/ex_docmd.c Wed Jan 9 20:11:13 2008 -*************** -*** 7126,7132 **** - : eap->addr_count == 0 ? 0 - : (int)eap->line2 + 1) != FAIL) - { -! do_exedit(eap, NULL); - - /* set the alternate buffer for the window we came from */ - if (curwin != old_curwin ---- 7127,7133 ---- - : eap->addr_count == 0 ? 0 - : (int)eap->line2 + 1) != FAIL) - { -! do_exedit(eap, old_curwin); - - /* set the alternate buffer for the window we came from */ - if (curwin != old_curwin -*** ../vim-7.1.212/src/version.c Wed Jan 9 10:13:24 2008 ---- src/version.c Wed Jan 9 20:29:09 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 213, - /**/ - --- -Q: What do you call a fish without an eye? -A: fsh! -Q: What do you call a deer with no eyes? -A: no eye deer. -Q: What do you call a deer with no eyes and no legs? -A: still no eye deer. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.214 b/7.1.214 deleted file mode 100644 index 83786675..00000000 --- a/7.1.214 +++ /dev/null @@ -1,266 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.214 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.214 -Problem: ":1s/g\n\zs1//" deletes characters from the first line. (A Politz) -Solution: Start replacing in the line where the match starts. -Files: src/ex_cmds.c - - -*** ../vim-7.1.213/src/ex_cmds.c Fri Jan 4 14:52:14 2008 ---- src/ex_cmds.c Wed Jan 9 22:32:26 2008 -*************** -*** 4200,4206 **** - linenr_T old_line_count = curbuf->b_ml.ml_line_count; - linenr_T line2; - long nmatch; /* number of lines in match */ -- linenr_T sub_firstlnum; /* nr of first sub line */ - char_u *sub_firstline; /* allocated copy of first sub line */ - int endcolumn = FALSE; /* cursor in last column when done */ - pos_T old_cursor = curwin->w_cursor; ---- 4200,4205 ---- -*************** -*** 4447,4453 **** - #endif - ); ++lnum) - { -- sub_firstlnum = lnum; - nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0); - if (nmatch) - { ---- 4446,4451 ---- -*************** -*** 4463,4468 **** ---- 4461,4467 ---- - long nmatch_tl = 0; /* nr of lines matched below lnum */ - int do_again; /* do it again after joining lines */ - int skip_match = FALSE; -+ linenr_T sub_firstlnum; /* nr of first sub line */ - - /* - * The new text is build up step by step, to avoid too much -*************** -*** 4482,4489 **** - * far. - * new_end The new text, where to append new text. - * -! * lnum The line number where we were looking for the -! * first match in the old line. - * sub_firstlnum The line number in the buffer where to look - * for a match. Can be different from "lnum" - * when the pattern or substitute string contains ---- 4481,4490 ---- - * far. - * new_end The new text, where to append new text. - * -! * lnum The line number where we found the start of -! * the match. Can be below the line we searched -! * when there is a \n before a \zs in the -! * pattern. - * sub_firstlnum The line number in the buffer where to look - * for a match. Can be different from "lnum" - * when the pattern or substitute string contains -*************** -*** 4507,4518 **** - * updating the screen or handling a multi-line match. The "old_" - * pointers point into this copy. - */ -! sub_firstline = vim_strsave(ml_get(sub_firstlnum)); -! if (sub_firstline == NULL) -! { -! vim_free(new_start); -! goto outofmem; -! } - copycol = 0; - matchcol = 0; - ---- 4508,4514 ---- - * updating the screen or handling a multi-line match. The "old_" - * pointers point into this copy. - */ -! sub_firstlnum = lnum; - copycol = 0; - matchcol = 0; - -*************** -*** 4533,4538 **** ---- 4529,4556 ---- - */ - for (;;) - { -+ /* Advance "lnum" to the line where the match starts. The -+ * match does not start in the first line when there is a line -+ * break before \zs. */ -+ if (regmatch.startpos[0].lnum > 0) -+ { -+ lnum += regmatch.startpos[0].lnum; -+ sub_firstlnum += regmatch.startpos[0].lnum; -+ nmatch -= regmatch.startpos[0].lnum; -+ vim_free(sub_firstline); -+ sub_firstline = NULL; -+ } -+ -+ if (sub_firstline == NULL) -+ { -+ sub_firstline = vim_strsave(ml_get(sub_firstlnum)); -+ if (sub_firstline == NULL) -+ { -+ vim_free(new_start); -+ goto outofmem; -+ } -+ } -+ - /* Save the line number of the last change for the final - * cursor position (just like Vi). */ - curwin->w_cursor.lnum = lnum; -*************** -*** 4638,4644 **** - temp = RedrawingDisabled; - RedrawingDisabled = 0; - -! search_match_lines = regmatch.endpos[0].lnum; - search_match_endcol = regmatch.endpos[0].col; - highlight_match = TRUE; - ---- 4656,4663 ---- - temp = RedrawingDisabled; - RedrawingDisabled = 0; - -! search_match_lines = regmatch.endpos[0].lnum -! - regmatch.startpos[0].lnum; - search_match_endcol = regmatch.endpos[0].col; - highlight_match = TRUE; - -*************** -*** 4749,4755 **** - * 3. substitute the string. - */ - /* get length of substitution part */ -! sublen = vim_regsub_multi(®match, sub_firstlnum, - sub, sub_firstline, FALSE, p_magic, TRUE); - - /* When the match included the "$" of the last line it may ---- 4768,4775 ---- - * 3. substitute the string. - */ - /* get length of substitution part */ -! sublen = vim_regsub_multi(®match, -! sub_firstlnum - regmatch.startpos[0].lnum, - sub, sub_firstline, FALSE, p_magic, TRUE); - - /* When the match included the "$" of the last line it may -*************** -*** 4819,4825 **** - mch_memmove(new_end, sub_firstline + copycol, (size_t)i); - new_end += i; - -! (void)vim_regsub_multi(®match, sub_firstlnum, - sub, new_end, TRUE, p_magic, TRUE); - sub_nsubs++; - did_sub = TRUE; ---- 4839,4846 ---- - mch_memmove(new_end, sub_firstline + copycol, (size_t)i); - new_end += i; - -! (void)vim_regsub_multi(®match, -! sub_firstlnum - regmatch.startpos[0].lnum, - sub, new_end, TRUE, p_magic, TRUE); - sub_nsubs++; - did_sub = TRUE; -*************** -*** 4908,4917 **** - skip: - /* We already know that we did the last subst when we are at - * the end of the line, except that a pattern like -! * "bar\|\nfoo" may match at the NUL. */ - lastone = (skip_match - || got_int - || got_quit - || !(do_all || do_again) - || (sub_firstline[matchcol] == NUL && nmatch <= 1 - && !re_multiline(regmatch.regprog))); ---- 4929,4941 ---- - skip: - /* We already know that we did the last subst when we are at - * the end of the line, except that a pattern like -! * "bar\|\nfoo" may match at the NUL. "lnum" can be below -! * "line2" when there is a \zs in the pattern after a line -! * break. */ - lastone = (skip_match - || got_int - || got_quit -+ || lnum > line2 - || !(do_all || do_again) - || (sub_firstline[matchcol] == NUL && nmatch <= 1 - && !re_multiline(regmatch.regprog))); -*************** -*** 4926,4937 **** - * When asking the user we like to show the already replaced - * text, but don't do it when "\<@=" or "\<@!" is used, it - * changes what matches. - */ - if (lastone - || (do_ask && !re_lookbehind(regmatch.regprog)) - || nmatch_tl > 0 - || (nmatch = vim_regexec_multi(®match, curwin, -! curbuf, sub_firstlnum, matchcol)) == 0) - { - if (new_start != NULL) - { ---- 4950,4964 ---- - * When asking the user we like to show the already replaced - * text, but don't do it when "\<@=" or "\<@!" is used, it - * changes what matches. -+ * When the match starts below where we start searching also -+ * need to replace the line first (using \zs after \n). - */ - if (lastone - || (do_ask && !re_lookbehind(regmatch.regprog)) - || nmatch_tl > 0 - || (nmatch = vim_regexec_multi(®match, curwin, -! curbuf, sub_firstlnum, matchcol)) == 0 -! || regmatch.startpos[0].lnum > 0) - { - if (new_start != NULL) - { -*************** -*** 5001,5007 **** ---- 5028,5041 ---- - * 5. break if there isn't another match in this line - */ - if (nmatch <= 0) -+ { -+ /* If the match found didn't start where we were -+ * searching, do the next search in the line where we -+ * found the match. */ -+ if (nmatch == -1) -+ lnum -= regmatch.startpos[0].lnum; - break; -+ } - } - - line_breakcheck(); -*** ../vim-7.1.213/src/version.c Wed Jan 9 20:29:51 2008 ---- src/version.c Wed Jan 9 22:37:47 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 214, - /**/ - --- -Q: What's orange and sounds like a parrot? -A: A carrot - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.215 b/7.1.215 deleted file mode 100644 index ea4a830a..00000000 --- a/7.1.215 +++ /dev/null @@ -1,198 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.215 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.215 -Problem: It is difficult to figure out what syntax items are nested at a - certain position. -Solution: Add the synstack() function. -Files: runtime/doc/eval.txt, src/eval.c, src/proto/syntax.pro, - src/syntax.c - - -*** ../vim-7.1.214/runtime/doc/eval.txt Sun Jan 6 20:05:36 2008 ---- runtime/doc/eval.txt Thu Jan 10 22:20:31 2008 -*************** -*** 1,4 **** -! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 06 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 10 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 1786,1791 **** ---- 1786,1792 ---- - synIDattr( {synID}, {what} [, {mode}]) - String attribute {what} of syntax ID {synID} - synIDtrans( {synID}) Number translated syntax ID of {synID} -+ synstack({lnum}, {col}) List stack of syntax IDs at {lnum} and {col} - system( {expr} [, {input}]) String output of shell command/filter {expr} - tabpagebuflist( [{arg}]) List list of buffer numbers in tab page - tabpagenr( [{arg}]) Number number of current or last tab page -*************** -*** 4962,4967 **** ---- 4966,4989 ---- - highlight the character. Highlight links given with - ":highlight link" are followed. - -+ synstack({lnum}, {col}) *synstack()* -+ Return a |List|, which is the stack of syntax items at the -+ position {lnum} and {col} in the current window. Each item in -+ the List is an ID like what |synID()| returns. -+ The stack is the situation in between the character at "col" -+ and the next character. Note that a region of only one -+ character will not show up, it only exists inside that -+ character, not in between characters. -+ The first item in the List is the outer region, following are -+ items contained in that one. The last one is what |synID()| -+ returns, unless not the whole item is highlighted or it is a -+ transparent item. -+ This function is useful for debugging a syntax file. -+ Example that shows the syntax stack under the cursor: > -+ for id in synstack(line("."), col(".")) -+ echo synIDattr(id, "name") -+ endfor -+ - system({expr} [, {input}]) *system()* *E677* - Get the output of the shell command {expr}. - When {input} is given, this string is written to a file and -*** ../vim-7.1.214/src/eval.c Sun Jan 6 20:05:36 2008 ---- src/eval.c Wed Jan 9 13:42:56 2008 -*************** -*** 651,656 **** ---- 651,657 ---- - static void f_synID __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_synIDattr __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_synIDtrans __ARGS((typval_T *argvars, typval_T *rettv)); -+ static void f_synstack __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_system __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_tabpagebuflist __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_tabpagenr __ARGS((typval_T *argvars, typval_T *rettv)); -*************** -*** 7252,7257 **** ---- 7253,7259 ---- - {"synID", 3, 3, f_synID}, - {"synIDattr", 2, 3, f_synIDattr}, - {"synIDtrans", 1, 1, f_synIDtrans}, -+ {"synstack", 2, 2, f_synstack}, - {"system", 1, 2, f_system}, - {"tabpagebuflist", 0, 1, f_tabpagebuflist}, - {"tabpagenr", 0, 1, f_tabpagenr}, -*************** -*** 15843,15848 **** ---- 15845,15890 ---- - id = 0; - - rettv->vval.v_number = id; -+ } -+ -+ /* -+ * "synstack(lnum, col)" function -+ */ -+ /*ARGSUSED*/ -+ static void -+ f_synstack(argvars, rettv) -+ typval_T *argvars; -+ typval_T *rettv; -+ { -+ #ifdef FEAT_SYN_HL -+ long lnum; -+ long col; -+ int i; -+ int id; -+ #endif -+ -+ rettv->v_type = VAR_LIST; -+ rettv->vval.v_list = NULL; -+ -+ #ifdef FEAT_SYN_HL -+ lnum = get_tv_lnum(argvars); /* -1 on type error */ -+ col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */ -+ -+ if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count -+ && col >= 0 && col < (long)STRLEN(ml_get(lnum)) -+ && rettv_list_alloc(rettv) != FAIL) -+ { -+ (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL); -+ for (i = 0; ; ++i) -+ { -+ id = syn_get_stack_item(i); -+ if (id < 0) -+ break; -+ if (list_append_number(rettv->vval.v_list, id) == FAIL) -+ break; -+ } -+ } -+ #endif - } - - /* -*** ../vim-7.1.214/src/proto/syntax.pro Tue Jul 24 14:32:44 2007 ---- src/proto/syntax.pro Wed Jan 9 13:38:20 2008 -*************** -*** 13,18 **** ---- 13,19 ---- - void set_context_in_syntax_cmd __ARGS((expand_T *xp, char_u *arg)); - char_u *get_syntax_name __ARGS((expand_T *xp, int idx)); - int syn_get_id __ARGS((win_T *wp, long lnum, colnr_T col, int trans, int *spellp)); -+ int syn_get_stack_item __ARGS((int i)); - int syn_get_foldlevel __ARGS((win_T *wp, long lnum)); - void init_highlight __ARGS((int both, int reset)); - int load_colors __ARGS((char_u *name)); -*** ../vim-7.1.214/src/syntax.c Sun Oct 7 15:21:31 2007 ---- src/syntax.c Wed Jan 9 15:17:47 2008 -*************** -*** 6104,6109 **** ---- 6102,6123 ---- - - return (trans ? current_trans_id : current_id); - } -+ -+ #if defined(FEAT_EVAL) || defined(PROTO) -+ /* -+ * Return the syntax ID at position "i" in the current stack. -+ * The caller must have called syn_get_id() before to fill the stack. -+ * Returns -1 when "i" is out of range. -+ */ -+ int -+ syn_get_stack_item(i) -+ int i; -+ { -+ if (i >= current_state.ga_len ) -+ return -1; -+ return CUR_STATE(i).si_id; -+ } -+ #endif - - #if defined(FEAT_FOLDING) || defined(PROTO) - /* -*** ../vim-7.1.214/src/version.c Wed Jan 9 22:39:55 2008 ---- src/version.c Thu Jan 10 22:17:38 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 215, - /**/ - --- -TALL KNIGHT: We are now no longer the Knights Who Say Ni! -ONE KNIGHT: Ni! -OTHERS: Sh! -ONE KNIGHT: (whispers) Sorry. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.216 b/7.1.216 deleted file mode 100644 index 392d5d56..00000000 --- a/7.1.216 +++ /dev/null @@ -1,55 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.216 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.216 -Problem: Variants of --remote-tab are not mentioned for "vim --help". -Solution: Display optional -wait and -silent. -Files: src/main.c - - -*** ../vim-7.1.215/src/main.c Tue Sep 25 17:54:41 2007 ---- src/main.c Sun Dec 30 15:09:11 2007 -*************** -*** 3081,3087 **** - main_msg(_("--remote-wait As --remote but wait for files to have been edited")); - main_msg(_("--remote-wait-silent Same, don't complain if there is no server")); - # ifdef FEAT_WINDOWS -! main_msg(_("--remote-tab As --remote but open tab page for each file")); - # endif - main_msg(_("--remote-send \tSend to a Vim server and exit")); - main_msg(_("--remote-expr \tEvaluate in a Vim server and print result")); ---- 3081,3087 ---- - main_msg(_("--remote-wait As --remote but wait for files to have been edited")); - main_msg(_("--remote-wait-silent Same, don't complain if there is no server")); - # ifdef FEAT_WINDOWS -! main_msg(_("--remote-tab[-wait][-silent] As --remote but use tab page per file")); - # endif - main_msg(_("--remote-send \tSend to a Vim server and exit")); - main_msg(_("--remote-expr \tEvaluate in a Vim server and print result")); -*** ../vim-7.1.215/src/version.c Thu Jan 10 22:23:22 2008 ---- src/version.c Fri Jan 11 20:25:14 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 216, - /**/ - --- -TIM: But follow only if you are men of valour. For the entrance to this cave - is guarded by a monster, a creature so foul and cruel that no man yet has - fought with it and lived. Bones of full fifty men lie strewn about its - lair ... - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.217 b/7.1.217 deleted file mode 100644 index de40e64c..00000000 --- a/7.1.217 +++ /dev/null @@ -1,228 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.217 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.217 -Problem: The "help-tags" tag may be missing from runtime/doc/tags when it - was generated during "make install". -Solution: Add the "++t" argument to ":helptags" to force adding the tag. -Files: runtime/doc/Makefile, runtime/doc/various.txt, src/ex_cmds.c, - src/ex_cmds.h - - -*** ../vim-7.1.216/runtime/doc/Makefile Sat May 5 19:14:15 2007 ---- runtime/doc/Makefile Fri Jan 11 20:55:34 2008 -*************** -*** 301,307 **** - # Use Vim to generate the tags file. Can only be used when Vim has been - # compiled and installed. Supports multiple languages. - vimtags: $(DOCS) -! $(VIMEXE) -u NONE -esX -c "helptags ." -c quit - - # Use "doctags" to generate the tags file. Only works for English! - tags: doctags $(DOCS) ---- 301,307 ---- - # Use Vim to generate the tags file. Can only be used when Vim has been - # compiled and installed. Supports multiple languages. - vimtags: $(DOCS) -! $(VIMEXE) -u NONE -esX -c "helptags ++t ." -c quit - - # Use "doctags" to generate the tags file. Only works for English! - tags: doctags $(DOCS) -*** ../vim-7.1.216/runtime/doc/various.txt Sat May 12 17:05:26 2007 ---- runtime/doc/various.txt Fri Jan 11 20:45:45 2008 -*************** -*** 1,4 **** -! *various.txt* For Vim version 7.1. Last change: 2007 Jan 14 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *various.txt* For Vim version 7.1. Last change: 2008 Jan 11 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 748,754 **** - - *:helpt* *:helptags* - *E154* *E150* *E151* *E152* *E153* *E670* -! :helpt[ags] {dir} Generate the help tags file(s) for directory {dir}. - All "*.txt" and "*.??x" files in the directory are - scanned for a help tag definition in between stars. - The "*.??x" files are for translated docs, they ---- 754,761 ---- - - *:helpt* *:helptags* - *E154* *E150* *E151* *E152* *E153* *E670* -! :helpt[ags] [++t] {dir} -! Generate the help tags file(s) for directory {dir}. - All "*.txt" and "*.??x" files in the directory are - scanned for a help tag definition in between stars. - The "*.??x" files are for translated docs, they -*************** -*** 756,761 **** ---- 763,771 ---- - The generated tags files are sorted. - When there are duplicates an error message is given. - An existing tags file is silently overwritten. -+ The optional "++t" argument forces adding the -+ "help-tags" tag. This is also done when the {dir} is -+ equal to $VIMRUNTIME/doc. - To rebuild the help tags in the runtime directory - (requires write permission there): > - :helptags $VIMRUNTIME/doc -*** ../vim-7.1.216/src/ex_cmds.c Wed Jan 9 22:39:55 2008 ---- src/ex_cmds.c Fri Jan 11 20:47:13 2008 -*************** -*** 6091,6097 **** - } - - #if defined(FEAT_EX_EXTRA) || defined(PROTO) -! static void helptags_one __ARGS((char_u *dir, char_u *ext, char_u *lang)); - - /* - * ":helptags" ---- 6091,6097 ---- - } - - #if defined(FEAT_EX_EXTRA) || defined(PROTO) -! static void helptags_one __ARGS((char_u *dir, char_u *ext, char_u *lang, int add_help_tags)); - - /* - * ":helptags" -*************** -*** 6110,6115 **** ---- 6110,6123 ---- - char_u fname[8]; - int filecount; - char_u **files; -+ int add_help_tags = FALSE; -+ -+ /* Check for ":helptags ++t {dir}". */ -+ if (STRNCMP(eap->arg, "++t", 3) == 0 && vim_iswhite(eap->arg[3])) -+ { -+ add_help_tags = TRUE; -+ eap->arg = skipwhite(eap->arg + 3); -+ } - - if (!mch_isdir(eap->arg)) - { -*************** -*** 6192,6198 **** - ext[1] = fname[5]; - ext[2] = fname[6]; - } -! helptags_one(eap->arg, ext, fname); - } - - ga_clear(&ga); ---- 6200,6206 ---- - ext[1] = fname[5]; - ext[2] = fname[6]; - } -! helptags_one(eap->arg, ext, fname, add_help_tags); - } - - ga_clear(&ga); -*************** -*** 6200,6214 **** - - #else - /* No language support, just use "*.txt" and "tags". */ -! helptags_one(eap->arg, (char_u *)".txt", (char_u *)"tags"); - #endif - } - - static void -! helptags_one(dir, ext, tagfname) -! char_u *dir; /* doc directory */ -! char_u *ext; /* suffix, ".txt", ".itx", ".frx", etc. */ -! char_u *tagfname; /* "tags" for English, "tags-it" for Italian. */ - { - FILE *fd_tags; - FILE *fd; ---- 6208,6223 ---- - - #else - /* No language support, just use "*.txt" and "tags". */ -! helptags_one(eap->arg, (char_u *)".txt", (char_u *)"tags", add_help_tags); - #endif - } - - static void -! helptags_one(dir, ext, tagfname, add_help_tags) -! char_u *dir; /* doc directory */ -! char_u *ext; /* suffix, ".txt", ".itx", ".frx", etc. */ -! char_u *tagfname; /* "tags" for English, "tags-fr" for French. */ -! int add_help_tags; /* add "help-tags" tag */ - { - FILE *fd_tags; - FILE *fd; -*************** -*** 6259,6268 **** - } - - /* -! * If generating tags for "$VIMRUNTIME/doc" add the "help-tags" tag. - */ - ga_init2(&ga, (int)sizeof(char_u *), 100); -! if (fullpathcmp((char_u *)"$VIMRUNTIME/doc", dir, FALSE) == FPC_SAME) - { - if (ga_grow(&ga, 1) == FAIL) - got_int = TRUE; ---- 6268,6279 ---- - } - - /* -! * If using the "++t" argument or generating tags for "$VIMRUNTIME/doc" -! * add the "help-tags" tag. - */ - ga_init2(&ga, (int)sizeof(char_u *), 100); -! if (add_help_tags || fullpathcmp((char_u *)"$VIMRUNTIME/doc", -! dir, FALSE) == FPC_SAME) - { - if (ga_grow(&ga, 1) == FAIL) - got_int = TRUE; -*** ../vim-7.1.216/src/ex_cmds.h Thu Mar 8 11:00:55 2007 ---- src/ex_cmds.h Fri Jan 11 20:49:18 2008 -*************** -*** 422,428 **** - EX(CMD_helpgrep, "helpgrep", ex_helpgrep, - EXTRA|NOTRLCOM|NEEDARG), - EX(CMD_helptags, "helptags", ex_helptags, -! NEEDARG|FILE1|TRLBAR|CMDWIN), - EX(CMD_hardcopy, "hardcopy", ex_hardcopy, - RANGE|COUNT|EXTRA|TRLBAR|DFLALL|BANG), - EX(CMD_highlight, "highlight", ex_highlight, ---- 422,428 ---- - EX(CMD_helpgrep, "helpgrep", ex_helpgrep, - EXTRA|NOTRLCOM|NEEDARG), - EX(CMD_helptags, "helptags", ex_helptags, -! NEEDARG|FILES|TRLBAR|CMDWIN), - EX(CMD_hardcopy, "hardcopy", ex_hardcopy, - RANGE|COUNT|EXTRA|TRLBAR|DFLALL|BANG), - EX(CMD_highlight, "highlight", ex_highlight, -*** ../vim-7.1.216/src/version.c Fri Jan 11 20:25:42 2008 ---- src/version.c Fri Jan 11 20:58:44 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 217, - /**/ - --- -My girlfriend told me I should be more affectionate. -So I got TWO girlfriends. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.218 b/7.1.218 deleted file mode 100644 index 859f0b72..00000000 --- a/7.1.218 +++ /dev/null @@ -1,58 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.218 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.218 -Problem: A syntax region without a "keepend", containing a region with - "extend" could be truncated at the end of the containing region. -Solution: Do not call syn_update_ends() when there are no keepend items. -Files: src/syntax.c - - -*** ../vim-7.1.217/src/syntax.c Thu Jan 10 22:23:22 2008 ---- src/syntax.c Wed Jan 9 15:17:47 2008 -*************** -*** 2495,2501 **** - if (current_state.ga_len == 0) - break; - -! if (had_extend) - { - syn_update_ends(FALSE); - if (current_state.ga_len == 0) ---- 2493,2499 ---- - if (current_state.ga_len == 0) - break; - -! if (had_extend && keepend_level >= 0) - { - syn_update_ends(FALSE); - if (current_state.ga_len == 0) -*** ../vim-7.1.217/src/version.c Fri Jan 11 21:00:49 2008 ---- src/version.c Fri Jan 11 21:25:46 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 218, - /**/ - --- -The Law of VIM: -For each member b of the possible behaviour space B of program P, there exists -a finite time t before which at least one user u in the total user space U of -program P will request b becomes a member of the allowed behaviour space B' -(B' <= B). -In other words: Sooner or later everyone wants everything as an option. - -- Vince Negri - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.219 b/7.1.219 deleted file mode 100644 index 68e4cfa2..00000000 --- a/7.1.219 +++ /dev/null @@ -1,378 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.219 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.219 (after 7.1.215) -Problem: synstack() returns situation after the current character, can't - see the state for a one-character region. -Solution: Don't update ending states in the requested column. -Files: runtime/doc/eval.txt, src/eval.c, src/hardcopy.c, - src/proto/syntax.pro, src/screen.c, src/spell.c, src/syntax.c - - -*** ../vim-7.1.218/runtime/doc/eval.txt Thu Jan 10 22:23:22 2008 ---- runtime/doc/eval.txt Fri Jan 11 22:04:59 2008 -*************** -*** 1,4 **** -! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 10 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 11 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 4967,4976 **** - Return a |List|, which is the stack of syntax items at the - position {lnum} and {col} in the current window. Each item in - the List is an ID like what |synID()| returns. -- The stack is the situation in between the character at "col" -- and the next character. Note that a region of only one -- character will not show up, it only exists inside that -- character, not in between characters. - The first item in the List is the outer region, following are - items contained in that one. The last one is what |synID()| - returns, unless not the whole item is highlighted or it is a ---- 4970,4975 ---- -*** ../vim-7.1.218/src/eval.c Thu Jan 10 22:23:22 2008 ---- src/eval.c Fri Jan 11 21:46:12 2008 -*************** -*** 15725,15731 **** - - if (!transerr && lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count - && col >= 0 && col < (long)STRLEN(ml_get(lnum))) -! id = syn_get_id(curwin, lnum, (colnr_T)col, trans, NULL); - #endif - - rettv->vval.v_number = id; ---- 15725,15731 ---- - - if (!transerr && lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count - && col >= 0 && col < (long)STRLEN(ml_get(lnum))) -! id = syn_get_id(curwin, lnum, (colnr_T)col, trans, NULL, FALSE); - #endif - - rettv->vval.v_number = id; -*************** -*** 15874,15880 **** - && col >= 0 && col < (long)STRLEN(ml_get(lnum)) - && rettv_list_alloc(rettv) != FAIL) - { -! (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL); - for (i = 0; ; ++i) - { - id = syn_get_stack_item(i); ---- 15874,15880 ---- - && col >= 0 && col < (long)STRLEN(ml_get(lnum)) - && rettv_list_alloc(rettv) != FAIL) - { -! (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE); - for (i = 0; ; ++i) - { - id = syn_get_stack_item(i); -*** ../vim-7.1.218/src/hardcopy.c Thu May 10 20:40:02 2007 ---- src/hardcopy.c Fri Jan 11 21:46:20 2008 -*************** -*** 876,882 **** - */ - if (psettings->do_syntax) - { -! id = syn_get_id(curwin, ppos->file_line, col, 1, NULL); - if (id > 0) - id = syn_get_final_id(id); - else ---- 876,882 ---- - */ - if (psettings->do_syntax) - { -! id = syn_get_id(curwin, ppos->file_line, col, 1, NULL, FALSE); - if (id > 0) - id = syn_get_final_id(id); - else -*** ../vim-7.1.218/src/proto/syntax.pro Thu Jan 10 22:23:22 2008 ---- src/proto/syntax.pro Fri Jan 11 21:54:19 2008 -*************** -*** 4,10 **** - void syn_stack_apply_changes __ARGS((buf_T *buf)); - void syntax_end_parsing __ARGS((linenr_T lnum)); - int syntax_check_changed __ARGS((linenr_T lnum)); -! int get_syntax_attr __ARGS((colnr_T col, int *can_spell)); - void syntax_clear __ARGS((buf_T *buf)); - void ex_syntax __ARGS((exarg_T *eap)); - int syntax_present __ARGS((buf_T *buf)); ---- 4,10 ---- - void syn_stack_apply_changes __ARGS((buf_T *buf)); - void syntax_end_parsing __ARGS((linenr_T lnum)); - int syntax_check_changed __ARGS((linenr_T lnum)); -! int get_syntax_attr __ARGS((colnr_T col, int *can_spell, int keep_state)); - void syntax_clear __ARGS((buf_T *buf)); - void ex_syntax __ARGS((exarg_T *eap)); - int syntax_present __ARGS((buf_T *buf)); -*************** -*** 12,18 **** - void set_context_in_echohl_cmd __ARGS((expand_T *xp, char_u *arg)); - void set_context_in_syntax_cmd __ARGS((expand_T *xp, char_u *arg)); - char_u *get_syntax_name __ARGS((expand_T *xp, int idx)); -! int syn_get_id __ARGS((win_T *wp, long lnum, colnr_T col, int trans, int *spellp)); - int syn_get_stack_item __ARGS((int i)); - int syn_get_foldlevel __ARGS((win_T *wp, long lnum)); - void init_highlight __ARGS((int both, int reset)); ---- 12,18 ---- - void set_context_in_echohl_cmd __ARGS((expand_T *xp, char_u *arg)); - void set_context_in_syntax_cmd __ARGS((expand_T *xp, char_u *arg)); - char_u *get_syntax_name __ARGS((expand_T *xp, int idx)); -! int syn_get_id __ARGS((win_T *wp, long lnum, colnr_T col, int trans, int *spellp, int keep_state)); - int syn_get_stack_item __ARGS((int i)); - int syn_get_foldlevel __ARGS((win_T *wp, long lnum)); - void init_highlight __ARGS((int both, int reset)); -*** ../vim-7.1.218/src/screen.c Thu Nov 8 21:23:34 2007 ---- src/screen.c Fri Jan 11 21:48:10 2008 -*************** -*** 3885,3891 **** - # ifdef FEAT_SPELL - has_spell ? &can_spell : - # endif -! NULL); - - if (did_emsg) - { ---- 3885,3891 ---- - # ifdef FEAT_SPELL - has_spell ? &can_spell : - # endif -! NULL, FALSE); - - if (did_emsg) - { -*** ../vim-7.1.218/src/spell.c Sun Aug 5 18:32:21 2007 ---- src/spell.c Fri Jan 11 21:46:50 2008 -*************** -*** 2146,2152 **** - { - col = (int)(p - buf); - (void)syn_get_id(wp, lnum, (colnr_T)col, -! FALSE, &can_spell); - if (!can_spell) - attr = HLF_COUNT; - } ---- 2146,2152 ---- - { - col = (int)(p - buf); - (void)syn_get_id(wp, lnum, (colnr_T)col, -! FALSE, &can_spell, FALSE); - if (!can_spell) - attr = HLF_COUNT; - } -*** ../vim-7.1.218/src/syntax.c Fri Jan 11 21:26:49 2008 ---- src/syntax.c Sat Jan 12 16:42:25 2008 -*************** -*** 378,384 **** - static int syn_stack_equal __ARGS((synstate_T *sp)); - static void validate_current_state __ARGS((void)); - static int syn_finish_line __ARGS((int syncing)); -! static int syn_current_attr __ARGS((int syncing, int displaying, int *can_spell)); - static int did_match_already __ARGS((int idx, garray_T *gap)); - static stateitem_T *push_next_match __ARGS((stateitem_T *cur_si)); - static void check_state_ends __ARGS((void)); ---- 378,384 ---- - static int syn_stack_equal __ARGS((synstate_T *sp)); - static void validate_current_state __ARGS((void)); - static int syn_finish_line __ARGS((int syncing)); -! static int syn_current_attr __ARGS((int syncing, int displaying, int *can_spell, int keep_state)); - static int did_match_already __ARGS((int idx, garray_T *gap)); - static stateitem_T *push_next_match __ARGS((stateitem_T *cur_si)); - static void check_state_ends __ARGS((void)); -*************** -*** 1691,1697 **** - { - while (!current_finished) - { -! (void)syn_current_attr(syncing, FALSE, NULL); - /* - * When syncing, and found some item, need to check the item. - */ ---- 1690,1696 ---- - { - while (!current_finished) - { -! (void)syn_current_attr(syncing, FALSE, NULL, FALSE); - /* - * When syncing, and found some item, need to check the item. - */ -*************** -*** 1731,1739 **** - * done. - */ - int -! get_syntax_attr(col, can_spell) - colnr_T col; - int *can_spell; - { - int attr = 0; - ---- 1730,1739 ---- - * done. - */ - int -! get_syntax_attr(col, can_spell, keep_state) - colnr_T col; - int *can_spell; -+ int keep_state; /* keep state of char at "col" */ - { - int attr = 0; - -*************** -*** 1768,1774 **** - */ - while (current_col <= col) - { -! attr = syn_current_attr(FALSE, TRUE, can_spell); - ++current_col; - } - ---- 1768,1775 ---- - */ - while (current_col <= col) - { -! attr = syn_current_attr(FALSE, TRUE, can_spell, -! current_col == col ? keep_state : FALSE); - ++current_col; - } - -*************** -*** 1779,1788 **** - * Get syntax attributes for current_lnum, current_col. - */ - static int -! syn_current_attr(syncing, displaying, can_spell) - int syncing; /* When 1: called for syncing */ - int displaying; /* result will be displayed */ - int *can_spell; /* return: do spell checking */ - { - int syn_id; - lpos_T endpos; /* was: char_u *endp; */ ---- 1780,1790 ---- - * Get syntax attributes for current_lnum, current_col. - */ - static int -! syn_current_attr(syncing, displaying, can_spell, keep_state) - int syncing; /* When 1: called for syncing */ - int displaying; /* result will be displayed */ - int *can_spell; /* return: do spell checking */ -+ int keep_state; /* keep syntax stack afterwards */ - { - int syn_id; - lpos_T endpos; /* was: char_u *endp; */ -*************** -*** 2298,2304 **** - * may be for an empty match and a containing item might end in the - * current column. - */ -! if (!syncing) - { - check_state_ends(); - if (current_state.ga_len > 0 ---- 2300,2306 ---- - * may be for an empty match and a containing item might end in the - * current column. - */ -! if (!syncing && !keep_state) - { - check_state_ends(); - if (current_state.ga_len > 0 -*************** -*** 6086,6097 **** - * Function called for expression evaluation: get syntax ID at file position. - */ - int -! syn_get_id(wp, lnum, col, trans, spellp) - win_T *wp; - long lnum; - colnr_T col; -! int trans; /* remove transparancy */ -! int *spellp; /* return: can do spell checking */ - { - /* When the position is not after the current position and in the same - * line of the same buffer, need to restart parsing. */ ---- 6088,6100 ---- - * Function called for expression evaluation: get syntax ID at file position. - */ - int -! syn_get_id(wp, lnum, col, trans, spellp, keep_state) - win_T *wp; - long lnum; - colnr_T col; -! int trans; /* remove transparancy */ -! int *spellp; /* return: can do spell checking */ -! int keep_state; /* keep state of char at "col" */ - { - /* When the position is not after the current position and in the same - * line of the same buffer, need to restart parsing. */ -*************** -*** 6100,6106 **** - || col < current_col) - syntax_start(wp, lnum); - -! (void)get_syntax_attr(col, spellp); - - return (trans ? current_trans_id : current_id); - } ---- 6103,6109 ---- - || col < current_col) - syntax_start(wp, lnum); - -! (void)get_syntax_attr(col, spellp, keep_state); - - return (trans ? current_trans_id : current_id); - } -*************** -*** 6115,6122 **** - syn_get_stack_item(i) - int i; - { -! if (i >= current_state.ga_len ) - return -1; - return CUR_STATE(i).si_id; - } - #endif ---- 6118,6131 ---- - syn_get_stack_item(i) - int i; - { -! if (i >= current_state.ga_len) -! { -! /* Need to invalidate the state, because we didn't properly finish it -! * for the last character, "keep_state" was TRUE. */ -! invalidate_current_state(); -! current_col = MAXCOL; - return -1; -+ } - return CUR_STATE(i).si_id; - } - #endif -*** ../vim-7.1.218/src/version.c Fri Jan 11 21:26:49 2008 ---- src/version.c Sat Jan 12 16:40:47 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 219, - /**/ - --- -ARTHUR: Go on, Bors, chop its head off. -BORS: Right. Silly little bleeder. One rabbit stew coming up. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.220 b/7.1.220 deleted file mode 100644 index 1ba8f040..00000000 --- a/7.1.220 +++ /dev/null @@ -1,136 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.220 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.220 -Problem: When a ")" or word movement command moves the cursor back from the - end of the line it may end up on the trail byte of a multi-byte - character. It's also moved back when it isn't needed. -Solution: Add the adjust_cursor() function. -Files: src/normal.c - - -*** ../vim-7.1.219/src/normal.c Sun Jan 6 20:05:36 2008 ---- src/normal.c Sat Jan 12 17:10:14 2008 -*************** -*** 150,155 **** ---- 150,156 ---- - static void nv_bck_word __ARGS((cmdarg_T *cap)); - static void nv_wordcmd __ARGS((cmdarg_T *cap)); - static void nv_beginline __ARGS((cmdarg_T *cap)); -+ static void adjust_cursor __ARGS((oparg_T *oap)); - #ifdef FEAT_VISUAL - static void adjust_for_sel __ARGS((cmdarg_T *cap)); - static int unadjust_for_sel __ARGS((void)); -*************** -*** 6567,6578 **** - clearopbeep(cap->oap); - else - { -! /* Don't leave the cursor on the NUL past a line */ -! if (curwin->w_cursor.col > 0 && gchar_cursor() == NUL) -! { -! --curwin->w_cursor.col; -! cap->oap->inclusive = TRUE; -! } - #ifdef FEAT_VIRTUALEDIT - curwin->w_cursor.coladd = 0; - #endif ---- 6568,6575 ---- - clearopbeep(cap->oap); - else - { -! /* Don't leave the cursor on the NUL past end of line. */ -! adjust_cursor(cap->oap); - #ifdef FEAT_VIRTUALEDIT - curwin->w_cursor.coladd = 0; - #endif -*************** -*** 8408,8419 **** - else - n = fwd_word(cap->count1, cap->arg, cap->oap->op_type != OP_NOP); - -! /* Don't leave the cursor on the NUL past a line */ -! if (n != FAIL && curwin->w_cursor.col > 0 && gchar_cursor() == NUL) -! { -! --curwin->w_cursor.col; -! cap->oap->inclusive = TRUE; -! } - - if (n == FAIL && cap->oap->op_type == OP_NOP) - clearopbeep(cap->oap); ---- 8405,8413 ---- - else - n = fwd_word(cap->count1, cap->arg, cap->oap->op_type != OP_NOP); - -! /* Don't leave the cursor on the NUL past the end of line. */ -! if (n != FAIL) -! adjust_cursor(cap->oap); - - if (n == FAIL && cap->oap->op_type == OP_NOP) - clearopbeep(cap->oap); -*************** -*** 8426,8431 **** ---- 8420,8458 ---- - if ((fdo_flags & FDO_HOR) && KeyTyped && cap->oap->op_type == OP_NOP) - foldOpenCursor(); - #endif -+ } -+ } -+ -+ /* -+ * Used after a movement command: If the cursor ends up on the NUL after the -+ * end of the line, may move it back to the last character and make the motion -+ * inclusive. -+ */ -+ static void -+ adjust_cursor(oap) -+ oparg_T *oap; -+ { -+ /* The cursor cannot remain on the NUL when: -+ * - the column is > 0 -+ * - not in Visual mode or 'selection' is "o" -+ * - 'virtualedit' is not "all" and not "onemore". -+ */ -+ if (curwin->w_cursor.col > 0 && gchar_cursor() == NUL -+ #ifdef FEAT_VISUAL -+ && (!VIsual_active || *p_sel == 'o') -+ #endif -+ #ifdef FEAT_VIRTUALEDIT -+ && !virtual_active() && (ve_flags & VE_ONEMORE) == 0 -+ #endif -+ ) -+ { -+ --curwin->w_cursor.col; -+ #ifdef FEAT_MBYTE -+ /* prevent cursor from moving on the trail byte */ -+ if (has_mbyte) -+ mb_adjust_cursor(); -+ #endif -+ oap->inclusive = TRUE; - } - } - -*** ../vim-7.1.219/src/version.c Sat Jan 12 16:45:25 2008 ---- src/version.c Sat Jan 12 17:07:28 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 220, - /**/ - --- -A hamburger walks into a bar, and the bartender says: "I'm sorry, -but we don't serve food here." - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.221 b/7.1.221 deleted file mode 100644 index 14fc9473..00000000 --- a/7.1.221 +++ /dev/null @@ -1,58 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.221 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.221 -Problem: When inserting a "(", triggering the matchparen plugin, the - following highlighting may be messed up. -Solution: Before triggering the CursorMovedI autocommands update the display - to update the stored syntax stacks for the change. -Files: src/edit.c - - -*** ../vim-7.1.220/src/edit.c Wed Jan 9 10:13:24 2008 ---- src/edit.c Sat Jan 12 16:07:41 2008 -*************** -*** 1455,1460 **** ---- 1455,1468 ---- - # endif - ) - { -+ # ifdef FEAT_SYN_HL -+ /* Need to update the screen first, to make sure syntax -+ * highlighting is correct after making a change (e.g., inserting -+ * a "(". The autocommand may also require a redraw, so it's done -+ * again below, unfortunately. */ -+ if (syntax_present(curbuf) && must_redraw) -+ update_screen(0); -+ # endif - apply_autocmds(EVENT_CURSORMOVEDI, NULL, NULL, FALSE, curbuf); - last_cursormoved = curwin->w_cursor; - } -*** ../vim-7.1.220/src/version.c Sat Jan 12 17:11:25 2008 ---- src/version.c Sat Jan 12 18:11:22 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 221, - /**/ - --- -ROBIN: The what? -ARTHUR: The Holy Hand Grenade of Antioch. 'Tis one of the sacred relics - Brother Maynard always carries with him. -ALL: Yes. Of course. -ARTHUR: (shouting) Bring up the Holy Hand Grenade! - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.222 b/7.1.222 deleted file mode 100644 index f092e76b..00000000 --- a/7.1.222 +++ /dev/null @@ -1,135 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.222 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.222 (after 7.1.217) -Problem: Wildcards in argument of ":helptags" are not expanded. (Marcel - Svitalsky) -Solution: Expand wildcards in the directory name. -Files: src/ex_cmds.c - - -*** ../vim-7.1.221/src/ex_cmds.c Fri Jan 11 21:00:49 2008 ---- src/ex_cmds.c Sat Jan 12 21:40:51 2008 -*************** -*** 6106,6111 **** ---- 6106,6113 ---- - #ifdef FEAT_MULTI_LANG - char_u lang[2]; - #endif -+ expand_T xpc; -+ char_u *dirname; - char_u ext[5]; - char_u fname[8]; - int filecount; -*************** -*** 6119,6125 **** - eap->arg = skipwhite(eap->arg + 3); - } - -! if (!mch_isdir(eap->arg)) - { - EMSG2(_("E150: Not a directory: %s"), eap->arg); - return; ---- 6121,6131 ---- - eap->arg = skipwhite(eap->arg + 3); - } - -! ExpandInit(&xpc); -! xpc.xp_context = EXPAND_DIRECTORIES; -! dirname = ExpandOne(&xpc, eap->arg, NULL, -! WILD_LIST_NOTFOUND|WILD_SILENT, WILD_EXPAND_FREE); -! if (dirname == NULL || !mch_isdir(dirname)) - { - EMSG2(_("E150: Not a directory: %s"), eap->arg); - return; -*************** -*** 6127,6133 **** - - #ifdef FEAT_MULTI_LANG - /* Get a list of all files in the directory. */ -! STRCPY(NameBuff, eap->arg); - add_pathsep(NameBuff); - STRCAT(NameBuff, "*"); - if (gen_expand_wildcards(1, &NameBuff, &filecount, &files, ---- 6133,6139 ---- - - #ifdef FEAT_MULTI_LANG - /* Get a list of all files in the directory. */ -! STRCPY(NameBuff, dirname); - add_pathsep(NameBuff); - STRCAT(NameBuff, "*"); - if (gen_expand_wildcards(1, &NameBuff, &filecount, &files, -*************** -*** 6135,6140 **** ---- 6141,6147 ---- - || filecount == 0) - { - EMSG2("E151: No match: %s", NameBuff); -+ vim_free(dirname); - return; - } - -*************** -*** 6200,6206 **** - ext[1] = fname[5]; - ext[2] = fname[6]; - } -! helptags_one(eap->arg, ext, fname, add_help_tags); - } - - ga_clear(&ga); ---- 6207,6213 ---- - ext[1] = fname[5]; - ext[2] = fname[6]; - } -! helptags_one(dirname, ext, fname, add_help_tags); - } - - ga_clear(&ga); -*************** -*** 6208,6215 **** - - #else - /* No language support, just use "*.txt" and "tags". */ -! helptags_one(eap->arg, (char_u *)".txt", (char_u *)"tags", add_help_tags); - #endif - } - - static void ---- 6215,6223 ---- - - #else - /* No language support, just use "*.txt" and "tags". */ -! helptags_one(dirname, (char_u *)".txt", (char_u *)"tags", add_help_tags); - #endif -+ vim_free(dirname); - } - - static void -*** ../vim-7.1.221/src/version.c Sat Jan 12 18:13:05 2008 ---- src/version.c Sun Jan 13 13:27:04 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 222, - /**/ - --- - Arthur pulls Pin out. The MONK blesses the grenade as ... -ARTHUR: (quietly) One, two, five ... -GALAHAD: Three, sir! -ARTHUR: Three. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.223 b/7.1.223 deleted file mode 100644 index 0fbfb584..00000000 --- a/7.1.223 +++ /dev/null @@ -1,263 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.223 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.223 -Problem: glob() doesn't work properly when 'shell' is "sh" or "bash" and - the expanded name contains spaces, '~', single quotes and other - special characters. (Adri Verhoef, Charles Campbell) -Solution: For Posix shells define a vimglob() function to list the matches - instead of using "echo" directly. -Files: src/os_unix.c - - -*** ../vim-7.1.222/src/os_unix.c Thu Jan 3 18:55:21 2008 ---- src/os_unix.c Sun Jan 13 13:52:53 2008 -*************** -*** 4946,4951 **** ---- 4946,4954 ---- - char_u *p; - int dir; - #ifdef __EMX__ -+ /* -+ * This is the OS/2 implementation. -+ */ - # define EXPL_ALLOC_INC 16 - char_u **expl_files; - size_t files_alloced, files_free; -*************** -*** 5056,5075 **** - return OK; - - #else /* __EMX__ */ -! - int j; - char_u *tempname; - char_u *command; - FILE *fd; - char_u *buffer; -! #define STYLE_ECHO 0 /* use "echo" to expand */ -! #define STYLE_GLOB 1 /* use "glob" to expand, for csh */ -! #define STYLE_PRINT 2 /* use "print -N" to expand, for zsh */ -! #define STYLE_BT 3 /* `cmd` expansion, execute the pattern directly */ - int shell_style = STYLE_ECHO; - int check_spaces; - static int did_find_nul = FALSE; - int ampersent = FALSE; - - *num_file = 0; /* default: no files found */ - *file = NULL; ---- 5059,5084 ---- - return OK; - - #else /* __EMX__ */ -! /* -! * This is the non-OS/2 implementation (really Unix). -! */ - int j; - char_u *tempname; - char_u *command; - FILE *fd; - char_u *buffer; -! #define STYLE_ECHO 0 /* use "echo", the default */ -! #define STYLE_GLOB 1 /* use "glob", for csh */ -! #define STYLE_VIMGLOB 2 /* use "vimglob", for Posix sh */ -! #define STYLE_PRINT 3 /* use "print -N", for zsh */ -! #define STYLE_BT 4 /* `cmd` expansion, execute the pattern -! * directly */ - int shell_style = STYLE_ECHO; - int check_spaces; - static int did_find_nul = FALSE; - int ampersent = FALSE; -+ /* vimglob() function to define for Posix shell */ -+ static char *sh_vimglob_func = "vimglob() { while [ $# -ge 1 ]; do echo -n \"$1\"; echo; shift; done }; vimglob >"; - - *num_file = 0; /* default: no files found */ - *file = NULL; -*************** -*** 5107,5115 **** - - /* - * Let the shell expand the patterns and write the result into the temp -! * file. if expanding `cmd` execute it directly. -! * If we use csh, glob will work better than echo. -! * If we use zsh, print -N will work better than glob. - */ - if (num_pat == 1 && *pat[0] == '`' - && (len = STRLEN(pat[0])) > 2 ---- 5116,5132 ---- - - /* - * Let the shell expand the patterns and write the result into the temp -! * file. -! * STYLE_BT: NL separated -! * If expanding `cmd` execute it directly. -! * STYLE_GLOB: NUL separated -! * If we use *csh, "glob" will work better than "echo". -! * STYLE_PRINT: NL or NUL separated -! * If we use *zsh, "print -N" will work better than "glob". -! * STYLE_VIMGLOB: NL separated -! * If we use *sh*, we define "vimglob()". -! * STYLE_ECHO: space separated. -! * A shell we don't know, stay safe and use "echo". - */ - if (num_pat == 1 && *pat[0] == '`' - && (len = STRLEN(pat[0])) > 2 -*************** -*** 5122,5130 **** - else if (STRCMP(p_sh + len - 3, "zsh") == 0) - shell_style = STYLE_PRINT; - } -! -! /* "unset nonomatch; print -N >" plus two is 29 */ - len = STRLEN(tempname) + 29; - for (i = 0; i < num_pat; ++i) - { - /* Count the length of the patterns in the same way as they are put in ---- 5139,5155 ---- - else if (STRCMP(p_sh + len - 3, "zsh") == 0) - shell_style = STYLE_PRINT; - } -! if (shell_style == STYLE_ECHO && strstr((char *)gettail(p_sh), -! "sh") != NULL) -! shell_style = STYLE_VIMGLOB; -! -! /* Compute the length of the command. We need 2 extra bytes: for the -! * optional '&' and for the NUL. -! * Worst case: "unset nonomatch; print -N >" plus two is 29 */ - len = STRLEN(tempname) + 29; -+ if (shell_style == STYLE_VIMGLOB) -+ len += STRLEN(sh_vimglob_func); -+ - for (i = 0; i < num_pat; ++i) - { - /* Count the length of the patterns in the same way as they are put in -*************** -*** 5183,5192 **** ---- 5208,5221 ---- - STRCAT(command, "glob >"); - else if (shell_style == STYLE_PRINT) - STRCAT(command, "print -N >"); -+ else if (shell_style == STYLE_VIMGLOB) -+ STRCAT(command, sh_vimglob_func); - else - STRCAT(command, "echo >"); - } -+ - STRCAT(command, tempname); -+ - if (shell_style != STYLE_BT) - for (i = 0; i < num_pat; ++i) - { -*************** -*** 5232,5239 **** - if (flags & EW_SILENT) - show_shell_mess = FALSE; - if (ampersent) -! STRCAT(command, "&"); /* put the '&' back after the -! redirection */ - - /* - * Using zsh -G: If a pattern has no matches, it is just deleted from ---- 5261,5267 ---- - if (flags & EW_SILENT) - show_shell_mess = FALSE; - if (ampersent) -! STRCAT(command, "&"); /* put the '&' after the redirection */ - - /* - * Using zsh -G: If a pattern has no matches, it is just deleted from -*************** -*** 5265,5271 **** - show_shell_mess = TRUE; - vim_free(command); - -! if (i) /* mch_call_shell() failed */ - { - mch_remove(tempname); - vim_free(tempname); ---- 5293,5299 ---- - show_shell_mess = TRUE; - vim_free(command); - -! if (i != 0) /* mch_call_shell() failed */ - { - mch_remove(tempname); - vim_free(tempname); -*************** -*** 5336,5342 **** - } - vim_free(tempname); - -! #if defined(__CYGWIN__) || defined(__CYGWIN32__) - /* Translate into . Caution, buffer may contain NUL. */ - p = buffer; - for (i = 0; i < len; ++i) ---- 5364,5370 ---- - } - vim_free(tempname); - -! # if defined(__CYGWIN__) || defined(__CYGWIN32__) - /* Translate into . Caution, buffer may contain NUL. */ - p = buffer; - for (i = 0; i < len; ++i) -*************** -*** 5359,5365 **** - } - } - /* file names are separated with NL */ -! else if (shell_style == STYLE_BT) - { - buffer[len] = NUL; /* make sure the buffer ends in NUL */ - p = buffer; ---- 5387,5393 ---- - } - } - /* file names are separated with NL */ -! else if (shell_style == STYLE_BT || shell_style == STYLE_VIMGLOB) - { - buffer[len] = NUL; /* make sure the buffer ends in NUL */ - p = buffer; -*************** -*** 5438,5444 **** - { - (*file)[i] = p; - /* Space or NL separates */ -! if (shell_style == STYLE_ECHO || shell_style == STYLE_BT) - { - while (!(shell_style == STYLE_ECHO && *p == ' ') - && *p != '\n' && *p != NUL) ---- 5466,5473 ---- - { - (*file)[i] = p; - /* Space or NL separates */ -! if (shell_style == STYLE_ECHO || shell_style == STYLE_BT -! || shell_style == STYLE_VIMGLOB) - { - while (!(shell_style == STYLE_ECHO && *p == ' ') - && *p != '\n' && *p != NUL) -*** ../vim-7.1.222/src/version.c Sun Jan 13 13:30:34 2008 ---- src/version.c Sun Jan 13 13:45:04 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 223, - /**/ - --- -User: I'm having problems with my text editor. -Help desk: Which editor are you using? -User: I don't know, but it's version VI (pronounced: 6). -Help desk: Oh, then you should upgrade to version VIM (pronounced: 994). - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.224 b/7.1.224 deleted file mode 100644 index 4e6c9d3d..00000000 --- a/7.1.224 +++ /dev/null @@ -1,73 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.224 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.224 -Problem: When using "vim -F -o file1 file2" only one window is - right-to-left. Same for "-H". (Ben Schmidt) -Solution: use set_option_value() to set 'rightleft'. -Files: src/main.c - - -*** ../vim-7.1.223/src/main.c Fri Jan 11 20:25:42 2008 ---- src/main.c Sun Jan 13 16:12:09 2008 -*************** -*** 1775,1781 **** - - case 'F': /* "-F" start in Farsi mode: rl + fkmap set */ - #ifdef FEAT_FKMAP -! curwin->w_p_rl = p_fkmap = TRUE; - #else - mch_errmsg(_(e_nofarsi)); - mch_exit(2); ---- 1775,1782 ---- - - case 'F': /* "-F" start in Farsi mode: rl + fkmap set */ - #ifdef FEAT_FKMAP -! p_fkmap = TRUE; -! set_option_value((char_u *)"rl", 1L, NULL, 0); - #else - mch_errmsg(_(e_nofarsi)); - mch_exit(2); -*************** -*** 1792,1798 **** - - case 'H': /* "-H" start in Hebrew mode: rl + hkmap set */ - #ifdef FEAT_RIGHTLEFT -! curwin->w_p_rl = p_hkmap = TRUE; - #else - mch_errmsg(_(e_nohebrew)); - mch_exit(2); ---- 1793,1800 ---- - - case 'H': /* "-H" start in Hebrew mode: rl + hkmap set */ - #ifdef FEAT_RIGHTLEFT -! p_hkmap = TRUE; -! set_option_value((char_u *)"rl", 1L, NULL, 0); - #else - mch_errmsg(_(e_nohebrew)); - mch_exit(2); -*** ../vim-7.1.223/src/version.c Sun Jan 13 13:53:30 2008 ---- src/version.c Sun Jan 13 16:15:49 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 224, - /**/ - --- -LAUNCELOT: Isn't there a St. Aaaaarrrrrrggghhh's in Cornwall? -ARTHUR: No, that's Saint Ives. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.225 b/7.1.225 deleted file mode 100644 index acce0c55..00000000 --- a/7.1.225 +++ /dev/null @@ -1,55 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.225 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.225 -Problem: Using unitialized value when XGetWMNormalHints() fails. -Solution: Check the return value. (Dominique Pelle) -Files: src/os_unix.c - - -*** ../vim-7.1.224/src/os_unix.c Sun Jan 13 13:53:30 2008 ---- src/os_unix.c Sun Jan 13 13:52:53 2008 -*************** -*** 6145,6153 **** - if (xterm_trace == 1) - { - /* Get the hints just before tracking starts. The font size might -! * have changed recently */ -! XGetWMNormalHints(xterm_dpy, x11_window, &xterm_hints, &got_hints); -! if (!(got_hints & PResizeInc) - || xterm_hints.width_inc <= 1 - || xterm_hints.height_inc <= 1) - { ---- 6145,6153 ---- - if (xterm_trace == 1) - { - /* Get the hints just before tracking starts. The font size might -! * have changed recently. */ -! if (!XGetWMNormalHints(xterm_dpy, x11_window, &xterm_hints, &got_hints) -! || !(got_hints & PResizeInc) - || xterm_hints.width_inc <= 1 - || xterm_hints.height_inc <= 1) - { -*** ../vim-7.1.224/src/version.c Sun Jan 13 16:17:02 2008 ---- src/version.c Sun Jan 13 16:29:51 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 225, - /**/ - --- -"When I die, I want a tombstone that says "GAME OVER" - Ton Richters - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.226 b/7.1.226 deleted file mode 100644 index eb3cb6b7..00000000 --- a/7.1.226 +++ /dev/null @@ -1,68 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.226 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.226 -Problem: Command line completion doesn't work when a file name contains a - '&' character. -Solution: Accept all characters in a file name, except ones that end a - command or white space. -Files: src/ex_docmd.c - - -*** ../vim-7.1.225/src/ex_docmd.c Wed Jan 9 20:29:51 2008 ---- src/ex_docmd.c Wed Jan 9 20:11:13 2008 -*************** -*** 3338,3349 **** - } - in_quote = !in_quote; - } - #ifdef SPACE_IN_FILENAME -! else if (!vim_isfilec_or_wc(c) -! && (!(ea.argt & NOSPC) || usefilter)) -! #else -! else if (!vim_isfilec_or_wc(c)) - #endif - { - while (*p != NUL) - { ---- 3338,3350 ---- - } - in_quote = !in_quote; - } -+ /* An argument can contain just about everything, except -+ * characters that end the command and white space. */ -+ else if (c == '|' || c == '\n' || c == '"' || (vim_iswhite(c) - #ifdef SPACE_IN_FILENAME -! && (!(ea.argt & NOSPC) || usefilter) - #endif -+ )) - { - while (*p != NUL) - { -*** ../vim-7.1.225/src/version.c Sun Jan 13 16:30:23 2008 ---- src/version.c Sun Jan 13 17:10:15 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 226, - /**/ - --- - [Another hideous roar.] -BEDEVERE: That's it! -ARTHUR: What? -BEDEVERE: It's The Legendary Black Beast of Aaaaarrrrrrggghhh! - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.227 b/7.1.227 deleted file mode 100644 index 042c4498..00000000 --- a/7.1.227 +++ /dev/null @@ -1,188 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.227 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.227 -Problem: Hang in syntax HL when moving over a ")". (Dominique Pelle) -Solution: Avoid storing a syntax state in the wrong position in the list of - remembered states. -Files: src/syntax.c - - -*** ../vim-7.1.226/src/syntax.c Sat Jan 12 16:45:25 2008 ---- src/syntax.c Sat Jan 12 16:45:44 2008 -*************** -*** 372,378 **** - static int syn_stack_cleanup __ARGS((void)); - static void syn_stack_free_entry __ARGS((buf_T *buf, synstate_T *p)); - static synstate_T *syn_stack_find_entry __ARGS((linenr_T lnum)); -! static synstate_T *store_current_state __ARGS((synstate_T *sp)); - static void load_current_state __ARGS((synstate_T *from)); - static void invalidate_current_state __ARGS((void)); - static int syn_stack_equal __ARGS((synstate_T *sp)); ---- 372,378 ---- - static int syn_stack_cleanup __ARGS((void)); - static void syn_stack_free_entry __ARGS((buf_T *buf, synstate_T *p)); - static synstate_T *syn_stack_find_entry __ARGS((linenr_T lnum)); -! static synstate_T *store_current_state __ARGS((void)); - static void load_current_state __ARGS((synstate_T *from)); - static void invalidate_current_state __ARGS((void)); - static int syn_stack_equal __ARGS((synstate_T *sp)); -*************** -*** 464,470 **** - synstate_T *p; - synstate_T *last_valid = NULL; - synstate_T *last_min_valid = NULL; -! synstate_T *sp, *prev; - linenr_T parsed_lnum; - linenr_T first_stored; - int dist; ---- 464,470 ---- - synstate_T *p; - synstate_T *last_valid = NULL; - synstate_T *last_min_valid = NULL; -! synstate_T *sp, *prev = NULL; - linenr_T parsed_lnum; - linenr_T first_stored; - int dist; -*************** -*** 502,508 **** - if (!current_state_stored) - { - ++current_lnum; -! (void)store_current_state(NULL); - } - - /* ---- 502,508 ---- - if (!current_state_stored) - { - ++current_lnum; -! (void)store_current_state(); - } - - /* -*************** -*** 558,564 **** - dist = 999999; - else - dist = syn_buf->b_ml.ml_line_count / (syn_buf->b_sst_len - Rows) + 1; -- prev = syn_stack_find_entry(current_lnum); - while (current_lnum < lnum) - { - syn_start_line(); ---- 558,563 ---- -*************** -*** 573,581 **** - * equal to the current state. If so, then validate all saved - * states that depended on a change before the parsed line. */ - if (prev == NULL) - sp = syn_buf->b_sst_first; - else -! sp = prev->sst_next; - if (sp != NULL - && sp->sst_lnum == current_lnum - && syn_stack_equal(sp)) ---- 572,584 ---- - * equal to the current state. If so, then validate all saved - * states that depended on a change before the parsed line. */ - if (prev == NULL) -+ prev = syn_stack_find_entry(current_lnum - 1); -+ if (prev == NULL) - sp = syn_buf->b_sst_first; - else -! sp = prev; -! while (sp != NULL && sp->sst_lnum < current_lnum) -! sp = sp->sst_next; - if (sp != NULL - && sp->sst_lnum == current_lnum - && syn_stack_equal(sp)) -*************** -*** 601,607 **** - else if (prev == NULL - || current_lnum == lnum - || current_lnum >= prev->sst_lnum + dist) -! prev = store_current_state(prev); - } - - /* This can take a long time: break when CTRL-C pressed. The current ---- 604,610 ---- - else if (prev == NULL - || current_lnum == lnum - || current_lnum >= prev->sst_lnum + dist) -! prev = store_current_state(); - } - - /* This can take a long time: break when CTRL-C pressed. The current -*************** -*** 1353,1369 **** - * The current state must be valid for the start of the current_lnum line! - */ - static synstate_T * -! store_current_state(sp) -! synstate_T *sp; /* at or before where state is to be saved or -! NULL */ - { - int i; - synstate_T *p; - bufstate_T *bp; - stateitem_T *cur_si; -! -! if (sp == NULL) -! sp = syn_stack_find_entry(current_lnum); - - /* - * If the current state contains a start or end pattern that continues ---- 1356,1368 ---- - * The current state must be valid for the start of the current_lnum line! - */ - static synstate_T * -! store_current_state() - { - int i; - synstate_T *p; - bufstate_T *bp; - stateitem_T *cur_si; -! synstate_T *sp = syn_stack_find_entry(current_lnum); - - /* - * If the current state contains a start or end pattern that continues -*************** -*** 1667,1673 **** - * Store the current state in b_sst_array[] for later use. - */ - ++current_lnum; -! (void)store_current_state(NULL); - } - } - ---- 1666,1672 ---- - * Store the current state in b_sst_array[] for later use. - */ - ++current_lnum; -! (void)store_current_state(); - } - } - -*** ../vim-7.1.226/src/version.c Sun Jan 13 17:11:25 2008 ---- src/version.c Sun Jan 13 17:37:10 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 227, - /**/ - --- -Dreams are free, but there's a small charge for alterations. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.228 b/7.1.228 deleted file mode 100644 index bab4dff5..00000000 --- a/7.1.228 +++ /dev/null @@ -1,51 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.228 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.228 -Problem: When 'foldmethod' is "indent" and a fold is created with ">>" it - can't be closed with "zc". (Daniel Shahaf) -Solution: Reset the "small" flag of a fold when adding a line to it. -Files: src/fold.c - - -*** ../vim-7.1.227/src/fold.c Sun Oct 14 15:32:10 2007 ---- src/fold.c Sun Jan 13 21:26:48 2008 -*************** -*** 2676,2681 **** ---- 2676,2682 ---- - if (fp->fd_len < flp->lnum - fp->fd_top) - { - fp->fd_len = flp->lnum - fp->fd_top; -+ fp->fd_small = MAYBE; - fold_changed = TRUE; - } - -*** ../vim-7.1.227/src/version.c Sun Jan 13 17:39:29 2008 ---- src/version.c Sun Jan 13 21:56:53 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 228, - /**/ - --- -VOICE OVER: As the horrendous Black Beast lunged forward, escape for Arthur - and his knights seemed hopeless, when, suddenly ... the animator - suffered a fatal heart attack. -ANIMATOR: Aaaaagh! -VOICE OVER: The cartoon peril was no more ... The Quest for Holy Grail could - continue. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.229 b/7.1.229 deleted file mode 100644 index c07e8e20..00000000 --- a/7.1.229 +++ /dev/null @@ -1,55 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.229 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.229 -Problem: A fold is closed when it shouldn't when 'foldmethod' is "indent" - and backspacing a non-white character so that the indent increases. -Solution: Keep the fold open after backspacing a character. -Files: src/edit.c - - -*** ../vim-7.1.228/src/edit.c Sat Jan 12 18:13:05 2008 ---- src/edit.c Mon Jan 14 20:06:43 2008 -*************** -*** 8618,8623 **** ---- 8619,8632 ---- - if (vim_strchr(p_cpo, CPO_BACKSPACE) != NULL && dollar_vcol == 0) - dollar_vcol = curwin->w_virtcol; - -+ #ifdef FEAT_FOLDING -+ /* When deleting a char the cursor line must never be in a closed fold. -+ * E.g., when 'foldmethod' is indent and deleting the first non-white -+ * char before a Tab. */ -+ if (did_backspace) -+ foldOpenCursor(); -+ #endif -+ - return did_backspace; - } - -*** ../vim-7.1.228/src/version.c Sun Jan 13 21:57:25 2008 ---- src/version.c Mon Jan 14 20:08:35 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 229, - /**/ - --- -ROBIN: (warily) And if you get a question wrong? -ARTHUR: You are cast into the Gorge of Eternal Peril. -ROBIN: Oh ... wacho! - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.230 b/7.1.230 deleted file mode 100644 index 3cd72706..00000000 --- a/7.1.230 +++ /dev/null @@ -1,64 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.230 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.230 -Problem: Memory leak when executing SourceCmd autocommands. -Solution: Free the memory. (Dominique Pelle) -Files: src/ex_cmds2.c - - -*** ../vim-7.1.229/src/ex_cmds2.c Sun Jan 6 20:05:36 2008 ---- src/ex_cmds2.c Tue Jan 15 20:41:28 2008 -*************** -*** 2889,2899 **** - if (has_autocmd(EVENT_SOURCECMD, fname_exp, NULL) - && apply_autocmds(EVENT_SOURCECMD, fname_exp, fname_exp, - FALSE, curbuf)) - # ifdef FEAT_EVAL -! return aborting() ? FAIL : OK; - # else -! return OK; - # endif - - /* Apply SourcePre autocommands, they may get the file. */ - apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf); ---- 2889,2902 ---- - if (has_autocmd(EVENT_SOURCECMD, fname_exp, NULL) - && apply_autocmds(EVENT_SOURCECMD, fname_exp, fname_exp, - FALSE, curbuf)) -+ { - # ifdef FEAT_EVAL -! retval = aborting() ? FAIL : OK; - # else -! retval = OK; - # endif -+ goto theend; -+ } - - /* Apply SourcePre autocommands, they may get the file. */ - apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf); -*** ../vim-7.1.229/src/version.c Mon Jan 14 20:11:37 2008 ---- src/version.c Tue Jan 15 22:15:03 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 230, - /**/ - --- -Citizens are not allowed to attend a movie house or theater nor ride in a -public streetcar within at least four hours after eating garlic. - [real standing law in Indiana, United States of America] - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.231 b/7.1.231 deleted file mode 100644 index e9c78859..00000000 --- a/7.1.231 +++ /dev/null @@ -1,291 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.231 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.231 -Problem: When shifting lines the change is acted upon multiple times. -Solution: Don't have shift_line() call changed_bytes. -Files: src/edit.c, src/ops.c, src/proto/edit.pro, src/proto/ops.pro - - -*** ../vim-7.1.230/src/edit.c Mon Jan 14 20:11:37 2008 ---- src/edit.c Mon Jan 14 20:06:43 2008 -*************** -*** 1662,1672 **** - * if round is TRUE, round the indent to 'shiftwidth' (only with _INC and _Dec). - */ - void -! change_indent(type, amount, round, replaced) - int type; - int amount; - int round; - int replaced; /* replaced character, put on replace stack */ - { - int vcol; - int last_vcol; ---- 1662,1673 ---- - * if round is TRUE, round the indent to 'shiftwidth' (only with _INC and _Dec). - */ - void -! change_indent(type, amount, round, replaced, call_changed_bytes) - int type; - int amount; - int round; - int replaced; /* replaced character, put on replace stack */ -+ int call_changed_bytes; /* call changed_bytes() */ - { - int vcol; - int last_vcol; -*************** -*** 1723,1729 **** - * Set the new indent. The cursor will be put on the first non-blank. - */ - if (type == INDENT_SET) -! (void)set_indent(amount, SIN_CHANGED); - else - { - #ifdef FEAT_VREPLACE ---- 1724,1730 ---- - * Set the new indent. The cursor will be put on the first non-blank. - */ - if (type == INDENT_SET) -! (void)set_indent(amount, call_changed_bytes ? SIN_CHANGED : 0); - else - { - #ifdef FEAT_VREPLACE -*************** -*** 1733,1739 **** - if (State & VREPLACE_FLAG) - State = INSERT; - #endif -! shift_line(type == INDENT_DEC, round, 1); - #ifdef FEAT_VREPLACE - State = save_State; - #endif ---- 1734,1740 ---- - if (State & VREPLACE_FLAG) - State = INSERT; - #endif -! shift_line(type == INDENT_DEC, round, 1, call_changed_bytes); - #ifdef FEAT_VREPLACE - State = save_State; - #endif -*************** -*** 5921,5927 **** - { - #ifdef FEAT_VREPLACE - if (State & VREPLACE_FLAG) -! change_indent(INDENT_SET, second_indent, FALSE, NUL); - else - #endif - (void)set_indent(second_indent, SIN_CHANGED); ---- 5922,5928 ---- - { - #ifdef FEAT_VREPLACE - if (State & VREPLACE_FLAG) -! change_indent(INDENT_SET, second_indent, FALSE, NUL, TRUE); - else - #endif - (void)set_indent(second_indent, SIN_CHANGED); -*************** -*** 7227,7233 **** - fixthisline(get_the_indent) - int (*get_the_indent) __ARGS((void)); - { -! change_indent(INDENT_SET, get_the_indent(), FALSE, 0); - if (linewhite(curwin->w_cursor.lnum)) - did_ai = TRUE; /* delete the indent if the line stays empty */ - } ---- 7228,7234 ---- - fixthisline(get_the_indent) - int (*get_the_indent) __ARGS((void)); - { -! change_indent(INDENT_SET, get_the_indent(), FALSE, 0, TRUE); - if (linewhite(curwin->w_cursor.lnum)) - did_ai = TRUE; /* delete the indent if the line stays empty */ - } -*************** -*** 8170,8179 **** - replace_pop_ins(); - if (lastc == '^') - old_indent = get_indent(); /* remember curr. indent */ -! change_indent(INDENT_SET, 0, TRUE, 0); - } - else -! change_indent(c == Ctrl_D ? INDENT_DEC : INDENT_INC, 0, TRUE, 0); - - if (did_ai && *skipwhite(ml_get_curline()) != NUL) - did_ai = FALSE; ---- 8171,8180 ---- - replace_pop_ins(); - if (lastc == '^') - old_indent = get_indent(); /* remember curr. indent */ -! change_indent(INDENT_SET, 0, TRUE, 0, TRUE); - } - else -! change_indent(c == Ctrl_D ? INDENT_DEC : INDENT_INC, 0, TRUE, 0, TRUE); - - if (did_ai && *skipwhite(ml_get_curline()) != NUL) - did_ai = FALSE; -*************** -*** 9633,9639 **** - curwin->w_cursor = old_pos; - #ifdef FEAT_VREPLACE - if (State & VREPLACE_FLAG) -! change_indent(INDENT_SET, i, FALSE, NUL); - else - #endif - (void)set_indent(i, SIN_CHANGED); ---- 9634,9640 ---- - curwin->w_cursor = old_pos; - #ifdef FEAT_VREPLACE - if (State & VREPLACE_FLAG) -! change_indent(INDENT_SET, i, FALSE, NUL, TRUE); - else - #endif - (void)set_indent(i, SIN_CHANGED); -*************** -*** 9662,9668 **** - curwin->w_cursor = old_pos; - } - if (temp) -! shift_line(TRUE, FALSE, 1); - } - } - ---- 9663,9669 ---- - curwin->w_cursor = old_pos; - } - if (temp) -! shift_line(TRUE, FALSE, 1, TRUE); - } - } - -*** ../vim-7.1.230/src/ops.c Thu Jan 3 16:31:17 2008 ---- src/ops.c Sun Jan 13 21:52:18 2008 -*************** -*** 258,264 **** - if (first_char != '#' || !preprocs_left()) - #endif - { -! shift_line(oap->op_type == OP_LSHIFT, p_sr, amount); - } - ++curwin->w_cursor.lnum; - } ---- 258,264 ---- - if (first_char != '#' || !preprocs_left()) - #endif - { -! shift_line(oap->op_type == OP_LSHIFT, p_sr, amount, FALSE); - } - ++curwin->w_cursor.lnum; - } -*************** -*** 321,330 **** - * leaves cursor on first blank in the line - */ - void -! shift_line(left, round, amount) - int left; - int round; - int amount; - { - int count; - int i, j; ---- 321,331 ---- - * leaves cursor on first blank in the line - */ - void -! shift_line(left, round, amount, call_changed_bytes) - int left; - int round; - int amount; -+ int call_changed_bytes; /* call changed_bytes() */ - { - int count; - int i, j; -*************** -*** 363,372 **** - /* Set new indent */ - #ifdef FEAT_VREPLACE - if (State & VREPLACE_FLAG) -! change_indent(INDENT_SET, count, FALSE, NUL); - else - #endif -! (void)set_indent(count, SIN_CHANGED); - } - - #if defined(FEAT_VISUALEXTRA) || defined(PROTO) ---- 364,373 ---- - /* Set new indent */ - #ifdef FEAT_VREPLACE - if (State & VREPLACE_FLAG) -! change_indent(INDENT_SET, count, FALSE, NUL, call_changed_bytes); - else - #endif -! (void)set_indent(count, call_changed_bytes ? SIN_CHANGED : 0); - } - - #if defined(FEAT_VISUALEXTRA) || defined(PROTO) -*** ../vim-7.1.230/src/proto/edit.pro Wed Jan 2 17:48:24 2008 ---- src/proto/edit.pro Sun Jan 13 21:52:27 2008 -*************** -*** 3,9 **** - void edit_putchar __ARGS((int c, int highlight)); - void edit_unputchar __ARGS((void)); - void display_dollar __ARGS((colnr_T col)); -! void change_indent __ARGS((int type, int amount, int round, int replaced)); - void truncate_spaces __ARGS((char_u *line)); - void backspace_until_column __ARGS((int col)); - int vim_is_ctrl_x_key __ARGS((int c)); ---- 3,9 ---- - void edit_putchar __ARGS((int c, int highlight)); - void edit_unputchar __ARGS((void)); - void display_dollar __ARGS((colnr_T col)); -! void change_indent __ARGS((int type, int amount, int round, int replaced, int call_changed_bytes)); - void truncate_spaces __ARGS((char_u *line)); - void backspace_until_column __ARGS((int col)); - int vim_is_ctrl_x_key __ARGS((int c)); -*** ../vim-7.1.230/src/proto/ops.pro Sun May 6 13:56:32 2007 ---- src/proto/ops.pro Sun Jan 13 21:52:30 2008 -*************** -*** 4,10 **** - int get_op_char __ARGS((int optype)); - int get_extra_op_char __ARGS((int optype)); - void op_shift __ARGS((oparg_T *oap, int curs_top, int amount)); -! void shift_line __ARGS((int left, int round, int amount)); - void op_reindent __ARGS((oparg_T *oap, int (*how)(void))); - int get_expr_register __ARGS((void)); - void set_expr_line __ARGS((char_u *new_line)); ---- 4,10 ---- - int get_op_char __ARGS((int optype)); - int get_extra_op_char __ARGS((int optype)); - void op_shift __ARGS((oparg_T *oap, int curs_top, int amount)); -! void shift_line __ARGS((int left, int round, int amount, int call_changed_bytes)); - void op_reindent __ARGS((oparg_T *oap, int (*how)(void))); - int get_expr_register __ARGS((void)); - void set_expr_line __ARGS((char_u *new_line)); -*** ../vim-7.1.230/src/version.c Tue Jan 15 22:16:36 2008 ---- src/version.c Wed Jan 16 19:58:25 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 231, - /**/ - --- -Snoring is prohibited unless all bedroom windows are closed and securely -locked. - [real standing law in Massachusetts, United States of America] - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.232 b/7.1.232 deleted file mode 100644 index 092d6fa9..00000000 --- a/7.1.232 +++ /dev/null @@ -1,70 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.232 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.232 (after 7.1.207 and 7.1.211) -Problem: Compiler warnings with MSVC. -Solution: Add type casts. (Mike Williams) -Files: src/ex_cmds2.c, src/netbeans.c - - -*** ../vim-7.1.231/src/ex_cmds2.c Tue Jan 15 22:16:36 2008 ---- src/ex_cmds2.c Tue Jan 15 20:41:28 2008 -*************** -*** 916,922 **** - - QueryPerformanceCounter(tm); - QueryPerformanceFrequency(&fr); -! tm->QuadPart += (double)msec / 1000.0 * (double)fr.QuadPart; - # else - long usec; - ---- 916,922 ---- - - QueryPerformanceCounter(tm); - QueryPerformanceFrequency(&fr); -! tm->QuadPart += (LONGLONG)((double)msec / 1000.0 * (double)fr.QuadPart); - # else - long usec; - -*** ../vim-7.1.231/src/netbeans.c Sat Jan 5 18:06:33 2008 ---- src/netbeans.c Mon Jan 14 21:11:02 2008 -*************** -*** 1217,1223 **** - - oldtext = ml_get(lnum); - oldlen = STRLEN(oldtext); -! if (first >= oldlen || oldlen == 0) /* just in case */ - return; - if (lastbyte >= oldlen) - lastbyte = oldlen - 1; ---- 1217,1223 ---- - - oldtext = ml_get(lnum); - oldlen = STRLEN(oldtext); -! if (first >= (colnr_T)oldlen || oldlen == 0) /* just in case */ - return; - if (lastbyte >= oldlen) - lastbyte = oldlen - 1; -*** ../vim-7.1.231/src/version.c Wed Jan 16 20:01:14 2008 ---- src/version.c Fri Jan 18 11:38:39 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 232, - /**/ - --- -Why is "abbreviation" such a long word? - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.233 b/7.1.233 deleted file mode 100644 index b2f07e3f..00000000 --- a/7.1.233 +++ /dev/null @@ -1,109 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.233 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.233 -Problem: Crash when doing Insert mode completion for a user defined - command. (Yegappan Lakshmanan) -Solution: Don't use the non-existing command line. -Files: src/ex_getln.c - - -*** ../vim-7.1.232/src/ex_getln.c Fri Jan 4 15:16:57 2008 ---- src/ex_getln.c Fri Jan 18 13:07:11 2008 -*************** -*** 4655,4661 **** - static void * call_user_expand_func __ARGS((void *(*user_expand_func) __ARGS((char_u *, int, char_u **, int)), expand_T *xp, int *num_file, char_u ***file)); - - /* -! * call "user_expand_func()" to invoke a user defined VimL function and return - * the result (either a string or a List). - */ - static void * ---- 4655,4661 ---- - static void * call_user_expand_func __ARGS((void *(*user_expand_func) __ARGS((char_u *, int, char_u **, int)), expand_T *xp, int *num_file, char_u ***file)); - - /* -! * Call "user_expand_func()" to invoke a user defined VimL function and return - * the result (either a string or a List). - */ - static void * -*************** -*** 4677,4687 **** - *num_file = 0; - *file = NULL; - -! keep = ccline.cmdbuff[ccline.cmdlen]; -! ccline.cmdbuff[ccline.cmdlen] = 0; -! sprintf((char *)num, "%d", ccline.cmdpos); - args[0] = xp->xp_pattern; -- args[1] = ccline.cmdbuff; - args[2] = num; - - /* Save the cmdline, we don't know what the function may do. */ ---- 4677,4698 ---- - *num_file = 0; - *file = NULL; - -! if (ccline.cmdbuff == NULL) -! { -! /* Completion from Insert mode, pass fake arguments. */ -! keep = 0; -! sprintf((char *)num, "%d", STRLEN(xp->xp_pattern)); -! args[1] = xp->xp_pattern; -! } -! else -! { -! /* Completion on the command line, pass real arguments. */ -! keep = ccline.cmdbuff[ccline.cmdlen]; -! ccline.cmdbuff[ccline.cmdlen] = 0; -! sprintf((char *)num, "%d", ccline.cmdpos); -! args[1] = ccline.cmdbuff; -! } - args[0] = xp->xp_pattern; - args[2] = num; - - /* Save the cmdline, we don't know what the function may do. */ -*************** -*** 4694,4701 **** - - ccline = save_ccline; - current_SID = save_current_SID; -! -! ccline.cmdbuff[ccline.cmdlen] = keep; - - return ret; - } ---- 4705,4712 ---- - - ccline = save_ccline; - current_SID = save_current_SID; -! if (ccline.cmdbuff != NULL) -! ccline.cmdbuff[ccline.cmdlen] = keep; - - return ret; - } -*** ../vim-7.1.232/src/version.c Fri Jan 18 11:40:02 2008 ---- src/version.c Fri Jan 18 13:01:05 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 233, - /**/ - --- -"I love deadlines. I especially like the whooshing sound they -make as they go flying by." - -- Douglas Adams - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.234 b/7.1.234 deleted file mode 100644 index 03fa34da..00000000 --- a/7.1.234 +++ /dev/null @@ -1,210 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.234 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.234 -Problem: When diff'ing three files the third one isn't displayed correctly. - (Gary Johnson) -Solution: Compute the size of diff blocks correctly when merging blocks. - Compute filler lines correctly when scrolling. -Files: src/diff.c - - -*** ../vim-7.1.233/src/diff.c Fri Oct 19 18:57:33 2007 ---- src/diff.c Fri Jan 18 17:32:31 2008 -*************** -*** 1299,1305 **** - } - else - /* second overlap of new block with existing block */ -! dp->df_count[idx_new] += count_new - count_orig; - - /* Adjust the size of the block to include all the lines to the - * end of the existing block or the new diff, whatever ends last. */ ---- 1299,1307 ---- - } - else - /* second overlap of new block with existing block */ -! dp->df_count[idx_new] += count_new - count_orig -! + dpl->df_lnum[idx_orig] + dpl->df_count[idx_orig] -! - (dp->df_lnum[idx_orig] + dp->df_count[idx_orig]); - - /* Adjust the size of the block to include all the lines to the - * end of the existing block or the new diff, whatever ends last. */ -*************** -*** 1628,1641 **** - win_T *fromwin; - win_T *towin; - { -! buf_T *buf = fromwin->w_buffer; - linenr_T lnum = fromwin->w_topline; -! int idx; - diff_T *dp; - int i; - -! idx = diff_buf_idx(buf); -! if (idx == DB_COUNT) - return; /* safety check */ - - if (curtab->tp_diff_invalid) ---- 1630,1645 ---- - win_T *fromwin; - win_T *towin; - { -! buf_T *frombuf = fromwin->w_buffer; - linenr_T lnum = fromwin->w_topline; -! int fromidx; -! int toidx; - diff_T *dp; -+ int max_count; - int i; - -! fromidx = diff_buf_idx(frombuf); -! if (fromidx == DB_COUNT) - return; /* safety check */ - - if (curtab->tp_diff_invalid) -*************** -*** 1645,1686 **** - - /* search for a change that includes "lnum" in the list of diffblocks. */ - for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next) -! if (lnum <= dp->df_lnum[idx] + dp->df_count[idx]) - break; - if (dp == NULL) - { - /* After last change, compute topline relative to end of file; no - * filler lines. */ - towin->w_topline = towin->w_buffer->b_ml.ml_line_count -! - (buf->b_ml.ml_line_count - lnum); - } - else - { - /* Find index for "towin". */ -! i = diff_buf_idx(towin->w_buffer); -! if (i == DB_COUNT) - return; /* safety check */ - -! towin->w_topline = lnum + (dp->df_lnum[i] - dp->df_lnum[idx]); -! if (lnum >= dp->df_lnum[idx]) - { -! /* Inside a change: compute filler lines. */ -! if (dp->df_count[i] == dp->df_count[idx]) - towin->w_topfill = fromwin->w_topfill; -! else if (dp->df_count[i] > dp->df_count[idx]) - { -! if (lnum == dp->df_lnum[idx] + dp->df_count[idx]) -! towin->w_topline = dp->df_lnum[i] + dp->df_count[i] -! - fromwin->w_topfill; - } -! else - { -! if (towin->w_topline >= dp->df_lnum[i] + dp->df_count[i]) - { -! if (diff_flags & DIFF_FILLER) -! towin->w_topfill = dp->df_lnum[idx] -! + dp->df_count[idx] - lnum; -! towin->w_topline = dp->df_lnum[i] + dp->df_count[i]; - } - } - } ---- 1649,1720 ---- - - /* search for a change that includes "lnum" in the list of diffblocks. */ - for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next) -! if (lnum <= dp->df_lnum[fromidx] + dp->df_count[fromidx]) - break; - if (dp == NULL) - { - /* After last change, compute topline relative to end of file; no - * filler lines. */ - towin->w_topline = towin->w_buffer->b_ml.ml_line_count -! - (frombuf->b_ml.ml_line_count - lnum); - } - else - { - /* Find index for "towin". */ -! toidx = diff_buf_idx(towin->w_buffer); -! if (toidx == DB_COUNT) - return; /* safety check */ - -! towin->w_topline = lnum + (dp->df_lnum[toidx] - dp->df_lnum[fromidx]); -! if (lnum >= dp->df_lnum[fromidx]) - { -! /* Inside a change: compute filler lines. With three or more -! * buffers we need to know the largest count. */ -! max_count = 0; -! for (i = 0; i < DB_COUNT; ++i) -! if (curtab->tp_diffbuf[i] != NULL -! && max_count < dp->df_count[i]) -! max_count = dp->df_count[i]; -! -! if (dp->df_count[toidx] == dp->df_count[fromidx]) -! { -! /* same number of lines: use same filler count */ - towin->w_topfill = fromwin->w_topfill; -! } -! else if (dp->df_count[toidx] > dp->df_count[fromidx]) - { -! if (lnum == dp->df_lnum[fromidx] + dp->df_count[fromidx]) -! { -! /* more lines in towin and fromwin doesn't show diff -! * lines, only filler lines */ -! if (max_count - fromwin->w_topfill >= dp->df_count[toidx]) -! { -! /* towin also only shows filler lines */ -! towin->w_topline = dp->df_lnum[toidx] -! + dp->df_count[toidx]; -! towin->w_topfill = fromwin->w_topfill; -! } -! else -! /* towin still has some diff lines to show */ -! towin->w_topline = dp->df_lnum[toidx] -! + max_count - fromwin->w_topfill; -! } - } -! else if (towin->w_topline >= dp->df_lnum[toidx] -! + dp->df_count[toidx]) - { -! /* less lines in towin and no diff lines to show: compute -! * filler lines */ -! towin->w_topline = dp->df_lnum[toidx] + dp->df_count[toidx]; -! if (diff_flags & DIFF_FILLER) - { -! if (lnum == dp->df_lnum[fromidx] + dp->df_count[fromidx]) -! /* fromwin is also out of diff lines */ -! towin->w_topfill = fromwin->w_topfill; -! else -! /* fromwin has some diff lines */ -! towin->w_topfill = dp->df_lnum[fromidx] -! + max_count - lnum; - } - } - } -*** ../vim-7.1.233/src/version.c Fri Jan 18 13:15:32 2008 ---- src/version.c Fri Jan 18 17:37:32 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 234, - /**/ - --- -ERIC IDLE PLAYED: THE DEAD COLLECTOR, MR BINT (A VILLAGE NE'ER-DO -WELL VERY - KEEN ON BURNING WITCHES), SIR ROBIN, THE GUARD WHO DOESN'T - HICOUGH BUT TRIES TO GET THINGS STRAIGHT, CONCORDE (SIR - LAUNCELOT'S TRUSTY STEED), ROGER THE SHRUBBER (A SHRUBBER), - BROTHER MAYNARD - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.235 b/7.1.235 deleted file mode 100644 index 4ea2e396..00000000 --- a/7.1.235 +++ /dev/null @@ -1,199 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.235 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.235 -Problem: Pattern matching is slow when using a lot of simple patterns. -Solution: Avoid allocating memory by not freeing it when it's not so much. - (Alexei Alexandrov) -Files: src/regexp.c - - -*** ../vim-7.1.234/src/regexp.c Wed Jan 2 15:34:48 2008 ---- src/regexp.c Fri Jan 18 20:35:21 2008 -*************** -*** 378,391 **** - - static char_u *reg_prev_sub = NULL; - -- #if defined(EXITFREE) || defined(PROTO) -- void -- free_regexp_stuff() -- { -- vim_free(reg_prev_sub); -- } -- #endif -- - /* - * REGEXP_INRANGE contains all characters which are always special in a [] - * range after '\'. ---- 378,383 ---- -*************** -*** 3206,3217 **** - } backpos_T; - - /* -! * regstack and backpos are used by regmatch(). They are kept over calls to -! * avoid invoking malloc() and free() often. - */ -! static garray_T regstack; /* stack with regitem_T items, sometimes -! preceded by regstar_T or regbehind_T. */ -! static garray_T backpos; /* table with backpos_T for BACK */ - - /* - * Get pointer to the line "lnum", which is relative to "reg_firstlnum". ---- 3198,3236 ---- - } backpos_T; - - /* -! * "regstack" and "backpos" are used by regmatch(). They are kept over calls -! * to avoid invoking malloc() and free() often. -! * "regstack" is a stack with regitem_T items, sometimes preceded by regstar_T -! * or regbehind_T. -! * "backpos_T" is a table with backpos_T for BACK -! */ -! static garray_T regstack = {0, 0, 0, 0, NULL}; -! static garray_T backpos = {0, 0, 0, 0, NULL}; -! -! /* -! * Both for regstack and backpos tables we use the following strategy of -! * allocation (to reduce malloc/free calls): -! * - Initial size is fairly small. -! * - When needed, the tables are grown bigger (8 times at first, double after -! * that). -! * - After executing the match we free the memory only if the array has grown. -! * Thus the memory is kept allocated when it's at the initial size. -! * This makes it fast while not keeping a lot of memory allocated. -! * A three times speed increase was observed when using many simple patterns. - */ -! #define REGSTACK_INITIAL 2048 -! #define BACKPOS_INITIAL 64 -! -! #if defined(EXITFREE) || defined(PROTO) -! void -! free_regexp_stuff() -! { -! ga_clear(®stack); -! ga_clear(&backpos); -! vim_free(reg_tofree); -! vim_free(reg_prev_sub); -! } -! #endif - - /* - * Get pointer to the line "lnum", which is relative to "reg_firstlnum". -*************** -*** 3346,3360 **** - char_u *s; - long retval = 0L; - -! reg_tofree = NULL; -! -! /* Init the regstack empty. Use an item size of 1 byte, since we push -! * different things onto it. Use a large grow size to avoid reallocating -! * it too often. */ -! ga_init2(®stack, 1, 10000); -! -! /* Init the backpos table empty. */ -! ga_init2(&backpos, sizeof(backpos_T), 10); - - if (REG_MULTI) - { ---- 3365,3389 ---- - char_u *s; - long retval = 0L; - -! /* Create "regstack" and "backpos" if they are not allocated yet. -! * We allocate *_INITIAL amount of bytes first and then set the grow size -! * to much bigger value to avoid many malloc calls in case of deep regular -! * expressions. */ -! if (regstack.ga_data == NULL) -! { -! /* Use an item size of 1 byte, since we push different things -! * onto the regstack. */ -! ga_init2(®stack, 1, REGSTACK_INITIAL); -! ga_grow(®stack, REGSTACK_INITIAL); -! regstack.ga_growsize = REGSTACK_INITIAL * 8; -! } -! -! if (backpos.ga_data == NULL) -! { -! ga_init2(&backpos, sizeof(backpos_T), BACKPOS_INITIAL); -! ga_grow(&backpos, BACKPOS_INITIAL); -! backpos.ga_growsize = BACKPOS_INITIAL * 8; -! } - - if (REG_MULTI) - { -*************** -*** 3525,3533 **** - } - - theend: -! vim_free(reg_tofree); -! ga_clear(®stack); -! ga_clear(&backpos); - - return retval; - } ---- 3554,3570 ---- - } - - theend: -! /* Free "reg_tofree" when it's a bit big. -! * Free regstack and backpos if they are bigger than their initial size. */ -! if (reg_tofreelen > 400) -! { -! vim_free(reg_tofree); -! reg_tofree = NULL; -! } -! if (regstack.ga_maxlen > REGSTACK_INITIAL) -! ga_clear(®stack); -! if (backpos.ga_maxlen > BACKPOS_INITIAL) -! ga_clear(&backpos); - - return retval; - } -*************** -*** 3717,3724 **** - #define RA_MATCH 4 /* successful match */ - #define RA_NOMATCH 5 /* didn't match */ - -! /* Init the regstack and backpos table empty. They are initialized and -! * freed in vim_regexec_both() to reduce malloc()/free() calls. */ - regstack.ga_len = 0; - backpos.ga_len = 0; - ---- 3754,3761 ---- - #define RA_MATCH 4 /* successful match */ - #define RA_NOMATCH 5 /* didn't match */ - -! /* Make "regstack" and "backpos" empty. They are allocated and freed in -! * vim_regexec_both() to reduce malloc()/free() calls. */ - regstack.ga_len = 0; - backpos.ga_len = 0; - -*** ../vim-7.1.234/src/version.c Fri Jan 18 17:39:10 2008 ---- src/version.c Fri Jan 18 20:33:26 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 235, - /**/ - --- -NEIL INNES PLAYED: THE FIRST SELF-DESTRUCTIVE MONK, ROBIN'S LEAST FAVORITE - MINSTREL, THE PAGE CRUSHED BY A RABBIT, THE OWNER OF A DUCK - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.236 b/7.1.236 deleted file mode 100644 index 32944c75..00000000 --- a/7.1.236 +++ /dev/null @@ -1,920 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.236 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.236 -Problem: When using 'incsearch' and 'hlsearch' a complicated pattern may - make Vim hang until CTRL-C is pressed. -Solution: Add the 'redrawtime' option. -Files: runtime/doc/options.txt, src/ex_cmds.c, src/ex_docmd.c, - src/ex_getln.c, src/gui.c, src/misc1.c, src/normal.c, - src/option.c, src/quickfix.c, src/regexp.c, src/proto/regexp.pro, - src/proto/search.pro, src/search.c, src/screen.c, - src/option.h, src/spell.c, src/structs.h, src/syntax.c, src/tag.c, - src/vim.h - - -*** ../vim-7.1.235/runtime/doc/options.txt Sun Aug 12 16:55:01 2007 ---- runtime/doc/options.txt Sat Jan 19 14:01:22 2008 -*************** -*** 3618,3623 **** ---- 3636,3642 ---- - When you get bored looking at the highlighted matches, you can turn it - off with |:nohlsearch|. As soon as you use a search command, the - highlighting comes back. -+ 'redrawtime' specifies the maximum time spend on finding matches. - When the search pattern can match an end-of-line, Vim will try to - highlight all of the matched text. However, this depends on where the - search starts. This will be the first line in the window or the first -*************** -*** 3851,3856 **** ---- 3870,3879 ---- - original position when no match is found and when pressing . You - still need to finish the search command with to move the - cursor to the match. -+ When compiled with the |+reltime| feature Vim only searches for about -+ half a second. With a complicated pattern and/or a lot of text the -+ match may not be found. This is to avoid that Vim hangs while you -+ are typing the pattern. - The highlighting can be set with the 'i' flag in 'highlight'. - See also: 'hlsearch'. - CTRL-L can be used to add one character from after the current match -*************** -*** 5185,5190 **** ---- 5210,5227 ---- - {not in Vi:} When using the ":view" command the 'readonly' option is - set for the newly edited buffer. - -+ *'redrawtime'* *'rdt'* -+ 'redrawtime' 'rdt' number (default 2000) -+ global -+ {not in Vi} -+ {only available when compiled with the |+reltime| -+ feature} -+ The time in milliseconds for redrawing the display. This applies to -+ searching for patterns for 'hlsearch' and |:match| highlighting. -+ When redrawing takes more than this many milliseconds no further -+ matches will be highlighted. This is used to avoid that Vim hangs -+ when using a very complicated pattern. -+ - *'remap'* *'noremap'* - 'remap' boolean (default on) - global -*** ../vim-7.1.235/src/ex_cmds.c Sun Jan 13 13:30:34 2008 ---- src/ex_cmds.c Sat Jan 19 13:04:28 2008 -*************** -*** 4446,4452 **** - #endif - ); ++lnum) - { -! nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0); - if (nmatch) - { - colnr_T copycol; ---- 4446,4453 ---- - #endif - ); ++lnum) - { -! nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, -! (colnr_T)0, NULL); - if (nmatch) - { - colnr_T copycol; -*************** -*** 4957,4963 **** - || (do_ask && !re_lookbehind(regmatch.regprog)) - || nmatch_tl > 0 - || (nmatch = vim_regexec_multi(®match, curwin, -! curbuf, sub_firstlnum, matchcol)) == 0 - || regmatch.startpos[0].lnum > 0) - { - if (new_start != NULL) ---- 4958,4965 ---- - || (do_ask && !re_lookbehind(regmatch.regprog)) - || nmatch_tl > 0 - || (nmatch = vim_regexec_multi(®match, curwin, -! curbuf, sub_firstlnum, -! matchcol, NULL)) == 0 - || regmatch.startpos[0].lnum > 0) - { - if (new_start != NULL) -*************** -*** 5022,5028 **** - } - if (nmatch == -1 && !lastone) - nmatch = vim_regexec_multi(®match, curwin, curbuf, -! sub_firstlnum, matchcol); - - /* - * 5. break if there isn't another match in this line ---- 5024,5030 ---- - } - if (nmatch == -1 && !lastone) - nmatch = vim_regexec_multi(®match, curwin, curbuf, -! sub_firstlnum, matchcol, NULL); - - /* - * 5. break if there isn't another match in this line -*************** -*** 5252,5258 **** - for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum) - { - /* a match on this line? */ -! match = vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0); - if ((type == 'g' && match) || (type == 'v' && !match)) - { - ml_setmarked(lnum); ---- 5254,5261 ---- - for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum) - { - /* a match on this line? */ -! match = vim_regexec_multi(®match, curwin, curbuf, lnum, -! (colnr_T)0, NULL); - if ((type == 'g' && match) || (type == 'v' && !match)) - { - ml_setmarked(lnum); -*** ../vim-7.1.235/src/ex_docmd.c Sun Jan 13 17:11:25 2008 ---- src/ex_docmd.c Fri Jan 18 21:01:16 2008 -*************** -*** 3931,3937 **** - curwin->w_cursor.col = 0; - searchcmdlen = 0; - if (!do_search(NULL, c, cmd, 1L, -! SEARCH_HIS + SEARCH_MSG + SEARCH_START)) - { - curwin->w_cursor = pos; - cmd = NULL; ---- 3931,3938 ---- - curwin->w_cursor.col = 0; - searchcmdlen = 0; - if (!do_search(NULL, c, cmd, 1L, -! SEARCH_HIS + SEARCH_MSG + SEARCH_START, -! NULL)) - { - curwin->w_cursor = pos; - cmd = NULL; -*** ../vim-7.1.235/src/ex_getln.c Fri Jan 18 13:15:32 2008 ---- src/ex_getln.c Fri Jan 18 21:34:42 2008 -*************** -*** 1709,1714 **** ---- 1709,1717 ---- - if (p_is && !cmd_silent && (firstc == '/' || firstc == '?')) - { - pos_T end_pos; -+ #ifdef FEAT_RELTIME -+ proftime_T tm; -+ #endif - - /* if there is a character waiting, search and redraw later */ - if (char_avail()) -*************** -*** 1727,1734 **** - cursor_off(); /* so the user knows we're busy */ - out_flush(); - ++emsg_off; /* So it doesn't beep if bad expr */ - i = do_search(NULL, firstc, ccline.cmdbuff, count, -! SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK); - --emsg_off; - /* if interrupted while searching, behave like it failed */ - if (got_int) ---- 1730,1747 ---- - cursor_off(); /* so the user knows we're busy */ - out_flush(); - ++emsg_off; /* So it doesn't beep if bad expr */ -+ #ifdef FEAT_RELTIME -+ /* Set the time limit to half a second. */ -+ profile_setlimit(500L, &tm); -+ #endif - i = do_search(NULL, firstc, ccline.cmdbuff, count, -! SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK, -! #ifdef FEAT_RELTIME -! &tm -! #else -! NULL -! #endif -! ); - --emsg_off; - /* if interrupted while searching, behave like it failed */ - if (got_int) -*** ../vim-7.1.235/src/gui.c Thu Jan 3 16:14:25 2008 ---- src/gui.c Fri Jan 18 21:01:36 2008 -*************** -*** 5052,5058 **** - /* Search for the next match. */ - i = msg_scroll; - do_search(NULL, down ? '/' : '?', ga.ga_data, 1L, -! SEARCH_MSG + SEARCH_MARK); - msg_scroll = i; /* don't let an error message set msg_scroll */ - } - ---- 5052,5058 ---- - /* Search for the next match. */ - i = msg_scroll; - do_search(NULL, down ? '/' : '?', ga.ga_data, 1L, -! SEARCH_MSG + SEARCH_MARK, NULL); - msg_scroll = i; /* don't let an error message set msg_scroll */ - } - -*** ../vim-7.1.235/src/misc1.c Thu Jan 3 12:42:38 2008 ---- src/misc1.c Sat Jan 19 13:04:39 2008 -*************** -*** 437,443 **** - { - regmatch.rmm_ic = FALSE; - regmatch.rmm_maxcol = 0; -! if (vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0)) - { - pos.lnum = regmatch.endpos[0].lnum + lnum; - pos.col = regmatch.endpos[0].col; ---- 437,444 ---- - { - regmatch.rmm_ic = FALSE; - regmatch.rmm_maxcol = 0; -! if (vim_regexec_multi(®match, curwin, curbuf, lnum, -! (colnr_T)0, NULL)) - { - pos.lnum = regmatch.endpos[0].lnum + lnum; - pos.col = regmatch.endpos[0].col; -*** ../vim-7.1.235/src/normal.c Sat Jan 12 17:11:25 2008 ---- src/normal.c Fri Jan 18 21:01:47 2008 -*************** -*** 6093,6099 **** - curwin->w_set_curswant = TRUE; - - i = do_search(cap->oap, dir, pat, cap->count1, -! opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG); - if (i == 0) - clearop(cap->oap); - else ---- 6093,6099 ---- - curwin->w_set_curswant = TRUE; - - i = do_search(cap->oap, dir, pat, cap->count1, -! opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG, NULL); - if (i == 0) - clearop(cap->oap); - else -*** ../vim-7.1.235/src/option.c Tue Oct 2 20:40:01 2007 ---- src/option.c Sat Jan 19 13:44:33 2008 -*************** -*** 1991,1996 **** ---- 1991,2003 ---- - {"redraw", NULL, P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, - {(char_u *)FALSE, (char_u *)0L}}, -+ {"redrawtime", "rdt", P_NUM|P_VI_DEF, -+ #ifdef FEAT_RELTIME -+ (char_u *)&p_rdt, PV_NONE, -+ #else -+ (char_u *)NULL, PV_NONE, -+ #endif -+ {(char_u *)2000L, (char_u *)0L}}, - {"remap", NULL, P_BOOL|P_VI_DEF, - (char_u *)&p_remap, PV_NONE, - {(char_u *)TRUE, (char_u *)0L}}, -*** ../vim-7.1.235/src/quickfix.c Sun Sep 30 14:00:41 2007 ---- src/quickfix.c Sat Jan 19 13:04:53 2008 -*************** -*** 1803,1809 **** - /* Move the cursor to the first line in the buffer */ - save_cursor = curwin->w_cursor; - curwin->w_cursor.lnum = 0; -! if (!do_search(NULL, '/', qf_ptr->qf_pattern, (long)1, SEARCH_KEEP)) - curwin->w_cursor = save_cursor; - } - ---- 1803,1810 ---- - /* Move the cursor to the first line in the buffer */ - save_cursor = curwin->w_cursor; - curwin->w_cursor.lnum = 0; -! if (!do_search(NULL, '/', qf_ptr->qf_pattern, (long)1, -! SEARCH_KEEP, NULL)) - curwin->w_cursor = save_cursor; - } - -*************** -*** 3159,3165 **** - { - col = 0; - while (vim_regexec_multi(®match, curwin, buf, lnum, -! col) > 0) - { - ; - if (qf_add_entry(qi, &prevp, ---- 3160,3166 ---- - { - col = 0; - while (vim_regexec_multi(®match, curwin, buf, lnum, -! col, NULL) > 0) - { - ; - if (qf_add_entry(qi, &prevp, -*** ../vim-7.1.235/src/regexp.c Fri Jan 18 20:36:40 2008 ---- src/regexp.c Sat Jan 19 15:18:12 2008 -*************** -*** 3040,3046 **** - } save_se_T; - - static char_u *reg_getline __ARGS((linenr_T lnum)); -! static long vim_regexec_both __ARGS((char_u *line, colnr_T col)); - static long regtry __ARGS((regprog_T *prog, colnr_T col)); - static void cleanup_subexpr __ARGS((void)); - #ifdef FEAT_SYN_HL ---- 3040,3046 ---- - } save_se_T; - - static char_u *reg_getline __ARGS((linenr_T lnum)); -! static long vim_regexec_both __ARGS((char_u *line, colnr_T col, proftime_T *tm)); - static long regtry __ARGS((regprog_T *prog, colnr_T col)); - static void cleanup_subexpr __ARGS((void)); - #ifdef FEAT_SYN_HL -*************** -*** 3284,3290 **** - ireg_icombine = FALSE; - #endif - ireg_maxcol = 0; -! return (vim_regexec_both(line, col) != 0); - } - - #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \ ---- 3284,3290 ---- - ireg_icombine = FALSE; - #endif - ireg_maxcol = 0; -! return (vim_regexec_both(line, col, NULL) != 0); - } - - #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \ -*************** -*** 3308,3314 **** - ireg_icombine = FALSE; - #endif - ireg_maxcol = 0; -! return (vim_regexec_both(line, col) != 0); - } - #endif - ---- 3308,3314 ---- - ireg_icombine = FALSE; - #endif - ireg_maxcol = 0; -! return (vim_regexec_both(line, col, NULL) != 0); - } - #endif - -*************** -*** 3321,3332 **** - * match otherwise. - */ - long -! vim_regexec_multi(rmp, win, buf, lnum, col) - regmmatch_T *rmp; - win_T *win; /* window in which to search or NULL */ - buf_T *buf; /* buffer in which to search */ - linenr_T lnum; /* nr of line to start looking for match */ - colnr_T col; /* column to start looking for match */ - { - long r; - buf_T *save_curbuf = curbuf; ---- 3321,3333 ---- - * match otherwise. - */ - long -! vim_regexec_multi(rmp, win, buf, lnum, col, tm) - regmmatch_T *rmp; - win_T *win; /* window in which to search or NULL */ - buf_T *buf; /* buffer in which to search */ - linenr_T lnum; /* nr of line to start looking for match */ - colnr_T col; /* column to start looking for match */ -+ proftime_T *tm; /* timeout limit or NULL */ - { - long r; - buf_T *save_curbuf = curbuf; -*************** -*** 3346,3352 **** - - /* Need to switch to buffer "buf" to make vim_iswordc() work. */ - curbuf = buf; -! r = vim_regexec_both(NULL, col); - curbuf = save_curbuf; - - return r; ---- 3347,3353 ---- - - /* Need to switch to buffer "buf" to make vim_iswordc() work. */ - curbuf = buf; -! r = vim_regexec_both(NULL, col, tm); - curbuf = save_curbuf; - - return r; -*************** -*** 3356,3365 **** - * Match a regexp against a string ("line" points to the string) or multiple - * lines ("line" is NULL, use reg_getline()). - */ - static long -! vim_regexec_both(line, col) - char_u *line; - colnr_T col; /* column to start looking for match */ - { - regprog_T *prog; - char_u *s; ---- 3357,3368 ---- - * Match a regexp against a string ("line" points to the string) or multiple - * lines ("line" is NULL, use reg_getline()). - */ -+ /*ARGSUSED*/ - static long -! vim_regexec_both(line, col, tm) - char_u *line; - colnr_T col; /* column to start looking for match */ -+ proftime_T *tm; /* timeout limit or NULL */ - { - regprog_T *prog; - char_u *s; -*************** -*** 3502,3507 **** ---- 3505,3513 ---- - } - else - { -+ #ifdef FEAT_RELTIME -+ int tm_count = 0; -+ #endif - /* Messy cases: unanchored match. */ - while (!got_int) - { -*************** -*** 3550,3555 **** ---- 3556,3570 ---- - else - #endif - ++col; -+ #ifdef FEAT_RELTIME -+ /* Check for timeout once in a twenty times to avoid overhead. */ -+ if (tm != NULL && ++tm_count == 20) -+ { -+ tm_count = 0; -+ if (profile_passed_limit(tm)) -+ break; -+ } -+ #endif - } - } - -*** ../vim-7.1.235/src/proto/regexp.pro Sat May 5 19:42:08 2007 ---- src/proto/regexp.pro Sat Jan 19 13:14:09 2008 -*************** -*** 1,13 **** - /* regexp.c */ -- void free_regexp_stuff __ARGS((void)); - int re_multiline __ARGS((regprog_T *prog)); - int re_lookbehind __ARGS((regprog_T *prog)); - char_u *skip_regexp __ARGS((char_u *startp, int dirc, int magic, char_u **newp)); - regprog_T *vim_regcomp __ARGS((char_u *expr, int re_flags)); - int vim_regcomp_had_eol __ARGS((void)); - int vim_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); - int vim_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); -! long vim_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col)); - reg_extmatch_T *ref_extmatch __ARGS((reg_extmatch_T *em)); - void unref_extmatch __ARGS((reg_extmatch_T *em)); - char_u *regtilde __ARGS((char_u *source, int magic)); ---- 1,13 ---- - /* regexp.c */ - int re_multiline __ARGS((regprog_T *prog)); - int re_lookbehind __ARGS((regprog_T *prog)); - char_u *skip_regexp __ARGS((char_u *startp, int dirc, int magic, char_u **newp)); - regprog_T *vim_regcomp __ARGS((char_u *expr, int re_flags)); - int vim_regcomp_had_eol __ARGS((void)); -+ void free_regexp_stuff __ARGS((void)); - int vim_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); - int vim_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); -! long vim_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm)); - reg_extmatch_T *ref_extmatch __ARGS((reg_extmatch_T *em)); - void unref_extmatch __ARGS((reg_extmatch_T *em)); - char_u *regtilde __ARGS((char_u *source, int magic)); -*** ../vim-7.1.235/src/proto/search.pro Sun Jan 6 20:05:36 2008 ---- src/proto/search.pro Fri Jan 18 21:03:49 2008 -*************** -*** 11,17 **** - void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast)); - void last_pat_prog __ARGS((regmmatch_T *regmatch)); - int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum, proftime_T *tm)); -! int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options)); - int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat)); - int searchc __ARGS((cmdarg_T *cap, int t_cmd)); - pos_T *findmatch __ARGS((oparg_T *oap, int initc)); ---- 11,17 ---- - void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast)); - void last_pat_prog __ARGS((regmmatch_T *regmatch)); - int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum, proftime_T *tm)); -! int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options, proftime_T *tm)); - int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat)); - int searchc __ARGS((cmdarg_T *cap, int t_cmd)); - pos_T *findmatch __ARGS((oparg_T *oap, int initc)); -*** ../vim-7.1.235/src/search.c Sun Jan 6 20:05:36 2008 ---- src/search.c Sat Jan 19 13:13:25 2008 -*************** -*** 606,612 **** - * Look for a match somewhere in line "lnum". - */ - nmatched = vim_regexec_multi(®match, win, buf, -! lnum, (colnr_T)0); - /* Abort searching on an error (e.g., out of stack). */ - if (called_emsg) - break; ---- 606,618 ---- - * Look for a match somewhere in line "lnum". - */ - nmatched = vim_regexec_multi(®match, win, buf, -! lnum, (colnr_T)0, -! #ifdef FEAT_RELTIME -! tm -! #else -! NULL -! #endif -! ); - /* Abort searching on an error (e.g., out of stack). */ - if (called_emsg) - break; -*************** -*** 615,623 **** - /* match may actually be in another line when using \zs */ - matchpos = regmatch.startpos[0]; - endpos = regmatch.endpos[0]; -! # ifdef FEAT_EVAL - submatch = first_submatch(®match); -! # endif - /* Line me be past end of buffer for "\n\zs". */ - if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) - ptr = (char_u *)""; ---- 621,629 ---- - /* match may actually be in another line when using \zs */ - matchpos = regmatch.startpos[0]; - endpos = regmatch.endpos[0]; -! #ifdef FEAT_EVAL - submatch = first_submatch(®match); -! #endif - /* Line me be past end of buffer for "\n\zs". */ - if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) - ptr = (char_u *)""; -*************** -*** 693,699 **** - if (ptr[matchcol] == NUL - || (nmatched = vim_regexec_multi(®match, - win, buf, lnum + matchpos.lnum, -! matchcol)) == 0) - { - match_ok = FALSE; - break; ---- 699,711 ---- - if (ptr[matchcol] == NUL - || (nmatched = vim_regexec_multi(®match, - win, buf, lnum + matchpos.lnum, -! matchcol, -! #ifdef FEAT_RELTIME -! tm -! #else -! NULL -! #endif -! )) == 0) - { - match_ok = FALSE; - break; -*************** -*** 799,805 **** - if (ptr[matchcol] == NUL - || (nmatched = vim_regexec_multi(®match, - win, buf, lnum + matchpos.lnum, -! matchcol)) == 0) - break; - - /* Need to get the line pointer again, a ---- 811,823 ---- - if (ptr[matchcol] == NUL - || (nmatched = vim_regexec_multi(®match, - win, buf, lnum + matchpos.lnum, -! matchcol, -! #ifdef FEAT_RELTIME -! tm -! #else -! NULL -! #endif -! )) == 0) - break; - - /* Need to get the line pointer again, a -*************** -*** 977,988 **** - * return 0 for failure, 1 for found, 2 for found and line offset added - */ - int -! do_search(oap, dirc, pat, count, options) - oparg_T *oap; /* can be NULL */ - int dirc; /* '/' or '?' */ - char_u *pat; - long count; - int options; - { - pos_T pos; /* position of the last match */ - char_u *searchstr; ---- 995,1007 ---- - * return 0 for failure, 1 for found, 2 for found and line offset added - */ - int -! do_search(oap, dirc, pat, count, options, tm) - oparg_T *oap; /* can be NULL */ - int dirc; /* '/' or '?' */ - char_u *pat; - long count; - int options; -+ proftime_T *tm; /* timeout limit or NULL */ - { - pos_T pos; /* position of the last match */ - char_u *searchstr; -*************** -*** 1256,1262 **** - (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS - + SEARCH_MSG + SEARCH_START - + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))), -! RE_LAST, (linenr_T)0, NULL); - - if (dircp != NULL) - *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */ ---- 1275,1281 ---- - (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS - + SEARCH_MSG + SEARCH_START - + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))), -! RE_LAST, (linenr_T)0, tm); - - if (dircp != NULL) - *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */ -*** ../vim-7.1.235/src/screen.c Sat Jan 12 16:45:25 2008 ---- src/screen.c Sat Jan 19 13:52:29 2008 -*************** -*** 848,858 **** ---- 848,863 ---- - cur->hl.buf = buf; - cur->hl.lnum = 0; - cur->hl.first_lnum = 0; -+ # ifdef FEAT_RELTIME -+ /* Set the time limit to 'redrawtime'. */ -+ profile_setlimit(p_rdt, &(cur->hl.tm)); -+ # endif - cur = cur->next; - } - search_hl.buf = buf; - search_hl.lnum = 0; - search_hl.first_lnum = 0; -+ /* time limit is set at the toplevel, for all windows */ - #endif - - #ifdef FEAT_LINEBREAK -*************** -*** 6462,6467 **** ---- 6467,6476 ---- - { - last_pat_prog(&search_hl.rm); - search_hl.attr = hl_attr(HLF_L); -+ # ifdef FEAT_RELTIME -+ /* Set the time limit to 'redrawtime'. */ -+ profile_setlimit(p_rdt, &search_hl.tm); -+ # endif - } - } - -*************** -*** 6587,6592 **** ---- 6596,6609 ---- - called_emsg = FALSE; - for (;;) - { -+ #ifdef FEAT_RELTIME -+ /* Stop searching after passing the time limit. */ -+ if (profile_passed_limit(&(shl->tm))) -+ { -+ shl->lnum = 0; /* no match found in time */ -+ break; -+ } -+ #endif - /* Three situations: - * 1. No useful previous match: search from start of line. - * 2. Not Vi compatible or empty match: continue at next character. -*************** -*** 6620,6626 **** - matchcol = shl->rm.endpos[0].col; - - shl->lnum = lnum; -! nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol); - if (called_emsg) - { - /* Error while handling regexp: stop using this regexp. */ ---- 6637,6649 ---- - matchcol = shl->rm.endpos[0].col; - - shl->lnum = lnum; -! nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol, -! #ifdef FEAT_RELTIME -! &(shl->tm) -! #else -! NULL -! #endif -! ); - if (called_emsg) - { - /* Error while handling regexp: stop using this regexp. */ -*** ../vim-7.1.235/src/option.h Thu May 10 20:34:47 2007 ---- src/option.h Sat Jan 19 13:45:51 2008 -*************** -*** 633,638 **** ---- 633,641 ---- - #ifdef FEAT_SEARCHPATH - EXTERN char_u *p_cdpath; /* 'cdpath' */ - #endif -+ #ifdef FEAT_RELTIME -+ EXTERN long p_rdt; /* 'redrawtime' */ -+ #endif - EXTERN int p_remap; /* 'remap' */ - EXTERN long p_report; /* 'report' */ - #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) -*** ../vim-7.1.235/src/spell.c Sat Jan 12 16:45:25 2008 ---- src/spell.c Fri Jan 18 21:02:47 2008 -*************** -*** 10343,10349 **** - curwin->w_cursor.lnum = 0; - while (!got_int) - { -! if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP) == 0 - || u_save_cursor() == FAIL) - break; - ---- 10343,10349 ---- - curwin->w_cursor.lnum = 0; - while (!got_int) - { -! if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP, NULL) == 0 - || u_save_cursor() == FAIL) - break; - -*** ../vim-7.1.235/src/structs.h Mon Oct 1 22:53:27 2007 ---- src/structs.h Fri Jan 18 21:18:53 2008 -*************** -*** 1717,1722 **** ---- 1717,1725 ---- - linenr_T first_lnum; /* first lnum to search for multi-line pat */ - colnr_T startcol; /* in win_line() points to char where HL starts */ - colnr_T endcol; /* in win_line() points to char where HL ends */ -+ #ifdef FEAT_RELTIME -+ proftime_T tm; /* for a time limit */ -+ #endif - } match_T; - - /* -*** ../vim-7.1.235/src/syntax.c Sun Jan 13 17:39:29 2008 ---- src/syntax.c Sat Jan 19 13:13:49 2008 -*************** -*** 3097,3103 **** - colnr_T col; - { - rmp->rmm_maxcol = syn_buf->b_p_smc; -! if (vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col) > 0) - { - rmp->startpos[0].lnum += lnum; - rmp->endpos[0].lnum += lnum; ---- 3097,3103 ---- - colnr_T col; - { - rmp->rmm_maxcol = syn_buf->b_p_smc; -! if (vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col, NULL) > 0) - { - rmp->startpos[0].lnum += lnum; - rmp->endpos[0].lnum += lnum; -*** ../vim-7.1.235/src/tag.c Thu May 10 19:44:07 2007 ---- src/tag.c Fri Jan 18 21:03:41 2008 -*************** -*** 3191,3197 **** - #endif - save_lnum = curwin->w_cursor.lnum; - curwin->w_cursor.lnum = 0; /* start search before first line */ -! if (do_search(NULL, pbuf[0], pbuf + 1, (long)1, search_options)) - retval = OK; - else - { ---- 3191,3198 ---- - #endif - save_lnum = curwin->w_cursor.lnum; - curwin->w_cursor.lnum = 0; /* start search before first line */ -! if (do_search(NULL, pbuf[0], pbuf + 1, (long)1, -! search_options, NULL)) - retval = OK; - else - { -*************** -*** 3203,3209 **** - */ - p_ic = TRUE; - if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1, -! search_options)) - { - /* - * Failed to find pattern, take a guess: "^func (" ---- 3204,3210 ---- - */ - p_ic = TRUE; - if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1, -! search_options, NULL)) - { - /* - * Failed to find pattern, take a guess: "^func (" -*************** -*** 3213,3225 **** - cc = *tagp.tagname_end; - *tagp.tagname_end = NUL; - sprintf((char *)pbuf, "^%s\\s\\*(", tagp.tagname); -! if (!do_search(NULL, '/', pbuf, (long)1, search_options)) - { - /* Guess again: "^char * \ /* for access() */ - - # define stat(a,b) (access(a,0) ? -1 : stat(a,b)) -- #endif -- -- #if (defined(FEAT_PROFILE) || defined(FEAT_RELTIME)) && !defined(PROTO) -- # ifdef WIN3264 -- typedef LARGE_INTEGER proftime_T; -- # else -- typedef struct timeval proftime_T; -- # endif -- #else -- typedef int proftime_T; /* dummy for function prototypes */ - #endif - - #include "ex_cmds.h" /* Ex command defines */ ---- 1770,1775 ---- -*** ../vim-7.1.235/src/version.c Fri Jan 18 20:36:40 2008 ---- src/version.c Sat Jan 19 15:19:48 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 236, - /**/ - --- -Every time I lose weight, it finds me again! - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.237 b/7.1.237 deleted file mode 100644 index c631d95a..00000000 --- a/7.1.237 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.237 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.237 -Problem: Compiler warning on an Alpha processor in Motif code. -Solution: Change a typecast. (Adri Verhoef) -Files: src/gui_motif.c - - -*** ../vim-7.1.236/src/gui_motif.c Thu May 10 19:51:05 2007 ---- src/gui_motif.c Mon Jan 21 21:03:55 2008 -*************** -*** 3813,3819 **** - - XtAddCallback(frdp->find, XmNactivateCallback, - find_replace_callback, -! (XtPointer) (do_replace ? FRD_R_FINDNEXT : FRD_FINDNEXT)); - - if (do_replace) - { ---- 3813,3819 ---- - - XtAddCallback(frdp->find, XmNactivateCallback, - find_replace_callback, -! (do_replace ? (XtPointer)FRD_R_FINDNEXT : (XtPointer)FRD_FINDNEXT)); - - if (do_replace) - { -*** ../vim-7.1.236/src/version.c Sat Jan 19 15:55:51 2008 ---- src/version.c Tue Jan 22 11:05:12 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 237, - /**/ - --- -I am always surprised in the Linux world how quickly solutions can be -obtained. (Imagine sending an email to Bill Gates, asking why Windows -crashed, and how to fix it... and then getting an answer that fixed the -problem... <0>_<0> !) -- Mark Langdon - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.238 b/7.1.238 deleted file mode 100644 index e7b6a6fe..00000000 --- a/7.1.238 +++ /dev/null @@ -1,61 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.238 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.238 -Problem: Using the 'c' flag with searchpair() may cause it to fail. Using - the 'r' flag doesn't work when 'wrapscan' is set. (A.Politz) -Solution: Only use the 'c' flag for the first search, not for repeating. - When using 'r' imply 'W'. (Antony Scriven) -Files: src/eval.c - - -*** ../vim-7.1.237/src/eval.c Sat Jan 12 16:45:25 2008 ---- src/eval.c Tue Jan 22 11:42:28 2008 -*************** -*** 14189,14194 **** ---- 14189,14198 ---- - goto theend; - } - -+ /* Using 'r' implies 'W', otherwise it doesn't work. */ -+ if (flags & SP_REPEAT) -+ p_ws = FALSE; -+ - /* Optional fifth argument: skip expression */ - if (argvars[3].v_type == VAR_UNKNOWN - || argvars[4].v_type == VAR_UNKNOWN) -*************** -*** 14344,14349 **** ---- 14348,14356 ---- - incl(&pos); - } - foundpos = pos; -+ -+ /* clear the start flag to avoid getting stuck here */ -+ options &= ~SEARCH_START; - - /* If the skip pattern matches, ignore this match. */ - if (*skip != NUL) -*** ../vim-7.1.237/src/version.c Tue Jan 22 11:06:06 2008 ---- src/version.c Tue Jan 22 11:57:28 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 238, - /**/ - --- -To keep milk from turning sour: Keep it in the cow. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.239 b/7.1.239 deleted file mode 100644 index dca05345..00000000 --- a/7.1.239 +++ /dev/null @@ -1,53 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.239 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.239 (after 7.1.233) -Problem: Compiler warning for sprintf() argument. -Solution: Add a typecast. (Nico Weber) -Files: src/ex_getln.c - - -*** ../vim-7.1.238/src/ex_getln.c Sat Jan 19 15:55:51 2008 ---- src/ex_getln.c Tue Jan 22 12:40:54 2008 -*************** -*** 4694,4700 **** - { - /* Completion from Insert mode, pass fake arguments. */ - keep = 0; -! sprintf((char *)num, "%d", STRLEN(xp->xp_pattern)); - args[1] = xp->xp_pattern; - } - else ---- 4694,4700 ---- - { - /* Completion from Insert mode, pass fake arguments. */ - keep = 0; -! sprintf((char *)num, "%d", (int)STRLEN(xp->xp_pattern)); - args[1] = xp->xp_pattern; - } - else -*** ../vim-7.1.238/src/version.c Tue Jan 22 11:58:41 2008 ---- src/version.c Tue Jan 22 12:42:36 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 239, - /**/ - --- -We apologise again for the fault in the subtitles. Those responsible for -sacking the people who have just been sacked have been sacked. - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.240 b/7.1.240 deleted file mode 100644 index 7f690850..00000000 --- a/7.1.240 +++ /dev/null @@ -1,186 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.240 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.240 -Problem: When "gUe" turns a German sharp s into SS the operation stops - before the end of the word. Latin2 has the same sharp s but it's - not changed to SS there. -Solution: Make sure all the characters are operated upon. Detect the sharp - s in latin2. Also fixes that changing case of a multi-byte - character that changes the byte cound doesn't always work. -Files: src/ops.c - - -*** ../vim-7.1.239/src/ops.c Wed Jan 16 20:01:14 2008 ---- src/ops.c Tue Jan 22 16:00:07 2008 -*************** -*** 2184,2189 **** ---- 2184,2191 ---- - } - #endif - -+ static int swapchars __ARGS((int op_type, pos_T *pos, int length)); -+ - /* - * Handle the (non-standard vi) tilde operator. Also for "gu", "gU" and "g?". - */ -*************** -*** 2194,2202 **** - pos_T pos; - #ifdef FEAT_VISUAL - struct block_def bd; -- int todo; - #endif -! int did_change = 0; - - if (u_save((linenr_T)(oap->start.lnum - 1), - (linenr_T)(oap->end.lnum + 1)) == FAIL) ---- 2196,2203 ---- - pos_T pos; - #ifdef FEAT_VISUAL - struct block_def bd; - #endif -! int did_change; - - if (u_save((linenr_T)(oap->start.lnum - 1), - (linenr_T)(oap->end.lnum + 1)) == FAIL) -*************** -*** 2210,2225 **** - { - block_prep(oap, &bd, pos.lnum, FALSE); - pos.col = bd.textcol; -! for (todo = bd.textlen; todo > 0; --todo) -! { -! # ifdef FEAT_MBYTE -! if (has_mbyte) -! todo -= (*mb_ptr2len)(ml_get_pos(&pos)) - 1; -! # endif -! did_change |= swapchar(oap->op_type, &pos); -! if (inc(&pos) == -1) /* at end of file */ -! break; -! } - # ifdef FEAT_NETBEANS_INTG - if (usingNetbeans && did_change) - { ---- 2211,2218 ---- - { - block_prep(oap, &bd, pos.lnum, FALSE); - pos.col = bd.textcol; -! did_change = swapchars(oap->op_type, &pos, bd.textlen); -! - # ifdef FEAT_NETBEANS_INTG - if (usingNetbeans && did_change) - { -*************** -*** 2249,2261 **** - else if (!oap->inclusive) - dec(&(oap->end)); - -! while (ltoreq(pos, oap->end)) -! { -! did_change |= swapchar(oap->op_type, &pos); -! if (inc(&pos) == -1) /* at end of file */ -! break; -! } -! - if (did_change) - { - changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, ---- 2242,2248 ---- - else if (!oap->inclusive) - dec(&(oap->end)); - -! did_change = swapchars(oap->op_type, &pos, oap->end.col - pos.col + 1); - if (did_change) - { - changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, -*************** -*** 2309,2314 **** ---- 2296,2337 ---- - } - - /* -+ * Invoke swapchar() on "length" bytes at position "pos". -+ * "pos" is advanced to just after the changed characters. -+ * "length" is rounded up to include the whole last multi-byte character. -+ * Also works correctly when the number of bytes changes. -+ * Returns TRUE if some character was changed. -+ */ -+ static int -+ swapchars(op_type, pos, length) -+ int op_type; -+ pos_T *pos; -+ int length; -+ { -+ int todo; -+ int did_change = 0; -+ -+ for (todo = length; todo > 0; --todo) -+ { -+ # ifdef FEAT_MBYTE -+ int pos_col = pos->col; -+ -+ if (has_mbyte) -+ /* we're counting bytes, not characters */ -+ todo -= (*mb_ptr2len)(ml_get_pos(pos)) - 1; -+ # endif -+ did_change |= swapchar(op_type, pos); -+ # ifdef FEAT_MBYTE -+ /* Changing German sharp s to SS increases the column. */ -+ todo += pos->col - pos_col; -+ # endif -+ if (inc(pos) == -1) /* at end of file */ -+ break; -+ } -+ return did_change; -+ } -+ -+ /* - * If op_type == OP_UPPER: make uppercase, - * if op_type == OP_LOWER: make lowercase, - * if op_type == OP_ROT13: do rot13 encoding, -*************** -*** 2330,2336 **** - return FALSE; - - #ifdef FEAT_MBYTE -! if (op_type == OP_UPPER && enc_latin1like && c == 0xdf) - { - pos_T sp = curwin->w_cursor; - ---- 2353,2360 ---- - return FALSE; - - #ifdef FEAT_MBYTE -! if (op_type == OP_UPPER && c == 0xdf -! && (enc_latin1like || STRCMP(p_enc, "iso-8859-2") == 0)) - { - pos_T sp = curwin->w_cursor; - -*** ../vim-7.1.239/src/version.c Tue Jan 22 12:44:03 2008 ---- src/version.c Tue Jan 22 15:36:36 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 240, - /**/ - --- -ARTHUR: It is I, Arthur, son of Uther Pendragon, from the castle of Camelot. - King of all Britons, defeator of the Saxons, sovereign of all England! - [Pause] -SOLDIER: Get away! - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.241 b/7.1.241 deleted file mode 100644 index 4a04c690..00000000 --- a/7.1.241 +++ /dev/null @@ -1,112 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.241 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.241 -Problem: Focus change events not always ignored. (Erik Falor) -Solution: Ignore K_IGNORE in Insert mode in a few more places. -Files: src/edit.c - - -*** ../vim-7.1.240/src/edit.c Wed Jan 16 20:01:14 2008 ---- src/edit.c Tue Jan 22 17:45:32 2008 -*************** -*** 703,712 **** - #endif - - /* -! * Get a character for Insert mode. - */ - lastc = c; /* remember previous char for CTRL-D */ -! c = safe_vgetc(); - - #ifdef FEAT_AUTOCMD - /* Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. */ ---- 703,715 ---- - #endif - - /* -! * Get a character for Insert mode. Ignore K_IGNORE. - */ - lastc = c; /* remember previous char for CTRL-D */ -! do -! { -! c = safe_vgetc(); -! } while (c == K_IGNORE); - - #ifdef FEAT_AUTOCMD - /* Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. */ -*************** -*** 777,783 **** - /* Prepare for or stop CTRL-X mode. This doesn't do completion, but - * it does fix up the text when finishing completion. */ - compl_get_longest = FALSE; -! if (c != K_IGNORE && ins_compl_prep(c)) - continue; - #endif - ---- 780,786 ---- - /* Prepare for or stop CTRL-X mode. This doesn't do completion, but - * it does fix up the text when finishing completion. */ - compl_get_longest = FALSE; -! if (ins_compl_prep(c)) - continue; - #endif - -*************** -*** 4516,4530 **** - else - { - /* Need to get the character to have KeyTyped set. We'll put it -! * back with vungetc() below. */ - c = safe_vgetc(); - -! /* Don't interrupt completion when the character wasn't typed, -! * e.g., when doing @q to replay keys. */ -! if (c != Ctrl_R && KeyTyped) -! compl_interrupted = TRUE; -! -! vungetc(c); - } - } - if (compl_pending != 0 && !got_int) ---- 4519,4535 ---- - else - { - /* Need to get the character to have KeyTyped set. We'll put it -! * back with vungetc() below. But skip K_IGNORE. */ - c = safe_vgetc(); -+ if (c != K_IGNORE) -+ { -+ /* Don't interrupt completion when the character wasn't typed, -+ * e.g., when doing @q to replay keys. */ -+ if (c != Ctrl_R && KeyTyped) -+ compl_interrupted = TRUE; - -! vungetc(c); -! } - } - } - if (compl_pending != 0 && !got_int) -*** ../vim-7.1.240/src/version.c Tue Jan 22 16:01:25 2008 ---- src/version.c Tue Jan 22 17:48:46 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 241, - /**/ - --- -The problem with political jokes is that they get elected. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.242 b/7.1.242 deleted file mode 100644 index 6aab9c87..00000000 --- a/7.1.242 +++ /dev/null @@ -1,68 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.242 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.242 (after 7.1.005) -Problem: "cib" doesn't work properly on "(x)". (Tim Pope) -Solution: Use ltoreq() instead of lt(). Also fix "ciT" on "x". -Files: src/search.c - - -*** ../vim-7.1.241/src/search.c Sat Jan 19 15:55:51 2008 ---- src/search.c Sat Jan 26 13:56:06 2008 -*************** -*** 3637,3643 **** - oap->inclusive = FALSE; - if (sol) - incl(&curwin->w_cursor); -! else if (lt(start_pos, curwin->w_cursor)) - /* Include the character under the cursor. */ - oap->inclusive = TRUE; - else ---- 3637,3643 ---- - oap->inclusive = FALSE; - if (sol) - incl(&curwin->w_cursor); -! else if (ltoreq(start_pos, curwin->w_cursor)) - /* Include the character under the cursor. */ - oap->inclusive = TRUE; - else -*************** -*** 3754,3759 **** ---- 3754,3763 ---- - old_pos = curwin->w_cursor; - old_end = curwin->w_cursor; /* remember where we started */ - old_start = old_end; -+ #ifdef FEAT_VISUAL -+ if (!VIsual_active || *p_sel == 'e') -+ #endif -+ decl(&old_end); /* old_end is inclusive */ - - /* - * If we start on "" select that block. -*** ../vim-7.1.241/src/version.c Tue Jan 22 17:49:17 2008 ---- src/version.c Sat Jan 26 21:14:05 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 242, - /**/ - --- -DENNIS: Oh, very nice. King, eh! I expect you've got a palace and fine - clothes and courtiers and plenty of food. And how d'you get that? By - exploiting the workers! By hanging on to outdated imperialist dogma - which perpetuates the social and economic differences in our society! - "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.243 b/7.1.243 deleted file mode 100644 index 102546c1..00000000 --- a/7.1.243 +++ /dev/null @@ -1,165 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.243 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.243 (after 7.1.240) -Problem: "U" doesn't work on all text in Visual mode. (Adri Verhoef) -Solution: Loop over all the lines to be changed. Add tests for this. -Files: src/ops.c, src/testdir/test39.in, src/testdir/test39.ok - - -*** ../vim-7.1.242/src/ops.c Tue Jan 22 16:01:25 2008 ---- src/ops.c Mon Feb 4 22:23:22 2008 -*************** -*** 2197,2203 **** - #ifdef FEAT_VISUAL - struct block_def bd; - #endif -! int did_change; - - if (u_save((linenr_T)(oap->start.lnum - 1), - (linenr_T)(oap->end.lnum + 1)) == FAIL) ---- 2197,2203 ---- - #ifdef FEAT_VISUAL - struct block_def bd; - #endif -! int did_change = FALSE; - - if (u_save((linenr_T)(oap->start.lnum - 1), - (linenr_T)(oap->end.lnum + 1)) == FAIL) -*************** -*** 2242,2248 **** - else if (!oap->inclusive) - dec(&(oap->end)); - -! did_change = swapchars(oap->op_type, &pos, oap->end.col - pos.col + 1); - if (did_change) - { - changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, ---- 2242,2259 ---- - else if (!oap->inclusive) - dec(&(oap->end)); - -! if (pos.lnum == oap->end.lnum) -! did_change = swapchars(oap->op_type, &pos, -! oap->end.col - pos.col + 1); -! else -! for (;;) -! { -! did_change |= swapchars(oap->op_type, &pos, -! pos.lnum == oap->end.lnum ? oap->end.col + 1: -! (int)STRLEN(ml_get_pos(&pos))); -! if (ltoreq(oap->end, pos) || inc(&pos) == -1) -! break; -! } - if (did_change) - { - changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, -*************** -*** 2314,2330 **** - for (todo = length; todo > 0; --todo) - { - # ifdef FEAT_MBYTE -- int pos_col = pos->col; -- - if (has_mbyte) - /* we're counting bytes, not characters */ - todo -= (*mb_ptr2len)(ml_get_pos(pos)) - 1; - # endif - did_change |= swapchar(op_type, pos); -- # ifdef FEAT_MBYTE -- /* Changing German sharp s to SS increases the column. */ -- todo += pos->col - pos_col; -- # endif - if (inc(pos) == -1) /* at end of file */ - break; - } ---- 2325,2335 ---- -*** ../vim-7.1.242/src/testdir/test39.in Sun Jun 13 18:21:09 2004 ---- src/testdir/test39.in Wed Feb 6 13:57:37 2008 -*************** -*** 1,8 **** ---- 1,10 ---- - - Test Visual block mode commands -+ And test "U" in Visual mode, also on German sharp S. - - STARTTEST - :so small.vim -+ :so mbyte.vim - /^abcde - :" Test shift-right of a block - jlllljj>wlljlll> -*************** -*** 14,20 **** - Gllllkkklllrq - :" Test block-change - G$khhhhhkkcmno -! :$-4,$wq! test.out - ENDTEST - - abcdefghijklm ---- 16,37 ---- - Gllllkkklllrq - :" Test block-change - G$khhhhhkkcmno -! :$-4,$w! test.out -! :" gUe must uppercase a whole word, also when ß changes to SS -! Gothe youtußeuu endYpk0wgUe -! :" gUfx must uppercase until x, inclusive. -! O- youßtußexu -0fogUfx -! :" VU must uppercase a whole line -! YpkVU -! :" same, when it's the last line in the buffer -! YPGi111VUddP -! :" Uppercase two lines -! Oblah di -! doh dutVkUj -! :" Uppercase part of two lines -! ddppi333k0i222fyllvjfuUk -! :/^the/,$w >> test.out -! :qa! - ENDTEST - - abcdefghijklm -*** ../vim-7.1.242/src/testdir/test39.ok Sun Jun 13 18:59:28 2004 ---- src/testdir/test39.ok Tue Feb 5 22:25:38 2008 -*************** -*** 3,5 **** ---- 3,13 ---- - axyzqqqqef mno ghijklm - axyzqqqqefgmnoklm - abcdqqqqijklm -+ the YOUTUSSEUU end -+ - yOUSSTUSSEXu - -+ THE YOUTUSSEUU END -+ 111THE YOUTUSSEUU END -+ BLAH DI -+ DOH DUT -+ 222the yoUTUSSEUU END -+ 333THE YOUTUßeuu end -*** ../vim-7.1.242/src/version.c Sat Jan 26 21:15:00 2008 ---- src/version.c Wed Feb 6 14:41:00 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 243, - /**/ - --- -It's totally unfair to suggest - as many have - that engineers are socially -inept. Engineers simply have different objectives when it comes to social -interaction. - (Scott Adams - The Dilbert principle) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.244 b/7.1.244 deleted file mode 100644 index 6c4c43f2..00000000 --- a/7.1.244 +++ /dev/null @@ -1,58 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.244 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.244 -Problem: GUI may have part of the command line cut off. -Solution: Don't round the number of lines up, always round down. - (Tony Houghton, Scott Dillard) -Files: src/gui.c - - -*** ../vim-7.1.243/src/gui.c Sat Jan 19 15:55:51 2008 ---- src/gui.c Wed Feb 6 16:43:44 2008 -*************** -*** 1294,1304 **** - out_flush(); - - gui.num_cols = (pixel_width - gui_get_base_width()) / gui.char_width; -! gui.num_rows = (pixel_height - gui_get_base_height() -! #if !defined(FEAT_GUI_PHOTON) && !defined(FEAT_GUI_MSWIN) -! + (gui.char_height / 2) -! #endif -! ) / gui.char_height; - - gui_position_components(pixel_width); - ---- 1294,1300 ---- - out_flush(); - - gui.num_cols = (pixel_width - gui_get_base_width()) / gui.char_width; -! gui.num_rows = (pixel_height - gui_get_base_height()) / gui.char_height; - - gui_position_components(pixel_width); - -*** ../vim-7.1.243/src/version.c Wed Feb 6 14:43:50 2008 ---- src/version.c Wed Feb 6 17:32:35 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 244, - /**/ - --- -A consultant is a person who takes your money and annoys your employees while -tirelessly searching for the best way to extend the consulting contract. - (Scott Adams - The Dilbert principle) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.245 b/7.1.245 deleted file mode 100644 index ce7a7b51..00000000 --- a/7.1.245 +++ /dev/null @@ -1,92 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.245 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.245 -Problem: Pressing CTRL-\ three times causes Vim to quit. (Ranganath Rao). - Also for f CTRL-\ CTRL-\. -Solution: When going to cooked mode in mch_delay() set a flag to ignore - SIGQUIT. -Files: src/os_unix.c - - -*** ../vim-7.1.244/src/os_unix.c Sun Jan 13 16:30:23 2008 ---- src/os_unix.c Sun Feb 10 22:07:27 2008 -*************** -*** 195,200 **** ---- 195,201 ---- - static int show_shell_mess = TRUE; - #endif - static int deadly_signal = 0; /* The signal we caught */ -+ static int in_mch_delay = FALSE; /* sleeping in mch_delay() */ - - static int curr_tmode = TMODE_COOK; /* contains current terminal mode */ - -*************** -*** 538,544 **** - if (ignoreinput) - { - /* Go to cooked mode without echo, to allow SIGINT interrupting us -! * here */ - old_tmode = curr_tmode; - if (curr_tmode == TMODE_RAW) - settmode(TMODE_SLEEP); ---- 539,547 ---- - if (ignoreinput) - { - /* Go to cooked mode without echo, to allow SIGINT interrupting us -! * here. But we don't want QUIT to kill us (CTRL-\ used in a -! * shell may produce SIGQUIT). */ -! in_mch_delay = TRUE; - old_tmode = curr_tmode; - if (curr_tmode == TMODE_RAW) - settmode(TMODE_SLEEP); -*************** -*** 602,607 **** ---- 605,611 ---- - #endif - - settmode(old_tmode); -+ in_mch_delay = FALSE; - } - else - WaitForChar(msec); -*************** -*** 922,927 **** ---- 926,939 ---- - #endif - - #ifdef SIGHASARG -+ # ifdef SIGQUIT -+ /* While in mch_delay() we go to cooked mode to allow a CTRL-C to -+ * interrupt us. But in cooked mode we may also get SIGQUIT, e.g., when -+ * pressing CTRL-\, but we don't want Vim to exit then. */ -+ if (in_mch_delay && sigarg == SIGQUIT) -+ SIGRETURN; -+ # endif -+ - /* When SIGHUP, SIGQUIT, etc. are blocked: postpone the effect and return - * here. This avoids that a non-reentrant function is interrupted, e.g., - * free(). Calling free() again may then cause a crash. */ -*** ../vim-7.1.244/src/version.c Wed Feb 6 17:33:19 2008 ---- src/version.c Sun Feb 10 22:04:09 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 245, - /**/ - --- -Me? A skeptic? I trust you have proof. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.246 b/7.1.246 deleted file mode 100644 index f4a7eb76..00000000 --- a/7.1.246 +++ /dev/null @@ -1,72 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.246 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.246 -Problem: Configure hangs when the man pager is something strange. (lorien) -Solution: Set MANPAGER and PAGER to "cat". (Micah Cowan) -Files: src/auto/configure, src/configure.in - - -*** ../vim-7.1.245/src/auto/configure Tue Jan 1 16:25:33 2008 ---- src/auto/configure Wed Feb 13 10:22:56 2008 -*************** -*** 14259,14265 **** - echo "$as_me:$LINENO: checking how to run man with a section nr" >&5 - echo $ECHO_N "checking how to run man with a section nr... $ECHO_C" >&6 - MANDEF="man" -! (eval man -s 2 read) < /dev/null > /dev/null 2>&5 && MANDEF="man -s" - echo "$as_me:$LINENO: result: $MANDEF" >&5 - echo "${ECHO_T}$MANDEF" >&6 - if test "$MANDEF" = "man -s"; then ---- 14259,14265 ---- - echo "$as_me:$LINENO: checking how to run man with a section nr" >&5 - echo $ECHO_N "checking how to run man with a section nr... $ECHO_C" >&6 - MANDEF="man" -! (eval MANPAGER=cat PAGER=cat man -s 2 read) < /dev/null > /dev/null 2>&5 && MANDEF="man -s" - echo "$as_me:$LINENO: result: $MANDEF" >&5 - echo "${ECHO_T}$MANDEF" >&6 - if test "$MANDEF" = "man -s"; then -*** ../vim-7.1.245/src/configure.in Tue Jan 1 16:25:33 2008 ---- src/configure.in Fri Jan 25 20:51:51 2008 -*************** -*** 2726,2732 **** - dnl Check how we can run man with a section number - AC_MSG_CHECKING(how to run man with a section nr) - MANDEF="man" -! (eval man -s 2 read) < /dev/null > /dev/null 2>&AC_FD_CC && MANDEF="man -s" - AC_MSG_RESULT($MANDEF) - if test "$MANDEF" = "man -s"; then - AC_DEFINE(USEMAN_S) ---- 2726,2732 ---- - dnl Check how we can run man with a section number - AC_MSG_CHECKING(how to run man with a section nr) - MANDEF="man" -! (eval MANPAGER=cat PAGER=cat man -s 2 read) < /dev/null > /dev/null 2>&AC_FD_CC && MANDEF="man -s" - AC_MSG_RESULT($MANDEF) - if test "$MANDEF" = "man -s"; then - AC_DEFINE(USEMAN_S) -*** ../vim-7.1.245/src/version.c Sun Feb 10 22:25:12 2008 ---- src/version.c Wed Feb 13 10:26:47 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 246, - /**/ - --- -Anyone who is capable of getting themselves made President should on no -account be allowed to do the job. - -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy" - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.247 b/7.1.247 deleted file mode 100644 index ca65c9d6..00000000 --- a/7.1.247 +++ /dev/null @@ -1,162 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.247 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.247 -Problem: When using Netbeans backspacing in Insert mode skips a character - now and then. (Ankit Jain) -Solution: Avoid calling netbeans_removed(), it frees the line pointer. - (partly by Dominique Pelle). -Files: src/misc1.c - - -*** ../vim-7.1.246/src/misc1.c Sat Jan 19 15:55:51 2008 ---- src/misc1.c Wed Feb 13 10:56:16 2008 -*************** -*** 2270,2282 **** - /* - * If the old line has been allocated the deletion can be done in the - * existing line. Otherwise a new line has to be allocated - */ -- was_alloced = ml_line_alloced(); /* check if oldp was allocated */ - #ifdef FEAT_NETBEANS_INTG -! if (was_alloced && usingNetbeans) -! netbeans_removed(curbuf, lnum, col, count); -! /* else is handled by ml_replace() */ - #endif - if (was_alloced) - newp = oldp; /* use same allocated memory */ - else ---- 2270,2285 ---- - /* - * If the old line has been allocated the deletion can be done in the - * existing line. Otherwise a new line has to be allocated -+ * Can't do this when using Netbeans, because we would need to invoke -+ * netbeans_removed(), which deallocates the line. Let ml_replace() take -+ * care of notifiying Netbeans. - */ - #ifdef FEAT_NETBEANS_INTG -! if (usingNetbeans) -! was_alloced = FALSE; -! else - #endif -+ was_alloced = ml_line_alloced(); /* check if oldp was allocated */ - if (was_alloced) - newp = oldp; /* use same allocated memory */ - else -*************** -*** 3978,3984 **** - /* remove trailing path separator */ - #ifndef MACOS_CLASSIC - /* With MacOS path (with colons) the final colon is required */ -! /* to avoid confusion between absoulute and relative path */ - if (pend > p && after_pathsep(p, pend)) - --pend; - #endif ---- 3981,3987 ---- - /* remove trailing path separator */ - #ifndef MACOS_CLASSIC - /* With MacOS path (with colons) the final colon is required */ -! /* to avoid confusion between absolute and relative path */ - if (pend > p && after_pathsep(p, pend)) - --pend; - #endif -*************** -*** 5689,5695 **** - else if (lookfor_ctor_init || class_or_struct) - { - /* we have something found, that looks like the start of -! * cpp-base-class-declaration or contructor-initialization */ - cpp_base_class = TRUE; - lookfor_ctor_init = class_or_struct = FALSE; - *col = 0; ---- 5692,5698 ---- - else if (lookfor_ctor_init || class_or_struct) - { - /* we have something found, that looks like the start of -! * cpp-base-class-declaration or constructor-initialization */ - cpp_base_class = TRUE; - lookfor_ctor_init = class_or_struct = FALSE; - *col = 0; -*************** -*** 6146,6152 **** - pos_T our_paren_pos; - char_u *start; - int start_brace; -! #define BRACE_IN_COL0 1 /* '{' is in comumn 0 */ - #define BRACE_AT_START 2 /* '{' is at start of line */ - #define BRACE_AT_END 3 /* '{' is at end of line */ - linenr_T ourscope; ---- 6149,6155 ---- - pos_T our_paren_pos; - char_u *start; - int start_brace; -! #define BRACE_IN_COL0 1 /* '{' is in column 0 */ - #define BRACE_AT_START 2 /* '{' is at start of line */ - #define BRACE_AT_END 3 /* '{' is at end of line */ - linenr_T ourscope; -*************** -*** 6369,6375 **** - if (curwin->w_cursor.lnum > 1) - { - /* If the start comment string matches in the previous -! * line, use the indent of that line pluss offset. If - * the middle comment string matches in the previous - * line, use the indent of that line. XXX */ - look = skipwhite(ml_get(curwin->w_cursor.lnum - 1)); ---- 6372,6378 ---- - if (curwin->w_cursor.lnum > 1) - { - /* If the start comment string matches in the previous -! * line, use the indent of that line plus offset. If - * the middle comment string matches in the previous - * line, use the indent of that line. XXX */ - look = skipwhite(ml_get(curwin->w_cursor.lnum - 1)); -*************** -*** 8222,8228 **** - - if (*that && *that != ';') /* not a comment line */ - { -! /* test *that != '(' to accomodate first let/do - * argument if it is more than one line */ - if (!vi_lisp && *that != '(' && *that != '[') - firsttry++; ---- 8225,8231 ---- - - if (*that && *that != ';') /* not a comment line */ - { -! /* test *that != '(' to accommodate first let/do - * argument if it is more than one line */ - if (!vi_lisp && *that != '(' && *that != '[') - firsttry++; -*** ../vim-7.1.246/src/version.c Wed Feb 13 10:27:28 2008 ---- src/version.c Wed Feb 13 10:56:42 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 247, - /**/ - --- -Far back in the mists of ancient time, in the great and glorious days of the -former Galactic Empire, life was wild, rich and largely tax free. -Mighty starships plied their way between exotic suns, seeking adventure and -reward among the furthest reaches of Galactic space. In those days, spirits -were brave, the stakes were high, men were real men, women were real women -and small furry creatures from Alpha Centauri were real small furry creatures -from Alpha Centauri. And all dared to brave unknown terrors, to do mighty -deeds, to boldly split infinitives that no man had split before -- and thus -was the Empire forged. - -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy" - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.248 b/7.1.248 deleted file mode 100644 index 57be25d2..00000000 --- a/7.1.248 +++ /dev/null @@ -1,138 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.248 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.248 -Problem: Can't set the '" mark. Can't know if setpos() was successful. -Solution: Allow setting the '" mark with setpos(). Have setpos() return a - value indicating success/failure. -Files: runtime/doc/eval.txt, src/eval.c, src/mark.c - - -*** ../vim-7.1.247/runtime/doc/eval.txt Sat Jan 12 16:45:25 2008 ---- runtime/doc/eval.txt Wed Feb 13 11:49:16 2008 -*************** -*** 1,4 **** -! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 11 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *eval.txt* For Vim version 7.1. Last change: 2008 Feb 13 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 4523,4528 **** ---- 4528,4536 ---- - character. E.g., a position within a or after the last - character. - -+ Returns 0 when the position could be set, -1 otherwise. -+ An error message is given if {expr} is invalid. -+ - Also see |getpos()| - - This does not restore the preferred column for moving -*** ../vim-7.1.247/src/eval.c Tue Jan 22 11:58:41 2008 ---- src/eval.c Wed Feb 13 11:54:09 2008 -*************** -*** 14776,14799 **** - int fnum; - char_u *name; - - name = get_tv_string_chk(argvars); - if (name != NULL) - { - if (list2fpos(&argvars[1], &pos, &fnum) == OK) - { - --pos.col; -! if (name[0] == '.') /* cursor */ - { - if (fnum == curbuf->b_fnum) - { - curwin->w_cursor = pos; - check_cursor(); - } - else - EMSG(_(e_invarg)); - } -! else if (name[0] == '\'') /* mark */ -! (void)setmark_pos(name[1], &pos, fnum); - else - EMSG(_(e_invarg)); - } ---- 14778,14808 ---- - int fnum; - char_u *name; - -+ rettv->vval.v_number = -1; - name = get_tv_string_chk(argvars); - if (name != NULL) - { - if (list2fpos(&argvars[1], &pos, &fnum) == OK) - { - --pos.col; -! if (name[0] == '.' && name[1] == NUL) - { -+ /* set cursor */ - if (fnum == curbuf->b_fnum) - { - curwin->w_cursor = pos; - check_cursor(); -+ rettv->vval.v_number = 0; - } - else - EMSG(_(e_invarg)); - } -! else if (name[0] == '\'' && name[1] != NUL && name[2] == NUL) -! { -! /* set mark */ -! if (setmark_pos(name[1], &pos, fnum) == OK) -! rettv->vval.v_number = 0; -! } - else - EMSG(_(e_invarg)); - } -*** ../vim-7.1.247/src/mark.c Thu Jan 3 20:21:34 2008 ---- src/mark.c Wed Feb 13 11:42:30 2008 -*************** -*** 79,84 **** ---- 79,90 ---- - return OK; - } - -+ if (c == '"') -+ { -+ curbuf->b_last_cursor = *pos; -+ return OK; -+ } -+ - /* Allow setting '[ and '] for an autocommand that simulates reading a - * file. */ - if (c == '[') -*** ../vim-7.1.247/src/version.c Wed Feb 13 10:57:11 2008 ---- src/version.c Wed Feb 13 12:39:23 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 248, - /**/ - --- -"Making it up? Why should I want to make anything up? Life's bad enough -as it is without wanting to invent any more of it." - -- Marvin, the Paranoid Android in Douglas Adams' - "The Hitchhiker's Guide to the Galaxy" - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.249 b/7.1.249 deleted file mode 100644 index f377e513..00000000 --- a/7.1.249 +++ /dev/null @@ -1,76 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.249 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.249 -Problem: After "U" the cursor can be past end of line. (Adri Verhoef) -Solution: Adjust the cursor position in u_undoline(). -Files: src/undo.c - - -*** ../vim-7.1.248/src/undo.c Sat Nov 10 22:50:20 2007 ---- src/undo.c Wed Feb 13 15:17:54 2008 -*************** -*** 1814,1826 **** - if (undo_off) - return; - -! if (curbuf->b_u_line_ptr == NULL || -! curbuf->b_u_line_lnum > curbuf->b_ml.ml_line_count) - { - beep_flush(); - return; - } -! /* first save the line for the 'u' command */ - if (u_savecommon(curbuf->b_u_line_lnum - 1, - curbuf->b_u_line_lnum + 1, (linenr_T)0) == FAIL) - return; ---- 1814,1827 ---- - if (undo_off) - return; - -! if (curbuf->b_u_line_ptr == NULL -! || curbuf->b_u_line_lnum > curbuf->b_ml.ml_line_count) - { - beep_flush(); - return; - } -! -! /* first save the line for the 'u' command */ - if (u_savecommon(curbuf->b_u_line_lnum - 1, - curbuf->b_u_line_lnum + 1, (linenr_T)0) == FAIL) - return; -*************** -*** 1840,1845 **** ---- 1841,1847 ---- - curbuf->b_u_line_colnr = curwin->w_cursor.col; - curwin->w_cursor.col = t; - curwin->w_cursor.lnum = curbuf->b_u_line_lnum; -+ check_cursor_col(); - } - - /* -*** ../vim-7.1.248/src/version.c Wed Feb 13 12:41:30 2008 ---- src/version.c Wed Feb 13 15:20:12 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 249, - /**/ - --- -How To Keep A Healthy Level Of Insanity: -1. At lunch time, sit in your parked car with sunglasses on and point - a hair dryer at passing cars. See if they slow down. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.250 b/7.1.250 deleted file mode 100644 index 0306206b..00000000 --- a/7.1.250 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.250 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.250 -Problem: ":setglobal fenc=anything" gives an error message in a buffer - where 'modifiable' is off. (Ben Schmidt) -Solution: Don't give an error if 'modifiable' doesn't matter. -Files: src/option.c - - -*** ../vim-7.1.249/src/option.c Sat Jan 19 15:55:51 2008 ---- src/option.c Wed Feb 13 18:31:39 2008 -*************** -*** 5671,5677 **** - { - if (gvarp == &p_fenc) - { -! if (!curbuf->b_p_ma) - errmsg = e_modifiable; - else if (vim_strchr(*varp, ',') != NULL) - /* No comma allowed in 'fileencoding'; catches confusing it ---- 5671,5677 ---- - { - if (gvarp == &p_fenc) - { -! if (!curbuf->b_p_ma && opt_flags != OPT_GLOBAL) - errmsg = e_modifiable; - else if (vim_strchr(*varp, ',') != NULL) - /* No comma allowed in 'fileencoding'; catches confusing it -*** ../vim-7.1.249/src/version.c Wed Feb 13 15:20:59 2008 ---- src/version.c Wed Feb 13 18:34:24 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 250, - /**/ - --- -How To Keep A Healthy Level Of Insanity: -3. Every time someone asks you to do something, ask if they want fries - with that. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.251 b/7.1.251 deleted file mode 100644 index 671807e8..00000000 --- a/7.1.251 +++ /dev/null @@ -1,99 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.251 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.251 -Problem: Using freed memory when spell checking enabled. -Solution: Obtain the current line again after calling spell_move_to(). - (Dominique Pelle) -Files: src/screen.c - - -*** ../vim-7.1.250/src/screen.c Sat Jan 19 15:55:51 2008 ---- src/screen.c Wed Feb 13 21:45:38 2008 -*************** -*** 2644,2650 **** - #if defined(FEAT_SIGNS) || (defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)) \ - || defined(FEAT_SYN_HL) || defined(FEAT_DIFF) - # define LINE_ATTR -! int line_attr = 0; /* atrribute for the whole line */ - #endif - #ifdef FEAT_SEARCH_EXTRA - matchitem_T *cur; /* points to the match list */ ---- 2644,2650 ---- - #if defined(FEAT_SIGNS) || (defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)) \ - || defined(FEAT_SYN_HL) || defined(FEAT_DIFF) - # define LINE_ATTR -! int line_attr = 0; /* attribute for the whole line */ - #endif - #ifdef FEAT_SEARCH_EXTRA - matchitem_T *cur; /* points to the match list */ -*************** -*** 3040,3057 **** - if (has_spell) - { - int len; - hlf_T spell_hlf = HLF_COUNT; - - pos = wp->w_cursor; - wp->w_cursor.lnum = lnum; -! wp->w_cursor.col = (colnr_T)(ptr - line); - len = spell_move_to(wp, FORWARD, TRUE, TRUE, &spell_hlf); - if (len == 0 || (int)wp->w_cursor.col > ptr - line) - { - /* no bad word found at line start, don't check until end of a - * word */ - spell_hlf = HLF_COUNT; -! word_end = (int)(spell_to_word_end(ptr, wp->w_buffer) - line + 1); - } - else - { ---- 3040,3064 ---- - if (has_spell) - { - int len; -+ colnr_T linecol = (colnr_T)(ptr - line); - hlf_T spell_hlf = HLF_COUNT; - - pos = wp->w_cursor; - wp->w_cursor.lnum = lnum; -! wp->w_cursor.col = linecol; - len = spell_move_to(wp, FORWARD, TRUE, TRUE, &spell_hlf); -+ -+ /* spell_move_to() may call ml_get() and make "line" invalid */ -+ line = ml_get_buf(wp->w_buffer, lnum, FALSE); -+ ptr = line + linecol; -+ - if (len == 0 || (int)wp->w_cursor.col > ptr - line) - { - /* no bad word found at line start, don't check until end of a - * word */ - spell_hlf = HLF_COUNT; -! word_end = (int)(spell_to_word_end(ptr, wp->w_buffer) -! - line + 1); - } - else - { -*** ../vim-7.1.250/src/version.c Wed Feb 13 18:35:23 2008 ---- src/version.c Wed Feb 13 21:48:08 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 251, - /**/ - --- -How To Keep A Healthy Level Of Insanity: -6. In the memo field of all your checks, write "for sexual favors". - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.252 b/7.1.252 deleted file mode 100644 index 9681301f..00000000 --- a/7.1.252 +++ /dev/null @@ -1,47 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.252 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.252 (after 7.1.243) -Problem: Test 39 fails when the environment has a utf-8 locale. (Dominique - Pelle) -Solution: Force 'encoding' to be latin1. -Files: src/testdir/test39.in - - -*** ../vim-7.1.251/src/testdir/test39.in Wed Feb 6 14:43:50 2008 ---- src/testdir/test39.in Thu Feb 14 22:16:57 2008 -*************** -*** 5,10 **** ---- 5,12 ---- - STARTTEST - :so small.vim - :so mbyte.vim -+ :" This only works when 'encoding' is "latin1", don't depend on the environment -+ :set enc=latin1 - /^abcde - :" Test shift-right of a block - jlllljj>wlljlll> -*** ../vim-7.1.251/src/version.c Wed Feb 13 21:48:24 2008 ---- src/version.c Thu Feb 14 22:18:11 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 252, - /**/ - --- -How To Keep A Healthy Level Of Insanity: -9. As often as possible, skip rather than walk. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.253 b/7.1.253 deleted file mode 100644 index 2565ed19..00000000 --- a/7.1.253 +++ /dev/null @@ -1,53 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.253 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.253 -Problem: ":sort" doesn't work in a one line file. (Patrick Texier) -Solution: Don't sort if there is only one line. (Dominique Pelle) -Files: src/ex_cmds.c - - -*** ../vim-7.1.252/src/ex_cmds.c Sat Jan 19 15:55:51 2008 ---- src/ex_cmds.c Mon Feb 18 19:38:02 2008 -*************** -*** 365,370 **** ---- 365,374 ---- - int sort_oct; /* sort on octal number */ - int sort_hex; /* sort on hex number */ - -+ /* Sorting one line is really quick! */ -+ if (count <= 1) -+ return; -+ - if (u_save((linenr_T)(eap->line1 - 1), (linenr_T)(eap->line2 + 1)) == FAIL) - return; - sortbuf1 = NULL; -*** ../vim-7.1.252/src/version.c Thu Feb 14 22:19:39 2008 ---- src/version.c Mon Feb 18 19:39:24 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 253, - /**/ - --- -"You know, it's at times like this when I'm trapped in a Vogon airlock with -a man from Betelgeuse and about to die of asphyxiation in deep space that I -really wish I'd listened to what my mother told me when I was young!" -"Why, what did she tell you?" -"I don't know, I didn't listen!" - -- Arthur Dent and Ford Prefect in Douglas Adams' - "The Hitchhiker's Guide to the Galaxy" - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.254 b/7.1.254 deleted file mode 100644 index 19c69f3c..00000000 --- a/7.1.254 +++ /dev/null @@ -1,65 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.254 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.254 -Problem: Tests 49 and 55 fail when the locale is French. -Solution: Using C messages for test 49. Filter the error message in test 55 - such that it works when the number is halfway the message. -Files: src/testdir/test49.in, src/testdir/test55.in - - -*** ../vim-7.1.253/src/testdir/test49.in Tue Sep 25 17:54:41 2007 ---- src/testdir/test49.in Tue Feb 19 21:03:20 2008 -*************** -*** 6,11 **** ---- 6,12 ---- - STARTTEST - :so small.vim - :se nocp nomore viminfo+=nviminfo -+ :lang mess C - :so test49.vim - GGGGGGGGGGGGGG"rp:.-,$w! test.out - :" -*** ../vim-7.1.253/src/testdir/test55.in Tue Sep 25 17:54:41 2007 ---- src/testdir/test55.in Tue Feb 19 21:06:21 2008 -*************** -*** 146,152 **** - :try - : let n = d[1500] - :catch -! : $put =v:exception[:14] . v:exception[-4:-1] - :endtry - :" lookup each items - :for i in range(1500) ---- 146,152 ---- - :try - : let n = d[1500] - :catch -! : $put =substitute(v:exception, '\v(.{14}).*( \d{4}).*', '\1\2', '') - :endtry - :" lookup each items - :for i in range(1500) -*** ../vim-7.1.253/src/version.c Mon Feb 18 19:41:40 2008 ---- src/version.c Wed Feb 20 10:16:59 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 254, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -34. You laugh at people with 14400 baud modems. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.255 b/7.1.255 deleted file mode 100644 index 6d7ebaa9..00000000 --- a/7.1.255 +++ /dev/null @@ -1,50 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.255 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.255 -Problem: Vim doesn't support utf-32. (Yongwei Wu) -Solution: Add aliases for utf-32, it's the same as ucs-4. -Files: src/mbyte.c - - -*** ../vim-7.1.254/src/mbyte.c Sun Jan 6 17:18:16 2008 ---- src/mbyte.c Tue Feb 19 20:31:48 2008 -*************** -*** 360,365 **** ---- 360,371 ---- - {"ucs4be", IDX_UCS4}, - {"ucs-4be", IDX_UCS4}, - {"ucs4le", IDX_UCS4LE}, -+ {"utf32", IDX_UCS4}, -+ {"utf-32", IDX_UCS4}, -+ {"utf32be", IDX_UCS4}, -+ {"utf-32be", IDX_UCS4}, -+ {"utf32le", IDX_UCS4LE}, -+ {"utf-32le", IDX_UCS4LE}, - {"932", IDX_CP932}, - {"949", IDX_CP949}, - {"936", IDX_CP936}, -*** ../vim-7.1.254/src/version.c Wed Feb 20 10:57:11 2008 ---- src/version.c Wed Feb 20 11:27:00 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 255, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -37. You start looking for hot HTML addresses in public restrooms. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.256 b/7.1.256 deleted file mode 100644 index 25d9bbc0..00000000 --- a/7.1.256 +++ /dev/null @@ -1,1808 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.256 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.256 -Problem: findfile() also returns directories. -Solution: Cleanup the code for finding files and directories in a list of - directories. Remove the ugly global ff_search_ctx. -Files: src/eval.c, src/misc2.c, src/vim.h, src/tag.c - - -*** ../vim-7.1.255/src/eval.c Wed Feb 13 12:41:30 2008 ---- src/eval.c Wed Feb 20 11:08:21 2008 -*************** -*** 9203,9215 **** - rettv->vval.v_number = filewritable(get_tv_string(&argvars[0])); - } - -! static void findfilendir __ARGS((typval_T *argvars, typval_T *rettv, int dir)); - - static void -! findfilendir(argvars, rettv, dir) - typval_T *argvars; - typval_T *rettv; -! int dir; - { - #ifdef FEAT_SEARCHPATH - char_u *fname; ---- 9205,9217 ---- - rettv->vval.v_number = filewritable(get_tv_string(&argvars[0])); - } - -! static void findfilendir __ARGS((typval_T *argvars, typval_T *rettv, int find_what)); - - static void -! findfilendir(argvars, rettv, find_what) - typval_T *argvars; - typval_T *rettv; -! int find_what; - { - #ifdef FEAT_SEARCHPATH - char_u *fname; -*************** -*** 9254,9261 **** - vim_free(fresult); - fresult = find_file_in_path_option(first ? fname : NULL, - first ? (int)STRLEN(fname) : 0, -! 0, first, path, dir, curbuf->b_ffname, -! dir ? (char_u *)"" : curbuf->b_p_sua); - first = FALSE; - - if (fresult != NULL && rettv->v_type == VAR_LIST) ---- 9256,9266 ---- - vim_free(fresult); - fresult = find_file_in_path_option(first ? fname : NULL, - first ? (int)STRLEN(fname) : 0, -! 0, first, path, -! find_what, -! curbuf->b_ffname, -! find_what == FINDFILE_DIR -! ? (char_u *)"" : curbuf->b_p_sua); - first = FALSE; - - if (fresult != NULL && rettv->v_type == VAR_LIST) -*************** -*** 9445,9451 **** - typval_T *argvars; - typval_T *rettv; - { -! findfilendir(argvars, rettv, TRUE); - } - - /* ---- 9450,9456 ---- - typval_T *argvars; - typval_T *rettv; - { -! findfilendir(argvars, rettv, FINDFILE_DIR); - } - - /* -*************** -*** 9456,9462 **** - typval_T *argvars; - typval_T *rettv; - { -! findfilendir(argvars, rettv, FALSE); - } - - /* ---- 9461,9467 ---- - typval_T *argvars; - typval_T *rettv; - { -! findfilendir(argvars, rettv, FINDFILE_FILE); - } - - /* -*** ../vim-7.1.255/src/misc2.c Fri Jan 4 21:25:01 2008 ---- src/misc2.c Wed Feb 13 17:19:21 2008 -*************** -*** 3777,3785 **** - char_u ffs_filearray_cur; /* needed for partly handled dirs */ - - /* to store status of partly handled directories -! * 0: we work the on this directory for the first time - * 1: this directory was partly searched in an earlier step -! */ - int ffs_stage; - - /* How deep are we in the directory tree? ---- 3778,3786 ---- - char_u ffs_filearray_cur; /* needed for partly handled dirs */ - - /* to store status of partly handled directories -! * 0: we work on this directory for the first time - * 1: this directory was partly searched in an earlier step -! */ - int ffs_stage; - - /* How deep are we in the directory tree? -*************** -*** 3848,3853 **** ---- 3849,3855 ---- - * Set the default maximum depth. - */ - #define FF_MAX_STAR_STAR_EXPAND ((char_u)30) -+ - /* - * The search context: - * ffsc_stack_ptr: the stack for the dirs to search -*************** -*** 3862,3868 **** - * ffsc_wc_path: the part of the given path containing wildcards - * ffsc_level: how many levels of dirs to search downwards - * ffsc_stopdirs_v: array of stop directories for upward search -! * ffsc_need_dir: TRUE if we search for a directory - */ - typedef struct ff_search_ctx_T - { ---- 3864,3870 ---- - * ffsc_wc_path: the part of the given path containing wildcards - * ffsc_level: how many levels of dirs to search downwards - * ffsc_stopdirs_v: array of stop directories for upward search -! * ffsc_find_what: FINDFILE_BOTH, FINDFILE_DIR or FINDFILE_FILE - */ - typedef struct ff_search_ctx_T - { -*************** -*** 3879,3889 **** - int ffsc_level; - char_u **ffsc_stopdirs_v; - #endif -! int ffsc_need_dir; - } ff_search_ctx_T; - -- static ff_search_ctx_T *ff_search_ctx = NULL; -- - /* locally needed functions */ - #ifdef FEAT_PATH_EXTRA - static int ff_check_visited __ARGS((ff_visited_T **, char_u *, char_u *)); ---- 3881,3889 ---- - int ffsc_level; - char_u **ffsc_stopdirs_v; - #endif -! int ffsc_find_what; - } ff_search_ctx_T; - - /* locally needed functions */ - #ifdef FEAT_PATH_EXTRA - static int ff_check_visited __ARGS((ff_visited_T **, char_u *, char_u *)); -*************** -*** 3897,3906 **** - static int ff_wc_equal __ARGS((char_u *s1, char_u *s2)); - #endif - -! static void ff_push __ARGS((ff_stack_T *)); -! static ff_stack_T * ff_pop __ARGS((void)); -! static void ff_clear __ARGS((void)); -! static void ff_free_stack_element __ARGS((ff_stack_T *)); - #ifdef FEAT_PATH_EXTRA - static ff_stack_T *ff_create_stack_element __ARGS((char_u *, char_u *, int, int)); - #else ---- 3897,3906 ---- - static int ff_wc_equal __ARGS((char_u *s1, char_u *s2)); - #endif - -! static void ff_push __ARGS((ff_search_ctx_T *search_ctx, ff_stack_T *stack_ptr)); -! static ff_stack_T *ff_pop __ARGS((ff_search_ctx_T *search_ctx)); -! static void ff_clear __ARGS((ff_search_ctx_T *search_ctx)); -! static void ff_free_stack_element __ARGS((ff_stack_T *stack_ptr)); - #ifdef FEAT_PATH_EXTRA - static ff_stack_T *ff_create_stack_element __ARGS((char_u *, char_u *, int, int)); - #else -*************** -*** 3961,3966 **** ---- 3961,3969 ---- - * not related to restricts given to the '**' wildcard. If 'level' is 100 - * and you use '**200' vim_findfile() will stop after 100 levels. - * -+ * 'filename' cannot contain wildcards! It is used as-is, no backslashes to -+ * escape special characters. -+ * - * If 'stopdirs' is not NULL and nothing is found downward, the search is - * restarted on the next higher directory level. This is repeated until the - * start-directory of a search is contained in 'stopdirs'. 'stopdirs' has the -*************** -*** 3980,4053 **** - * The list of visited files/dirs can also be cleared with the function - * vim_findfile_free_visited(). - * -! * Set the parameter 'need_dir' to TRUE if you want to search for a directory -! * instead of a file. - * - * A search context returned by a previous call to vim_findfile_init() can be -! * passed in the parameter 'search_ctx'. This context is than reused and -! * reinitialized with the new parameters. The list of already viseted - * directories from this context is only deleted if the parameter -! * 'free_visited' is true. Be aware that the passed search_context is freed if -! * the reinitialization fails. - * -! * If you don't have a search context from a previous call 'search_ctx' must be -! * NULL. - * - * This function silently ignores a few errors, vim_findfile() will have - * limited functionality then. - */ - /*ARGSUSED*/ - void * -! vim_findfile_init(path, filename, stopdirs, level, free_visited, need_dir, -! search_ctx, tagfile, rel_fname) - char_u *path; - char_u *filename; - char_u *stopdirs; - int level; - int free_visited; -! int need_dir; -! void *search_ctx; - int tagfile; - char_u *rel_fname; /* file name to use for "." */ - { - #ifdef FEAT_PATH_EXTRA -! char_u *wc_part; - #endif -! ff_stack_T *sptr; - - /* If a search context is given by the caller, reuse it, else allocate a - * new one. - */ -! if (search_ctx != NULL) -! ff_search_ctx = search_ctx; - else - { -! ff_search_ctx = (ff_search_ctx_T*)alloc( -! (unsigned)sizeof(ff_search_ctx_T)); -! if (ff_search_ctx == NULL) - goto error_return; -! memset(ff_search_ctx, 0, sizeof(ff_search_ctx_T)); - } - - /* clear the search context, but NOT the visited lists */ -! ff_clear(); - - /* clear visited list if wanted */ - if (free_visited == TRUE) -! vim_findfile_free_visited(ff_search_ctx); - else - { - /* Reuse old visited lists. Get the visited list for the given - * filename. If no list for the current filename exists, creates a new -! * one. -! */ -! ff_search_ctx->ffsc_visited_list = ff_get_visited_list(filename, -! &ff_search_ctx->ffsc_visited_lists_list); -! if (ff_search_ctx->ffsc_visited_list == NULL) - goto error_return; -! ff_search_ctx->ffsc_dir_visited_list = ff_get_visited_list(filename, -! &ff_search_ctx->ffsc_dir_visited_lists_list); -! if (ff_search_ctx->ffsc_dir_visited_list == NULL) - goto error_return; - } - ---- 3983,4056 ---- - * The list of visited files/dirs can also be cleared with the function - * vim_findfile_free_visited(). - * -! * Set the parameter 'find_what' to FINDFILE_DIR if you want to search for -! * directories only, FINDFILE_FILE for files only, FINDFILE_BOTH for both. - * - * A search context returned by a previous call to vim_findfile_init() can be -! * passed in the parameter "search_ctx_arg". This context is reused and -! * reinitialized with the new parameters. The list of already visited - * directories from this context is only deleted if the parameter -! * "free_visited" is true. Be aware that the passed "search_ctx_arg" is freed -! * if the reinitialization fails. - * -! * If you don't have a search context from a previous call "search_ctx_arg" -! * must be NULL. - * - * This function silently ignores a few errors, vim_findfile() will have - * limited functionality then. - */ - /*ARGSUSED*/ - void * -! vim_findfile_init(path, filename, stopdirs, level, free_visited, find_what, -! search_ctx_arg, tagfile, rel_fname) - char_u *path; - char_u *filename; - char_u *stopdirs; - int level; - int free_visited; -! int find_what; -! void *search_ctx_arg; - int tagfile; - char_u *rel_fname; /* file name to use for "." */ - { - #ifdef FEAT_PATH_EXTRA -! char_u *wc_part; - #endif -! ff_stack_T *sptr; -! ff_search_ctx_T *search_ctx; - - /* If a search context is given by the caller, reuse it, else allocate a - * new one. - */ -! if (search_ctx_arg != NULL) -! search_ctx = search_ctx_arg; - else - { -! search_ctx = (ff_search_ctx_T*)alloc((unsigned)sizeof(ff_search_ctx_T)); -! if (search_ctx == NULL) - goto error_return; -! memset(search_ctx, 0, sizeof(ff_search_ctx_T)); - } -+ search_ctx->ffsc_find_what = find_what; - - /* clear the search context, but NOT the visited lists */ -! ff_clear(search_ctx); - - /* clear visited list if wanted */ - if (free_visited == TRUE) -! vim_findfile_free_visited(search_ctx); - else - { - /* Reuse old visited lists. Get the visited list for the given - * filename. If no list for the current filename exists, creates a new -! * one. */ -! search_ctx->ffsc_visited_list = ff_get_visited_list(filename, -! &search_ctx->ffsc_visited_lists_list); -! if (search_ctx->ffsc_visited_list == NULL) - goto error_return; -! search_ctx->ffsc_dir_visited_list = ff_get_visited_list(filename, -! &search_ctx->ffsc_dir_visited_lists_list); -! if (search_ctx->ffsc_dir_visited_list == NULL) - goto error_return; - } - -*************** -*** 4071,4082 **** - { - /* Make the start dir an absolute path name. */ - vim_strncpy(ff_expand_buffer, rel_fname, len); -! ff_search_ctx->ffsc_start_dir = FullName_save(ff_expand_buffer, -! FALSE); - } - else -! ff_search_ctx->ffsc_start_dir = vim_strnsave(rel_fname, len); -! if (ff_search_ctx->ffsc_start_dir == NULL) - goto error_return; - if (*++path != NUL) - ++path; ---- 4074,4084 ---- - { - /* Make the start dir an absolute path name. */ - vim_strncpy(ff_expand_buffer, rel_fname, len); -! search_ctx->ffsc_start_dir = FullName_save(ff_expand_buffer, FALSE); - } - else -! search_ctx->ffsc_start_dir = vim_strnsave(rel_fname, len); -! if (search_ctx->ffsc_start_dir == NULL) - goto error_return; - if (*++path != NUL) - ++path; -*************** -*** 4101,4108 **** - if (mch_dirname(ff_expand_buffer, MAXPATHL) == FAIL) - goto error_return; - -! ff_search_ctx->ffsc_start_dir = vim_strsave(ff_expand_buffer); -! if (ff_search_ctx->ffsc_start_dir == NULL) - goto error_return; - - #ifdef BACKSLASH_IN_FILENAME ---- 4103,4110 ---- - if (mch_dirname(ff_expand_buffer, MAXPATHL) == FAIL) - goto error_return; - -! search_ctx->ffsc_start_dir = vim_strsave(ff_expand_buffer); -! if (search_ctx->ffsc_start_dir == NULL) - goto error_return; - - #ifdef BACKSLASH_IN_FILENAME -*************** -*** 4110,4117 **** - * directory (but not for "//machine/dir"). Only use the drive name. */ - if ((*path == '/' || *path == '\\') - && path[1] != path[0] -! && ff_search_ctx->ffsc_start_dir[1] == ':') -! ff_search_ctx->ffsc_start_dir[2] = NUL; - #endif - } - ---- 4112,4119 ---- - * directory (but not for "//machine/dir"). Only use the drive name. */ - if ((*path == '/' || *path == '\\') - && path[1] != path[0] -! && search_ctx->ffsc_start_dir[1] == ':') -! search_ctx->ffsc_start_dir[2] = NUL; - #endif - } - -*************** -*** 4121,4127 **** - * If this fails (mem allocation), there is no upward search at all or a - * stop directory is not recognized -> continue silently. - * If stopdirs just contains a ";" or is empty, -! * ff_search_ctx->ffsc_stopdirs_v will only contain a NULL pointer. This - * is handled as unlimited upward search. See function - * ff_path_in_stoplist() for details. - */ ---- 4123,4129 ---- - * If this fails (mem allocation), there is no upward search at all or a - * stop directory is not recognized -> continue silently. - * If stopdirs just contains a ";" or is empty, -! * search_ctx->ffsc_stopdirs_v will only contain a NULL pointer. This - * is handled as unlimited upward search. See function - * ff_path_in_stoplist() for details. - */ -*************** -*** 4134,4143 **** - walker++; - - dircount = 1; -! ff_search_ctx->ffsc_stopdirs_v = -! (char_u **)alloc((unsigned)sizeof(char_u *)); - -! if (ff_search_ctx->ffsc_stopdirs_v != NULL) - { - do - { ---- 4136,4145 ---- - walker++; - - dircount = 1; -! search_ctx->ffsc_stopdirs_v = -! (char_u **)alloc((unsigned)sizeof(char_u *)); - -! if (search_ctx->ffsc_stopdirs_v != NULL) - { - do - { -*************** -*** 4145,4181 **** - void *ptr; - - helper = walker; -! ptr = vim_realloc(ff_search_ctx->ffsc_stopdirs_v, - (dircount + 1) * sizeof(char_u *)); - if (ptr) -! ff_search_ctx->ffsc_stopdirs_v = ptr; - else - /* ignore, keep what we have and continue */ - break; - walker = vim_strchr(walker, ';'); - if (walker) - { -! ff_search_ctx->ffsc_stopdirs_v[dircount-1] = -! vim_strnsave(helper, (int)(walker - helper)); - walker++; - } - else - /* this might be "", which means ascent till top - * of directory tree. - */ -! ff_search_ctx->ffsc_stopdirs_v[dircount-1] = -! vim_strsave(helper); - - dircount++; - - } while (walker != NULL); -! ff_search_ctx->ffsc_stopdirs_v[dircount-1] = NULL; - } - } - #endif - - #ifdef FEAT_PATH_EXTRA -! ff_search_ctx->ffsc_level = level; - - /* split into: - * -fix path ---- 4147,4183 ---- - void *ptr; - - helper = walker; -! ptr = vim_realloc(search_ctx->ffsc_stopdirs_v, - (dircount + 1) * sizeof(char_u *)); - if (ptr) -! search_ctx->ffsc_stopdirs_v = ptr; - else - /* ignore, keep what we have and continue */ - break; - walker = vim_strchr(walker, ';'); - if (walker) - { -! search_ctx->ffsc_stopdirs_v[dircount-1] = -! vim_strnsave(helper, (int)(walker - helper)); - walker++; - } - else - /* this might be "", which means ascent till top - * of directory tree. - */ -! search_ctx->ffsc_stopdirs_v[dircount-1] = -! vim_strsave(helper); - - dircount++; - - } while (walker != NULL); -! search_ctx->ffsc_stopdirs_v[dircount-1] = NULL; - } - } - #endif - - #ifdef FEAT_PATH_EXTRA -! search_ctx->ffsc_level = level; - - /* split into: - * -fix path -*************** -*** 4189,4196 **** - char *errpt; - - /* save the fix part of the path */ -! ff_search_ctx->ffsc_fix_path = vim_strnsave(path, -! (int)(wc_part - path)); - - /* - * copy wc_path and add restricts to the '**' wildcard. ---- 4191,4197 ---- - char *errpt; - - /* save the fix part of the path */ -! search_ctx->ffsc_fix_path = vim_strnsave(path, (int)(wc_part - path)); - - /* - * copy wc_path and add restricts to the '**' wildcard. -*************** -*** 4229,4275 **** - ff_expand_buffer[len++] = *wc_part++; - } - ff_expand_buffer[len] = NUL; -! ff_search_ctx->ffsc_wc_path = vim_strsave(ff_expand_buffer); - -! if (ff_search_ctx->ffsc_wc_path == NULL) - goto error_return; - } - else - #endif -! ff_search_ctx->ffsc_fix_path = vim_strsave(path); - -! if (ff_search_ctx->ffsc_start_dir == NULL) - { - /* store the fix part as startdir. - * This is needed if the parameter path is fully qualified. - */ -! ff_search_ctx->ffsc_start_dir = vim_strsave(ff_search_ctx->ffsc_fix_path); -! if (ff_search_ctx->ffsc_start_dir) -! ff_search_ctx->ffsc_fix_path[0] = NUL; - } - - /* create an absolute path */ -! STRCPY(ff_expand_buffer, ff_search_ctx->ffsc_start_dir); - add_pathsep(ff_expand_buffer); -! STRCAT(ff_expand_buffer, ff_search_ctx->ffsc_fix_path); - add_pathsep(ff_expand_buffer); - - sptr = ff_create_stack_element(ff_expand_buffer, - #ifdef FEAT_PATH_EXTRA -! ff_search_ctx->ffsc_wc_path, - #endif - level, 0); - - if (sptr == NULL) - goto error_return; - -! ff_push(sptr); - -! ff_search_ctx->ffsc_file_to_search = vim_strsave(filename); -! if (ff_search_ctx->ffsc_file_to_search == NULL) - goto error_return; - -! return ff_search_ctx; - - error_return: - /* ---- 4230,4276 ---- - ff_expand_buffer[len++] = *wc_part++; - } - ff_expand_buffer[len] = NUL; -! search_ctx->ffsc_wc_path = vim_strsave(ff_expand_buffer); - -! if (search_ctx->ffsc_wc_path == NULL) - goto error_return; - } - else - #endif -! search_ctx->ffsc_fix_path = vim_strsave(path); - -! if (search_ctx->ffsc_start_dir == NULL) - { - /* store the fix part as startdir. - * This is needed if the parameter path is fully qualified. - */ -! search_ctx->ffsc_start_dir = vim_strsave(search_ctx->ffsc_fix_path); -! if (search_ctx->ffsc_start_dir) -! search_ctx->ffsc_fix_path[0] = NUL; - } - - /* create an absolute path */ -! STRCPY(ff_expand_buffer, search_ctx->ffsc_start_dir); - add_pathsep(ff_expand_buffer); -! STRCAT(ff_expand_buffer, search_ctx->ffsc_fix_path); - add_pathsep(ff_expand_buffer); - - sptr = ff_create_stack_element(ff_expand_buffer, - #ifdef FEAT_PATH_EXTRA -! search_ctx->ffsc_wc_path, - #endif - level, 0); - - if (sptr == NULL) - goto error_return; - -! ff_push(search_ctx, sptr); - -! search_ctx->ffsc_file_to_search = vim_strsave(filename); -! if (search_ctx->ffsc_file_to_search == NULL) - goto error_return; - -! return search_ctx; - - error_return: - /* -*************** -*** 4277,4283 **** - * Even when the caller gave us a (perhaps valid) context we free it here, - * as we might have already destroyed it. - */ -! vim_findfile_cleanup(ff_search_ctx); - return NULL; - } - ---- 4278,4284 ---- - * Even when the caller gave us a (perhaps valid) context we free it here, - * as we might have already destroyed it. - */ -! vim_findfile_cleanup(search_ctx); - return NULL; - } - -*************** -*** 4314,4320 **** - } - #endif - -! /* Clean up the given search context. Can handle a NULL pointer */ - void - vim_findfile_cleanup(ctx) - void *ctx; ---- 4315,4323 ---- - } - #endif - -! /* -! * Clean up the given search context. Can handle a NULL pointer. -! */ - void - vim_findfile_cleanup(ctx) - void *ctx; -*************** -*** 4322,4333 **** - if (ctx == NULL) - return; - -- ff_search_ctx = ctx; -- - vim_findfile_free_visited(ctx); -! ff_clear(); - vim_free(ctx); -- ff_search_ctx = NULL; - } - - /* ---- 4325,4333 ---- - if (ctx == NULL) - return; - - vim_findfile_free_visited(ctx); -! ff_clear(ctx); - vim_free(ctx); - } - - /* -*************** -*** 4343,4357 **** - * top of the list). - */ - char_u * -! vim_findfile(search_ctx) -! void *search_ctx; - { - char_u *file_path; - #ifdef FEAT_PATH_EXTRA - char_u *rest_of_wildcards; - char_u *path_end = NULL; - #endif -! ff_stack_T *ctx; - #if defined(FEAT_SEARCHPATH) || defined(FEAT_PATH_EXTRA) - int len; - #endif ---- 4343,4357 ---- - * top of the list). - */ - char_u * -! vim_findfile(search_ctx_arg) -! void *search_ctx_arg; - { - char_u *file_path; - #ifdef FEAT_PATH_EXTRA - char_u *rest_of_wildcards; - char_u *path_end = NULL; - #endif -! ff_stack_T *stackp; - #if defined(FEAT_SEARCHPATH) || defined(FEAT_PATH_EXTRA) - int len; - #endif -*************** -*** 4360,4370 **** - #ifdef FEAT_SEARCHPATH - char_u *suf; - #endif - -! if (search_ctx == NULL) - return NULL; - -! ff_search_ctx = (ff_search_ctx_T*)search_ctx; - - /* - * filepath is used as buffer for various actions and as the storage to ---- 4360,4371 ---- - #ifdef FEAT_SEARCHPATH - char_u *suf; - #endif -+ ff_search_ctx_T *search_ctx; - -! if (search_ctx_arg == NULL) - return NULL; - -! search_ctx = (ff_search_ctx_T *)search_ctx_arg; - - /* - * filepath is used as buffer for various actions and as the storage to -*************** -*** 4375,4382 **** - - #ifdef FEAT_PATH_EXTRA - /* store the end of the start dir -- needed for upward search */ -! if (ff_search_ctx->ffsc_start_dir != NULL) -! path_end = &ff_search_ctx->ffsc_start_dir[STRLEN(ff_search_ctx->ffsc_start_dir)]; - #endif - - #ifdef FEAT_PATH_EXTRA ---- 4376,4384 ---- - - #ifdef FEAT_PATH_EXTRA - /* store the end of the start dir -- needed for upward search */ -! if (search_ctx->ffsc_start_dir != NULL) -! path_end = &search_ctx->ffsc_start_dir[ -! STRLEN(search_ctx->ffsc_start_dir)]; - #endif - - #ifdef FEAT_PATH_EXTRA -*************** -*** 4393,4400 **** - break; - - /* get directory to work on from stack */ -! ctx = ff_pop(); -! if (ctx == NULL) - break; - - /* ---- 4395,4402 ---- - break; - - /* get directory to work on from stack */ -! stackp = ff_pop(search_ctx); -! if (stackp == NULL) - break; - - /* -*************** -*** 4414,4427 **** - * /etc/rc.d/init.d is linked to /etc/rc.d -> endless loop) - * - * This check is only needed for directories we work on for the -! * first time (hence ctx->ff_filearray == NULL) - */ -! if (ctx->ffs_filearray == NULL -! && ff_check_visited(&ff_search_ctx->ffsc_dir_visited_list - ->ffvl_visited_list, -! ctx->ffs_fix_path - #ifdef FEAT_PATH_EXTRA -! , ctx->ffs_wc_path - #endif - ) == FAIL) - { ---- 4416,4429 ---- - * /etc/rc.d/init.d is linked to /etc/rc.d -> endless loop) - * - * This check is only needed for directories we work on for the -! * first time (hence stackp->ff_filearray == NULL) - */ -! if (stackp->ffs_filearray == NULL -! && ff_check_visited(&search_ctx->ffsc_dir_visited_list - ->ffvl_visited_list, -! stackp->ffs_fix_path - #ifdef FEAT_PATH_EXTRA -! , stackp->ffs_wc_path - #endif - ) == FAIL) - { -*************** -*** 4430,4442 **** - { - verbose_enter_scroll(); - smsg((char_u *)"Already Searched: %s (%s)", -! ctx->ffs_fix_path, ctx->ffs_wc_path); - /* don't overwrite this either */ - msg_puts((char_u *)"\n"); - verbose_leave_scroll(); - } - #endif -! ff_free_stack_element(ctx); - continue; - } - #ifdef FF_VERBOSE ---- 4432,4444 ---- - { - verbose_enter_scroll(); - smsg((char_u *)"Already Searched: %s (%s)", -! stackp->ffs_fix_path, stackp->ffs_wc_path); - /* don't overwrite this either */ - msg_puts((char_u *)"\n"); - verbose_leave_scroll(); - } - #endif -! ff_free_stack_element(stackp); - continue; - } - #ifdef FF_VERBOSE -*************** -*** 4444,4450 **** - { - verbose_enter_scroll(); - smsg((char_u *)"Searching: %s (%s)", -! ctx->ffs_fix_path, ctx->ffs_wc_path); - /* don't overwrite this either */ - msg_puts((char_u *)"\n"); - verbose_leave_scroll(); ---- 4446,4452 ---- - { - verbose_enter_scroll(); - smsg((char_u *)"Searching: %s (%s)", -! stackp->ffs_fix_path, stackp->ffs_wc_path); - /* don't overwrite this either */ - msg_puts((char_u *)"\n"); - verbose_leave_scroll(); -*************** -*** 4452,4460 **** - #endif - - /* check depth */ -! if (ctx->ffs_level <= 0) - { -! ff_free_stack_element(ctx); - continue; - } - ---- 4454,4462 ---- - #endif - - /* check depth */ -! if (stackp->ffs_level <= 0) - { -! ff_free_stack_element(stackp); - continue; - } - -*************** -*** 4466,4472 **** - * and all possible expands are returned in one array. We use this - * to handle the expansion of '**' into an empty string. - */ -! if (ctx->ffs_filearray == NULL) - { - char_u *dirptrs[2]; - ---- 4468,4474 ---- - * and all possible expands are returned in one array. We use this - * to handle the expansion of '**' into an empty string. - */ -! if (stackp->ffs_filearray == NULL) - { - char_u *dirptrs[2]; - -*************** -*** 4477,4495 **** - dirptrs[1] = NULL; - - /* if we have a start dir copy it in */ -! if (!vim_isAbsName(ctx->ffs_fix_path) -! && ff_search_ctx->ffsc_start_dir) - { -! STRCPY(file_path, ff_search_ctx->ffsc_start_dir); - add_pathsep(file_path); - } - - /* append the fix part of the search path */ -! STRCAT(file_path, ctx->ffs_fix_path); - add_pathsep(file_path); - - #ifdef FEAT_PATH_EXTRA -! rest_of_wildcards = ctx->ffs_wc_path; - if (*rest_of_wildcards != NUL) - { - len = (int)STRLEN(file_path); ---- 4479,4497 ---- - dirptrs[1] = NULL; - - /* if we have a start dir copy it in */ -! if (!vim_isAbsName(stackp->ffs_fix_path) -! && search_ctx->ffsc_start_dir) - { -! STRCPY(file_path, search_ctx->ffsc_start_dir); - add_pathsep(file_path); - } - - /* append the fix part of the search path */ -! STRCAT(file_path, stackp->ffs_fix_path); - add_pathsep(file_path); - - #ifdef FEAT_PATH_EXTRA -! rest_of_wildcards = stackp->ffs_wc_path; - if (*rest_of_wildcards != NUL) - { - len = (int)STRLEN(file_path); -*************** -*** 4516,4526 **** - else - rest_of_wildcards += 3; - -! if (ctx->ffs_star_star_empty == 0) - { - /* if not done before, expand '**' to empty */ -! ctx->ffs_star_star_empty = 1; -! dirptrs[1] = ctx->ffs_fix_path; - } - } - ---- 4518,4528 ---- - else - rest_of_wildcards += 3; - -! if (stackp->ffs_star_star_empty == 0) - { - /* if not done before, expand '**' to empty */ -! stackp->ffs_star_star_empty = 1; -! dirptrs[1] = stackp->ffs_fix_path; - } - } - -*************** -*** 4547,4576 **** - */ - if (path_with_url(dirptrs[0])) - { -! ctx->ffs_filearray = (char_u **) - alloc((unsigned)sizeof(char *)); -! if (ctx->ffs_filearray != NULL -! && (ctx->ffs_filearray[0] - = vim_strsave(dirptrs[0])) != NULL) -! ctx->ffs_filearray_size = 1; - else -! ctx->ffs_filearray_size = 0; - } - else - expand_wildcards((dirptrs[1] == NULL) ? 1 : 2, dirptrs, -! &ctx->ffs_filearray_size, -! &ctx->ffs_filearray, - EW_DIR|EW_ADDSLASH|EW_SILENT); - -! ctx->ffs_filearray_cur = 0; -! ctx->ffs_stage = 0; - } - #ifdef FEAT_PATH_EXTRA - else -! rest_of_wildcards = &ctx->ffs_wc_path[STRLEN(ctx->ffs_wc_path)]; - #endif - -! if (ctx->ffs_stage == 0) - { - /* this is the first time we work on this directory */ - #ifdef FEAT_PATH_EXTRA ---- 4549,4579 ---- - */ - if (path_with_url(dirptrs[0])) - { -! stackp->ffs_filearray = (char_u **) - alloc((unsigned)sizeof(char *)); -! if (stackp->ffs_filearray != NULL -! && (stackp->ffs_filearray[0] - = vim_strsave(dirptrs[0])) != NULL) -! stackp->ffs_filearray_size = 1; - else -! stackp->ffs_filearray_size = 0; - } - else - expand_wildcards((dirptrs[1] == NULL) ? 1 : 2, dirptrs, -! &stackp->ffs_filearray_size, -! &stackp->ffs_filearray, - EW_DIR|EW_ADDSLASH|EW_SILENT); - -! stackp->ffs_filearray_cur = 0; -! stackp->ffs_stage = 0; - } - #ifdef FEAT_PATH_EXTRA - else -! rest_of_wildcards = &stackp->ffs_wc_path[ -! STRLEN(stackp->ffs_wc_path)]; - #endif - -! if (stackp->ffs_stage == 0) - { - /* this is the first time we work on this directory */ - #ifdef FEAT_PATH_EXTRA -*************** -*** 4581,4598 **** - * we don't have further wildcards to expand, so we have to - * check for the final file now - */ -! for (i = ctx->ffs_filearray_cur; -! i < ctx->ffs_filearray_size; ++i) - { -! if (!path_with_url(ctx->ffs_filearray[i]) -! && !mch_isdir(ctx->ffs_filearray[i])) - continue; /* not a directory */ - - /* prepare the filename to be checked for existance - * below */ -! STRCPY(file_path, ctx->ffs_filearray[i]); - add_pathsep(file_path); -! STRCAT(file_path, ff_search_ctx->ffsc_file_to_search); - - /* - * Try without extra suffix and then with suffixes ---- 4584,4601 ---- - * we don't have further wildcards to expand, so we have to - * check for the final file now - */ -! for (i = stackp->ffs_filearray_cur; -! i < stackp->ffs_filearray_size; ++i) - { -! if (!path_with_url(stackp->ffs_filearray[i]) -! && !mch_isdir(stackp->ffs_filearray[i])) - continue; /* not a directory */ - - /* prepare the filename to be checked for existance - * below */ -! STRCPY(file_path, stackp->ffs_filearray[i]); - add_pathsep(file_path); -! STRCAT(file_path, search_ctx->ffsc_file_to_search); - - /* - * Try without extra suffix and then with suffixes -*************** -*** 4606,4617 **** - { - /* if file exists and we didn't already find it */ - if ((path_with_url(file_path) -! || (mch_getperm(file_path) >= 0 -! && (!ff_search_ctx->ffsc_need_dir -! || mch_isdir(file_path)))) - #ifndef FF_VERBOSE - && (ff_check_visited( -! &ff_search_ctx->ffsc_visited_list->ffvl_visited_list, - file_path - #ifdef FEAT_PATH_EXTRA - , (char_u *)"" ---- 4609,4623 ---- - { - /* if file exists and we didn't already find it */ - if ((path_with_url(file_path) -! || (mch_getperm(file_path) >= 0 -! && (search_ctx->ffsc_find_what -! == FINDFILE_BOTH -! || ((search_ctx->ffsc_find_what -! == FINDFILE_DIR) -! == mch_isdir(file_path))))) - #ifndef FF_VERBOSE - && (ff_check_visited( -! &search_ctx->ffsc_visited_list->ffvl_visited_list, - file_path - #ifdef FEAT_PATH_EXTRA - , (char_u *)"" -*************** -*** 4622,4628 **** - { - #ifdef FF_VERBOSE - if (ff_check_visited( -! &ff_search_ctx->ffsc_visited_list->ffvl_visited_list, - file_path - #ifdef FEAT_PATH_EXTRA - , (char_u *)"" ---- 4628,4634 ---- - { - #ifdef FF_VERBOSE - if (ff_check_visited( -! &search_ctx->ffsc_visited_list->ffvl_visited_list, - file_path - #ifdef FEAT_PATH_EXTRA - , (char_u *)"" -*************** -*** 4643,4650 **** - #endif - - /* push dir to examine rest of subdirs later */ -! ctx->ffs_filearray_cur = i + 1; -! ff_push(ctx); - - simplify_filename(file_path); - if (mch_dirname(ff_expand_buffer, MAXPATHL) ---- 4649,4656 ---- - #endif - - /* push dir to examine rest of subdirs later */ -! stackp->ffs_filearray_cur = i + 1; -! ff_push(search_ctx, stackp); - - simplify_filename(file_path); - if (mch_dirname(ff_expand_buffer, MAXPATHL) -*************** -*** 4686,4704 **** - * still wildcards left, push the directories for further - * search - */ -! for (i = ctx->ffs_filearray_cur; -! i < ctx->ffs_filearray_size; ++i) - { -! if (!mch_isdir(ctx->ffs_filearray[i])) - continue; /* not a directory */ - -! ff_push(ff_create_stack_element(ctx->ffs_filearray[i], -! rest_of_wildcards, ctx->ffs_level - 1, 0)); - } - } - #endif -! ctx->ffs_filearray_cur = 0; -! ctx->ffs_stage = 1; - } - - #ifdef FEAT_PATH_EXTRA ---- 4692,4713 ---- - * still wildcards left, push the directories for further - * search - */ -! for (i = stackp->ffs_filearray_cur; -! i < stackp->ffs_filearray_size; ++i) - { -! if (!mch_isdir(stackp->ffs_filearray[i])) - continue; /* not a directory */ - -! ff_push(search_ctx, -! ff_create_stack_element( -! stackp->ffs_filearray[i], -! rest_of_wildcards, -! stackp->ffs_level - 1, 0)); - } - } - #endif -! stackp->ffs_filearray_cur = 0; -! stackp->ffs_stage = 1; - } - - #ifdef FEAT_PATH_EXTRA -*************** -*** 4706,4728 **** - * if wildcards contains '**' we have to descent till we reach the - * leaves of the directory tree. - */ -! if (STRNCMP(ctx->ffs_wc_path, "**", 2) == 0) - { -! for (i = ctx->ffs_filearray_cur; -! i < ctx->ffs_filearray_size; ++i) - { -! if (fnamecmp(ctx->ffs_filearray[i], ctx->ffs_fix_path) == 0) - continue; /* don't repush same directory */ -! if (!mch_isdir(ctx->ffs_filearray[i])) - continue; /* not a directory */ -! ff_push(ff_create_stack_element(ctx->ffs_filearray[i], -! ctx->ffs_wc_path, ctx->ffs_level - 1, 1)); - } - } - #endif - - /* we are done with the current directory */ -! ff_free_stack_element(ctx); - - } - ---- 4715,4739 ---- - * if wildcards contains '**' we have to descent till we reach the - * leaves of the directory tree. - */ -! if (STRNCMP(stackp->ffs_wc_path, "**", 2) == 0) - { -! for (i = stackp->ffs_filearray_cur; -! i < stackp->ffs_filearray_size; ++i) - { -! if (fnamecmp(stackp->ffs_filearray[i], -! stackp->ffs_fix_path) == 0) - continue; /* don't repush same directory */ -! if (!mch_isdir(stackp->ffs_filearray[i])) - continue; /* not a directory */ -! ff_push(search_ctx, -! ff_create_stack_element(stackp->ffs_filearray[i], -! stackp->ffs_wc_path, stackp->ffs_level - 1, 1)); - } - } - #endif - - /* we are done with the current directory */ -! ff_free_stack_element(stackp); - - } - -*************** -*** 4730,4769 **** - /* If we reached this, we didn't find anything downwards. - * Let's check if we should do an upward search. - */ -! if (ff_search_ctx->ffsc_start_dir -! && ff_search_ctx->ffsc_stopdirs_v != NULL && !got_int) - { - ff_stack_T *sptr; - - /* is the last starting directory in the stop list? */ -! if (ff_path_in_stoplist(ff_search_ctx->ffsc_start_dir, -! (int)(path_end - ff_search_ctx->ffsc_start_dir), -! ff_search_ctx->ffsc_stopdirs_v) == TRUE) - break; - - /* cut of last dir */ -! while (path_end > ff_search_ctx->ffsc_start_dir -! && vim_ispathsep(*path_end)) - path_end--; -! while (path_end > ff_search_ctx->ffsc_start_dir -! && !vim_ispathsep(path_end[-1])) - path_end--; - *path_end = 0; - path_end--; - -! if (*ff_search_ctx->ffsc_start_dir == 0) - break; - -! STRCPY(file_path, ff_search_ctx->ffsc_start_dir); - add_pathsep(file_path); -! STRCAT(file_path, ff_search_ctx->ffsc_fix_path); - - /* create a new stack entry */ - sptr = ff_create_stack_element(file_path, -! ff_search_ctx->ffsc_wc_path, ff_search_ctx->ffsc_level, 0); - if (sptr == NULL) - break; -! ff_push(sptr); - } - else - break; ---- 4741,4780 ---- - /* If we reached this, we didn't find anything downwards. - * Let's check if we should do an upward search. - */ -! if (search_ctx->ffsc_start_dir -! && search_ctx->ffsc_stopdirs_v != NULL && !got_int) - { - ff_stack_T *sptr; - - /* is the last starting directory in the stop list? */ -! if (ff_path_in_stoplist(search_ctx->ffsc_start_dir, -! (int)(path_end - search_ctx->ffsc_start_dir), -! search_ctx->ffsc_stopdirs_v) == TRUE) - break; - - /* cut of last dir */ -! while (path_end > search_ctx->ffsc_start_dir -! && vim_ispathsep(*path_end)) - path_end--; -! while (path_end > search_ctx->ffsc_start_dir -! && !vim_ispathsep(path_end[-1])) - path_end--; - *path_end = 0; - path_end--; - -! if (*search_ctx->ffsc_start_dir == 0) - break; - -! STRCPY(file_path, search_ctx->ffsc_start_dir); - add_pathsep(file_path); -! STRCAT(file_path, search_ctx->ffsc_fix_path); - - /* create a new stack entry */ - sptr = ff_create_stack_element(file_path, -! search_ctx->ffsc_wc_path, search_ctx->ffsc_level, 0); - if (sptr == NULL) - break; -! ff_push(search_ctx, sptr); - } - else - break; -*************** -*** 4779,4794 **** - * Can handle it if the passed search_context is NULL; - */ - void -! vim_findfile_free_visited(search_ctx) -! void *search_ctx; - { -! if (search_ctx == NULL) -! return; - -! ff_search_ctx = (ff_search_ctx_T *)search_ctx; - -! vim_findfile_free_visited_list(&ff_search_ctx->ffsc_visited_lists_list); -! vim_findfile_free_visited_list(&ff_search_ctx->ffsc_dir_visited_lists_list); - } - - static void ---- 4790,4806 ---- - * Can handle it if the passed search_context is NULL; - */ - void -! vim_findfile_free_visited(search_ctx_arg) -! void *search_ctx_arg; - { -! ff_search_ctx_T *search_ctx; - -! if (search_ctx_arg == NULL) -! return; - -! search_ctx = (ff_search_ctx_T *)search_ctx_arg; -! vim_findfile_free_visited_list(&search_ctx->ffsc_visited_lists_list); -! vim_findfile_free_visited_list(&search_ctx->ffsc_dir_visited_lists_list); - } - - static void -*************** -*** 5103,5135 **** - } - - /* -! * push a dir on the directory stack - */ - static void -! ff_push(ctx) -! ff_stack_T *ctx; - { - /* check for NULL pointer, not to return an error to the user, but - * to prevent a crash */ -! if (ctx != NULL) - { -! ctx->ffs_prev = ff_search_ctx->ffsc_stack_ptr; -! ff_search_ctx->ffsc_stack_ptr = ctx; - } - } - - /* -! * pop a dir from the directory stack -! * returns NULL if stack is empty - */ - static ff_stack_T * -! ff_pop() - { - ff_stack_T *sptr; - -! sptr = ff_search_ctx->ffsc_stack_ptr; -! if (ff_search_ctx->ffsc_stack_ptr != NULL) -! ff_search_ctx->ffsc_stack_ptr = ff_search_ctx->ffsc_stack_ptr->ffs_prev; - - return sptr; - } ---- 5115,5149 ---- - } - - /* -! * Push a dir on the directory stack. - */ - static void -! ff_push(search_ctx, stack_ptr) -! ff_search_ctx_T *search_ctx; -! ff_stack_T *stack_ptr; - { - /* check for NULL pointer, not to return an error to the user, but - * to prevent a crash */ -! if (stack_ptr != NULL) - { -! stack_ptr->ffs_prev = search_ctx->ffsc_stack_ptr; -! search_ctx->ffsc_stack_ptr = stack_ptr; - } - } - - /* -! * Pop a dir from the directory stack. -! * Returns NULL if stack is empty. - */ - static ff_stack_T * -! ff_pop(search_ctx) -! ff_search_ctx_T *search_ctx; - { - ff_stack_T *sptr; - -! sptr = search_ctx->ffsc_stack_ptr; -! if (search_ctx->ffsc_stack_ptr != NULL) -! search_ctx->ffsc_stack_ptr = search_ctx->ffsc_stack_ptr->ffs_prev; - - return sptr; - } -*************** -*** 5138,5199 **** - * free the given stack element - */ - static void -! ff_free_stack_element(ctx) -! ff_stack_T *ctx; - { - /* vim_free handles possible NULL pointers */ -! vim_free(ctx->ffs_fix_path); - #ifdef FEAT_PATH_EXTRA -! vim_free(ctx->ffs_wc_path); - #endif - -! if (ctx->ffs_filearray != NULL) -! FreeWild(ctx->ffs_filearray_size, ctx->ffs_filearray); - -! vim_free(ctx); - } - - /* -! * clear the search context - */ - static void -! ff_clear() - { - ff_stack_T *sptr; - - /* clear up stack */ -! while ((sptr = ff_pop()) != NULL) - ff_free_stack_element(sptr); - -! vim_free(ff_search_ctx->ffsc_file_to_search); -! vim_free(ff_search_ctx->ffsc_start_dir); -! vim_free(ff_search_ctx->ffsc_fix_path); - #ifdef FEAT_PATH_EXTRA -! vim_free(ff_search_ctx->ffsc_wc_path); - #endif - - #ifdef FEAT_PATH_EXTRA -! if (ff_search_ctx->ffsc_stopdirs_v != NULL) - { - int i = 0; - -! while (ff_search_ctx->ffsc_stopdirs_v[i] != NULL) - { -! vim_free(ff_search_ctx->ffsc_stopdirs_v[i]); - i++; - } -! vim_free(ff_search_ctx->ffsc_stopdirs_v); - } -! ff_search_ctx->ffsc_stopdirs_v = NULL; - #endif - - /* reset everything */ -! ff_search_ctx->ffsc_file_to_search = NULL; -! ff_search_ctx->ffsc_start_dir = NULL; -! ff_search_ctx->ffsc_fix_path = NULL; - #ifdef FEAT_PATH_EXTRA -! ff_search_ctx->ffsc_wc_path = NULL; -! ff_search_ctx->ffsc_level = 0; - #endif - } - ---- 5152,5214 ---- - * free the given stack element - */ - static void -! ff_free_stack_element(stack_ptr) -! ff_stack_T *stack_ptr; - { - /* vim_free handles possible NULL pointers */ -! vim_free(stack_ptr->ffs_fix_path); - #ifdef FEAT_PATH_EXTRA -! vim_free(stack_ptr->ffs_wc_path); - #endif - -! if (stack_ptr->ffs_filearray != NULL) -! FreeWild(stack_ptr->ffs_filearray_size, stack_ptr->ffs_filearray); - -! vim_free(stack_ptr); - } - - /* -! * Clear the search context, but NOT the visited list. - */ - static void -! ff_clear(search_ctx) -! ff_search_ctx_T *search_ctx; - { - ff_stack_T *sptr; - - /* clear up stack */ -! while ((sptr = ff_pop(search_ctx)) != NULL) - ff_free_stack_element(sptr); - -! vim_free(search_ctx->ffsc_file_to_search); -! vim_free(search_ctx->ffsc_start_dir); -! vim_free(search_ctx->ffsc_fix_path); - #ifdef FEAT_PATH_EXTRA -! vim_free(search_ctx->ffsc_wc_path); - #endif - - #ifdef FEAT_PATH_EXTRA -! if (search_ctx->ffsc_stopdirs_v != NULL) - { - int i = 0; - -! while (search_ctx->ffsc_stopdirs_v[i] != NULL) - { -! vim_free(search_ctx->ffsc_stopdirs_v[i]); - i++; - } -! vim_free(search_ctx->ffsc_stopdirs_v); - } -! search_ctx->ffsc_stopdirs_v = NULL; - #endif - - /* reset everything */ -! search_ctx->ffsc_file_to_search = NULL; -! search_ctx->ffsc_start_dir = NULL; -! search_ctx->ffsc_fix_path = NULL; - #ifdef FEAT_PATH_EXTRA -! search_ctx->ffsc_wc_path = NULL; -! search_ctx->ffsc_level = 0; - #endif - } - -*************** -*** 5242,5248 **** - - #if defined(FEAT_SEARCHPATH) || defined(PROTO) - /* -! * Find the file name "ptr[len]" in the path. - * - * On the first call set the parameter 'first' to TRUE to initialize - * the search. For repeating calls to FALSE. ---- 5257,5263 ---- - - #if defined(FEAT_SEARCHPATH) || defined(PROTO) - /* -! * Find the file name "ptr[len]" in the path. Also finds directory names. - * - * On the first call set the parameter 'first' to TRUE to initialize - * the search. For repeating calls to FALSE. -*************** -*** 5276,5282 **** - { - return find_file_in_path_option(ptr, len, options, first, - *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path, -! FALSE, rel_fname, curbuf->b_p_sua); - } - - static char_u *ff_file_to_find = NULL; ---- 5291,5297 ---- - { - return find_file_in_path_option(ptr, len, options, first, - *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path, -! FINDFILE_BOTH, rel_fname, curbuf->b_p_sua); - } - - static char_u *ff_file_to_find = NULL; -*************** -*** 5309,5325 **** - char_u *rel_fname; /* file name searching relative to */ - { - return find_file_in_path_option(ptr, len, options, TRUE, p_cdpath, -! TRUE, rel_fname, (char_u *)""); - } - - char_u * -! find_file_in_path_option(ptr, len, options, first, path_option, need_dir, rel_fname, suffixes) - char_u *ptr; /* file name */ - int len; /* length of file name */ - int options; - int first; /* use count'th matching file name */ - char_u *path_option; /* p_path or p_cdpath */ -! int need_dir; /* looking for directory name */ - char_u *rel_fname; /* file name we are looking relative to. */ - char_u *suffixes; /* list of suffixes, 'suffixesadd' option */ - { ---- 5324,5340 ---- - char_u *rel_fname; /* file name searching relative to */ - { - return find_file_in_path_option(ptr, len, options, TRUE, p_cdpath, -! FINDFILE_DIR, rel_fname, (char_u *)""); - } - - char_u * -! find_file_in_path_option(ptr, len, options, first, path_option, find_what, rel_fname, suffixes) - char_u *ptr; /* file name */ - int len; /* length of file name */ - int options; - int first; /* use count'th matching file name */ - char_u *path_option; /* p_path or p_cdpath */ -! int find_what; /* FINDFILE_FILE, _DIR or _BOTH */ - char_u *rel_fname; /* file name we are looking relative to. */ - char_u *suffixes; /* list of suffixes, 'suffixesadd' option */ - { -*************** -*** 5421,5432 **** - #ifdef DJGPP - /* "C:" by itself will fail for mch_getperm(), - * assume it's always valid. */ -! (need_dir && NameBuff[0] != NUL - && NameBuff[1] == ':' - && NameBuff[2] == NUL) || - #endif - (mch_getperm(NameBuff) >= 0 -! && (!need_dir || mch_isdir(NameBuff)))) - { - file_name = vim_strsave(NameBuff); - goto theend; ---- 5436,5449 ---- - #ifdef DJGPP - /* "C:" by itself will fail for mch_getperm(), - * assume it's always valid. */ -! (find_what != FINDFILE_FILE && NameBuff[0] != NUL - && NameBuff[1] == ':' - && NameBuff[2] == NUL) || - #endif - (mch_getperm(NameBuff) >= 0 -! && (find_what == FINDFILE_BOTH -! || ((find_what == FINDFILE_DIR) -! == mch_isdir(NameBuff))))) - { - file_name = vim_strsave(NameBuff); - goto theend; -*************** -*** 5457,5465 **** - { - if (did_findfile_init) - { -- ff_search_ctx->ffsc_need_dir = need_dir; - file_name = vim_findfile(fdip_search_ctx); -- ff_search_ctx->ffsc_need_dir = FALSE; - if (file_name != NULL) - break; - ---- 5474,5480 ---- -*************** -*** 5492,5498 **** - r_ptr = NULL; - #endif - fdip_search_ctx = vim_findfile_init(buf, ff_file_to_find, -! r_ptr, 100, FALSE, TRUE, - fdip_search_ctx, FALSE, rel_fname); - if (fdip_search_ctx != NULL) - did_findfile_init = TRUE; ---- 5507,5513 ---- - r_ptr = NULL; - #endif - fdip_search_ctx = vim_findfile_init(buf, ff_file_to_find, -! r_ptr, 100, FALSE, find_what, - fdip_search_ctx, FALSE, rel_fname); - if (fdip_search_ctx != NULL) - did_findfile_init = TRUE; -*************** -*** 5504,5510 **** - { - if (first == TRUE) - { -! if (need_dir) - EMSG2(_("E344: Can't find directory \"%s\" in cdpath"), - ff_file_to_find); - else ---- 5519,5525 ---- - { - if (first == TRUE) - { -! if (find_what == FINDFILE_DIR) - EMSG2(_("E344: Can't find directory \"%s\" in cdpath"), - ff_file_to_find); - else -*************** -*** 5513,5519 **** - } - else - { -! if (need_dir) - EMSG2(_("E346: No more directory \"%s\" found in cdpath"), - ff_file_to_find); - else ---- 5528,5534 ---- - } - else - { -! if (find_what == FINDFILE_DIR) - EMSG2(_("E346: No more directory \"%s\" found in cdpath"), - ff_file_to_find); - else -*** ../vim-7.1.255/src/vim.h Sat Jan 19 15:55:51 2008 ---- src/vim.h Tue Jan 22 22:35:16 2008 -*************** -*** 721,726 **** ---- 721,731 ---- - /* Note: mostly EW_NOTFOUND and EW_SILENT are mutually exclusive: EW_NOTFOUND - * is used when executing commands and EW_SILENT for interactive expanding. */ - -+ /* Flags for find_file_*() functions. */ -+ #define FINDFILE_FILE 0 /* only files */ -+ #define FINDFILE_DIR 1 /* only directories */ -+ #define FINDFILE_BOTH 2 /* files and directories */ -+ - #ifdef FEAT_VERTSPLIT - # define W_WINCOL(wp) (wp->w_wincol) - # define W_WIDTH(wp) (wp->w_width) -*** ../vim-7.1.255/src/tag.c Sat Jan 19 15:55:51 2008 ---- src/tag.c Wed Feb 13 18:02:32 2008 -*************** -*** 2669,2676 **** - - tnp->tn_search_ctx = vim_findfile_init(buf, filename, - r_ptr, 100, -! FALSE, /* don't free visited list */ -! FALSE, /* we search for a file */ - tnp->tn_search_ctx, TRUE, curbuf->b_ffname); - if (tnp->tn_search_ctx != NULL) - tnp->tn_did_filefind_init = TRUE; ---- 2669,2676 ---- - - tnp->tn_search_ctx = vim_findfile_init(buf, filename, - r_ptr, 100, -! FALSE, /* don't free visited list */ -! FINDFILE_FILE, /* we search for a file */ - tnp->tn_search_ctx, TRUE, curbuf->b_ffname); - if (tnp->tn_search_ctx != NULL) - tnp->tn_did_filefind_init = TRUE; -*************** -*** 2691,2696 **** ---- 2691,2697 ---- - { - vim_free(tnp->tn_tags); - vim_findfile_cleanup(tnp->tn_search_ctx); -+ tnp->tn_search_ctx = NULL; - ga_clear_strings(&tag_fnames); - } - -*** ../vim-7.1.255/src/version.c Wed Feb 20 11:27:59 2008 ---- src/version.c Wed Feb 20 12:09:54 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 256, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -38. You wake up at 3 a.m. to go to the bathroom and stop and check your e-mail - on the way back to bed. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.257 b/7.1.257 deleted file mode 100644 index 5aa91281..00000000 --- a/7.1.257 +++ /dev/null @@ -1,87 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.257 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.257 -Problem: Configure can't always find the Tcl header files. -Solution: Also look in /usr/local/include/tcl$tclver and - /usr/include/tcl$tclver (James Vega) -Files: src/auto/configure, src/configure.in - - -*** ../vim-7.1.256/src/auto/configure Wed Feb 13 10:27:28 2008 ---- src/auto/configure Wed Feb 13 11:20:00 2008 -*************** -*** 4669,4678 **** - echo "$as_me:$LINENO: checking for location of Tcl include" >&5 - echo $ECHO_N "checking for location of Tcl include... $ECHO_C" >&6 - if test "x$MACOSX" != "xyes"; then -! tclinc="$tclloc/include $tclloc/include/tcl $tclloc/include/tcl$tclver /usr/local/include /usr/include" - else - tclinc="/System/Library/Frameworks/Tcl.framework/Headers" - fi - for try in $tclinc; do - if test -f "$try/tcl.h"; then - echo "$as_me:$LINENO: result: $try/tcl.h" >&5 ---- 4669,4679 ---- - echo "$as_me:$LINENO: checking for location of Tcl include" >&5 - echo $ECHO_N "checking for location of Tcl include... $ECHO_C" >&6 - if test "x$MACOSX" != "xyes"; then -! tclinc="$tclloc/include $tclloc/include/tcl $tclloc/include/tcl$tclver /usr/local/include /usr/include /usr/include/tcl$tclver" - else - tclinc="/System/Library/Frameworks/Tcl.framework/Headers" - fi -+ TCL_INC= - for try in $tclinc; do - if test -f "$try/tcl.h"; then - echo "$as_me:$LINENO: result: $try/tcl.h" >&5 -*** ../vim-7.1.256/src/configure.in Wed Feb 13 10:27:28 2008 ---- src/configure.in Wed Feb 13 11:23:55 2008 -*************** -*** 794,804 **** - - AC_MSG_CHECKING(for location of Tcl include) - if test "x$MACOSX" != "xyes"; then -! tclinc="$tclloc/include $tclloc/include/tcl $tclloc/include/tcl$tclver /usr/local/include /usr/include" - else - dnl For Mac OS X 10.3, use the OS-provided framework location - tclinc="/System/Library/Frameworks/Tcl.framework/Headers" - fi - for try in $tclinc; do - if test -f "$try/tcl.h"; then - AC_MSG_RESULT($try/tcl.h) ---- 794,805 ---- - - AC_MSG_CHECKING(for location of Tcl include) - if test "x$MACOSX" != "xyes"; then -! tclinc="$tclloc/include $tclloc/include/tcl $tclloc/include/tcl$tclver /usr/local/include /usr/local/include/tcl$tclver /usr/include /usr/include/tcl$tclver" - else - dnl For Mac OS X 10.3, use the OS-provided framework location - tclinc="/System/Library/Frameworks/Tcl.framework/Headers" - fi -+ TCL_INC= - for try in $tclinc; do - if test -f "$try/tcl.h"; then - AC_MSG_RESULT($try/tcl.h) -*** ../vim-7.1.256/src/version.c Wed Feb 20 12:22:59 2008 ---- src/version.c Wed Feb 20 12:42:17 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 257, - /**/ - --- -He who laughs last, thinks slowest. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.258 b/7.1.258 deleted file mode 100644 index cf36a32e..00000000 --- a/7.1.258 +++ /dev/null @@ -1,116 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.258 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.258 -Problem: Crash when doing "d/\n/e" and 'virtualedit' is "all". (Andy Wokula) -Solution: Avoid that the column becomes negative. Also fixes other problems - with the end of a pattern match is in column zero. (A.Politz) -Files: src/search.c - - -*** ../vim-7.1.257/src/search.c Sat Jan 26 21:15:00 2008 ---- src/search.c Wed Feb 20 13:22:23 2008 -*************** -*** 624,630 **** - #ifdef FEAT_EVAL - submatch = first_submatch(®match); - #endif -! /* Line me be past end of buffer for "\n\zs". */ - if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) - ptr = (char_u *)""; - else ---- 624,630 ---- - #ifdef FEAT_EVAL - submatch = first_submatch(®match); - #endif -! /* "lnum" may be past end of buffer for "\n\zs". */ - if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) - ptr = (char_u *)""; - else -*************** -*** 833,853 **** - continue; - } - -! if (options & SEARCH_END && !(options & SEARCH_NOOF)) - { - pos->lnum = lnum + endpos.lnum; -! pos->col = endpos.col - 1; -! #ifdef FEAT_MBYTE -! if (has_mbyte) - { -! /* 'e' offset may put us just below the last line */ -! if (pos->lnum > buf->b_ml.ml_line_count) -! ptr = (char_u *)""; -! else -! ptr = ml_get_buf(buf, pos->lnum, FALSE); -! pos->col -= (*mb_head_off)(ptr, ptr + pos->col); - } - #endif - } - else - { ---- 833,870 ---- - continue; - } - -! /* With the SEARCH_END option move to the last character -! * of the match. Don't do it for an empty match, end -! * should be same as start then. */ -! if (options & SEARCH_END && !(options & SEARCH_NOOF) -! && !(matchpos.lnum == endpos.lnum -! && matchpos.col == endpos.col)) - { -+ /* For a match in the first column, set the position -+ * on the NUL in the previous line. */ - pos->lnum = lnum + endpos.lnum; -! pos->col = endpos.col; -! if (endpos.col == 0) - { -! if (pos->lnum > 1) /* just in case */ -! { -! --pos->lnum; -! pos->col = (colnr_T)STRLEN(ml_get_buf(buf, -! pos->lnum, FALSE)); -! } - } -+ else -+ { -+ --pos->col; -+ #ifdef FEAT_MBYTE -+ if (has_mbyte -+ && pos->lnum <= buf->b_ml.ml_line_count) -+ { -+ ptr = ml_get_buf(buf, pos->lnum, FALSE); -+ pos->col -= (*mb_head_off)(ptr, ptr + pos->col); -+ } - #endif -+ } - } - else - { -*** ../vim-7.1.257/src/version.c Wed Feb 20 12:43:05 2008 ---- src/version.c Wed Feb 20 13:37:32 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 258, - /**/ - --- -Micro$oft: where do you want to go today? - Linux: where do you want to go tomorrow? - FreeBSD: are you guys coming, or what? - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.259 b/7.1.259 deleted file mode 100644 index fb4fb79f..00000000 --- a/7.1.259 +++ /dev/null @@ -1,61 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.259 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.259 -Problem: Cursor is in the wrong position when 'rightleft' is set, - 'encoding' is "utf-8" and on an illegal byte. (Dominique Pelle) -Solution: Only put the cursor in the first column when actually on a - double-wide character. (Yukihiro Nakadaira) -Files: src/screen.c - - -*** ../vim-7.1.258/src/screen.c Wed Feb 13 21:48:24 2008 ---- src/screen.c Wed Feb 20 14:06:26 2008 -*************** -*** 8045,8053 **** - windgoto(W_WINROW(curwin) + curwin->w_wrow, - W_WINCOL(curwin) + ( - #ifdef FEAT_RIGHTLEFT - curwin->w_p_rl ? ((int)W_WIDTH(curwin) - curwin->w_wcol - ( - # ifdef FEAT_MBYTE -! has_mbyte ? (*mb_ptr2cells)(ml_get_cursor()) : - # endif - 1)) : - #endif ---- 8045,8057 ---- - windgoto(W_WINROW(curwin) + curwin->w_wrow, - W_WINCOL(curwin) + ( - #ifdef FEAT_RIGHTLEFT -+ /* With 'rightleft' set and the cursor on a double-wide -+ * character, position it on the leftmost column. */ - curwin->w_p_rl ? ((int)W_WIDTH(curwin) - curwin->w_wcol - ( - # ifdef FEAT_MBYTE -! (has_mbyte -! && (*mb_ptr2cells)(ml_get_cursor()) == 2 -! && vim_isprintc(gchar_cursor())) ? 2 : - # endif - 1)) : - #endif -*** ../vim-7.1.258/src/version.c Wed Feb 20 13:41:14 2008 ---- src/version.c Wed Feb 20 14:10:23 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 259, - /**/ - --- -A day without sunshine is like, well, night. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.260 b/7.1.260 deleted file mode 100644 index 4bdd7673..00000000 --- a/7.1.260 +++ /dev/null @@ -1,55 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.260 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.260 -Problem: Cursor positioning problem after ^@ wrapping halfway when - 'encoding' is utf-8. -Solution: Only count a position for printable characters. (partly by - Yukihiro Nakadaira) -Files: src/charset.c - - -*** ../vim-7.1.259/src/charset.c Sun Aug 19 22:42:27 2007 ---- src/charset.c Wed Feb 20 14:39:04 2008 -*************** -*** 1290,1296 **** - /* If a double-cell char doesn't fit at the end of a line - * it wraps to the next line, it's like this char is three - * cells wide. */ -! if (incr == 2 && wp->w_p_wrap && in_win_border(wp, vcol)) - { - ++incr; - head = 1; ---- 1290,1297 ---- - /* If a double-cell char doesn't fit at the end of a line - * it wraps to the next line, it's like this char is three - * cells wide. */ -! if (incr == 2 && wp->w_p_wrap && MB_BYTE2LEN(*ptr) > 1 -! && in_win_border(wp, vcol)) - { - ++incr; - head = 1; -*** ../vim-7.1.259/src/version.c Wed Feb 20 14:15:45 2008 ---- src/version.c Wed Feb 20 14:57:45 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 260, - /**/ - --- -The users that I support would double-click on a landmine to find out -what happens. -- A system administrator - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.261 b/7.1.261 deleted file mode 100644 index 8c05e6c9..00000000 --- a/7.1.261 +++ /dev/null @@ -1,78 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.261 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.261 -Problem: When a 2 byte BOM is detected Vim uses UCS-2, which doesn't work - for UTF-16 text. (Tony Mechelynck) -Solution: Default to UTF-16. -Files: src/fileio.c, src/testdir/test42.ok - - -*** ../vim-7.1.260/src/fileio.c Fri Jan 4 16:30:40 2008 ---- src/fileio.c Wed Feb 20 11:22:10 2008 -*************** -*** 5514,5523 **** - else if (p[0] == 0xfe && p[1] == 0xff - && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16)) - { -! if (flags == FIO_UTF16) -! name = "utf-16"; /* FE FF */ -! else - name = "ucs-2"; /* FE FF */ - } - else if (size >= 4 && p[0] == 0 && p[1] == 0 && p[2] == 0xfe - && p[3] == 0xff && (flags == FIO_ALL || flags == FIO_UCS4)) ---- 5523,5533 ---- - else if (p[0] == 0xfe && p[1] == 0xff - && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16)) - { -! /* Default to utf-16, it works also for ucs-2 text. */ -! if (flags == FIO_UCS2) - name = "ucs-2"; /* FE FF */ -+ else -+ name = "utf-16"; /* FE FF */ - } - else if (size >= 4 && p[0] == 0 && p[1] == 0 && p[2] == 0xfe - && p[3] == 0xff && (flags == FIO_ALL || flags == FIO_UCS4)) -*** ../vim-7.1.260/src/testdir/test42.ok Sun Jun 13 21:02:32 2004 ---- src/testdir/test42.ok Wed Feb 20 13:27:37 2008 -*************** -*** 15,21 **** - utf-8€err - - -! fileencoding=ucs-2 - bomb - ucs-2 - ---- 15,21 ---- - utf-8€err - - -! fileencoding=utf-16 - bomb - ucs-2 - -*** ../vim-7.1.260/src/version.c Wed Feb 20 14:58:46 2008 ---- src/version.c Wed Feb 20 18:13:00 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 261, - /**/ - --- -Seen it all, done it all, can't remember most of it. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.262 b/7.1.262 deleted file mode 100644 index 8b2111de..00000000 --- a/7.1.262 +++ /dev/null @@ -1,111 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.262 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.262 -Problem: Can't get the process ID of Vim. -Solution: Implement getpid(). -Files: src/eval.c, runtime/doc/eval.txt - - -*** ../vim-7.1.261/src/eval.c Wed Feb 20 12:22:59 2008 ---- src/eval.c Wed Feb 20 11:08:21 2008 -*************** -*** 532,537 **** ---- 532,538 ---- - static void f_getftype __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_getline __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_getmatches __ARGS((typval_T *argvars, typval_T *rettv)); -+ static void f_getpid __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_getpos __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_getqflist __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_getreg __ARGS((typval_T *argvars, typval_T *rettv)); -*************** -*** 7132,7137 **** ---- 7133,7139 ---- - {"getline", 1, 2, f_getline}, - {"getloclist", 1, 1, f_getqflist}, - {"getmatches", 0, 0, f_getmatches}, -+ {"getpid", 0, 0, f_getpid}, - {"getpos", 1, 1, f_getpos}, - {"getqflist", 0, 0, f_getqflist}, - {"getreg", 0, 2, f_getreg}, -*************** -*** 10371,10376 **** ---- 10373,10390 ---- - } - } - #endif -+ } -+ -+ /* -+ * "getpid()" function -+ */ -+ /*ARGSUSED*/ -+ static void -+ f_getpid(argvars, rettv) -+ typval_T *argvars; -+ typval_T *rettv; -+ { -+ rettv->vval.v_number = mch_get_pid(); - } - - /* -*** ../vim-7.1.261/runtime/doc/eval.txt Wed Feb 13 12:41:30 2008 ---- runtime/doc/eval.txt Wed Feb 20 11:10:17 2008 -*************** -*** 1,4 **** -! *eval.txt* For Vim version 7.1. Last change: 2008 Feb 13 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *eval.txt* For Vim version 7.1. Last change: 2008 Feb 20 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 1638,1643 **** ---- 1638,1644 ---- - getline( {lnum}, {end}) List lines {lnum} to {end} of current buffer - getloclist({nr}) List list of location list items - getmatches() List list of current matches -+ getpid() Number process ID of Vim - getpos( {expr}) List position of cursor, mark, etc. - getqflist() List list of quickfix items - getreg( [{regname} [, 1]]) String contents of register -*************** -*** 3833,3838 **** ---- 3837,3846 ---- - characters. nr2char(0) is a real NUL and terminates the - string, thus results in an empty string. - -+ *getpid()* -+ getpid() Return a Number which is the process ID of the Vim process. -+ On Unix this is a unique number. On MS-DOS it's always zero. -+ - *getpos()* - getpos({expr}) Get the position for {expr}. For possible values of {expr} - see |line()|. -*** ../vim-7.1.261/src/version.c Wed Feb 20 18:14:25 2008 ---- src/version.c Wed Feb 20 20:04:14 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 262, - /**/ - --- -Those who live by the sword get shot by those who don't. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.263 b/7.1.263 deleted file mode 100644 index 59df471d..00000000 --- a/7.1.263 +++ /dev/null @@ -1,84 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.263 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.263 -Problem: The filetype can consist of two dot separated names. This works - for syntax and ftplugin, but not for indent. (Brett Stahlman) -Solution: Use split() and loop over each dot separated name. -Files: runtime/indent.vim - - -*** ../vim-7.1.262/runtime/indent.vim Mon Mar 28 22:56:55 2005 ---- runtime/indent.vim Fri Feb 22 21:05:39 2008 -*************** -*** 1,7 **** - " Vim support file to switch on loading indent files for file types - " - " Maintainer: Bram Moolenaar -! " Last Change: 2005 Mar 28 - - if exists("did_indent_on") - finish ---- 1,7 ---- - " Vim support file to switch on loading indent files for file types - " - " Maintainer: Bram Moolenaar -! " Last Change: 2008 Feb 22 - - if exists("did_indent_on") - finish -*************** -*** 15,25 **** - exe b:undo_indent - unlet! b:undo_indent b:did_indent - endif -! if expand("") != "" - if exists("b:did_indent") - unlet b:did_indent - endif -! runtime! indent/.vim - endif - endfunc - augroup END ---- 15,31 ---- - exe b:undo_indent - unlet! b:undo_indent b:did_indent - endif -! let s = expand("") -! if s != "" - if exists("b:did_indent") - unlet b:did_indent - endif -! -! " When there is a dot it is used to separate filetype names. Thus for -! " "aaa.bbb" load "indent/aaa.vim" and then "indent/bbb.vim". -! for name in split(s, '\.') -! exe 'runtime! indent/' . name . '.vim' -! endfor - endif - endfunc - augroup END -*** ../vim-7.1.262/src/version.c Wed Feb 20 20:09:44 2008 ---- src/version.c Mon Feb 25 20:44:04 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 263, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -45. You buy a Captain Kirk chair with a built-in keyboard and mouse. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.264 b/7.1.264 deleted file mode 100644 index 67365cce..00000000 --- a/7.1.264 +++ /dev/null @@ -1,237 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.264 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.264 -Problem: Crash when indenting lines. (Dominique Pelle) -Solution: Set the cursor column when changing the cursor line. -Files: src/ops.c, src/misc1.c - - -*** ../vim-7.1.263/src/ops.c Wed Feb 6 14:43:50 2008 ---- src/ops.c Sun Feb 24 14:56:38 2008 -*************** -*** 692,697 **** ---- 692,698 ---- - } - } - ++curwin->w_cursor.lnum; -+ curwin->w_cursor.col = 0; /* make sure it's valid */ - } - - /* put cursor on first non-blank of indented line */ -*** ../vim-7.1.263/src/misc1.c Wed Feb 13 10:57:11 2008 ---- src/misc1.c Sun Feb 24 15:04:27 2008 -*************** -*** 6894,6899 **** ---- 6894,6900 ---- - if (trypos != NULL) - { - curwin->w_cursor.lnum = trypos->lnum + 1; -+ curwin->w_cursor.col = 0; - continue; - } - -*************** -*** 6954,6959 **** ---- 6955,6961 ---- - if (trypos != NULL) - { - curwin->w_cursor.lnum = trypos->lnum + 1; -+ curwin->w_cursor.col = 0; - continue; - } - } -*************** -*** 6991,6996 **** ---- 6993,6999 ---- - if ((trypos = find_start_comment(ind_maxcomment)) != NULL) - { - curwin->w_cursor.lnum = trypos->lnum + 1; -+ curwin->w_cursor.col = 0; - continue; - } - -*************** -*** 7114,7120 **** ---- 7117,7126 ---- - { - if (find_last_paren(l, '{', '}') && (trypos = - find_start_brace(ind_maxcomment)) != NULL) -+ { - curwin->w_cursor.lnum = trypos->lnum + 1; -+ curwin->w_cursor.col = 0; -+ } - continue; - } - -*************** -*** 7230,7240 **** - * case xx: if ( asdf && - * asdf) - */ -! curwin->w_cursor.lnum = trypos->lnum; - l = ml_get_curline(); - if (cin_iscase(l) || cin_isscopedecl(l)) - { - ++curwin->w_cursor.lnum; - continue; - } - } ---- 7236,7247 ---- - * case xx: if ( asdf && - * asdf) - */ -! curwin->w_cursor = *trypos; - l = ml_get_curline(); - if (cin_iscase(l) || cin_isscopedecl(l)) - { - ++curwin->w_cursor.lnum; -+ curwin->w_cursor.col = 0; - continue; - } - } -*************** -*** 7254,7259 **** ---- 7261,7267 ---- - if (*l == NUL || l[STRLEN(l) - 1] != '\\') - break; - --curwin->w_cursor.lnum; -+ curwin->w_cursor.col = 0; - } - } - -*************** -*** 7587,7597 **** - * case xx: if ( asdf && - * asdf) - */ -! curwin->w_cursor.lnum = trypos->lnum; - l = ml_get_curline(); - if (cin_iscase(l) || cin_isscopedecl(l)) - { - ++curwin->w_cursor.lnum; - continue; - } - } ---- 7595,7606 ---- - * case xx: if ( asdf && - * asdf) - */ -! curwin->w_cursor = *trypos; - l = ml_get_curline(); - if (cin_iscase(l) || cin_isscopedecl(l)) - { - ++curwin->w_cursor.lnum; -+ curwin->w_cursor.col = 0; - continue; - } - } -*************** -*** 7652,7664 **** - && (trypos = find_start_brace(ind_maxcomment)) - != NULL) /* XXX */ - { -! curwin->w_cursor.lnum = trypos->lnum; - /* if not "else {" check for terminated again */ - /* but skip block for "} else {" */ - l = cin_skipcomment(ml_get_curline()); - if (*l == '}' || !cin_iselse(l)) - goto term_again; - ++curwin->w_cursor.lnum; - } - } - } ---- 7661,7674 ---- - && (trypos = find_start_brace(ind_maxcomment)) - != NULL) /* XXX */ - { -! curwin->w_cursor = *trypos; - /* if not "else {" check for terminated again */ - /* but skip block for "} else {" */ - l = cin_skipcomment(ml_get_curline()); - if (*l == '}' || !cin_iselse(l)) - goto term_again; - ++curwin->w_cursor.lnum; -+ curwin->w_cursor.col = 0; - } - } - } -*************** -*** 7727,7732 **** ---- 7737,7743 ---- - if ((trypos = find_start_comment(ind_maxcomment)) != NULL) - { - curwin->w_cursor.lnum = trypos->lnum + 1; -+ curwin->w_cursor.col = 0; - continue; - } - -*************** -*** 7777,7783 **** - if (find_last_paren(l, '(', ')') - && (trypos = find_match_paren(ind_maxparen, - ind_maxcomment)) != NULL) -! curwin->w_cursor.lnum = trypos->lnum; - - /* For a line ending in ',' that is a continuation line go - * back to the first line with a backslash: ---- 7788,7794 ---- - if (find_last_paren(l, '(', ')') - && (trypos = find_match_paren(ind_maxparen, - ind_maxcomment)) != NULL) -! curwin->w_cursor = *trypos; - - /* For a line ending in ',' that is a continuation line go - * back to the first line with a backslash: -*************** -*** 7791,7796 **** ---- 7802,7808 ---- - if (*l == NUL || l[STRLEN(l) - 1] != '\\') - break; - --curwin->w_cursor.lnum; -+ curwin->w_cursor.col = 0; - } - - amount = get_indent(); /* XXX */ -*************** -*** 7864,7870 **** - - if ((trypos = find_match_paren(ind_maxparen, - ind_maxcomment)) != NULL) -! curwin->w_cursor.lnum = trypos->lnum; - amount = get_indent(); /* XXX */ - break; - } ---- 7876,7882 ---- - - if ((trypos = find_match_paren(ind_maxparen, - ind_maxcomment)) != NULL) -! curwin->w_cursor = *trypos; - amount = get_indent(); /* XXX */ - break; - } -*** ../vim-7.1.263/src/version.c Mon Feb 25 20:45:46 2008 ---- src/version.c Mon Feb 25 21:51:20 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 264, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -49. You never have to deal with busy signals when calling your ISP...because - you never log off. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.265 b/7.1.265 deleted file mode 100644 index 18aea172..00000000 --- a/7.1.265 +++ /dev/null @@ -1,46 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.265 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.265 -Problem: When 'isfname' contains a space, cmdline completion can hang. - (James Vega) -Solution: Reset the "len" variable. -Files: src/ex_docmd.c - - -*** ../vim-7.1.264/src/ex_docmd.c Sat Jan 19 15:55:51 2008 ---- src/ex_docmd.c Sun Feb 24 22:09:52 2008 -*************** -*** 3346,3351 **** ---- 3346,3352 ---- - #endif - )) - { -+ len = 0; /* avoid getting stuck when space is in 'isfname' */ - while (*p != NUL) - { - #ifdef FEAT_MBYTE -*** ../vim-7.1.264/src/version.c Mon Feb 25 21:54:23 2008 ---- src/version.c Tue Feb 26 21:28:25 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 265, - /**/ - --- -Q: What is a patch 22? -A: A patch you need to include to make it possible to include patches. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.266 b/7.1.266 deleted file mode 100644 index f0d2941a..00000000 --- a/7.1.266 +++ /dev/null @@ -1,71 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.266 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.266 -Problem: When the version string returned by the terminal contains - unexpected characters, it is used as typed input. (James Vega) -Solution: Assume the escape sequence ends in a letter. -Files: src/term.c - - -*** ../vim-7.1.265/src/term.c Sat Sep 15 14:06:41 2007 ---- src/term.c Mon Feb 25 20:21:53 2008 -*************** -*** 4050,4064 **** - { - /* Check for xterm version string: "[>{x};{vers};{y}c". Also - * eat other possible responses to t_RV, rxvt returns -! * "[?1;2c". Also accept CSI instead of [. */ - if (*T_CRV != NUL && ((tp[0] == ESC && tp[1] == '[' && len >= 3) - || (tp[0] == CSI && len >= 2))) - { - j = 0; - extra = 0; -! for (i = 2 + (tp[0] != CSI); -! i < len && (VIM_ISDIGIT(tp[i]) -! || tp[i] == ';' || tp[i] == '.'); ++i) - if (tp[i] == ';' && ++j == 1) - extra = atoi((char *)tp + i + 1); - if (i == len) ---- 4050,4066 ---- - { - /* Check for xterm version string: "[>{x};{vers};{y}c". Also - * eat other possible responses to t_RV, rxvt returns -! * "[?1;2c". Also accept CSI instead of [. -! * mrxvt has been reported to have "+" in the version. Assume -! * the escape sequence ends with a letter or one of "{|}~". */ - if (*T_CRV != NUL && ((tp[0] == ESC && tp[1] == '[' && len >= 3) - || (tp[0] == CSI && len >= 2))) - { - j = 0; - extra = 0; -! for (i = 2 + (tp[0] != CSI); i < len -! && !(tp[i] >= '{' && tp[i] <= '~') -! && !ASCII_ISALPHA(tp[i]); ++i) - if (tp[i] == ';' && ++j == 1) - extra = atoi((char *)tp + i + 1); - if (i == len) -*** ../vim-7.1.265/src/version.c Tue Feb 26 21:29:06 2008 ---- src/version.c Wed Feb 27 16:10:59 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 266, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -54. You start tilting your head sideways to smile. :-) - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.267 b/7.1.267 deleted file mode 100644 index a66f29f9..00000000 --- a/7.1.267 +++ /dev/null @@ -1,57 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.267 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.267 -Problem: When changing folds cursor may be positioned in the wrong place. -Solution: Call changed_window_setting_win() instead of - changed_window_setting(). -Files: src/fold.c - - -*** ../vim-7.1.266/src/fold.c Sun Jan 13 21:57:25 2008 ---- src/fold.c Wed Mar 5 12:48:43 2008 -*************** -*** 2307,2313 **** - - /* If some fold changed, need to redraw and position cursor. */ - if (fold_changed && wp->w_p_fen) -! changed_window_setting(); - - /* If we updated folds past "bot", need to redraw more lines. Don't do - * this in other situations, the changed lines will be redrawn anyway and ---- 2307,2313 ---- - - /* If some fold changed, need to redraw and position cursor. */ - if (fold_changed && wp->w_p_fen) -! changed_window_setting_win(wp); - - /* If we updated folds past "bot", need to redraw more lines. Don't do - * this in other situations, the changed lines will be redrawn anyway and -*** ../vim-7.1.266/src/version.c Wed Feb 27 16:13:09 2008 ---- src/version.c Thu Mar 6 22:43:05 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 267, - /**/ - --- -From "know your smileys": - % Bike accident. A bit far-fetched, I suppose; although... - o _ _ _ - _o /\_ _ \\o (_)\__/o (_) - _< \_ _>(_) (_)/<_ \_| \ _|/' \/ - (_)>(_) (_) (_) (_) (_)' _\o_ - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.268 b/7.1.268 deleted file mode 100644 index 2e1f9a67..00000000 --- a/7.1.268 +++ /dev/null @@ -1,53 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.268 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.268 -Problem: Always shows "+" at end of screen line with: ":set - listchars=eol:$,extends:+ nowrap list cursorline" (Gary Johnson) -Solution: Check for lcs_eol_one instead of lcs_eol. -Files: src/screen.c - - -*** ../vim-7.1.267/src/screen.c Wed Feb 20 14:15:45 2008 ---- src/screen.c Sun Mar 9 14:26:14 2008 -*************** -*** 4527,4533 **** - #endif - col == W_WIDTH(wp) - 1) - && (*ptr != NUL -! || (wp->w_p_list && lcs_eol != NUL && p_extra != at_end_str) - || (n_extra && (c_extra != NUL || *p_extra != NUL)))) - { - c = lcs_ext; ---- 4527,4533 ---- - #endif - col == W_WIDTH(wp) - 1) - && (*ptr != NUL -! || (wp->w_p_list && lcs_eol_one > 0) - || (n_extra && (c_extra != NUL || *p_extra != NUL)))) - { - c = lcs_ext; -*** ../vim-7.1.267/src/version.c Thu Mar 6 22:44:45 2008 ---- src/version.c Sun Mar 9 14:24:59 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 268, - /**/ - --- -From "know your smileys": - :-* A big kiss! - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.269 b/7.1.269 deleted file mode 100644 index 7a2b4284..00000000 --- a/7.1.269 +++ /dev/null @@ -1,171 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.269 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.269 -Problem: The matchparen plugin has an arbitrary limit for the number of - lines to look for a match. -Solution: Rely on the searchpair() timeout. -Files: runtime/plugin/matchparen.vim - - -*** ../vim-7.1.268/runtime/plugin/matchparen.vim Sun Jan 6 20:05:36 2008 ---- runtime/plugin/matchparen.vim Wed Feb 27 22:39:32 2008 -*************** -*** 1,6 **** - " Vim plugin for showing matching parens - " Maintainer: Bram Moolenaar -! " Last Change: 2008 Jan 06 - - " Exit quickly when: - " - this plugin was already loaded (or disabled) ---- 1,6 ---- - " Vim plugin for showing matching parens - " Maintainer: Bram Moolenaar -! " Last Change: 2008 Feb 27 - - " Exit quickly when: - " - this plugin was already loaded (or disabled) -*************** -*** 34,40 **** - endif - - " Avoid that we remove the popup menu. -! if pumvisible() - return - endif - ---- 34,41 ---- - endif - - " Avoid that we remove the popup menu. -! " Return when there are no colors (looks like the cursor jumps). -! if pumvisible() || (&t_Co < 8 && !has("gui_running")) - return - endif - -*************** -*** 60,98 **** - endif - - " Figure out the arguments for searchpairpos(). -- " Restrict the search to visible lines with "stopline". -- " And avoid searching very far (e.g., for closed folds and long lines) -- " The "viewable" variables give a range in which we can scroll while keeping -- " the cursor at the same position -- " adjustedScrolloff accounts for very large numbers of scrolloff -- let adjustedScrolloff = min([&scrolloff, (line('w$') - line('w0')) / 2]) -- let bottom_viewable = min([line('$'), c_lnum + &lines - adjustedScrolloff - 2]) -- let top_viewable = max([1, c_lnum-&lines+adjustedScrolloff + 2]) -- " one of these stoplines will be adjusted below, but the current values are -- " minimal boundaries within the current window -- let stoplinebottom = line('w$') -- let stoplinetop = line('w0') - if i % 2 == 0 - let s_flags = 'nW' - let c2 = plist[i + 1] -- if has("byte_offset") && has("syntax_items") && &smc > 0 -- let stopbyte = min([line2byte("$"), line2byte(".") + col(".") + &smc * 2]) -- let stopline = min([bottom_viewable, byte2line(stopbyte)]) -- else -- let stopline = min([bottom_viewable, c_lnum + 100]) -- endif -- let stoplinebottom = stopline - else - let s_flags = 'nbW' - let c2 = c - let c = plist[i - 1] -- if has("byte_offset") && has("syntax_items") && &smc > 0 -- let stopbyte = max([1, line2byte(".") + col(".") - &smc * 2]) -- let stopline = max([top_viewable, byte2line(stopbyte)]) -- else -- let stopline = max([top_viewable, c_lnum - 100]) -- endif -- let stoplinetop = stopline - endif - if c == '[' - let c = '\[' ---- 61,73 ---- -*************** -*** 111,120 **** - \ '=~? "string\\|character\\|singlequote\\|comment"' - execute 'if' s_skip '| let s_skip = 0 | endif' - - try -! " Limit the search time to 500 msec to avoid a hang on very long lines. -! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 500) - catch /E118/ - let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline) - endtry - ---- 86,132 ---- - \ '=~? "string\\|character\\|singlequote\\|comment"' - execute 'if' s_skip '| let s_skip = 0 | endif' - -+ " Limit the search to lines visible in the window. -+ let stoplinebottom = line('w$') -+ let stoplinetop = line('w0') -+ if i % 2 == 0 -+ let stopline = stoplinebottom -+ else -+ let stopline = stoplinetop -+ endif -+ - try -! " Limit the search time to 300 msec to avoid a hang on very long lines. -! " This fails when a timeout is not supported. -! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 300) - catch /E118/ -+ " Can't use the timeout, restrict the stopline a bit more to avoid taking -+ " a long time on closed folds and long lines. -+ " The "viewable" variables give a range in which we can scroll while -+ " keeping the cursor at the same position. -+ " adjustedScrolloff accounts for very large numbers of scrolloff. -+ let adjustedScrolloff = min([&scrolloff, (line('w$') - line('w0')) / 2]) -+ let bottom_viewable = min([line('$'), c_lnum + &lines - adjustedScrolloff - 2]) -+ let top_viewable = max([1, c_lnum-&lines+adjustedScrolloff + 2]) -+ " one of these stoplines will be adjusted below, but the current values are -+ " minimal boundaries within the current window -+ if i % 2 == 0 -+ if has("byte_offset") && has("syntax_items") && &smc > 0 -+ let stopbyte = min([line2byte("$"), line2byte(".") + col(".") + &smc * 2]) -+ let stopline = min([bottom_viewable, byte2line(stopbyte)]) -+ else -+ let stopline = min([bottom_viewable, c_lnum + 100]) -+ endif -+ let stoplinebottom = stopline -+ else -+ if has("byte_offset") && has("syntax_items") && &smc > 0 -+ let stopbyte = max([1, line2byte(".") + col(".") - &smc * 2]) -+ let stopline = max([top_viewable, byte2line(stopbyte)]) -+ else -+ let stopline = max([top_viewable, c_lnum - 100]) -+ endif -+ let stoplinetop = stopline -+ endif - let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline) - endtry - -*** ../vim-7.1.268/src/version.c Sun Mar 9 14:30:12 2008 ---- src/version.c Sun Mar 9 16:21:00 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 269, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -93. New mail alarm on your palmtop annoys other churchgoers. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.270 b/7.1.270 deleted file mode 100644 index d2563c8e..00000000 --- a/7.1.270 +++ /dev/null @@ -1,94 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.270 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.270 -Problem: ":?foo?" matches in current line since patch 7.1.025. (A.Politz) -Solution: Remove the SEARCH_START flag. -Files: src/ex_docmd.c, src/search.c - - -*** ../vim-7.1.269/src/ex_docmd.c Tue Feb 26 21:29:06 2008 ---- src/ex_docmd.c Sun Mar 2 20:50:43 2008 -*************** -*** 3932,3939 **** - curwin->w_cursor.col = 0; - searchcmdlen = 0; - if (!do_search(NULL, c, cmd, 1L, -! SEARCH_HIS + SEARCH_MSG + SEARCH_START, -! NULL)) - { - curwin->w_cursor = pos; - cmd = NULL; ---- 3932,3938 ---- - curwin->w_cursor.col = 0; - searchcmdlen = 0; - if (!do_search(NULL, c, cmd, 1L, -! SEARCH_HIS | SEARCH_MSG, NULL)) - { - curwin->w_cursor = pos; - cmd = NULL; -*************** -*** 3980,3987 **** - pos.col = 0; - if (searchit(curwin, curbuf, &pos, - *cmd == '?' ? BACKWARD : FORWARD, -! (char_u *)"", 1L, -! SEARCH_MSG + SEARCH_START, - i, (linenr_T)0, NULL) != FAIL) - lnum = pos.lnum; - else ---- 3979,3985 ---- - pos.col = 0; - if (searchit(curwin, curbuf, &pos, - *cmd == '?' ? BACKWARD : FORWARD, -! (char_u *)"", 1L, SEARCH_MSG, - i, (linenr_T)0, NULL) != FAIL) - lnum = pos.lnum; - else -*** ../vim-7.1.269/src/search.c Wed Feb 20 13:41:14 2008 ---- src/search.c Sun Mar 2 22:00:50 2008 -*************** -*** 538,544 **** - return FAIL; - } - -! if (options & SEARCH_START) - extra_col = 0; - #ifdef FEAT_MBYTE - /* Watch out for the "col" being MAXCOL - 2, used in a closed fold. */ ---- 538,547 ---- - return FAIL; - } - -! /* When not accepting a match at the start position set "extra_col" to a -! * non-zero value. Don't do that when starting at MAXCOL, since MAXCOL + -! * 1 is zero. */ -! if ((options & SEARCH_START) || pos->col == MAXCOL) - extra_col = 0; - #ifdef FEAT_MBYTE - /* Watch out for the "col" being MAXCOL - 2, used in a closed fold. */ -*** ../vim-7.1.269/src/version.c Sun Mar 9 16:45:16 2008 ---- src/version.c Mon Mar 10 21:32:07 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 270, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -102. When filling out your driver's license application, you give - your IP address. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.271 b/7.1.271 deleted file mode 100644 index 19495070..00000000 --- a/7.1.271 +++ /dev/null @@ -1,53 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.271 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.271 -Problem: In a Vim build without autocommands, checking a file that was - changed externally causes the current buffer to be changed - unexpectedly. (Karsten Hopp) -Solution: Store "curbuf" instead of "buf". -Files: src/fileio.c - - -*** ../vim-7.1.270/src/fileio.c Wed Feb 20 18:14:25 2008 ---- src/fileio.c Tue Mar 11 21:35:05 2008 -*************** -*** 9239,9245 **** - aco_save_T *aco; /* structure to save values in */ - buf_T *buf; /* new curbuf */ - { -! aco->save_buf = buf; - curbuf = buf; - curwin->w_buffer = buf; - } ---- 9248,9254 ---- - aco_save_T *aco; /* structure to save values in */ - buf_T *buf; /* new curbuf */ - { -! aco->save_buf = curbuf; - curbuf = buf; - curwin->w_buffer = buf; - } -*** ../vim-7.1.270/src/version.c Mon Mar 10 21:33:52 2008 ---- src/version.c Tue Mar 11 21:57:30 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 271, - /**/ - --- -In a world without walls and borders, who needs windows and gates? - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.272 b/7.1.272 deleted file mode 100644 index 19bacc67..00000000 --- a/7.1.272 +++ /dev/null @@ -1,84 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.272 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.272 -Problem: The special buffer name [Location List] is not used for a buffer - displayed in another tab page. -Solution: Use FOR_ALL_TAB_WINDOWS instead of FOR_ALL_WINDOWS. (Hiroaki - Nishihara) -Files: src/buffer.c - - -*** ../vim-7.1.271/src/buffer.c Wed Oct 3 14:30:54 2007 ---- src/buffer.c Wed Mar 5 21:55:44 2008 -*************** -*** 4912,4918 **** - return retval; - } - -! #ifdef FEAT_VIMINFO - int - read_viminfo_bufferlist(virp, writing) - vir_T *virp; ---- 4912,4918 ---- - return retval; - } - -! #if defined(FEAT_VIMINFO) || defined(PROTO) - int - read_viminfo_bufferlist(virp, writing) - vir_T *virp; -*************** -*** 5033,5045 **** - #if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS) - if (bt_quickfix(buf)) - { -! win_T *win; - - /* - * For location list window, w_llist_ref points to the location list. - * For quickfix window, w_llist_ref is NULL. - */ -! FOR_ALL_WINDOWS(win) - if (win->w_buffer == buf) - break; - if (win != NULL && win->w_llist_ref != NULL) ---- 5033,5046 ---- - #if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS) - if (bt_quickfix(buf)) - { -! win_T *win; -! tabpage_T *tp; - - /* - * For location list window, w_llist_ref points to the location list. - * For quickfix window, w_llist_ref is NULL. - */ -! FOR_ALL_TAB_WINDOWS(tp, win) - if (win->w_buffer == buf) - break; - if (win != NULL && win->w_llist_ref != NULL) -*** ../vim-7.1.271/src/version.c Tue Mar 11 22:01:16 2008 ---- src/version.c Wed Mar 12 12:21:13 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 272, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -113. You are asked about a bus schedule, you wonder if it is 16 or 32 bits. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.273 b/7.1.273 deleted file mode 100644 index 02a6ca9d..00000000 --- a/7.1.273 +++ /dev/null @@ -1,74 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.273 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.273 -Problem: When profiling on Linux Vim exits early. (Liu Yubao) -Solution: When profiling don't exit on SIGPROF. -Files: src/Makefile, src/os_unix.c - - -*** ../vim-7.1.272/src/Makefile Wed Mar 12 12:23:18 2008 ---- src/Makefile Wed Mar 12 13:11:07 2008 -*************** -*** 545,551 **** - # For unknown reasons adding "-lc" fixes a linking problem with GCC. That's - # probably a bug in the "-pg" implementation. - # Need to recompile everything after changing this: "make clean" "make". -! #PROFILE_CFLAGS = -pg -g - #PROFILE_LIBS = -pg - #PROFILE_LIBS = -pg -lc - ---- 545,551 ---- - # For unknown reasons adding "-lc" fixes a linking problem with GCC. That's - # probably a bug in the "-pg" implementation. - # Need to recompile everything after changing this: "make clean" "make". -! #PROFILE_CFLAGS = -pg -g -DWE_ARE_PROFILING - #PROFILE_LIBS = -pg - #PROFILE_LIBS = -pg -lc - -*** ../vim-7.1.272/src/os_unix.c Sun Feb 10 22:25:12 2008 ---- src/os_unix.c Wed Mar 5 22:15:41 2008 -*************** -*** 269,276 **** - #ifdef SIGVTALRM - {SIGVTALRM, "VTALRM", TRUE}, - #endif -! #if defined(SIGPROF) && !defined(FEAT_MZSCHEME) -! /* MzScheme uses SIGPROF for its own needs */ - {SIGPROF, "PROF", TRUE}, - #endif - #ifdef SIGXCPU ---- 269,277 ---- - #ifdef SIGVTALRM - {SIGVTALRM, "VTALRM", TRUE}, - #endif -! #if defined(SIGPROF) && !defined(FEAT_MZSCHEME) && !defined(WE_ARE_PROFILING) -! /* MzScheme uses SIGPROF for its own needs; On Linux with profiling -! * this makes Vim exit. WE_ARE_PROFILING is defined in Makefile. */ - {SIGPROF, "PROF", TRUE}, - #endif - #ifdef SIGXCPU -*** ../vim-7.1.272/src/version.c Wed Mar 12 12:22:56 2008 ---- src/version.c Wed Mar 12 13:08:59 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 273, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -114. You are counting items, you go "0,1,2,3,4,5,6,7,8,9,A,B,C,D...". - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.274 b/7.1.274 deleted file mode 100644 index 5bcb4ab9..00000000 --- a/7.1.274 +++ /dev/null @@ -1,54 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.274 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.274 (after 7.1.272) -Problem: Compiler warning for optimized build. -Solution: Init win to NULL. -Files: src/buffer.c - - -*** ../vim-7.1.273/src/buffer.c Wed Mar 12 12:22:56 2008 ---- src/buffer.c Wed Mar 12 13:15:21 2008 -*************** -*** 5033,5039 **** - #if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS) - if (bt_quickfix(buf)) - { -! win_T *win; - tabpage_T *tp; - - /* ---- 5033,5039 ---- - #if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS) - if (bt_quickfix(buf)) - { -! win_T *win = NULL; - tabpage_T *tp; - - /* -*** ../vim-7.1.273/src/version.c Wed Mar 12 13:16:37 2008 ---- src/version.c Wed Mar 12 13:45:25 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 274, - /**/ - --- -FIXME and XXX are two common keywords used to mark broken or incomplete code -not only since XXX as a sex reference would grab everbodys attention but -simply due to the fact that Vim would highlight these words. - -- Hendrik Scholz - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.275 b/7.1.275 deleted file mode 100644 index 8ed7130d..00000000 --- a/7.1.275 +++ /dev/null @@ -1,1541 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.275 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.275 (extra) -Problem: Mac: ATSUI and 'antialias' don't work properly together. -Solution: Fix this and the input method. (Jjgod Jiang) -Files: src/vim.h, src/gui_mac.c - - -*** ../vim-7.1.274/src/vim.h Wed Feb 20 12:22:59 2008 ---- src/vim.h Wed Mar 12 13:18:58 2008 -*************** -*** 461,468 **** - /* - * Check input method control. - */ -! #if defined(FEAT_XIM) || \ -! (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) - # define USE_IM_CONTROL - #endif - ---- 461,469 ---- - /* - * Check input method control. - */ -! #if defined(FEAT_XIM) \ -! || (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) \ -! || defined(FEAT_GUI_MAC) - # define USE_IM_CONTROL - #endif - -*** ../vim-7.1.274/src/gui_mac.c Sat Sep 29 13:15:29 2007 ---- src/gui_mac.c Wed Mar 12 13:40:57 2008 -*************** -*** 59,65 **** ---- 59,91 ---- - - #ifdef MACOS_CONVERT - # define USE_CARBONKEYHANDLER -+ -+ static int im_is_active = FALSE; -+ #if 0 -+ static int im_start_row = 0; -+ static int im_start_col = 0; -+ #endif -+ -+ #define NR_ELEMS(x) (sizeof(x) / sizeof(x[0])) -+ -+ static TSMDocumentID gTSMDocument; -+ -+ static void im_on_window_switch(int active); - static EventHandlerUPP keyEventHandlerUPP = NULL; -+ static EventHandlerUPP winEventHandlerUPP = NULL; -+ -+ static pascal OSStatus gui_mac_handle_window_activate( -+ EventHandlerCallRef nextHandler, EventRef theEvent, void *data); -+ -+ static pascal OSStatus gui_mac_handle_text_input( -+ EventHandlerCallRef nextHandler, EventRef theEvent, void *data); -+ -+ static pascal OSStatus gui_mac_update_input_area( -+ EventHandlerCallRef nextHandler, EventRef theEvent); -+ -+ static pascal OSStatus gui_mac_unicode_key_event( -+ EventHandlerCallRef nextHandler, EventRef theEvent); -+ - #endif - - -*************** -*** 137,143 **** ---- 166,176 ---- - - #ifdef MACOS_CONVERT - # define USE_ATSUI_DRAWING -+ int p_macatsui_last; - ATSUStyle gFontStyle; -+ # ifdef FEAT_MBYTE -+ ATSUStyle gWideFontStyle; -+ # endif - Boolean gIsFontFallbackSet; - #endif - -*************** -*** 265,270 **** ---- 298,308 ---- - static WindowRef drawer = NULL; // TODO: put into gui.h - #endif - -+ #ifdef USE_ATSUI_DRAWING -+ static void gui_mac_set_font_attributes(GuiFont font); -+ static void gui_mac_dispose_atsui_style(void); -+ #endif -+ - /* - * ------------------------------------------------------------ - * Conversion Utility -*************** -*** 1935,1946 **** - /* Dim scrollbars */ - if (whichWindow == gui.VimWindow) - { -! ControlRef rootControl; -! GetRootControl(gui.VimWindow, &rootControl); -! if ((event->modifiers) & activeFlag) -! ActivateControl(rootControl); -! else -! DeactivateControl(rootControl); - } - - /* Activate */ ---- 1973,1984 ---- - /* Dim scrollbars */ - if (whichWindow == gui.VimWindow) - { -! ControlRef rootControl; -! GetRootControl(gui.VimWindow, &rootControl); -! if ((event->modifiers) & activeFlag) -! ActivateControl(rootControl); -! else -! DeactivateControl(rootControl); - } - - /* Activate */ -*************** -*** 1976,1990 **** - * Handle the key - */ - #ifdef USE_CARBONKEYHANDLER - -! static int dialog_busy = FALSE; /* TRUE when gui_mch_dialog() wants the keys */ - - # define INLINE_KEY_BUFFER_SIZE 80 - static pascal OSStatus -! gui_mac_doKeyEventCarbon( - EventHandlerCallRef nextHandler, -! EventRef theEvent, -! void *data) - { - /* Multibyte-friendly key event handler */ - OSStatus err = -1; ---- 2014,2100 ---- - * Handle the key - */ - #ifdef USE_CARBONKEYHANDLER -+ static pascal OSStatus -+ gui_mac_handle_window_activate( -+ EventHandlerCallRef nextHandler, -+ EventRef theEvent, -+ void *data) -+ { -+ UInt32 eventClass = GetEventClass(theEvent); -+ UInt32 eventKind = GetEventKind(theEvent); -+ -+ if (eventClass == kEventClassWindow) -+ { -+ switch (eventKind) -+ { -+ case kEventWindowActivated: -+ #if defined(USE_IM_CONTROL) -+ im_on_window_switch(TRUE); -+ #endif -+ return noErr; -+ -+ case kEventWindowDeactivated: -+ #if defined(USE_IM_CONTROL) -+ im_on_window_switch(FALSE); -+ #endif -+ return noErr; -+ } -+ } -+ -+ return eventNotHandledErr; -+ } -+ -+ static pascal OSStatus -+ gui_mac_handle_text_input( -+ EventHandlerCallRef nextHandler, -+ EventRef theEvent, -+ void *data) -+ { -+ UInt32 eventClass = GetEventClass(theEvent); -+ UInt32 eventKind = GetEventKind(theEvent); -+ -+ if (eventClass != kEventClassTextInput) -+ return eventNotHandledErr; - -! if ((kEventTextInputUpdateActiveInputArea != eventKind) && -! (kEventTextInputUnicodeForKeyEvent != eventKind) && -! (kEventTextInputOffsetToPos != eventKind) && -! (kEventTextInputPosToOffset != eventKind) && -! (kEventTextInputGetSelectedText != eventKind)) -! return eventNotHandledErr; -! -! switch (eventKind) -! { -! case kEventTextInputUpdateActiveInputArea: -! return gui_mac_update_input_area(nextHandler, theEvent); -! case kEventTextInputUnicodeForKeyEvent: -! return gui_mac_unicode_key_event(nextHandler, theEvent); -! -! case kEventTextInputOffsetToPos: -! case kEventTextInputPosToOffset: -! case kEventTextInputGetSelectedText: -! break; -! } -! -! return eventNotHandledErr; -! } -! -! static pascal -! OSStatus gui_mac_update_input_area( -! EventHandlerCallRef nextHandler, -! EventRef theEvent) -! { -! return eventNotHandledErr; -! } -! -! static int dialog_busy = FALSE; /* TRUE when gui_mch_dialog() wants the -! keys */ - - # define INLINE_KEY_BUFFER_SIZE 80 - static pascal OSStatus -! gui_mac_unicode_key_event( - EventHandlerCallRef nextHandler, -! EventRef theEvent) - { - /* Multibyte-friendly key event handler */ - OSStatus err = -1; -*************** -*** 2000,2006 **** - char_u *to = NULL; - Boolean isSpecial = FALSE; - int i; -! EventRef keyEvent; - - /* Mask the mouse (as per user setting) */ - if (p_mh) ---- 2110,2116 ---- - char_u *to = NULL; - Boolean isSpecial = FALSE; - int i; -! EventRef keyEvent; - - /* Mask the mouse (as per user setting) */ - if (p_mh) -*************** -*** 2008,2046 **** - - /* Don't use the keys when the dialog wants them. */ - if (dialog_busy) -! return eventNotHandledErr; - - if (noErr != GetEventParameter(theEvent, kEventParamTextInputSendText, -! typeUnicodeText, NULL, 0, &actualSize, NULL)) -! return eventNotHandledErr; - - text = (UniChar *)alloc(actualSize); - if (!text) -! return eventNotHandledErr; - - err = GetEventParameter(theEvent, kEventParamTextInputSendText, -! typeUnicodeText, NULL, actualSize, NULL, text); - require_noerr(err, done); - - err = GetEventParameter(theEvent, kEventParamTextInputSendKeyboardEvent, -! typeEventRef, NULL, sizeof(EventRef), NULL, &keyEvent); - require_noerr(err, done); - - err = GetEventParameter(keyEvent, kEventParamKeyModifiers, -! typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); - require_noerr(err, done); - - err = GetEventParameter(keyEvent, kEventParamKeyCode, -! typeUInt32, NULL, sizeof(UInt32), NULL, &key_sym); - require_noerr(err, done); - - err = GetEventParameter(keyEvent, kEventParamKeyMacCharCodes, -! typeChar, NULL, sizeof(char), NULL, &charcode); - require_noerr(err, done); - - #ifndef USE_CMD_KEY - if (modifiers & cmdKey) -! goto done; /* Let system handle Cmd+... */ - #endif - - key_char = charcode; ---- 2118,2156 ---- - - /* Don't use the keys when the dialog wants them. */ - if (dialog_busy) -! return eventNotHandledErr; - - if (noErr != GetEventParameter(theEvent, kEventParamTextInputSendText, -! typeUnicodeText, NULL, 0, &actualSize, NULL)) -! return eventNotHandledErr; - - text = (UniChar *)alloc(actualSize); - if (!text) -! return eventNotHandledErr; - - err = GetEventParameter(theEvent, kEventParamTextInputSendText, -! typeUnicodeText, NULL, actualSize, NULL, text); - require_noerr(err, done); - - err = GetEventParameter(theEvent, kEventParamTextInputSendKeyboardEvent, -! typeEventRef, NULL, sizeof(EventRef), NULL, &keyEvent); - require_noerr(err, done); - - err = GetEventParameter(keyEvent, kEventParamKeyModifiers, -! typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); - require_noerr(err, done); - - err = GetEventParameter(keyEvent, kEventParamKeyCode, -! typeUInt32, NULL, sizeof(UInt32), NULL, &key_sym); - require_noerr(err, done); - - err = GetEventParameter(keyEvent, kEventParamKeyMacCharCodes, -! typeChar, NULL, sizeof(char), NULL, &charcode); - require_noerr(err, done); - - #ifndef USE_CMD_KEY - if (modifiers & cmdKey) -! goto done; /* Let system handle Cmd+... */ - #endif - - key_char = charcode; -*************** -*** 2048,2131 **** - - /* Find the special key (eg., for cursor keys) */ - if (actualSize <= sizeof(UniChar) && -! ((text[0] < 0x20) || (text[0] == 0x7f))) - { -! for (i = 0; special_keys[i].key_sym != (KeySym)0; ++i) -! if (special_keys[i].key_sym == key_sym) -! { -! key_char = TO_SPECIAL(special_keys[i].vim_code0, -! special_keys[i].vim_code1); -! key_char = simplify_key(key_char, -! (int *)&vimModifiers); -! isSpecial = TRUE; -! break; -! } - } - - /* Intercept CMD-. and CTRL-c */ - if (((modifiers & controlKey) && key_char == 'c') || -! ((modifiers & cmdKey) && key_char == '.')) -! got_int = TRUE; - - if (!isSpecial) - { -! /* remove SHIFT for keys that are already shifted, e.g., -! * '(' and '*' */ -! if (key_char < 0x100 && !isalpha(key_char) && isprint(key_char)) -! vimModifiers &= ~MOD_MASK_SHIFT; -! -! /* remove CTRL from keys that already have it */ -! if (key_char < 0x20) -! vimModifiers &= ~MOD_MASK_CTRL; -! -! /* don't process unicode characters here */ -! if (!IS_SPECIAL(key_char)) -! { -! /* Following code to simplify and consolidate vimModifiers -! * taken liberally from gui_w48.c */ -! key_char = simplify_key(key_char, (int *)&vimModifiers); -! -! /* Interpret META, include SHIFT, etc. */ -! key_char = extract_modifiers(key_char, (int *)&vimModifiers); -! if (key_char == CSI) -! key_char = K_CSI; -! -! if (IS_SPECIAL(key_char)) -! isSpecial = TRUE; -! } - } - - if (vimModifiers) - { -! result[len++] = CSI; -! result[len++] = KS_MODIFIER; -! result[len++] = vimModifiers; - } - - if (isSpecial && IS_SPECIAL(key_char)) - { -! result[len++] = CSI; -! result[len++] = K_SECOND(key_char); -! result[len++] = K_THIRD(key_char); - } - else - { -! encLen = actualSize; -! to = mac_utf16_to_enc(text, actualSize, &encLen); -! if (to) -! { -! /* This is basically add_to_input_buf_csi() */ -! for (i = 0; i < encLen && len < (INLINE_KEY_BUFFER_SIZE-1); ++i) -! { -! result[len++] = to[i]; -! if (to[i] == CSI) -! { -! result[len++] = KS_EXTRA; -! result[len++] = (int)KE_CSI; -! } -! } -! vim_free(to); -! } - } - - add_to_input_buf(result, len); ---- 2158,2241 ---- - - /* Find the special key (eg., for cursor keys) */ - if (actualSize <= sizeof(UniChar) && -! ((text[0] < 0x20) || (text[0] == 0x7f))) - { -! for (i = 0; special_keys[i].key_sym != (KeySym)0; ++i) -! if (special_keys[i].key_sym == key_sym) -! { -! key_char = TO_SPECIAL(special_keys[i].vim_code0, -! special_keys[i].vim_code1); -! key_char = simplify_key(key_char, -! (int *)&vimModifiers); -! isSpecial = TRUE; -! break; -! } - } - - /* Intercept CMD-. and CTRL-c */ - if (((modifiers & controlKey) && key_char == 'c') || -! ((modifiers & cmdKey) && key_char == '.')) -! got_int = TRUE; - - if (!isSpecial) - { -! /* remove SHIFT for keys that are already shifted, e.g., -! * '(' and '*' */ -! if (key_char < 0x100 && !isalpha(key_char) && isprint(key_char)) -! vimModifiers &= ~MOD_MASK_SHIFT; -! -! /* remove CTRL from keys that already have it */ -! if (key_char < 0x20) -! vimModifiers &= ~MOD_MASK_CTRL; -! -! /* don't process unicode characters here */ -! if (!IS_SPECIAL(key_char)) -! { -! /* Following code to simplify and consolidate vimModifiers -! * taken liberally from gui_w48.c */ -! key_char = simplify_key(key_char, (int *)&vimModifiers); -! -! /* Interpret META, include SHIFT, etc. */ -! key_char = extract_modifiers(key_char, (int *)&vimModifiers); -! if (key_char == CSI) -! key_char = K_CSI; -! -! if (IS_SPECIAL(key_char)) -! isSpecial = TRUE; -! } - } - - if (vimModifiers) - { -! result[len++] = CSI; -! result[len++] = KS_MODIFIER; -! result[len++] = vimModifiers; - } - - if (isSpecial && IS_SPECIAL(key_char)) - { -! result[len++] = CSI; -! result[len++] = K_SECOND(key_char); -! result[len++] = K_THIRD(key_char); - } - else - { -! encLen = actualSize; -! to = mac_utf16_to_enc(text, actualSize, &encLen); -! if (to) -! { -! /* This is basically add_to_input_buf_csi() */ -! for (i = 0; i < encLen && len < (INLINE_KEY_BUFFER_SIZE-1); ++i) -! { -! result[len++] = to[i]; -! if (to[i] == CSI) -! { -! result[len++] = KS_EXTRA; -! result[len++] = (int)KE_CSI; -! } -! } -! vim_free(to); -! } - } - - add_to_input_buf(result, len); -*************** -*** 2135,2144 **** - vim_free(text); - if (err == noErr) - { -! /* Fake event to wake up WNE (required to get -! * key repeat working */ -! PostEvent(keyUp, 0); -! return noErr; - } - - return eventNotHandledErr; ---- 2245,2254 ---- - vim_free(text); - if (err == noErr) - { -! /* Fake event to wake up WNE (required to get -! * key repeat working */ -! PostEvent(keyUp, 0); -! return noErr; - } - - return eventNotHandledErr; -*************** -*** 2334,2340 **** - /* prevent that the vim window size changes if it's activated by a - click into the tab pane */ - if (whichWindow == drawer) -! return; - #endif - - switch (thePart) ---- 2444,2450 ---- - /* prevent that the vim window size changes if it's activated by a - click into the tab pane */ - if (whichWindow == drawer) -! return; - #endif - - switch (thePart) -*************** -*** 2569,2579 **** - if (IsShowContextualMenuClick(event)) - { - # if 0 -! gui_mac_handle_contextual_menu(event); - # else -! gui_mac_doMouseDownEvent(event); - # endif -! return; - } - - /* Handle normal event */ ---- 2679,2689 ---- - if (IsShowContextualMenuClick(event)) - { - # if 0 -! gui_mac_handle_contextual_menu(event); - # else -! gui_mac_doMouseDownEvent(event); - # endif -! return; - } - - /* Handle normal event */ -*************** -*** 2832,2838 **** - # else - /* OSErr GetApplicationBundleFSSpec(FSSpecPtr theFSSpecPtr) - * of TN2015 -- * This technic remove the ../Contents/MacOS/etc part - */ - (void)GetCurrentProcess(&psn); - /* if (err != noErr) return err; */ ---- 2942,2947 ---- -*************** -*** 2933,2942 **** - /* TODO: Move most of this stuff toward gui_mch_init */ - Rect windRect; - MenuHandle pomme; -- EventTypeSpec eventTypeSpec; - EventHandlerRef mouseWheelHandlerRef; - #ifdef USE_CARBONKEYHANDLER -! EventHandlerRef keyEventHandlerRef; - #endif - ControlRef rootControl; - ---- 3042,3050 ---- - /* TODO: Move most of this stuff toward gui_mch_init */ - Rect windRect; - MenuHandle pomme; - EventHandlerRef mouseWheelHandlerRef; - #ifdef USE_CARBONKEYHANDLER -! EventTypeSpec eventTypeSpec; - #endif - ControlRef rootControl; - -*************** -*** 3042,3057 **** - } - - #ifdef USE_CARBONKEYHANDLER -! eventTypeSpec.eventClass = kEventClassTextInput; -! eventTypeSpec.eventKind = kEventUnicodeForKeyEvent; -! keyEventHandlerUPP = NewEventHandlerUPP(gui_mac_doKeyEventCarbon); -! if (noErr != InstallApplicationEventHandler(keyEventHandlerUPP, 1, -! &eventTypeSpec, NULL, &keyEventHandlerRef)) - { -- keyEventHandlerRef = NULL; - DisposeEventHandlerUPP(keyEventHandlerUPP); - keyEventHandlerUPP = NULL; - } - #endif - - /* ---- 3150,3196 ---- - } - - #ifdef USE_CARBONKEYHANDLER -! InterfaceTypeList supportedServices = { kUnicodeDocument }; -! NewTSMDocument(1, supportedServices, &gTSMDocument, 0); -! -! /* We don't support inline input yet, use input window by default */ -! UseInputWindow(gTSMDocument, TRUE); -! -! /* Should we activate the document by default? */ -! // ActivateTSMDocument(gTSMDocument); -! -! EventTypeSpec textEventTypes[] = { -! { kEventClassTextInput, kEventTextInputUpdateActiveInputArea }, -! { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent }, -! { kEventClassTextInput, kEventTextInputPosToOffset }, -! { kEventClassTextInput, kEventTextInputOffsetToPos }, -! }; -! -! keyEventHandlerUPP = NewEventHandlerUPP(gui_mac_handle_text_input); -! if (noErr != InstallApplicationEventHandler(keyEventHandlerUPP, -! NR_ELEMS(textEventTypes), -! textEventTypes, NULL, NULL)) - { - DisposeEventHandlerUPP(keyEventHandlerUPP); - keyEventHandlerUPP = NULL; - } -+ -+ EventTypeSpec windowEventTypes[] = { -+ { kEventClassWindow, kEventWindowActivated }, -+ { kEventClassWindow, kEventWindowDeactivated }, -+ }; -+ -+ /* Install window event handler to support TSMDocument activate and -+ * deactivate */ -+ winEventHandlerUPP = NewEventHandlerUPP(gui_mac_handle_window_activate); -+ if (noErr != InstallWindowEventHandler(gui.VimWindow, -+ winEventHandlerUPP, -+ NR_ELEMS(windowEventTypes), -+ windowEventTypes, NULL, NULL)) -+ { -+ DisposeEventHandlerUPP(winEventHandlerUPP); -+ winEventHandlerUPP = NULL; -+ } - #endif - - /* -*************** -*** 3107,3112 **** ---- 3246,3264 ---- - return OK; - } - -+ #ifdef USE_ATSUI_DRAWING -+ static void -+ gui_mac_dispose_atsui_style(void) -+ { -+ if (p_macatsui && gFontStyle) -+ ATSUDisposeStyle(gFontStyle); -+ #ifdef FEAT_MBYTE -+ if (p_macatsui && gWideFontStyle) -+ ATSUDisposeStyle(gWideFontStyle); -+ #endif -+ } -+ #endif -+ - void - gui_mch_exit(int rc) - { -*************** -*** 3122,3129 **** - DisposeEventHandlerUPP(mouseWheelHandlerUPP); - - #ifdef USE_ATSUI_DRAWING -! if (p_macatsui && gFontStyle) -! ATSUDisposeStyle(gFontStyle); - #endif - - /* Exit to shell? */ ---- 3274,3286 ---- - DisposeEventHandlerUPP(mouseWheelHandlerUPP); - - #ifdef USE_ATSUI_DRAWING -! gui_mac_dispose_atsui_style(); -! #endif -! -! #ifdef USE_CARBONKEYHANDLER -! FixTSMDocument(gTSMDocument); -! DeactivateTSMDocument(gTSMDocument); -! DeleteTSMDocument(gTSMDocument); - #endif - - /* Exit to shell? */ -*************** -*** 3263,3268 **** ---- 3420,3445 ---- - return selected_font; - } - -+ #ifdef USE_ATSUI_DRAWING -+ static void -+ gui_mac_create_atsui_style(void) -+ { -+ if (p_macatsui && gFontStyle == NULL) -+ { -+ if (ATSUCreateStyle(&gFontStyle) != noErr) -+ gFontStyle = NULL; -+ } -+ #ifdef FEAT_MBYTE -+ if (p_macatsui && gWideFontStyle == NULL) -+ { -+ if (ATSUCreateStyle(&gWideFontStyle) != noErr) -+ gWideFontStyle = NULL; -+ } -+ #endif -+ -+ p_macatsui_last = p_macatsui; -+ } -+ #endif - - /* - * Initialise vim to use the font with the given name. Return FAIL if the font -*************** -*** 3280,3290 **** - char_u used_font_name[512]; - - #ifdef USE_ATSUI_DRAWING -! if (p_macatsui && gFontStyle == NULL) -! { -! if (ATSUCreateStyle(&gFontStyle) != noErr) -! gFontStyle = NULL; -! } - #endif - - if (font_name == NULL) ---- 3457,3463 ---- - char_u used_font_name[512]; - - #ifdef USE_ATSUI_DRAWING -! gui_mac_create_atsui_style(); - #endif - - if (font_name == NULL) -*************** -*** 3348,3396 **** - gui.char_height = font_info.ascent + font_info.descent + p_linespace; - - #ifdef USE_ATSUI_DRAWING -- ATSUFontID fontID; -- Fixed fontSize; -- ATSStyleRenderingOptions fontOptions; -- - if (p_macatsui && gFontStyle) -! { -! fontID = font & 0xFFFF; -! fontSize = Long2Fix(font >> 16); -! -! /* No antialiasing by default (do not attempt to touch antialising -! * options on pre-Jaguar) */ -! fontOptions = -! (gMacSystemVersion >= 0x1020) ? -! kATSStyleNoAntiAliasing : -! kATSStyleNoOptions; -! -! ATSUAttributeTag attribTags[] = -! { -! kATSUFontTag, kATSUSizeTag, kATSUStyleRenderingOptionsTag, -! kATSUMaxATSUITagValue+1 -! }; -! ByteCount attribSizes[] = -! { -! sizeof(ATSUFontID), sizeof(Fixed), -! sizeof(ATSStyleRenderingOptions), sizeof font -! }; -! ATSUAttributeValuePtr attribValues[] = -! { -! &fontID, &fontSize, &fontOptions, &font -! }; -! -! /* Convert font id to ATSUFontID */ -! if (FMGetFontFromFontFamilyInstance(fontID, 0, &fontID, NULL) == noErr) -! { -! if (ATSUSetAttributes(gFontStyle, -! (sizeof attribTags)/sizeof(ATSUAttributeTag), -! attribTags, attribSizes, attribValues) != noErr) -! { -! ATSUDisposeStyle(gFontStyle); -! gFontStyle = NULL; -! } -! } -! } - #endif - - return OK; ---- 3521,3528 ---- - gui.char_height = font_info.ascent + font_info.descent + p_linespace; - - #ifdef USE_ATSUI_DRAWING - if (p_macatsui && gFontStyle) -! gui_mac_set_font_attributes(font); - #endif - - return OK; -*************** -*** 3447,3452 **** ---- 3579,3646 ---- - } - #endif - -+ #ifdef USE_ATSUI_DRAWING -+ static void -+ gui_mac_set_font_attributes(GuiFont font) -+ { -+ ATSUFontID fontID; -+ Fixed fontSize; -+ Fixed fontWidth; -+ -+ fontID = font & 0xFFFF; -+ fontSize = Long2Fix(font >> 16); -+ fontWidth = Long2Fix(gui.char_width); -+ -+ ATSUAttributeTag attribTags[] = -+ { -+ kATSUFontTag, kATSUSizeTag, kATSUImposeWidthTag, -+ kATSUMaxATSUITagValue + 1 -+ }; -+ -+ ByteCount attribSizes[] = -+ { -+ sizeof(ATSUFontID), sizeof(Fixed), sizeof(fontWidth), -+ sizeof(font) -+ }; -+ -+ ATSUAttributeValuePtr attribValues[] = -+ { -+ &fontID, &fontSize, &fontWidth, &font -+ }; -+ -+ if (FMGetFontFromFontFamilyInstance(fontID, 0, &fontID, NULL) == noErr) -+ { -+ if (ATSUSetAttributes(gFontStyle, -+ (sizeof attribTags) / sizeof(ATSUAttributeTag), -+ attribTags, attribSizes, attribValues) != noErr) -+ { -+ # ifndef NDEBUG -+ fprintf(stderr, "couldn't set font style\n"); -+ # endif -+ ATSUDisposeStyle(gFontStyle); -+ gFontStyle = NULL; -+ } -+ -+ #ifdef FEAT_MBYTE -+ if (has_mbyte) -+ { -+ /* FIXME: we should use a more mbyte sensitive way to support -+ * wide font drawing */ -+ fontWidth = Long2Fix(gui.char_width * 2); -+ -+ if (ATSUSetAttributes(gWideFontStyle, -+ (sizeof attribTags) / sizeof(ATSUAttributeTag), -+ attribTags, attribSizes, attribValues) != noErr) -+ { -+ ATSUDisposeStyle(gWideFontStyle); -+ gWideFontStyle = NULL; -+ } -+ } -+ #endif -+ } -+ } -+ #endif -+ - /* - * Set the current text font. - */ -*************** -*** 3456,3518 **** - #ifdef USE_ATSUI_DRAWING - GuiFont currFont; - ByteCount actualFontByteCount; -- ATSUFontID fontID; -- Fixed fontSize; -- ATSStyleRenderingOptions fontOptions; - - if (p_macatsui && gFontStyle) - { - /* Avoid setting same font again */ -! if (ATSUGetAttribute(gFontStyle, kATSUMaxATSUITagValue+1, sizeof font, -! &currFont, &actualFontByteCount) == noErr && -! actualFontByteCount == (sizeof font)) - { - if (currFont == font) - return; - } - -! fontID = font & 0xFFFF; -! fontSize = Long2Fix(font >> 16); -! /* Respect p_antialias setting only for wide font. -! * The reason for doing this at the moment is a bit complicated, -! * but it's mainly because a) latin (non-wide) aliased fonts -! * look bad in OS X 10.3.x and below (due to a bug in ATS), and -! * b) wide multibyte input does not suffer from that problem. */ -! /*fontOptions = -! (p_antialias && (font == gui.wide_font)) ? -! kATSStyleNoOptions : kATSStyleNoAntiAliasing; -! */ -! /*fontOptions = kATSStyleAntiAliasing;*/ -! -! ATSUAttributeTag attribTags[] = -! { -! kATSUFontTag, kATSUSizeTag, kATSUStyleRenderingOptionsTag, -! kATSUMaxATSUITagValue+1 -! }; -! ByteCount attribSizes[] = -! { -! sizeof(ATSUFontID), sizeof(Fixed), -! sizeof(ATSStyleRenderingOptions), sizeof font -! }; -! ATSUAttributeValuePtr attribValues[] = -! { -! &fontID, &fontSize, &fontOptions, &font -! }; -! -! if (FMGetFontFromFontFamilyInstance(fontID, 0, &fontID, NULL) == noErr) -! { -! if (ATSUSetAttributes(gFontStyle, -! (sizeof attribTags)/sizeof(ATSUAttributeTag), -! attribTags, attribSizes, attribValues) != noErr) -! { -! # ifndef NDEBUG -! fprintf(stderr, "couldn't set font style\n"); -! # endif -! ATSUDisposeStyle(gFontStyle); -! gFontStyle = NULL; -! } -! } -! - } - - if (p_macatsui && !gIsFontFallbackSet) ---- 3650,3668 ---- - #ifdef USE_ATSUI_DRAWING - GuiFont currFont; - ByteCount actualFontByteCount; - - if (p_macatsui && gFontStyle) - { - /* Avoid setting same font again */ -! if (ATSUGetAttribute(gFontStyle, kATSUMaxATSUITagValue + 1, -! sizeof(font), &currFont, &actualFontByteCount) == noErr -! && actualFontByteCount == (sizeof font)) - { - if (currFont == font) - return; - } - -! gui_mac_set_font_attributes(font); - } - - if (p_macatsui && !gIsFontFallbackSet) -*************** -*** 3536,3542 **** - &fallbackFonts, - NULL) == noErr) - { -! ATSUSetFontFallbacks((sizeof fallbackFonts)/sizeof(ATSUFontID), &fallbackFonts, kATSUSequentialFallbacksPreferred); - } - /* - ATSUAttributeValuePtr fallbackValues[] = { }; ---- 3686,3694 ---- - &fallbackFonts, - NULL) == noErr) - { -! ATSUSetFontFallbacks((sizeof fallbackFonts)/sizeof(ATSUFontID), -! &fallbackFonts, -! kATSUSequentialFallbacksPreferred); - } - /* - ATSUAttributeValuePtr fallbackValues[] = { }; -*************** -*** 3921,3927 **** - - /* - ATSUI automatically antialiases text (Someone) - * - for some reason it does not work... (Jussi) */ -! - /* - * When antialiasing we're using srcOr mode, we have to clear the block - * before drawing the text. ---- 4073,4082 ---- - - /* - ATSUI automatically antialiases text (Someone) - * - for some reason it does not work... (Jussi) */ -! #ifdef MAC_ATSUI_DEBUG -! fprintf(stderr, "row = %d, col = %d, len = %d: '%c'\n", -! row, col, len, len == 1 ? s[0] : ' '); -! #endif - /* - * When antialiasing we're using srcOr mode, we have to clear the block - * before drawing the text. -*************** -*** 3956,3990 **** - } - - { -- /* Use old-style, non-antialiased QuickDraw text rendering. */ - TextMode(srcCopy); - TextFace(normal); - -! /* SelectFont(hdc, gui.currFont); */ -! - if (flags & DRAW_TRANSP) - { - TextMode(srcOr); - } - - MoveTo(TEXT_X(col), TEXT_Y(row)); -- ATSUTextLayout textLayout; - -! if (ATSUCreateTextLayoutWithTextPtr(tofree, -! kATSUFromTextBeginning, kATSUToTextEnd, -! utf16_len, -! (gFontStyle ? 1 : 0), &utf16_len, -! (gFontStyle ? &gFontStyle : NULL), -! &textLayout) == noErr) - { -! ATSUSetTransientFontMatching(textLayout, TRUE); - -! ATSUDrawText(textLayout, -! kATSUFromTextBeginning, kATSUToTextEnd, -! kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc); - - ATSUDisposeTextLayout(textLayout); - } - } - - if (flags & DRAW_UNDERC) ---- 4111,4232 ---- - } - - { - TextMode(srcCopy); - TextFace(normal); - -! /* SelectFont(hdc, gui.currFont); */ - if (flags & DRAW_TRANSP) - { - TextMode(srcOr); - } - - MoveTo(TEXT_X(col), TEXT_Y(row)); - -! if (gFontStyle && flags & DRAW_BOLD) - { -! Boolean attValue = true; -! ATSUAttributeTag attribTags[] = { kATSUQDBoldfaceTag }; -! ByteCount attribSizes[] = { sizeof(Boolean) }; -! ATSUAttributeValuePtr attribValues[] = { &attValue }; - -! ATSUSetAttributes(gFontStyle, 1, attribTags, attribSizes, attribValues); -! } -! -! #ifdef FEAT_MBYTE -! if (has_mbyte) -! { -! int n, width_in_cell, last_width_in_cell; -! UniCharArrayOffset offset = 0; -! UniCharCount yet_to_draw = 0; -! ATSUTextLayout textLayout; -! ATSUStyle textStyle; -! -! last_width_in_cell = 1; -! ATSUCreateTextLayout(&textLayout); -! ATSUSetTextPointerLocation(textLayout, tofree, -! kATSUFromTextBeginning, -! kATSUToTextEnd, utf16_len); -! /* -! ATSUSetRunStyle(textLayout, gFontStyle, -! kATSUFromTextBeginning, kATSUToTextEnd); */ -! -! /* Compute the length in display cells. */ -! for (n = 0; n < len; n += MB_BYTE2LEN(s[n])) -! { -! width_in_cell = (*mb_ptr2cells)(s + n); -! -! /* probably we are switching from single byte character -! * to multibyte characters (which requires more than one -! * cell to draw) */ -! if (width_in_cell != last_width_in_cell) -! { -! #ifdef MAC_ATSUI_DEBUG -! fprintf(stderr, "\tn = %2d, (%d-%d), offset = %d, yet_to_draw = %d\n", -! n, last_width_in_cell, width_in_cell, offset, yet_to_draw); -! #endif -! textStyle = last_width_in_cell > 1 ? gWideFontStyle -! : gFontStyle; -! -! ATSUSetRunStyle(textLayout, textStyle, offset, yet_to_draw); -! offset += yet_to_draw; -! yet_to_draw = 0; -! last_width_in_cell = width_in_cell; -! } - -+ yet_to_draw++; -+ } -+ -+ if (yet_to_draw) -+ { -+ #ifdef MAC_ATSUI_DEBUG -+ fprintf(stderr, "\tn = %2d, (%d-%d), offset = %d, yet_to_draw = %d\n", -+ n, last_width_in_cell, width_in_cell, offset, yet_to_draw); -+ #endif -+ /* finish the rest style */ -+ textStyle = width_in_cell > 1 ? gWideFontStyle : gFontStyle; -+ ATSUSetRunStyle(textLayout, textStyle, offset, kATSUToTextEnd); -+ } -+ -+ ATSUSetTransientFontMatching(textLayout, TRUE); -+ ATSUDrawText(textLayout, -+ kATSUFromTextBeginning, kATSUToTextEnd, -+ kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc); - ATSUDisposeTextLayout(textLayout); - } -+ else -+ #endif -+ { -+ ATSUTextLayout textLayout; -+ -+ if (ATSUCreateTextLayoutWithTextPtr(tofree, -+ kATSUFromTextBeginning, kATSUToTextEnd, -+ utf16_len, -+ (gFontStyle ? 1 : 0), &utf16_len, -+ (gFontStyle ? &gFontStyle : NULL), -+ &textLayout) == noErr) -+ { -+ ATSUSetTransientFontMatching(textLayout, TRUE); -+ -+ ATSUDrawText(textLayout, -+ kATSUFromTextBeginning, kATSUToTextEnd, -+ kATSUUseGrafPortPenLoc, kATSUUseGrafPortPenLoc); -+ -+ ATSUDisposeTextLayout(textLayout); -+ } -+ } -+ -+ /* drawing is done, now reset bold to normal */ -+ if (gFontStyle && flags & DRAW_BOLD) -+ { -+ Boolean attValue = false; -+ -+ ATSUAttributeTag attribTags[] = { kATSUQDBoldfaceTag }; -+ ByteCount attribSizes[] = { sizeof(Boolean) }; -+ ATSUAttributeValuePtr attribValues[] = { &attValue }; -+ -+ ATSUSetAttributes(gFontStyle, 1, attribTags, attribSizes, -+ attribValues); -+ } - } - - if (flags & DRAW_UNDERC) -*************** -*** 3998,4003 **** ---- 4240,4252 ---- - gui_mch_draw_string(int row, int col, char_u *s, int len, int flags) - { - #if defined(USE_ATSUI_DRAWING) -+ if (p_macatsui == 0 && p_macatsui_last != 0) -+ /* switch from macatsui to nomacatsui */ -+ gui_mac_dispose_atsui_style(); -+ else if (p_macatsui != 0 && p_macatsui_last == 0) -+ /* switch from nomacatsui to macatsui */ -+ gui_mac_create_atsui_style(); -+ - if (p_macatsui) - draw_string_ATSUI(row, col, s, len, flags); - else -*************** -*** 4228,4239 **** - */ - /* TODO: reduce wtime accordinly??? */ - if (wtime > -1) -! sleeppyTick = 60*wtime/1000; - else - sleeppyTick = 32767; - if (WaitNextEventWrp(mask, &event, sleeppyTick, dragRgn)) - { -! gui_mac_handle_event(&event); - if (input_available()) - { - allow_scrollbar = FALSE; ---- 4477,4489 ---- - */ - /* TODO: reduce wtime accordinly??? */ - if (wtime > -1) -! sleeppyTick = 60 * wtime / 1000; - else - sleeppyTick = 32767; -+ - if (WaitNextEventWrp(mask, &event, sleeppyTick, dragRgn)) - { -! gui_mac_handle_event(&event); - if (input_available()) - { - allow_scrollbar = FALSE; -*************** -*** 6031,6037 **** - #endif - } - -! #if defined(USE_IM_CONTROL) || defined(PROTO) - /* - * Input Method Control functions. - */ ---- 6346,6352 ---- - #endif - } - -! #if (defined(USE_IM_CONTROL) || defined(PROTO)) && defined(USE_CARBONKEYHANDLER) - /* - * Input Method Control functions. - */ -*************** -*** 6042,6048 **** ---- 6357,6427 ---- - void - im_set_position(int row, int col) - { -+ #if 0 - /* TODO: Implement me! */ -+ im_start_row = row; -+ im_start_col = col; -+ #endif -+ } -+ -+ static ScriptLanguageRecord gTSLWindow; -+ static ScriptLanguageRecord gTSLInsert; -+ static ScriptLanguageRecord gTSLDefault = { 0, 0 }; -+ -+ static Component gTSCWindow; -+ static Component gTSCInsert; -+ static Component gTSCDefault; -+ -+ static int im_initialized = 0; -+ -+ static void -+ im_on_window_switch(int active) -+ { -+ ScriptLanguageRecord *slptr = NULL; -+ OSStatus err; -+ -+ if (! gui.in_use) -+ return; -+ -+ if (im_initialized == 0) -+ { -+ im_initialized = 1; -+ -+ /* save default TSM component (should be U.S.) to default */ -+ GetDefaultInputMethodOfClass(&gTSCDefault, &gTSLDefault, -+ kKeyboardInputMethodClass); -+ } -+ -+ if (active == TRUE) -+ { -+ im_is_active = TRUE; -+ ActivateTSMDocument(gTSMDocument); -+ slptr = &gTSLWindow; -+ -+ if (slptr) -+ { -+ err = SetDefaultInputMethodOfClass(gTSCWindow, slptr, -+ kKeyboardInputMethodClass); -+ if (err == noErr) -+ err = SetTextServiceLanguage(slptr); -+ -+ if (err == noErr) -+ KeyScript(slptr->fScript | smKeyForceKeyScriptMask); -+ } -+ } -+ else -+ { -+ err = GetTextServiceLanguage(&gTSLWindow); -+ if (err == noErr) -+ slptr = &gTSLWindow; -+ -+ if (slptr) -+ GetDefaultInputMethodOfClass(&gTSCWindow, slptr, -+ kKeyboardInputMethodClass); -+ -+ im_is_active = FALSE; -+ DeactivateTSMDocument(gTSMDocument); -+ } - } - - /* -*************** -*** 6051,6057 **** - void - im_set_active(int active) - { -! KeyScript(active ? smKeySysScript : smKeyRoman); - } - - /* ---- 6430,6486 ---- - void - im_set_active(int active) - { -! ScriptLanguageRecord *slptr = NULL; -! OSStatus err; -! -! if (! gui.in_use) -! return; -! -! if (im_initialized == 0) -! { -! im_initialized = 1; -! -! /* save default TSM component (should be U.S.) to default */ -! GetDefaultInputMethodOfClass(&gTSCDefault, &gTSLDefault, -! kKeyboardInputMethodClass); -! } -! -! if (active == TRUE) -! { -! im_is_active = TRUE; -! ActivateTSMDocument(gTSMDocument); -! slptr = &gTSLInsert; -! -! if (slptr) -! { -! err = SetDefaultInputMethodOfClass(gTSCInsert, slptr, -! kKeyboardInputMethodClass); -! if (err == noErr) -! err = SetTextServiceLanguage(slptr); -! -! if (err == noErr) -! KeyScript(slptr->fScript | smKeyForceKeyScriptMask); -! } -! } -! else -! { -! err = GetTextServiceLanguage(&gTSLInsert); -! if (err == noErr) -! slptr = &gTSLInsert; -! -! if (slptr) -! GetDefaultInputMethodOfClass(&gTSCInsert, slptr, -! kKeyboardInputMethodClass); -! -! /* restore to default when switch to normal mode, so than we could -! * enter commands easier */ -! SetDefaultInputMethodOfClass(gTSCDefault, &gTSLDefault, -! kKeyboardInputMethodClass); -! SetTextServiceLanguage(&gTSLDefault); -! -! im_is_active = FALSE; -! DeactivateTSMDocument(gTSMDocument); -! } - } - - /* -*************** -*** 6060,6068 **** - int - im_get_status(void) - { -! SInt32 script = GetScriptManagerVariable(smKeyScript); -! return (script != smRoman -! && script == GetScriptManagerVariable(smSysScript)) ? 1 : 0; - } - - #endif /* defined(USE_IM_CONTROL) || defined(PROTO) */ ---- 6489,6498 ---- - int - im_get_status(void) - { -! if (! gui.in_use) -! return 0; -! -! return im_is_active; - } - - #endif /* defined(USE_IM_CONTROL) || defined(PROTO) */ -*************** -*** 6118,6124 **** - int numTabs = 0; - - for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) -! ++numTabs; - return numTabs; - } - ---- 6548,6554 ---- - int numTabs = 0; - - for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) -! ++numTabs; - return numTabs; - } - -*************** -*** 6126,6133 **** - static OSStatus - dbItemDataCallback(ControlRef browser, - DataBrowserItemID itemID, -! DataBrowserPropertyID property /* column id */, -! DataBrowserItemDataRef itemData, - Boolean changeValue) - { - OSStatus status = noErr; ---- 6556,6563 ---- - static OSStatus - dbItemDataCallback(ControlRef browser, - DataBrowserItemID itemID, -! DataBrowserPropertyID property /* column id */, -! DataBrowserItemDataRef itemData, - Boolean changeValue) - { - OSStatus status = noErr; -*************** -*** 6170,6178 **** - static void - dbGetContextualMenuCallback(ControlRef browser, - MenuRef *menu, -! UInt32 *helpType, - CFStringRef *helpItemString, -! AEDesc *selection) - { - // on mac os 9: kCMHelpItemNoHelp, but it's not the same - *helpType = kCMHelpItemRemoveHelp; // OS X only ;-) ---- 6600,6608 ---- - static void - dbGetContextualMenuCallback(ControlRef browser, - MenuRef *menu, -! UInt32 *helpType, - CFStringRef *helpItemString, -! AEDesc *selection) - { - // on mac os 9: kCMHelpItemNoHelp, but it's not the same - *helpType = kCMHelpItemRemoveHelp; // OS X only ;-) -*************** -*** 6395,6403 **** - gui_mch_show_tabline(int showit) - { - if (showit == 0) -! CloseDrawer(drawer, true); - else -! OpenDrawer(drawer, kWindowEdgeRight, true); - } - - /* ---- 6825,6833 ---- - gui_mch_show_tabline(int showit) - { - if (showit == 0) -! CloseDrawer(drawer, true); - else -! OpenDrawer(drawer, kWindowEdgeRight, true); - } - - /* -*************** -*** 6425,6435 **** - // adjust data browser - if (tabLabels != NULL) - { -! int i; - -! for (i = 0; i < tabLabelsSize; ++i) -! CFRelease(tabLabels[i]); -! free(tabLabels); - } - tabLabels = (CFStringRef *)malloc(numTabs * sizeof(CFStringRef)); - tabLabelsSize = numTabs; ---- 6855,6865 ---- - // adjust data browser - if (tabLabels != NULL) - { -! int i; - -! for (i = 0; i < tabLabelsSize; ++i) -! CFRelease(tabLabels[i]); -! free(tabLabels); - } - tabLabels = (CFStringRef *)malloc(numTabs * sizeof(CFStringRef)); - tabLabelsSize = numTabs; -*************** -*** 6438,6444 **** - { - if (tp == curtab) - curtabidx = nr; -! tabLabels[nr-1] = getTabLabel(tp); - } - - RemoveDataBrowserItems(dataBrowser, kDataBrowserNoItem, 0, NULL, ---- 6868,6874 ---- - { - if (tp == curtab) - curtabidx = nr; -! tabLabels[nr-1] = getTabLabel(tp); - } - - RemoveDataBrowserItems(dataBrowser, kDataBrowserNoItem, 0, NULL, -*** ../vim-7.1.274/src/version.c Wed Mar 12 13:45:34 2008 ---- src/version.c Wed Mar 12 14:31:37 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 275, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -115. You are late picking up your kid from school and try to explain - to the teacher you were stuck in Web traffic. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.276 b/7.1.276 deleted file mode 100644 index 5af780b0..00000000 --- a/7.1.276 +++ /dev/null @@ -1,156 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.276 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.276 -Problem: "gw" uses 'formatexpr', even though the docs say it doesn't. -Solution: Don't use 'formatexpr' for "gw". -Files: src/vim.h, src/edit.c, src/ops.c, src/proto/ops.pro - - -*** ../vim-7.1.275/src/vim.h Wed Mar 12 14:38:51 2008 ---- src/vim.h Wed Mar 12 16:31:44 2008 -*************** -*** 949,954 **** ---- 952,958 ---- - #define INSCHAR_FORMAT 1 /* force formatting */ - #define INSCHAR_DO_COM 2 /* format comments */ - #define INSCHAR_CTRLV 4 /* char typed just after CTRL-V */ -+ #define INSCHAR_NO_FEX 8 /* don't use 'formatexpr' */ - - /* flags for open_line() */ - #define OPENLINE_DELSPACES 1 /* delete spaces after cursor */ -*** ../vim-7.1.275/src/edit.c Tue Jan 22 17:49:17 2008 ---- src/edit.c Wed Mar 12 16:35:44 2008 -*************** -*** 5491,5497 **** - #if defined(FEAT_EVAL) - int do_internal = TRUE; - -! if (*curbuf->b_p_fex != NUL) - { - do_internal = (fex_format(curwin->w_cursor.lnum, 1L, c) != 0); - /* It may be required to save for undo again, e.g. when setline() ---- 5491,5497 ---- - #if defined(FEAT_EVAL) - int do_internal = TRUE; - -! if (*curbuf->b_p_fex != NUL && (flags & INSCHAR_NO_FEX) == 0) - { - do_internal = (fex_format(curwin->w_cursor.lnum, 1L, c) != 0); - /* It may be required to save for undo again, e.g. when setline() -*************** -*** 6057,6063 **** - * be adjusted for the text formatting. - */ - saved_cursor = pos; -! format_lines((linenr_T)-1); - curwin->w_cursor = saved_cursor; - saved_cursor.lnum = 0; - ---- 6057,6063 ---- - * be adjusted for the text formatting. - */ - saved_cursor = pos; -! format_lines((linenr_T)-1, FALSE); - curwin->w_cursor = saved_cursor; - saved_cursor.lnum = 0; - -*** ../vim-7.1.275/src/ops.c Mon Feb 25 21:54:23 2008 ---- src/ops.c Wed Mar 12 16:37:29 2008 -*************** -*** 4380,4386 **** - if (keep_cursor) - saved_cursor = oap->cursor_start; - -! format_lines(oap->line_count); - - /* - * Leave the cursor at the first non-blank of the last formatted line. ---- 4380,4386 ---- - if (keep_cursor) - saved_cursor = oap->cursor_start; - -! format_lines(oap->line_count, keep_cursor); - - /* - * Leave the cursor at the first non-blank of the last formatted line. -*************** -*** 4495,4502 **** - * first line. - */ - void -! format_lines(line_count) - linenr_T line_count; - { - int max_len; - int is_not_par; /* current line not part of parag. */ ---- 4495,4503 ---- - * first line. - */ - void -! format_lines(line_count, avoid_fex) - linenr_T line_count; -+ int avoid_fex; /* don't use 'formatexpr' */ - { - int max_len; - int is_not_par; /* current line not part of parag. */ -*************** -*** 4666,4672 **** - #ifdef FEAT_COMMENTS - + (do_comments ? INSCHAR_DO_COM : 0) - #endif -! , second_indent); - State = old_State; - p_smd = smd_save; - second_indent = -1; ---- 4667,4673 ---- - #ifdef FEAT_COMMENTS - + (do_comments ? INSCHAR_DO_COM : 0) - #endif -! + (avoid_fex ? INSCHAR_NO_FEX : 0), second_indent); - State = old_State; - p_smd = smd_save; - second_indent = -1; -*** ../vim-7.1.275/src/proto/ops.pro Wed Jan 16 20:01:14 2008 ---- src/proto/ops.pro Wed Mar 12 16:38:39 2008 -*************** -*** 41,47 **** - void op_format __ARGS((oparg_T *oap, int keep_cursor)); - void op_formatexpr __ARGS((oparg_T *oap)); - int fex_format __ARGS((linenr_T lnum, long count, int c)); -! void format_lines __ARGS((linenr_T line_count)); - int paragraph_start __ARGS((linenr_T lnum)); - int do_addsub __ARGS((int command, linenr_T Prenum1)); - int read_viminfo_register __ARGS((vir_T *virp, int force)); ---- 41,47 ---- - void op_format __ARGS((oparg_T *oap, int keep_cursor)); - void op_formatexpr __ARGS((oparg_T *oap)); - int fex_format __ARGS((linenr_T lnum, long count, int c)); -! void format_lines __ARGS((linenr_T line_count, int avoid_fex)); - int paragraph_start __ARGS((linenr_T lnum)); - int do_addsub __ARGS((int command, linenr_T Prenum1)); - int read_viminfo_register __ARGS((vir_T *virp, int force)); -*** ../vim-7.1.275/src/version.c Wed Mar 12 14:38:51 2008 ---- src/version.c Wed Mar 12 17:23:43 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 276, - /**/ - --- -An actual excerpt from a classified section of a city newspaper: -"Illiterate? Write today for free help!" - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.277 b/7.1.277 deleted file mode 100644 index bedc3131..00000000 --- a/7.1.277 +++ /dev/null @@ -1,84 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.277 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.277 -Problem: Default for 'paragraphs' misses some items (Colin Watson) -Solution: Add TP, HP, Pp, Lp and It to 'paragraphs'. (James Vega) -Files: runtime/doc/options.txt, src/option.c - - -*** ../vim-7.1.276/runtime/doc/options.txt Sat Jan 19 15:55:51 2008 ---- runtime/doc/options.txt Wed Mar 12 17:34:32 2008 -*************** -*** 1,4 **** -! *options.txt* For Vim version 7.1. Last change: 2007 Aug 10 - - - VIM REFERENCE MANUAL by Bram Moolenaar ---- 1,4 ---- -! *options.txt* For Vim version 7.1. Last change: 2008 Feb 24 - - - VIM REFERENCE MANUAL by Bram Moolenaar -*************** -*** 4878,4884 **** - |autocmd-osfiletypes| - - *'paragraphs'* *'para'* -! 'paragraphs' 'para' string (default "IPLPPPQPP LIpplpipbp") - global - Specifies the nroff macros that separate paragraphs. These are pairs - of two letters (see |object-motions|). ---- 4901,4907 ---- - |autocmd-osfiletypes| - - *'paragraphs'* *'para'* -! 'paragraphs' 'para' string (default "IPLPPPQPP TPHPLIPpLpItpplpipbp") - global - Specifies the nroff macros that separate paragraphs. These are pairs - of two letters (see |object-motions|). -*** ../vim-7.1.276/src/option.c Wed Feb 13 18:35:23 2008 ---- src/option.c Wed Mar 12 17:34:32 2008 -*************** -*** 1839,1845 **** - }, - {"paragraphs", "para", P_STRING|P_VI_DEF, - (char_u *)&p_para, PV_NONE, -! {(char_u *)"IPLPPPQPP LIpplpipbp", (char_u *)0L}}, - {"paste", NULL, P_BOOL|P_VI_DEF|P_PRI_MKRC, - (char_u *)&p_paste, PV_NONE, - {(char_u *)FALSE, (char_u *)0L}}, ---- 1839,1846 ---- - }, - {"paragraphs", "para", P_STRING|P_VI_DEF, - (char_u *)&p_para, PV_NONE, -! {(char_u *)"IPLPPPQPP TPHPLIPpLpItpplpipbp", -! (char_u *)0L}}, - {"paste", NULL, P_BOOL|P_VI_DEF|P_PRI_MKRC, - (char_u *)&p_paste, PV_NONE, - {(char_u *)FALSE, (char_u *)0L}}, -*** ../vim-7.1.276/src/version.c Wed Mar 12 17:25:50 2008 ---- src/version.c Wed Mar 12 17:35:14 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 277, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -119. You are reading a book and look for the scroll bar to get to - the next page. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.278 b/7.1.278 deleted file mode 100644 index d274ebbe..00000000 --- a/7.1.278 +++ /dev/null @@ -1,62 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.278 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.278 (extra, after 7.1.275) -Problem: Build failure when USE_CARBONKEYHANDLER is not defined. -Solution: Remove #ifdef. -Files: src/gui_mac.c - - -*** ../vim-7.1.277/src/gui_mac.c Wed Mar 12 14:38:51 2008 ---- src/gui_mac.c Wed Mar 12 21:40:54 2008 -*************** -*** 3037,3049 **** - gui_mch_init(void) - { - /* TODO: Move most of this stuff toward gui_mch_init */ -! Rect windRect; -! MenuHandle pomme; - EventHandlerRef mouseWheelHandlerRef; -- #ifdef USE_CARBONKEYHANDLER - EventTypeSpec eventTypeSpec; -! #endif -! ControlRef rootControl; - - if (Gestalt(gestaltSystemVersion, &gMacSystemVersion) != noErr) - gMacSystemVersion = 0x1000; /* TODO: Default to minimum sensible value */ ---- 3040,3050 ---- - gui_mch_init(void) - { - /* TODO: Move most of this stuff toward gui_mch_init */ -! Rect windRect; -! MenuHandle pomme; - EventHandlerRef mouseWheelHandlerRef; - EventTypeSpec eventTypeSpec; -! ControlRef rootControl; - - if (Gestalt(gestaltSystemVersion, &gMacSystemVersion) != noErr) - gMacSystemVersion = 0x1000; /* TODO: Default to minimum sensible value */ -*** ../vim-7.1.277/src/version.c Wed Mar 12 17:37:53 2008 ---- src/version.c Wed Mar 12 21:43:22 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 278, - /**/ - --- -Would you care for a drink? I mean, if it were, like, -disabled and you had to look after it? - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.279 b/7.1.279 deleted file mode 100644 index b44beaed..00000000 --- a/7.1.279 +++ /dev/null @@ -1,146 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.279 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.279 -Problem: When using cscope temporary files are left behind. -Solution: Send the quit command to cscope and give it two seconds to exit - nicely before killing it. (partly by Dominique Pelle) -Files: src/if_cscope.c - - -*** ../vim-7.1.278/src/if_cscope.c Fri Sep 14 19:56:18 2007 ---- src/if_cscope.c Sat Mar 15 12:38:12 2008 -*************** -*** 2096,2101 **** ---- 2096,2113 ---- - return CSCOPE_SUCCESS; - } - -+ #if defined(UNIX) && defined(SIGALRM) -+ /* -+ * Used to catch and ignore SIGALRM below. -+ */ -+ /* ARGSUSED */ -+ static RETSIGTYPE -+ sig_handler SIGDEFARG(sigarg) -+ { -+ /* do nothing */ -+ SIGRETURN; -+ } -+ #endif - - /* - * PRIVATE: cs_release_csp -*************** -*** 2108,2116 **** - int i; - int freefnpp; - { -- #if defined(UNIX) -- int pstat; -- #else - /* - * Trying to exit normally (not sure whether it is fit to UNIX cscope - */ ---- 2120,2125 ---- -*************** -*** 2119,2124 **** ---- 2128,2179 ---- - (void)fputs("q\n", csinfo[i].to_fp); - (void)fflush(csinfo[i].to_fp); - } -+ #if defined(UNIX) -+ { -+ int pstat; -+ pid_t pid; -+ -+ # if defined(HAVE_SIGACTION) -+ struct sigaction sa, old; -+ -+ /* Use sigaction() to limit the waiting time to two seconds. */ -+ sa.sa_handler = sig_handler; -+ sa.sa_flags = SA_NODEFER; -+ sigaction(SIGALRM, &sa, &old); -+ alarm(2); /* 2 sec timeout */ -+ -+ /* Block until cscope exits or until timer expires */ -+ pid = waitpid(csinfo[i].pid, &pstat, 0); -+ -+ /* cancel pending alarm if still there and restore signal */ -+ alarm(0); -+ sigaction(SIGALRM, &old, NULL); -+ # else -+ int waited; -+ -+ /* Can't use sigaction(), loop for two seconds. First yield the CPU -+ * to give cscope a chance to exit quickly. */ -+ sleep(0); -+ for (waited = 0; waited < 40; ++waited) -+ { -+ pid = waitpid(csinfo[i].pid, &pstat, WNOHANG); -+ if (pid != 0) -+ break; /* break unless the process is still running */ -+ mch_delay(50, FALSE); /* sleep 50 ms */ -+ } -+ # endif -+ /* -+ * If the cscope process is still running: kill it. -+ * Safety check: If the PID would be zero here, the entire X session -+ * would be killed. -1 and 1 are dangerous as well. -+ */ -+ if (pid < 0 && csinfo[i].pid > 1) -+ { -+ kill(csinfo[i].pid, SIGTERM); -+ (void)waitpid(csinfo[i].pid, &pstat, 0); -+ } -+ } -+ #else /* !UNIX */ - if (csinfo[i].hProc != NULL) - { - /* Give cscope a chance to exit normally */ -*************** -*** 2133,2150 **** - if (csinfo[i].to_fp != NULL) - (void)fclose(csinfo[i].to_fp); - -- /* -- * Safety check: If the PID would be zero here, the entire X session would -- * be killed. -1 and 1 are dangerous as well. -- */ -- #if defined(UNIX) -- if (csinfo[i].pid > 1) -- { -- kill(csinfo[i].pid, SIGTERM); -- (void)waitpid(csinfo[i].pid, &pstat, 0); -- } -- #endif -- - if (freefnpp) - { - vim_free(csinfo[i].fname); ---- 2188,2193 ---- -*** ../vim-7.1.278/src/version.c Wed Mar 12 21:47:31 2008 ---- src/version.c Sat Mar 15 12:38:58 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 279, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -130. You can't get out of your desk even if it's time to eat or time - to go to the bathroom. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.280 b/7.1.280 deleted file mode 100644 index c0993c42..00000000 --- a/7.1.280 +++ /dev/null @@ -1,52 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.280 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.280 (after 7.1.275) -Problem: Mac: build problems when not using multibyte feature. (Nicholas - Stallard) -Solution: Don't define USE_IM_CONTROL when not using multibyte. -Files: src/vim.h - - -*** ../vim-7.1.279/src/vim.h Wed Mar 12 17:25:50 2008 ---- src/vim.h Thu Mar 13 23:39:21 2008 -*************** -*** 463,469 **** - */ - #if defined(FEAT_XIM) \ - || (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) \ -! || defined(FEAT_GUI_MAC) - # define USE_IM_CONTROL - #endif - ---- 466,472 ---- - */ - #if defined(FEAT_XIM) \ - || (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) \ -! || (defined(FEAT_GUI_MAC) && defined(FEAT_MBYTE)) - # define USE_IM_CONTROL - #endif - -*** ../vim-7.1.279/src/version.c Sat Mar 15 12:40:23 2008 ---- src/version.c Sat Mar 15 13:08:40 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 280, - /**/ - --- -Why is it called "Windows"? "Gates" would be more appropriate... - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.281 b/7.1.281 deleted file mode 100644 index 2886273d..00000000 --- a/7.1.281 +++ /dev/null @@ -1,72 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.281 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.281 (after 7.1.279) -Problem: sa.sa_mask is not initialized. Cscope may not exit. -Solution: Use sigemptyset(). Use SIGKILL instead of SIGTERM. (Dominique - Pelle) -Files: src/if_cscope.c - - -*** ../vim-7.1.280/src/if_cscope.c Sat Mar 15 12:40:23 2008 ---- src/if_cscope.c Sun Mar 16 13:05:51 2008 -*************** -*** 2136,2142 **** - # if defined(HAVE_SIGACTION) - struct sigaction sa, old; - -! /* Use sigaction() to limit the waiting time to two seconds. */ - sa.sa_handler = sig_handler; - sa.sa_flags = SA_NODEFER; - sigaction(SIGALRM, &sa, &old); ---- 2136,2143 ---- - # if defined(HAVE_SIGACTION) - struct sigaction sa, old; - -! /* Use sigaction() to limit the waiting time to two seconds. */ -! sigemptyset(&sa.sa_mask); - sa.sa_handler = sig_handler; - sa.sa_flags = SA_NODEFER; - sigaction(SIGALRM, &sa, &old); -*************** -*** 2169,2175 **** - */ - if (pid < 0 && csinfo[i].pid > 1) - { -! kill(csinfo[i].pid, SIGTERM); - (void)waitpid(csinfo[i].pid, &pstat, 0); - } - } ---- 2170,2176 ---- - */ - if (pid < 0 && csinfo[i].pid > 1) - { -! kill(csinfo[i].pid, SIGKILL); - (void)waitpid(csinfo[i].pid, &pstat, 0); - } - } -*** ../vim-7.1.280/src/version.c Sat Mar 15 13:10:57 2008 ---- src/version.c Sun Mar 16 13:08:08 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 281, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -136. You decide to stay in a low-paying job teaching just for the - free Internet access. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.282 b/7.1.282 deleted file mode 100644 index 7bb125cf..00000000 --- a/7.1.282 +++ /dev/null @@ -1,549 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.282 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.282 (extra) -Problem: Win64: Edit with Vim context menu isn't installed correctly. - Compiler warnings and a few other things. -Solution: Add [ and ] to entry of class name. Use UINT_PTR instead of UINT. - And a fixes for the other things. (George V. Reilly) -Files: src/GvimExt/Makefile, src/dosinst.c, src/if_ole.cpp, src/if_ole.h, - src/if_ole.idl, src/INSTALLpc.txt, src/Make_mvc.mak, - src/os_win32.c, - - -*** ../vim-7.1.281/src/GvimExt/Makefile Sat May 5 12:51:46 2007 ---- src/GvimExt/Makefile Tue Jul 10 16:18:18 2007 -*************** -*** 24,30 **** - gvimext.obj: gvimext.h - - .cpp.obj: -! $(cc) $(cflags) -DFEAT_GETTEXT $(cvarsdll) $*.cpp - - gvimext.res: gvimext.rc - $(rc) $(rcflags) $(rcvars) gvimext.rc ---- 24,30 ---- - gvimext.obj: gvimext.h - - .cpp.obj: -! $(cc) $(cflags) -DFEAT_GETTEXT $(cvarsmt) $*.cpp - - gvimext.res: gvimext.rc - $(rc) $(rcflags) $(rcvars) gvimext.rc -*** ../vim-7.1.281/src/dosinst.c Thu May 10 20:54:39 2007 ---- src/dosinst.c Tue Jul 10 16:07:16 2007 -*************** -*** 1365,1371 **** - - printf("Creating \"Edit with Vim\" popup menu entry\n"); - -! fprintf(fd, "HKEY_CLASSES_ROOT\\CLSID\\%s\n", vim_ext_clsid); - fprintf(fd, "@=\"%s\"\n", vim_ext_name); - fprintf(fd, "[HKEY_CLASSES_ROOT\\CLSID\\%s\\InProcServer32]\n", - vim_ext_clsid); ---- 1365,1371 ---- - - printf("Creating \"Edit with Vim\" popup menu entry\n"); - -! fprintf(fd, "[HKEY_CLASSES_ROOT\\CLSID\\%s]\n", vim_ext_clsid); - fprintf(fd, "@=\"%s\"\n", vim_ext_name); - fprintf(fd, "[HKEY_CLASSES_ROOT\\CLSID\\%s\\InProcServer32]\n", - vim_ext_clsid); -*** ../vim-7.1.281/src/if_ole.cpp Wed Aug 16 17:34:09 2006 ---- src/if_ole.cpp Tue Sep 25 16:44:44 2007 -*************** -*** 34,39 **** ---- 34,45 ---- - extern HWND vim_parent_hwnd; - } - -+ #if _MSC_VER < 1300 -+ /* Work around old versions of basetsd.h which wrongly declares -+ * UINT_PTR as unsigned long */ -+ # define UINT_PTR UINT -+ #endif -+ - #include "if_ole.h" // Interface definitions - #include "iid_ole.c" // UUID definitions (compile here) - -*************** -*** 107,113 **** - STDMETHOD(SendKeys)(BSTR keys); - STDMETHOD(Eval)(BSTR expr, BSTR *result); - STDMETHOD(SetForeground)(void); -! STDMETHOD(GetHwnd)(UINT *result); - - private: - // Constructor is private - create using CVim::Create() ---- 113,119 ---- - STDMETHOD(SendKeys)(BSTR keys); - STDMETHOD(Eval)(BSTR expr, BSTR *result); - STDMETHOD(SetForeground)(void); -! STDMETHOD(GetHwnd)(UINT_PTR *result); - - private: - // Constructor is private - create using CVim::Create() -*************** -*** 288,296 **** - } - - STDMETHODIMP -! CVim::GetHwnd(UINT *result) - { -! *result = (UINT) s_hwnd; - return S_OK; - } - ---- 294,302 ---- - } - - STDMETHODIMP -! CVim::GetHwnd(UINT_PTR *result) - { -! *result = (UINT_PTR)s_hwnd; - return S_OK; - } - -*** ../vim-7.1.281/src/if_ole.h Sun Jun 13 17:46:29 2004 ---- src/if_ole.h Tue Jul 10 16:21:18 2007 -*************** -*** 79,85 **** - virtual HRESULT STDMETHODCALLTYPE SetForeground( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHwnd( -! /* [retval][out] */ UINT __RPC_FAR *result) = 0; - - }; - ---- 79,85 ---- - virtual HRESULT STDMETHODCALLTYPE SetForeground( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHwnd( -! /* [retval][out] */ UINT_PTR __RPC_FAR *result) = 0; - - }; - -*************** -*** 143,149 **** - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetHwnd )( - IVim __RPC_FAR * This, -! /* [retval][out] */ UINT __RPC_FAR *result); - - END_INTERFACE - } IVimVtbl; ---- 143,149 ---- - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetHwnd )( - IVim __RPC_FAR * This, -! /* [retval][out] */ UINT_PTR __RPC_FAR *result); - - END_INTERFACE - } IVimVtbl; -*************** -*** 236,242 **** - - HRESULT STDMETHODCALLTYPE IVim_GetHwnd_Proxy( - IVim __RPC_FAR * This, -! /* [retval][out] */ UINT __RPC_FAR *result); - - - void __RPC_STUB IVim_GetHwnd_Stub( ---- 236,242 ---- - - HRESULT STDMETHODCALLTYPE IVim_GetHwnd_Proxy( - IVim __RPC_FAR * This, -! /* [retval][out] */ UINT_PTR __RPC_FAR *result); - - - void __RPC_STUB IVim_GetHwnd_Stub( -*** ../vim-7.1.281/src/if_ole.idl Sun Jun 13 17:22:03 2004 ---- src/if_ole.idl Tue Jul 10 16:21:45 2007 -*************** -*** 20,26 **** - HRESULT SendKeys([in]BSTR keys); - HRESULT Eval([in]BSTR expr, [out, retval]BSTR* result); - HRESULT SetForeground(void); -! HRESULT GetHwnd([out, retval]UINT* result); - }; - - // Component and type library definitions ---- 20,26 ---- - HRESULT SendKeys([in]BSTR keys); - HRESULT Eval([in]BSTR expr, [out, retval]BSTR* result); - HRESULT SetForeground(void); -! HRESULT GetHwnd([out, retval]UINT_PTR* result); - }; - - // Component and type library definitions -*** ../vim-7.1.281/src/INSTALLpc.txt Sun Apr 30 20:29:26 2006 ---- src/INSTALLpc.txt Wed Mar 12 15:01:37 2008 -*************** -*** 82,90 **** - |ms-platform-sdk|, |dotnet-1.1-redist|, |dotnet-1.1-sdk|, - and |windbg-download|. - -! It's easier to download Visual C++ 2005 Express Edition, |msvc-2005-express|. -! The advantage of the VC 2003 Toolkit is that it will be freely available -! long after VC 2005 Express Edition stops being free in November 2006. - - The free Code::Blocks IDE works with the VC2003 Toolkit, as described at - http://wiki.codeblocks.org/index.php?title=Integrating_Microsoft_Visual_Toolkit_2003_with_Code::Blocks_IDE ---- 82,89 ---- - |ms-platform-sdk|, |dotnet-1.1-redist|, |dotnet-1.1-sdk|, - and |windbg-download|. - -! It's easier to download Visual C++ 2008 Express Edition, |msvc-2008-express|, -! which is freely available in perpetuity. - - The free Code::Blocks IDE works with the VC2003 Toolkit, as described at - http://wiki.codeblocks.org/index.php?title=Integrating_Microsoft_Visual_Toolkit_2003_with_Code::Blocks_IDE -*************** -*** 152,157 **** ---- 151,164 ---- - http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/default.aspx - - -+ Visual C++ 2008 Express Edition *msvc-2008-express* -+ ------------------------------- -+ -+ Visual C++ 2008 Express Edition can be downloaded for free from: -+ http://msdn2.microsoft.com/en-us/express/default.aspx -+ This includes the IDE and the debugger. You can build Vim with Make_mvc.mak. -+ -+ - 2. MinGW - ======== - -*** ../vim-7.1.281/src/Make_mvc.mak Wed Oct 3 13:28:40 2007 ---- src/Make_mvc.mak Wed Mar 12 15:09:55 2008 -*************** -*** 1,6 **** - # Makefile for Vim on Win32 (Windows NT/2000/XP/2003 and Windows 95/98/Me) - # and Win64, using the Microsoft Visual C++ compilers. Known to work with -! # VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), and VC8 (VS2005). - # - # To build using other Windows compilers, see INSTALLpc.txt - # ---- 1,7 ---- - # Makefile for Vim on Win32 (Windows NT/2000/XP/2003 and Windows 95/98/Me) - # and Win64, using the Microsoft Visual C++ compilers. Known to work with -! # VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), VC8 (VS2005), -! # and VC9 (VS2008). - # - # To build using other Windows compilers, see INSTALLpc.txt - # -*************** -*** 285,291 **** - # need shell32.lib for ExtractIcon() - # gdi32.lib and comdlg32.lib for printing support - # ole32.lib and uuid.lib are needed for FEAT_SHORTCUT -! CON_LIB = advapi32.lib shell32.lib gdi32.lib comdlg32.lib ole32.lib uuid.lib - !if "$(DELAYLOAD)" == "yes" - CON_LIB = $(CON_LIB) /DELAYLOAD:comdlg32.dll /DELAYLOAD:ole32.dll DelayImp.lib - !endif ---- 286,293 ---- - # need shell32.lib for ExtractIcon() - # gdi32.lib and comdlg32.lib for printing support - # ole32.lib and uuid.lib are needed for FEAT_SHORTCUT -! CON_LIB = oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib \ -! comdlg32.lib ole32.lib uuid.lib /machine:$(CPU) /nodefaultlib - !if "$(DELAYLOAD)" == "yes" - CON_LIB = $(CON_LIB) /DELAYLOAD:comdlg32.dll /DELAYLOAD:ole32.dll DelayImp.lib - !endif -*************** -*** 331,336 **** ---- 333,339 ---- - !endif - !if "$(_NMAKE_VER)" == "6.00.8168.0" - MSVCVER = 6.0 -+ CPU = ix86 - !endif - !if "$(_NMAKE_VER)" == "7.00.9466" - MSVCVER = 7.0 -*************** -*** 344,349 **** ---- 347,355 ---- - !if "$(_NMAKE_VER)" == "8.00.50727.762" - MSVCVER = 8.0 - !endif -+ !if "$(_NMAKE_VER)" == "9.00.20706.01" -+ MSVCVER = 9.0 -+ !endif - !endif - - # Abort bulding VIM if version of VC is unrecognised. -*************** -*** 352,364 **** - !message Cannot determine Visual C version being used. If you are using the - !message Windows SDK then you must have the environment variable MSVCVER set to - !message your version of the VC compiler. If you are not using the Express -! !message version of Visual C you van either set MSVCVER or update this makefile -! !message to handle the new value for _NMAKE_VER. - !error Make aborted. - !endif - - # Convert processor ID to MVC-compatible number -! !if "$(MSVCVER)" != "8.0" - !if "$(CPUNR)" == "i386" - CPUARG = /G3 - !elseif "$(CPUNR)" == "i486" ---- 358,370 ---- - !message Cannot determine Visual C version being used. If you are using the - !message Windows SDK then you must have the environment variable MSVCVER set to - !message your version of the VC compiler. If you are not using the Express -! !message version of Visual C, you can either set MSVCVER or update this makefile -! !message to handle the new value for _NMAKE_VER, "$(_NMAKE_VER)". - !error Make aborted. - !endif - - # Convert processor ID to MVC-compatible number -! !if ("$(MSVCVER)" != "8.0") && ("$(MSVCVER)" != "9.0") - !if "$(CPUNR)" == "i386" - CPUARG = /G3 - !elseif "$(CPUNR)" == "i486" -*************** -*** 373,379 **** - CPUARG = - !endif - !else -! # VC8 only allows specifying SSE architecture - !if "$(CPUNR)" == "pentium4" - CPUARG = /arch:SSE2 - !endif ---- 379,385 ---- - CPUARG = - !endif - !else -! # VC8/9 only allows specifying SSE architecture - !if "$(CPUNR)" == "pentium4" - CPUARG = /arch:SSE2 - !endif -*************** -*** 391,397 **** - !else # MAXSPEED - OPTFLAG = /Ox - !endif -! !if "$(MSVCVER)" == "8.0" - # Use link time code generation if not worried about size - !if "$(OPTIMIZE)" != "SPACE" - OPTFLAG = $(OPTFLAG) /GL ---- 397,403 ---- - !else # MAXSPEED - OPTFLAG = /Ox - !endif -! !if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") - # Use link time code generation if not worried about size - !if "$(OPTIMIZE)" != "SPACE" - OPTFLAG = $(OPTFLAG) /GL -*************** -*** 404,414 **** - LIBC = msvcrt.lib - ! else - LIBC = libcmt.lib -! CFLAGS = $(CFLAGS) /MT - ! endif - !else # DEBUG - VIM = vimd -! ! if "$(CPU)" == "i386" - DEBUGINFO = /ZI - ! endif - CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG /Od ---- 410,420 ---- - LIBC = msvcrt.lib - ! else - LIBC = libcmt.lib -! CFLAGS = $(CFLAGS) /Zl /MT - ! endif - !else # DEBUG - VIM = vimd -! ! if ("$(CPU)" == "i386") || ("$(CPU)" == "ix86") - DEBUGINFO = /ZI - ! endif - CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG /Od -*************** -*** 424,430 **** - LIBC = $(LIBC) msvcrtd.lib - ! else - LIBC = $(LIBC) libcmtd.lib -! CFLAGS = $(CFLAGS) /MTd - ! endif - !endif # DEBUG - ---- 430,436 ---- - LIBC = $(LIBC) msvcrtd.lib - ! else - LIBC = $(LIBC) libcmtd.lib -! CFLAGS = $(CFLAGS) /Zl /MTd - ! endif - !endif # DEBUG - -*************** -*** 534,540 **** - $(OUTDIR)\gui_w32.obj \ - $(OUTDIR)\os_w32exe.obj - GUI_LIB = \ -! oldnames.lib kernel32.lib gdi32.lib version.lib $(IME_LIB) \ - winspool.lib comctl32.lib advapi32.lib shell32.lib \ - /machine:$(CPU) /nodefaultlib - !else ---- 540,546 ---- - $(OUTDIR)\gui_w32.obj \ - $(OUTDIR)\os_w32exe.obj - GUI_LIB = \ -! gdi32.lib version.lib $(IME_LIB) \ - winspool.lib comctl32.lib advapi32.lib shell32.lib \ - /machine:$(CPU) /nodefaultlib - !else -*************** -*** 757,763 **** - - # Report link time code generation progress if used. - !ifdef NODEBUG -! !if "$(MSVCVER)" == "8.0" - !if "$(OPTIMIZE)" != "SPACE" - LINKARGS1 = $(LINKARGS1) /LTCG:STATUS - !endif ---- 763,769 ---- - - # Report link time code generation progress if used. - !ifdef NODEBUG -! !if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") - !if "$(OPTIMIZE)" != "SPACE" - LINKARGS1 = $(LINKARGS1) /LTCG:STATUS - !endif -*** ../vim-7.1.281/src/os_win32.c Tue Nov 20 17:21:28 2007 ---- src/os_win32.c Wed Mar 12 15:24:33 2008 -*************** -*** 2856,2862 **** - windgoto((int)Rows - 1, 0); - g_fForceExit = TRUE; - -! sprintf((char *)IObuff, _("Vim: Caught %s event\n"), - (dwCtrlType == CTRL_CLOSE_EVENT - ? _("close") - : dwCtrlType == CTRL_LOGOFF_EVENT ---- 2856,2862 ---- - windgoto((int)Rows - 1, 0); - g_fForceExit = TRUE; - -! vim_snprintf((char *)IObuff, IOSIZE, _("Vim: Caught %s event\n"), - (dwCtrlType == CTRL_CLOSE_EVENT - ? _("close") - : dwCtrlType == CTRL_LOGOFF_EVENT -*************** -*** 3282,3293 **** - { - /* we use "command" or "cmd" to start the shell; slow but easy */ - char_u *newcmd; -! -! newcmd = lalloc((long_u) ( - #ifdef FEAT_GUI_W32 - STRLEN(vimrun_path) + - #endif -! STRLEN(p_sh) + STRLEN(p_shcf) + STRLEN(cmd) + 10), TRUE); - if (newcmd != NULL) - { - char_u *cmdbase = (*cmd == '"' ? cmd + 1 : cmd); ---- 3282,3294 ---- - { - /* we use "command" or "cmd" to start the shell; slow but easy */ - char_u *newcmd; -! long_u cmdlen = ( - #ifdef FEAT_GUI_W32 - STRLEN(vimrun_path) + - #endif -! STRLEN(p_sh) + STRLEN(p_shcf) + STRLEN(cmd) + 10); -! -! newcmd = lalloc(cmdlen, TRUE); - if (newcmd != NULL) - { - char_u *cmdbase = (*cmd == '"' ? cmd + 1 : cmd); -*************** -*** 3373,3386 **** - if (!s_dont_use_vimrun) - /* Use vimrun to execute the command. It opens a console - * window, which can be closed without killing Vim. */ -! sprintf((char *)newcmd, "%s%s%s %s %s", - vimrun_path, - (msg_silent != 0 || (options & SHELL_DOOUT)) - ? "-s " : "", - p_sh, p_shcf, cmd); - else - #endif -! sprintf((char *)newcmd, "%s %s %s", p_sh, p_shcf, cmd); - x = mch_system((char *)newcmd, options); - } - vim_free(newcmd); ---- 3374,3388 ---- - if (!s_dont_use_vimrun) - /* Use vimrun to execute the command. It opens a console - * window, which can be closed without killing Vim. */ -! vim_snprintf((char *)newcmd, cmdlen, "%s%s%s %s %s", - vimrun_path, - (msg_silent != 0 || (options & SHELL_DOOUT)) - ? "-s " : "", - p_sh, p_shcf, cmd); - else - #endif -! vim_snprintf((char *)newcmd, cmdlen, "%s %s %s", -! p_sh, p_shcf, cmd); - x = mch_system((char *)newcmd, options); - } - vim_free(newcmd); -*************** -*** 4664,4675 **** ---- 4666,4694 ---- - # endif - ) - { -+ # if defined(DEBUG) && _MSC_VER > 1200 -+ /* Work around an annoying assertion in the Microsoft debug CRT -+ * when mode's text/binary setting doesn't match _get_fmode(). */ -+ char newMode = mode[strlen(mode) - 1]; -+ int oldMode = 0; -+ -+ _get_fmode(&oldMode); -+ if (newMode == 't') -+ _set_fmode(_O_TEXT); -+ else if (newMode == 'b') -+ _set_fmode(_O_BINARY); -+ # endif - wn = enc_to_ucs2(name, NULL); - wm = enc_to_ucs2(mode, NULL); - if (wn != NULL && wm != NULL) - f = _wfopen(wn, wm); - vim_free(wn); - vim_free(wm); -+ -+ # if defined(DEBUG) && _MSC_VER > 1200 -+ _set_fmode(oldMode); -+ # endif -+ - if (f != NULL) - return f; - /* Retry with non-wide function (for Windows 98). Can't use -*** ../vim-7.1.281/src/version.c Sun Mar 16 13:09:14 2008 ---- src/version.c Sun Mar 16 14:49:21 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 282, - /**/ - --- -Amazing but true: If all the salmon caught in Canada in one year were laid -end to end across the Sahara Desert, the smell would be absolutely awful. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.283 b/7.1.283 deleted file mode 100644 index 1dfe1446..00000000 --- a/7.1.283 +++ /dev/null @@ -1,263 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.283 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.283 -Problem: Non-extra part for 7.1.282. -Solution: Various changes. -Files: src/ex_docmd.c, src/globals.h, src/if_cscope.c, src/main.c, - src/mark.c, src/netbeans.c, src/popupmnu.c, src/vim.h, - src/window.c - - -*** ../vim-7.1.282/src/ex_docmd.c Mon Mar 10 21:33:52 2008 ---- src/ex_docmd.c Wed Mar 12 14:53:18 2008 -*************** -*** 3009,3015 **** - break; - if (!isalpha(p[j]) && j >= cmdmods[i].minlen - && (p == cmd || cmdmods[i].has_count)) -! return j + (p - cmd); - } - return 0; - } ---- 3009,3015 ---- - break; - if (!isalpha(p[j]) && j >= cmdmods[i].minlen - && (p == cmd || cmdmods[i].has_count)) -! return j + (int)(p - cmd); - } - return 0; - } -*** ../vim-7.1.282/src/globals.h Tue Jan 1 14:16:42 2008 ---- src/globals.h Wed Mar 12 14:54:00 2008 -*************** -*** 1263,1269 **** - * The value of the --windowid argument. - * For embedding gvim inside another application. - */ -! EXTERN int win_socket_id INIT(= 0); - #endif - - #if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL) ---- 1263,1269 ---- - * The value of the --windowid argument. - * For embedding gvim inside another application. - */ -! EXTERN long_u win_socket_id INIT(= 0); - #endif - - #if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL) -*** ../vim-7.1.282/src/if_cscope.c Sun Mar 16 13:09:14 2008 ---- src/if_cscope.c Sun Mar 16 13:05:51 2008 -*************** -*** 1400,1406 **** - return NULL; - - /* Store length of eap->arg before it gets modified by strtok(). */ -! eap_arg_len = STRLEN(eap->arg); - - if ((stok = strtok((char *)(eap->arg), (const char *)" ")) == NULL) - return NULL; ---- 1400,1406 ---- - return NULL; - - /* Store length of eap->arg before it gets modified by strtok(). */ -! eap_arg_len = (int)STRLEN(eap->arg); - - if ((stok = strtok((char *)(eap->arg), (const char *)" ")) == NULL) - return NULL; -*** ../vim-7.1.282/src/main.c Sun Jan 13 16:17:02 2008 ---- src/main.c Wed Mar 12 15:04:30 2008 -*************** -*** 1552,1566 **** - else if (STRICMP(argv[i], "--socketid") == 0) - # endif - { -! unsigned int id; -! int count; - - if (i == argc - 1) - mainerr_arg_missing((char_u *)argv[i]); - if (STRNICMP(argv[i+1], "0x", 2) == 0) -! count = sscanf(&(argv[i + 1][2]), "%x", &id); - else -! count = sscanf(argv[i+1], "%u", &id); - if (count != 1) - mainerr(ME_INVALID_ARG, (char_u *)argv[i]); - else ---- 1552,1566 ---- - else if (STRICMP(argv[i], "--socketid") == 0) - # endif - { -! long_u id; -! int count; - - if (i == argc - 1) - mainerr_arg_missing((char_u *)argv[i]); - if (STRNICMP(argv[i+1], "0x", 2) == 0) -! count = sscanf(&(argv[i + 1][2]), SCANF_HEX_LONG_U, &id); - else -! count = sscanf(argv[i + 1], SCANF_DECIMAL_LONG_U, &id); - if (count != 1) - mainerr(ME_INVALID_ARG, (char_u *)argv[i]); - else -*** ../vim-7.1.282/src/mark.c Wed Feb 13 12:41:30 2008 ---- src/mark.c Wed Mar 12 15:10:14 2008 -*************** -*** 522,528 **** - int len; - - expand_env((char_u *)"~/", NameBuff, MAXPATHL); -! len = STRLEN(NameBuff); - vim_strncpy(NameBuff + len, fm->fname + 2, MAXPATHL - len - 1); - } - else ---- 522,528 ---- - int len; - - expand_env((char_u *)"~/", NameBuff, MAXPATHL); -! len = (int)STRLEN(NameBuff); - vim_strncpy(NameBuff + len, fm->fname + 2, MAXPATHL - len - 1); - } - else -*** ../vim-7.1.282/src/netbeans.c Fri Jan 18 11:40:02 2008 ---- src/netbeans.c Wed Mar 12 15:11:42 2008 -*************** -*** 1216,1222 **** - int lastbyte = last; - - oldtext = ml_get(lnum); -! oldlen = STRLEN(oldtext); - if (first >= (colnr_T)oldlen || oldlen == 0) /* just in case */ - return; - if (lastbyte >= oldlen) ---- 1216,1222 ---- - int lastbyte = last; - - oldtext = ml_get(lnum); -! oldlen = (int)STRLEN(oldtext); - if (first >= (colnr_T)oldlen || oldlen == 0) /* just in case */ - return; - if (lastbyte >= oldlen) -*************** -*** 1241,1248 **** - int len_first, len_other; - char_u *p; - -! len_first = STRLEN(ml_get(first)); -! len_other = STRLEN(ml_get(other)); - p = alloc((unsigned)(len_first + len_other + 1)); - if (p != NULL) - { ---- 1241,1248 ---- - int len_first, len_other; - char_u *p; - -! len_first = (int)STRLEN(ml_get(first)); -! len_other = (int)STRLEN(ml_get(other)); - p = alloc((unsigned)(len_first + len_other + 1)); - if (p != NULL) - { -*** ../vim-7.1.282/src/popupmnu.c Wed Aug 8 22:48:16 2007 ---- src/popupmnu.c Wed Mar 12 15:17:21 2008 -*************** -*** 337,343 **** - - if (rt != NULL) - { -! len = STRLEN(rt); - if (len > pum_width) - { - for (j = pum_width; j < len; ++j) ---- 337,343 ---- - - if (rt != NULL) - { -! len = (int)STRLEN(rt); - if (len > pum_width) - { - for (j = pum_width; j < len; ++j) -*** ../vim-7.1.282/src/vim.h Sat Mar 15 13:10:57 2008 ---- src/vim.h Thu Mar 13 23:39:21 2008 -*************** -*** 355,370 **** - * On Win64 longs are 32 bit and pointers 64 bit. - * For printf() and scanf() we need to take care of long_u specifically. */ - #ifdef _WIN64 -! typedef unsigned __int64 long_u; -! typedef __int64 long_i; -! # define SCANF_HEX_LONG_U "%Ix" -! # define PRINTF_HEX_LONG_U "0x%Ix" -! #else -! typedef unsigned long long_u; -! typedef long long_i; -! # define SCANF_HEX_LONG_U "%lx" -! # define PRINTF_HEX_LONG_U "0x%lx" - #endif - - /* - * The characters and attributes cached for the screen. ---- 355,373 ---- - * On Win64 longs are 32 bit and pointers 64 bit. - * For printf() and scanf() we need to take care of long_u specifically. */ - #ifdef _WIN64 -! typedef unsigned __int64 long_u; -! typedef __int64 long_i; -! # define SCANF_HEX_LONG_U "%Ix" -! # define SCANF_DECIMAL_LONG_U "%Iu" -! # define PRINTF_HEX_LONG_U "0x%Ix" -! #else -! typedef unsigned long long_u; -! typedef long long_i; -! # define SCANF_HEX_LONG_U "%lx" -! # define SCANF_DECIMAL_LONG_U "%lu" -! # define PRINTF_HEX_LONG_U "0x%lx" - #endif -+ #define PRINTF_DECIMAL_LONG_U SCANF_DECIMAL_LONG_U - - /* - * The characters and attributes cached for the screen. -*** ../vim-7.1.282/src/window.c Sat Sep 29 14:15:00 2007 ---- src/window.c Wed Mar 12 15:22:10 2008 -*************** -*** 6303,6309 **** - cur = cur->next; - } - } -! if ((hlg_id = syn_namen2id(grp, STRLEN(grp))) == 0) - { - EMSG2(_(e_nogroup), grp); - return -1; ---- 6303,6309 ---- - cur = cur->next; - } - } -! if ((hlg_id = syn_namen2id(grp, (int)STRLEN(grp))) == 0) - { - EMSG2(_(e_nogroup), grp); - return -1; -*** ../vim-7.1.282/src/version.c Sun Mar 16 14:52:53 2008 ---- src/version.c Sun Mar 16 16:00:17 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 283, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -139. You down your lunch in five minutes, at your desk, so you can - spend the rest of the hour surfing the Net. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.284 b/7.1.284 deleted file mode 100644 index 8c46689c..00000000 --- a/7.1.284 +++ /dev/null @@ -1,61 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.284 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.284 -Problem: Compiler warnings for functions without prototype. -Solution: Add the function prototypes. (Patrick Texier) -Files: src/eval.c, src/quickfix.c - - -*** ../vim-7.1.283/src/eval.c Wed Feb 20 20:09:44 2008 ---- src/eval.c Sat Mar 15 12:49:14 2008 -*************** -*** 14662,14667 **** ---- 14662,14669 ---- - appended_lines_mark(lcount, added); - } - -+ static void set_qf_ll_list __ARGS((win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *rettv)); -+ - /* - * Used by "setqflist()" and "setloclist()" functions - */ -*** ../vim-7.1.283/src/quickfix.c Sat Jan 19 15:55:51 2008 ---- src/quickfix.c Sat Mar 15 12:51:05 2008 -*************** -*** 106,112 **** ---- 106,114 ---- - - static int qf_init_ext __ARGS((qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast)); - static void qf_new_list __ARGS((qf_info_T *qi)); -+ static void ll_free_all __ARGS((qf_info_T **pqi)); - static int qf_add_entry __ARGS((qf_info_T *qi, qfline_T **prevp, char_u *dir, char_u *fname, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid)); -+ static qf_info_T *ll_new_list __ARGS((void)); - static void qf_msg __ARGS((qf_info_T *qi)); - static void qf_free __ARGS((qf_info_T *qi, int idx)); - static char_u *qf_types __ARGS((int, int)); -*** ../vim-7.1.283/src/version.c Sun Mar 16 16:02:47 2008 ---- src/version.c Thu Mar 20 13:21:42 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 284, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -160. You get in the elevator and double-click the button for the floor - you want. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.285 b/7.1.285 deleted file mode 100644 index f4be10ff..00000000 --- a/7.1.285 +++ /dev/null @@ -1,209 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.285 (extra) -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.285 (extra) -Problem: Mac: dialog hotkeys don't work. -Solution: Add hotkey support. (Dan Sandler) -Files: src/gui_mac.c - - -*** ../vim-7.1.284/src/gui_mac.c Wed Mar 12 21:47:31 2008 ---- src/gui_mac.c Sun Mar 16 15:25:13 2008 -*************** -*** 153,158 **** ---- 153,161 ---- - /* Keeping track of which scrollbar is being dragged */ - static ControlHandle dragged_sb = NULL; - -+ /* Vector of char_u --> control index for hotkeys in dialogs */ -+ static short *gDialogHotKeys; -+ - static struct - { - FMFontFamily family; -*************** -*** 5519,5524 **** ---- 5522,5570 ---- - SetDialogItemText(itemHandle, itemName); - } - -+ -+ /* ModalDialog() handler for message dialogs that have hotkey accelerators. -+ * Expects a mapping of hotkey char to control index in gDialogHotKeys; -+ * setting gDialogHotKeys to NULL disables any hotkey handling. -+ */ -+ static pascal Boolean -+ DialogHotkeyFilterProc ( -+ DialogRef theDialog, -+ EventRecord *event, -+ DialogItemIndex *itemHit) -+ { -+ char_u keyHit; -+ -+ if (event->what == keyDown || event->what == autoKey) -+ { -+ keyHit = (event->message & charCodeMask); -+ -+ if (gDialogHotKeys && gDialogHotKeys[keyHit]) -+ { -+ #ifdef DEBUG_MAC_DIALOG_HOTKEYS -+ printf("user pressed hotkey '%c' --> item %d\n", keyHit, gDialogHotKeys[keyHit]); -+ #endif -+ *itemHit = gDialogHotKeys[keyHit]; -+ -+ /* When handing off to StdFilterProc, pretend that the user -+ * clicked the control manually. Note that this is also supposed -+ * to cause the button to hilite briefly (to give some user -+ * feedback), but this seems not to actually work (or it's too -+ * fast to be seen). -+ */ -+ event->what = kEventControlSimulateHit; -+ -+ return true; /* we took care of it */ -+ } -+ -+ /* Defer to the OS's standard behavior for this event. -+ * This ensures that Enter will still activate the default button. */ -+ return StdFilterProc(theDialog, event, itemHit); -+ } -+ return false; /* Let ModalDialog deal with it */ -+ } -+ -+ - /* TODO: There have been some crashes with dialogs, check your inbox - * (Jussi) - */ -*************** -*** 5544,5549 **** ---- 5590,5597 ---- - GrafPtr oldPort; - short itemHit; - char_u *buttonChar; -+ short hotKeys[256]; /* map of hotkey -> control ID */ -+ char_u aHotKey; - Rect box; - short button; - short lastButton; -*************** -*** 5571,5576 **** ---- 5619,5626 ---- - - WindowRef theWindow; - -+ ModalFilterUPP dialogUPP; -+ - /* Check 'v' flag in 'guioptions': vertical button placement. */ - vertical = (vim_strchr(p_go, GO_VERTICAL) != NULL); - -*************** -*** 5610,5615 **** ---- 5660,5668 ---- - buttonChar = buttons; - button = 0; - -+ /* initialize the hotkey mapping */ -+ memset(hotKeys, 0, sizeof(hotKeys)); -+ - for (;*buttonChar != 0;) - { - /* Get the name of the button */ -*************** -*** 5619,5625 **** ---- 5672,5689 ---- - { - if (*buttonChar != DLG_HOTKEY_CHAR) - name[++len] = *buttonChar; -+ else -+ { -+ aHotKey = (char_u)*(buttonChar+1); -+ if (aHotKey >= 'A' && aHotKey <= 'Z') -+ aHotKey = (char_u)((int)aHotKey + (int)'a' - (int)'A'); -+ hotKeys[aHotKey] = button; -+ #ifdef DEBUG_MAC_DIALOG_HOTKEYS -+ printf("### hotKey for button %d is '%c'\n", button, aHotKey); -+ #endif -+ } - } -+ - if (*buttonChar != 0) - buttonChar++; - name[0] = len; -*************** -*** 5688,5694 **** ---- 5752,5764 ---- - (void) C2PascalString(textfield, &name); - SetDialogItemText(itemHandle, name); - inputItm.width = StringWidth(name); -+ -+ /* Hotkeys don't make sense if there's a text field */ -+ gDialogHotKeys = NULL; - } -+ else -+ /* Install hotkey table */ -+ gDialogHotKeys = (short *)&hotKeys; - - /* Set the and button. */ - SetDialogDefaultItem(theDialog, dfltbutton); -*************** -*** 5777,5786 **** - dialog_busy = TRUE; - #endif - - /* Hang until one of the button is hit */ - do - { -! ModalDialog(nil, &itemHit); - } while ((itemHit < 1) || (itemHit > lastButton)); - - #ifdef USE_CARBONKEYHANDLER ---- 5847,5859 ---- - dialog_busy = TRUE; - #endif - -+ /* Prepare the shortcut-handling filterProc for handing to the dialog */ -+ dialogUPP = NewModalFilterUPP(DialogHotkeyFilterProc); -+ - /* Hang until one of the button is hit */ - do - { -! ModalDialog(dialogUPP, &itemHit); - } while ((itemHit < 1) || (itemHit > lastButton)); - - #ifdef USE_CARBONKEYHANDLER -*************** -*** 5803,5808 **** ---- 5876,5884 ---- - /* Restore the original graphical port */ - SetPort(oldPort); - -+ /* Free the modal filterProc */ -+ DisposeRoutineDescriptor(dialogUPP); -+ - /* Get ride of th edialog (free memory) */ - DisposeDialog(theDialog); - -*** ../vim-7.1.284/src/version.c Thu Mar 20 13:22:47 2008 ---- src/version.c Thu Mar 20 14:38:06 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 285, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -163. You go outside for the fresh air (at -30 degrees) but open the - window first to hear new mail arrive. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.286 b/7.1.286 deleted file mode 100644 index e38bae21..00000000 --- a/7.1.286 +++ /dev/null @@ -1,66 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.286 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.286 (after 7.1.103) -Problem: "w" at the end of the buffer moves the cursor past the end of the - line. (Markus Heidelberg) -Solution: Move the cursor back from the NUL when it was moved forward. -Files: src/normal.c - - -*** ../vim-7.1.285/src/normal.c Sat Jan 19 15:55:51 2008 ---- src/normal.c Wed Mar 19 20:33:44 2008 -*************** -*** 8345,8350 **** ---- 8345,8351 ---- - int n; - int word_end; - int flag = FALSE; -+ pos_T startpos = curwin->w_cursor; - - /* - * Set inclusive for the "E" and "e" command. -*************** -*** 8405,8412 **** - else - n = fwd_word(cap->count1, cap->arg, cap->oap->op_type != OP_NOP); - -! /* Don't leave the cursor on the NUL past the end of line. */ -! if (n != FAIL) - adjust_cursor(cap->oap); - - if (n == FAIL && cap->oap->op_type == OP_NOP) ---- 8406,8414 ---- - else - n = fwd_word(cap->count1, cap->arg, cap->oap->op_type != OP_NOP); - -! /* Don't leave the cursor on the NUL past the end of line. Unless we -! * didn't move it forward. */ -! if (lt(startpos, curwin->w_cursor)) - adjust_cursor(cap->oap); - - if (n == FAIL && cap->oap->op_type == OP_NOP) -*** ../vim-7.1.285/src/version.c Thu Mar 20 14:38:58 2008 ---- src/version.c Tue Apr 1 12:04:54 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 286, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -200. You really believe in the concept of a "paperless" office. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.287 b/7.1.287 deleted file mode 100644 index 3501acb9..00000000 --- a/7.1.287 +++ /dev/null @@ -1,62 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.287 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.287 -Problem: Crash when reversing a list after using it. (Andy Wokula) -Solution: Update the pointer to the last used element. (Dominique Pelle) -Files: src/eval.c - - -*** ../vim-7.1.286/src/eval.c Thu Mar 20 13:22:47 2008 ---- src/eval.c Tue Apr 1 12:36:41 2008 -*************** -*** 13954,13959 **** ---- 13954,13960 ---- - rettv->vval.v_list = l; - rettv->v_type = VAR_LIST; - ++l->lv_refcount; -+ l->lv_idx = l->lv_len - l->lv_idx - 1; - } - } - -*************** -*** 15202,15208 **** - if (!item_compare_func_err) - { - /* Clear the List and append the items in the sorted order. */ -! l->lv_first = l->lv_last = NULL; - l->lv_len = 0; - for (i = 0; i < len; ++i) - list_append(l, ptrs[i]); ---- 15203,15209 ---- - if (!item_compare_func_err) - { - /* Clear the List and append the items in the sorted order. */ -! l->lv_first = l->lv_last = l->lv_idx_item = NULL; - l->lv_len = 0; - for (i = 0; i < len; ++i) - list_append(l, ptrs[i]); -*** ../vim-7.1.286/src/version.c Tue Apr 1 12:05:49 2008 ---- src/version.c Tue Apr 1 13:09:10 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 287, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -203. You're an active member of more than 20 newsgroups. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.288 b/7.1.288 deleted file mode 100644 index 63467f26..00000000 --- a/7.1.288 +++ /dev/null @@ -1,117 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.288 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.288 (after 7.1.281) -Problem: Cscope still leaves behind temp files when using gvim. -Solution: When getting the ECHILD error loop for a while until cscope exits. - (Dominique Pelle) -Files: if_cscope.c - - -*** ../vim-7.1.287/src/if_cscope.c Sun Mar 16 16:02:47 2008 ---- src/if_cscope.c Tue Mar 25 21:34:23 2008 -*************** -*** 2130,2135 **** ---- 2130,2136 ---- - } - #if defined(UNIX) - { -+ int waitpid_errno; - int pstat; - pid_t pid; - -*************** -*** 2145,2150 **** ---- 2146,2152 ---- - - /* Block until cscope exits or until timer expires */ - pid = waitpid(csinfo[i].pid, &pstat, 0); -+ waitpid_errno = errno; - - /* cancel pending alarm if still there and restore signal */ - alarm(0); -*************** -*** 2158,2163 **** ---- 2160,2166 ---- - for (waited = 0; waited < 40; ++waited) - { - pid = waitpid(csinfo[i].pid, &pstat, WNOHANG); -+ waitpid_errno = errno; - if (pid != 0) - break; /* break unless the process is still running */ - mch_delay(50, FALSE); /* sleep 50 ms */ -*************** -*** 2170,2177 **** - */ - if (pid < 0 && csinfo[i].pid > 1) - { -! kill(csinfo[i].pid, SIGKILL); -! (void)waitpid(csinfo[i].pid, &pstat, 0); - } - } - #else /* !UNIX */ ---- 2173,2212 ---- - */ - if (pid < 0 && csinfo[i].pid > 1) - { -! # ifdef ECHILD -! int alive = TRUE; -! -! if (waitpid_errno == ECHILD) -! { -! /* -! * When using 'vim -g', vim is forked and cscope process is -! * no longer a child process but a sibling. So waitpid() -! * fails with errno being ECHILD (No child processes). -! * Don't send SIGKILL to cscope immediately but wait -! * (polling) for it to exit normally as result of sending -! * the "q" command, hence giving it a chance to clean up -! * its temporary files. -! */ -! int waited; -! -! sleep(0); -! for (waited = 0; waited < 40; ++waited) -! { -! /* Check whether cscope process is still alive */ -! if (kill(csinfo[i].pid, 0) != 0) -! { -! alive = FALSE; /* cscope process no longer exists */ -! break; -! } -! mch_delay(50, FALSE); /* sleep 50ms */ -! } -! } -! if (alive) -! # endif -! { -! kill(csinfo[i].pid, SIGKILL); -! (void)waitpid(csinfo[i].pid, &pstat, 0); -! } - } - } - #else /* !UNIX */ -*** ../vim-7.1.287/src/version.c Tue Apr 1 13:10:45 2008 ---- src/version.c Tue Apr 1 14:28:42 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 288, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -204. You're being audited because you mailed your tax return to the IRC. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.289 b/7.1.289 deleted file mode 100644 index 4de2caac..00000000 --- a/7.1.289 +++ /dev/null @@ -1,74 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.289 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.289 -Problem: When EXITFREE is defined and 'acd' is set freed memory is used. - (Dominique Pelle) -Solution: Reset p_acd before freeing all buffers. -Files: src/misc2.c - - -*** ../vim-7.1.288/src/misc2.c Wed Feb 20 12:22:59 2008 ---- src/misc2.c Wed Mar 26 21:02:57 2008 -*************** -*** 751,757 **** - #endif - - /* -! * Note: if unsinged is 16 bits we can only allocate up to 64K with alloc(). - * Use lalloc for larger blocks. - */ - char_u * ---- 752,758 ---- - #endif - - /* -! * Note: if unsigned is 16 bits we can only allocate up to 64K with alloc(). - * Use lalloc for larger blocks. - */ - char_u * -*************** -*** 1082,1088 **** - win_free_all(); - #endif - -! /* Free all buffers. */ - for (buf = firstbuf; buf != NULL; ) - { - nextbuf = buf->b_next; ---- 1083,1093 ---- - win_free_all(); - #endif - -! /* Free all buffers. Reset 'autochdir' to avoid accessing things that -! * were freed already. */ -! #ifdef FEAT_AUTOCHDIR -! p_acd = FALSE; -! #endif - for (buf = firstbuf; buf != NULL; ) - { - nextbuf = buf->b_next; -*** ../vim-7.1.288/src/version.c Tue Apr 1 14:30:18 2008 ---- src/version.c Tue Apr 1 14:51:06 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 289, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -207. You're given one phone call in prison and you ask them for a laptop. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.290 b/7.1.290 deleted file mode 100644 index 2392003b..00000000 --- a/7.1.290 +++ /dev/null @@ -1,77 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.290 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.290 -Problem: Reading bytes that were not written when spell checking and a line - has a very large indent. -Solution: Don't copy the start of the next line when it only contains - spaces. (Dominique Pelle) -Files: src/spell.c - - -*** ../vim-7.1.289/src/spell.c Sat Jan 19 15:55:51 2008 ---- src/spell.c Sat Mar 29 13:00:28 2008 -*************** -*** 2268,2273 **** ---- 2269,2276 ---- - /* - * For spell checking: concatenate the start of the following line "line" into - * "buf", blanking-out special characters. Copy less then "maxlen" bytes. -+ * Keep the blanks at the start of the next line, this is used in win_line() -+ * to skip those bytes if the word was OK. - */ - void - spell_cat_line(buf, line, maxlen) -*************** -*** 2284,2295 **** - - if (*p != NUL) - { -! *buf = ' '; -! vim_strncpy(buf + 1, line, maxlen - 2); -! n = (int)(p - line); -! if (n >= maxlen) -! n = maxlen - 1; -! vim_memset(buf + 1, ' ', n); - } - } - ---- 2287,2300 ---- - - if (*p != NUL) - { -! /* Only worth concatenating if there is something else than spaces to -! * concatenate. */ -! n = (int)(p - line) + 1; -! if (n < maxlen - 1) -! { -! vim_memset(buf, ' ', n); -! vim_strncpy(buf + n, p, maxlen - 1 - n); -! } - } - } - -*** ../vim-7.1.289/src/version.c Tue Apr 1 14:53:02 2008 ---- src/version.c Tue Apr 1 17:05:55 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 290, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -209. Your house stinks because you haven't cleaned it in a week. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.291 b/7.1.291 deleted file mode 100644 index d7b72a00..00000000 --- a/7.1.291 +++ /dev/null @@ -1,70 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.291 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.291 (after 7.1.288) -Problem: Compiler warning. -Solution: Change 50 to 50L. -Files: src/if_cscope.c - - -*** ../vim-7.1.290/src/if_cscope.c Tue Apr 1 14:30:18 2008 ---- src/if_cscope.c Tue Apr 1 20:56:02 2008 -*************** -*** 2163,2169 **** - waitpid_errno = errno; - if (pid != 0) - break; /* break unless the process is still running */ -! mch_delay(50, FALSE); /* sleep 50 ms */ - } - # endif - /* ---- 2163,2169 ---- - waitpid_errno = errno; - if (pid != 0) - break; /* break unless the process is still running */ -! mch_delay(50L, FALSE); /* sleep 50 ms */ - } - # endif - /* -*************** -*** 2198,2204 **** - alive = FALSE; /* cscope process no longer exists */ - break; - } -! mch_delay(50, FALSE); /* sleep 50ms */ - } - } - if (alive) ---- 2198,2204 ---- - alive = FALSE; /* cscope process no longer exists */ - break; - } -! mch_delay(50L, FALSE); /* sleep 50ms */ - } - } - if (alive) -*** ../vim-7.1.290/src/version.c Tue Apr 1 17:13:54 2008 ---- src/version.c Tue Apr 1 20:58:11 2008 -*************** -*** 668,669 **** ---- 668,671 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 291, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -210. When you get a divorce, you don't care about who gets the children, - but discuss endlessly who can use the email address. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.292 b/7.1.292 deleted file mode 100644 index 2ebecfcc..00000000 --- a/7.1.292 +++ /dev/null @@ -1,251 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.292 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.292 -Problem: When using a pattern with "\@<=" the submatches can be wrong. - (Brett Stahlman) -Solution: Save the submatches when attempting a look-behind match. -Files: src/regexp.c - - -*** ../vim-7.1.291/src/regexp.c Sat Jan 19 15:55:51 2008 ---- src/regexp.c Tue Apr 1 18:15:47 2008 -*************** -*** 3039,3044 **** ---- 3039,3053 ---- - } se_u; - } save_se_T; - -+ /* used for BEHIND and NOBEHIND matching */ -+ typedef struct regbehind_S -+ { -+ regsave_T save_after; -+ regsave_T save_behind; -+ save_se_T save_start[NSUBEXP]; -+ save_se_T save_end[NSUBEXP]; -+ } regbehind_T; -+ - static char_u *reg_getline __ARGS((linenr_T lnum)); - static long vim_regexec_both __ARGS((char_u *line, colnr_T col, proftime_T *tm)); - static long regtry __ARGS((regprog_T *prog, colnr_T col)); -*************** -*** 3046,3051 **** ---- 3055,3062 ---- - #ifdef FEAT_SYN_HL - static void cleanup_zsubexpr __ARGS((void)); - #endif -+ static void save_subexpr __ARGS((regbehind_T *bp)); -+ static void restore_subexpr __ARGS((regbehind_T *bp)); - static void reg_nextline __ARGS((void)); - static void reg_save __ARGS((regsave_T *save, garray_T *gap)); - static void reg_restore __ARGS((regsave_T *save, garray_T *gap)); -*************** -*** 3166,3184 **** - save_se_T sesave; - regsave_T regsave; - } rs_un; /* room for saving reginput */ -! short rs_no; /* submatch nr */ - } regitem_T; - - static regitem_T *regstack_push __ARGS((regstate_T state, char_u *scan)); - static void regstack_pop __ARGS((char_u **scan)); - -- /* used for BEHIND and NOBEHIND matching */ -- typedef struct regbehind_S -- { -- regsave_T save_after; -- regsave_T save_behind; -- } regbehind_T; -- - /* used for STAR, PLUS and BRACE_SIMPLE matching */ - typedef struct regstar_S - { ---- 3177,3188 ---- - save_se_T sesave; - regsave_T regsave; - } rs_un; /* room for saving reginput */ -! short rs_no; /* submatch nr or BEHIND/NOBEHIND */ - } regitem_T; - - static regitem_T *regstack_push __ARGS((regstate_T state, char_u *scan)); - static void regstack_pop __ARGS((char_u **scan)); - - /* used for STAR, PLUS and BRACE_SIMPLE matching */ - typedef struct regstar_S - { -*************** -*** 4888,4893 **** ---- 4892,4901 ---- - status = RA_FAIL; - else - { -+ /* Need to save the subexpr to be able to restore them -+ * when there is a match but we don't use it. */ -+ save_subexpr(((regbehind_T *)rp) - 1); -+ - rp->rs_no = op; - reg_save(&rp->rs_un.regsave, &backpos); - /* First try if what follows matches. If it does then we -*************** -*** 5118,5132 **** - reg_restore(&(((regbehind_T *)rp) - 1)->save_after, - &backpos); - else -! /* But we didn't want a match. */ - status = RA_NOMATCH; - regstack_pop(&scan); - regstack.ga_len -= sizeof(regbehind_T); - } - else - { -! /* No match: Go back one character. May go to previous -! * line once. */ - no = OK; - if (REG_MULTI) - { ---- 5126,5145 ---- - reg_restore(&(((regbehind_T *)rp) - 1)->save_after, - &backpos); - else -! { -! /* But we didn't want a match. Need to restore the -! * subexpr, because what follows matched, so they have -! * been set. */ - status = RA_NOMATCH; -+ restore_subexpr(((regbehind_T *)rp) - 1); -+ } - regstack_pop(&scan); - regstack.ga_len -= sizeof(regbehind_T); - } - else - { -! /* No match or a match that doesn't end where we want it: Go -! * back one character. May go to previous line once. */ - no = OK; - if (REG_MULTI) - { -*************** -*** 5160,5165 **** ---- 5173,5185 ---- - /* Advanced, prepare for finding match again. */ - reg_restore(&rp->rs_un.regsave, &backpos); - scan = OPERAND(rp->rs_scan); -+ if (status == RA_MATCH) -+ { -+ /* We did match, so subexpr may have been changed, -+ * need to restore them for the next try. */ -+ status = RA_NOMATCH; -+ restore_subexpr(((regbehind_T *)rp) - 1); -+ } - } - else - { -*************** -*** 5172,5178 **** - status = RA_MATCH; - } - else -! status = RA_NOMATCH; - regstack_pop(&scan); - regstack.ga_len -= sizeof(regbehind_T); - } ---- 5192,5207 ---- - status = RA_MATCH; - } - else -! { -! /* We do want a proper match. Need to restore the -! * subexpr if we had a match, because they may have -! * been set. */ -! if (status == RA_MATCH) -! { -! status = RA_NOMATCH; -! restore_subexpr(((regbehind_T *)rp) - 1); -! } -! } - regstack_pop(&scan); - regstack.ga_len -= sizeof(regbehind_T); - } -*************** -*** 5820,5825 **** ---- 5849,5903 ---- - #endif - - /* -+ * Save the current subexpr to "bp", so that they can be restored -+ * later by restore_subexpr(). -+ */ -+ static void -+ save_subexpr(bp) -+ regbehind_T *bp; -+ { -+ int i; -+ -+ for (i = 0; i < NSUBEXP; ++i) -+ { -+ if (REG_MULTI) -+ { -+ bp->save_start[i].se_u.pos = reg_startpos[i]; -+ bp->save_end[i].se_u.pos = reg_endpos[i]; -+ } -+ else -+ { -+ bp->save_start[i].se_u.ptr = reg_startp[i]; -+ bp->save_end[i].se_u.ptr = reg_endp[i]; -+ } -+ } -+ } -+ -+ /* -+ * Restore the subexpr from "bp". -+ */ -+ static void -+ restore_subexpr(bp) -+ regbehind_T *bp; -+ { -+ int i; -+ -+ for (i = 0; i < NSUBEXP; ++i) -+ { -+ if (REG_MULTI) -+ { -+ reg_startpos[i] = bp->save_start[i].se_u.pos; -+ reg_endpos[i] = bp->save_end[i].se_u.pos; -+ } -+ else -+ { -+ reg_startp[i] = bp->save_start[i].se_u.ptr; -+ reg_endp[i] = bp->save_end[i].se_u.ptr; -+ } -+ } -+ } -+ -+ /* - * Advance reglnum, regline and reginput to the next line. - */ - static void -*** ../vim-7.1.291/src/version.c Tue Apr 1 20:58:23 2008 ---- src/version.c Wed Apr 9 12:12:33 2008 -*************** -*** 668,669 **** ---- 673,676 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 292, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -259. When you enter your name in the AltaVista search engine, the top ten - matches do indeed refer to you. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.293 b/7.1.293 deleted file mode 100644 index df4499c5..00000000 --- a/7.1.293 +++ /dev/null @@ -1,118 +0,0 @@ -To: vim-dev@vim.org -Subject: Patch 7.1.293 -Fcc: outbox -From: Bram Moolenaar -Mime-Version: 1.0 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: 8bit ------------- - -Patch 7.1.293 -Problem: Spell checking considers super- and subscript characters as word - characters. -Solution: Recognize the Unicode super and subscript characters. -Files: src/spell.c - - -*** ../vim-7.1.292/src/spell.c Tue Apr 1 17:13:54 2008 ---- src/spell.c Wed Apr 9 15:47:06 2008 -*************** -*** 753,758 **** ---- 753,759 ---- - static int spell_iswordp __ARGS((char_u *p, buf_T *buf)); - static int spell_iswordp_nmw __ARGS((char_u *p)); - #ifdef FEAT_MBYTE -+ static int spell_mb_isword_class __ARGS((int cl)); - static int spell_iswordp_w __ARGS((int *p, buf_T *buf)); - #endif - static int write_spell_prefcond __ARGS((FILE *fd, garray_T *gap)); -*************** -*** 9789,9795 **** - - c = mb_ptr2char(s); - if (c > 255) -! return mb_get_class(s) >= 2; - return spelltab.st_isw[c]; - } - #endif ---- 9790,9796 ---- - - c = mb_ptr2char(s); - if (c > 255) -! return spell_mb_isword_class(mb_get_class(s)); - return spelltab.st_isw[c]; - } - #endif -*************** -*** 9812,9818 **** - { - c = mb_ptr2char(p); - if (c > 255) -! return mb_get_class(p) >= 2; - return spelltab.st_isw[c]; - } - #endif ---- 9813,9819 ---- - { - c = mb_ptr2char(p); - if (c > 255) -! return spell_mb_isword_class(mb_get_class(p)); - return spelltab.st_isw[c]; - } - #endif -*************** -*** 9821,9826 **** ---- 9822,9839 ---- - - #ifdef FEAT_MBYTE - /* -+ * Return TRUE if word class indicates a word character. -+ * Only for characters above 255. -+ * Unicode subscript and superscript are not considered word characters. -+ */ -+ static int -+ spell_mb_isword_class(cl) -+ int cl; -+ { -+ return cl >= 2 && cl != 0x2070 && cl != 0x2080; -+ } -+ -+ /* - * Return TRUE if "p" points to a word character. - * Wide version of spell_iswordp(). - */ -*************** -*** 9841,9847 **** - if (*s > 255) - { - if (enc_utf8) -! return utf_class(*s) >= 2; - if (enc_dbcs) - return dbcs_class((unsigned)*s >> 8, *s & 0xff) >= 2; - return 0; ---- 9854,9860 ---- - if (*s > 255) - { - if (enc_utf8) -! return spell_mb_isword_class(utf_class(*s)); - if (enc_dbcs) - return dbcs_class((unsigned)*s >> 8, *s & 0xff) >= 2; - return 0; -*** ../vim-7.1.292/src/version.c Wed Apr 9 12:14:44 2008 ---- src/version.c Wed Apr 9 15:45:10 2008 -*************** -*** 668,669 **** ---- 673,676 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 293, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -268. You get up in the morning and go online before getting your coffee. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ download, build and distribute -- http://www.A-A-P.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.001 b/7.2.001 new file mode 100644 index 00000000..3bcb7d09 --- /dev/null +++ b/7.2.001 @@ -0,0 +1,61 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.001 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.001 +Problem: Mac: pseudo-ttys don't work properly on Leopard, resulting in the + shell not to have a prompt, CTRL-C not working, etc. +Solution: Don't use SVR4 compatible ptys, even though they are detected. + (Ben Schmidt) +Files: src/pty.c + + +*** ../vim-7.2.000/src/pty.c Wed Aug 6 19:04:29 2008 +--- src/pty.c Fri Aug 15 04:00:34 2008 +*************** +*** 270,278 **** + } + #endif + +! #if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux) + +! /* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work! */ + #define PTY_DONE + int + OpenPTY(ttyn) +--- 270,279 ---- + } + #endif + +! #if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux) && !defined(MACOS_X) + +! /* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work! +! * Same for Mac OS X Leopard. */ + #define PTY_DONE + int + OpenPTY(ttyn) +*** ../vim-7.2.000/src/version.c Sat Aug 9 19:37:37 2008 +--- src/version.c Sun Aug 17 22:56:25 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1, + /**/ + +-- +ARTHUR: Now stand aside worthy adversary. +BLACK KNIGHT: (Glancing at his shoulder) 'Tis but a scratch. +ARTHUR: A scratch? Your arm's off. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.002 b/7.2.002 new file mode 100644 index 00000000..e1ee32cd --- /dev/null +++ b/7.2.002 @@ -0,0 +1,47 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.002 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.002 +Problem: Leaking memory when displaying menus. +Solution: Free allocated memory. (Dominique Pelle) +Files: src/menu.c + + +*** ../vim-7.2.001/src/menu.c Wed Jun 25 00:19:17 2008 +--- src/menu.c Sat Aug 16 05:38:45 2008 +*************** +*** 1120,1125 **** +--- 1120,1126 ---- + parent = menu; + menu = menu->children; + } ++ vim_free(path_name); + + /* Now we have found the matching menu, and we list the mappings */ + /* Highlight title */ +*** ../vim-7.2.001/src/version.c Sun Aug 17 23:01:21 2008 +--- src/version.c Sun Aug 17 23:42:53 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 2, + /**/ + +-- +ARTHUR: You are indeed brave Sir knight, but the fight is mine. +BLACK KNIGHT: Had enough? +ARTHUR: You stupid bastard. You havn't got any arms left. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.003 b/7.2.003 new file mode 100644 index 00000000..626d81e5 --- /dev/null +++ b/7.2.003 @@ -0,0 +1,107 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.003 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.003 +Problem: Typo in translated message. Message not translated. +Solution: Correct spelling. Add _(). (Dominique Pelle) +Files: src/spell.c, src/version.c + + +*** ../vim-7.2.002/src/spell.c Tue Jun 24 22:21:31 2008 +--- src/spell.c Sun Aug 10 12:51:38 2008 +*************** +*** 77,83 **** + + /* + * Do the opposite: based on a maximum end score and a known sound score, +! * compute the the maximum word score that can be used. + */ + #define MAXSCORE(word_score, sound_score) ((4 * word_score - sound_score) / 3) + +--- 77,83 ---- + + /* + * Do the opposite: based on a maximum end score and a known sound score, +! * compute the maximum word score that can be used. + */ + #define MAXSCORE(word_score, sound_score) ((4 * word_score - sound_score) / 3) + +*************** +*** 625,631 **** + /* TRUE if a word appears in the list of banned words. */ + #define WAS_BANNED(su, word) (!HASHITEM_EMPTY(hash_find(&su->su_banned, word))) + +! /* Number of suggestions kept when cleaning up. we need to keep more than + * what is displayed, because when rescore_suggestions() is called the score + * may change and wrong suggestions may be removed later. */ + #define SUG_CLEAN_COUNT(su) ((su)->su_maxcount < 130 ? 150 : (su)->su_maxcount + 20) +--- 625,631 ---- + /* TRUE if a word appears in the list of banned words. */ + #define WAS_BANNED(su, word) (!HASHITEM_EMPTY(hash_find(&su->su_banned, word))) + +! /* Number of suggestions kept when cleaning up. We need to keep more than + * what is displayed, because when rescore_suggestions() is called the score + * may change and wrong suggestions may be removed later. */ + #define SUG_CLEAN_COUNT(su) ((su)->su_maxcount < 130 ? 150 : (su)->su_maxcount + 20) +*************** +*** 5980,5986 **** + else if (spin->si_newprefID == 0 || spin->si_newprefID == 127) + MSG(_("Too many compound flags")); + else +! MSG(_("Too many posponed prefixes and/or compound flags")); + } + + if (syllable != NULL) +--- 5980,5986 ---- + else if (spin->si_newprefID == 0 || spin->si_newprefID == 127) + MSG(_("Too many compound flags")); + else +! MSG(_("Too many postponed prefixes and/or compound flags")); + } + + if (syllable != NULL) +*** ../vim-7.2.002/src/version.c Sun Aug 17 23:43:53 2008 +--- src/version.c Mon Aug 25 04:06:52 2008 +*************** +*** 790,796 **** + MSG_PUTS(_("\nRISC OS version")); + #endif + #ifdef VMS +! MSG_PUTS("\nOpenVMS version"); + # ifdef HAVE_PATHDEF + if (*compiled_arch != NUL) + { +--- 792,798 ---- + MSG_PUTS(_("\nRISC OS version")); + #endif + #ifdef VMS +! MSG_PUTS(_("\nOpenVMS version")); + # ifdef HAVE_PATHDEF + if (*compiled_arch != NUL) + { +*** ../vim-7.2.002/src/version.c Sun Aug 17 23:43:53 2008 +--- src/version.c Mon Aug 25 04:06:52 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 3, + /**/ + +-- +I learned the customs and mannerisms of engineers by observing them, much the +way Jane Goodall learned about the great apes, but without the hassle of +grooming. + (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.004 b/7.2.004 new file mode 100644 index 00000000..8e7ed3e9 --- /dev/null +++ b/7.2.004 @@ -0,0 +1,103 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.004 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.004 +Problem: Cscope help message is not translated. +Solution: Put it in _(). (Dominique Pelle) +Files: src/if_cscope.c, src/if_cscope.h + + +*** ../vim-7.2.003/src/if_cscope.c Tue Jun 24 23:52:06 2008 +--- src/if_cscope.c Mon Aug 25 04:34:19 2008 +*************** +*** 74,80 **** + { "add", cs_add, + N_("Add a new database"), "add file|dir [pre-path] [flags]", 0 }, + { "find", cs_find, +! N_("Query for a pattern"), FIND_USAGE, 1 }, + { "help", cs_help, + N_("Show this message"), "help", 0 }, + { "kill", cs_kill, +--- 74,80 ---- + { "add", cs_add, + N_("Add a new database"), "add file|dir [pre-path] [flags]", 0 }, + { "find", cs_find, +! N_("Query for a pattern"), "find c|d|e|f|g|i|s|t name", 1 }, + { "help", cs_help, + N_("Show this message"), "help", 0 }, + { "kill", cs_kill, +*************** +*** 1180,1186 **** + (void)smsg((char_u *)_("%-5s: %-30s (Usage: %s)"), + cmdp->name, _(cmdp->help), cmdp->usage); + if (strcmp(cmdp->name, "find") == 0) +! MSG_PUTS(FIND_HELP); + cmdp++; + } + +--- 1180,1195 ---- + (void)smsg((char_u *)_("%-5s: %-30s (Usage: %s)"), + cmdp->name, _(cmdp->help), cmdp->usage); + if (strcmp(cmdp->name, "find") == 0) +! MSG_PUTS(_("\n" +! " c: Find functions calling this function\n" +! " d: Find functions called by this function\n" +! " e: Find this egrep pattern\n" +! " f: Find this file\n" +! " g: Find this definition\n" +! " i: Find files #including this file\n" +! " s: Find this C symbol\n" +! " t: Find assignments to\n")); +! + cmdp++; + } + +*** ../vim-7.2.003/src/if_cscope.h Thu Sep 6 17:38:58 2007 +--- src/if_cscope.h Mon Aug 25 04:34:17 2008 +*************** +*** 42,58 **** + * f 7name Find this file + * i 8name Find files #including this file + */ +- #define FIND_USAGE "find c|d|e|f|g|i|s|t name" +- #define FIND_HELP "\n\ +- c: Find functions calling this function\n\ +- d: Find functions called by this function\n\ +- e: Find this egrep pattern\n\ +- f: Find this file\n\ +- g: Find this definition\n\ +- i: Find files #including this file\n\ +- s: Find this C symbol\n\ +- t: Find assignments to\n" +- + + typedef struct { + char * name; +--- 42,47 ---- +*** ../vim-7.2.003/src/version.c Mon Aug 25 04:12:38 2008 +--- src/version.c Mon Aug 25 04:29:53 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 4, + /**/ + +-- +If someone questions your market projections, simply point out that your +target market is "People who are nuts" and "People who will buy any damn +thing". Nobody is going to tell you there aren't enough of those people +to go around. + (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.005 b/7.2.005 new file mode 100644 index 00000000..20cce85b --- /dev/null +++ b/7.2.005 @@ -0,0 +1,149 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.005 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.005 +Problem: A few problems when profiling. Using flag pointer instead of flag + value. Allocating zero bytes. Not freeing used memory. +Solution: Remove wrong '&' characters. Skip dumping when there is nothing + to dump. Free used memory. (Dominique Pelle) +Files: src/eval.c + + +*** ../vim-7.2.004/src/eval.c Fri Aug 8 12:36:31 2008 +--- src/eval.c Mon Aug 25 04:40:11 2008 +*************** +*** 3657,3664 **** + } + + /* +! * Return TRUE if typeval "tv" is locked: Either tha value is locked itself or +! * it refers to a List or Dictionary that is locked. + */ + static int + tv_islocked(tv) +--- 3657,3664 ---- + } + + /* +! * Return TRUE if typeval "tv" is locked: Either that value is locked itself +! * or it refers to a List or Dictionary that is locked. + */ + static int + tv_islocked(tv) +*************** +*** 15838,15847 **** + if (res == FAIL) + res = ITEM_COMPARE_FAIL; + else +- /* return value has wrong type */ + res = get_tv_number_chk(&rettv, &item_compare_func_err); + if (item_compare_func_err) +! res = ITEM_COMPARE_FAIL; + clear_tv(&rettv); + return res; + } +--- 15838,15846 ---- + if (res == FAIL) + res = ITEM_COMPARE_FAIL; + else + res = get_tv_number_chk(&rettv, &item_compare_func_err); + if (item_compare_func_err) +! res = ITEM_COMPARE_FAIL; /* return value has wrong type */ + clear_tv(&rettv); + return res; + } +*************** +*** 20590,20595 **** +--- 20589,20597 ---- + int st_len = 0; + + todo = (int)func_hashtab.ht_used; ++ if (todo == 0) ++ return; /* nothing to dump */ ++ + sorttab = (ufunc_T **)alloc((unsigned)(sizeof(ufunc_T) * todo)); + + for (hi = func_hashtab.ht_array; todo > 0; ++hi) +*************** +*** 20638,20643 **** +--- 20640,20647 ---- + prof_self_cmp); + prof_sort_list(fd, sorttab, st_len, "SELF", TRUE); + } ++ ++ vim_free(sorttab); + } + + static void +*************** +*** 21204,21210 **** + if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL)) + func_do_profile(fp); + if (fp->uf_profiling +! || (fc.caller != NULL && &fc.caller->func->uf_profiling)) + { + ++fp->uf_tm_count; + profile_start(&call_start); +--- 21208,21214 ---- + if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL)) + func_do_profile(fp); + if (fp->uf_profiling +! || (fc.caller != NULL && fc.caller->func->uf_profiling)) + { + ++fp->uf_tm_count; + profile_start(&call_start); +*************** +*** 21235,21247 **** + + #ifdef FEAT_PROFILE + if (do_profiling == PROF_YES && (fp->uf_profiling +! || (fc.caller != NULL && &fc.caller->func->uf_profiling))) + { + profile_end(&call_start); + profile_sub_wait(&wait_start, &call_start); + profile_add(&fp->uf_tm_total, &call_start); + profile_self(&fp->uf_tm_self, &call_start, &fp->uf_tm_children); +! if (fc.caller != NULL && &fc.caller->func->uf_profiling) + { + profile_add(&fc.caller->func->uf_tm_children, &call_start); + profile_add(&fc.caller->func->uf_tml_children, &call_start); +--- 21239,21251 ---- + + #ifdef FEAT_PROFILE + if (do_profiling == PROF_YES && (fp->uf_profiling +! || (fc.caller != NULL && fc.caller->func->uf_profiling))) + { + profile_end(&call_start); + profile_sub_wait(&wait_start, &call_start); + profile_add(&fp->uf_tm_total, &call_start); + profile_self(&fp->uf_tm_self, &call_start, &fp->uf_tm_children); +! if (fc.caller != NULL && fc.caller->func->uf_profiling) + { + profile_add(&fc.caller->func->uf_tm_children, &call_start); + profile_add(&fc.caller->func->uf_tml_children, &call_start); +*** ../vim-7.2.004/src/version.c Mon Aug 25 04:35:13 2008 +--- src/version.c Mon Aug 25 04:46:44 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 5, + /**/ + +-- +The process for understanding customers primarily involves sitting around with +other marketing people and talking about what you would to if you were dumb +enough to be a customer. + (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.006 b/7.2.006 new file mode 100644 index 00000000..f22eeae5 --- /dev/null +++ b/7.2.006 @@ -0,0 +1,50 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.006 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.006 +Problem: HTML files are not recognized by contents. +Solution: Add a rule to the scripts file. (Nico Weber) +Files: runtime/scripts.vim + + +*** ../vim-7.2.005/runtime/scripts.vim Sat Aug 9 19:37:09 2008 +--- runtime/scripts.vim Sat Aug 16 04:05:34 2008 +*************** +*** 234,239 **** +--- 234,243 ---- + elseif s:line1 =~ '\' ++ set ft=html ++ + " PDF + elseif s:line1 =~ '^%PDF-' + set ft=pdf +*** ../vim-7.2.005/src/version.c Mon Aug 25 04:48:21 2008 +--- src/version.c Mon Aug 25 05:02:34 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 6, + /**/ + +-- +Never enter the boss's office unless it's absolutely necessary. Every boss +saves one corner of the desk for useless assignments that are doled out like +Halloween candy to each visitor. + (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.007 b/7.2.007 new file mode 100644 index 00000000..104b2678 --- /dev/null +++ b/7.2.007 @@ -0,0 +1,493 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.007 (extra) +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.007 (extra) +Problem: Minor issues for VMS. +Solution: Minor fixes for VMS. Add float support. (Zoltan Arpadffy) +Files: runtime/doc/os_vms.txt, src/os_vms_conf.h, src/Make_vms.mms, + src/testdir/Make_vms.mms, src/testdir/test30.in, + src/testdir/test54.in + + +*** ../vim-7.2.006/runtime/doc/os_vms.txt Sat Aug 9 19:36:50 2008 +--- runtime/doc/os_vms.txt Tue Aug 19 06:29:31 2008 +*************** +*** 1,4 **** +! *os_vms.txt* For Vim version 7.2. Last change: 2006 Nov 18 + + + VIM REFERENCE MANUAL +--- 1,4 ---- +! *os_vms.txt* For Vim version 7.2. Last change: 2008 Aug 19 + + + VIM REFERENCE MANUAL +*************** +*** 312,318 **** + + 8. Useful notes *vms-notes* + +! 8.1 backspace/delete + 8.2 Filters + 8.3 VMS file version numbers + 8.4 Directory conversion +--- 312,318 ---- + + 8. Useful notes *vms-notes* + +! 8.1 Backspace/delete + 8.2 Filters + 8.3 VMS file version numbers + 8.4 Directory conversion +*************** +*** 326,333 **** + 8.12 diff-mode + 8.13 Allow '$' in C keywords + 8.14 VIMTUTOR for beginners + +! 8.1 backspace/delete + + There are backspace/delete key inconsistencies with VMS. + :fixdel doesn't do the trick, but the solution is: > +--- 326,335 ---- + 8.12 diff-mode + 8.13 Allow '$' in C keywords + 8.14 VIMTUTOR for beginners ++ 8.15 Slow start in console mode issue ++ 8.16 Common VIM directory - different architectures + +! 8.1 Backspace/delete + + There are backspace/delete key inconsistencies with VMS. + :fixdel doesn't do the trick, but the solution is: > +*************** +*** 663,674 **** + + (Thomas.R.Wyant III, Vim 6.1) + + ============================================================================== + + 9. VMS related changes *vms-changes* + +! Version 7 + - Improved low level char input (affects just console mode) + + Version 6.4 (2005 Oct 15) + - GTKLIB and Vim build on IA64 +--- 665,794 ---- + + (Thomas.R.Wyant III, Vim 6.1) + ++ 8.14 Slow start in console mode issue ++ ++ As GUI/GTK Vim works equally well in console mode, many administartors ++ deploy those executables system wide. ++ Unfortunately, on a remote slow connections GUI/GTK executables behave rather ++ slow when user wants to run Vim just in the console mode - because of X environment detection timeout. ++ ++ Luckily, there is a simple solution for that. Administrators need to deploy ++ both GUI/GTK build and just console build executables, like below: > ++ ++ |- vim72 ++ |----- doc ++ |----- syntax ++ vimrc (system rc files) ++ gvimrc ++ gvim.exe (the remaned GUI or GTK built vim.exe) ++ vim.exe (the console only executable) ++ ++ Define system symbols like below in for ex in LOGIN.COM or SYLOGIN.COM: > ++ ++ $ define/nolog VIM RF10:[UTIL.VIM72] ! where you VIM directory is ++ $ vi*m :== mcr VIM:VIM.EXE ++ $ gvi*m :== mcr VIM:GVIM.EXE ++ $ ! or you can try to spawn with ++ $ gv*im :== spawn/nowait/input=NLA0 mcr VIM:GVIM.EXE -g -GEOMETRY 80x40 ++ ++ ++ Like this, users that do not have X environment and want to use Vim just in ++ console mode can avoid performance problems. ++ ++ (Zoltan Arpadffy, Vim 7.2) ++ ++ 8.15 Common VIM directory - different architectures ++ ++ In a cluster that contains nodes with different architectures like below: ++ ++ $show cluster ++ View of Cluster from system ID 11655 node: TOR 18-AUG-2008 11:58:31 ++ +---------------------------------+ ++ ¦ SYSTEMS ¦ MEMBERS ¦ ++ +-----------------------+---------¦ ++ ¦ NODE ¦ SOFTWARE ¦ STATUS ¦ ++ +--------+--------------+---------¦ ++ ¦ TOR ¦ VMS V7.3-2 ¦ MEMBER ¦ ++ ¦ TITAN2 ¦ VMS V8.3 ¦ MEMBER ¦ ++ ¦ ODIN ¦ VMS V7.3-2 ¦ MEMBER ¦ ++ +---------------------------------+ ++ ++ It is convinient to have a common VIM directory but execute different ++ executables. ++ There are more solutions for this problem: ++ ++ solution 1. all executables in the same directory with different names ++ This is easily done with the following script that can be added ++ to the login.com or sylogin.com: > ++ ++ $ if f$getsyi("NODE_HWTYPE") .eqs. "VAX" ++ $ then ++ $ say "VAX platform" ++ $ vi*m:== mcr vim:VIM.EXE_VAX ++ $ endif ++ $ if f$getsyi("NODE_HWTYPE") .eqs. "ALPH" ++ $ then ++ $ say "ALPHA platform" ++ $ vi*m :== mcr vim:VIM.EXE_AXP ++ $ endif ++ $ if f$getsyi("ARCH_NAME") .eqs. "IA64" ++ $ then ++ $ say "IA64 platform" ++ $ vi*m :== mcr vim:VIM.EXE_IA64 ++ $ endif ++ ++ solution 2. different directories: > ++ ++ $ if f$getsyi("NODE_HWTYPE") .eqs. "VAX" ++ $ then ++ $ say "VAX platform" ++ $ define/nolog VIM RF10:[UTIL.VAX_EXE] ! VAX executables ++ $ endif ++ $ if f$getsyi("NODE_HWTYPE") .eqs. "ALPH" ++ $ then ++ $ say "ALPHA platform" ++ $ define/nolog VIM RF10:[UTIL.AXP_EXE] ! AXP executables ++ $ endif ++ $ if f$getsyi("ARCH_NAME") .eqs. "IA64" ++ $ then ++ $ say "IA64 platform" ++ $ define/nolog VIM RF10:[UTIL.IA64_EXE] ! IA64 executables ++ $ endif ++ $! VIMRUNTIME must be defined in order to find runtime files ++ $ define/nolog VIMRUNTIME RF10:[UTIL.VIM72] ++ ++ A good examle for this approach is the [GNU]gnu_tools.com script from GNU_TOOLS.ZIP ++ package downloadable from http://www.polarhome.com/vim/ ++ ++ (Zoltan Arpadffy, Vim 7.2) ++ + ============================================================================== + + 9. VMS related changes *vms-changes* + +! Recent changes +! - The following plugins are included into VMS runtime: +! genutils 2.4, multiselect 2.2, multvals 3.1, selectbuf 4.3, +! bufexplorer 7.1.7, taglist 4.5 +! - minor changes in vimrc (just in VMS runtime) +! - make_vms.mms - HUGE model is the default +! - [TESTDIR]make_vms.mms include as many tests possible +! - modify test30 and test54 for VMS +! - enable FLOAT feature in VMS port +! - os_vms.txt updated +! +! Version 7.2 (2008 Aug 9) +! - VCF files write corrected +! - CTAGS 5.7 included +! - corrected make_vms.mms (on VAX gave syntax error) +! +! Version 7.1 (2007 Jun 15) +! - create TAGS file from menu +! +! Version 7 (2006 May 8) + - Improved low level char input (affects just console mode) ++ - Fixed plugin bug ++ - CTAGS 5.6 included + + Version 6.4 (2005 Oct 15) + - GTKLIB and Vim build on IA64 +*************** +*** 806,811 **** +--- 926,932 ---- + + OpenVMS documentation and executables are maintained by: + Zoltan Arpadffy ++ OpenVMS Vim page: http://www.polarhome.com/vim/ + + This document uses parts and remarks from earlier authors and contributors + of OS_VMS.TXT: +*** ../vim-7.2.006/src/os_vms_conf.h Thu May 10 19:26:17 2007 +--- src/os_vms_conf.h Sat Aug 16 05:09:17 2008 +*************** +*** 114,119 **** +--- 114,121 ---- + #define HAVE_PUTENV + #define HAVE_SETENV + #define HAVE_SETJMP_H ++ #define HAVE_MATH_H ++ #define HAVE_FLOAT_FUNCS + + #undef HAVE_DIRENT_H + #undef HAVE_SYS_NDIR_H +*** ../vim-7.2.006/src/Make_vms.mms Mon Oct 29 22:38:54 2007 +--- src/Make_vms.mms Sat Aug 16 05:17:41 2008 +*************** +*** 2,8 **** + # Makefile for Vim on OpenVMS + # + # Maintainer: Zoltan Arpadffy +! # Last change: 2007 Oct 22 + # + # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64 + # with MMS and MMK +--- 2,8 ---- + # Makefile for Vim on OpenVMS + # + # Maintainer: Zoltan Arpadffy +! # Last change: 2008 Aug 16 + # + # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64 + # with MMS and MMK +*************** +*** 36,42 **** + # BIG - Many features enabled, as rich as possible. (default) + # HUGE - All possible featues enabled. + # Please select one of these alternatives above. +! MODEL = BIG + + # GUI or terminal mode executable. + # Comment out if you want just the character terminal mode only. +--- 36,42 ---- + # BIG - Many features enabled, as rich as possible. (default) + # HUGE - All possible featues enabled. + # Please select one of these alternatives above. +! MODEL = HUGE + + # GUI or terminal mode executable. + # Comment out if you want just the character terminal mode only. +*** ../vim-7.2.006/src/testdir/Make_vms.mms Wed Jun 25 00:34:23 2008 +--- src/testdir/Make_vms.mms Tue Aug 19 06:28:07 2008 +*************** +*** 4,12 **** + # Authors: Zoltan Arpadffy, + # Sandor Kopanyi, + # +! # Last change: 2008 Jun 19 + # +! # This has been tested on VMS 6.2 to 7.2 on DEC Alpha and VAX. + # Edit the lines in the Configuration section below to select. + # + # Execute with: +--- 4,12 ---- + # Authors: Zoltan Arpadffy, + # Sandor Kopanyi, + # +! # Last change: 2008 Aug 19 + # +! # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. + # Edit the lines in the Configuration section below to select. + # + # Execute with: +*************** +*** 32,37 **** +--- 32,46 ---- + # and directory handling. + # WANT_UNIX = YES + ++ # Comment out if you want to run Win32 specific tests as well, but please ++ # be aware, that on OpenVMS will fail, because of cat, rm, etc commands ++ # and directory handling. ++ # WANT_WIN = YES ++ ++ # Comment out if you want to run spell checker tests. ++ # They fail because VMS does not support file names. ++ # WANT_SPELL = YES ++ + # Comment out if you have gzip on your system + # HAVE_GZIP = YES + +*************** +*** 53,64 **** + test13.out test14.out test15.out test17.out \ + test18.out test19.out test20.out test21.out test22.out \ + test23.out test24.out test26.out \ +! test28.out test29.out test31.out test32.out \ + test33.out test34.out test35.out test36.out test37.out \ + test38.out test39.out test40.out test41.out test42.out \ + test43.out test44.out test45.out test46.out \ + test48.out test51.out test53.out test54.out test55.out \ +! test56.out test57.out test58.out test59.out test60.out \ + test61.out test62.out test63.out test64.out test65.out + + .IFDEF WANT_GUI +--- 62,73 ---- + test13.out test14.out test15.out test17.out \ + test18.out test19.out test20.out test21.out test22.out \ + test23.out test24.out test26.out \ +! test28.out test29.out test30.out test31.out test32.out \ + test33.out test34.out test35.out test36.out test37.out \ + test38.out test39.out test40.out test41.out test42.out \ + test43.out test44.out test45.out test46.out \ + test48.out test51.out test53.out test54.out test55.out \ +! test56.out test57.out test60.out \ + test61.out test62.out test63.out test64.out test65.out + + .IFDEF WANT_GUI +*************** +*** 67,73 **** + .ENDIF + + .IFDEF WANT_UNIX +! SCRIPT_UNIX = test10.out test12.out test25.out test27.out test30.out test49.out + .ENDIF + + .IFDEF HAVE_GZIP +--- 76,90 ---- + .ENDIF + + .IFDEF WANT_UNIX +! SCRIPT_UNIX = test10.out test12.out test25.out test27.out test49.out +! .ENDIF +! +! .IFDEF WANT_WIN +! SCRIPT_WIN = test50.out test52.out +! .ENDIF +! +! .IFDEF WANT_SPELL +! SCRIPT_SPELL = test58.out test59.out + .ENDIF + + .IFDEF HAVE_GZIP +*************** +*** 84,94 **** + -@ write sys$output " "$*" " + -@ write sys$output "-----------------------------------------------" + -@ create/term/wait mcr $(VIMPROG) $(GUI_OPTION) -u vms.vim --noplugin -s dotest.in $*.in +! -@ if "''F$SEARCH("test.out.*")'" .NES. "" then differences test.out $*.ok; + -@ if "''F$SEARCH("test.out.*")'" .NES. "" then rename test.out $*.out + -@ if "''F$SEARCH("Xdotest.*")'" .NES. "" then delete/noconfirm/nolog Xdotest.*.* + +! all : clean nolog $(SCRIPT) $(SCRIPT_GUI) $(SCRIPT_UNIX) $(SCRIPT_GZIP) $(SCRIPT_GDIFF) + -@ write sys$output " " + -@ write sys$output "-----------------------------------------------" + -@ write sys$output " All done" +--- 101,111 ---- + -@ write sys$output " "$*" " + -@ write sys$output "-----------------------------------------------" + -@ create/term/wait mcr $(VIMPROG) $(GUI_OPTION) -u vms.vim --noplugin -s dotest.in $*.in +! -@ if "''F$SEARCH("test.out.*")'" .NES. "" then differences /par test.out $*.ok; + -@ if "''F$SEARCH("test.out.*")'" .NES. "" then rename test.out $*.out + -@ if "''F$SEARCH("Xdotest.*")'" .NES. "" then delete/noconfirm/nolog Xdotest.*.* + +! all : clean nolog $(SCRIPT) $(SCRIPT_GUI) $(SCRIPT_UNIX) $(SCRIPT_WIN) $(SCRIPT_SPELL) $(SCRIPT_GZIP) $(SCRIPT_GDIFF) + -@ write sys$output " " + -@ write sys$output "-----------------------------------------------" + -@ write sys$output " All done" +*************** +*** 113,118 **** +--- 130,137 ---- + -@ write sys$output "MAKE_VMS.MMS options:" + -@ write sys$output " WANT_GUI = ""$(WANT_GUI)"" " + -@ write sys$output " WANT_UNIX = ""$(WANT_UNIX)"" " ++ -@ write sys$output " WANT_WIN = ""$(WANT_WIN)"" " ++ -@ write sys$output " WANT_SPELL= ""$(WANT_SPELL)"" " + -@ write sys$output " HAVE_GZIP = ""$(HAVE_GZIP)"" " + -@ write sys$output " HAVE_GDIFF= ""$(HAVE_GDIFF)"" " + -@ write sys$output "Default vimrc file is VMS.VIM: +*************** +*** 122,126 **** +--- 141,153 ---- + clean : + -@ if "''F$SEARCH("*.out")'" .NES. "" then delete/noconfirm/nolog *.out.* + -@ if "''F$SEARCH("test.log")'" .NES. "" then delete/noconfirm/nolog test.log.* ++ -@ if "''F$SEARCH("test.ok")'" .NES. "" then delete/noconfirm/nolog test.ok.* + -@ if "''F$SEARCH("Xdotest.*")'" .NES. "" then delete/noconfirm/nolog Xdotest.*.* + -@ if "''F$SEARCH("*.*_sw*")'" .NES. "" then delete/noconfirm/nolog *.*_sw*.* ++ -@ if "''F$SEARCH("*.failed")'" .NES. "" then delete/noconfirm/nolog *.failed.* ++ -@ if "''F$SEARCH("*.rej")'" .NES. "" then delete/noconfirm/nolog *.rej.* ++ -@ if "''F$SEARCH("tiny.vim")'" .NES. "" then delete/noconfirm/nolog tiny.vim.* ++ -@ if "''F$SEARCH("small.vim")'" .NES. "" then delete/noconfirm/nolog small.vim.* ++ -@ if "''F$SEARCH("mbyte.vim")'" .NES. "" then delete/noconfirm/nolog mbyte.vim.* ++ -@ if "''F$SEARCH("viminfo.*")'" .NES. "" then delete/noconfirm/nolog viminfo.*.* ++ +*** ../vim-7.2.006/src/testdir/test30.in Sun Jul 13 19:17:14 2008 +--- src/testdir/test30.in Sat Aug 16 04:59:37 2008 +*************** +*** 24,33 **** + :set nobin eol + :bwipe XXUnix XXDos XXMac + :" create mixed format files +! :!cat XXUnix XXDos >XXUxDs +! :!cat XXUnix XXMac >XXUxMac +! :!cat XXDos XXMac >XXDosMac +! :!cat XXUnix XXDos XXMac >XXUxDsMc + :" + :" try reading and writing with 'fileformats' empty + :set fileformat=unix +--- 24,40 ---- + :set nobin eol + :bwipe XXUnix XXDos XXMac + :" create mixed format files +! :if has("vms") +! : !copy XXUnix,XXDos XXUxDs. +! : !copy XXUnix,XXMac XXUxMac. +! : !copy XXDos,XXMac XXDosMac. +! : !copy XXUnix,XXDos,XXMac XXUxDsMc. +! :else +! : !cat XXUnix XXDos >XXUxDs +! : !cat XXUnix XXMac >XXUxMac +! : !cat XXDos XXMac >XXDosMac +! : !cat XXUnix XXDos XXMac >XXUxDsMc +! :endif + :" + :" try reading and writing with 'fileformats' empty + :set fileformat=unix +*** ../vim-7.2.006/src/testdir/test54.in Sun Jan 2 12:43:19 2005 +--- src/testdir/test54.in Tue Aug 19 06:26:55 2008 +*************** +*** 3,10 **** + STARTTEST + :so small.vim + :e xx +! :!rm -f test.out +! :au BufLeave :!echo buffer-local autommand in %>> test.out + :e somefile " here, autocommand for xx shall write test.out + : " but autocommand shall not apply to buffer named + :bwipe xx " here, autocommand shall be auto-deleted +--- 3,15 ---- + STARTTEST + :so small.vim + :e xx +! :if has("vms") +! : !del test.out.* +! : au BufLeave :!write sys$output "buffer-local autommand in %" > test.out +! :else +! : !rm -f test.out +! : au BufLeave :!echo buffer-local autommand in %>> test.out +! :endif + :e somefile " here, autocommand for xx shall write test.out + : " but autocommand shall not apply to buffer named + :bwipe xx " here, autocommand shall be auto-deleted +*** ../vim-7.2.006/src/version.c Mon Aug 25 05:03:29 2008 +--- src/version.c Mon Sep 1 16:46:50 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 7, + /**/ + +-- +How To Keep A Healthy Level Of Insanity: +8. Don't use any punctuation marks. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.008 b/7.2.008 new file mode 100644 index 00000000..d3fb58e5 --- /dev/null +++ b/7.2.008 @@ -0,0 +1,63 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.008 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.008 +Problem: With a BufHidden autocommand that invokes ":bunload" the window + count for a buffer can be wrong. (Bob Hiestand) +Solution: Don't call enter_buffer() when already in that buffer. +Files: src/buffer.c + + +*** ../vim-7.2.007/src/buffer.c Wed Aug 6 18:32:40 2008 +--- src/buffer.c Mon Sep 1 14:25:45 2008 +*************** +*** 1351,1361 **** + } + } + #ifdef FEAT_AUTOCMD + # ifdef FEAT_EVAL +! /* An autocommand may have deleted buf or aborted the script processing! */ +! if (buf_valid(buf) && !aborting()) + # else +! if (buf_valid(buf)) /* an autocommand may have deleted buf! */ + # endif + #endif + enter_buffer(buf); +--- 1351,1362 ---- + } + } + #ifdef FEAT_AUTOCMD ++ /* An autocommand may have deleted "buf", already entered it (e.g., when ++ * it did ":bunload") or aborted the script processing! */ + # ifdef FEAT_EVAL +! if (buf_valid(buf) && buf != curbuf && !aborting()) + # else +! if (buf_valid(buf) && buf != curbuf) + # endif + #endif + enter_buffer(buf); +*** ../vim-7.2.007/src/version.c Mon Sep 1 16:50:09 2008 +--- src/version.c Mon Sep 1 17:31:28 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 8, + /**/ + +-- +If Pacman had affected us as kids we'd be running around in dark rooms, +munching pills and listening to repetitive music. + -- Marcus Brigstocke + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.009 b/7.2.009 new file mode 100644 index 00000000..fa891dcf --- /dev/null +++ b/7.2.009 @@ -0,0 +1,67 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.009 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.009 +Problem: Can't compile with Perl 5.10 on MS-Windows. (Cesar Romani) +Solution: Add the Perl_sv_free2 function for dynamic loading. (Dan Sharp) +Files: src/if_perl.xs + + +*** ../vim-7.2.008/src/if_perl.xs Thu Jul 24 16:24:15 2008 +--- src/if_perl.xs Mon Sep 1 14:58:37 2008 +*************** +*** 136,141 **** +--- 136,144 ---- + # define Perl_newXS_flags dll_Perl_newXS_flags + #endif + # define Perl_sv_free dll_Perl_sv_free ++ # if (PERL_REVISION == 5) && (PERL_VERSION >= 10) ++ # define Perl_sv_free2 dll_Perl_sv_free2 ++ # endif + # define Perl_sv_isa dll_Perl_sv_isa + # define Perl_sv_magic dll_Perl_sv_magic + # define Perl_sv_setiv dll_Perl_sv_setiv +*************** +*** 268,273 **** +--- 271,277 ---- + static void (*boot_DynaLoader)_((pTHX_ CV*)); + + #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) ++ static void (*Perl_sv_free2)(pTHX_ SV*); + static void (*Perl_sys_init3)(int* argc, char*** argv, char*** env); + static void (*Perl_sys_term)(void); + static SV** (*Perl_ISv_ptr)(register PerlInterpreter*); +*************** +*** 367,372 **** +--- 371,377 ---- + {"Perl_TXpv_ptr", (PERL_PROC*)&Perl_TXpv_ptr}, + {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr}, + #else ++ {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2}, + {"Perl_sys_init3", (PERL_PROC*)&Perl_sys_init3}, + {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term}, + {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr}, +*** ../vim-7.2.008/src/version.c Mon Sep 1 17:32:40 2008 +--- src/version.c Mon Sep 1 17:55:24 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 9, + /**/ + +-- +How To Keep A Healthy Level Of Insanity: +11. Specify that your drive-through order is "to go". + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.010 b/7.2.010 new file mode 100644 index 00000000..47315881 --- /dev/null +++ b/7.2.010 @@ -0,0 +1,206 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.010 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.010 +Problem: When using "K" in Visual mode not all characters are properly + escaped. (Ben Schmidt) +Solution: Use a function with the functionality of shellescape(). (Jan + Minar) +Files: src/mbyte.c, src/misc2.c, src/normal.c + + +*** ../vim-7.2.009/src/mbyte.c Wed Aug 6 18:45:36 2008 +--- src/mbyte.c Wed Sep 3 22:34:48 2008 +*************** +*** 2540,2546 **** + return (int)(p - q); + } + +- #if defined(FEAT_EVAL) || defined(PROTO) + /* + * Copy a character from "*fp" to "*tp" and advance the pointers. + */ +--- 2540,2545 ---- +*************** +*** 2555,2561 **** + *tp += l; + *fp += l; + } +- #endif + + /* + * Return the offset from "p" to the first byte of a character. When "p" is +--- 2554,2559 ---- +*** ../vim-7.2.009/src/misc2.c Thu Jul 24 20:28:58 2008 +--- src/misc2.c Wed Sep 3 22:05:21 2008 +*************** +*** 1257,1263 **** + return escaped_string; + } + +- #if !defined(BACKSLASH_IN_FILENAME) || defined(FEAT_EVAL) || defined(PROTO) + /* + * Return TRUE when 'shell' has "csh" in the tail. + */ +--- 1257,1262 ---- +*************** +*** 1266,1274 **** + { + return (strstr((char *)gettail(p_sh), "csh") != NULL); + } +- #endif + +- #if defined(FEAT_EVAL) || defined(PROTO) + /* + * Escape "string" for use as a shell argument with system(). + * This uses single quotes, except when we know we need to use double qoutes +--- 1265,1271 ---- +*************** +*** 1391,1397 **** + + return escaped_string; + } +- #endif + + /* + * Like vim_strsave(), but make all characters uppercase. +--- 1388,1393 ---- +*** ../vim-7.2.009/src/normal.c Thu Jul 31 22:03:54 2008 +--- src/normal.c Sat Sep 6 15:06:07 2008 +*************** +*** 5469,5474 **** +--- 5469,5479 ---- + STRCPY(buf, "he! "); + else + { ++ /* An external command will probably use an argument starting ++ * with "-" as an option. To avoid trouble we skip the "-". */ ++ while (*ptr == '-') ++ ++ptr; ++ + /* When a count is given, turn it into a range. Is this + * really what we want? */ + isman = (STRCMP(kp, "man") == 0); +*************** +*** 5511,5547 **** + /* + * Now grab the chars in the identifier + */ +! if (cmdchar == '*') +! aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\"); +! else if (cmdchar == '#') +! aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\"); +! else if (cmdchar == 'K' && !kp_help) +! aux_ptr = (char_u *)" \t\\\"|!"; +! else +! /* Don't escape spaces and Tabs in a tag with a backslash */ +! aux_ptr = (char_u *)"\\|\""; +! +! p = buf + STRLEN(buf); +! while (n-- > 0) +! { +! /* put a backslash before \ and some others */ +! if (vim_strchr(aux_ptr, *ptr) != NULL) +! *p++ = '\\'; +! #ifdef FEAT_MBYTE +! /* When current byte is a part of multibyte character, copy all bytes +! * of that character. */ +! if (has_mbyte) + { +! int i; +! int len = (*mb_ptr2len)(ptr) - 1; +! +! for (i = 0; i < len && n >= 1; ++i, --n) +! *p++ = *ptr++; + } + #endif +! *p++ = *ptr++; + } +- *p = NUL; + + /* + * Execute the command. +--- 5516,5572 ---- + /* + * Now grab the chars in the identifier + */ +! if (cmdchar == 'K' && !kp_help) +! { +! /* Escape the argument properly for a shell command */ +! p = vim_strsave_shellescape(ptr, TRUE); +! if (p == NULL) + { +! vim_free(buf); +! return; + } ++ buf = (char_u *)vim_realloc(buf, STRLEN(buf) + STRLEN(p) + 1); ++ if (buf == NULL) ++ { ++ vim_free(buf); ++ vim_free(p); ++ return; ++ } ++ STRCAT(buf, p); ++ vim_free(p); ++ } ++ else ++ { ++ if (cmdchar == '*') ++ aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\"); ++ else if (cmdchar == '#') ++ aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\"); ++ else ++ /* Don't escape spaces and Tabs in a tag with a backslash */ ++ aux_ptr = (char_u *)"\\|\"\n*?["; ++ ++ p = buf + STRLEN(buf); ++ while (n-- > 0) ++ { ++ /* put a backslash before \ and some others */ ++ if (vim_strchr(aux_ptr, *ptr) != NULL) ++ *p++ = '\\'; ++ #ifdef FEAT_MBYTE ++ /* When current byte is a part of multibyte character, copy all ++ * bytes of that character. */ ++ if (has_mbyte) ++ { ++ int i; ++ int len = (*mb_ptr2len)(ptr) - 1; ++ ++ for (i = 0; i < len && n >= 1; ++i, --n) ++ *p++ = *ptr++; ++ } + #endif +! *p++ = *ptr++; +! } +! *p = NUL; + } + + /* + * Execute the command. +*** ../vim-7.2.009/src/version.c Mon Sep 1 17:56:05 2008 +--- src/version.c Sat Sep 6 16:26:42 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 10, + /**/ + +-- +Q. What happens to programmers when they die? +A: MS-Windows programmers are reinstalled. C++ programmers become undefined, + anyone who refers to them will die as well. Java programmers reincarnate + after being garbage collected. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.011 b/7.2.011 new file mode 100644 index 00000000..928f8d63 --- /dev/null +++ b/7.2.011 @@ -0,0 +1,105 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.011 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.011 +Problem: Get an error when inserting a float value from the expression + register. +Solution: Convert the Float to a String automatically in the same place + where a List would be converted to a String. +Files: src/eval.c + + +*** ../vim-7.2.010/src/eval.c Mon Aug 25 04:48:21 2008 +--- src/eval.c Sun Sep 7 13:50:38 2008 +*************** +*** 1256,1278 **** + + /* + * Top level evaluation function, returning a string. + * Return pointer to allocated memory, or NULL for failure. + */ + char_u * +! eval_to_string(arg, nextcmd, dolist) + char_u *arg; + char_u **nextcmd; +! int dolist; /* turn List into sequence of lines */ + { + typval_T tv; + char_u *retval; + garray_T ga; + + if (eval0(arg, &tv, nextcmd, TRUE) == FAIL) + retval = NULL; + else + { +! if (dolist && tv.v_type == VAR_LIST) + { + ga_init2(&ga, (int)sizeof(char), 80); + if (tv.vval.v_list != NULL) +--- 1256,1281 ---- + + /* + * Top level evaluation function, returning a string. ++ * When "convert" is TRUE convert a List into a sequence of lines and convert ++ * a Float to a String. + * Return pointer to allocated memory, or NULL for failure. + */ + char_u * +! eval_to_string(arg, nextcmd, convert) + char_u *arg; + char_u **nextcmd; +! int convert; + { + typval_T tv; + char_u *retval; + garray_T ga; ++ char_u numbuf[NUMBUFLEN]; + + if (eval0(arg, &tv, nextcmd, TRUE) == FAIL) + retval = NULL; + else + { +! if (convert && tv.v_type == VAR_LIST) + { + ga_init2(&ga, (int)sizeof(char), 80); + if (tv.vval.v_list != NULL) +*************** +*** 1280,1285 **** +--- 1283,1295 ---- + ga_append(&ga, NUL); + retval = (char_u *)ga.ga_data; + } ++ #ifdef FEAT_FLOAT ++ else if (convert && tv.v_type == VAR_FLOAT) ++ { ++ vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv.vval.v_float); ++ retval = vim_strsave(numbuf); ++ } ++ #endif + else + retval = vim_strsave(get_tv_string(&tv)); + clear_tv(&tv); +*** ../vim-7.2.010/src/version.c Sat Sep 6 16:44:06 2008 +--- src/version.c Sun Sep 7 13:52:00 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 11, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +34. You laugh at people with 14400 baud modems. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.012 b/7.2.012 new file mode 100644 index 00000000..fa3ed247 --- /dev/null +++ b/7.2.012 @@ -0,0 +1,53 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.012 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.012 +Problem: Compiler warnings when building with startup timing. +Solution: Add type casts. +Files: src/ex_cmds2.c + + +*** ../vim-7.2.011/src/ex_cmds2.c Sun Jul 13 19:36:09 2008 +--- src/ex_cmds2.c Tue Sep 2 11:14:41 2008 +*************** +*** 3145,3152 **** + verbose_leave(); + } + #ifdef STARTUPTIME +! vim_snprintf(IObuff, IOSIZE, "sourcing %s", fname); +! time_msg(IObuff, &tv_start); + time_pop(&tv_rel); + #endif + +--- 3145,3152 ---- + verbose_leave(); + } + #ifdef STARTUPTIME +! vim_snprintf((char *)IObuff, IOSIZE, "sourcing %s", fname); +! time_msg((char *)IObuff, &tv_start); + time_pop(&tv_rel); + #endif + +*** ../vim-7.2.011/src/version.c Sun Sep 7 13:54:31 2008 +--- src/version.c Sun Sep 7 15:49:00 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 12, + /**/ + +-- +He who laughs last, thinks slowest. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.013 b/7.2.013 new file mode 100644 index 00000000..2645f0a7 --- /dev/null +++ b/7.2.013 @@ -0,0 +1,135 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.013 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.013 +Problem: While waiting for the X selection Vim consumes a lot of CPU time + and hangs until a response is received. +Solution: Sleep a bit when the selection event hasn't been received yet. + Time out after a couple of seconds to avoid a hang when the + selection owner isn't responding. +Files: src/ui.c + + +*** ../vim-7.2.012/src/ui.c Mon Jul 14 21:47:49 2008 +--- src/ui.c Sun Sep 7 16:54:35 2008 +*************** +*** 2110,2115 **** +--- 2110,2117 ---- + int i; + int nbytes = 0; + char_u *buffer; ++ time_t start_time; ++ int timed_out = FALSE; + + for (i = + #ifdef FEAT_MBYTE +*************** +*** 2129,2134 **** +--- 2131,2137 ---- + case 3: type = text_atom; break; + default: type = XA_STRING; + } ++ success = FALSE; + XtGetSelectionValue(myShell, cbd->sel_atom, type, + clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime); + +*************** +*** 2141,2167 **** + * characters, then they will appear before the one that requested the + * paste! Don't worry, we will catch up with any other events later. + */ + for (;;) + { + if (XCheckTypedEvent(dpy, SelectionNotify, &event)) + break; + if (XCheckTypedEvent(dpy, SelectionRequest, &event)) + /* We may get a SelectionRequest here and if we don't handle + * it we hang. KDE klipper does this, for example. */ + XtDispatchEvent(&event); + + /* Do we need this? Probably not. */ + XSync(dpy, False); + +! /* Bernhard Walle solved a slow paste response in an X terminal by +! * adding: usleep(10000); here. */ + } + +- /* this is where clip_x11_request_selection_cb() is actually called */ +- XtDispatchEvent(&event); +- + if (success) + return; + } + + /* Final fallback position - use the X CUT_BUFFER0 store */ +--- 2144,2189 ---- + * characters, then they will appear before the one that requested the + * paste! Don't worry, we will catch up with any other events later. + */ ++ start_time = time(NULL); + for (;;) + { + if (XCheckTypedEvent(dpy, SelectionNotify, &event)) ++ { ++ /* this is where clip_x11_request_selection_cb() is actually ++ * called */ ++ XtDispatchEvent(&event); + break; ++ } + if (XCheckTypedEvent(dpy, SelectionRequest, &event)) + /* We may get a SelectionRequest here and if we don't handle + * it we hang. KDE klipper does this, for example. */ + XtDispatchEvent(&event); + ++ /* Time out after 2 to 3 seconds to avoid that we hang when the ++ * other process doesn't respond. Note that the SelectionNotify ++ * event may still come later when the selection owner comes back ++ * to life and the text gets inserted unexpectedly (by xterm). ++ * Don't know how to avoid that :-(. */ ++ if (time(NULL) > start_time + 2) ++ { ++ timed_out = TRUE; ++ break; ++ } ++ + /* Do we need this? Probably not. */ + XSync(dpy, False); + +! /* Wait for 1 msec to avoid that we eat up all CPU time. */ +! ui_delay(1L, TRUE); + } + + if (success) + return; ++ ++ /* don't do a retry with another type after timing out, otherwise we ++ * hang for 15 seconds. */ ++ if (timed_out) ++ break; + } + + /* Final fallback position - use the X CUT_BUFFER0 store */ +*** ../vim-7.2.012/src/version.c Sun Sep 7 15:49:45 2008 +--- src/version.c Sun Sep 7 21:45:55 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 13, + /**/ + +-- +The users that I support would double-click on a landmine to find out +what happens. -- A system administrator + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.014 b/7.2.014 new file mode 100644 index 00000000..a0379486 --- /dev/null +++ b/7.2.014 @@ -0,0 +1,52 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.014 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.014 +Problem: synstack() doesn't work in an emptly line. +Solution: Accept column zero as a valid position. +Files: src/eval.c + + +*** ../vim-7.2.013/src/eval.c Sun Sep 7 13:54:31 2008 +--- src/eval.c Sun Sep 7 13:50:38 2008 +*************** +*** 16667,16673 **** + col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */ + + if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count +! && col >= 0 && col < (long)STRLEN(ml_get(lnum)) + && rettv_list_alloc(rettv) != FAIL) + { + (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE); +--- 16667,16673 ---- + col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */ + + if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count +! && col >= 0 && (col == 0 || col < (long)STRLEN(ml_get(lnum))) + && rettv_list_alloc(rettv) != FAIL) + { + (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE); +*** ../vim-7.2.013/src/version.c Sun Sep 7 21:47:51 2008 +--- src/version.c Wed Sep 10 15:36:52 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 14, + /**/ + +-- +Everybody lies, but it doesn't matter since nobody listens. + -- Lieberman's Law + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.015 b/7.2.015 new file mode 100644 index 00000000..e03ac156 --- /dev/null +++ b/7.2.015 @@ -0,0 +1,82 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.015 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.015 +Problem: "make all test install" doesn't stop when the test fails. (Daniel + Shahaf) +Solution: When test.log contains failures exit with non-zero status. +Files: src/testdir/Makefile + + +*** ../vim-7.2.014/src/testdir/Makefile Wed Jun 25 00:22:53 2008 +--- src/testdir/Makefile Sun Sep 7 21:31:49 2008 +*************** +*** 26,40 **** + + .SUFFIXES: .in .out + +! nongui: nolog $(SCRIPTS) +! @echo +! @cat test.log +! @echo ALL DONE + +! gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) + @echo +! @cat test.log +! @echo ALL DONE + + $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG) + +--- 26,42 ---- + + .SUFFIXES: .in .out + +! nongui: nolog $(SCRIPTS) report +! +! gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) report + +! report: + @echo +! @echo 'Test results:' +! @/bin/sh -c "if test -f test.log; \ +! then cat test.log; echo TEST FAILURE; exit 1; \ +! else echo ALL DONE; \ +! fi" + + $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG) + +*************** +*** 71,74 **** + test60.out: test60.vim + + nolog: +! -echo Test results: >test.log +--- 73,76 ---- + test60.out: test60.vim + + nolog: +! -rm -f test.log +*** ../vim-7.2.014/src/version.c Wed Sep 10 15:38:13 2008 +--- src/version.c Wed Sep 10 18:23:38 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 15, + /**/ + +-- +Light travels faster than sound. This is why some people +appear bright until you hear them speak + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.016 b/7.2.016 new file mode 100644 index 00000000..03d5207f --- /dev/null +++ b/7.2.016 @@ -0,0 +1,166 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.016 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.016 +Problem: The pattern being completed may be in freed memory when the + command line is being reallocated. (Dominique Pelle) +Solution: Keep a pointer to the expand_T in the command line structure. + Don't use as CTRL-P when there are no results. Clear the + completion when using a command line from the history. +Files: src/ex_getln.c + + +*** ../vim-7.2.015/src/ex_getln.c Fri Aug 8 12:58:59 2008 +--- src/ex_getln.c Wed Sep 10 22:43:41 2008 +*************** +*** 31,36 **** +--- 31,38 ---- + int cmdattr; /* attributes for prompt */ + int overstrike; /* Typing mode on the command line. Shared by + getcmdline() and put_on_cmdline(). */ ++ expand_T *xpc; /* struct being used for expansion, xp_pattern ++ may point into cmdbuff */ + int xp_context; /* type of expansion */ + # ifdef FEAT_EVAL + char_u *xp_arg; /* user-defined expansion arg */ +*************** +*** 38,44 **** + # endif + }; + +! static struct cmdline_info ccline; /* current cmdline_info */ + + static int cmd_showtail; /* Only show path tail in lists ? */ + +--- 40,50 ---- + # endif + }; + +! /* The current cmdline_info. It is initialized in getcmdline() and after that +! * used by other functions. When invoking getcmdline() recursively it needs +! * to be saved with save_cmdline() and restored with restore_cmdline(). +! * TODO: make it local to getcmdline() and pass it around. */ +! static struct cmdline_info ccline; + + static int cmd_showtail; /* Only show path tail in lists ? */ + +*************** +*** 238,243 **** +--- 244,250 ---- + } + + ExpandInit(&xpc); ++ ccline.xpc = &xpc; + + #ifdef FEAT_RIGHTLEFT + if (curwin->w_p_rl && *curwin->w_p_rlc == 's' +*************** +*** 408,416 **** + #endif + + /* +! * works like CTRL-P (unless 'wc' is ). + */ +! if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles != -1) + c = Ctrl_P; + + #ifdef FEAT_WILDMENU +--- 415,424 ---- + #endif + + /* +! * When there are matching completions to select works like +! * CTRL-P (unless 'wc' is ). + */ +! if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles > 0) + c = Ctrl_P; + + #ifdef FEAT_WILDMENU +*************** +*** 1513,1518 **** +--- 1521,1527 ---- + int old_firstc; + + vim_free(ccline.cmdbuff); ++ xpc.xp_context = EXPAND_NOTHING; + if (hiscnt == hislen) + p = lookfor; /* back to the old one */ + else +*************** +*** 1839,1844 **** +--- 1848,1854 ---- + #endif + + ExpandCleanup(&xpc); ++ ccline.xpc = NULL; + + #ifdef FEAT_SEARCH_EXTRA + if (did_incsearch) +*************** +*** 2508,2513 **** +--- 2518,2537 ---- + } + mch_memmove(ccline.cmdbuff, p, (size_t)ccline.cmdlen + 1); + vim_free(p); ++ ++ if (ccline.xpc != NULL ++ && ccline.xpc->xp_pattern != NULL ++ && ccline.xpc->xp_context != EXPAND_NOTHING ++ && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL) ++ { ++ int i = ccline.xpc->xp_pattern - p; ++ ++ /* If xp_pattern points inside the old cmdbuff it needs to be adjusted ++ * to point into the newly allocated memory. */ ++ if (i >= 0 && i <= ccline.cmdlen) ++ ccline.xpc->xp_pattern = ccline.cmdbuff + i; ++ } ++ + return OK; + } + +*************** +*** 2875,2880 **** +--- 2899,2905 ---- + prev_ccline = ccline; + ccline.cmdbuff = NULL; + ccline.cmdprompt = NULL; ++ ccline.xpc = NULL; + } + + /* +*************** +*** 3582,3587 **** +--- 3607,3613 ---- + ExpandInit(xp) + expand_T *xp; + { ++ xp->xp_pattern = NULL; + xp->xp_backslash = XP_BS_NONE; + #ifndef BACKSLASH_IN_FILENAME + xp->xp_shell = FALSE; +*** ../vim-7.2.015/src/version.c Wed Sep 10 18:25:18 2008 +--- src/version.c Sun Sep 14 14:38:47 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 16, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +53. To find out what time it is, you send yourself an e-mail and check the + "Date:" field. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.017 b/7.2.017 new file mode 100644 index 00000000..99979a15 --- /dev/null +++ b/7.2.017 @@ -0,0 +1,162 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.017 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.017 +Problem: strlen() used on text that may not end in a NUL. (Dominique Pelle) + Pasting a very big selection doesn't work. +Solution: Use the length passed to the XtSelectionCallbackProc() function. + After getting the SelectionNotify event continue dispatching + events until the callback is actually called. Also dispatch the + PropertyNotify event. +Files: src/ui.c + + +*** ../vim-7.2.016/src/ui.c Sun Sep 7 21:47:51 2008 +--- src/ui.c Sun Sep 14 15:52:19 2008 +*************** +*** 2020,2026 **** + + if (value == NULL || *length == 0) + { +! clip_free_selection(cbd); /* ??? [what's the query?] */ + *(int *)success = FALSE; + return; + } +--- 2020,2026 ---- + + if (value == NULL || *length == 0) + { +! clip_free_selection(cbd); /* nothing received, clear register */ + *(int *)success = FALSE; + return; + } +*************** +*** 2076,2082 **** + text_prop.value = (unsigned char *)value; + text_prop.encoding = *type; + text_prop.format = *format; +! text_prop.nitems = STRLEN(value); + status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop, + &text_list, &n_text); + if (status != Success || n_text < 1) +--- 2076,2082 ---- + text_prop.value = (unsigned char *)value; + text_prop.encoding = *type; + text_prop.format = *format; +! text_prop.nitems = len; + status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop, + &text_list, &n_text); + if (status != Success || n_text < 1) +*************** +*** 2131,2137 **** + case 3: type = text_atom; break; + default: type = XA_STRING; + } +! success = FALSE; + XtGetSelectionValue(myShell, cbd->sel_atom, type, + clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime); + +--- 2131,2137 ---- + case 3: type = text_atom; break; + default: type = XA_STRING; + } +! success = MAYBE; + XtGetSelectionValue(myShell, cbd->sel_atom, type, + clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime); + +*************** +*** 2145,2169 **** + * paste! Don't worry, we will catch up with any other events later. + */ + start_time = time(NULL); +! for (;;) + { +! if (XCheckTypedEvent(dpy, SelectionNotify, &event)) + { +! /* this is where clip_x11_request_selection_cb() is actually +! * called */ + XtDispatchEvent(&event); +! break; + } +- if (XCheckTypedEvent(dpy, SelectionRequest, &event)) +- /* We may get a SelectionRequest here and if we don't handle +- * it we hang. KDE klipper does this, for example. */ +- XtDispatchEvent(&event); + + /* Time out after 2 to 3 seconds to avoid that we hang when the + * other process doesn't respond. Note that the SelectionNotify + * event may still come later when the selection owner comes back +! * to life and the text gets inserted unexpectedly (by xterm). +! * Don't know how to avoid that :-(. */ + if (time(NULL) > start_time + 2) + { + timed_out = TRUE; +--- 2145,2171 ---- + * paste! Don't worry, we will catch up with any other events later. + */ + start_time = time(NULL); +! while (success == MAYBE) + { +! if (XCheckTypedEvent(dpy, SelectionNotify, &event) +! || XCheckTypedEvent(dpy, SelectionRequest, &event) +! || XCheckTypedEvent(dpy, PropertyNotify, &event)) + { +! /* This is where clip_x11_request_selection_cb() should be +! * called. It may actually happen a bit later, so we loop +! * until "success" changes. +! * We may get a SelectionRequest here and if we don't handle +! * it we hang. KDE klipper does this, for example. +! * We need to handle a PropertyNotify for large selections. */ + XtDispatchEvent(&event); +! continue; + } + + /* Time out after 2 to 3 seconds to avoid that we hang when the + * other process doesn't respond. Note that the SelectionNotify + * event may still come later when the selection owner comes back +! * to life and the text gets inserted unexpectedly. Don't know +! * why that happens or how to avoid that :-(. */ + if (time(NULL) > start_time + 2) + { + timed_out = TRUE; +*************** +*** 2177,2183 **** + ui_delay(1L, TRUE); + } + +! if (success) + return; + + /* don't do a retry with another type after timing out, otherwise we +--- 2179,2185 ---- + ui_delay(1L, TRUE); + } + +! if (success == TRUE) + return; + + /* don't do a retry with another type after timing out, otherwise we +*** ../vim-7.2.016/src/version.c Sun Sep 14 14:41:44 2008 +--- src/version.c Sun Sep 14 15:55:34 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 17, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +54. You start tilting your head sideways to smile. :-) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.018 b/7.2.018 new file mode 100644 index 00000000..b195f09d --- /dev/null +++ b/7.2.018 @@ -0,0 +1,45 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.018 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.018 +Problem: Memory leak when substitute is aborted. +Solution: Free the buffer allocated for the new text. (Dominique Pelle) +Files: src/ex_cmds.c + + +*** ../vim-7.2.017/src/ex_cmds.c Wed Aug 6 15:03:07 2008 +--- src/ex_cmds.c Sun Sep 14 13:45:03 2008 +*************** +*** 5059,5064 **** +--- 5059,5065 ---- + + if (did_sub) + ++sub_nlines; ++ vim_free(new_start); /* for when substitute was cancelled */ + vim_free(sub_firstline); /* free the copy of the original line */ + sub_firstline = NULL; + } +*** ../vim-7.2.017/src/version.c Sun Sep 14 15:57:54 2008 +--- src/version.c Sun Sep 14 21:38:25 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 18, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +55. You ask your doctor to implant a gig in your brain. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.019 b/7.2.019 new file mode 100644 index 00000000..4404bca4 --- /dev/null +++ b/7.2.019 @@ -0,0 +1,65 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.019 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.019 +Problem: Completion of ":noautocmd" doesn't work and exists(":noautocmd") + returns zero. (Ben Fritz) +Solution: Add "noautocmd" to the list of modifiers and commands. +Files: src/ex_cmds.h, src/ex_docmd.c + + +*** ../vim-7.2.018/src/ex_cmds.h Wed Jun 25 00:44:40 2008 +--- src/ex_cmds.h Sat Sep 13 18:37:25 2008 +*************** +*** 635,640 **** +--- 635,642 ---- + RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), + EX(CMD_noremap, "noremap", ex_map, + BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), ++ EX(CMD_noautocmd, "noautocmd", ex_wrongmodifier, ++ NEEDARG|EXTRA|NOTRLCOM), + EX(CMD_nohlsearch, "nohlsearch", ex_nohlsearch, + TRLBAR|SBOXOK|CMDWIN), + EX(CMD_noreabbrev, "noreabbrev", ex_abbreviate, +*** ../vim-7.2.018/src/ex_docmd.c Sat Jul 26 16:04:39 2008 +--- src/ex_docmd.c Mon Sep 15 20:04:53 2008 +*************** +*** 2978,2983 **** +--- 2979,2985 ---- + {"keepmarks", 3, FALSE}, + {"leftabove", 5, FALSE}, + {"lockmarks", 3, FALSE}, ++ {"noautocmd", 3, FALSE}, + {"rightbelow", 6, FALSE}, + {"sandbox", 3, FALSE}, + {"silent", 3, FALSE}, +*** ../vim-7.2.018/src/version.c Sun Sep 14 21:40:26 2008 +--- src/version.c Thu Sep 18 12:39:56 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 19, + /**/ + +-- +Proof techniques #2: Proof by Oddity. + SAMPLE: To prove that horses have an infinite number of legs. +(1) Horses have an even number of legs. +(2) They have two legs in back and fore legs in front. +(3) This makes a total of six legs, which certainly is an odd number of + legs for a horse. +(4) But the only number that is both odd and even is infinity. +(5) Therefore, horses must have an infinite number of legs. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.020 b/7.2.020 new file mode 100644 index 00000000..fb290407 --- /dev/null +++ b/7.2.020 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.020 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.020 +Problem: Starting the GUI when the executable starts with 'k', but the KDE + version no longer exists. +Solution: Don't have "kvim" start the GUI. +Files: src/main.c + + +*** ../vim-7.2.019/src/main.c Thu Jul 24 19:34:23 2008 +--- src/main.c Sun Sep 14 13:26:10 2008 +*************** +*** 1457,1463 **** + ++initstr; + } + +! if (TOLOWER_ASC(initstr[0]) == 'g' || initstr[0] == 'k') + { + main_start_gui(); + #ifdef FEAT_GUI +--- 1458,1465 ---- + ++initstr; + } + +! /* "gvim" starts the GUI. Also accept "Gvim" for MS-Windows. */ +! if (TOLOWER_ASC(initstr[0]) == 'g') + { + main_start_gui(); + #ifdef FEAT_GUI +*** ../vim-7.2.019/src/version.c Thu Sep 18 12:43:21 2008 +--- src/version.c Thu Sep 18 20:54:10 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 20, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +90. Instead of calling you to dinner, your spouse sends e-mail. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.021 b/7.2.021 new file mode 100644 index 00000000..fee0bd85 --- /dev/null +++ b/7.2.021 @@ -0,0 +1,147 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.021 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.021 +Problem: When executing autocommands getting the full file name may be + slow. (David Kotchan) +Solution: Postpone calling FullName_save() until autocmd_fname is used. +Files: src/ex_docmd.c, src/fileio.c, src/globals.h + + +*** ../vim-7.2.020/src/ex_docmd.c Thu Sep 18 12:43:21 2008 +--- src/ex_docmd.c Mon Sep 15 20:04:53 2008 +*************** +*** 9542,9547 **** +--- 9569,9583 ---- + #ifdef FEAT_AUTOCMD + case SPEC_AFILE: /* file name for autocommand */ + result = autocmd_fname; ++ if (result != NULL && !autocmd_fname_full) ++ { ++ /* Still need to turn the fname into a full path. It is ++ * postponed to avoid a delay when is not used. */ ++ autocmd_fname_full = TRUE; ++ result = FullName_save(autocmd_fname, FALSE); ++ vim_free(autocmd_fname); ++ autocmd_fname = result; ++ } + if (result == NULL) + { + *errormsg = (char_u *)_("E495: no autocommand file name to substitute for \"\""); +*** ../vim-7.2.020/src/fileio.c Wed Aug 6 18:43:07 2008 +--- src/fileio.c Tue Sep 16 21:24:26 2008 +*************** +*** 8523,8528 **** +--- 8523,8529 ---- + char_u *save_sourcing_name; + linenr_T save_sourcing_lnum; + char_u *save_autocmd_fname; ++ int save_autocmd_fname_full; + int save_autocmd_bufnr; + char_u *save_autocmd_match; + int save_autocmd_busy; +*************** +*** 8601,8606 **** +--- 8602,8608 ---- + * Save the autocmd_* variables and info about the current buffer. + */ + save_autocmd_fname = autocmd_fname; ++ save_autocmd_fname_full = autocmd_fname_full; + save_autocmd_bufnr = autocmd_bufnr; + save_autocmd_match = autocmd_match; + save_autocmd_busy = autocmd_busy; +*************** +*** 8618,8631 **** + if (fname != NULL && *fname != NUL) + autocmd_fname = fname; + else if (buf != NULL) +! autocmd_fname = buf->b_fname; + else + autocmd_fname = NULL; + } + else + autocmd_fname = fname_io; + if (autocmd_fname != NULL) +! autocmd_fname = FullName_save(autocmd_fname, FALSE); + + /* + * Set the buffer number to be used for . +--- 8620,8634 ---- + if (fname != NULL && *fname != NUL) + autocmd_fname = fname; + else if (buf != NULL) +! autocmd_fname = buf->b_ffname; + else + autocmd_fname = NULL; + } + else + autocmd_fname = fname_io; + if (autocmd_fname != NULL) +! autocmd_fname = vim_strsave(autocmd_fname); +! autocmd_fname_full = FALSE; /* call FullName_save() later */ + + /* + * Set the buffer number to be used for . +*************** +*** 8810,8815 **** +--- 8813,8819 ---- + sourcing_lnum = save_sourcing_lnum; + vim_free(autocmd_fname); + autocmd_fname = save_autocmd_fname; ++ autocmd_fname_full = save_autocmd_fname_full; + autocmd_bufnr = save_autocmd_bufnr; + autocmd_match = save_autocmd_match; + #ifdef FEAT_EVAL +*************** +*** 8918,8924 **** + { + apc->curpat = NULL; + +! /* only use a pattern when it has not been removed, has commands and + * the group matches. For buffer-local autocommands only check the + * buffer number. */ + if (ap->pat != NULL && ap->cmds != NULL +--- 8922,8928 ---- + { + apc->curpat = NULL; + +! /* Only use a pattern when it has not been removed, has commands and + * the group matches. For buffer-local autocommands only check the + * buffer number. */ + if (ap->pat != NULL && ap->cmds != NULL +*** ../vim-7.2.020/src/globals.h Sat Jul 26 16:04:49 2008 +--- src/globals.h Mon Sep 15 19:59:28 2008 +*************** +*** 1022,1027 **** +--- 1022,1028 ---- + #endif + #ifdef FEAT_AUTOCMD + EXTERN char_u *autocmd_fname INIT(= NULL); /* fname for on cmdline */ ++ EXTERN int autocmd_fname_full; /* autocmd_fname is full path */ + EXTERN int autocmd_bufnr INIT(= 0); /* fnum for on cmdline */ + EXTERN char_u *autocmd_match INIT(= NULL); /* name for on cmdline */ + EXTERN int did_cursorhold INIT(= FALSE); /* set when CursorHold t'gerd */ +*** ../vim-7.2.020/src/version.c Thu Sep 18 20:55:19 2008 +--- src/version.c Thu Sep 18 21:24:30 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 21, + /**/ + +-- +From "know your smileys": + :----} You lie like Pinocchio + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.022 b/7.2.022 new file mode 100644 index 00000000..39277352 --- /dev/null +++ b/7.2.022 @@ -0,0 +1,140 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.022 (extra) +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.022 (extra) +Problem: Testing is not possible when compiling with MingW. +Solution: Add a MingW specific test Makefile. (Bill McCarthy) +Files: Filelist, src/testdir/Make_ming.mak + + +*** ../vim-7.2.021/Filelist Sun Jul 13 19:33:31 2008 +--- Filelist Sun Sep 14 21:47:01 2008 +*************** +*** 285,290 **** +--- 285,291 ---- + src/proto/os_win32.pro \ + src/proto/os_mswin.pro \ + src/testdir/Make_dos.mak \ ++ src/testdir/Make_ming.mak \ + src/testdir/dos.vim \ + src/uninstal.c \ + src/vim.def \ +*** ../vim-7.2.021/src/testdir/Make_ming.mak Sat Sep 20 16:25:06 2008 +--- src/testdir/Make_ming.mak Sat Sep 20 16:25:58 2008 +*************** +*** 0 **** +--- 1,91 ---- ++ # Makefile to run tests for Vim, on Dos-like machines ++ # with sh.exe or zsh.exe in the path or not. ++ # ++ # Author: Bill McCarthy ++ # ++ # Note that test54 has been removed until it is fixed. ++ # ++ # Requires a set of Unix tools: echo, diff, etc. ++ ++ ifneq (sh.exe, $(SHELL)) ++ DEL = rm -f ++ MV = mv ++ CP = cp ++ DIRSLASH = / ++ else ++ DEL = del ++ MV = rename ++ CP = copy ++ DIRSLASH = \\ ++ endif ++ ++ VIMPROG = ..$(DIRSLASH)vim ++ ++ # Omitted: ++ # test2 "\\tmp" doesn't work. ++ # test10 'errorformat' is different ++ # test12 can't unlink a swap file ++ # test25 uses symbolic link ++ # test27 can't edit file with "*" in file name ++ # test31 16 bit version runs out of memory... ++ ++ SCRIPTS16 = test1.out test19.out test20.out test22.out \ ++ test23.out test24.out test28.out test29.out \ ++ test35.out test36.out test43.out \ ++ test44.out test45.out test46.out test47.out \ ++ test48.out test51.out test53.out \ ++ test55.out test56.out test57.out test58.out test59.out \ ++ test60.out test61.out test62.out test63.out test64.out ++ ++ # Had to remove test54 which doesn't work yet. ++ # test54.out ++ ++ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \ ++ test8.out test9.out test11.out test13.out test14.out \ ++ test15.out test17.out test18.out test21.out test26.out \ ++ test30.out test31.out test32.out test33.out test34.out \ ++ test37.out test38.out test39.out test40.out test41.out \ ++ test42.out test52.out test65.out ++ ++ SCRIPTS32 = test50.out ++ ++ SCRIPTS_GUI = test16.out ++ ++ .SUFFIXES: .in .out ++ ++ vimall: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS32) ++ echo ALL DONE ++ ++ nongui: fixff $(SCRIPTS16) $(SCRIPTS) ++ echo ALL DONE ++ ++ small: ++ echo ALL DONE ++ ++ gui: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI) ++ echo ALL DONE ++ ++ win32: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS32) ++ echo ALL DONE ++ ++ fixff: ++ -$(VIMPROG) -u dos.vim --noplugin "+argdo set ff=dos|upd" +q *.in *.ok ++ ++ clean: ++ -$(DEL) *.out ++ -$(DEL) test.ok ++ -$(DEL) small.vim ++ -$(DEL) tiny.vim ++ -$(DEL) mbyte.vim ++ -$(DEL) X* ++ -$(DEL) viminfo ++ ++ .in.out: ++ $(CP) $*.ok test.ok ++ $(VIMPROG) -u dos.vim -U NONE --noplugin -s dotest.in $*.in ++ diff test.out $*.ok ++ -$(DEL) $*.out ++ $(MV) test.out $*.out ++ -$(DEL) X* ++ -$(DEL) test.ok ++ -$(DEL) viminfo +*** ../vim-7.2.021/src/version.c Thu Sep 18 21:29:07 2008 +--- src/version.c Sat Sep 20 16:25:16 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 22, + /**/ + +-- +Where do you want to crash today? + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.023 b/7.2.023 new file mode 100644 index 00000000..0f6ad1e1 --- /dev/null +++ b/7.2.023 @@ -0,0 +1,65 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.023 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.023 +Problem: 'cursorcolumn' is in the wrong place in a closed fold when the + display is shifted left. (Gary Johnson) +Solution: Subtract w_skipcol or w_leftcol when needed. +Files: src/screen.c + + +*** ../vim-7.2.022/src/screen.c Thu Jul 24 20:29:09 2008 +--- src/screen.c Fri Sep 26 21:23:06 2008 +*************** +*** 2439,2447 **** + + #ifdef FEAT_SYN_HL + /* Show 'cursorcolumn' in the fold line. */ +! if (wp->w_p_cuc && (int)wp->w_virtcol + txtcol < W_WIDTH(wp)) +! ScreenAttrs[off + wp->w_virtcol + txtcol] = hl_combine_attr( +! ScreenAttrs[off + wp->w_virtcol + txtcol], hl_attr(HLF_CUC)); + #endif + + SCREEN_LINE(row + W_WINROW(wp), W_WINCOL(wp), (int)W_WIDTH(wp), +--- 2439,2455 ---- + + #ifdef FEAT_SYN_HL + /* Show 'cursorcolumn' in the fold line. */ +! if (wp->w_p_cuc) +! { +! txtcol += wp->w_virtcol; +! if (wp->w_p_wrap) +! txtcol -= wp->w_skipcol; +! else +! txtcol -= wp->w_leftcol; +! if (txtcol >= 0 && txtcol < W_WIDTH(wp)) +! ScreenAttrs[off + txtcol] = hl_combine_attr( +! ScreenAttrs[off + txtcol], hl_attr(HLF_CUC)); +! } + #endif + + SCREEN_LINE(row + W_WINROW(wp), W_WINCOL(wp), (int)W_WIDTH(wp), +*** ../vim-7.2.022/src/version.c Sat Sep 20 16:26:10 2008 +--- src/version.c Wed Oct 1 21:07:31 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 23, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +124. You begin conversations with, "Who is your internet service provider?" + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.024 b/7.2.024 new file mode 100644 index 00000000..033b0a26 --- /dev/null +++ b/7.2.024 @@ -0,0 +1,50 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.024 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.024 +Problem: It's possible to set 'history' to a negative value and that causes + an out-of-memory error. +Solution: Check that 'history' has a positive value. (Doug Kearns) +Files: src/option.c + + +*** ../vim-7.2.023/src/option.c Thu Jul 24 18:45:15 2008 +--- src/option.c Fri Sep 26 22:20:20 2008 +*************** +*** 7974,7979 **** +--- 7974,7984 ---- + else /* curwin->w_p_scr > curwin->w_height */ + curwin->w_p_scr = curwin->w_height; + } ++ if (p_hi < 0) ++ { ++ errmsg = e_positive; ++ p_hi = 0; ++ } + if (p_report < 0) + { + errmsg = e_positive; +*** ../vim-7.2.023/src/version.c Wed Oct 1 21:09:02 2008 +--- src/version.c Thu Oct 2 22:47:22 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 24, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +127. You bring your laptop and cellular phone to church. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.025 b/7.2.025 new file mode 100644 index 00000000..dab2cc86 --- /dev/null +++ b/7.2.025 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.025 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.025 +Problem: When a CursorHold event invokes system() it is retriggered over + and over again. +Solution: Don't reset did_cursorhold when getting K_IGNORE. +Files: src/normal.c + + +*** ../vim-7.2.024/src/normal.c Sat Sep 6 16:44:06 2008 +--- src/normal.c Sat Sep 27 13:03:34 2008 +*************** +*** 1132,1138 **** + out_flush(); + #endif + #ifdef FEAT_AUTOCMD +! did_cursorhold = FALSE; + #endif + + State = NORMAL; +--- 1132,1139 ---- + out_flush(); + #endif + #ifdef FEAT_AUTOCMD +! if (ca.cmdchar != K_IGNORE) +! did_cursorhold = FALSE; + #endif + + State = NORMAL; +*** ../vim-7.2.024/src/version.c Thu Oct 2 22:48:01 2008 +--- src/version.c Thu Oct 2 22:54:41 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 25, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +128. You can access the Net -- via your portable and cellular phone. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.026 b/7.2.026 new file mode 100644 index 00000000..ec8b1c7b --- /dev/null +++ b/7.2.026 @@ -0,0 +1,105 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.026 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.026 (after 7.2.010) +Problem: "K" doesn't use the length of the identifier but uses the rest of + the line. +Solution: Copy the desired number of characters first. +Files: src/normal.c + + +*** ../vim-7.2.025/src/normal.c Thu Oct 2 22:55:17 2008 +--- src/normal.c Sat Nov 1 13:41:03 2008 +*************** +*** 183,188 **** +--- 183,190 ---- + static void nv_cursorhold __ARGS((cmdarg_T *cap)); + #endif + ++ static char *e_noident = N_("E349: No identifier under cursor"); ++ + /* + * Function to be called for a Normal or Visual mode command. + * The argument is a cmdarg_T. +*************** +*** 3510,3516 **** + if (find_type & FIND_STRING) + EMSG(_("E348: No string under cursor")); + else +! EMSG(_("E349: No identifier under cursor")); + return 0; + } + ptr += col; +--- 3512,3518 ---- + if (find_type & FIND_STRING) + EMSG(_("E348: No string under cursor")); + else +! EMSG(_(e_noident)); + return 0; + } + ptr += col; +*************** +*** 5472,5479 **** + { + /* An external command will probably use an argument starting + * with "-" as an option. To avoid trouble we skip the "-". */ +! while (*ptr == '-') + ++ptr; + + /* When a count is given, turn it into a range. Is this + * really what we want? */ +--- 5474,5490 ---- + { + /* An external command will probably use an argument starting + * with "-" as an option. To avoid trouble we skip the "-". */ +! while (*ptr == '-' && n > 0) +! { + ++ptr; ++ --n; ++ } ++ if (n == 0) ++ { ++ EMSG(_(e_noident)); /* found dashes only */ ++ vim_free(buf); ++ return; ++ } + + /* When a count is given, turn it into a range. Is this + * really what we want? */ +*************** +*** 5520,5526 **** +--- 5531,5539 ---- + if (cmdchar == 'K' && !kp_help) + { + /* Escape the argument properly for a shell command */ ++ ptr = vim_strnsave(ptr, n); + p = vim_strsave_shellescape(ptr, TRUE); ++ vim_free(ptr); + if (p == NULL) + { + vim_free(buf); +*** ../vim-7.2.025/src/version.c Thu Oct 2 22:55:17 2008 +--- src/version.c Sat Nov 1 13:50:53 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 26, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +161. You get up before the sun rises to check your e-mail, and you + find yourself in the very same chair long after the sun has set. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.027 b/7.2.027 new file mode 100644 index 00000000..59d708d2 --- /dev/null +++ b/7.2.027 @@ -0,0 +1,98 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.027 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.027 +Problem: Can use cscope commands in the sandbox. +Solution: Disallow them, they might not be safe. +Files: src/ex_cmds.h + + +*** ../vim-7.2.026/src/ex_cmds.h Thu Sep 18 12:43:21 2008 +--- src/ex_cmds.h Thu Sep 18 22:18:14 2008 +*************** +*** 278,284 **** + EX(CMD_crewind, "crewind", ex_cc, + RANGE|NOTADR|COUNT|TRLBAR|BANG), + EX(CMD_cscope, "cscope", do_cscope, +! EXTRA|NOTRLCOM|SBOXOK|XFILE), + EX(CMD_cstag, "cstag", do_cstag, + BANG|TRLBAR|WORD1), + EX(CMD_cunmap, "cunmap", ex_unmap, +--- 278,284 ---- + EX(CMD_crewind, "crewind", ex_cc, + RANGE|NOTADR|COUNT|TRLBAR|BANG), + EX(CMD_cscope, "cscope", do_cscope, +! EXTRA|NOTRLCOM|XFILE), + EX(CMD_cstag, "cstag", do_cstag, + BANG|TRLBAR|WORD1), + EX(CMD_cunmap, "cunmap", ex_unmap, +*************** +*** 506,512 **** + EX(CMD_lclose, "lclose", ex_cclose, + RANGE|NOTADR|COUNT|TRLBAR), + EX(CMD_lcscope, "lcscope", do_cscope, +! EXTRA|NOTRLCOM|SBOXOK|XFILE), + EX(CMD_left, "left", ex_align, + TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY), + EX(CMD_leftabove, "leftabove", ex_wrongmodifier, +--- 506,512 ---- + EX(CMD_lclose, "lclose", ex_cclose, + RANGE|NOTADR|COUNT|TRLBAR), + EX(CMD_lcscope, "lcscope", do_cscope, +! EXTRA|NOTRLCOM|XFILE), + EX(CMD_left, "left", ex_align, + TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY), + EX(CMD_leftabove, "leftabove", ex_wrongmodifier, +*************** +*** 653,658 **** +--- 653,660 ---- + EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), + EX(CMD_open, "open", ex_open, + RANGE|EXTRA), ++ EX(CMD_oldfiles, "oldfiles", ex_oldfiles, ++ BANG|TRLBAR|SBOXOK|CMDWIN), + EX(CMD_omap, "omap", ex_map, + EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), + EX(CMD_omapclear, "omapclear", ex_mapclear, +*************** +*** 804,810 **** + EX(CMD_scriptencoding, "scriptencoding", ex_scriptencoding, + WORD1|TRLBAR|CMDWIN), + EX(CMD_scscope, "scscope", do_scscope, +! EXTRA|NOTRLCOM|SBOXOK), + EX(CMD_set, "set", ex_set, + TRLBAR|EXTRA|CMDWIN|SBOXOK), + EX(CMD_setfiletype, "setfiletype", ex_setfiletype, +--- 806,812 ---- + EX(CMD_scriptencoding, "scriptencoding", ex_scriptencoding, + WORD1|TRLBAR|CMDWIN), + EX(CMD_scscope, "scscope", do_scscope, +! EXTRA|NOTRLCOM), + EX(CMD_set, "set", ex_set, + TRLBAR|EXTRA|CMDWIN|SBOXOK), + EX(CMD_setfiletype, "setfiletype", ex_setfiletype, +*** ../vim-7.2.026/src/version.c Sat Nov 1 13:51:57 2008 +--- src/version.c Thu Nov 6 10:21:21 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 27, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +179. You wonder why your household garbage can doesn't have an + "empty recycle bin" button. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.028 b/7.2.028 new file mode 100644 index 00000000..4f148e96 --- /dev/null +++ b/7.2.028 @@ -0,0 +1,53 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.028 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.028 +Problem: Confusing error message for missing (). +Solution: Change "braces" to "parentheses". (Gary Johnson) +Files: src/eval.c + + +*** ../vim-7.2.027/src/eval.c Wed Sep 10 15:38:13 2008 +--- src/eval.c Tue Sep 30 21:43:38 2008 +*************** +*** 3287,3293 **** + + if (*startarg != '(') + { +! EMSG2(_("E107: Missing braces: %s"), eap->arg); + goto end; + } + +--- 3293,3299 ---- + + if (*startarg != '(') + { +! EMSG2(_("E107: Missing parentheses: %s"), eap->arg); + goto end; + } + +*** ../vim-7.2.027/src/version.c Thu Nov 6 10:23:03 2008 +--- src/version.c Thu Nov 6 11:02:51 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 28, + /**/ + +-- +Wizards had always known that the act of observation changed the thing that +was observed, and sometimes forgot that it also changed the observer too. + Terry Pratchett - Interesting times + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.029 b/7.2.029 new file mode 100644 index 00000000..56e847a7 --- /dev/null +++ b/7.2.029 @@ -0,0 +1,44 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.029 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.029 +Problem: No completion for ":doautoall". +Solution: Complete ":doautoall" like ":doautocmd". (Doug Kearns) +Files: src/ex_docmd.c + + +*** ../vim-7.2.028/src/ex_docmd.c Thu Sep 18 21:29:07 2008 +--- src/ex_docmd.c Mon Nov 3 21:21:17 2008 +*************** +*** 3609,3614 **** +--- 3610,3616 ---- + return set_context_in_autocmd(xp, arg, FALSE); + + case CMD_doautocmd: ++ case CMD_doautoall: + return set_context_in_autocmd(xp, arg, TRUE); + #endif + case CMD_set: +*** ../vim-7.2.028/src/version.c Thu Nov 6 11:04:50 2008 +--- src/version.c Thu Nov 6 17:14:58 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 29, + /**/ + +-- +Press any key to continue, press any other key to quit. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.030 b/7.2.030 new file mode 100644 index 00000000..310207ed --- /dev/null +++ b/7.2.030 @@ -0,0 +1,51 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.030 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.030 (after 7.2.027) +Problem: Can't compile. +Solution: Remove prematurely added ex_oldfiles. +Files: src/ex_cmds.h + + +*** ../vim-7.2.029/src/ex_cmds.h Thu Nov 6 10:23:03 2008 +--- src/ex_cmds.h Thu Nov 6 20:45:07 2008 +*************** +*** 653,660 **** + EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), + EX(CMD_open, "open", ex_open, + RANGE|EXTRA), +- EX(CMD_oldfiles, "oldfiles", ex_oldfiles, +- BANG|TRLBAR|SBOXOK|CMDWIN), + EX(CMD_omap, "omap", ex_map, + EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), + EX(CMD_omapclear, "omapclear", ex_mapclear, +--- 653,658 ---- +*** ../vim-7.2.029/src/version.c Thu Nov 6 17:16:06 2008 +--- src/version.c Thu Nov 6 20:46:11 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 30, + /**/ + +-- +% cat /usr/include/sys/errno.h +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +[...] +#define EMACS 666 /* Too many macros */ +% + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.031 b/7.2.031 new file mode 100644 index 00000000..4b2bca70 --- /dev/null +++ b/7.2.031 @@ -0,0 +1,1281 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.031 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.031 +Problem: Information in the viminfo file about previously edited files is + not available to the user. There is no way to get a complete list + of files edited in previous Vim sessions. +Solution: Add v:oldfiles and fill it with the list of old file names when + first reading the viminfo file. Add the ":oldfiles" command, + ":browse oldfiles" and the "#<123" special file name. Increase + the default value for 'viminfo' from '20 to '100. +Files: runtime/doc/cmdline.txt, runtime/doc/eval.txt, + runtime/doc/starting.txt, runtime/doc/usr_21.txt, src/eval.c, + src/ex_cmds.c, src/ex_cmds.h, src/ex_docmd.c, src/feature.h, + src/fileio.c, src/main.c, src/mark.c, src/misc1.c, + src/proto/eval.pro, src/proto/ex_cmds.pro, src/proto/mark.pro, + src/option.c, src/structs.h, src/vim.h + + +*** ../vim-7.2.030/runtime/doc/cmdline.txt Sat Aug 9 19:36:46 2008 +--- runtime/doc/cmdline.txt Thu Sep 18 22:55:27 2008 +*************** +*** 1,4 **** +! *cmdline.txt* For Vim version 7.2. Last change: 2008 Jul 29 + + + VIM REFERENCE MANUAL by Bram Moolenaar +--- 1,4 ---- +! *cmdline.txt* For Vim version 7.2. Last change: 2008 Sep 18 + + + VIM REFERENCE MANUAL by Bram Moolenaar +*************** +*** 157,162 **** +--- 157,167 ---- + (doesn't work at the expression prompt; some + things such as changing the buffer or current + window are not allowed to avoid side effects) ++ When the result is a |List| the items are used ++ as lines. They can have line breaks inside ++ too. ++ When the result is a Float it's automatically ++ converted to a String. + See |registers| about registers. {not in Vi} + Implementation detail: When using the |expression| register + and invoking setcmdpos(), this sets the position before +*************** +*** 730,748 **** + In Ex commands, at places where a file name can be used, the following + characters have a special meaning. These can also be used in the expression + function expand() |expand()|. +! % is replaced with the current file name *:_%* +! # is replaced with the alternate file name *:_#* + #n (where n is a number) is replaced with the file name of +! buffer n. "#0" is the same as "#" +! ## is replaced with all names in the argument list *:_##* + concatenated, separated by spaces. Each space in a name + is preceded with a backslash. +! Note that these give the file name as it was typed. If an absolute path is +! needed (when using the file name from a different directory), you need to add +! ":p". See |filename-modifiers|. + Note that backslashes are inserted before spaces, so that the command will + correctly interpret the file name. But this doesn't happen for shell +! commands. For those you probably have to use quotes: > + :!ls "%" + :r !spell "%" + +--- 735,763 ---- + In Ex commands, at places where a file name can be used, the following + characters have a special meaning. These can also be used in the expression + function expand() |expand()|. +! % Is replaced with the current file name. *:_%* *c_%* +! # Is replaced with the alternate file name. *:_#* *c_#* + #n (where n is a number) is replaced with the file name of +! buffer n. "#0" is the same as "#". +! ## Is replaced with all names in the argument list *:_##* *c_##* + concatenated, separated by spaces. Each space in a name + is preceded with a backslash. +! # 0) is replaced with old *:_#<* *c_#<* +! file name n. See |:oldfiles| or |v:oldfiles| to get the +! number. *E809* +! {only when compiled with the +eval and +viminfo features} +! +! Note that these, except "# + :!ls "%" + :r !spell "%" + +*** ../vim-7.2.030/runtime/doc/eval.txt Sat Aug 9 19:36:47 2008 +--- runtime/doc/eval.txt Sun Nov 2 14:25:38 2008 +*************** +*** 1,4 **** +! *eval.txt* For Vim version 7.2. Last change: 2008 Aug 09 + + + VIM REFERENCE MANUAL by Bram Moolenaar +--- 1,4 ---- +! *eval.txt* For Vim version 7.2. Last change: 2008 Nov 02 + + + VIM REFERENCE MANUAL by Bram Moolenaar +*************** +*** 1484,1489 **** +--- 1484,1500 ---- + This is the screen column number, like with |virtcol()|. The + value is zero when there was no mouse button click. + ++ *v:oldfiles* *oldfiles-variable* ++ v:oldfiles List of file names that is loaded from the |viminfo| file on ++ startup. These are the files that Vim remembers marks for. ++ The length of the List is limited by the ' argument of the ++ 'viminfo' option (default is 100). ++ Also see |:oldfiles| and |c_#<|. ++ The List can be modified, but this has no effect on what is ++ stored in the |viminfo| file later. If you use values other ++ than String this will cause trouble. ++ {only when compiled with the +viminfo feature} ++ + *v:operator* *operator-variable* + v:operator The last operator given in Normal mode. This is a single + character except for commands starting with or , +*** ../vim-7.2.030/runtime/doc/starting.txt Sat Aug 9 19:36:52 2008 +--- runtime/doc/starting.txt Sun Nov 9 12:12:19 2008 +*************** +*** 1,4 **** +! *starting.txt* For Vim version 7.2. Last change: 2008 Jun 21 + + + VIM REFERENCE MANUAL by Bram Moolenaar +--- 1,4 ---- +! *starting.txt* For Vim version 7.2. Last change: 2008 Nov 09 + + + VIM REFERENCE MANUAL by Bram Moolenaar +*************** +*** 1337,1344 **** + *viminfo-read* + When Vim is started and the 'viminfo' option is non-empty, the contents of + the viminfo file are read and the info can be used in the appropriate places. +! The marks are not read in at startup (but file marks are). See +! |initialization| for how to set the 'viminfo' option upon startup. + + *viminfo-write* + When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo +--- 1335,1343 ---- + *viminfo-read* + When Vim is started and the 'viminfo' option is non-empty, the contents of + the viminfo file are read and the info can be used in the appropriate places. +! The |v:oldfiles| variable is filled. The marks are not read in at startup +! (but file marks are). See |initialization| for how to set the 'viminfo' +! option upon startup. + + *viminfo-write* + When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo +*************** +*** 1372,1377 **** +--- 1371,1378 ---- + that start with any string given with the "r" flag in 'viminfo'. This can be + used to avoid saving marks for files on removable media (for MS-DOS you would + use "ra:,rb:", for Amiga "rdf0:,rdf1:,rdf2:"). ++ The |v:oldfiles| variable is filled with the file names that the viminfo file ++ has marks for. + + *viminfo-file-marks* + Uppercase marks ('A to 'Z) are stored when writing the viminfo file. The +*************** +*** 1463,1470 **** + *:rv* *:rviminfo* *E195* + :rv[iminfo][!] [file] Read from viminfo file [file] (default: see above). + If [!] is given, then any information that is +! already set (registers, marks, etc.) will be +! overwritten. {not in Vi} + + *:wv* *:wviminfo* *E137* *E138* *E574* + :wv[iminfo][!] [file] Write to viminfo file [file] (default: see above). +--- 1464,1471 ---- + *:rv* *:rviminfo* *E195* + :rv[iminfo][!] [file] Read from viminfo file [file] (default: see above). + If [!] is given, then any information that is +! already set (registers, marks, |v:oldfiles|, etc.) +! will be overwritten {not in Vi} + + *:wv* *:wviminfo* *E137* *E138* *E574* + :wv[iminfo][!] [file] Write to viminfo file [file] (default: see above). +*************** +*** 1479,1482 **** +--- 1480,1499 ---- + the .viminfo file. + {not in Vi} + ++ *:ol* *:oldfiles* ++ :ol[dfiles] List the files that have marks stored in the viminfo ++ file. This list is read on startup and only changes ++ afterwards with ":rviminfo!". Also see |v:oldfiles|. ++ The number can be used with |c_#<|. ++ {not in Vi, only when compiled with the +eval feature} ++ ++ :bro[wse] ol[dfiles][!] ++ List file names as with |:oldfiles|, and then prompt ++ for a number. When the number is valid that file from ++ the list is edited. ++ If you get the |press-enter| prompt you can press "q" ++ and still get the prompt to enter a file number. ++ Use ! to abondon a modified buffer. |abandon| ++ {not when compiled with tiny or small features} ++ + vim:tw=78:ts=8:ft=help:norl: +*** ../vim-7.2.030/runtime/doc/usr_21.txt Sat Aug 9 19:36:53 2008 +--- runtime/doc/usr_21.txt Sun Nov 9 12:14:10 2008 +*************** +*** 1,4 **** +! *usr_21.txt* For Vim version 7.2. Last change: 2007 May 01 + + VIM USER MANUAL - by Bram Moolenaar + +--- 1,4 ---- +! *usr_21.txt* For Vim version 7.2. Last change: 2008 Nov 09 + + VIM USER MANUAL - by Bram Moolenaar + +*************** +*** 153,159 **** + to be lost. Each item can be remembered only once. + + +! GETTING BACK TO WHERE YOU WERE + + You are halfway editing a file and it's time to leave for holidays. You exit + Vim and go enjoy yourselves, forgetting all about your work. After a couple +--- 153,159 ---- + to be lost. Each item can be remembered only once. + + +! GETTING BACK TO WHERE YOU STOPPED VIM + + You are halfway editing a file and it's time to leave for holidays. You exit + Vim and go enjoy yourselves, forgetting all about your work. After a couple +*************** +*** 168,173 **** +--- 168,215 ---- + The |:marks| command is useful to find out where '0 to '9 will take you. + + ++ GETTING BACK TO SOME FILE ++ ++ If you want to go back to a file that you edited recently, but not when ++ exiting Vim, there is a slightly more complicated way. You can see a list of ++ files by typing the command: > ++ ++ :oldfiles ++ < 1: ~/.viminfo ~ ++ 2: ~/text/resume.txt ~ ++ 3: /tmp/draft ~ ++ ++ Now you would like to edit the second file, which is in the list preceded by ++ "2:". You type: > ++ ++ :e #<2 ++ ++ Instead of ":e" you can use any command that has a file name argument, the ++ "#<2" item works in the same place as "%" (current file name) and "#" ++ (alternate file name). So you can also split the window to edit the third ++ file: > ++ ++ :split #<3 ++ ++ That #<123 thing is a bit complicated when you just want to edit a file. ++ Fortunately there is a simpler way: > ++ ++ :browse oldfiles ++ < 1: ~/.viminfo ~ ++ 2: ~/text/resume.txt ~ ++ 3: /tmp/draft ~ ++ -- More -- ++ ++ You get the same list of files as with |:oldfiles|. If you want to edit ++ "resume.txt" first press "q" to stop the listing. You will get a prompt: ++ ++ Type number and (empty cancels): ~ ++ ++ Type "2" and press to edit the second file. ++ ++ More info at |:oldfiles|, |v:oldfiles| and |c_#<|. ++ ++ + MOVE INFO FROM ONE VIM TO ANOTHER + + You can use the ":wviminfo" and ":rviminfo" commands to save and restore the +*** ../vim-7.2.030/src/eval.c Thu Nov 6 11:04:50 2008 +--- src/eval.c Sun Nov 9 11:59:39 2008 +*************** +*** 348,353 **** +--- 348,354 ---- + {VV_NAME("mouse_col", VAR_NUMBER), 0}, + {VV_NAME("operator", VAR_STRING), VV_RO}, + {VV_NAME("searchforward", VAR_NUMBER), 0}, ++ {VV_NAME("oldfiles", VAR_LIST), 0}, + }; + + /* shorthand */ +*************** +*** 355,360 **** +--- 356,362 ---- + #define vv_nr vv_di.di_tv.vval.v_number + #define vv_float vv_di.di_tv.vval.v_float + #define vv_str vv_di.di_tv.vval.v_string ++ #define vv_list vv_di.di_tv.vval.v_list + #define vv_tv vv_di.di_tv + + /* +*************** +*** 426,432 **** + static long list_idx_of_item __ARGS((list_T *l, listitem_T *item)); + static void list_append __ARGS((list_T *l, listitem_T *item)); + static int list_append_tv __ARGS((list_T *l, typval_T *tv)); +- static int list_append_string __ARGS((list_T *l, char_u *str, int len)); + static int list_append_number __ARGS((list_T *l, varnumber_T n)); + static int list_insert_tv __ARGS((list_T *l, typval_T *tv, listitem_T *item)); + static int list_extend __ARGS((list_T *l1, list_T *l2, listitem_T *bef)); +--- 428,433 ---- +*************** +*** 845,852 **** + p = &vimvars[i]; + if (p->vv_di.di_tv.v_type == VAR_STRING) + { +! vim_free(p->vv_di.di_tv.vval.v_string); +! p->vv_di.di_tv.vval.v_string = NULL; + } + } + hash_clear(&vimvarht); +--- 846,858 ---- + p = &vimvars[i]; + if (p->vv_di.di_tv.v_type == VAR_STRING) + { +! vim_free(p->vv_string); +! p->vv_string = NULL; +! } +! else if (p->vv_di.di_tv.v_type == VAR_LIST) +! { +! list_unref(p->vv_list); +! p->vv_list = NULL; + } + } + hash_clear(&vimvarht); +*************** +*** 6057,6062 **** +--- 6063,6087 ---- + } + + /* ++ * Get list item "l[idx - 1]" as a string. Returns NULL for failure. ++ */ ++ char_u * ++ list_find_str(l, idx) ++ list_T *l; ++ long idx; ++ { ++ listitem_T *li; ++ ++ li = list_find(l, idx - 1); ++ if (li == NULL) ++ { ++ EMSGN(_(e_listidx), idx); ++ return NULL; ++ } ++ return get_tv_string(&li->li_tv); ++ } ++ ++ /* + * Locate "item" list "l" and return its index. + * Returns -1 when "item" is not in the list. + */ +*************** +*** 6147,6153 **** + * When "len" >= 0 use "str[len]". + * Returns FAIL when out of memory. + */ +! static int + list_append_string(l, str, len) + list_T *l; + char_u *str; +--- 6172,6178 ---- + * When "len" >= 0 use "str[len]". + * Returns FAIL when out of memory. + */ +! int + list_append_string(l, str, len) + list_T *l; + char_u *str; +*************** +*** 6507,6512 **** +--- 6532,6540 ---- + set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID); + } + ++ /* v: vars */ ++ set_ref_in_ht(&vimvarht, copyID); ++ + /* + * 2. Go through the list of dicts and free items without the copyID. + */ +*************** +*** 6597,6603 **** + { + case VAR_DICT: + dd = tv->vval.v_dict; +! if (dd->dv_copyID != copyID) + { + /* Didn't see this dict yet. */ + dd->dv_copyID = copyID; +--- 6625,6631 ---- + { + case VAR_DICT: + dd = tv->vval.v_dict; +! if (dd != NULL && dd->dv_copyID != copyID) + { + /* Didn't see this dict yet. */ + dd->dv_copyID = copyID; +*************** +*** 6607,6613 **** + + case VAR_LIST: + ll = tv->vval.v_list; +! if (ll->lv_copyID != copyID) + { + /* Didn't see this list yet. */ + ll->lv_copyID = copyID; +--- 6635,6641 ---- + + case VAR_LIST: + ll = tv->vval.v_list; +! if (ll != NULL && ll->lv_copyID != copyID) + { + /* Didn't see this list yet. */ + ll->lv_copyID = copyID; +*************** +*** 18106,18111 **** +--- 18134,18150 ---- + } + + /* ++ * Get List v: variable value. Caller must take care of reference count when ++ * needed. ++ */ ++ list_T * ++ get_vim_var_list(idx) ++ int idx; ++ { ++ return vimvars[idx].vv_list; ++ } ++ ++ /* + * Set v:count, v:count1 and v:prevcount. + */ + void +*************** +*** 18141,18146 **** +--- 18180,18199 ---- + } + + /* ++ * Set List v: variable to "val". ++ */ ++ void ++ set_vim_var_list(idx, val) ++ int idx; ++ list_T *val; ++ { ++ list_unref(vimvars[idx].vv_list); ++ vimvars[idx].vv_list = val; ++ if (val != NULL) ++ ++val->lv_refcount; ++ } ++ ++ /* + * Set v:register if needed. + */ + void +*************** +*** 21900,21905 **** +--- 21953,22014 ---- + } + } + ++ /* ++ * List v:oldfiles in a nice way. ++ */ ++ /*ARGSUSED*/ ++ void ++ ex_oldfiles(eap) ++ exarg_T *eap; ++ { ++ list_T *l = vimvars[VV_OLDFILES].vv_list; ++ listitem_T *li; ++ int nr = 0; ++ ++ if (l == NULL) ++ msg((char_u *)_("No old files")); ++ else ++ { ++ msg_start(); ++ msg_scroll = TRUE; ++ for (li = l->lv_first; li != NULL && !got_int; li = li->li_next) ++ { ++ msg_outnum((long)++nr); ++ MSG_PUTS(": "); ++ msg_outtrans(get_tv_string(&li->li_tv)); ++ msg_putchar('\n'); ++ out_flush(); /* output one line at a time */ ++ ui_breakcheck(); ++ } ++ /* Assume "got_int" was set to truncate the listing. */ ++ got_int = FALSE; ++ ++ #ifdef FEAT_BROWSE_CMD ++ if (cmdmod.browse) ++ { ++ quit_more = FALSE; ++ nr = prompt_for_number(FALSE); ++ msg_starthere(); ++ if (nr > 0) ++ { ++ char_u *p = list_find_str(get_vim_var_list(VV_OLDFILES), ++ (long)nr); ++ ++ if (p != NULL) ++ { ++ p = expand_env_save(p); ++ eap->arg = p; ++ eap->cmdidx = CMD_edit; ++ cmdmod.browse = FALSE; ++ do_exedit(eap, NULL); ++ vim_free(p); ++ } ++ } ++ } ++ #endif ++ } ++ } ++ + #endif /* FEAT_EVAL */ + + +*** ../vim-7.2.030/src/ex_cmds.c Sun Sep 14 21:40:26 2008 +--- src/ex_cmds.c Sun Sep 14 13:45:03 2008 +*************** +*** 24,30 **** + static void do_filter __ARGS((linenr_T line1, linenr_T line2, exarg_T *eap, char_u *cmd, int do_in, int do_out)); + #ifdef FEAT_VIMINFO + static char_u *viminfo_filename __ARGS((char_u *)); +! static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int want_info, int want_marks, int force_read)); + static int viminfo_encoding __ARGS((vir_T *virp)); + static int read_viminfo_up_to_marks __ARGS((vir_T *virp, int forceit, int writing)); + #endif +--- 24,30 ---- + static void do_filter __ARGS((linenr_T line1, linenr_T line2, exarg_T *eap, char_u *cmd, int do_in, int do_out)); + #ifdef FEAT_VIMINFO + static char_u *viminfo_filename __ARGS((char_u *)); +! static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int flags)); + static int viminfo_encoding __ARGS((vir_T *virp)); + static int read_viminfo_up_to_marks __ARGS((vir_T *virp, int forceit, int writing)); + #endif +*************** +*** 1676,1689 **** + + /* + * read_viminfo() -- Read the viminfo file. Registers etc. which are already +! * set are not over-written unless force is TRUE. -- webb + */ + int +! read_viminfo(file, want_info, want_marks, forceit) +! char_u *file; +! int want_info; +! int want_marks; +! int forceit; + { + FILE *fp; + char_u *fname; +--- 1676,1687 ---- + + /* + * read_viminfo() -- Read the viminfo file. Registers etc. which are already +! * set are not over-written unless "flags" includes VIF_FORCEIT. -- webb + */ + int +! read_viminfo(file, flags) +! char_u *file; /* file name or NULL to use default name */ +! int flags; /* VIF_WANT_INFO et al. */ + { + FILE *fp; + char_u *fname; +*************** +*** 1691,1697 **** + if (no_viminfo()) + return FAIL; + +! fname = viminfo_filename(file); /* may set to default if NULL */ + if (fname == NULL) + return FAIL; + fp = mch_fopen((char *)fname, READBIN); +--- 1689,1695 ---- + if (no_viminfo()) + return FAIL; + +! fname = viminfo_filename(file); /* get file name in allocated buffer */ + if (fname == NULL) + return FAIL; + fp = mch_fopen((char *)fname, READBIN); +*************** +*** 1701,1708 **** + verbose_enter(); + smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"), + fname, +! want_info ? _(" info") : "", +! want_marks ? _(" marks") : "", + fp == NULL ? _(" FAILED") : ""); + verbose_leave(); + } +--- 1699,1707 ---- + verbose_enter(); + smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"), + fname, +! (flags & VIF_WANT_INFO) ? _(" info") : "", +! (flags & VIF_WANT_MARKS) ? _(" marks") : "", +! (flags & VIF_GET_OLDFILES) ? _(" oldfiles") : "", + fp == NULL ? _(" FAILED") : ""); + verbose_leave(); + } +*************** +*** 1712,1721 **** + return FAIL; + + viminfo_errcnt = 0; +! do_viminfo(fp, NULL, want_info, want_marks, forceit); + + fclose(fp); +- + return OK; + } + +--- 1711,1719 ---- + return FAIL; + + viminfo_errcnt = 0; +! do_viminfo(fp, NULL, flags); + + fclose(fp); + return OK; + } + +*************** +*** 1968,1974 **** + } + + viminfo_errcnt = 0; +! do_viminfo(fp_in, fp_out, !forceit, !forceit, FALSE); + + fclose(fp_out); /* errors are ignored !? */ + if (fp_in != NULL) +--- 1966,1972 ---- + } + + viminfo_errcnt = 0; +! do_viminfo(fp_in, fp_out, forceit ? 0 : (VIF_WANT_INFO | VIF_WANT_MARKS)); + + fclose(fp_out); /* errors are ignored !? */ + if (fp_in != NULL) +*************** +*** 2041,2052 **** + * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo(). + */ + static void +! do_viminfo(fp_in, fp_out, want_info, want_marks, force_read) + FILE *fp_in; + FILE *fp_out; +! int want_info; +! int want_marks; +! int force_read; + { + int count = 0; + int eof = FALSE; +--- 2039,2048 ---- + * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo(). + */ + static void +! do_viminfo(fp_in, fp_out, flags) + FILE *fp_in; + FILE *fp_out; +! int flags; + { + int count = 0; + int eof = FALSE; +*************** +*** 2061,2068 **** + + if (fp_in != NULL) + { +! if (want_info) +! eof = read_viminfo_up_to_marks(&vir, force_read, fp_out != NULL); + else + /* Skip info, find start of marks */ + while (!(eof = viminfo_readline(&vir)) +--- 2057,2065 ---- + + if (fp_in != NULL) + { +! if (flags & VIF_WANT_INFO) +! eof = read_viminfo_up_to_marks(&vir, +! flags & VIF_FORCEIT, fp_out != NULL); + else + /* Skip info, find start of marks */ + while (!(eof = viminfo_readline(&vir)) +*************** +*** 2092,2099 **** + write_viminfo_bufferlist(fp_out); + count = write_viminfo_marks(fp_out); + } +! if (fp_in != NULL && want_marks) +! copy_viminfo_marks(&vir, fp_out, count, eof); + + vim_free(vir.vir_line); + #ifdef FEAT_MBYTE +--- 2089,2097 ---- + write_viminfo_bufferlist(fp_out); + count = write_viminfo_marks(fp_out); + } +! if (fp_in != NULL +! && (flags & (VIF_WANT_MARKS | VIF_GET_OLDFILES | VIF_FORCEIT))) +! copy_viminfo_marks(&vir, fp_out, count, eof, flags); + + vim_free(vir.vir_line); + #ifdef FEAT_MBYTE +*** ../vim-7.2.030/src/ex_cmds.h Thu Nov 6 20:47:00 2008 +--- src/ex_cmds.h Thu Sep 18 22:18:14 2008 +*************** +*** 653,658 **** +--- 653,660 ---- + EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), + EX(CMD_open, "open", ex_open, + RANGE|EXTRA), ++ EX(CMD_oldfiles, "oldfiles", ex_oldfiles, ++ BANG|TRLBAR|SBOXOK|CMDWIN), + EX(CMD_omap, "omap", ex_map, + EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), + EX(CMD_omapclear, "omapclear", ex_mapclear, +*** ../vim-7.2.030/src/ex_docmd.c Thu Nov 6 17:16:06 2008 +--- src/ex_docmd.c Mon Nov 3 21:21:17 2008 +*************** +*** 364,369 **** +--- 364,370 ---- + # define ex_function ex_ni + # define ex_delfunction ex_ni + # define ex_return ex_ni ++ # define ex_oldfiles ex_ni + #endif + static char_u *arg_all __ARGS((void)); + #ifdef FEAT_SESSION +*************** +*** 1770,1776 **** + } + if (checkforcmd(&ea.cmd, "browse", 3)) + { +! #ifdef FEAT_BROWSE + cmdmod.browse = TRUE; + #endif + continue; +--- 1771,1777 ---- + } + if (checkforcmd(&ea.cmd, "browse", 3)) + { +! #ifdef FEAT_BROWSE_CMD + cmdmod.browse = TRUE; + #endif + continue; +*************** +*** 9508,9531 **** + break; + } + s = src + 1; + i = (int)getdigits(&s); + *usedlen = (int)(s - src); /* length of what we expand */ + +! buf = buflist_findnr(i); +! if (buf == NULL) + { +! *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'"); + return NULL; + } +! if (lnump != NULL) +! *lnump = ECMD_LAST; +! if (buf->b_fname == NULL) + { +! result = (char_u *)""; +! valid = 0; /* Must have ":p:h" to be valid */ + } +- else +- result = buf->b_fname; + break; + + #ifdef FEAT_SEARCHPATH +--- 9509,9558 ---- + break; + } + s = src + 1; ++ if (*s == '<') /* "#<99" uses v:oldfiles */ ++ ++s; + i = (int)getdigits(&s); + *usedlen = (int)(s - src); /* length of what we expand */ + +! if (src[1] == '<') + { +! if (*usedlen < 2) +! { +! /* Should we give an error message for #b_fname == NULL) +! { +! result = (char_u *)""; +! valid = 0; /* Must have ":p:h" to be valid */ +! } +! else +! result = buf->b_fname; + } + break; + + #ifdef FEAT_SEARCHPATH +*************** +*** 10700,10706 **** + p_viminfo = (char_u *)"'100"; + if (eap->cmdidx == CMD_rviminfo) + { +! if (read_viminfo(eap->arg, TRUE, TRUE, eap->forceit) == FAIL) + EMSG(_("E195: Cannot open viminfo file for reading")); + } + else +--- 10727,10734 ---- + p_viminfo = (char_u *)"'100"; + if (eap->cmdidx == CMD_rviminfo) + { +! if (read_viminfo(eap->arg, VIF_WANT_INFO | VIF_WANT_MARKS +! | (eap->forceit ? VIF_FORCEIT : 0)) == FAIL) + EMSG(_("E195: Cannot open viminfo file for reading")); + } + else +*** ../vim-7.2.030/src/feature.h Wed Aug 6 18:45:07 2008 +--- src/feature.h Fri Sep 19 19:14:22 2008 +*************** +*** 767,775 **** + + /* + * +browse ":browse" command. + */ +! #if defined(FEAT_NORMAL) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)) +! # define FEAT_BROWSE + #endif + + /* +--- 767,779 ---- + + /* + * +browse ":browse" command. ++ * or just the ":browse" command modifier + */ +! #if defined(FEAT_NORMAL) +! # define FEAT_BROWSE_CMD +! # if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) +! # define FEAT_BROWSE +! # endif + #endif + + /* +*** ../vim-7.2.030/src/fileio.c Thu Sep 18 21:29:07 2008 +--- src/fileio.c Mon Nov 3 21:21:47 2008 +*************** +*** 2711,2717 **** + { + if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0 + && curbuf->b_ffname != NULL) +! read_viminfo(NULL, FALSE, TRUE, FALSE); + + /* Always set b_marks_read; needed when 'viminfo' is changed to include + * the ' parameter after opening a buffer. */ +--- 2711,2717 ---- + { + if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0 + && curbuf->b_ffname != NULL) +! read_viminfo(NULL, VIF_WANT_MARKS); + + /* Always set b_marks_read; needed when 'viminfo' is changed to include + * the ' parameter after opening a buffer. */ +*************** +*** 9108,9114 **** + set_context_in_autocmd(xp, arg, doautocmd) + expand_T *xp; + char_u *arg; +! int doautocmd; /* TRUE for :doautocmd, FALSE for :autocmd */ + { + char_u *p; + int group; +--- 9109,9115 ---- + set_context_in_autocmd(xp, arg, doautocmd) + expand_T *xp; + char_u *arg; +! int doautocmd; /* TRUE for :doauto*, FALSE for :autocmd */ + { + char_u *p; + int group; +*** ../vim-7.2.030/src/main.c Thu Sep 18 20:55:19 2008 +--- src/main.c Sun Sep 14 13:26:10 2008 +*************** +*** 645,655 **** + + #ifdef FEAT_VIMINFO + /* +! * Read in registers, history etc, but not marks, from the viminfo file + */ + if (*p_viminfo != NUL) + { +! read_viminfo(NULL, TRUE, FALSE, FALSE); + TIME_MSG("reading viminfo"); + } + #endif +--- 645,656 ---- + + #ifdef FEAT_VIMINFO + /* +! * Read in registers, history etc, but not marks, from the viminfo file. +! * This is where v:oldfiles gets filled. + */ + if (*p_viminfo != NUL) + { +! read_viminfo(NULL, VIF_WANT_INFO | VIF_GET_OLDFILES); + TIME_MSG("reading viminfo"); + } + #endif +*** ../vim-7.2.030/src/mark.c Sat Aug 9 19:37:29 2008 +--- src/mark.c Sun Sep 14 13:46:19 2008 +*************** +*** 1627,1641 **** + + /* + * Handle marks in the viminfo file: +! * fp_out == NULL read marks for current buffer only +! * fp_out != NULL copy marks for buffers not in buffer list + */ + void +! copy_viminfo_marks(virp, fp_out, count, eof) + vir_T *virp; + FILE *fp_out; + int count; + int eof; + { + char_u *line = virp->vir_line; + buf_T *buf; +--- 1627,1643 ---- + + /* + * Handle marks in the viminfo file: +! * fp_out != NULL: copy marks for buffers not in buffer list +! * fp_out == NULL && (flags & VIF_WANT_MARKS): read marks for curbuf only +! * fp_out == NULL && (flags & VIF_GET_OLDFILES | VIF_FORCEIT): fill v:oldfiles + */ + void +! copy_viminfo_marks(virp, fp_out, count, eof, flags) + vir_T *virp; + FILE *fp_out; + int count; + int eof; ++ int flags; + { + char_u *line = virp->vir_line; + buf_T *buf; +*************** +*** 1647,1656 **** +--- 1649,1671 ---- + char_u *p; + char_u *name_buf; + pos_T pos; ++ #ifdef FEAT_EVAL ++ list_T *list = NULL; ++ #endif + + if ((name_buf = alloc(LSIZE)) == NULL) + return; + *name_buf = NUL; ++ ++ #ifdef FEAT_EVAL ++ if (fp_out == NULL && (flags & (VIF_GET_OLDFILES | VIF_FORCEIT))) ++ { ++ list = list_alloc(); ++ if (list != NULL) ++ set_vim_var_list(VV_OLDFILES, list); ++ } ++ #endif ++ + num_marked_files = get_viminfo_parameter('\''); + while (!eof && (count < num_marked_files || fp_out == NULL)) + { +*************** +*** 1681,1686 **** +--- 1696,1706 ---- + p++; + *p = NUL; + ++ #ifdef FEAT_EVAL ++ if (list != NULL) ++ list_append_string(list, str, -1); ++ #endif ++ + /* + * If fp_out == NULL, load marks for current buffer. + * If fp_out != NULL, copy marks for buffers not in buflist. +*************** +*** 1688,1694 **** + load_marks = copy_marks_out = FALSE; + if (fp_out == NULL) + { +! if (curbuf->b_ffname != NULL) + { + if (*name_buf == NUL) /* only need to do this once */ + home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE); +--- 1708,1714 ---- + load_marks = copy_marks_out = FALSE; + if (fp_out == NULL) + { +! if ((flags & VIF_WANT_MARKS) && curbuf->b_ffname != NULL) + { + if (*name_buf == NUL) /* only need to do this once */ + home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE); +*** ../vim-7.2.030/src/misc1.c Wed Jun 25 00:24:52 2008 +--- src/misc1.c Sun Nov 9 11:47:00 2008 +*************** +*** 3245,3253 **** + + /* When using ":silent" assume that was entered. */ + if (mouse_used != NULL) +! MSG_PUTS(_("Type number or click with mouse ( cancels): ")); + else +! MSG_PUTS(_("Choice number ( cancels): ")); + + /* Set the state such that text can be selected/copied/pasted and we still + * get mouse events. */ +--- 3245,3253 ---- + + /* When using ":silent" assume that was entered. */ + if (mouse_used != NULL) +! MSG_PUTS(_("Type number and or click with mouse (empty cancels): ")); + else +! MSG_PUTS(_("Type number and (empty cancels): ")); + + /* Set the state such that text can be selected/copied/pasted and we still + * get mouse events. */ +*** ../vim-7.2.030/src/proto/eval.pro Sun Jan 6 20:06:30 2008 +--- src/proto/eval.pro Sun Nov 9 12:05:56 2008 +*************** +*** 17,23 **** + int eval_to_bool __ARGS((char_u *arg, int *error, char_u **nextcmd, int skip)); + char_u *eval_to_string_skip __ARGS((char_u *arg, char_u **nextcmd, int skip)); + int skip_expr __ARGS((char_u **pp)); +! char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int dolist)); + char_u *eval_to_string_safe __ARGS((char_u *arg, char_u **nextcmd, int use_sandbox)); + int eval_to_number __ARGS((char_u *expr)); + list_T *eval_spell_expr __ARGS((char_u *badword, char_u *expr)); +--- 17,23 ---- + int eval_to_bool __ARGS((char_u *arg, int *error, char_u **nextcmd, int skip)); + char_u *eval_to_string_skip __ARGS((char_u *arg, char_u **nextcmd, int skip)); + int skip_expr __ARGS((char_u **pp)); +! char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int convert)); + char_u *eval_to_string_safe __ARGS((char_u *arg, char_u **nextcmd, int use_sandbox)); + int eval_to_number __ARGS((char_u *expr)); + list_T *eval_spell_expr __ARGS((char_u *badword, char_u *expr)); +*************** +*** 46,52 **** +--- 46,54 ---- + void list_unref __ARGS((list_T *l)); + void list_free __ARGS((list_T *l, int recurse)); + dictitem_T *dict_lookup __ARGS((hashitem_T *hi)); ++ char_u *list_find_str __ARGS((list_T *l, long idx)); + int list_append_dict __ARGS((list_T *list, dict_T *dict)); ++ int list_append_string __ARGS((list_T *l, char_u *str, int len)); + int garbage_collect __ARGS((void)); + dict_T *dict_alloc __ARGS((void)); + int dict_add_nr_str __ARGS((dict_T *d, char *key, long nr, char_u *str)); +*************** +*** 58,65 **** +--- 60,69 ---- + void set_vim_var_nr __ARGS((int idx, long val)); + long get_vim_var_nr __ARGS((int idx)); + char_u *get_vim_var_str __ARGS((int idx)); ++ list_T *get_vim_var_list __ARGS((int idx)); + void set_vcount __ARGS((long count, long count1)); + void set_vim_var_string __ARGS((int idx, char_u *val, int len)); ++ void set_vim_var_list __ARGS((int idx, list_T *val)); + void set_reg_var __ARGS((int c)); + char_u *v_exception __ARGS((char_u *oldval)); + char_u *v_throwpoint __ARGS((char_u *oldval)); +*************** +*** 94,99 **** +--- 98,104 ---- + void write_viminfo_varlist __ARGS((FILE *fp)); + int store_session_globals __ARGS((FILE *fd)); + void last_set_msg __ARGS((scid_T scriptID)); ++ void ex_oldfiles __ARGS((exarg_T *eap)); + int modify_fname __ARGS((char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen)); + char_u *do_string_sub __ARGS((char_u *str, char_u *pat, char_u *sub, char_u *flags)); + /* vim: set ft=c : */ +*** ../vim-7.2.030/src/proto/ex_cmds.pro Sat May 5 20:13:58 2007 +--- src/proto/ex_cmds.pro Sat Sep 13 17:27:21 2008 +*************** +*** 11,17 **** + char_u *make_filter_cmd __ARGS((char_u *cmd, char_u *itmp, char_u *otmp)); + void append_redir __ARGS((char_u *buf, char_u *opt, char_u *fname)); + int viminfo_error __ARGS((char *errnum, char *message, char_u *line)); +! int read_viminfo __ARGS((char_u *file, int want_info, int want_marks, int forceit)); + void write_viminfo __ARGS((char_u *file, int forceit)); + int viminfo_readline __ARGS((vir_T *virp)); + char_u *viminfo_readstring __ARGS((vir_T *virp, int off, int convert)); +--- 11,17 ---- + char_u *make_filter_cmd __ARGS((char_u *cmd, char_u *itmp, char_u *otmp)); + void append_redir __ARGS((char_u *buf, char_u *opt, char_u *fname)); + int viminfo_error __ARGS((char *errnum, char *message, char_u *line)); +! int read_viminfo __ARGS((char_u *file, int flags)); + void write_viminfo __ARGS((char_u *file, int forceit)); + int viminfo_readline __ARGS((vir_T *virp)); + char_u *viminfo_readstring __ARGS((vir_T *virp, int off, int convert)); +*** ../vim-7.2.030/src/proto/mark.pro Sat May 5 19:29:37 2007 +--- src/proto/mark.pro Sat Sep 13 18:06:20 2008 +*************** +*** 26,30 **** + void write_viminfo_filemarks __ARGS((FILE *fp)); + int removable __ARGS((char_u *name)); + int write_viminfo_marks __ARGS((FILE *fp_out)); +! void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof)); + /* vim: set ft=c : */ +--- 26,30 ---- + void write_viminfo_filemarks __ARGS((FILE *fp)); + int removable __ARGS((char_u *name)); + int write_viminfo_marks __ARGS((FILE *fp_out)); +! void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof, int flags)); + /* vim: set ft=c : */ +*** ../vim-7.2.030/src/option.c Thu Oct 2 22:48:01 2008 +--- src/option.c Fri Sep 26 22:20:20 2008 +*************** +*** 2593,2605 **** + #ifdef FEAT_VIMINFO + (char_u *)&p_viminfo, PV_NONE, + #if defined(MSDOS) || defined(MSWIN) || defined(OS2) +! {(char_u *)"", (char_u *)"'20,<50,s10,h,rA:,rB:"} + #else + # ifdef AMIGA + {(char_u *)"", +! (char_u *)"'20,<50,s10,h,rdf0:,rdf1:,rdf2:"} + # else +! {(char_u *)"", (char_u *)"'20,<50,s10,h"} + # endif + #endif + #else +--- 2593,2605 ---- + #ifdef FEAT_VIMINFO + (char_u *)&p_viminfo, PV_NONE, + #if defined(MSDOS) || defined(MSWIN) || defined(OS2) +! {(char_u *)"", (char_u *)"'100,<50,s10,h,rA:,rB:"} + #else + # ifdef AMIGA + {(char_u *)"", +! (char_u *)"'100,<50,s10,h,rdf0:,rdf1:,rdf2:"} + # else +! {(char_u *)"", (char_u *)"'100,<50,s10,h"} + # endif + #endif + #else +*** ../vim-7.2.030/src/structs.h Thu Jul 31 22:04:27 2008 +--- src/structs.h Fri Sep 19 19:15:18 2008 +*************** +*** 459,465 **** + typedef struct + { + int hide; /* TRUE when ":hide" was used */ +! # ifdef FEAT_BROWSE + int browse; /* TRUE to invoke file dialog */ + # endif + # ifdef FEAT_WINDOWS +--- 459,465 ---- + typedef struct + { + int hide; /* TRUE when ":hide" was used */ +! # ifdef FEAT_BROWSE_CMD + int browse; /* TRUE to invoke file dialog */ + # endif + # ifdef FEAT_WINDOWS +*** ../vim-7.2.030/src/vim.h Sat Aug 9 19:37:40 2008 +--- src/vim.h Sat Sep 13 17:41:24 2008 +*************** +*** 1728,1734 **** + #define VV_MOUSE_COL 51 + #define VV_OP 52 + #define VV_SEARCHFORWARD 53 +! #define VV_LEN 54 /* number of v: vars */ + + #ifdef FEAT_CLIPBOARD + +--- 1728,1735 ---- + #define VV_MOUSE_COL 51 + #define VV_OP 52 + #define VV_SEARCHFORWARD 53 +! #define VV_OLDFILES 54 +! #define VV_LEN 55 /* number of v: vars */ + + #ifdef FEAT_CLIPBOARD + +*************** +*** 2054,2057 **** +--- 2055,2064 ---- + #define DOSO_VIMRC 1 /* loading vimrc file */ + #define DOSO_GVIMRC 2 /* loading gvimrc file */ + ++ /* flags for read_viminfo() and children */ ++ #define VIF_WANT_INFO 1 /* load non-mark info */ ++ #define VIF_WANT_MARKS 2 /* load file marks */ ++ #define VIF_FORCEIT 4 /* overwrite info already read */ ++ #define VIF_GET_OLDFILES 8 /* load v:oldfiles */ ++ + #endif /* VIM__H */ +*** ../vim-7.2.030/src/version.c Thu Nov 6 20:47:00 2008 +--- src/version.c Sun Nov 9 13:39:19 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 31, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +217. Your sex life has drastically improved...so what if it's only cyber-sex! + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.032 b/7.2.032 new file mode 100644 index 00000000..f4a0d9be --- /dev/null +++ b/7.2.032 @@ -0,0 +1,55 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.032 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.032 (after 7.2.031) +Problem: Can't build with EXITFREE defined. (Dominique Pelle) +Solution: Change vv_string to vv_str. +Files: src/eval.c + + +*** ../vim-7.2.031/src/eval.c Sun Nov 9 13:43:25 2008 +--- src/eval.c Sun Nov 9 17:16:06 2008 +*************** +*** 846,853 **** + p = &vimvars[i]; + if (p->vv_di.di_tv.v_type == VAR_STRING) + { +! vim_free(p->vv_string); +! p->vv_string = NULL; + } + else if (p->vv_di.di_tv.v_type == VAR_LIST) + { +--- 846,853 ---- + p = &vimvars[i]; + if (p->vv_di.di_tv.v_type == VAR_STRING) + { +! vim_free(p->vv_str); +! p->vv_str = NULL; + } + else if (p->vv_di.di_tv.v_type == VAR_LIST) + { +*** ../vim-7.2.031/src/version.c Sun Nov 9 13:43:25 2008 +--- src/version.c Sun Nov 9 17:21:00 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 32, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +218. Your spouse hands you a gift wrapped magnet with your PC's name + on it and you accuse him or her of genocide. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.033 b/7.2.033 new file mode 100644 index 00000000..d96a94b7 --- /dev/null +++ b/7.2.033 @@ -0,0 +1,78 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.033 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.033 +Problem: When detecting a little endian BOM "ucs-2le" is used, but the text + might be "utf-16le". +Solution: Default to "utf-16le", it also works for "ucs-2le". (Jia Yanwei) +Files: src/fileio.c, src/testdir/test42.ok + + +*** ../vim-7.2.032/src/fileio.c Sun Nov 9 13:43:25 2008 +--- src/fileio.c Mon Nov 3 21:21:47 2008 +*************** +*** 5550,5558 **** + name = "ucs-4le"; /* FF FE 00 00 */ + len = 4; + } +! else if (flags == FIO_ALL || flags == (FIO_UCS2 | FIO_ENDIAN_L)) + name = "ucs-2le"; /* FF FE */ +! else if (flags == (FIO_UTF16 | FIO_ENDIAN_L)) + name = "utf-16le"; /* FF FE */ + } + else if (p[0] == 0xfe && p[1] == 0xff +--- 5550,5559 ---- + name = "ucs-4le"; /* FF FE 00 00 */ + len = 4; + } +! else if (flags == (FIO_UCS2 | FIO_ENDIAN_L)) + name = "ucs-2le"; /* FF FE */ +! else if (flags == FIO_ALL || flags == (FIO_UTF16 | FIO_ENDIAN_L)) +! /* utf-16le is preferred, it also works for ucs-2le text */ + name = "utf-16le"; /* FF FE */ + } + else if (p[0] == 0xfe && p[1] == 0xff +*** ../vim-7.2.032/src/testdir/test42.ok Sat Mar 1 13:49:21 2008 +--- src/testdir/test42.ok Sat Nov 1 17:09:29 2008 +*************** +*** 20,26 **** + ucs-2 + + +! fileencoding=ucs-2le + bomb + ucs-2le + +--- 20,26 ---- + ucs-2 + + +! fileencoding=utf-16le + bomb + ucs-2le + +*** ../vim-7.2.032/src/version.c Sun Nov 9 17:21:10 2008 +--- src/version.c Tue Nov 11 21:54:14 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 33, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +234. You started college as a chemistry major, and walk out four years + later as an Internet provider. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.034 b/7.2.034 new file mode 100644 index 00000000..957fb35d --- /dev/null +++ b/7.2.034 @@ -0,0 +1,81 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.034 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.034 +Problem: Memory leak in spell info when deleting buffer. +Solution: Free the memory. (Dominique Pelle) +Files: src/buffer.c + + +*** ../vim-7.2.033/src/buffer.c Mon Sep 1 17:32:40 2008 +--- src/buffer.c Wed Nov 12 11:21:49 2008 +*************** +*** 647,652 **** +--- 647,655 ---- + vim_free(buf->b_start_fenc); + buf->b_start_fenc = NULL; + #endif ++ #ifdef FEAT_SPELL ++ ga_clear(&buf->b_langp); ++ #endif + } + + /* +*************** +*** 1237,1243 **** + * "buf" if one exists */ + if ((swb_flags & SWB_USEOPEN) && buf_jump_open_win(buf)) + return OK; +! /* If 'switchbuf' contians "usetab": jump to first window in any tab + * page containing "buf" if one exists */ + if ((swb_flags & SWB_USETAB) && buf_jump_open_tab(buf)) + return OK; +--- 1240,1246 ---- + * "buf" if one exists */ + if ((swb_flags & SWB_USEOPEN) && buf_jump_open_win(buf)) + return OK; +! /* If 'switchbuf' contains "usetab": jump to first window in any tab + * page containing "buf" if one exists */ + if ((swb_flags & SWB_USETAB) && buf_jump_open_tab(buf)) + return OK; +*************** +*** 3964,3970 **** + width = vim_strsize(out); + if (maxwidth > 0 && width > maxwidth) + { +! /* Result is too long, must trunctate somewhere. */ + l = 0; + if (itemcnt == 0) + s = out; +--- 3967,3973 ---- + width = vim_strsize(out); + if (maxwidth > 0 && width > maxwidth) + { +! /* Result is too long, must truncate somewhere. */ + l = 0; + if (itemcnt == 0) + s = out; +*** ../vim-7.2.033/src/version.c Tue Nov 11 21:55:29 2008 +--- src/version.c Wed Nov 12 12:51:21 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 34, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +236. You start saving URL's in your digital watch. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.035 b/7.2.035 new file mode 100644 index 00000000..e8c73915 --- /dev/null +++ b/7.2.035 @@ -0,0 +1,128 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.035 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.035 +Problem: Mismatches between alloc/malloc, free/vim_free, + realloc/vim_realloc. +Solution: Use the right function. (Dominique Pelle) +Files: src/gui_x11.c, src/mbyte.c, src/misc2.c, src/os_unix.c + + +*** ../vim-7.2.034/src/gui_x11.c Fri Jun 20 11:59:25 2008 +--- src/gui_x11.c Wed Nov 12 11:47:03 2008 +*************** +*** 2450,2456 **** + *colorPtr = colortable[closest]; + } + +! free(colortable); + return OK; + } + +--- 2450,2456 ---- + *colorPtr = colortable[closest]; + } + +! vim_free(colortable); + return OK; + } + +*** ../vim-7.2.034/src/mbyte.c Sat Sep 6 16:44:06 2008 +--- src/mbyte.c Wed Nov 12 11:24:14 2008 +*************** +*** 5384,5390 **** + draw_feedback = (char *)alloc(draw_data->chg_first + + text->length); + else +! draw_feedback = realloc(draw_feedback, + draw_data->chg_first + text->length); + if (draw_feedback != NULL) + { +--- 5384,5390 ---- + draw_feedback = (char *)alloc(draw_data->chg_first + + text->length); + else +! draw_feedback = vim_realloc(draw_feedback, + draw_data->chg_first + text->length); + if (draw_feedback != NULL) + { +*** ../vim-7.2.034/src/misc2.c Sat Sep 6 16:44:06 2008 +--- src/misc2.c Wed Nov 12 11:42:51 2008 +*************** +*** 873,879 **** + /* 3. check for available memory: call mch_avail_mem() */ + if (mch_avail_mem(TRUE) < KEEP_ROOM && !releasing) + { +! vim_free((char *)p); /* System is low... no go! */ + p = NULL; + } + else +--- 873,879 ---- + /* 3. check for available memory: call mch_avail_mem() */ + if (mch_avail_mem(TRUE) < KEEP_ROOM && !releasing) + { +! free((char *)p); /* System is low... no go! */ + p = NULL; + } + else +*** ../vim-7.2.034/src/os_unix.c Wed Aug 6 18:45:01 2008 +--- src/os_unix.c Wed Nov 12 11:55:33 2008 +*************** +*** 2905,2911 **** + * Ignore any errors. + */ + #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK) +! signal_stack = malloc(SIGSTKSZ); + init_signal_stack(); + #endif + } +--- 2905,2911 ---- + * Ignore any errors. + */ + #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK) +! signal_stack = (char *)alloc(SIGSTKSZ); + init_signal_stack(); + #endif + } +*************** +*** 6814,6820 **** + if (xsmp_icefd != -1) + { + SmcCloseConnection(xsmp.smcconn, 0, NULL); +! vim_free(xsmp.clientid); + xsmp.clientid = NULL; + xsmp_icefd = -1; + } +--- 6815,6822 ---- + if (xsmp_icefd != -1) + { + SmcCloseConnection(xsmp.smcconn, 0, NULL); +! if (xsmp.clientid != NULL) +! free(xsmp.clientid); + xsmp.clientid = NULL; + xsmp_icefd = -1; + } +*** ../vim-7.2.034/src/version.c Wed Nov 12 12:51:38 2008 +--- src/version.c Wed Nov 12 13:05:40 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 35, + /**/ + +-- +You can tune a file system, but you can't tuna fish + -- man tunefs + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.036 b/7.2.036 new file mode 100644 index 00000000..4db2a26f --- /dev/null +++ b/7.2.036 @@ -0,0 +1,276 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.036 (extra) +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.036 (extra) +Problem: Mismatches between alloc/malloc, free/vim_free, + realloc/vim_realloc. +Solution: Use the right function. (Dominique Pelle) +Files: src/gui_riscos.c, src/gui_w48.c, src/mbyte.c, src/os_vms.c, + src/os_w32exe.c, src/os_win16.c + + +*** ../vim-7.2.035/src/gui_riscos.c Thu May 10 19:33:26 2007 +--- src/gui_riscos.c Wed Nov 12 11:47:54 2008 +*************** +*** 695,701 **** + gui_mch_set_shellsize(width, height, min_width, min_height, base_width, base_height, direction) + int width; /* In OS units */ + int height; +! int min_width; /* Smallest permissable window size (ignored) */ + int min_height; + int base_width; /* Space for scroll bars, etc */ + int base_height; +--- 695,701 ---- + gui_mch_set_shellsize(width, height, min_width, min_height, base_width, base_height, direction) + int width; /* In OS units */ + int height; +! int min_width; /* Smallest permissible window size (ignored) */ + int min_height; + int base_width; /* Space for scroll bars, etc */ + int base_height; +*************** +*** 863,869 **** + if (strncmp(file, "ZapFont\015", 8) == 0) + return file; /* Loaded OK! */ + +! free(file); + return NULL; /* Not a valid font file */ + } + +--- 863,869 ---- + if (strncmp(file, "ZapFont\015", 8) == 0) + return file; /* Loaded OK! */ + +! vim_free(file); + return NULL; /* Not a valid font file */ + } + +*** ../vim-7.2.035/src/gui_w48.c Thu Jul 24 20:50:23 2008 +--- src/gui_w48.c Wed Nov 12 11:37:41 2008 +*************** +*** 3335,3341 **** + + /* + * Convert the string s to the proper format for a filter string by replacing +! * the \t and \n delimeters with \0. + * Returns the converted string in allocated memory. + * + * Keep in sync with convert_filterW() above! +--- 3335,3341 ---- + + /* + * Convert the string s to the proper format for a filter string by replacing +! * the \t and \n delimiters with \0. + * Returns the converted string in allocated memory. + * + * Keep in sync with convert_filterW() above! +*************** +*** 3674,3680 **** + * Use "prog" as the name of the program and "cmdline" as the arguments. + * Copy the arguments to allocated memory. + * Return the number of arguments (including program name). +! * Return pointers to the arguments in "argvp". + * Return pointer to buffer in "tofree". + * Returns zero when out of memory. + */ +--- 3674,3681 ---- + * Use "prog" as the name of the program and "cmdline" as the arguments. + * Copy the arguments to allocated memory. + * Return the number of arguments (including program name). +! * Return pointers to the arguments in "argvp". Memory is allocated with +! * malloc(), use free() instead of vim_free(). + * Return pointer to buffer in "tofree". + * Returns zero when out of memory. + */ +*************** +*** 3692,3697 **** +--- 3693,3700 ---- + char **argv = NULL; + int round; + ++ *tofree = NULL; ++ + #ifdef FEAT_MBYTE + /* Try using the Unicode version first, it takes care of conversion when + * 'encoding' is changed. */ +*************** +*** 3802,3816 **** + argv = (char **)malloc((argc + 1) * sizeof(char *)); + if (argv == NULL ) + { +! vim_free(newcmdline); + return 0; /* malloc error */ + } + pnew = newcmdline; + } + } + + done: +- + argv[argc] = NULL; /* NULL-terminated list */ + *argvp = argv; + return argc; +--- 3805,3819 ---- + argv = (char **)malloc((argc + 1) * sizeof(char *)); + if (argv == NULL ) + { +! free(newcmdline); + return 0; /* malloc error */ + } + pnew = newcmdline; ++ *tofree = newcmdline; + } + } + + done: + argv[argc] = NULL; /* NULL-terminated list */ + *argvp = argv; + return argc; +*** ../vim-7.2.035/src/os_vms.c Wed Aug 6 18:38:52 2008 +--- src/os_vms.c Wed Nov 12 11:42:12 2008 +*************** +*** 228,234 **** + else if ((sbuf = getenv((char *)lognam))) + { + lengte = strlen(sbuf) + 1; +! cp = (char_u *)malloc((size_t)lengte); + if (cp) + strcpy((char *)cp, sbuf); + return cp; +--- 228,234 ---- + else if ((sbuf = getenv((char *)lognam))) + { + lengte = strlen(sbuf) + 1; +! cp = (char_u *)alloc((size_t)lengte); + if (cp) + strcpy((char *)cp, sbuf); + return cp; +*************** +*** 381,387 **** + if (--vms_match_free == 0) { + /* add more space to store matches */ + vms_match_alloced += EXPL_ALLOC_INC; +! vms_fmatch = (char_u **)realloc(vms_fmatch, + sizeof(char **) * vms_match_alloced); + if (!vms_fmatch) + return 0; +--- 381,387 ---- + if (--vms_match_free == 0) { + /* add more space to store matches */ + vms_match_alloced += EXPL_ALLOC_INC; +! vms_fmatch = (char_u **)vim_realloc(vms_fmatch, + sizeof(char **) * vms_match_alloced); + if (!vms_fmatch) + return 0; +*************** +*** 460,466 **** + if (--files_free < 1) + { + files_alloced += EXPL_ALLOC_INC; +! *file = (char_u **)realloc(*file, + sizeof(char_u **) * files_alloced); + if (*file == NULL) + { +--- 460,466 ---- + if (--files_free < 1) + { + files_alloced += EXPL_ALLOC_INC; +! *file = (char_u **)vim_realloc(*file, + sizeof(char_u **) * files_alloced); + if (*file == NULL) + { +*************** +*** 614,627 **** + { + buflen = len + 128; + if (buf) +! buf = (char *)realloc(buf, buflen); + else +! buf = (char *)calloc(buflen, sizeof(char)); + } + + #ifdef DEBUG + char *tmpbuf = NULL; +! tmpbuf = (char *)calloc(buflen, sizeof(char)); + strcpy(tmpbuf, instring); + #endif + +--- 614,627 ---- + { + buflen = len + 128; + if (buf) +! buf = (char *)vim_realloc(buf, buflen); + else +! buf = (char *)alloc(buflen * sizeof(char)); + } + + #ifdef DEBUG + char *tmpbuf = NULL; +! tmpbuf = (char *)alloc(buflen * sizeof(char)); + strcpy(tmpbuf, instring); + #endif + +*** ../vim-7.2.035/src/os_w32exe.c Fri Jul 1 00:06:20 2005 +--- src/os_w32exe.c Wed Nov 12 11:45:43 2008 +*************** +*** 129,135 **** + errout: + #endif + free(argv); +! free(tofree); + #ifdef FEAT_MBYTE + free_cmd_argsW(); + #endif +--- 129,136 ---- + errout: + #endif + free(argv); +! if (tofree != NULL) +! free(tofree); + #ifdef FEAT_MBYTE + free_cmd_argsW(); + #endif +*** ../vim-7.2.035/src/os_win16.c Wed Jun 25 00:49:34 2008 +--- src/os_win16.c Wed Nov 12 11:45:53 2008 +*************** +*** 121,127 **** + pmain(argc, argv); + + free(argv); +! free(tofree); + + return 0; + } +--- 121,128 ---- + pmain(argc, argv); + + free(argv); +! if (tofree != NULL) +! free(tofree); + + return 0; + } +*** ../vim-7.2.035/src/version.c Wed Nov 12 13:07:48 2008 +--- src/version.c Wed Nov 12 13:28:51 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 36, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +239. You think "surfing" is something you do on dry land. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.037 b/7.2.037 new file mode 100644 index 00000000..20a43983 --- /dev/null +++ b/7.2.037 @@ -0,0 +1,53 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.037 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.037 +Problem: Double free with GTK 1 and compiled with EXITFREE. +Solution: Don't close display. (Dominique Pelle) +Files: src/os_unix.c + + +*** ../vim-7.2.036/src/os_unix.c Wed Nov 12 13:07:48 2008 +--- src/os_unix.c Wed Nov 12 11:55:33 2008 +*************** +*** 2936,2942 **** + } + # endif + # endif +! # ifdef FEAT_X11 + if (x11_display != NULL + # ifdef FEAT_XCLIPBOARD + && x11_display != xterm_dpy +--- 2936,2943 ---- + } + # endif + # endif +! /* Don't close the display for GTK 1, it is done in exit(). */ +! # if defined(FEAT_X11) && (!defined(FEAT_GUI_GTK) || defined(HAVE_GTK2)) + if (x11_display != NULL + # ifdef FEAT_XCLIPBOARD + && x11_display != xterm_dpy +*** ../vim-7.2.036/src/version.c Wed Nov 12 13:35:31 2008 +--- src/version.c Wed Nov 12 14:08:56 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 37, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +240. You think Webster's Dictionary is a directory of WEB sites. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.038 b/7.2.038 new file mode 100644 index 00000000..449821e8 --- /dev/null +++ b/7.2.038 @@ -0,0 +1,86 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.038 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.038 +Problem: Overlapping arguments to memcpy(). +Solution: Use mch_memmove(). (Dominique Pelle) +Files: src/if_xcmdsrv.c + + +*** ../vim-7.2.037/src/if_xcmdsrv.c Wed Aug 6 18:38:13 2008 +--- src/if_xcmdsrv.c Wed Nov 12 12:09:01 2008 +*************** +*** 736,742 **** + + serverReply.ga_len; + e.id = w; + ga_init2(&e.strings, 1, 100); +! memcpy(p, &e, sizeof(e)); + serverReply.ga_len++; + } + } +--- 736,742 ---- + + serverReply.ga_len; + e.id = w; + ga_init2(&e.strings, 1, 100); +! mch_memmove(p, &e, sizeof(e)); + serverReply.ga_len++; + } + } +*************** +*** 1018,1024 **** + p++; + count = numItems - (p - regProp); + if (count > 0) +! memcpy(entry, p, count); + XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING, + 8, PropModeReplace, regProp, + (int)(numItems - (p - entry))); +--- 1018,1024 ---- + p++; + count = numItems - (p - regProp); + if (count > 0) +! mch_memmove(entry, p, count); + XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING, + 8, PropModeReplace, regProp, + (int)(numItems - (p - entry))); +*************** +*** 1072,1078 **** + p++; + lastHalf = numItems - (p - regProp); + if (lastHalf > 0) +! memcpy(entry, p, lastHalf); + numItems = (entry - regProp) + lastHalf; + p = entry; + continue; +--- 1072,1078 ---- + p++; + lastHalf = numItems - (p - regProp); + if (lastHalf > 0) +! mch_memmove(entry, p, lastHalf); + numItems = (entry - regProp) + lastHalf; + p = entry; + continue; +*** ../vim-7.2.037/src/version.c Wed Nov 12 14:09:38 2008 +--- src/version.c Wed Nov 12 14:51:00 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 38, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +241. You try to look for Net Search even when you're in File Manager. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.039 b/7.2.039 new file mode 100644 index 00000000..f9cb18eb --- /dev/null +++ b/7.2.039 @@ -0,0 +1,46 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.039 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.039 +Problem: Accessing freed memory on exit when EXITFREE is defined. +Solution: Call hash_init() on the v: hash table. +Files: src/eval.c + + +*** ../vim-7.2.038/src/eval.c Sun Nov 9 17:21:10 2008 +--- src/eval.c Wed Nov 12 12:15:14 2008 +*************** +*** 856,861 **** +--- 856,862 ---- + } + } + hash_clear(&vimvarht); ++ hash_init(&vimvarht); /* garbage_collect() will access it */ + hash_clear(&compat_hashtab); + + /* script-local variables */ +*** ../vim-7.2.038/src/version.c Wed Nov 12 14:52:11 2008 +--- src/version.c Wed Nov 12 15:09:39 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 39, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +242. You turn down a better-paying job because it doesn't come with + a free e-mail account. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.040 b/7.2.040 new file mode 100644 index 00000000..76ea73af --- /dev/null +++ b/7.2.040 @@ -0,0 +1,64 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.040 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.040 +Problem: When using ":e ++ff=dos fname" and the file contains a NL without + a CR before it and 'ffs' contains "unix" then the fileformat + becomes unix. +Solution: Ignore 'ffs' when using the ++ff argument. (Ben Schmidt) + Also remove unreachable code. +Files: src/fileio.c + + +*** ../vim-7.2.039/src/fileio.c Tue Nov 11 21:55:29 2008 +--- src/fileio.c Wed Nov 12 13:19:42 2008 +*************** +*** 932,938 **** +--- 932,941 ---- + else + { + if (eap != NULL && eap->force_ff != 0) ++ { + fileformat = get_fileformat_force(curbuf, eap); ++ try_unix = try_dos = try_mac = FALSE; ++ } + else if (curbuf->b_p_bin) + fileformat = EOL_UNIX; /* binary: use Unix format */ + else if (*p_ffs == NUL) +*************** +*** 2341,2351 **** + STRCAT(IObuff, _("[CR missing]")); + c = TRUE; + } +- if (ff_error == EOL_MAC) +- { +- STRCAT(IObuff, _("[NL found]")); +- c = TRUE; +- } + if (split) + { + STRCAT(IObuff, _("[long lines split]")); +--- 2344,2349 ---- +*** ../vim-7.2.039/src/version.c Wed Nov 12 15:28:37 2008 +--- src/version.c Wed Nov 12 16:03:44 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 40, + /**/ + +-- +If you're sending someone Styrofoam, what do you pack it in? + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.041 b/7.2.041 new file mode 100644 index 00000000..b562206c --- /dev/null +++ b/7.2.041 @@ -0,0 +1,729 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.041 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.041 +Problem: In diff mode, when using two tabs, each with two diffed buffers, + editing a buffer of the other tab messes up the diff. (Matt + Mzyzik) +Solution: Only copy options from a window where the buffer was edited that + doesn't have 'diff' set or is for the current tab page. + Also fix that window options for a buffer are stored with the + wrong window. +Files: src/buffer.c, src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, + src/ex_getln.c, src/if_sniff.c, src/main.c, src/netbeans.c, + src/normal.c, src/popupmnu.c, src/proto/buffer.pro, + src/proto/ex_cmds.pro src/quickfix.c, src/window.c + + +*** ../vim-7.2.040/src/buffer.c Wed Nov 12 12:51:38 2008 +--- src/buffer.c Wed Nov 12 17:45:01 2008 +*************** +*** 33,39 **** + static char_u *fname_match __ARGS((regprog_T *prog, char_u *name)); + #endif + static void buflist_setfpos __ARGS((buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options)); +! static wininfo_T *find_wininfo __ARGS((buf_T *buf)); + #ifdef UNIX + static buf_T *buflist_findname_stat __ARGS((char_u *ffname, struct stat *st)); + static int otherfile_buf __ARGS((buf_T *buf, char_u *ffname, struct stat *stp)); +--- 33,39 ---- + static char_u *fname_match __ARGS((regprog_T *prog, char_u *name)); + #endif + static void buflist_setfpos __ARGS((buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options)); +! static wininfo_T *find_wininfo __ARGS((buf_T *buf, int skip_diff_buffer)); + #ifdef UNIX + static buf_T *buflist_findname_stat __ARGS((char_u *ffname, struct stat *st)); + static int otherfile_buf __ARGS((buf_T *buf, char_u *ffname, struct stat *stp)); +*************** +*** 1093,1099 **** + #endif + setpcmark(); + retval = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, +! forceit ? ECMD_FORCEIT : 0); + + /* + * do_ecmd() may create a new buffer, then we have to delete +--- 1093,1099 ---- + #endif + setpcmark(); + retval = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, +! forceit ? ECMD_FORCEIT : 0, curwin); + + /* + * do_ecmd() may create a new buffer, then we have to delete +*************** +*** 1316,1322 **** + setpcmark(); + if (!cmdmod.keepalt) + curwin->w_alt_fnum = curbuf->b_fnum; /* remember alternate file */ +! buflist_altfpos(); /* remember curpos */ + + #ifdef FEAT_VISUAL + /* Don't restart Select mode after switching to another buffer. */ +--- 1316,1322 ---- + setpcmark(); + if (!cmdmod.keepalt) + curwin->w_alt_fnum = curbuf->b_fnum; /* remember alternate file */ +! buflist_altfpos(curwin); /* remember curpos */ + + #ifdef FEAT_VISUAL + /* Don't restart Select mode after switching to another buffer. */ +*************** +*** 2404,2425 **** + return; + } + + /* + * Find info for the current window in buffer "buf". + * If not found, return the info for the most recently used window. + * Returns NULL when there isn't any info. + */ + static wininfo_T * +! find_wininfo(buf) + buf_T *buf; + { + wininfo_T *wip; + + for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next) +! if (wip->wi_win == curwin) + break; +! if (wip == NULL) /* if no fpos for curwin, use the first in the list */ +! wip = buf->b_wininfo; + return wip; + } + +--- 2404,2473 ---- + return; + } + ++ #ifdef FEAT_DIFF ++ static int wininfo_other_tab_diff __ARGS((wininfo_T *wip)); ++ ++ /* ++ * Return TRUE when "wip" has 'diff' set and the diff is only for another tab ++ * page. That's because a diff is local to a tab page. ++ */ ++ static int ++ wininfo_other_tab_diff(wip) ++ wininfo_T *wip; ++ { ++ win_T *wp; ++ ++ if (wip->wi_opt.wo_diff) ++ { ++ for (wp = firstwin; wp != NULL; wp = wp->w_next) ++ /* return FALSE when it's a window in the current tab page, thus ++ * the buffer was in diff mode here */ ++ if (wip->wi_win == wp) ++ return FALSE; ++ return TRUE; ++ } ++ return FALSE; ++ } ++ #endif ++ + /* + * Find info for the current window in buffer "buf". + * If not found, return the info for the most recently used window. ++ * When "skip_diff_buffer" is TRUE avoid windows with 'diff' set that is in ++ * another tab page. + * Returns NULL when there isn't any info. + */ ++ /*ARGSUSED*/ + static wininfo_T * +! find_wininfo(buf, skip_diff_buffer) + buf_T *buf; ++ int skip_diff_buffer; + { + wininfo_T *wip; + + for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next) +! if (wip->wi_win == curwin +! #ifdef FEAT_DIFF +! && (!skip_diff_buffer || !wininfo_other_tab_diff(wip)) +! #endif +! ) + break; +! +! /* If no wininfo for curwin, use the first in the list (that doesn't have +! * 'diff' set and is in another tab page). */ +! if (wip == NULL) +! { +! #ifdef FEAT_DIFF +! if (skip_diff_buffer) +! { +! for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next) +! if (!wininfo_other_tab_diff(wip)) +! break; +! } +! else +! #endif +! wip = buf->b_wininfo; +! } + return wip; + } + +*************** +*** 2440,2446 **** + clearFolding(curwin); + #endif + +! wip = find_wininfo(buf); + if (wip != NULL && wip->wi_optset) + { + copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt); +--- 2488,2494 ---- + clearFolding(curwin); + #endif + +! wip = find_wininfo(buf, TRUE); + if (wip != NULL && wip->wi_optset) + { + copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt); +*************** +*** 2472,2478 **** + wininfo_T *wip; + static pos_T no_position = {1, 0}; + +! wip = find_wininfo(buf); + if (wip != NULL) + return &(wip->wi_fpos); + else +--- 2520,2526 ---- + wininfo_T *wip; + static pos_T no_position = {1, 0}; + +! wip = find_wininfo(buf, FALSE); + if (wip != NULL) + return &(wip->wi_fpos); + else +*************** +*** 2793,2806 **** + #endif + + /* +! * Set alternate cursor position for current window. + * Also save the local window option values. + */ + void +! buflist_altfpos() + { +! buflist_setfpos(curbuf, curwin, curwin->w_cursor.lnum, +! curwin->w_cursor.col, TRUE); + } + + /* +--- 2841,2854 ---- + #endif + + /* +! * Set alternate cursor position for the current buffer and window "win". + * Also save the local window option values. + */ + void +! buflist_altfpos(win) +! win_T *win; + { +! buflist_setfpos(curbuf, win, win->w_cursor.lnum, win->w_cursor.col, TRUE); + } + + /* +*************** +*** 4492,4498 **** + ECMD_ONE, + ((P_HID(curwin->w_buffer) + || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0) +! + ECMD_OLDBUF); + #ifdef FEAT_AUTOCMD + if (use_firstwin) + ++autocmd_no_leave; +--- 4540,4546 ---- + ECMD_ONE, + ((P_HID(curwin->w_buffer) + || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0) +! + ECMD_OLDBUF, curwin); + #ifdef FEAT_AUTOCMD + if (use_firstwin) + ++autocmd_no_leave; +*** ../vim-7.2.040/src/ex_cmds.c Sun Nov 9 13:43:25 2008 +--- src/ex_cmds.c Wed Nov 12 22:41:41 2008 +*************** +*** 3052,3058 **** + retval = 0; /* it's in the same file */ + } + else if (do_ecmd(fnum, ffname, sfname, NULL, lnum, +! (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0)) == OK) + retval = -1; /* opened another file */ + else + retval = 1; /* error encountered */ +--- 3052,3059 ---- + retval = 0; /* it's in the same file */ + } + else if (do_ecmd(fnum, ffname, sfname, NULL, lnum, +! (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0), +! curwin) == OK) + retval = -1; /* opened another file */ + else + retval = 1; /* error encountered */ +*************** +*** 3085,3101 **** + * ECMD_OLDBUF: use existing buffer if it exists + * ECMD_FORCEIT: ! used for Ex command + * ECMD_ADDBUF: don't edit, just add to buffer list + * + * return FAIL for failure, OK otherwise + */ + int +! do_ecmd(fnum, ffname, sfname, eap, newlnum, flags) + int fnum; + char_u *ffname; + char_u *sfname; + exarg_T *eap; /* can be NULL! */ + linenr_T newlnum; + int flags; + { + int other_file; /* TRUE if editing another file */ + int oldbuf; /* TRUE if using existing buffer */ +--- 3086,3106 ---- + * ECMD_OLDBUF: use existing buffer if it exists + * ECMD_FORCEIT: ! used for Ex command + * ECMD_ADDBUF: don't edit, just add to buffer list ++ * oldwin: Should be "curwin" when editing a new buffer in the current ++ * window, NULL when splitting the window first. When not NULL info ++ * of the previous buffer for "oldwin" is stored. + * + * return FAIL for failure, OK otherwise + */ + int +! do_ecmd(fnum, ffname, sfname, eap, newlnum, flags, oldwin) + int fnum; + char_u *ffname; + char_u *sfname; + exarg_T *eap; /* can be NULL! */ + linenr_T newlnum; + int flags; ++ win_T *oldwin; + { + int other_file; /* TRUE if editing another file */ + int oldbuf; /* TRUE if using existing buffer */ +*************** +*** 3267,3273 **** + { + if (!cmdmod.keepalt) + curwin->w_alt_fnum = curbuf->b_fnum; +! buflist_altfpos(); + } + + if (fnum) +--- 3272,3279 ---- + { + if (!cmdmod.keepalt) + curwin->w_alt_fnum = curbuf->b_fnum; +! if (oldwin != NULL) +! buflist_altfpos(oldwin); + } + + if (fnum) +*************** +*** 3371,3377 **** + + /* close the link to the current buffer */ + u_sync(FALSE); +! close_buffer(curwin, curbuf, + (flags & ECMD_HIDE) ? 0 : DOBUF_UNLOAD); + + #ifdef FEAT_AUTOCMD +--- 3377,3383 ---- + + /* close the link to the current buffer */ + u_sync(FALSE); +! close_buffer(oldwin, curbuf, + (flags & ECMD_HIDE) ? 0 : DOBUF_UNLOAD); + + #ifdef FEAT_AUTOCMD +*************** +*** 5609,5615 **** + */ + alt_fnum = curbuf->b_fnum; + (void)do_ecmd(0, NULL, NULL, NULL, ECMD_LASTL, +! ECMD_HIDE + ECMD_SET_HELP); + if (!cmdmod.keepalt) + curwin->w_alt_fnum = alt_fnum; + empty_fnum = curbuf->b_fnum; +--- 5615,5627 ---- + */ + alt_fnum = curbuf->b_fnum; + (void)do_ecmd(0, NULL, NULL, NULL, ECMD_LASTL, +! ECMD_HIDE + ECMD_SET_HELP, +! #ifdef FEAT_WINDOWS +! NULL /* buffer is still open, don't store info */ +! #else +! curwin +! #endif +! ); + if (!cmdmod.keepalt) + curwin->w_alt_fnum = alt_fnum; + empty_fnum = curbuf->b_fnum; +*** ../vim-7.2.040/src/ex_cmds2.c Sun Sep 7 15:49:45 2008 +--- src/ex_cmds2.c Wed Nov 12 17:46:41 2008 +*************** +*** 2132,2139 **** + * argument index. */ + if (do_ecmd(0, alist_name(&ARGLIST[curwin->w_arg_idx]), NULL, + eap, ECMD_LAST, +! (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0) + +! (eap->forceit ? ECMD_FORCEIT : 0)) == FAIL) + curwin->w_arg_idx = old_arg_idx; + /* like Vi: set the mark where the cursor is in the file. */ + else if (eap->cmdidx != CMD_argdo) +--- 2132,2139 ---- + * argument index. */ + if (do_ecmd(0, alist_name(&ARGLIST[curwin->w_arg_idx]), NULL, + eap, ECMD_LAST, +! (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0) +! + (eap->forceit ? ECMD_FORCEIT : 0), curwin) == FAIL) + curwin->w_arg_idx = old_arg_idx; + /* like Vi: set the mark where the cursor is in the file. */ + else if (eap->cmdidx != CMD_argdo) +*** ../vim-7.2.040/src/ex_docmd.c Sun Nov 9 13:43:25 2008 +--- src/ex_docmd.c Wed Nov 12 18:04:22 2008 +*************** +*** 7488,7494 **** + /* ":new" or ":tabnew" without argument: edit an new empty buffer */ + setpcmark(); + (void)do_ecmd(0, NULL, NULL, eap, ECMD_ONE, +! ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0)); + } + else if ((eap->cmdidx != CMD_split + #ifdef FEAT_VERTSPLIT +--- 7488,7495 ---- + /* ":new" or ":tabnew" without argument: edit an new empty buffer */ + setpcmark(); + (void)do_ecmd(0, NULL, NULL, eap, ECMD_ONE, +! ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0), +! old_curwin == NULL ? curwin : NULL); + } + else if ((eap->cmdidx != CMD_split + #ifdef FEAT_VERTSPLIT +*************** +*** 7525,7531 **** + #ifdef FEAT_LISTCMDS + + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0 ) + #endif +! ) == FAIL) + { + /* Editing the file failed. If the window was split, close it. */ + #ifdef FEAT_WINDOWS +--- 7526,7532 ---- + #ifdef FEAT_LISTCMDS + + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0 ) + #endif +! , old_curwin == NULL ? curwin : NULL) == FAIL) + { + /* Editing the file failed. If the window was split, close it. */ + #ifdef FEAT_WINDOWS +*** ../vim-7.2.040/src/ex_getln.c Sun Sep 14 14:41:44 2008 +--- src/ex_getln.c Wed Nov 12 18:06:25 2008 +*************** +*** 6051,6057 **** + cmdwin_type = '-'; + + /* Create the command-line buffer empty. */ +! (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE); + (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE); + set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL); + set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL); +--- 6051,6057 ---- + cmdwin_type = '-'; + + /* Create the command-line buffer empty. */ +! (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL); + (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE); + set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL); + set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL); +*** ../vim-7.2.040/src/if_sniff.c Sat Aug 9 19:41:16 2008 +--- src/if_sniff.c Wed Nov 12 17:48:46 2008 +*************** +*** 1114,1120 **** + char *fname; + { + ++no_wait_return; +! do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF); + curbuf->b_sniff = TRUE; + --no_wait_return; /* [ex_docmd.c] */ + } +--- 1114,1121 ---- + char *fname; + { + ++no_wait_return; +! do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF, +! curwin); + curbuf->b_sniff = TRUE; + --no_wait_return; /* [ex_docmd.c] */ + } +*** ../vim-7.2.040/src/main.c Sun Nov 9 13:43:25 2008 +--- src/main.c Wed Nov 12 17:49:06 2008 +*************** +*** 2588,2594 **** + # endif + (void)do_ecmd(0, arg_idx < GARGCOUNT + ? alist_name(&GARGLIST[arg_idx]) : NULL, +! NULL, NULL, ECMD_LASTL, ECMD_HIDE); + # ifdef HAS_SWAP_EXISTS_ACTION + if (swap_exists_did_quit) + { +--- 2588,2594 ---- + # endif + (void)do_ecmd(0, arg_idx < GARGCOUNT + ? alist_name(&GARGLIST[arg_idx]) : NULL, +! NULL, NULL, ECMD_LASTL, ECMD_HIDE, curwin); + # ifdef HAS_SWAP_EXISTS_ACTION + if (swap_exists_did_quit) + { +*** ../vim-7.2.040/src/netbeans.c Sun Jul 13 19:18:03 2008 +--- src/netbeans.c Wed Nov 12 17:49:40 2008 +*************** +*** 1795,1801 **** + buf->displayname = NULL; + + netbeansReadFile = 0; /* don't try to open disk file */ +! do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF); + netbeansReadFile = 1; + buf->bufp = curbuf; + maketitle(); +--- 1795,1801 ---- + buf->displayname = NULL; + + netbeansReadFile = 0; /* don't try to open disk file */ +! do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF, curwin); + netbeansReadFile = 1; + buf->bufp = curbuf; + maketitle(); +*************** +*** 1960,1966 **** + + netbeansReadFile = 0; /* don't try to open disk file */ + do_ecmd(0, (char_u *)buf->displayname, 0, 0, ECMD_ONE, +! ECMD_HIDE + ECMD_OLDBUF); + netbeansReadFile = 1; + buf->bufp = curbuf; + maketitle(); +--- 1960,1966 ---- + + netbeansReadFile = 0; /* don't try to open disk file */ + do_ecmd(0, (char_u *)buf->displayname, 0, 0, ECMD_ONE, +! ECMD_HIDE + ECMD_OLDBUF, curwin); + netbeansReadFile = 1; + buf->bufp = curbuf; + maketitle(); +*************** +*** 1979,1985 **** + vim_free(buf->displayname); + buf->displayname = nb_unquote(args, NULL); + do_ecmd(0, (char_u *)buf->displayname, NULL, NULL, ECMD_ONE, +! ECMD_HIDE + ECMD_OLDBUF); + buf->bufp = curbuf; + buf->initDone = TRUE; + doupdate = 1; +--- 1979,1985 ---- + vim_free(buf->displayname); + buf->displayname = nb_unquote(args, NULL); + do_ecmd(0, (char_u *)buf->displayname, NULL, NULL, ECMD_ONE, +! ECMD_HIDE + ECMD_OLDBUF, curwin); + buf->bufp = curbuf; + buf->initDone = TRUE; + doupdate = 1; +*** ../vim-7.2.040/src/normal.c Sat Nov 1 13:51:57 2008 +--- src/normal.c Wed Nov 12 17:49:50 2008 +*************** +*** 6050,6056 **** + autowrite(curbuf, FALSE); + setpcmark(); + (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LAST, +! P_HID(curbuf) ? ECMD_HIDE : 0); + if (cap->nchar == 'F' && lnum >= 0) + { + curwin->w_cursor.lnum = lnum; +--- 6050,6056 ---- + autowrite(curbuf, FALSE); + setpcmark(); + (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LAST, +! P_HID(curbuf) ? ECMD_HIDE : 0, curwin); + if (cap->nchar == 'F' && lnum >= 0) + { + curwin->w_cursor.lnum = lnum; +*** ../vim-7.2.040/src/popupmnu.c Sun Jul 13 19:33:51 2008 +--- src/popupmnu.c Wed Nov 12 18:08:07 2008 +*************** +*** 573,579 **** + { + /* Don't want to sync undo in the current buffer. */ + ++no_u_sync; +! res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0); + --no_u_sync; + if (res == OK) + { +--- 573,579 ---- + { + /* Don't want to sync undo in the current buffer. */ + ++no_u_sync; +! res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0, NULL); + --no_u_sync; + if (res == OK) + { +*** ../vim-7.2.040/src/proto/buffer.pro Sun May 6 13:57:53 2007 +--- src/proto/buffer.pro Wed Nov 12 17:43:39 2008 +*************** +*** 33,39 **** + char_u *getaltfname __ARGS((int errmsg)); + int buflist_add __ARGS((char_u *fname, int flags)); + void buflist_slash_adjust __ARGS((void)); +! void buflist_altfpos __ARGS((void)); + int otherfile __ARGS((char_u *ffname)); + void buf_setino __ARGS((buf_T *buf)); + void fileinfo __ARGS((int fullname, int shorthelp, int dont_truncate)); +--- 33,39 ---- + char_u *getaltfname __ARGS((int errmsg)); + int buflist_add __ARGS((char_u *fname, int flags)); + void buflist_slash_adjust __ARGS((void)); +! void buflist_altfpos __ARGS((win_T *win)); + int otherfile __ARGS((char_u *ffname)); + void buf_setino __ARGS((buf_T *buf)); + void fileinfo __ARGS((int fullname, int shorthelp, int dont_truncate)); +*** ../vim-7.2.040/src/proto/ex_cmds.pro Sun Nov 9 13:43:25 2008 +--- src/proto/ex_cmds.pro Wed Nov 12 17:44:27 2008 +*************** +*** 27,33 **** + void do_wqall __ARGS((exarg_T *eap)); + int not_writing __ARGS((void)); + int getfile __ARGS((int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum, int forceit)); +! int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags)); + void ex_append __ARGS((exarg_T *eap)); + void ex_change __ARGS((exarg_T *eap)); + void ex_z __ARGS((exarg_T *eap)); +--- 27,33 ---- + void do_wqall __ARGS((exarg_T *eap)); + int not_writing __ARGS((void)); + int getfile __ARGS((int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum, int forceit)); +! int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags, win_T *oldwin)); + void ex_append __ARGS((exarg_T *eap)); + void ex_change __ARGS((exarg_T *eap)); + void ex_z __ARGS((exarg_T *eap)); +*** ../vim-7.2.040/src/quickfix.c Thu Jul 24 18:44:59 2008 +--- src/quickfix.c Wed Nov 12 18:12:00 2008 +*************** +*** 1420,1425 **** +--- 1420,1426 ---- + win_T *win; + win_T *altwin; + #endif ++ win_T *oldwin = curwin; + int print_message = TRUE; + int len; + #ifdef FEAT_FOLDING +*************** +*** 1744,1750 **** + } + else + ok = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1, +! ECMD_HIDE + ECMD_SET_HELP); + } + else + ok = buflist_getfile(qf_ptr->qf_fnum, +--- 1745,1752 ---- + } + else + ok = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1, +! ECMD_HIDE + ECMD_SET_HELP, +! oldwin == curwin ? curwin : NULL); + } + else + ok = buflist_getfile(qf_ptr->qf_fnum, +*************** +*** 2267,2272 **** +--- 2269,2275 ---- + win_T *win; + tabpage_T *prevtab = curtab; + buf_T *qf_buf; ++ win_T *oldwin = curwin; + + if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow) + { +*************** +*** 2326,2339 **** + win->w_llist->qf_refcount++; + } + + if (qf_buf != NULL) + /* Use the existing quickfix buffer */ + (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE, +! ECMD_HIDE + ECMD_OLDBUF); + else + { + /* Create a new quickfix buffer */ +! (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE); + /* switch off 'swapfile' */ + set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL); + set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix", +--- 2329,2344 ---- + win->w_llist->qf_refcount++; + } + ++ if (oldwin != curwin) ++ oldwin = NULL; /* don't store info when in another window */ + if (qf_buf != NULL) + /* Use the existing quickfix buffer */ + (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE, +! ECMD_HIDE + ECMD_OLDBUF, oldwin); + else + { + /* Create a new quickfix buffer */ +! (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin); + /* switch off 'swapfile' */ + set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL); + set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix", +*** ../vim-7.2.040/src/window.c Wed Aug 6 18:32:11 2008 +--- src/window.c Wed Nov 12 18:12:37 2008 +*************** +*** 531,537 **** + # ifdef FEAT_SCROLLBIND + curwin->w_p_scb = FALSE; + # endif +! (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, ECMD_HIDE); + if (nchar == 'F' && lnum >= 0) + { + curwin->w_cursor.lnum = lnum; +--- 531,538 ---- + # ifdef FEAT_SCROLLBIND + curwin->w_p_scb = FALSE; + # endif +! (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, +! ECMD_HIDE, NULL); + if (nchar == 'F' && lnum >= 0) + { + curwin->w_cursor.lnum = lnum; +*** ../vim-7.2.040/src/version.c Wed Nov 12 16:04:43 2008 +--- src/version.c Wed Nov 12 16:54:35 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 41, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +260. Co-workers have to E-mail you about the fire alarm to get + you out of the building. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.042 b/7.2.042 new file mode 100644 index 00000000..cd2b5689 --- /dev/null +++ b/7.2.042 @@ -0,0 +1,166 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.042 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.042 +Problem: When using winrestview() in a BufWinEnter autocommand the window + is scrolled anyway. (Matt Zyzik) +Solution: Don't recompute topline when above 'scrolloff' from the bottom. + Don't always put the cursor halfway when entering a buffer. Add + "w_topline_was_set". +Files: src/buffer.c, src/move.c, src/structs.h + + +*** ../vim-7.2.041/src/buffer.c Sat Nov 15 14:10:23 2008 +--- src/buffer.c Sat Nov 15 14:58:52 2008 +*************** +*** 1401,1406 **** +--- 1401,1409 ---- + curwin->w_cursor.coladd = 0; + #endif + curwin->w_set_curswant = TRUE; ++ #ifdef FEAT_AUTOCMD ++ curwin->w_topline_was_set = FALSE; ++ #endif + + /* Make sure the buffer is loaded. */ + if (curbuf->b_ml.ml_mfp == NULL) /* need to load the file */ +*************** +*** 1440,1446 **** + maketitle(); + #endif + #ifdef FEAT_AUTOCMD +! if (curwin->w_topline == 1) /* when autocmds didn't change it */ + #endif + scroll_cursor_halfway(FALSE); /* redisplay at correct position */ + +--- 1443,1450 ---- + maketitle(); + #endif + #ifdef FEAT_AUTOCMD +! /* when autocmds didn't change it */ +! if (curwin->w_topline == 1 && !curwin->w_topline_was_set) + #endif + scroll_cursor_halfway(FALSE); /* redisplay at correct position */ + +*** ../vim-7.2.041/src/move.c Sun Jul 13 19:25:23 2008 +--- src/move.c Sat Nov 15 14:56:47 2008 +*************** +*** 280,297 **** + + if (curwin->w_botline <= curbuf->b_ml.ml_line_count) + { +! if (curwin->w_cursor.lnum < curwin->w_botline +! && ((long)curwin->w_cursor.lnum + >= (long)curwin->w_botline - p_so + #ifdef FEAT_FOLDING + || hasAnyFolding(curwin) + #endif + )) +! { + lineoff_T loff; + +! /* Cursor is above botline, check if there are 'scrolloff' +! * window lines below the cursor. If not, need to scroll. */ + n = curwin->w_empty_rows; + loff.lnum = curwin->w_cursor.lnum; + #ifdef FEAT_FOLDING +--- 280,299 ---- + + if (curwin->w_botline <= curbuf->b_ml.ml_line_count) + { +! if (curwin->w_cursor.lnum < curwin->w_botline) +! { +! if (((long)curwin->w_cursor.lnum + >= (long)curwin->w_botline - p_so + #ifdef FEAT_FOLDING + || hasAnyFolding(curwin) + #endif + )) +! { + lineoff_T loff; + +! /* Cursor is (a few lines) above botline, check if there are +! * 'scrolloff' window lines below the cursor. If not, need to +! * scroll. */ + n = curwin->w_empty_rows; + loff.lnum = curwin->w_cursor.lnum; + #ifdef FEAT_FOLDING +*************** +*** 317,322 **** +--- 319,328 ---- + if (n >= p_so) + /* sufficient context, no need to scroll */ + check_botline = FALSE; ++ } ++ else ++ /* sufficient context, no need to scroll */ ++ check_botline = FALSE; + } + if (check_botline) + { +*************** +*** 509,514 **** +--- 515,523 ---- + /* Approximate the value of w_botline */ + wp->w_botline += lnum - wp->w_topline; + wp->w_topline = lnum; ++ #ifdef FEAT_AUTOCMD ++ wp->w_topline_was_set = TRUE; ++ #endif + #ifdef FEAT_DIFF + wp->w_topfill = 0; + #endif +*** ../vim-7.2.041/src/structs.h Sun Nov 9 13:43:25 2008 +--- src/structs.h Sat Nov 15 14:56:42 2008 +*************** +*** 1784,1793 **** + #endif + + /* +! * The next three specify the offsets for displaying the buffer: + */ + linenr_T w_topline; /* buffer line number of the line at the + top of the window */ + #ifdef FEAT_DIFF + int w_topfill; /* number of filler lines above w_topline */ + int w_old_topfill; /* w_topfill at last redraw */ +--- 1784,1798 ---- + #endif + + /* +! * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for +! * displaying the buffer. + */ + linenr_T w_topline; /* buffer line number of the line at the + top of the window */ ++ #ifdef FEAT_AUTOCMD ++ char w_topline_was_set; /* flag set to TRUE when topline is set, ++ e.g. by winrestview() */ ++ #endif + #ifdef FEAT_DIFF + int w_topfill; /* number of filler lines above w_topline */ + int w_old_topfill; /* w_topfill at last redraw */ +*** ../vim-7.2.041/src/version.c Sat Nov 15 14:10:23 2008 +--- src/version.c Sat Nov 15 16:01:29 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 42, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +261. You find diskettes in your pockets when doing laundry. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.043 b/7.2.043 new file mode 100644 index 00000000..5c522547 --- /dev/null +++ b/7.2.043 @@ -0,0 +1,78 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.043 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.043 +Problem: VMS: Too many characters are escaped in filename and shell + commands. +Solution: Escape fewer characters. (Zoltan Arpadffy) +Files: src/vim.h + + +*** ../vim-7.2.042/src/vim.h Sun Nov 9 13:43:25 2008 +--- src/vim.h Fri Nov 14 21:41:17 2008 +*************** +*** 341,348 **** + #ifdef BACKSLASH_IN_FILENAME + # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<") + #else +! # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<") +! # define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&") + #endif + + #define NUMBUFLEN 30 /* length of a buffer to store a number in ASCII */ +--- 341,354 ---- + #ifdef BACKSLASH_IN_FILENAME + # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<") + #else +! # ifdef VMS +! /* VMS allows a lot of characters in the file name */ +! # define PATH_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'\"|!") +! # define SHELL_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'|!()&") +! # else +! # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<") +! # define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&") +! # endif + #endif + + #define NUMBUFLEN 30 /* length of a buffer to store a number in ASCII */ +*************** +*** 370,376 **** + * Define __w64 as an empty token for everything but MSVC 7.x or later. + */ + # if !defined(_MSC_VER) || (_MSC_VER < 1300) +! # define __w64 + # endif + typedef unsigned long __w64 long_u; + typedef long __w64 long_i; +--- 376,382 ---- + * Define __w64 as an empty token for everything but MSVC 7.x or later. + */ + # if !defined(_MSC_VER) || (_MSC_VER < 1300) +! # define __w64 + # endif + typedef unsigned long __w64 long_u; + typedef long __w64 long_i; +*** ../vim-7.2.042/src/version.c Sat Nov 15 16:05:30 2008 +--- src/version.c Thu Nov 20 10:23:51 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 43, + /**/ + +-- +In his lifetime van Gogh painted 486 oil paintings. Oddly enough, 8975 +of them are to be found in the United States. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.044 b/7.2.044 new file mode 100644 index 00000000..4cfe651e --- /dev/null +++ b/7.2.044 @@ -0,0 +1,161 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.044 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.044 +Problem: Crash because of STRCPY() being over protective of the destination + size. (Dominique Pelle) +Solution: Add -D_FORTIFY_SOURCE=1 to CFLAGS. Use an intermediate variable + for the pointer to avoid a warning. +Files: src/auto/configure, src/configure.in, src/eval.c + + +*** ../vim-7.2.043/src/auto/configure Thu Jul 24 17:20:50 2008 +--- src/auto/configure Sun Nov 16 17:08:44 2008 +*************** +*** 16819,16839 **** + LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" + fi + +- { $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5 +- $as_echo_n "checking for GCC 3 or later... " >&6; } + DEPEND_CFLAGS_FILTER= + if test "$GCC" = yes; then + gccmajor=`echo "$gccversion" | sed -e 's/^\([1-9]\)\..*$/\1/g'` + if test "$gccmajor" -gt "2"; then + DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'" +! fi +! fi +! if test "$DEPEND_CFLAGS_FILTER" = ""; then +! { $as_echo "$as_me:$LINENO: result: no" >&5 + $as_echo "no" >&6; } +! else +! { $as_echo "$as_me:$LINENO: result: yes" >&5 + $as_echo "yes" >&6; } + fi + + +--- 16819,16847 ---- + LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" + fi + + DEPEND_CFLAGS_FILTER= + if test "$GCC" = yes; then ++ { $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5 ++ $as_echo_n "checking for GCC 3 or later... " >&6; } + gccmajor=`echo "$gccversion" | sed -e 's/^\([1-9]\)\..*$/\1/g'` + if test "$gccmajor" -gt "2"; then + DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'" +! { $as_echo "$as_me:$LINENO: result: yes" >&5 +! $as_echo "yes" >&6; } +! else +! { $as_echo "$as_me:$LINENO: result: no" >&5 + $as_echo "no" >&6; } +! fi +! { $as_echo "$as_me:$LINENO: checking whether we need -D_FORTIFY_SOURCE=1" >&5 +! $as_echo_n "checking whether we need -D_FORTIFY_SOURCE=1... " >&6; } +! if test "$gccmajor" -gt "3"; then +! CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=1" +! { $as_echo "$as_me:$LINENO: result: yes" >&5 + $as_echo "yes" >&6; } ++ else ++ { $as_echo "$as_me:$LINENO: result: no" >&5 ++ $as_echo "no" >&6; } ++ fi + fi + + +*** ../vim-7.2.043/src/configure.in Thu Jul 24 17:20:31 2008 +--- src/configure.in Sun Nov 16 17:08:40 2008 +*************** +*** 3152,3169 **** + dnl But only when making dependencies, cproto and lint don't take "-isystem". + dnl Mac gcc returns "powerpc-apple-darwin8-gcc-4.0.1 (GCC)...", need to allow + dnl the number before the version number. +- AC_MSG_CHECKING(for GCC 3 or later) + DEPEND_CFLAGS_FILTER= + if test "$GCC" = yes; then + gccmajor=`echo "$gccversion" | sed -e 's/^\([[1-9]]\)\..*$/\1/g'` + if test "$gccmajor" -gt "2"; then + DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'" + fi +- fi +- if test "$DEPEND_CFLAGS_FILTER" = ""; then +- AC_MSG_RESULT(no) +- else +- AC_MSG_RESULT(yes) + fi + AC_SUBST(DEPEND_CFLAGS_FILTER) + +--- 3152,3176 ---- + dnl But only when making dependencies, cproto and lint don't take "-isystem". + dnl Mac gcc returns "powerpc-apple-darwin8-gcc-4.0.1 (GCC)...", need to allow + dnl the number before the version number. + DEPEND_CFLAGS_FILTER= + if test "$GCC" = yes; then ++ AC_MSG_CHECKING(for GCC 3 or later) + gccmajor=`echo "$gccversion" | sed -e 's/^\([[1-9]]\)\..*$/\1/g'` + if test "$gccmajor" -gt "2"; then + DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'" ++ AC_MSG_RESULT(yes) ++ else ++ AC_MSG_RESULT(no) ++ fi ++ dnl -D_FORTIFY_SOURCE=2 crashes Vim on strcpy(buf, "000") when buf is ++ dnl declared as char x[1] but actually longer. Introduced in gcc 4.0. ++ AC_MSG_CHECKING(whether we need -D_FORTIFY_SOURCE=1) ++ if test "$gccmajor" -gt "3"; then ++ CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=1" ++ AC_MSG_RESULT(yes) ++ else ++ AC_MSG_RESULT(no) + fi + fi + AC_SUBST(DEPEND_CFLAGS_FILTER) + +*** ../vim-7.2.043/src/eval.c Wed Nov 12 15:28:37 2008 +--- src/eval.c Sun Nov 16 20:46:28 2008 +*************** +*** 21150,21157 **** + init_var_dict(&fc.l_avars, &fc.l_avars_var); + add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "0", + (varnumber_T)(argcount - fp->uf_args.ga_len)); + v = &fc.fixvar[fixvar_idx++].var; +! STRCPY(v->di_key, "000"); + v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; + hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v)); + v->di_tv.v_type = VAR_LIST; +--- 21150,21160 ---- + init_var_dict(&fc.l_avars, &fc.l_avars_var); + add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "0", + (varnumber_T)(argcount - fp->uf_args.ga_len)); ++ /* Use "name" to avoid a warning from some compiler that checks the ++ * destination size. */ + v = &fc.fixvar[fixvar_idx++].var; +! name = v->di_key; +! STRCPY(name, "000"); + v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; + hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v)); + v->di_tv.v_type = VAR_LIST; +*** ../vim-7.2.043/src/version.c Thu Nov 20 10:26:19 2008 +--- src/version.c Thu Nov 20 10:34:31 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 44, + /**/ + +-- +Error:015 - Unable to exit Windows. Try the door. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.045 b/7.2.045 new file mode 100644 index 00000000..cf37908d --- /dev/null +++ b/7.2.045 @@ -0,0 +1,67 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.045 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.045 +Problem: The Python interface has an empty entry in sys.path. +Solution: Filter out the empty entry. (idea from James Vega) +Files: src/if_python.c + + +*** ../vim-7.2.044/src/if_python.c Thu Jul 24 16:24:48 2008 +--- src/if_python.c Thu Nov 20 11:03:53 2008 +*************** +*** 531,536 **** +--- 531,542 ---- + if (PythonMod_Init()) + goto fail; + ++ /* Remove the element from sys.path that was added because of our ++ * argv[0] value in PythonMod_Init(). Previously we used an empty ++ * string, but dependinding on the OS we then get an empty entry or ++ * the current directory in sys.path. */ ++ PyRun_SimpleString("import sys; sys.path = filter(lambda x: x != '/must>not&exist', sys.path)"); ++ + /* the first python thread is vim's, release the lock */ + Python_SaveThread(); + +*************** +*** 2345,2351 **** + { + PyObject *mod; + PyObject *dict; +! static char *(argv[2]) = {"", NULL}; + + /* Fixups... */ + BufferType.ob_type = &PyType_Type; +--- 2351,2358 ---- + { + PyObject *mod; + PyObject *dict; +! /* The special value is removed from sys.path in Python_Init(). */ +! static char *(argv[2]) = {"/must>not&exist/foo", NULL}; + + /* Fixups... */ + BufferType.ob_type = &PyType_Type; +*** ../vim-7.2.044/src/version.c Thu Nov 20 10:36:04 2008 +--- src/version.c Thu Nov 20 10:58:11 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 45, + /**/ + +-- +press CTRL-ALT-DEL for more information + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.046 b/7.2.046 new file mode 100644 index 00000000..335f814d --- /dev/null +++ b/7.2.046 @@ -0,0 +1,55 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.046 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.046 +Problem: Wrong check for filling buffer with encoding. (Danek Duvall) +Solution: Remove pointers. (Dominique Pelle) +Files: src/mbyte.c + + +*** ../vim-7.2.045/src/mbyte.c Wed Nov 12 13:07:48 2008 +--- src/mbyte.c Wed Nov 19 21:44:50 2008 +*************** +*** 3131,3137 **** + else + s = p + 1; + } +! for (i = 0; s[i] != NUL && s + i < buf + sizeof(buf) - 1; ++i) + { + if (s[i] == '_' || s[i] == '-') + buf[i] = '-'; +--- 3131,3137 ---- + else + s = p + 1; + } +! for (i = 0; s[i] != NUL && i < sizeof(buf) - 1; ++i) + { + if (s[i] == '_' || s[i] == '-') + buf[i] = '-'; +*** ../vim-7.2.045/src/version.c Thu Nov 20 11:04:01 2008 +--- src/version.c Thu Nov 20 11:54:23 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 46, + /**/ + +-- + He was not in the least bit scared to be mashed into a pulp + Or to have his eyes gouged out and his elbows broken; + To have his kneecaps split and his body burned away + And his limbs all hacked and mangled, brave Sir Robin. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.047 b/7.2.047 new file mode 100644 index 00000000..5826d2a9 --- /dev/null +++ b/7.2.047 @@ -0,0 +1,88 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.047 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.047 +Problem: Starting Vim with the -nb argument while it's not supported causes + the other side to hang. +Solution: When -nb is used while it's not supported exit Vim. (Xavier de + Gaye) +Files: src/main.c, src/vim.h + + +*** ../vim-7.2.046/src/main.c Sat Nov 15 14:10:23 2008 +--- src/main.c Thu Nov 20 14:09:27 2008 +*************** +*** 1510,1516 **** + early_arg_scan(parmp) + mparm_T *parmp; + { +! #if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER) + int argc = parmp->argc; + char **argv = parmp->argv; + int i; +--- 1510,1517 ---- + early_arg_scan(parmp) + mparm_T *parmp; + { +! #if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER) \ +! || !defined(FEAT_NETBEANS_INTG) + int argc = parmp->argc; + char **argv = parmp->argv; + int i; +*************** +*** 1582,1587 **** +--- 1583,1596 ---- + else if (STRICMP(argv[i], "--echo-wid") == 0) + echo_wid_arg = TRUE; + # endif ++ # ifndef FEAT_NETBEANS_INTG ++ else if (strncmp(argv[i], "-nb", (size_t)3) == 0) ++ { ++ mch_errmsg(_("'-nb' cannot be used: not enabled at compile time\n")); ++ mch_exit(2); ++ } ++ # endif ++ + } + #endif + } +*** ../vim-7.2.046/src/vim.h Thu Nov 20 10:26:19 2008 +--- src/vim.h Thu Nov 20 12:06:14 2008 +*************** +*** 1986,1991 **** +--- 1986,1994 ---- + # endif + #endif + ++ #ifndef FEAT_NETBEANS_INTG ++ # undef NBDEBUG ++ #endif + #ifdef NBDEBUG /* Netbeans debugging. */ + # include "nbdebug.h" + #else +*** ../vim-7.2.046/src/version.c Thu Nov 20 11:55:53 2008 +--- src/version.c Thu Nov 20 14:07:57 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 47, + /**/ + +-- +FIRST HEAD: Oh! quick! get the sword out I want to cut his head off. +THIRD HEAD: Oh, cut your own head off. +SECOND HEAD: Yes - do us all a favour. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.048 b/7.2.048 new file mode 100644 index 00000000..3975308b --- /dev/null +++ b/7.2.048 @@ -0,0 +1,160 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.048 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.048 +Problem: v:prevcount is changed too often. Counts are not multiplied when + setting v:count. +Solution: Set v:prevcount properly. Multiply counts. (idea by Ben Schmidt) +Files: src/eval.c, src/normal.c, src/proto/eval.pro + + +*** ../vim-7.2.047/src/eval.c Thu Nov 20 10:36:04 2008 +--- src/eval.c Thu Nov 20 15:53:47 2008 +*************** +*** 18146,18159 **** + } + + /* +! * Set v:count, v:count1 and v:prevcount. + */ + void +! set_vcount(count, count1) + long count; + long count1; + { +! vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr; + vimvars[VV_COUNT].vv_nr = count; + vimvars[VV_COUNT1].vv_nr = count1; + } +--- 18146,18162 ---- + } + + /* +! * Set v:count to "count" and v:count1 to "count1". +! * When "set_prevcount" is TRUE first set v:prevcount from v:count. + */ + void +! set_vcount(count, count1, set_prevcount) + long count; + long count1; ++ int set_prevcount; + { +! if (set_prevcount) +! vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr; + vimvars[VV_COUNT].vv_nr = count; + vimvars[VV_COUNT1].vv_nr = count1; + } +*** ../vim-7.2.047/src/normal.c Sat Nov 15 14:10:23 2008 +--- src/normal.c Thu Nov 20 16:04:44 2008 +*************** +*** 580,585 **** +--- 580,588 ---- + static int old_mapped_len = 0; + #endif + int idx; ++ #ifdef FEAT_EVAL ++ int set_prevcount = FALSE; ++ #endif + + vim_memset(&ca, 0, sizeof(ca)); /* also resets ca.retval */ + ca.oap = oap; +*************** +*** 615,621 **** +--- 618,629 ---- + /* When not finishing an operator and no register name typed, reset the + * count. */ + if (!finish_op && !oap->regname) ++ { + ca.opcount = 0; ++ #ifdef FEAT_EVAL ++ set_prevcount = TRUE; ++ #endif ++ } + + #ifdef FEAT_AUTOCMD + /* Restore counts from before receiving K_CURSORHOLD. This means after +*************** +*** 719,725 **** + * command, so that v:count can be used in an expression mapping + * right after the count. */ + if (toplevel && stuff_empty()) +! set_vcount(ca.count0, ca.count0 == 0 ? 1 : ca.count0); + #endif + if (ctrl_w) + { +--- 727,741 ---- + * command, so that v:count can be used in an expression mapping + * right after the count. */ + if (toplevel && stuff_empty()) +! { +! long count = ca.count0; +! +! /* multiply with ca.opcount the same way as below */ +! if (ca.opcount != 0) +! count = ca.opcount * (count == 0 ? 1 : count); +! set_vcount(count, count == 0 ? 1 : count, set_prevcount); +! set_prevcount = FALSE; /* only set v:prevcount once */ +! } + #endif + if (ctrl_w) + { +*************** +*** 806,812 **** + * Only set v:count when called from main() and not a stuffed command. + */ + if (toplevel && stuff_empty()) +! set_vcount(ca.count0, ca.count1); + #endif + + /* +--- 822,828 ---- + * Only set v:count when called from main() and not a stuffed command. + */ + if (toplevel && stuff_empty()) +! set_vcount(ca.count0, ca.count1, set_prevcount); + #endif + + /* +*** ../vim-7.2.047/src/proto/eval.pro Sun Nov 9 13:43:25 2008 +--- src/proto/eval.pro Thu Nov 20 15:53:54 2008 +*************** +*** 61,67 **** + long get_vim_var_nr __ARGS((int idx)); + char_u *get_vim_var_str __ARGS((int idx)); + list_T *get_vim_var_list __ARGS((int idx)); +! void set_vcount __ARGS((long count, long count1)); + void set_vim_var_string __ARGS((int idx, char_u *val, int len)); + void set_vim_var_list __ARGS((int idx, list_T *val)); + void set_reg_var __ARGS((int c)); +--- 61,67 ---- + long get_vim_var_nr __ARGS((int idx)); + char_u *get_vim_var_str __ARGS((int idx)); + list_T *get_vim_var_list __ARGS((int idx)); +! void set_vcount __ARGS((long count, long count1, int set_prevcount)); + void set_vim_var_string __ARGS((int idx, char_u *val, int len)); + void set_vim_var_list __ARGS((int idx, list_T *val)); + void set_reg_var __ARGS((int c)); +*** ../vim-7.2.047/src/version.c Thu Nov 20 14:11:47 2008 +--- src/version.c Thu Nov 20 16:08:19 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 48, + /**/ + +-- +Microsoft's definition of a boolean: TRUE, FALSE, MAYBE +"Embrace and extend"...? + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.049 b/7.2.049 new file mode 100644 index 00000000..0f6efa87 --- /dev/null +++ b/7.2.049 @@ -0,0 +1,1193 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.049 (extra) +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.049 (extra) +Problem: Win32: the clipboard doesn't support UTF-16. +Solution: Change UCS-2 support to UTF-16 support. (Jia Yanwei) +Files: src/gui_w32.c, src/gui_w48.c, src/mbyte.c, src/misc1.c, + src/os_mswin.c, src/os_win32.c, src/proto/os_mswin.pro + + +*** ../vim-7.2.048/src/gui_w32.c Tue Jun 24 23:46:14 2008 +--- src/gui_w32.c Thu Nov 20 16:47:10 2008 +*************** +*** 992,998 **** + SendMessage(lpdi->hdr.hwndFrom, TTM_SETMAXTIPWIDTH, + 0, 500); + +! tt_text = enc_to_ucs2(str, NULL); + lpdi->lpszText = tt_text; + /* can't show tooltip if failed */ + } +--- 992,998 ---- + SendMessage(lpdi->hdr.hwndFrom, TTM_SETMAXTIPWIDTH, + 0, 500); + +! tt_text = enc_to_utf16(str, NULL); + lpdi->lpszText = tt_text; + /* can't show tooltip if failed */ + } +*************** +*** 1935,1941 **** + if (buf == NULL) + return NULL; + +! convbuf = ucs2_to_enc(buf, lenp); + pImmReleaseContext(hwnd, hIMC); + vim_free(buf); + return convbuf; +--- 1935,1941 ---- + if (buf == NULL) + return NULL; + +! convbuf = utf16_to_enc(buf, lenp); + pImmReleaseContext(hwnd, hIMC); + vim_free(buf); + return convbuf; +*************** +*** 2566,2572 **** + { + /* 'encoding' differs from active codepage: convert menu name + * and use wide function */ +! wn = enc_to_ucs2(menu->name, NULL); + if (wn != NULL) + { + MENUITEMINFOW infow; +--- 2566,2572 ---- + { + /* 'encoding' differs from active codepage: convert menu name + * and use wide function */ +! wn = enc_to_utf16(menu->name, NULL); + if (wn != NULL) + { + MENUITEMINFOW infow; +*************** +*** 2728,2734 **** + { + /* 'encoding' differs from active codepage: convert menu item name + * and use wide function */ +! wn = enc_to_ucs2(menu->name, NULL); + if (wn != NULL) + { + n = InsertMenuW(parent->submenu_id, (UINT)idx, +--- 2728,2734 ---- + { + /* 'encoding' differs from active codepage: convert menu item name + * and use wide function */ +! wn = enc_to_utf16(menu->name, NULL); + if (wn != NULL) + { + n = InsertMenuW(parent->submenu_id, (UINT)idx, +*************** +*** 3570,3576 **** + if (enc_codepage == 0 && (int)GetACP() != enc_codepage) + { + /* Not a codepage, use our own conversion function. */ +! wn = enc_to_ucs2(lpAnsiIn, NULL); + if (wn != NULL) + { + wcscpy(lpWCStr, wn); +--- 3570,3576 ---- + if (enc_codepage == 0 && (int)GetACP() != enc_codepage) + { + /* Not a codepage, use our own conversion function. */ +! wn = enc_to_utf16(lpAnsiIn, NULL); + if (wn != NULL) + { + wcscpy(lpWCStr, wn); +*** ../vim-7.2.048/src/gui_w48.c Wed Nov 12 13:35:31 2008 +--- src/gui_w48.c Thu Nov 20 16:42:32 2008 +*************** +*** 547,553 **** + else + { + len = 1; +! ws = ucs2_to_enc(wstring, &len); + if (ws == NULL) + len = 0; + else +--- 547,553 ---- + else + { + len = 1; +! ws = utf16_to_enc(wstring, &len); + if (ws == NULL) + len = 0; + else +*************** +*** 2128,2134 **** + { + /* 'encoding' differs from active codepage: convert text and use wide + * function */ +! wstr = enc_to_ucs2(str, &wlen); + if (wstr != NULL) + { + n = GetTextExtentPointW(hdc, wstr, wlen, &size); +--- 2128,2134 ---- + { + /* 'encoding' differs from active codepage: convert text and use wide + * function */ +! wstr = enc_to_utf16(str, &wlen); + if (wstr != NULL) + { + n = GetTextExtentPointW(hdc, wstr, wlen, &size); +*************** +*** 2252,2258 **** + { + /* 'encoding' differs from active codepage: convert menu name + * and use wide function */ +! wn = enc_to_ucs2(item_text, NULL); + if (wn != NULL) + { + MENUITEMINFOW infow; +--- 2252,2258 ---- + { + /* 'encoding' differs from active codepage: convert menu name + * and use wide function */ +! wn = enc_to_utf16(item_text, NULL); + if (wn != NULL) + { + MENUITEMINFOW infow; +*************** +*** 2422,2428 **** + if (use_unicode) + { + /* Need to go through Unicode. */ +! wstr = enc_to_ucs2(NameBuff, NULL); + if (wstr != NULL) + { + TCITEMW tiw; +--- 2422,2428 ---- + if (use_unicode) + { + /* Need to go through Unicode. */ +! wstr = enc_to_utf16(NameBuff, NULL); + if (wstr != NULL) + { + TCITEMW tiw; +*************** +*** 2521,2528 **** + WCHAR *wbuf; + int n; + +! /* Convert the title from 'encoding' to ucs2. */ +! wbuf = (WCHAR *)enc_to_ucs2((char_u *)title, NULL); + if (wbuf != NULL) + { + n = SetWindowTextW(hwnd, wbuf); +--- 2521,2528 ---- + WCHAR *wbuf; + int n; + +! /* Convert the title from 'encoding' to UTF-16. */ +! wbuf = (WCHAR *)enc_to_utf16((char_u *)title, NULL); + if (wbuf != NULL) + { + n = SetWindowTextW(hwnd, wbuf); +*************** +*** 3222,3228 **** + char_u *initdir, + char_u *filter) + { +! /* We always use the wide function. This means enc_to_ucs2() must work, + * otherwise it fails miserably! */ + OPENFILENAMEW fileStruct; + WCHAR fileBuf[MAXPATHL]; +--- 3222,3228 ---- + char_u *initdir, + char_u *filter) + { +! /* We always use the wide function. This means enc_to_utf16() must work, + * otherwise it fails miserably! */ + OPENFILENAMEW fileStruct; + WCHAR fileBuf[MAXPATHL]; +*************** +*** 3238,3244 **** + fileBuf[0] = NUL; + else + { +! wp = enc_to_ucs2(dflt, NULL); + if (wp == NULL) + fileBuf[0] = NUL; + else +--- 3238,3244 ---- + fileBuf[0] = NUL; + else + { +! wp = enc_to_utf16(dflt, NULL); + if (wp == NULL) + fileBuf[0] = NUL; + else +*************** +*** 3263,3273 **** + #endif + + if (title != NULL) +! titlep = enc_to_ucs2(title, NULL); + fileStruct.lpstrTitle = titlep; + + if (ext != NULL) +! extp = enc_to_ucs2(ext, NULL); + fileStruct.lpstrDefExt = extp; + + fileStruct.lpstrFile = fileBuf; +--- 3263,3273 ---- + #endif + + if (title != NULL) +! titlep = enc_to_utf16(title, NULL); + fileStruct.lpstrTitle = titlep; + + if (ext != NULL) +! extp = enc_to_utf16(ext, NULL); + fileStruct.lpstrDefExt = extp; + + fileStruct.lpstrFile = fileBuf; +*************** +*** 3278,3284 **** + if (initdir != NULL && *initdir != NUL) + { + /* Must have backslashes here, no matter what 'shellslash' says */ +! initdirp = enc_to_ucs2(initdir, NULL); + if (initdirp != NULL) + { + for (wp = initdirp; *wp != NUL; ++wp) +--- 3278,3284 ---- + if (initdir != NULL && *initdir != NUL) + { + /* Must have backslashes here, no matter what 'shellslash' says */ +! initdirp = enc_to_utf16(initdir, NULL); + if (initdirp != NULL) + { + for (wp = initdirp; *wp != NUL; ++wp) +*************** +*** 3318,3324 **** + vim_free(extp); + + /* Convert from UCS2 to 'encoding'. */ +! p = ucs2_to_enc(fileBuf, NULL); + if (p != NULL) + /* when out of memory we get garbage for non-ASCII chars */ + STRCPY(fileBuf, p); +--- 3318,3324 ---- + vim_free(extp); + + /* Convert from UCS2 to 'encoding'. */ +! p = utf16_to_enc(fileBuf, NULL); + if (p != NULL) + /* when out of memory we get garbage for non-ASCII chars */ + STRCPY(fileBuf, p); +*************** +*** 3518,3524 **** + { + #ifdef FEAT_MBYTE + if (DragQueryFileW(hDrop, i, wszFile, BUFPATHLEN) > 0) +! fnames[i] = ucs2_to_enc(wszFile, NULL); + else + #endif + { +--- 3518,3524 ---- + { + #ifdef FEAT_MBYTE + if (DragQueryFileW(hDrop, i, wszFile, BUFPATHLEN) > 0) +! fnames[i] = utf16_to_enc(wszFile, NULL); + else + #endif + { +*** ../vim-7.2.048/src/mbyte.c Thu Nov 20 11:55:53 2008 +--- src/mbyte.c Thu Nov 20 16:47:41 2008 +*************** +*** 6101,6107 **** + + /* 1. codepage/UTF-8 -> ucs-2. */ + if (vcp->vc_cpfrom == 0) +! tmp_len = utf8_to_ucs2(ptr, len, NULL, NULL); + else + tmp_len = MultiByteToWideChar(vcp->vc_cpfrom, 0, + ptr, len, 0, 0); +--- 6101,6107 ---- + + /* 1. codepage/UTF-8 -> ucs-2. */ + if (vcp->vc_cpfrom == 0) +! tmp_len = utf8_to_utf16(ptr, len, NULL, NULL); + else + tmp_len = MultiByteToWideChar(vcp->vc_cpfrom, 0, + ptr, len, 0, 0); +*************** +*** 6109,6121 **** + if (tmp == NULL) + break; + if (vcp->vc_cpfrom == 0) +! utf8_to_ucs2(ptr, len, tmp, unconvlenp); + else + MultiByteToWideChar(vcp->vc_cpfrom, 0, ptr, len, tmp, tmp_len); + + /* 2. ucs-2 -> codepage/UTF-8. */ + if (vcp->vc_cpto == 0) +! retlen = ucs2_to_utf8(tmp, tmp_len, NULL); + else + retlen = WideCharToMultiByte(vcp->vc_cpto, 0, + tmp, tmp_len, 0, 0, 0, 0); +--- 6109,6121 ---- + if (tmp == NULL) + break; + if (vcp->vc_cpfrom == 0) +! utf8_to_utf16(ptr, len, tmp, unconvlenp); + else + MultiByteToWideChar(vcp->vc_cpfrom, 0, ptr, len, tmp, tmp_len); + + /* 2. ucs-2 -> codepage/UTF-8. */ + if (vcp->vc_cpto == 0) +! retlen = utf16_to_utf8(tmp, tmp_len, NULL); + else + retlen = WideCharToMultiByte(vcp->vc_cpto, 0, + tmp, tmp_len, 0, 0, 0, 0); +*************** +*** 6123,6129 **** + if (retval != NULL) + { + if (vcp->vc_cpto == 0) +! ucs2_to_utf8(tmp, tmp_len, retval); + else + WideCharToMultiByte(vcp->vc_cpto, 0, + tmp, tmp_len, retval, retlen, 0, 0); +--- 6123,6129 ---- + if (retval != NULL) + { + if (vcp->vc_cpto == 0) +! utf16_to_utf8(tmp, tmp_len, retval); + else + WideCharToMultiByte(vcp->vc_cpto, 0, + tmp, tmp_len, retval, retlen, 0, 0); +*** ../vim-7.2.048/src/misc1.c Sun Nov 9 13:43:25 2008 +--- src/misc1.c Thu Nov 20 16:42:59 2008 +*************** +*** 8728,8734 **** + /* The active codepage differs from 'encoding'. Attempt using the + * wide function. If it fails because it is not implemented fall back + * to the non-wide version (for Windows 98) */ +! wn = enc_to_ucs2(buf, NULL); + if (wn != NULL) + { + hFind = FindFirstFileW(wn, &wfb); +--- 8728,8734 ---- + /* The active codepage differs from 'encoding'. Attempt using the + * wide function. If it fails because it is not implemented fall back + * to the non-wide version (for Windows 98) */ +! wn = enc_to_utf16(buf, NULL); + if (wn != NULL) + { + hFind = FindFirstFileW(wn, &wfb); +*************** +*** 8756,8762 **** + #ifdef WIN3264 + # ifdef FEAT_MBYTE + if (wn != NULL) +! p = ucs2_to_enc(wfb.cFileName, NULL); /* p is allocated here */ + else + # endif + p = (char_u *)fb.cFileName; +--- 8756,8762 ---- + #ifdef WIN3264 + # ifdef FEAT_MBYTE + if (wn != NULL) +! p = utf16_to_enc(wfb.cFileName, NULL); /* p is allocated here */ + else + # endif + p = (char_u *)fb.cFileName; +*************** +*** 8830,8836 **** + if (wn != NULL) + { + vim_free(wn); +! wn = enc_to_ucs2(buf, NULL); + if (wn != NULL) + hFind = FindFirstFileW(wn, &wfb); + } +--- 8830,8836 ---- + if (wn != NULL) + { + vim_free(wn); +! wn = enc_to_utf16(buf, NULL); + if (wn != NULL) + hFind = FindFirstFileW(wn, &wfb); + } +*** ../vim-7.2.048/src/os_mswin.c Sat Aug 9 19:37:30 2008 +--- src/os_mswin.c Thu Nov 20 17:05:10 2008 +*************** +*** 309,315 **** + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + /* Convert the title from 'encoding' to the active codepage. */ +! WCHAR *wp = enc_to_ucs2(title, NULL); + int n; + + if (wp != NULL) +--- 309,315 ---- + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + /* Convert the title from 'encoding' to the active codepage. */ +! WCHAR *wp = enc_to_utf16(title, NULL); + int n; + + if (wp != NULL) +*************** +*** 406,415 **** + * - invoke _wfullpath() + * - convert the result from UCS2 to 'encoding'. + */ +! wname = enc_to_ucs2(fname, NULL); + if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH - 1) != NULL) + { +! cname = ucs2_to_enc((short_u *)wbuf, NULL); + if (cname != NULL) + { + vim_strncpy(buf, cname, len - 1); +--- 406,415 ---- + * - invoke _wfullpath() + * - convert the result from UCS2 to 'encoding'. + */ +! wname = enc_to_utf16(fname, NULL); + if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH - 1) != NULL) + { +! cname = utf16_to_enc((short_u *)wbuf, NULL); + if (cname != NULL) + { + vim_strncpy(buf, cname, len - 1); +*************** +*** 507,513 **** + # endif + ) + { +! WCHAR *wp = enc_to_ucs2(buf, NULL); + int n; + + if (wp != NULL) +--- 507,513 ---- + # endif + ) + { +! WCHAR *wp = enc_to_utf16(buf, NULL); + int n; + + if (wp != NULL) +*************** +*** 668,674 **** + #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! WCHAR *p = enc_to_ucs2(path, NULL); + int n; + + if (p != NULL) +--- 668,674 ---- + #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! WCHAR *p = enc_to_utf16(path, NULL); + int n; + + if (p != NULL) +*************** +*** 891,909 **** + + #if defined(FEAT_MBYTE) || defined(PROTO) + /* +! * Convert an UTF-8 string to UCS-2. + * "instr[inlen]" is the input. "inlen" is in bytes. +! * When "outstr" is NULL only return the number of UCS-2 words produced. + * Otherwise "outstr" must be a buffer of sufficient size. +! * Returns the number of UCS-2 words produced. + */ + int +! utf8_to_ucs2(char_u *instr, int inlen, short_u *outstr, int *unconvlenp) + { + int outlen = 0; + char_u *p = instr; + int todo = inlen; + int l; + + while (todo > 0) + { +--- 891,910 ---- + + #if defined(FEAT_MBYTE) || defined(PROTO) + /* +! * Convert an UTF-8 string to UTF-16. + * "instr[inlen]" is the input. "inlen" is in bytes. +! * When "outstr" is NULL only return the number of UTF-16 words produced. + * Otherwise "outstr" must be a buffer of sufficient size. +! * Returns the number of UTF-16 words produced. + */ + int +! utf8_to_utf16(char_u *instr, int inlen, short_u *outstr, int *unconvlenp) + { + int outlen = 0; + char_u *p = instr; + int todo = inlen; + int l; ++ int ch; + + while (todo > 0) + { +*************** +*** 917,924 **** + break; + } + +! if (outstr != NULL) +! *outstr++ = utf_ptr2char(p); + ++outlen; + p += l; + todo -= l; +--- 918,936 ---- + break; + } + +! ch = utf_ptr2char(p); +! if (ch >= 0x10000) +! { +! /* non-BMP character, encoding with surrogate pairs */ +! ++outlen; +! if (outstr != NULL) +! { +! *outstr++ = (0xD800 - (0x10000 >> 10)) + (ch >> 10); +! *outstr++ = 0xDC00 | (ch & 0x3FF); +! } +! } +! else if (outstr != NULL) +! *outstr++ = ch; + ++outlen; + p += l; + todo -= l; +*************** +*** 928,956 **** + } + + /* +! * Convert an UCS-2 string to UTF-8. +! * The input is "instr[inlen]" with "inlen" in number of ucs-2 words. + * When "outstr" is NULL only return the required number of bytes. + * Otherwise "outstr" must be a buffer of sufficient size. + * Return the number of bytes produced. + */ + int +! ucs2_to_utf8(short_u *instr, int inlen, char_u *outstr) + { + int outlen = 0; + int todo = inlen; + short_u *p = instr; + int l; + + while (todo > 0) + { + if (outstr != NULL) + { +! l = utf_char2bytes(*p, outstr); + outstr += l; + } + else +! l = utf_char2len(*p); + ++p; + outlen += l; + --todo; +--- 940,981 ---- + } + + /* +! * Convert an UTF-16 string to UTF-8. +! * The input is "instr[inlen]" with "inlen" in number of UTF-16 words. + * When "outstr" is NULL only return the required number of bytes. + * Otherwise "outstr" must be a buffer of sufficient size. + * Return the number of bytes produced. + */ + int +! utf16_to_utf8(short_u *instr, int inlen, char_u *outstr) + { + int outlen = 0; + int todo = inlen; + short_u *p = instr; + int l; ++ int ch, ch2; + + while (todo > 0) + { ++ ch = *p; ++ if (ch >= 0xD800 && ch <= 0xDBFF && todo > 1) ++ { ++ /* surrogate pairs handling */ ++ ch2 = p[1]; ++ if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) ++ { ++ ch = ((ch - 0xD800) << 10) + (ch2 & 0x3FF) + 0x10000; ++ ++p; ++ --todo; ++ } ++ } + if (outstr != NULL) + { +! l = utf_char2bytes(ch, outstr); + outstr += l; + } + else +! l = utf_char2len(ch); + ++p; + outlen += l; + --todo; +*************** +*** 1079,1092 **** + */ + + /* +! * Convert "str" from 'encoding' to UCS-2. + * Input in "str" with length "*lenp". When "lenp" is NULL, use strlen(). + * Output is returned as an allocated string. "*lenp" is set to the length of + * the result. A trailing NUL is always added. + * Returns NULL when out of memory. + */ + short_u * +! enc_to_ucs2(char_u *str, int *lenp) + { + vimconv_T conv; + WCHAR *ret; +--- 1104,1117 ---- + */ + + /* +! * Convert "str" from 'encoding' to UTF-16. + * Input in "str" with length "*lenp". When "lenp" is NULL, use strlen(). + * Output is returned as an allocated string. "*lenp" is set to the length of + * the result. A trailing NUL is always added. + * Returns NULL when out of memory. + */ + short_u * +! enc_to_utf16(char_u *str, int *lenp) + { + vimconv_T conv; + WCHAR *ret; +*************** +*** 1102,1108 **** + + if (enc_codepage > 0) + { +! /* We can do any CP### -> UCS-2 in one pass, and we can do it + * without iconv() (convert_* may need iconv). */ + MultiByteToWideChar_alloc(enc_codepage, 0, str, *lenp, &ret, &length); + } +--- 1127,1133 ---- + + if (enc_codepage > 0) + { +! /* We can do any CP### -> UTF-16 in one pass, and we can do it + * without iconv() (convert_* may need iconv). */ + MultiByteToWideChar_alloc(enc_codepage, 0, str, *lenp, &ret, &length); + } +*************** +*** 1123,1133 **** + } + convert_setup(&conv, NULL, NULL); + +! length = utf8_to_ucs2(str, *lenp, NULL, NULL); + ret = (WCHAR *)alloc((unsigned)((length + 1) * sizeof(WCHAR))); + if (ret != NULL) + { +! utf8_to_ucs2(str, *lenp, (short_u *)ret, NULL); + ret[length] = 0; + } + +--- 1148,1158 ---- + } + convert_setup(&conv, NULL, NULL); + +! length = utf8_to_utf16(str, *lenp, NULL, NULL); + ret = (WCHAR *)alloc((unsigned)((length + 1) * sizeof(WCHAR))); + if (ret != NULL) + { +! utf8_to_utf16(str, *lenp, (short_u *)ret, NULL); + ret[length] = 0; + } + +*************** +*** 1139,1145 **** + } + + /* +! * Convert an UCS-2 string to 'encoding'. + * Input in "str" with length (counted in wide characters) "*lenp". When + * "lenp" is NULL, use wcslen(). + * Output is returned as an allocated string. If "*lenp" is not NULL it is +--- 1164,1170 ---- + } + + /* +! * Convert an UTF-16 string to 'encoding'. + * Input in "str" with length (counted in wide characters) "*lenp". When + * "lenp" is NULL, use wcslen(). + * Output is returned as an allocated string. If "*lenp" is not NULL it is +*************** +*** 1147,1153 **** + * Returns NULL when out of memory. + */ + char_u * +! ucs2_to_enc(short_u *str, int *lenp) + { + vimconv_T conv; + char_u *utf8_str = NULL, *enc_str = NULL; +--- 1172,1178 ---- + * Returns NULL when out of memory. + */ + char_u * +! utf16_to_enc(short_u *str, int *lenp) + { + vimconv_T conv; + char_u *utf8_str = NULL, *enc_str = NULL; +*************** +*** 1161,1167 **** + + if (enc_codepage > 0) + { +! /* We can do any UCS-2 -> CP### in one pass. */ + int length; + + WideCharToMultiByte_alloc(enc_codepage, 0, str, *lenp, +--- 1186,1192 ---- + + if (enc_codepage > 0) + { +! /* We can do any UTF-16 -> CP### in one pass. */ + int length; + + WideCharToMultiByte_alloc(enc_codepage, 0, str, *lenp, +*************** +*** 1171,1180 **** + } + + /* Avoid allocating zero bytes, it generates an error message. */ +! utf8_str = alloc(ucs2_to_utf8(str, *lenp == 0 ? 1 : *lenp, NULL)); + if (utf8_str != NULL) + { +! *lenp = ucs2_to_utf8(str, *lenp, utf8_str); + + /* We might be called before we have p_enc set up. */ + conv.vc_type = CONV_NONE; +--- 1196,1205 ---- + } + + /* Avoid allocating zero bytes, it generates an error message. */ +! utf8_str = alloc(utf16_to_utf8(str, *lenp == 0 ? 1 : *lenp, NULL)); + if (utf8_str != NULL) + { +! *lenp = utf16_to_utf8(str, *lenp, utf8_str); + + /* We might be called before we have p_enc set up. */ + conv.vc_type = CONV_NONE; +*************** +*** 1308,1314 **** + if (hMemWstr[str_size] == NUL) + break; + } +! to_free = str = ucs2_to_enc((short_u *)hMemWstr, &str_size); + GlobalUnlock(hMemW); + } + } +--- 1333,1339 ---- + if (hMemWstr[str_size] == NUL) + break; + } +! to_free = str = utf16_to_enc((short_u *)hMemWstr, &str_size); + GlobalUnlock(hMemW); + } + } +*************** +*** 1340,1346 **** + + # if defined(FEAT_MBYTE) && defined(WIN3264) + /* The text is in the active codepage. Convert to 'encoding', +! * going through UCS-2. */ + acp_to_enc(str, str_size, &to_free, &maxlen); + if (to_free != NULL) + { +--- 1365,1371 ---- + + # if defined(FEAT_MBYTE) && defined(WIN3264) + /* The text is in the active codepage. Convert to 'encoding', +! * going through UTF-16. */ + acp_to_enc(str, str_size, &to_free, &maxlen); + if (to_free != NULL) + { +*************** +*** 1404,1410 **** + if (widestr != NULL) + { + ++*outlen; /* Include the 0 after the string */ +! *out = ucs2_to_enc((short_u *)widestr, outlen); + vim_free(widestr); + } + } +--- 1429,1435 ---- + if (widestr != NULL) + { + ++*outlen; /* Include the 0 after the string */ +! *out = utf16_to_enc((short_u *)widestr, outlen); + vim_free(widestr); + } + } +*************** +*** 1466,1474 **** + WCHAR *out; + int len = metadata.txtlen; + +! /* Convert the text to UCS-2. This is put on the clipboard as + * CF_UNICODETEXT. */ +! out = (WCHAR *)enc_to_ucs2(str, &len); + if (out != NULL) + { + WCHAR *lpszMemW; +--- 1491,1499 ---- + WCHAR *out; + int len = metadata.txtlen; + +! /* Convert the text to UTF-16. This is put on the clipboard as + * CF_UNICODETEXT. */ +! out = (WCHAR *)enc_to_utf16(str, &len); + if (out != NULL) + { + WCHAR *lpszMemW; +*************** +*** 1488,1494 **** + WideCharToMultiByte(GetACP(), 0, out, len, + str, metadata.txtlen, 0, 0); + +! /* Allocate memory for the UCS-2 text, add one NUL word to + * terminate the string. */ + hMemW = (LPSTR)GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, + (len + 1) * sizeof(WCHAR)); +--- 1513,1519 ---- + WideCharToMultiByte(GetACP(), 0, out, len, + str, metadata.txtlen, 0, 0); + +! /* Allocate memory for the UTF-16 text, add one NUL word to + * terminate the string. */ + hMemW = (LPSTR)GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, + (len + 1) * sizeof(WCHAR)); +*** ../vim-7.2.048/src/os_win32.c Thu Jul 24 20:50:30 2008 +--- src/os_win32.c Thu Nov 20 16:44:33 2008 +*************** +*** 1587,1593 **** + #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! WCHAR *p = enc_to_ucs2(name, NULL); + WCHAR fnamew[_MAX_PATH]; + WCHAR *dumw; + long n; +--- 1587,1593 ---- + #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! WCHAR *p = enc_to_utf16(name, NULL); + WCHAR fnamew[_MAX_PATH]; + WCHAR *dumw; + long n; +*************** +*** 2440,2446 **** + + if (GetCurrentDirectoryW(_MAX_PATH, wbuf) != 0) + { +! char_u *p = ucs2_to_enc(wbuf, NULL); + + if (p != NULL) + { +--- 2440,2446 ---- + + if (GetCurrentDirectoryW(_MAX_PATH, wbuf) != 0) + { +! char_u *p = utf16_to_enc(wbuf, NULL); + + if (p != NULL) + { +*************** +*** 2466,2472 **** + #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! WCHAR *p = enc_to_ucs2(name, NULL); + long n; + + if (p != NULL) +--- 2466,2472 ---- + #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! WCHAR *p = enc_to_utf16(name, NULL); + long n; + + if (p != NULL) +*************** +*** 2495,2501 **** + #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! WCHAR *p = enc_to_ucs2(name, NULL); + long n; + + if (p != NULL) +--- 2495,2501 ---- + #ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! WCHAR *p = enc_to_utf16(name, NULL); + long n; + + if (p != NULL) +*************** +*** 2522,2528 **** + WCHAR *p = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +! p = enc_to_ucs2(name, NULL); + #endif + + #ifdef FEAT_MBYTE +--- 2522,2528 ---- + WCHAR *p = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +! p = enc_to_utf16(name, NULL); + #endif + + #ifdef FEAT_MBYTE +*************** +*** 2590,2596 **** + WCHAR *wn = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +! wn = enc_to_ucs2(fname, NULL); + if (wn != NULL) + { + hFile = CreateFileW(wn, /* file name */ +--- 2590,2596 ---- + WCHAR *wn = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +! wn = enc_to_utf16(fname, NULL); + if (wn != NULL) + { + hFile = CreateFileW(wn, /* file name */ +*************** +*** 4239,4245 **** + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! wn = enc_to_ucs2(name, NULL); + if (wn != NULL) + { + SetFileAttributesW(wn, FILE_ATTRIBUTE_NORMAL); +--- 4239,4245 ---- + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! wn = enc_to_utf16(name, NULL); + if (wn != NULL) + { + SetFileAttributesW(wn, FILE_ATTRIBUTE_NORMAL); +*************** +*** 4382,4389 **** + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! wold = enc_to_ucs2((char_u *)pszOldFile, NULL); +! wnew = enc_to_ucs2((char_u *)pszNewFile, NULL); + if (wold != NULL && wnew != NULL) + retval = mch_wrename(wold, wnew); + vim_free(wold); +--- 4382,4389 ---- + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! wold = enc_to_utf16((char_u *)pszOldFile, NULL); +! wnew = enc_to_utf16((char_u *)pszNewFile, NULL); + if (wold != NULL && wnew != NULL) + retval = mch_wrename(wold, wnew); + vim_free(wold); +*************** +*** 4492,4498 **** + WCHAR *wn = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +! wn = enc_to_ucs2(n, NULL); + #endif + + if (mch_isdir(n)) +--- 4492,4498 ---- + WCHAR *wn = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +! wn = enc_to_utf16(n, NULL); + #endif + + if (mch_isdir(n)) +*************** +*** 4618,4624 **** + + #if defined(FEAT_MBYTE) || defined(PROTO) + /* +! * Version of open() that may use ucs2 file name. + */ + int + mch_open(char *name, int flags, int mode) +--- 4618,4624 ---- + + #if defined(FEAT_MBYTE) || defined(PROTO) + /* +! * Version of open() that may use UTF-16 file name. + */ + int + mch_open(char *name, int flags, int mode) +*************** +*** 4630,4636 **** + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! wn = enc_to_ucs2(name, NULL); + if (wn != NULL) + { + f = _wopen(wn, flags, mode); +--- 4630,4636 ---- + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { +! wn = enc_to_utf16(name, NULL); + if (wn != NULL) + { + f = _wopen(wn, flags, mode); +*************** +*** 4648,4654 **** + } + + /* +! * Version of fopen() that may use ucs2 file name. + */ + FILE * + mch_fopen(char *name, char *mode) +--- 4648,4654 ---- + } + + /* +! * Version of fopen() that may use UTF-16 file name. + */ + FILE * + mch_fopen(char *name, char *mode) +*************** +*** 4675,4682 **** + else if (newMode == 'b') + _set_fmode(_O_BINARY); + # endif +! wn = enc_to_ucs2(name, NULL); +! wm = enc_to_ucs2(mode, NULL); + if (wn != NULL && wm != NULL) + f = _wfopen(wn, wm); + vim_free(wn); +--- 4675,4682 ---- + else if (newMode == 'b') + _set_fmode(_O_BINARY); + # endif +! wn = enc_to_utf16(name, NULL); +! wm = enc_to_utf16(mode, NULL); + if (wn != NULL && wm != NULL) + f = _wfopen(wn, wm); + vim_free(wn); +*************** +*** 4776,4783 **** + int len; + + /* Convert the file names to wide characters. */ +! fromw = enc_to_ucs2(from, NULL); +! tow = enc_to_ucs2(to, NULL); + if (fromw != NULL && tow != NULL) + { + /* Open the file for reading. */ +--- 4776,4783 ---- + int len; + + /* Convert the file names to wide characters. */ +! fromw = enc_to_utf16(from, NULL); +! tow = enc_to_utf16(to, NULL); + if (fromw != NULL && tow != NULL) + { + /* Open the file for reading. */ +*************** +*** 5122,5128 **** + for (i = 0; i < used_file_count; ++i) + { + idx = used_file_indexes[i]; +! str = ucs2_to_enc(ArglistW[idx], NULL); + if (str != NULL) + { + #ifdef FEAT_DIFF +--- 5122,5128 ---- + for (i = 0; i < used_file_count; ++i) + { + idx = used_file_indexes[i]; +! str = utf16_to_enc(ArglistW[idx], NULL); + if (str != NULL) + { + #ifdef FEAT_DIFF +*** ../vim-7.2.048/src/proto/os_mswin.pro Sat May 5 19:07:50 2007 +--- src/proto/os_mswin.pro Thu Nov 20 16:41:00 2008 +*************** +*** 22,35 **** + int can_end_termcap_mode __ARGS((int give_msg)); + int mch_screenmode __ARGS((char_u *arg)); + int mch_libcall __ARGS((char_u *libname, char_u *funcname, char_u *argstring, int argint, char_u **string_result, int *number_result)); +! int utf8_to_ucs2 __ARGS((char_u *instr, int inlen, short_u *outstr, int *unconvlenp)); +! int ucs2_to_utf8 __ARGS((short_u *instr, int inlen, char_u *outstr)); + void MultiByteToWideChar_alloc __ARGS((UINT cp, DWORD flags, LPCSTR in, int inlen, LPWSTR *out, int *outlen)); + void WideCharToMultiByte_alloc __ARGS((UINT cp, DWORD flags, LPCWSTR in, int inlen, LPSTR *out, int *outlen, LPCSTR def, LPBOOL useddef)); + int clip_mch_own_selection __ARGS((VimClipboard *cbd)); + void clip_mch_lose_selection __ARGS((VimClipboard *cbd)); +! short_u *enc_to_ucs2 __ARGS((char_u *str, int *lenp)); +! char_u *ucs2_to_enc __ARGS((short_u *str, int *lenp)); + void clip_mch_request_selection __ARGS((VimClipboard *cbd)); + void acp_to_enc __ARGS((char_u *str, int str_size, char_u **out, int *outlen)); + void clip_mch_set_selection __ARGS((VimClipboard *cbd)); +--- 22,35 ---- + int can_end_termcap_mode __ARGS((int give_msg)); + int mch_screenmode __ARGS((char_u *arg)); + int mch_libcall __ARGS((char_u *libname, char_u *funcname, char_u *argstring, int argint, char_u **string_result, int *number_result)); +! int utf8_to_utf16 __ARGS((char_u *instr, int inlen, short_u *outstr, int *unconvlenp)); +! int utf16_to_utf8 __ARGS((short_u *instr, int inlen, char_u *outstr)); + void MultiByteToWideChar_alloc __ARGS((UINT cp, DWORD flags, LPCSTR in, int inlen, LPWSTR *out, int *outlen)); + void WideCharToMultiByte_alloc __ARGS((UINT cp, DWORD flags, LPCWSTR in, int inlen, LPSTR *out, int *outlen, LPCSTR def, LPBOOL useddef)); + int clip_mch_own_selection __ARGS((VimClipboard *cbd)); + void clip_mch_lose_selection __ARGS((VimClipboard *cbd)); +! short_u *enc_to_utf16 __ARGS((char_u *str, int *lenp)); +! char_u *utf16_to_enc __ARGS((short_u *str, int *lenp)); + void clip_mch_request_selection __ARGS((VimClipboard *cbd)); + void acp_to_enc __ARGS((char_u *str, int str_size, char_u **out, int *outlen)); + void clip_mch_set_selection __ARGS((VimClipboard *cbd)); +*** ../vim-7.2.048/src/version.c Thu Nov 20 16:11:03 2008 +--- src/version.c Thu Nov 20 17:08:07 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 49, + /**/ + +-- +FIRST HEAD: All right! All right! We'll kill him first and then have tea and + biscuits. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.050 b/7.2.050 new file mode 100644 index 00000000..416d32b1 --- /dev/null +++ b/7.2.050 @@ -0,0 +1,316 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.050 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.050 +Problem: Warnings for not checking return value of fwrite(). (Chip Campbell) +Solution: Use the return value. +Files: src/spell.c + + +*** ../vim-7.2.049/src/spell.c Mon Aug 25 04:12:38 2008 +--- src/spell.c Thu Nov 20 17:28:01 2008 +*************** +*** 7926,7931 **** +--- 7926,7933 ---- + char_u *p; + int rr; + int retval = OK; ++ int fwv = 1; /* collect return value of fwrite() to avoid ++ warnings from picky compiler */ + + fd = mch_fopen((char *)fname, "w"); + if (fd == NULL) +*************** +*** 7936,7946 **** + + /*
: */ + /* */ +! if (fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd) != 1) +! { +! EMSG(_(e_write)); +! retval = FAIL; +! } + putc(VIMSPELLVERSION, fd); /* */ + + /* +--- 7938,7944 ---- + + /*
: */ + /* */ +! fwv &= fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd); + putc(VIMSPELLVERSION, fd); /* */ + + /* +*************** +*** 7955,7961 **** + + i = (int)STRLEN(spin->si_info); + put_bytes(fd, (long_u)i, 4); /* */ +! fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* */ + } + + /* SN_REGION: ... +--- 7953,7959 ---- + + i = (int)STRLEN(spin->si_info); + put_bytes(fd, (long_u)i, 4); /* */ +! fwv &= fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* */ + } + + /* SN_REGION: ... +*************** +*** 7966,7972 **** + putc(SNF_REQUIRED, fd); /* */ + l = spin->si_region_count * 2; + put_bytes(fd, (long_u)l, 4); /* */ +! fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd); + /* ... */ + regionmask = (1 << spin->si_region_count) - 1; + } +--- 7964,7970 ---- + putc(SNF_REQUIRED, fd); /* */ + l = spin->si_region_count * 2; + put_bytes(fd, (long_u)l, 4); /* */ +! fwv &= fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd); + /* ... */ + regionmask = (1 << spin->si_region_count) - 1; + } +*************** +*** 8016,8022 **** + } + + put_bytes(fd, (long_u)l, 2); /* */ +! fwrite(folchars, (size_t)l, (size_t)1, fd); /* */ + } + + /* SN_MIDWORD: */ +--- 8014,8020 ---- + } + + put_bytes(fd, (long_u)l, 2); /* */ +! fwv &= fwrite(folchars, (size_t)l, (size_t)1, fd); /* */ + } + + /* SN_MIDWORD: */ +*************** +*** 8027,8033 **** + + i = (int)STRLEN(spin->si_midword); + put_bytes(fd, (long_u)i, 4); /* */ +! fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); /* */ + } + + /* SN_PREFCOND: ... */ +--- 8025,8032 ---- + + i = (int)STRLEN(spin->si_midword); + put_bytes(fd, (long_u)i, 4); /* */ +! fwv &= fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); +! /* */ + } + + /* SN_PREFCOND: ... */ +*************** +*** 8113,8119 **** + p = rr == 1 ? ftp->ft_from : ftp->ft_to; + l = (int)STRLEN(p); + putc(l, fd); +! fwrite(p, l, (size_t)1, fd); + } + } + +--- 8112,8118 ---- + p = rr == 1 ? ftp->ft_from : ftp->ft_to; + l = (int)STRLEN(p); + putc(l, fd); +! fwv &= fwrite(p, l, (size_t)1, fd); + } + } + +*************** +*** 8131,8141 **** + /* */ + + put_bytes(fd, (long_u)l, 2); /* */ +! fwrite(spin->si_sofofr, l, (size_t)1, fd); /* */ + + l = (int)STRLEN(spin->si_sofoto); + put_bytes(fd, (long_u)l, 2); /* */ +! fwrite(spin->si_sofoto, l, (size_t)1, fd); /* */ + } + + /* SN_WORDS: ... +--- 8130,8140 ---- + /* */ + + put_bytes(fd, (long_u)l, 2); /* */ +! fwv &= fwrite(spin->si_sofofr, l, (size_t)1, fd); /* */ + + l = (int)STRLEN(spin->si_sofoto); + put_bytes(fd, (long_u)l, 2); /* */ +! fwv &= fwrite(spin->si_sofoto, l, (size_t)1, fd); /* */ + } + + /* SN_WORDS: ... +*************** +*** 8160,8166 **** + l = (int)STRLEN(hi->hi_key) + 1; + len += l; + if (round == 2) /* */ +! fwrite(hi->hi_key, (size_t)l, (size_t)1, fd); + --todo; + } + if (round == 1) +--- 8159,8165 ---- + l = (int)STRLEN(hi->hi_key) + 1; + len += l; + if (round == 2) /* */ +! fwv &= fwrite(hi->hi_key, (size_t)l, (size_t)1, fd); + --todo; + } + if (round == 1) +*************** +*** 8176,8182 **** + putc(0, fd); /* */ + l = spin->si_map.ga_len; + put_bytes(fd, (long_u)l, 4); /* */ +! fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd); + /* */ + } + +--- 8175,8181 ---- + putc(0, fd); /* */ + l = spin->si_map.ga_len; + put_bytes(fd, (long_u)l, 4); /* */ +! fwv &= fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd); + /* */ + } + +*************** +*** 8232,8241 **** + { + p = ((char_u **)(spin->si_comppat.ga_data))[i]; + putc((int)STRLEN(p), fd); /* */ +! fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);/* */ + } + /* */ +! fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags), + (size_t)1, fd); + } + +--- 8231,8241 ---- + { + p = ((char_u **)(spin->si_comppat.ga_data))[i]; + putc((int)STRLEN(p), fd); /* */ +! fwv &= fwrite(p, (size_t)STRLEN(p), (size_t)1, fd); +! /* */ + } + /* */ +! fwv &= fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags), + (size_t)1, fd); + } + +*************** +*** 8259,8265 **** + + l = (int)STRLEN(spin->si_syllable); + put_bytes(fd, (long_u)l, 4); /* */ +! fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); /* */ + } + + /* end of */ +--- 8259,8266 ---- + + l = (int)STRLEN(spin->si_syllable); + put_bytes(fd, (long_u)l, 4); /* */ +! fwv &= fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); +! /* */ + } + + /* end of */ +*************** +*** 8295,8307 **** + (void)put_node(fd, tree, 0, regionmask, round == 3); + } + +! /* Write another byte to check for errors. */ + if (putc(0, fd) == EOF) + retval = FAIL; + + if (fclose(fd) == EOF) + retval = FAIL; + + return retval; + } + +--- 8296,8313 ---- + (void)put_node(fd, tree, 0, regionmask, round == 3); + } + +! /* Write another byte to check for errors (file system full). */ + if (putc(0, fd) == EOF) + retval = FAIL; + + if (fclose(fd) == EOF) + retval = FAIL; + ++ if (fwv != 1) ++ retval = FAIL; ++ if (retval == FAIL) ++ EMSG(_(e_write)); ++ + return retval; + } + +*************** +*** 9890,9895 **** +--- 9896,9902 ---- + char_u *p; + int len; + int totlen; ++ int x = 1; /* collect return value of fwrite() */ + + if (fd != NULL) + put_bytes(fd, (long_u)gap->ga_len, 2); /* */ +*************** +*** 9906,9912 **** + if (fd != NULL) + { + fputc(len, fd); +! fwrite(p, (size_t)len, (size_t)1, fd); + } + totlen += len; + } +--- 9913,9919 ---- + if (fd != NULL) + { + fputc(len, fd); +! x &= fwrite(p, (size_t)len, (size_t)1, fd); + } + totlen += len; + } +*** ../vim-7.2.049/src/version.c Thu Nov 20 17:09:09 2008 +--- src/version.c Fri Nov 28 10:06:13 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 50, + /**/ + +-- +You got to work at a mill? Lucky! I got sent back to work in the +acid-mines for my daily crust of stale bread... which not even the +birds would eat. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.051 b/7.2.051 new file mode 100644 index 00000000..7c36dfe9 --- /dev/null +++ b/7.2.051 @@ -0,0 +1,411 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.051 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.051 +Problem: Can't avoid 'wildignore' and 'suffixes' for glob() and globpath(). +Solution: Add an extra argument to these functions. (Ingo Karkat) +Files: src/eval.c, src/ex_getln.c, src/proto/ex_getln.pro, + runtime/doc/eval.txt, runtime/doc/options.txt + + +*** ../vim-7.2.050/src/eval.c Thu Nov 20 16:11:03 2008 +--- src/eval.c Thu Nov 27 22:15:40 2008 +*************** +*** 7564,7571 **** + {"getwinposx", 0, 0, f_getwinposx}, + {"getwinposy", 0, 0, f_getwinposy}, + {"getwinvar", 2, 2, f_getwinvar}, +! {"glob", 1, 1, f_glob}, +! {"globpath", 2, 2, f_globpath}, + {"has", 1, 1, f_has}, + {"has_key", 2, 2, f_has_key}, + {"haslocaldir", 0, 0, f_haslocaldir}, +--- 7564,7571 ---- + {"getwinposx", 0, 0, f_getwinposx}, + {"getwinposy", 0, 0, f_getwinposy}, + {"getwinvar", 2, 2, f_getwinvar}, +! {"glob", 1, 2, f_glob}, +! {"globpath", 2, 3, f_globpath}, + {"has", 1, 1, f_has}, + {"has_key", 2, 2, f_has_key}, + {"haslocaldir", 0, 0, f_haslocaldir}, +*************** +*** 9557,9563 **** + else + { + /* When the optional second argument is non-zero, don't remove matches +! * for 'suffixes' and 'wildignore' */ + if (argvars[1].v_type != VAR_UNKNOWN + && get_tv_number_chk(&argvars[1], &error)) + flags |= WILD_KEEP_ALL; +--- 9557,9563 ---- + else + { + /* When the optional second argument is non-zero, don't remove matches +! * for 'wildignore' and don't put matches for 'suffixes' at the end. */ + if (argvars[1].v_type != VAR_UNKNOWN + && get_tv_number_chk(&argvars[1], &error)) + flags |= WILD_KEEP_ALL; +*************** +*** 11323,11335 **** + typval_T *argvars; + typval_T *rettv; + { + expand_T xpc; + +! ExpandInit(&xpc); +! xpc.xp_context = EXPAND_FILES; +! rettv->v_type = VAR_STRING; +! rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]), +! NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL); + } + + /* +--- 11323,11347 ---- + typval_T *argvars; + typval_T *rettv; + { ++ int flags = WILD_SILENT|WILD_USE_NL; + expand_T xpc; ++ int error = FALSE; + +! /* When the optional second argument is non-zero, don't remove matches +! * for 'wildignore' and don't put matches for 'suffixes' at the end. */ +! if (argvars[1].v_type != VAR_UNKNOWN +! && get_tv_number_chk(&argvars[1], &error)) +! flags |= WILD_KEEP_ALL; +! rettv->v_type = VAR_STRING; +! if (!error) +! { +! ExpandInit(&xpc); +! xpc.xp_context = EXPAND_FILES; +! rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]), +! NULL, flags, WILD_ALL); +! } +! else +! rettv->vval.v_string = NULL; + } + + /* +*************** +*** 11340,11353 **** + typval_T *argvars; + typval_T *rettv; + { + char_u buf1[NUMBUFLEN]; + char_u *file = get_tv_string_buf_chk(&argvars[1], buf1); + + rettv->v_type = VAR_STRING; +! if (file == NULL) + rettv->vval.v_string = NULL; + else +! rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file); + } + + /* +--- 11352,11373 ---- + typval_T *argvars; + typval_T *rettv; + { ++ int flags = 0; + char_u buf1[NUMBUFLEN]; + char_u *file = get_tv_string_buf_chk(&argvars[1], buf1); ++ int error = FALSE; + ++ /* When the optional second argument is non-zero, don't remove matches ++ * for 'wildignore' and don't put matches for 'suffixes' at the end. */ ++ if (argvars[2].v_type != VAR_UNKNOWN ++ && get_tv_number_chk(&argvars[2], &error)) ++ flags |= WILD_KEEP_ALL; + rettv->v_type = VAR_STRING; +! if (file == NULL || error) + rettv->vval.v_string = NULL; + else +! rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file, +! flags); + } + + /* +*** ../vim-7.2.050/src/ex_getln.c Sat Nov 15 14:10:23 2008 +--- src/ex_getln.c Thu Nov 20 18:37:20 2008 +*************** +*** 2524,2530 **** + && ccline.xpc->xp_context != EXPAND_NOTHING + && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL) + { +! int i = ccline.xpc->xp_pattern - p; + + /* If xp_pattern points inside the old cmdbuff it needs to be adjusted + * to point into the newly allocated memory. */ +--- 2524,2530 ---- + && ccline.xpc->xp_context != EXPAND_NOTHING + && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL) + { +! int i = (int)(ccline.xpc->xp_pattern - p); + + /* If xp_pattern points inside the old cmdbuff it needs to be adjusted + * to point into the newly allocated memory. */ +*************** +*** 4897,4903 **** + if (s == NULL) + return FAIL; + sprintf((char *)s, "%s/%s*.vim", dirname, pat); +! all = globpath(p_rtp, s); + vim_free(s); + if (all == NULL) + return FAIL; +--- 4897,4903 ---- + if (s == NULL) + return FAIL; + sprintf((char *)s, "%s/%s*.vim", dirname, pat); +! all = globpath(p_rtp, s, 0); + vim_free(s); + if (all == NULL) + return FAIL; +*************** +*** 4938,4946 **** + * newlines. Returns NULL for an error or no matches. + */ + char_u * +! globpath(path, file) + char_u *path; + char_u *file; + { + expand_T xpc; + char_u *buf; +--- 4938,4947 ---- + * newlines. Returns NULL for an error or no matches. + */ + char_u * +! globpath(path, file, expand_options) + char_u *path; + char_u *file; ++ int expand_options; + { + expand_T xpc; + char_u *buf; +*************** +*** 4969,4978 **** + { + add_pathsep(buf); + STRCAT(buf, file); +! if (ExpandFromContext(&xpc, buf, &num_p, &p, WILD_SILENT) != FAIL +! && num_p > 0) + { +! ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT); + for (len = 0, i = 0; i < num_p; ++i) + len += (int)STRLEN(p[i]) + 1; + +--- 4970,4979 ---- + { + add_pathsep(buf); + STRCAT(buf, file); +! if (ExpandFromContext(&xpc, buf, &num_p, &p, +! WILD_SILENT|expand_options) != FAIL && num_p > 0) + { +! ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT|expand_options); + for (len = 0, i = 0; i < num_p; ++i) + len += (int)STRLEN(p[i]) + 1; + +*** ../vim-7.2.050/src/proto/ex_getln.pro Wed May 28 16:49:01 2008 +--- src/proto/ex_getln.pro Thu Nov 20 18:27:57 2008 +*************** +*** 31,37 **** + void set_cmd_context __ARGS((expand_T *xp, char_u *str, int len, int col)); + int expand_cmdline __ARGS((expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches)); + int ExpandGeneric __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int)))); +! char_u *globpath __ARGS((char_u *path, char_u *file)); + void init_history __ARGS((void)); + int get_histtype __ARGS((char_u *name)); + void add_to_history __ARGS((int histype, char_u *new_entry, int in_map, int sep)); +--- 31,37 ---- + void set_cmd_context __ARGS((expand_T *xp, char_u *str, int len, int col)); + int expand_cmdline __ARGS((expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches)); + int ExpandGeneric __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int)))); +! char_u *globpath __ARGS((char_u *path, char_u *file, int expand_options)); + void init_history __ARGS((void)); + int get_histtype __ARGS((char_u *name)); + void add_to_history __ARGS((int histype, char_u *new_entry, int in_map, int sep)); +*** ../vim-7.2.050/runtime/doc/eval.txt Sun Nov 9 13:43:25 2008 +--- runtime/doc/eval.txt Thu Nov 27 22:17:13 2008 +*************** +*** 1,4 **** +! *eval.txt* For Vim version 7.2. Last change: 2008 Nov 02 + + + VIM REFERENCE MANUAL by Bram Moolenaar +--- 1,4 ---- +! *eval.txt* For Vim version 7.2. Last change: 2008 Nov 27 + + + VIM REFERENCE MANUAL by Bram Moolenaar +*************** +*** 1706,1712 **** + exists( {expr}) Number TRUE if {expr} exists + extend({expr1}, {expr2} [, {expr3}]) + List/Dict insert items of {expr2} into {expr1} +! expand( {expr}) String expand special keywords in {expr} + feedkeys( {string} [, {mode}]) Number add key sequence to typeahead buffer + filereadable( {file}) Number TRUE if {file} is a readable file + filewritable( {file}) Number TRUE if {file} is a writable file +--- 1709,1715 ---- + exists( {expr}) Number TRUE if {expr} exists + extend({expr1}, {expr2} [, {expr3}]) + List/Dict insert items of {expr2} into {expr1} +! expand( {expr} [, {flag}]) String expand special keywords in {expr} + feedkeys( {string} [, {mode}]) Number add key sequence to typeahead buffer + filereadable( {file}) Number TRUE if {file} is a readable file + filewritable( {file}) Number TRUE if {file} is a writable file +*************** +*** 1758,1765 **** + getwinposx() Number X coord in pixels of GUI Vim window + getwinposy() Number Y coord in pixels of GUI Vim window + getwinvar( {nr}, {varname}) any variable {varname} in window {nr} +! glob( {expr}) String expand file wildcards in {expr} +! globpath( {path}, {expr}) String do glob({expr}) for all dirs in {path} + has( {feature}) Number TRUE if feature {feature} supported + has_key( {dict}, {key}) Number TRUE if {dict} has entry {key} + haslocaldir() Number TRUE if current window executed |:lcd| +--- 1761,1769 ---- + getwinposx() Number X coord in pixels of GUI Vim window + getwinposy() Number Y coord in pixels of GUI Vim window + getwinvar( {nr}, {varname}) any variable {varname} in window {nr} +! glob( {expr} [, {flag}]) String expand file wildcards in {expr} +! globpath( {path}, {expr} [, {flag}]) +! String do glob({expr}) for all dirs in {path} + has( {feature}) Number TRUE if feature {feature} supported + has_key( {dict}, {key}) Number TRUE if {dict} has entry {key} + haslocaldir() Number TRUE if current window executed |:lcd| +*************** +*** 3286,3299 **** + :let list_is_on = getwinvar(2, '&list') + :echo "myvar = " . getwinvar(1, 'myvar') + < +! *glob()* +! glob({expr}) Expand the file wildcards in {expr}. See |wildcards| for the + use of special characters. + The result is a String. + When there are several matches, they are separated by + characters. +! The 'wildignore' option applies: Names matching one of the +! patterns in 'wildignore' will be skipped. + If the expansion fails, the result is an empty string. + A name for a non-existing file is not included. + +--- 3290,3305 ---- + :let list_is_on = getwinvar(2, '&list') + :echo "myvar = " . getwinvar(1, 'myvar') + < +! glob({expr} [, {flag}]) *glob()* +! Expand the file wildcards in {expr}. See |wildcards| for the + use of special characters. + The result is a String. + When there are several matches, they are separated by + characters. +! Unless the optional {flag} argument is given and is non-zero, +! the 'suffixes' and 'wildignore' options apply: Names matching +! one of the patterns in 'wildignore' will be skipped and +! 'suffixes' affect the ordering of matches. + If the expansion fails, the result is an empty string. + A name for a non-existing file is not included. + +*************** +*** 3307,3326 **** + See |expand()| for expanding special Vim variables. See + |system()| for getting the raw output of an external command. + +! globpath({path}, {expr}) *globpath()* + Perform glob() on all directories in {path} and concatenate + the results. Example: > + :echo globpath(&rtp, "syntax/c.vim") + < {path} is a comma-separated list of directory names. Each + directory name is prepended to {expr} and expanded like with +! glob(). A path separator is inserted when needed. + To add a comma inside a directory name escape it with a + backslash. Note that on MS-Windows a directory may have a + trailing backslash, remove it if you put a comma after it. + If the expansion fails for one of the directories, there is no + error message. +! The 'wildignore' option applies: Names matching one of the +! patterns in 'wildignore' will be skipped. + + The "**" item can be used to search in a directory tree. + For example, to find all "README.txt" files in the directories +--- 3313,3334 ---- + See |expand()| for expanding special Vim variables. See + |system()| for getting the raw output of an external command. + +! globpath({path}, {expr} [, {flag}]) *globpath()* + Perform glob() on all directories in {path} and concatenate + the results. Example: > + :echo globpath(&rtp, "syntax/c.vim") + < {path} is a comma-separated list of directory names. Each + directory name is prepended to {expr} and expanded like with +! |glob()|. A path separator is inserted when needed. + To add a comma inside a directory name escape it with a + backslash. Note that on MS-Windows a directory may have a + trailing backslash, remove it if you put a comma after it. + If the expansion fails for one of the directories, there is no + error message. +! Unless the optional {flag} argument is given and is non-zero, +! the 'suffixes' and 'wildignore' options apply: Names matching +! one of the patterns in 'wildignore' will be skipped and +! 'suffixes' affect the ordering of matches. + + The "**" item can be used to search in a directory tree. + For example, to find all "README.txt" files in the directories +*** ../vim-7.2.050/runtime/doc/options.txt Sat Aug 9 19:36:49 2008 +--- runtime/doc/options.txt Tue Nov 25 23:43:55 2008 +*************** +*** 1,4 **** +! *options.txt* For Vim version 7.2. Last change: 2008 Aug 06 + + + VIM REFERENCE MANUAL by Bram Moolenaar +--- 1,4 ---- +! *options.txt* For Vim version 7.2. Last change: 2008 Nov 25 + + + VIM REFERENCE MANUAL by Bram Moolenaar +*************** +*** 7472,7478 **** + {not available when compiled without the |+wildignore| + feature} + A list of file patterns. A file that matches with one of these +! patterns is ignored when completing file or directory names. + The pattern is used like with |:autocmd|, see |autocmd-patterns|. + Also see 'suffixes'. + Example: > +--- 7481,7489 ---- + {not available when compiled without the |+wildignore| + feature} + A list of file patterns. A file that matches with one of these +! patterns is ignored when completing file or directory names, and +! influences the result of |expand()|, |glob()| and |globpath()| unless +! a flag is passed to disable this. + The pattern is used like with |:autocmd|, see |autocmd-patterns|. + Also see 'suffixes'. + Example: > +*** ../vim-7.2.050/src/version.c Fri Nov 28 10:08:05 2008 +--- src/version.c Fri Nov 28 10:55:44 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 51, + /**/ + +-- +Not too long ago, unzipping in public was illegal... + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.052 b/7.2.052 new file mode 100644 index 00000000..eb331f34 --- /dev/null +++ b/7.2.052 @@ -0,0 +1,83 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.052 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.052 +Problem: synIDattr() doesn't support "sp" for special color. +Solution: Recognize "sp" and "sp#". (Matt Wozniski) +Files: runtime/doc/eval.txt, src/eval.c + + +*** ../vim-7.2.051/runtime/doc/eval.txt Fri Nov 28 10:59:57 2008 +--- runtime/doc/eval.txt Thu Nov 27 22:17:13 2008 +*************** +*** 5348,5357 **** + "fg" foreground color (GUI: color name used to set + the color, cterm: color number as a string, + term: empty string) +! "bg" background color (like "fg") + "fg#" like "fg", but for the GUI and the GUI is + running the name in "#RRGGBB" form + "bg#" like "fg#" for "bg" + "bold" "1" if bold + "italic" "1" if italic + "reverse" "1" if reverse +--- 5359,5370 ---- + "fg" foreground color (GUI: color name used to set + the color, cterm: color number as a string, + term: empty string) +! "bg" background color (as with "fg") +! "sp" special color (as with "fg") |highlight-guisp| + "fg#" like "fg", but for the GUI and the GUI is + running the name in "#RRGGBB" form + "bg#" like "fg#" for "bg" ++ "sp#" like "fg#" for "sp" + "bold" "1" if bold + "italic" "1" if italic + "reverse" "1" if reverse +*** ../vim-7.2.051/src/eval.c Fri Nov 28 10:59:57 2008 +--- src/eval.c Thu Nov 27 22:15:40 2008 +*************** +*** 16648,16655 **** + p = highlight_has_attr(id, HL_INVERSE, modec); + break; + +! case 's': /* standout */ +! p = highlight_has_attr(id, HL_STANDOUT, modec); + break; + + case 'u': +--- 16648,16658 ---- + p = highlight_has_attr(id, HL_INVERSE, modec); + break; + +! case 's': +! if (TOLOWER_ASC(what[1]) == 'p') /* sp[#] */ +! p = highlight_color(id, what, modec); +! else /* standout */ +! p = highlight_has_attr(id, HL_STANDOUT, modec); + break; + + case 'u': +*** ../vim-7.2.051/src/version.c Fri Nov 28 10:59:57 2008 +--- src/version.c Fri Nov 28 11:13:45 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 52, + /**/ + +-- +Not too long ago, a keyboard was something to make music with... + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.053 b/7.2.053 new file mode 100644 index 00000000..410d1666 --- /dev/null +++ b/7.2.053 @@ -0,0 +1,58 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.053 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.053 +Problem: Crash when using WorkShop command ":ws foo". (Dominique Pelle) +Solution: Avoid using a NULL pointer. +Files: src/workshop.c + + +*** ../vim-7.2.052/src/workshop.c Tue Jun 24 23:34:50 2008 +--- src/workshop.c Thu Nov 27 22:31:27 2008 +*************** +*** 1121,1128 **** + ? (char *)curbuf->b_sfname : ""); + #endif + +! strcpy(ffname, (char *) curbuf->b_ffname); +! *filename = ffname; /* copy so nobody can change b_ffname */ + *curLine = curwin->w_cursor.lnum; + *curCol = curwin->w_cursor.col; + +--- 1121,1132 ---- + ? (char *)curbuf->b_sfname : ""); + #endif + +! if (curbuf->b_ffname == NULL) +! ffname[0] = NUL; +! else +! /* copy so nobody can change b_ffname */ +! strcpy(ffname, (char *) curbuf->b_ffname); +! *filename = ffname; + *curLine = curwin->w_cursor.lnum; + *curCol = curwin->w_cursor.col; + +*** ../vim-7.2.052/src/version.c Fri Nov 28 11:15:10 2008 +--- src/version.c Fri Nov 28 11:44:23 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 53, + /**/ + +-- +What the word 'politics' means: 'Poli' in Latin meaning 'many' and 'tics' +meaning 'bloodsucking creatures'. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.054 b/7.2.054 new file mode 100644 index 00000000..98ce9e8f --- /dev/null +++ b/7.2.054 @@ -0,0 +1,68 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.054 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.054 +Problem: Compilation warnings for format in getchar.c. +Solution: Use fputs() instead of fprintf(). (Dominique Pelle) +Files: src/getchar.c + + +*** ../vim-7.2.053/src/getchar.c Tue Jul 22 18:58:23 2008 +--- src/getchar.c Thu Nov 27 22:38:24 2008 +*************** +*** 4702,4708 **** + return FAIL; + if (mp->m_noremap != REMAP_YES && fprintf(fd, "nore") < 0) + return FAIL; +! if (fprintf(fd, cmd) < 0) + return FAIL; + if (buf != NULL && fputs(" ", fd) < 0) + return FAIL; +--- 4702,4708 ---- + return FAIL; + if (mp->m_noremap != REMAP_YES && fprintf(fd, "nore") < 0) + return FAIL; +! if (fputs(cmd, fd) < 0) + return FAIL; + if (buf != NULL && fputs(" ", fd) < 0) + return FAIL; +*************** +*** 4801,4807 **** + } + if (IS_SPECIAL(c) || modifiers) /* special key */ + { +! if (fprintf(fd, (char *)get_special_key_name(c, modifiers)) < 0) + return FAIL; + continue; + } +--- 4801,4807 ---- + } + if (IS_SPECIAL(c) || modifiers) /* special key */ + { +! if (fputs((char *)get_special_key_name(c, modifiers), fd) < 0) + return FAIL; + continue; + } +*** ../vim-7.2.053/src/version.c Fri Nov 28 11:47:14 2008 +--- src/version.c Fri Nov 28 12:02:48 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 54, + /**/ + +-- +Not too long ago, compress was something you did to garbage... + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.055 b/7.2.055 new file mode 100644 index 00000000..ffab9a26 --- /dev/null +++ b/7.2.055 @@ -0,0 +1,1271 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.055 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.055 +Problem: Various compiler warnings with strict checking. +Solution: Avoid the warnings by using return values and renaming. +Files: src/diff.c, src/eval.c, src/ex_cmds.c, src/ex_docmd.c, + src/fileio.c, src/fold.c, src/globals.h, src/gui.c, + src/gui_at_sb.c, src/gui_gtk_x11.c, src/gui_xmdlg.c, + src/gui_xmebw.c, src/main.c, src/mbyte.c, src/message.c, + src/netbeans.c, src/option.c, src/os_unix.c, src/spell.c, + src/ui.c, src/window.c + + +*** ../vim-7.2.054/src/diff.c Fri Jan 18 17:39:32 2008 +--- src/diff.c Fri Nov 28 17:23:35 2008 +*************** +*** 661,666 **** +--- 665,671 ---- + char_u *tmp_diff; + FILE *fd; + int ok; ++ int io_error = FALSE; + + /* Delete all diffblocks. */ + diff_clear(curtab); +*************** +*** 697,714 **** + { + ok = FALSE; + fd = mch_fopen((char *)tmp_orig, "w"); +! if (fd != NULL) + { +! fwrite("line1\n", (size_t)6, (size_t)1, fd); + fclose(fd); + fd = mch_fopen((char *)tmp_new, "w"); +! if (fd != NULL) + { +! fwrite("line2\n", (size_t)6, (size_t)1, fd); + fclose(fd); + diff_file(tmp_orig, tmp_new, tmp_diff); + fd = mch_fopen((char *)tmp_diff, "r"); +! if (fd != NULL) + { + char_u linebuf[LBUFLEN]; + +--- 702,727 ---- + { + ok = FALSE; + fd = mch_fopen((char *)tmp_orig, "w"); +! if (fd == NULL) +! io_error = TRUE; +! else + { +! if (fwrite("line1\n", (size_t)6, (size_t)1, fd) != 1) +! io_error = TRUE; + fclose(fd); + fd = mch_fopen((char *)tmp_new, "w"); +! if (fd == NULL) +! io_error = TRUE; +! else + { +! if (fwrite("line2\n", (size_t)6, (size_t)1, fd) != 1) +! io_error = TRUE; + fclose(fd); + diff_file(tmp_orig, tmp_new, tmp_diff); + fd = mch_fopen((char *)tmp_diff, "r"); +! if (fd == NULL) +! io_error = TRUE; +! else + { + char_u linebuf[LBUFLEN]; + +*************** +*** 761,766 **** +--- 774,781 ---- + } + if (!ok) + { ++ if (io_error) ++ EMSG(_("E810: Cannot read or write temp files")); + EMSG(_("E97: Cannot create diffs")); + diff_a_works = MAYBE; + #if defined(MSWIN) || defined(MSDOS) +*************** +*** 925,934 **** + { + # ifdef TEMPDIRNAMES + if (vim_tempdir != NULL) +! mch_chdir((char *)vim_tempdir); + else + # endif +! mch_chdir("/tmp"); + shorten_fnames(TRUE); + } + #endif +--- 940,949 ---- + { + # ifdef TEMPDIRNAMES + if (vim_tempdir != NULL) +! ignored = mch_chdir((char *)vim_tempdir); + else + # endif +! ignored = mch_chdir("/tmp"); + shorten_fnames(TRUE); + } + #endif +*** ../vim-7.2.054/src/eval.c Fri Nov 28 11:15:10 2008 +--- src/eval.c Fri Nov 28 12:23:13 2008 +*************** +*** 10641,10647 **** + # ifdef FEAT_WINDOWS + win_T *wp; + # endif +! int n = 1; + + if (row >= 0 && col >= 0) + { +--- 10641,10647 ---- + # ifdef FEAT_WINDOWS + win_T *wp; + # endif +! int winnr = 1; + + if (row >= 0 && col >= 0) + { +*************** +*** 10651,10659 **** + (void)mouse_comp_pos(win, &row, &col, &lnum); + # ifdef FEAT_WINDOWS + for (wp = firstwin; wp != win; wp = wp->w_next) +! ++n; + # endif +! vimvars[VV_MOUSE_WIN].vv_nr = n; + vimvars[VV_MOUSE_LNUM].vv_nr = lnum; + vimvars[VV_MOUSE_COL].vv_nr = col + 1; + } +--- 10651,10659 ---- + (void)mouse_comp_pos(win, &row, &col, &lnum); + # ifdef FEAT_WINDOWS + for (wp = firstwin; wp != win; wp = wp->w_next) +! ++winnr; + # endif +! vimvars[VV_MOUSE_WIN].vv_nr = winnr; + vimvars[VV_MOUSE_LNUM].vv_nr = lnum; + vimvars[VV_MOUSE_COL].vv_nr = col + 1; + } +*** ../vim-7.2.054/src/ex_cmds.c Sat Nov 15 14:10:23 2008 +--- src/ex_cmds.c Fri Nov 28 17:24:08 2008 +*************** +*** 1941,1947 **** + * root. + */ + if (fp_out != NULL) +! (void)fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid); + #endif + } + } +--- 1941,1947 ---- + * root. + */ + if (fp_out != NULL) +! ignored = fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid); + #endif + } + } +*** ../vim-7.2.054/src/ex_docmd.c Sat Nov 15 14:10:23 2008 +--- src/ex_docmd.c Fri Nov 28 17:26:13 2008 +*************** +*** 8753,8760 **** + else if (*dirnow != NUL + && (ssop_flags & SSOP_CURDIR) && globaldir != NULL) + { +! (void)mch_chdir((char *)globaldir); +! shorten_fnames(TRUE); + } + + failed |= (makeopens(fd, dirnow) == FAIL); +--- 8753,8760 ---- + else if (*dirnow != NUL + && (ssop_flags & SSOP_CURDIR) && globaldir != NULL) + { +! if (mch_chdir((char *)globaldir) == OK) +! shorten_fnames(TRUE); + } + + failed |= (makeopens(fd, dirnow) == FAIL); +*** ../vim-7.2.054/src/fileio.c Wed Nov 12 16:04:43 2008 +--- src/fileio.c Fri Nov 28 17:35:54 2008 +*************** +*** 2214,2220 **** + { + /* Use stderr for stdin, makes shell commands work. */ + close(0); +! dup(2); + } + #endif + +--- 2214,2220 ---- + { + /* Use stderr for stdin, makes shell commands work. */ + close(0); +! ignored = dup(2); + } + #endif + +*************** +*** 3449,3455 **** + { + # ifdef UNIX + # ifdef HAVE_FCHOWN +! fchown(fd, st_old.st_uid, st_old.st_gid); + # endif + if (mch_stat((char *)IObuff, &st) < 0 + || st.st_uid != st_old.st_uid +--- 3449,3455 ---- + { + # ifdef UNIX + # ifdef HAVE_FCHOWN +! ignored = fchown(fd, st_old.st_uid, st_old.st_gid); + # endif + if (mch_stat((char *)IObuff, &st) < 0 + || st.st_uid != st_old.st_uid +*************** +*** 4365,4371 **** + || st.st_uid != st_old.st_uid + || st.st_gid != st_old.st_gid) + { +! fchown(fd, st_old.st_uid, st_old.st_gid); + if (perm >= 0) /* set permission again, may have changed */ + (void)mch_setperm(wfname, perm); + } +--- 4365,4371 ---- + || st.st_uid != st_old.st_uid + || st.st_gid != st_old.st_gid) + { +! ignored = fchown(fd, st_old.st_uid, st_old.st_gid); + if (perm >= 0) /* set permission again, may have changed */ + (void)mch_setperm(wfname, perm); + } +*************** +*** 6030,6038 **** + { + tbuf[FGETS_SIZE - 2] = NUL; + #ifdef USE_CR +! fgets_cr((char *)tbuf, FGETS_SIZE, fp); + #else +! fgets((char *)tbuf, FGETS_SIZE, fp); + #endif + } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n'); + } +--- 6030,6038 ---- + { + tbuf[FGETS_SIZE - 2] = NUL; + #ifdef USE_CR +! ignoredp = fgets_cr((char *)tbuf, FGETS_SIZE, fp); + #else +! ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp); + #endif + } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n'); + } +*** ../vim-7.2.054/src/fold.c Wed Aug 6 18:59:40 2008 +--- src/fold.c Fri Nov 28 12:24:16 2008 +*************** +*** 48,54 **** + static int foldFind __ARGS((garray_T *gap, linenr_T lnum, fold_T **fpp)); + static int foldLevelWin __ARGS((win_T *wp, linenr_T lnum)); + static void checkupdate __ARGS((win_T *wp)); +! static void setFoldRepeat __ARGS((linenr_T lnum, long count, int open)); + static linenr_T setManualFold __ARGS((linenr_T lnum, int opening, int recurse, int *donep)); + static linenr_T setManualFoldWin __ARGS((win_T *wp, linenr_T lnum, int opening, int recurse, int *donep)); + static void foldOpenNested __ARGS((fold_T *fpr)); +--- 48,54 ---- + static int foldFind __ARGS((garray_T *gap, linenr_T lnum, fold_T **fpp)); + static int foldLevelWin __ARGS((win_T *wp, linenr_T lnum)); + static void checkupdate __ARGS((win_T *wp)); +! static void setFoldRepeat __ARGS((linenr_T lnum, long count, int do_open)); + static linenr_T setManualFold __ARGS((linenr_T lnum, int opening, int recurse, int *donep)); + static linenr_T setManualFoldWin __ARGS((win_T *wp, linenr_T lnum, int opening, int recurse, int *donep)); + static void foldOpenNested __ARGS((fold_T *fpr)); +*************** +*** 1241,1250 **** + * Repeat "count" times. + */ + static void +! setFoldRepeat(lnum, count, open) + linenr_T lnum; + long count; +! int open; + { + int done; + long n; +--- 1241,1250 ---- + * Repeat "count" times. + */ + static void +! setFoldRepeat(lnum, count, do_open) + linenr_T lnum; + long count; +! int do_open; + { + int done; + long n; +*************** +*** 1252,1258 **** + for (n = 0; n < count; ++n) + { + done = DONE_NOTHING; +! (void)setManualFold(lnum, open, FALSE, &done); + if (!(done & DONE_ACTION)) + { + /* Only give an error message when no fold could be opened. */ +--- 1252,1258 ---- + for (n = 0; n < count; ++n) + { + done = DONE_NOTHING; +! (void)setManualFold(lnum, do_open, FALSE, &done); + if (!(done & DONE_ACTION)) + { + /* Only give an error message when no fold could be opened. */ +*** ../vim-7.2.054/src/globals.h Thu Sep 18 21:29:07 2008 +--- src/globals.h Fri Nov 28 17:35:50 2008 +*************** +*** 1549,1554 **** +--- 1549,1562 ---- + EXTERN time_t starttime; + + /* ++ * Some compilers warn for not using a return value, but in some situations we ++ * can't do anything useful with the value. Assign to this variable to avoid ++ * the warning. ++ */ ++ EXTERN int ignored; ++ EXTERN char *ignoredp; ++ ++ /* + * Optional Farsi support. Include it here, so EXTERN and INIT are defined. + */ + #ifdef FEAT_FKMAP +*** ../vim-7.2.054/src/gui.c Wed Aug 6 14:37:26 2008 +--- src/gui.c Fri Nov 28 18:48:31 2008 +*************** +*** 139,145 **** + /* The read returns when the child closes the pipe (or when + * the child dies for some reason). */ + close(pipefd[1]); +! (void)read(pipefd[0], &dummy, (size_t)1); + close(pipefd[0]); + } + +--- 139,145 ---- + /* The read returns when the child closes the pipe (or when + * the child dies for some reason). */ + close(pipefd[1]); +! ignored = (int)read(pipefd[0], &dummy, (size_t)1); + close(pipefd[0]); + } + +*** ../vim-7.2.054/src/gui_at_sb.c Sun Jun 13 21:37:13 2004 +--- src/gui_at_sb.c Fri Nov 28 12:19:19 2008 +*************** +*** 1078,1083 **** +--- 1078,1089 ---- + Cardinal *num_params; /* unused */ + { + ScrollbarWidget sbw = (ScrollbarWidget)w; ++ /* Use a union to avoid a warning for the weird conversion from float to ++ * XtPointer. Comes from Xaw/Scrollbar.c. */ ++ union { ++ XtPointer xtp; ++ float xtf; ++ } xtpf; + + if (LookAhead(w, event)) + return; +*************** +*** 1085,1091 **** + /* thumbProc is not pretty, but is necessary for backwards + compatibility on those architectures for which it work{s,ed}; + the intent is to pass a (truncated) float by value. */ +! XtCallCallbacks(w, XtNthumbProc, *(XtPointer*)&sbw->scrollbar.top); + XtCallCallbacks(w, XtNjumpProc, (XtPointer)&sbw->scrollbar.top); + } + +--- 1091,1098 ---- + /* thumbProc is not pretty, but is necessary for backwards + compatibility on those architectures for which it work{s,ed}; + the intent is to pass a (truncated) float by value. */ +! xtpf.xtf = sbw->scrollbar.top; +! XtCallCallbacks(w, XtNthumbProc, xtpf.xtp); + XtCallCallbacks(w, XtNjumpProc, (XtPointer)&sbw->scrollbar.top); + } + +*** ../vim-7.2.054/src/gui_gtk_x11.c Tue Jul 8 12:46:08 2008 +--- src/gui_gtk_x11.c Fri Nov 28 21:06:38 2008 +*************** +*** 4070,4083 **** + + if (mask & (XValue | YValue)) + { +! int w, h; +! gui_mch_get_screen_dimensions(&w, &h); +! h += p_ghr + get_menu_tool_height(); +! w += get_menu_tool_width(); + if (mask & XNegative) +! x += w - pixel_width; + if (mask & YNegative) +! y += h - pixel_height; + #ifdef HAVE_GTK2 + gtk_window_move(GTK_WINDOW(gui.mainwin), x, y); + #else +--- 4070,4083 ---- + + if (mask & (XValue | YValue)) + { +! int ww, hh; +! gui_mch_get_screen_dimensions(&ww, &hh); +! hh += p_ghr + get_menu_tool_height(); +! ww += get_menu_tool_width(); + if (mask & XNegative) +! x += ww - pixel_width; + if (mask & YNegative) +! y += hh - pixel_height; + #ifdef HAVE_GTK2 + gtk_window_move(GTK_WINDOW(gui.mainwin), x, y); + #else +*** ../vim-7.2.054/src/gui_xmdlg.c Tue Jun 24 23:39:32 2008 +--- src/gui_xmdlg.c Fri Nov 28 21:04:08 2008 +*************** +*** 369,378 **** + char buf[TEMP_BUF_SIZE]; + XmString items[MAX_ENTRIES_IN_LIST]; + int i; +! int index; + +! for (index = (int)ENCODING; index < (int)NONE; ++index) +! count[index] = 0; + + /* First we insert the wild char into every single list. */ + if (fix != ENCODING) +--- 369,378 ---- + char buf[TEMP_BUF_SIZE]; + XmString items[MAX_ENTRIES_IN_LIST]; + int i; +! int idx; + +! for (idx = (int)ENCODING; idx < (int)NONE; ++idx) +! count[idx] = 0; + + /* First we insert the wild char into every single list. */ + if (fix != ENCODING) +*************** +*** 503,516 **** + /* + * Now loop trough the remaining lists and set them up. + */ +! for (index = (int)NAME; index < (int)NONE; ++index) + { + Widget w; + +! if (fix == (enum ListSpecifier)index) + continue; + +! switch ((enum ListSpecifier)index) + { + case NAME: + w = data->list[NAME]; +--- 503,516 ---- + /* + * Now loop trough the remaining lists and set them up. + */ +! for (idx = (int)NAME; idx < (int)NONE; ++idx) + { + Widget w; + +! if (fix == (enum ListSpecifier)idx) + continue; + +! switch ((enum ListSpecifier)idx) + { + case NAME: + w = data->list[NAME]; +*************** +*** 525,545 **** + w = (Widget)0; /* for lint */ + } + +! for (i = 0; i < count[index]; ++i) + { +! items[i] = XmStringCreateLocalized(list[index][i]); +! XtFree(list[index][i]); + } + XmListDeleteAllItems(w); +! XmListAddItems(w, items, count[index], 1); +! if (data->sel[index]) + { + XmStringFree(items[0]); +! items[0] = XmStringCreateLocalized(data->sel[index]); + XmListSelectItem(w, items[0], False); + XmListSetBottomItem(w, items[0]); + } +! for (i = 0; i < count[index]; ++i) + XmStringFree(items[i]); + } + } +--- 525,545 ---- + w = (Widget)0; /* for lint */ + } + +! for (i = 0; i < count[idx]; ++i) + { +! items[i] = XmStringCreateLocalized(list[idx][i]); +! XtFree(list[idx][i]); + } + XmListDeleteAllItems(w); +! XmListAddItems(w, items, count[idx], 1); +! if (data->sel[idx]) + { + XmStringFree(items[0]); +! items[0] = XmStringCreateLocalized(data->sel[idx]); + XmListSelectItem(w, items[0], False); + XmListSetBottomItem(w, items[0]); + } +! for (i = 0; i < count[idx]; ++i) + XmStringFree(items[i]); + } + } +*************** +*** 695,708 **** + int n; + XmString str; + Arg args[4]; +! char *msg = _("no specific match"); + + n = 0; +! str = XmStringCreateLocalized(msg); + XtSetArg(args[n], XmNlabelString, str); ++n; + XtSetValues(data->sample, args, n); + apply_fontlist(data->sample); +! XmTextSetString(data->name, msg); + XmStringFree(str); + + return False; +--- 695,708 ---- + int n; + XmString str; + Arg args[4]; +! char *nomatch_msg = _("no specific match"); + + n = 0; +! str = XmStringCreateLocalized(nomatch_msg); + XtSetArg(args[n], XmNlabelString, str); ++n; + XtSetValues(data->sample, args, n); + apply_fontlist(data->sample); +! XmTextSetString(data->name, nomatch_msg); + XmStringFree(str); + + return False; +*************** +*** 886,906 **** + { + int i; + int max; +! int index = 0; + int size; +! char str[128]; + + for (i = 0, max = 0; i < data->num; i++) + { +! get_part(fn(data, i), 7, str); +! size = atoi(str); + if ((size > max) && (size < MAX_DISPLAY_SIZE)) + { +! index = i; + max = size; + } + } +! strcpy(big_font, fn(data, index)); + } + data->old = XLoadQueryFont(XtDisplay(parent), big_font); + data->old_list = gui_motif_create_fontlist(data->old); +--- 886,906 ---- + { + int i; + int max; +! int idx = 0; + int size; +! char buf[128]; + + for (i = 0, max = 0; i < data->num; i++) + { +! get_part(fn(data, i), 7, buf); +! size = atoi(buf); + if ((size > max) && (size < MAX_DISPLAY_SIZE)) + { +! idx = i; + max = size; + } + } +! strcpy(big_font, fn(data, idx)); + } + data->old = XLoadQueryFont(XtDisplay(parent), big_font); + data->old_list = gui_motif_create_fontlist(data->old); +*************** +*** 1217,1244 **** + + if (i != 0) + { +! char name[TEMP_BUF_SIZE]; +! char style[TEMP_BUF_SIZE]; +! char size[TEMP_BUF_SIZE]; +! char encoding[TEMP_BUF_SIZE]; + char *found; + + found = names[0]; + +! name_part(found, name); +! style_part(found, style); +! size_part(found, size, data->in_pixels); +! encoding_part(found, encoding); +! +! if (strlen(name) > 0 +! && strlen(style) > 0 +! && strlen(size) > 0 +! && strlen(encoding) > 0) + { +! data->sel[NAME] = XtNewString(name); +! data->sel[STYLE] = XtNewString(style); +! data->sel[SIZE] = XtNewString(size); +! data->sel[ENCODING] = XtNewString(encoding); + data->font_name = XtNewString(names[0]); + display_sample(data); + XmTextSetString(data->name, data->font_name); +--- 1217,1244 ---- + + if (i != 0) + { +! char namebuf[TEMP_BUF_SIZE]; +! char stylebuf[TEMP_BUF_SIZE]; +! char sizebuf[TEMP_BUF_SIZE]; +! char encodingbuf[TEMP_BUF_SIZE]; + char *found; + + found = names[0]; + +! name_part(found, namebuf); +! style_part(found, stylebuf); +! size_part(found, sizebuf, data->in_pixels); +! encoding_part(found, encodingbuf); +! +! if (strlen(namebuf) > 0 +! && strlen(stylebuf) > 0 +! && strlen(sizebuf) > 0 +! && strlen(encodingbuf) > 0) + { +! data->sel[NAME] = XtNewString(namebuf); +! data->sel[STYLE] = XtNewString(stylebuf); +! data->sel[SIZE] = XtNewString(sizebuf); +! data->sel[ENCODING] = XtNewString(encodingbuf); + data->font_name = XtNewString(names[0]); + display_sample(data); + XmTextSetString(data->name, data->font_name); +*** ../vim-7.2.054/src/gui_xmebw.c Thu Nov 8 20:48:14 2007 +--- src/gui_xmebw.c Fri Nov 28 18:58:53 2008 +*************** +*** 1256,1262 **** + } + else + { +! int adjust = 0; + + #if !defined(LESSTIF_VERSION) && (XmVersion > 1002) + /* +--- 1256,1262 ---- + } + else + { +! adjust = 0; + + #if !defined(LESSTIF_VERSION) && (XmVersion > 1002) + /* +*************** +*** 1268,1279 **** + { + case XmEXTERNAL_HIGHLIGHT: + adjust = (eb->primitive.highlight_thickness - +! (eb->pushbutton.default_button_shadow_thickness ? +! Xm3D_ENHANCE_PIXEL : 0)); + break; + + case XmINTERNAL_HIGHLIGHT: +- adjust = 0; + break; + + default: +--- 1268,1278 ---- + { + case XmEXTERNAL_HIGHLIGHT: + adjust = (eb->primitive.highlight_thickness - +! (eb->pushbutton.default_button_shadow_thickness +! ? Xm3D_ENHANCE_PIXEL : 0)); + break; + + case XmINTERNAL_HIGHLIGHT: + break; + + default: +*** ../vim-7.2.054/src/main.c Thu Nov 20 14:11:47 2008 +--- src/main.c Fri Nov 28 18:32:48 2008 +*************** +*** 2372,2378 **** + * Is there any other system that cannot do this? + */ + close(0); +! dup(2); + #endif + } + +--- 2372,2378 ---- + * Is there any other system that cannot do this? + */ + close(0); +! ignored = dup(2); + #endif + } + +*** ../vim-7.2.054/src/mbyte.c Thu Nov 20 17:09:09 2008 +--- src/mbyte.c Fri Nov 28 18:44:05 2008 +*************** +*** 717,723 **** + * where mblen() returns 0 for invalid character. + * Therefore, following condition includes 0. + */ +! (void)mblen(NULL, 0); /* First reset the state. */ + if (mblen(buf, (size_t)1) <= 0) + n = 2; + else +--- 717,723 ---- + * where mblen() returns 0 for invalid character. + * Therefore, following condition includes 0. + */ +! ignored = mblen(NULL, 0); /* First reset the state. */ + if (mblen(buf, (size_t)1) <= 0) + n = 2; + else +*************** +*** 5278,5284 **** + + /*ARGSUSED*/ + static void +! preedit_start_cbproc(XIC xic, XPointer client_data, XPointer call_data) + { + #ifdef XIM_DEBUG + xim_log("xim_decide_input_style()\n"); +--- 5278,5284 ---- + + /*ARGSUSED*/ + static void +! preedit_start_cbproc(XIC thexic, XPointer client_data, XPointer call_data) + { + #ifdef XIM_DEBUG + xim_log("xim_decide_input_style()\n"); +*************** +*** 5312,5318 **** + + /*ARGSUSED*/ + static void +! preedit_draw_cbproc(XIC xic, XPointer client_data, XPointer call_data) + { + XIMPreeditDrawCallbackStruct *draw_data; + XIMText *text; +--- 5312,5318 ---- + + /*ARGSUSED*/ + static void +! preedit_draw_cbproc(XIC thexic, XPointer client_data, XPointer call_data) + { + XIMPreeditDrawCallbackStruct *draw_data; + XIMText *text; +*************** +*** 5453,5459 **** + + /*ARGSUSED*/ + static void +! preedit_caret_cbproc(XIC xic, XPointer client_data, XPointer call_data) + { + #ifdef XIM_DEBUG + xim_log("preedit_caret_cbproc()\n"); +--- 5453,5459 ---- + + /*ARGSUSED*/ + static void +! preedit_caret_cbproc(XIC thexic, XPointer client_data, XPointer call_data) + { + #ifdef XIM_DEBUG + xim_log("preedit_caret_cbproc()\n"); +*************** +*** 5462,5468 **** + + /*ARGSUSED*/ + static void +! preedit_done_cbproc(XIC xic, XPointer client_data, XPointer call_data) + { + #ifdef XIM_DEBUG + xim_log("preedit_done_cbproc()\n"); +--- 5462,5468 ---- + + /*ARGSUSED*/ + static void +! preedit_done_cbproc(XIC thexic, XPointer client_data, XPointer call_data) + { + #ifdef XIM_DEBUG + xim_log("preedit_done_cbproc()\n"); +*** ../vim-7.2.054/src/message.c Sun Jul 13 19:18:44 2008 +--- src/message.c Fri Nov 28 12:26:56 2008 +*************** +*** 4585,4645 **** + if (remove_trailing_zeroes) + { + int i; +! char *p; + + /* Using %g or %G: remove superfluous zeroes. */ + if (fmt_spec == 'f') +! p = tmp + str_arg_l - 1; + else + { +! p = (char *)vim_strchr((char_u *)tmp, + fmt_spec == 'e' ? 'e' : 'E'); +! if (p != NULL) + { + /* Remove superfluous '+' and leading + * zeroes from the exponent. */ +! if (p[1] == '+') + { + /* Change "1.0e+07" to "1.0e07" */ +! STRMOVE(p + 1, p + 2); + --str_arg_l; + } +! i = (p[1] == '-') ? 2 : 1; +! while (p[i] == '0') + { + /* Change "1.0e07" to "1.0e7" */ +! STRMOVE(p + i, p + i + 1); + --str_arg_l; + } +! --p; + } + } + +! if (p != NULL && !precision_specified) + /* Remove trailing zeroes, but keep the one + * just after a dot. */ +! while (p > tmp + 2 && *p == '0' && p[-1] != '.') + { +! STRMOVE(p, p + 1); +! --p; + --str_arg_l; + } + } + else + { +! char *p; + + /* Be consistent: some printf("%e") use 1.0e+12 + * and some 1.0e+012. Remove one zero in the last + * case. */ +! p = (char *)vim_strchr((char_u *)tmp, + fmt_spec == 'e' ? 'e' : 'E'); +! if (p != NULL && (p[1] == '+' || p[1] == '-') +! && p[2] == '0' +! && vim_isdigit(p[3]) +! && vim_isdigit(p[4])) + { +! STRMOVE(p + 2, p + 3); + --str_arg_l; + } + } +--- 4585,4646 ---- + if (remove_trailing_zeroes) + { + int i; +! char *tp; + + /* Using %g or %G: remove superfluous zeroes. */ + if (fmt_spec == 'f') +! tp = tmp + str_arg_l - 1; + else + { +! tp = (char *)vim_strchr((char_u *)tmp, + fmt_spec == 'e' ? 'e' : 'E'); +! if (tp != NULL) + { + /* Remove superfluous '+' and leading + * zeroes from the exponent. */ +! if (tp[1] == '+') + { + /* Change "1.0e+07" to "1.0e07" */ +! STRMOVE(tp + 1, tp + 2); + --str_arg_l; + } +! i = (tp[1] == '-') ? 2 : 1; +! while (tp[i] == '0') + { + /* Change "1.0e07" to "1.0e7" */ +! STRMOVE(tp + i, tp + i + 1); + --str_arg_l; + } +! --tp; + } + } + +! if (tp != NULL && !precision_specified) + /* Remove trailing zeroes, but keep the one + * just after a dot. */ +! while (tp > tmp + 2 && *tp == '0' +! && tp[-1] != '.') + { +! STRMOVE(tp, tp + 1); +! --tp; + --str_arg_l; + } + } + else + { +! char *tp; + + /* Be consistent: some printf("%e") use 1.0e+12 + * and some 1.0e+012. Remove one zero in the last + * case. */ +! tp = (char *)vim_strchr((char_u *)tmp, + fmt_spec == 'e' ? 'e' : 'E'); +! if (tp != NULL && (tp[1] == '+' || tp[1] == '-') +! && tp[2] == '0' +! && vim_isdigit(tp[3]) +! && vim_isdigit(tp[4])) + { +! STRMOVE(tp + 2, tp + 3); + --str_arg_l; + } + } +*** ../vim-7.2.054/src/netbeans.c Sat Nov 15 14:10:23 2008 +--- src/netbeans.c Fri Nov 28 18:51:43 2008 +*************** +*** 1043,1049 **** + nbdebug(("EVT: %s", buf)); + /* nb_send(buf, "netbeans_end"); avoid "write failed" messages */ + if (sd >= 0) +! sock_write(sd, buf, (int)STRLEN(buf)); /* ignore errors */ + } + } + +--- 1043,1049 ---- + nbdebug(("EVT: %s", buf)); + /* nb_send(buf, "netbeans_end"); avoid "write failed" messages */ + if (sd >= 0) +! ignored = sock_write(sd, buf, (int)STRLEN(buf)); + } + } + +*************** +*** 2277,2285 **** + int serNum; + int localTypeNum; + int typeNum; +- # ifdef NBDEBUG +- int len; +- # endif + pos_T *pos; + + if (buf == NULL || buf->bufp == NULL) +--- 2277,2282 ---- +*************** +*** 2303,2315 **** + pos = get_off_or_lnum(buf->bufp, &args); + + cp = (char *)args; +! # ifdef NBDEBUG +! len = +! # endif +! strtol(cp, &cp, 10); + args = (char_u *)cp; + # ifdef NBDEBUG +! if (len != -1) + { + nbdebug((" partial line annotation -- Not Yet Implemented!\n")); + } +--- 2300,2309 ---- + pos = get_off_or_lnum(buf->bufp, &args); + + cp = (char *)args; +! ignored = (int)strtol(cp, &cp, 10); + args = (char_u *)cp; + # ifdef NBDEBUG +! if (ignored != -1) + { + nbdebug((" partial line annotation -- Not Yet Implemented!\n")); + } +*** ../vim-7.2.054/src/option.c Sun Nov 9 13:43:25 2008 +--- src/option.c Fri Nov 28 12:27:34 2008 +*************** +*** 8232,8244 **** + { + if (number == 0 && string != NULL) + { +! int index; + + /* Either we are given a string or we are setting option + * to zero. */ +! for (index = 0; string[index] == '0'; ++index) + ; +! if (string[index] != NUL || index == 0) + { + /* There's another character after zeros or the string + * is empty. In both cases, we are trying to set a +--- 8232,8244 ---- + { + if (number == 0 && string != NULL) + { +! int idx; + + /* Either we are given a string or we are setting option + * to zero. */ +! for (idx = 0; string[idx] == '0'; ++idx) + ; +! if (string[idx] != NUL || idx == 0) + { + /* There's another character after zeros or the string + * is empty. In both cases, we are trying to set a +*** ../vim-7.2.054/src/os_unix.c Wed Nov 12 14:09:38 2008 +--- src/os_unix.c Fri Nov 28 18:39:55 2008 +*************** +*** 315,326 **** + {-1, "Unknown!", FALSE} + }; + + void + mch_write(s, len) + char_u *s; + int len; + { +! write(1, (char *)s, len); + if (p_wd) /* Unix is too fast, slow down a bit more */ + RealWaitForChar(read_cmd_fd, p_wd, NULL); + } +--- 315,329 ---- + {-1, "Unknown!", FALSE} + }; + ++ /* ++ * Write s[len] to the screen. ++ */ + void + mch_write(s, len) + char_u *s; + int len; + { +! ignored = (int)write(1, (char *)s, len); + if (p_wd) /* Unix is too fast, slow down a bit more */ + RealWaitForChar(read_cmd_fd, p_wd, NULL); + } +*************** +*** 3927,3935 **** + */ + if (fd >= 0) + { +! dup(fd); /* To replace stdin (file descriptor 0) */ +! dup(fd); /* To replace stdout (file descriptor 1) */ +! dup(fd); /* To replace stderr (file descriptor 2) */ + + /* Don't need this now that we've duplicated it */ + close(fd); +--- 3930,3938 ---- + */ + if (fd >= 0) + { +! ignored = dup(fd); /* To replace stdin (fd 0) */ +! ignored = dup(fd); /* To replace stdout (fd 1) */ +! ignored = dup(fd); /* To replace stderr (fd 2) */ + + /* Don't need this now that we've duplicated it */ + close(fd); +*************** +*** 3997,4009 **** + + /* set up stdin/stdout/stderr for the child */ + close(0); +! dup(pty_slave_fd); + close(1); +! dup(pty_slave_fd); + if (gui.in_use) + { + close(2); +! dup(pty_slave_fd); + } + + close(pty_slave_fd); /* has been dupped, close it now */ +--- 4000,4012 ---- + + /* set up stdin/stdout/stderr for the child */ + close(0); +! ignored = dup(pty_slave_fd); + close(1); +! ignored = dup(pty_slave_fd); + if (gui.in_use) + { + close(2); +! ignored = dup(pty_slave_fd); + } + + close(pty_slave_fd); /* has been dupped, close it now */ +*************** +*** 4014,4026 **** + /* set up stdin for the child */ + close(fd_toshell[1]); + close(0); +! dup(fd_toshell[0]); + close(fd_toshell[0]); + + /* set up stdout for the child */ + close(fd_fromshell[0]); + close(1); +! dup(fd_fromshell[1]); + close(fd_fromshell[1]); + + # ifdef FEAT_GUI +--- 4017,4029 ---- + /* set up stdin for the child */ + close(fd_toshell[1]); + close(0); +! ignored = dup(fd_toshell[0]); + close(fd_toshell[0]); + + /* set up stdout for the child */ + close(fd_fromshell[0]); + close(1); +! ignored = dup(fd_fromshell[1]); + close(fd_fromshell[1]); + + # ifdef FEAT_GUI +*************** +*** 4028,4034 **** + { + /* set up stderr for the child */ + close(2); +! dup(1); + } + # endif + } +--- 4031,4037 ---- + { + /* set up stderr for the child */ + close(2); +! ignored = dup(1); + } + # endif + } +*************** +*** 4159,4165 **** + && (lnum != + curbuf->b_ml.ml_line_count + || curbuf->b_p_eol))) +! write(toshell_fd, "\n", (size_t)1); + ++lnum; + if (lnum > curbuf->b_op_end.lnum) + { +--- 4162,4169 ---- + && (lnum != + curbuf->b_ml.ml_line_count + || curbuf->b_p_eol))) +! ignored = write(toshell_fd, "\n", +! (size_t)1); + ++lnum; + if (lnum > curbuf->b_op_end.lnum) + { +*** ../vim-7.2.054/src/spell.c Fri Nov 28 10:08:05 2008 +--- src/spell.c Fri Nov 28 12:28:24 2008 +*************** +*** 4950,4956 **** + static void put_sugtime __ARGS((spellinfo_T *spin, FILE *fd)); + static int write_vim_spell __ARGS((spellinfo_T *spin, char_u *fname)); + static void clear_node __ARGS((wordnode_T *node)); +! static int put_node __ARGS((FILE *fd, wordnode_T *node, int index, int regionmask, int prefixtree)); + static void spell_make_sugfile __ARGS((spellinfo_T *spin, char_u *wfname)); + static int sug_filltree __ARGS((spellinfo_T *spin, slang_T *slang)); + static int sug_maketable __ARGS((spellinfo_T *spin)); +--- 4950,4956 ---- + static void put_sugtime __ARGS((spellinfo_T *spin, FILE *fd)); + static int write_vim_spell __ARGS((spellinfo_T *spin, char_u *fname)); + static void clear_node __ARGS((wordnode_T *node)); +! static int put_node __ARGS((FILE *fd, wordnode_T *node, int idx, int regionmask, int prefixtree)); + static void spell_make_sugfile __ARGS((spellinfo_T *spin, char_u *wfname)); + static int sug_filltree __ARGS((spellinfo_T *spin, slang_T *slang)); + static int sug_maketable __ARGS((spellinfo_T *spin)); +*** ../vim-7.2.054/src/ui.c Sun Sep 14 15:57:54 2008 +--- src/ui.c Fri Nov 28 19:04:36 2008 +*************** +*** 1820,1826 **** + #ifdef HAVE_DUP + /* Use stderr for stdin, also works for shell commands. */ + close(0); +! dup(2); + #else + read_cmd_fd = 2; /* read from stderr instead of stdin */ + #endif +--- 1820,1826 ---- + #ifdef HAVE_DUP + /* Use stderr for stdin, also works for shell commands. */ + close(0); +! ignored = dup(2); + #else + read_cmd_fd = 2; /* read from stderr instead of stdin */ + #endif +*** ../vim-7.2.054/src/window.c Sat Nov 15 14:10:23 2008 +--- src/window.c Fri Nov 28 18:46:45 2008 +*************** +*** 4029,4042 **** + if (mch_dirname(cwd, MAXPATHL) == OK) + globaldir = vim_strsave(cwd); + } +! mch_chdir((char *)curwin->w_localdir); +! shorten_fnames(TRUE); + } + else if (globaldir != NULL) + { + /* Window doesn't have a local directory and we are not in the global + * directory: Change to the global directory. */ +! mch_chdir((char *)globaldir); + vim_free(globaldir); + globaldir = NULL; + shorten_fnames(TRUE); +--- 4029,4042 ---- + if (mch_dirname(cwd, MAXPATHL) == OK) + globaldir = vim_strsave(cwd); + } +! if (mch_chdir((char *)curwin->w_localdir) == 0) +! shorten_fnames(TRUE); + } + else if (globaldir != NULL) + { + /* Window doesn't have a local directory and we are not in the global + * directory: Change to the global directory. */ +! ignored = mch_chdir((char *)globaldir); + vim_free(globaldir); + globaldir = NULL; + shorten_fnames(TRUE); +*** ../vim-7.2.054/src/version.c Fri Nov 28 12:05:07 2008 +--- src/version.c Fri Nov 28 21:12:42 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 55, + /**/ + +-- +PRINCE: He's come to rescue me, father. +LAUNCELOT: (embarrassed) Well, let's not jump to conclusions ... + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.056 b/7.2.056 new file mode 100644 index 00000000..9e23f3da --- /dev/null +++ b/7.2.056 @@ -0,0 +1,57 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.056 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.056 (after 7.2.050) +Problem: Tests 58 and 59 fail. +Solution: Don't invoke fwrite() with a zero length. (Dominique Pelle) +Files: src/spell.c + + +*** ../vim-7.2.055/src/spell.c Fri Nov 28 21:26:50 2008 +--- src/spell.c Sat Nov 29 19:58:21 2008 +*************** +*** 8112,8118 **** + p = rr == 1 ? ftp->ft_from : ftp->ft_to; + l = (int)STRLEN(p); + putc(l, fd); +! fwv &= fwrite(p, l, (size_t)1, fd); + } + } + +--- 8218,8225 ---- + p = rr == 1 ? ftp->ft_from : ftp->ft_to; + l = (int)STRLEN(p); + putc(l, fd); +! if (l > 0) +! fwv &= fwrite(p, l, (size_t)1, fd); + } + } + +*** ../vim-7.2.055/src/version.c Fri Nov 28 21:26:50 2008 +--- src/version.c Sat Nov 29 20:10:05 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 56, + /**/ + +-- +GUARD #1: Where'd you get the coconut? +ARTHUR: We found them. +GUARD #1: Found them? In Mercea? The coconut's tropical! +ARTHUR: What do you mean? +GUARD #1: Well, this is a temperate zone. + The Quest for the Holy Grail (Monty Python) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.057 b/7.2.057 new file mode 100644 index 00000000..37549121 --- /dev/null +++ b/7.2.057 @@ -0,0 +1,111 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.057 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.057 (after 7.2.056) +Problem: Combination of int and size_t may not work. +Solution: Use size_t for variable. +Files: src/spell.c + + +*** ../vim-7.2.056/src/spell.c Sat Nov 29 20:10:59 2008 +--- src/spell.c Sat Nov 29 20:15:43 2008 +*************** +*** 7926,7932 **** + char_u *p; + int rr; + int retval = OK; +! int fwv = 1; /* collect return value of fwrite() to avoid + warnings from picky compiler */ + + fd = mch_fopen((char *)fname, "w"); +--- 8028,8034 ---- + char_u *p; + int rr; + int retval = OK; +! size_t fwv = 1; /* collect return value of fwrite() to avoid + warnings from picky compiler */ + + fd = mch_fopen((char *)fname, "w"); +*************** +*** 7939,7944 **** +--- 8041,8050 ---- + /*
: */ + /* */ + fwv &= fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd); ++ if (fwv != (size_t)1) ++ /* Catch first write error, don't try writing more. */ ++ goto theend; ++ + putc(VIMSPELLVERSION, fd); /* */ + + /* +*************** +*** 8300,8310 **** + /* Write another byte to check for errors (file system full). */ + if (putc(0, fd) == EOF) + retval = FAIL; +! + if (fclose(fd) == EOF) + retval = FAIL; + +! if (fwv != 1) + retval = FAIL; + if (retval == FAIL) + EMSG(_(e_write)); +--- 8406,8416 ---- + /* Write another byte to check for errors (file system full). */ + if (putc(0, fd) == EOF) + retval = FAIL; +! theend: + if (fclose(fd) == EOF) + retval = FAIL; + +! if (fwv != (size_t)1) + retval = FAIL; + if (retval == FAIL) + EMSG(_(e_write)); +*************** +*** 9897,9903 **** + char_u *p; + int len; + int totlen; +! int x = 1; /* collect return value of fwrite() */ + + if (fd != NULL) + put_bytes(fd, (long_u)gap->ga_len, 2); /* */ +--- 10003,10009 ---- + char_u *p; + int len; + int totlen; +! size_t x = 1; /* collect return value of fwrite() */ + + if (fd != NULL) + put_bytes(fd, (long_u)gap->ga_len, 2); /* */ +*** ../vim-7.2.056/src/version.c Sat Nov 29 20:10:59 2008 +--- src/version.c Sat Nov 29 20:13:46 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 57, + /**/ + +-- +GUARD #1: What -- a swallow carrying a coconut? +ARTHUR: It could grip it by the husk! +GUARD #1: It's not a question of where he grips it! It's a simple question + of weight ratios! A five ounce bird could not carry a 1 pound + coconut. + The Quest for the Holy Grail (Monty Python) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.058 b/7.2.058 new file mode 100644 index 00000000..95de243f --- /dev/null +++ b/7.2.058 @@ -0,0 +1,83 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.058 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.058 +Problem: Can't add a patch name to the ":version" output. +Solution: Add the extra_patches array. +Files: src/version.c + + +*** ../vim-7.2.057/src/version.c Sat Nov 29 20:18:44 2008 +--- src/version.c Sun Nov 30 12:12:31 2008 +*************** +*** 794,799 **** +--- 796,814 ---- + 0 + }; + ++ /* ++ * Place to put a short description when adding a feature with a patch. ++ * Keep it short, e.g.,: "relative numbers", "persistent undo". ++ * Also add a comment marker to separate the lines. ++ * See the official Vim patches for the diff format: It must use a context of ++ * one line only. Use "diff -C2". ++ */ ++ static char *(extra_patches[]) = ++ { /* Add your patch description below this line */ ++ /**/ ++ NULL ++ }; ++ + int + highest_patch() + { +*************** +*** 939,944 **** +--- 954,972 ---- + } + } + ++ /* Print the list of extra patch descriptions if there is at least one. */ ++ if (extra_patches[0] != NULL) ++ { ++ MSG_PUTS(_("\nExtra patches: ")); ++ s = ""; ++ for (i = 0; extra_patches[i] != NULL; ++i) ++ { ++ MSG_PUTS(s); ++ s = ", "; ++ MSG_PUTS(extra_patches[i]); ++ } ++ } ++ + #ifdef MODIFIED_BY + MSG_PUTS("\n"); + MSG_PUTS(_("Modified by ")); +*** ../vim-7.2.057/src/version.c Sat Nov 29 20:18:44 2008 +--- src/version.c Sun Nov 30 12:12:31 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 58, + /**/ + +-- +ARTHUR: Well, it doesn't matter. Will you go and tell your master that + Arthur from the Court of Camelot is here. +GUARD #1: Listen, in order to maintain air-speed velocity, a swallow + needs to beat its wings 43 times every second, right? +ARTHUR: Please! + The Quest for the Holy Grail (Monty Python) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.059 b/7.2.059 new file mode 100644 index 00000000..0012ad6d --- /dev/null +++ b/7.2.059 @@ -0,0 +1,70 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.059 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.059 +Problem: Diff display is not always updated. +Solution: Update the display more often. +Files: src/diff.c + + +*** ../vim-7.2.058/src/diff.c Fri Nov 28 21:26:50 2008 +--- src/diff.c Fri Nov 28 17:23:35 2008 +*************** +*** 73,78 **** +--- 73,80 ---- + { + tp->tp_diffbuf[i] = NULL; + tp->tp_diff_invalid = TRUE; ++ if (tp == curtab) ++ diff_redraw(TRUE); + } + } + } +*************** +*** 102,107 **** +--- 104,110 ---- + { + curtab->tp_diffbuf[i] = NULL; + curtab->tp_diff_invalid = TRUE; ++ diff_redraw(TRUE); + } + } + } +*************** +*** 131,136 **** +--- 134,140 ---- + { + curtab->tp_diffbuf[i] = buf; + curtab->tp_diff_invalid = TRUE; ++ diff_redraw(TRUE); + return; + } + +*** ../vim-7.2.058/src/version.c Sun Nov 30 12:14:35 2008 +--- src/version.c Sun Nov 30 15:13:18 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 59, + /**/ + +-- +GUARD #2: Wait a minute -- supposing two swallows carried it together? +GUARD #1: No, they'd have to have it on a line. +GUARD #2: Well, simple! They'd just use a standard creeper! +GUARD #1: What, held under the dorsal guiding feathers? +GUARD #2: Well, why not? + The Quest for the Holy Grail (Monty Python) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.2.060 b/7.2.060 new file mode 100644 index 00000000..ec6e6b78 --- /dev/null +++ b/7.2.060 @@ -0,0 +1,1102 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.060 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.060 +Problem: When a spell files has many compound rules it may take a very long + time making the list of suggestions. Displaying also can be slow + when there are misspelled words. + Can't parse some Hunspell .aff files. +Solution: Check if a compounding can possibly work before trying a + combination, if the compound rules don't contain wildcards. + Implement using CHECKCOMPOUNDPATTERN. + Ignore COMPOUNDRULES. Ignore a comment after most items. + Accept ONLYINCOMPOUND as an alias for NEEDCOMPOUND. + Accept FORBIDDENWORD as an alias for BAD. +Files: runtime/doc/spell.txt, src/spell.c + + +*** ../vim-7.2.059/runtime/doc/spell.txt Sat Aug 9 19:36:52 2008 +--- runtime/doc/spell.txt Sun Nov 30 16:30:02 2008 +*************** +*** 1,4 **** +! *spell.txt* For Vim version 7.2. Last change: 2008 Jun 21 + + + VIM REFERENCE MANUAL by Bram Moolenaar +--- 1,4 ---- +! *spell.txt* For Vim version 7.2. Last change: 2008 Nov 30 + + + VIM REFERENCE MANUAL by Bram Moolenaar +*************** +*** 831,838 **** + + # comment line ~ + +! With some items it's also possible to put a comment after it, but this isn't +! supported in general. + + + ENCODING *spell-SET* +--- 831,841 ---- + + # comment line ~ + +! Items with a fixed number of arguments can be followed by a comment. But only +! if none of the arguments can contain white space. The comment must start with +! a "#" character. Example: +! +! KEEPCASE = # fix case for words with this flag ~ + + + ENCODING *spell-SET* +*************** +*** 965,970 **** +--- 968,976 ---- + + Note: When using utf-8 only characters up to 65000 may be used for flags. + ++ Note: even when using "num" or "long" the number of flags available to ++ compounding and prefixes is limited to about 250. ++ + + AFFIXES + *spell-PFX* *spell-SFX* +*************** +*** 1178,1183 **** +--- 1185,1193 ---- + The flag also applies to the word with affixes, thus this can be used to mark + a whole bunch of related words as bad. + ++ *spell-FORBIDDENWORD* ++ FORBIDDENWORD can be used just like BAD. For compatibility with Hunspell. ++ + *spell-NEEDAFFIX* + The NEEDAFFIX flag is used to require that a word is used with an affix. The + word itself is not a good word (unless there is an empty affix). Example: +*************** +*** 1268,1273 **** +--- 1278,1287 ---- + + NEEDCOMPOUND & ~ + ++ *spell-ONLYINCOMPOUND* ++ The ONLYINCOMPOUND does exactly the same as NEEDCOMPOUND. Supported for ++ compatiblity with Hunspell. ++ + *spell-COMPOUNDMIN* + The minimal character length of a word used for compounding is specified with + COMPOUNDMIN. Example: +*************** +*** 1328,1333 **** +--- 1342,1361 ---- + rules. Can also be used for an affix to count the affix as a compounding + word. + ++ *spell-CHECKCOMPOUNDPATTERN* ++ CHECKCOMPOUNDPATTERN is used to define patterns that, when matching at the ++ position where two words are compounded together forbids the compound. ++ For example: ++ CHECKCOMPOUNDPATTERN o e ~ ++ ++ This forbids compounding if the first word ends in "o" and the second word ++ starts with "e". ++ ++ The arguments must be plain text, no patterns are actually supported, despite ++ the item name. Case is always ignored. ++ ++ The Hunspell feature to use three arguments and flags is not supported. ++ + *spell-SYLLABLE* + The SYLLABLE item defines characters or character sequences that are used to + count the number of syllables in a word. Example: +*************** +*** 1496,1501 **** +--- 1524,1533 ---- + ACCENT (Hunspell) *spell-ACCENT* + Use MAP instead. |spell-MAP| + ++ BREAK (Hunspell) *spell-BREAK* ++ Define break points. Unclear how it works exactly. ++ Not supported. ++ + CHECKCOMPOUNDCASE (Hunspell) *spell-CHECKCOMPOUNDCASE* + Disallow uppercase letters at compound word boundaries. + Not supported. +*************** +*** 1512,1520 **** + Forbid three identical characters when compounding. Not + supported. + +- CHECKCOMPOUNDPATTERN (Hunspell) *spell-CHECKCOMPOUNDPATTERN* +- Forbid compounding when patterns match. Not supported. +- + COMPLEXPREFIXES (Hunspell) *spell-COMPLEXPREFIXES* + Enables using two prefixes. Not supported. + +--- 1544,1549 ---- +*************** +*** 1536,1548 **** + COMPOUNDMIDDLE (Hunspell) *spell-COMPOUNDMIDDLE* + Use COMPOUNDRULE instead. |spell-COMPOUNDRULE| + + COMPOUNDSYLLABLE (Hunspell) *spell-COMPOUNDSYLLABLE* + Use SYLLABLE and COMPOUNDSYLMAX instead. |spell-SYLLABLE| + |spell-COMPOUNDSYLMAX| + +! FORBIDDENWORD (Hunspell) *spell-FORBIDDENWORD* +! Use BAD instead. |spell-BAD| +! + LANG (Hunspell) *spell-LANG* + This specifies language-specific behavior. This actually + moves part of the language knowledge into the program, +--- 1565,1582 ---- + COMPOUNDMIDDLE (Hunspell) *spell-COMPOUNDMIDDLE* + Use COMPOUNDRULE instead. |spell-COMPOUNDRULE| + ++ COMPOUNDRULES (Hunspell) *spell-COMPOUNDRULES* ++ Number of COMPOUNDRULE lines following. Ignored, but the ++ argument must be a number. ++ + COMPOUNDSYLLABLE (Hunspell) *spell-COMPOUNDSYLLABLE* + Use SYLLABLE and COMPOUNDSYLMAX instead. |spell-SYLLABLE| + |spell-COMPOUNDSYLMAX| + +! KEY (Hunspell) *spell-KEY* +! Define characters that are close together on the keyboard. +! Used to give better suggestions. Not supported. +! + LANG (Hunspell) *spell-LANG* + This specifies language-specific behavior. This actually + moves part of the language knowledge into the program, +*************** +*** 1553,1562 **** + Only needed for morphological analysis. + + MAXNGRAMSUGS (Hunspell) *spell-MAXNGRAMSUGS* +! Not supported. +! +! ONLYINCOMPOUND (Hunspell) *spell-ONLYINCOMPOUND* +! Use NEEDCOMPOUND instead. |spell-NEEDCOMPOUND| + + PSEUDOROOT (Hunspell) *spell-PSEUDOROOT* + Use NEEDAFFIX instead. |spell-NEEDAFFIX| +--- 1587,1593 ---- + Only needed for morphological analysis. + + MAXNGRAMSUGS (Hunspell) *spell-MAXNGRAMSUGS* +! Set number of n-gram suggestions. Not supported. + + PSEUDOROOT (Hunspell) *spell-PSEUDOROOT* + Use NEEDAFFIX instead. |spell-NEEDAFFIX| +*** ../vim-7.2.059/src/spell.c Sat Nov 29 20:18:44 2008 +--- src/spell.c Sun Nov 30 20:59:13 2008 +*************** +*** 469,474 **** +--- 469,475 ---- + garray_T sl_comppat; /* CHECKCOMPOUNDPATTERN items */ + regprog_T *sl_compprog; /* COMPOUNDRULE turned into a regexp progrm + * (NULL when no compounding) */ ++ char_u *sl_comprules; /* all COMPOUNDRULE concatenated (or NULL) */ + char_u *sl_compstartflags; /* flags for first compound word */ + char_u *sl_compallflags; /* all flags for compound words */ + char_u sl_nobreak; /* When TRUE: no spaces between words */ +*************** +*** 839,845 **** +--- 840,849 ---- + static void slang_clear __ARGS((slang_T *lp)); + static void slang_clear_sug __ARGS((slang_T *lp)); + static void find_word __ARGS((matchinf_T *mip, int mode)); ++ static int match_checkcompoundpattern __ARGS((char_u *ptr, int wlen, garray_T *gap)); + static int can_compound __ARGS((slang_T *slang, char_u *word, char_u *flags)); ++ static int can_be_compound __ARGS((trystate_T *sp, slang_T *slang, char_u *compflags, int flag)); ++ static int match_compoundrule __ARGS((slang_T *slang, char_u *compflags)); + static int valid_word_prefix __ARGS((int totprefcnt, int arridx, int flags, char_u *word, slang_T *slang, int cond_req)); + static void find_prefix __ARGS((matchinf_T *mip, int mode)); + static int fold_more __ARGS((matchinf_T *mip)); +*************** +*** 1519,1524 **** +--- 1523,1533 ---- + ((unsigned)flags >> 24))) + continue; + ++ /* If there is a match with a CHECKCOMPOUNDPATTERN rule ++ * discard the compound word. */ ++ if (match_checkcompoundpattern(ptr, wlen, &slang->sl_comppat)) ++ continue; ++ + if (mode == FIND_COMPOUND) + { + int capflags; +*************** +*** 1577,1582 **** +--- 1586,1596 ---- + if (!can_compound(slang, fword, mip->mi_compflags)) + continue; + } ++ else if (slang->sl_comprules != NULL ++ && !match_compoundrule(slang, mip->mi_compflags)) ++ /* The compound flags collected so far do not match any ++ * COMPOUNDRULE, discard the compounded word. */ ++ continue; + } + + /* Check NEEDCOMPOUND: can't use word without compounding. */ +*************** +*** 1727,1732 **** +--- 1741,1779 ---- + } + + /* ++ * Return TRUE if there is a match between the word ptr[wlen] and ++ * CHECKCOMPOUNDPATTERN rules, assuming that we will concatenate with another ++ * word. ++ * A match means that the first part of CHECKCOMPOUNDPATTERN matches at the ++ * end of ptr[wlen] and the second part matches after it. ++ */ ++ static int ++ match_checkcompoundpattern(ptr, wlen, gap) ++ char_u *ptr; ++ int wlen; ++ garray_T *gap; /* &sl_comppat */ ++ { ++ int i; ++ char_u *p; ++ int len; ++ ++ for (i = 0; i + 1 < gap->ga_len; i += 2) ++ { ++ p = ((char_u **)gap->ga_data)[i + 1]; ++ if (STRNCMP(ptr + wlen, p, STRLEN(p)) == 0) ++ { ++ /* Second part matches at start of following compound word, now ++ * check if first part matches at end of previous word. */ ++ p = ((char_u **)gap->ga_data)[i]; ++ len = STRLEN(p); ++ if (len <= wlen && STRNCMP(ptr + wlen - len, p, len) == 0) ++ return TRUE; ++ } ++ } ++ return FALSE; ++ } ++ ++ /* + * Return TRUE if "flags" is a valid sequence of compound flags and "word" + * does not have too many syllables. + */ +*************** +*** 1773,1778 **** +--- 1820,1917 ---- + } + + /* ++ * Return TRUE when the sequence of flags in "compflags" plus "flag" can ++ * possibly form a valid compounded word. This also checks the COMPOUNDRULE ++ * lines if they don't contain wildcards. ++ */ ++ static int ++ can_be_compound(sp, slang, compflags, flag) ++ trystate_T *sp; ++ slang_T *slang; ++ char_u *compflags; ++ int flag; ++ { ++ /* If the flag doesn't appear in sl_compstartflags or sl_compallflags ++ * then it can't possibly compound. */ ++ if (!byte_in_str(sp->ts_complen == sp->ts_compsplit ++ ? slang->sl_compstartflags : slang->sl_compallflags, flag)) ++ return FALSE; ++ ++ /* If there are no wildcards, we can check if the flags collected so far ++ * possibly can form a match with COMPOUNDRULE patterns. This only ++ * makes sense when we have two or more words. */ ++ if (slang->sl_comprules != NULL && sp->ts_complen > sp->ts_compsplit) ++ { ++ int v; ++ ++ compflags[sp->ts_complen] = flag; ++ compflags[sp->ts_complen + 1] = NUL; ++ v = match_compoundrule(slang, compflags + sp->ts_compsplit); ++ compflags[sp->ts_complen] = NUL; ++ return v; ++ } ++ ++ return TRUE; ++ } ++ ++ ++ /* ++ * Return TRUE if the compound flags in compflags[] match the start of any ++ * compound rule. This is used to stop trying a compound if the flags ++ * collected so far can't possibly match any compound rule. ++ * Caller must check that slang->sl_comprules is not NULL. ++ */ ++ static int ++ match_compoundrule(slang, compflags) ++ slang_T *slang; ++ char_u *compflags; ++ { ++ char_u *p; ++ int i; ++ int c; ++ ++ /* loop over all the COMPOUNDRULE entries */ ++ for (p = slang->sl_comprules; *p != NUL; ++p) ++ { ++ /* loop over the flags in the compound word we have made, match ++ * them against the current rule entry */ ++ for (i = 0; ; ++i) ++ { ++ c = compflags[i]; ++ if (c == NUL) ++ /* found a rule that matches for the flags we have so far */ ++ return TRUE; ++ if (*p == '/' || *p == NUL) ++ break; /* end of rule, it's too short */ ++ if (*p == '[') ++ { ++ int match = FALSE; ++ ++ /* compare against all the flags in [] */ ++ ++p; ++ while (*p != ']' && *p != NUL) ++ if (*p++ == c) ++ match = TRUE; ++ if (!match) ++ break; /* none matches */ ++ } ++ else if (*p != c) ++ break; /* flag of word doesn't match flag in pattern */ ++ ++p; ++ } ++ ++ /* Skip to the next "/", where the next pattern starts. */ ++ p = vim_strchr(p, '/'); ++ if (p == NULL) ++ break; ++ } ++ ++ /* Checked all the rules and none of them match the flags, so there ++ * can't possibly be a compound starting with these flags. */ ++ return FALSE; ++ } ++ ++ /* + * Return non-zero if the prefix indicated by "arridx" matches with the prefix + * ID in "flags" for the word "word". + * The WF_RAREPFX flag is included in the return value for a rare prefix. +*************** +*** 2513,2521 **** +--- 2652,2662 ---- + lp->sl_midword = NULL; + + vim_free(lp->sl_compprog); ++ vim_free(lp->sl_comprules); + vim_free(lp->sl_compstartflags); + vim_free(lp->sl_compallflags); + lp->sl_compprog = NULL; ++ lp->sl_comprules = NULL; + lp->sl_compstartflags = NULL; + lp->sl_compallflags = NULL; + +*************** +*** 3460,3465 **** +--- 3601,3607 ---- + char_u *pp; + char_u *cp; + char_u *ap; ++ char_u *crp; + int cnt; + garray_T *gap; + +*************** +*** 3545,3550 **** +--- 3687,3698 ---- + slang->sl_compallflags = ap; + *ap = NUL; + ++ /* And a list of all patterns in their original form, for checking whether ++ * compounding may work in match_compoundrule(). This is freed when we ++ * encounter a wildcard, the check doesn't work then. */ ++ crp = alloc(todo + 1); ++ slang->sl_comprules = crp; ++ + pp = pat; + *pp++ = '^'; + *pp++ = '\\'; +*************** +*** 3587,3592 **** +--- 3735,3754 ---- + atstart = 0; + } + } ++ ++ /* Copy flag to "sl_comprules", unless we run into a wildcard. */ ++ if (crp != NULL) ++ { ++ if (c == '+' || c == '*') ++ { ++ vim_free(slang->sl_comprules); ++ slang->sl_comprules = NULL; ++ crp = NULL; ++ } ++ else ++ *crp++ = c; ++ } ++ + if (c == '/') /* slash separates two items */ + { + *pp++ = '\\'; +*************** +*** 3611,3616 **** +--- 3773,3781 ---- + *pp++ = '$'; + *pp = NUL; + ++ if (crp != NULL) ++ *crp = NUL; ++ + slang->sl_compprog = vim_regcomp(pat, RE_MAGIC + RE_STRING + RE_STRICT); + vim_free(pat); + if (slang->sl_compprog == NULL) +*************** +*** 4915,4920 **** +--- 5080,5086 ---- + } spellinfo_T; + + static afffile_T *spell_read_aff __ARGS((spellinfo_T *spin, char_u *fname)); ++ static int is_aff_rule __ARGS((char_u **items, int itemcnt, char *rulename, int mincount)); + static void aff_process_flags __ARGS((afffile_T *affile, affentry_T *entry)); + static int spell_info_item __ARGS((char_u *s)); + static unsigned affitem2flag __ARGS((int flagtype, char_u *item, char_u *fname, int lnum)); +*************** +*** 5223,5230 **** + /* Handle non-empty lines. */ + if (itemcnt > 0) + { +! if (STRCMP(items[0], "SET") == 0 && itemcnt == 2 +! && aff->af_enc == NULL) + { + #ifdef FEAT_MBYTE + /* Setup for conversion from "ENC" to 'encoding'. */ +--- 5389,5395 ---- + /* Handle non-empty lines. */ + if (itemcnt > 0) + { +! if (is_aff_rule(items, itemcnt, "SET", 2) && aff->af_enc == NULL) + { + #ifdef FEAT_MBYTE + /* Setup for conversion from "ENC" to 'encoding'. */ +*************** +*** 5239,5245 **** + smsg((char_u *)_("Conversion in %s not supported"), fname); + #endif + } +! else if (STRCMP(items[0], "FLAG") == 0 && itemcnt == 2 + && aff->af_flagtype == AFT_CHAR) + { + if (STRCMP(items[1], "long") == 0) +--- 5404,5410 ---- + smsg((char_u *)_("Conversion in %s not supported"), fname); + #endif + } +! else if (is_aff_rule(items, itemcnt, "FLAG", 2) + && aff->af_flagtype == AFT_CHAR) + { + if (STRCMP(items[1], "long") == 0) +*************** +*** 5284,5352 **** + spin->si_info = p; + } + } +! else if (STRCMP(items[0], "MIDWORD") == 0 && itemcnt == 2 + && midword == NULL) + { + midword = getroom_save(spin, items[1]); + } +! else if (STRCMP(items[0], "TRY") == 0 && itemcnt == 2) + { + /* ignored, we look in the tree for what chars may appear */ + } + /* TODO: remove "RAR" later */ +! else if ((STRCMP(items[0], "RAR") == 0 +! || STRCMP(items[0], "RARE") == 0) && itemcnt == 2 +! && aff->af_rare == 0) + { + aff->af_rare = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } + /* TODO: remove "KEP" later */ +! else if ((STRCMP(items[0], "KEP") == 0 +! || STRCMP(items[0], "KEEPCASE") == 0) && itemcnt == 2 + && aff->af_keepcase == 0) + { + aff->af_keepcase = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (STRCMP(items[0], "BAD") == 0 && itemcnt == 2 +! && aff->af_bad == 0) + { + aff->af_bad = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (STRCMP(items[0], "NEEDAFFIX") == 0 && itemcnt == 2 + && aff->af_needaffix == 0) + { + aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (STRCMP(items[0], "CIRCUMFIX") == 0 && itemcnt == 2 + && aff->af_circumfix == 0) + { + aff->af_circumfix = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (STRCMP(items[0], "NOSUGGEST") == 0 && itemcnt == 2 + && aff->af_nosuggest == 0) + { + aff->af_nosuggest = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (STRCMP(items[0], "NEEDCOMPOUND") == 0 && itemcnt == 2 + && aff->af_needcomp == 0) + { + aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (STRCMP(items[0], "COMPOUNDROOT") == 0 && itemcnt == 2 + && aff->af_comproot == 0) + { + aff->af_comproot = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (STRCMP(items[0], "COMPOUNDFORBIDFLAG") == 0 +! && itemcnt == 2 && aff->af_compforbid == 0) + { + aff->af_compforbid = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); +--- 5449,5519 ---- + spin->si_info = p; + } + } +! else if (is_aff_rule(items, itemcnt, "MIDWORD", 2) + && midword == NULL) + { + midword = getroom_save(spin, items[1]); + } +! else if (is_aff_rule(items, itemcnt, "TRY", 2)) + { + /* ignored, we look in the tree for what chars may appear */ + } + /* TODO: remove "RAR" later */ +! else if ((is_aff_rule(items, itemcnt, "RAR", 2) +! || is_aff_rule(items, itemcnt, "RARE", 2)) +! && aff->af_rare == 0) + { + aff->af_rare = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } + /* TODO: remove "KEP" later */ +! else if ((is_aff_rule(items, itemcnt, "KEP", 2) +! || is_aff_rule(items, itemcnt, "KEEPCASE", 2)) + && aff->af_keepcase == 0) + { + aff->af_keepcase = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if ((is_aff_rule(items, itemcnt, "BAD", 2) +! || is_aff_rule(items, itemcnt, "FORBIDDENWORD", 2)) +! && aff->af_bad == 0) + { + aff->af_bad = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (is_aff_rule(items, itemcnt, "NEEDAFFIX", 2) + && aff->af_needaffix == 0) + { + aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (is_aff_rule(items, itemcnt, "CIRCUMFIX", 2) + && aff->af_circumfix == 0) + { + aff->af_circumfix = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (is_aff_rule(items, itemcnt, "NOSUGGEST", 2) + && aff->af_nosuggest == 0) + { + aff->af_nosuggest = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if ((is_aff_rule(items, itemcnt, "NEEDCOMPOUND", 2) +! || is_aff_rule(items, itemcnt, "ONLYINCOMPOUND", 2)) + && aff->af_needcomp == 0) + { + aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (is_aff_rule(items, itemcnt, "COMPOUNDROOT", 2) + && aff->af_comproot == 0) + { + aff->af_comproot = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); + } +! else if (is_aff_rule(items, itemcnt, "COMPOUNDFORBIDFLAG", 2) +! && aff->af_compforbid == 0) + { + aff->af_compforbid = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); +*************** +*** 5354,5361 **** + smsg((char_u *)_("Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line %d"), + fname, lnum); + } +! else if (STRCMP(items[0], "COMPOUNDPERMITFLAG") == 0 +! && itemcnt == 2 && aff->af_comppermit == 0) + { + aff->af_comppermit = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); +--- 5521,5528 ---- + smsg((char_u *)_("Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line %d"), + fname, lnum); + } +! else if (is_aff_rule(items, itemcnt, "COMPOUNDPERMITFLAG", 2) +! && aff->af_comppermit == 0) + { + aff->af_comppermit = affitem2flag(aff->af_flagtype, items[1], + fname, lnum); +*************** +*** 5363,5369 **** + smsg((char_u *)_("Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line %d"), + fname, lnum); + } +! else if (STRCMP(items[0], "COMPOUNDFLAG") == 0 && itemcnt == 2 + && compflags == NULL) + { + /* Turn flag "c" into COMPOUNDRULE compatible string "c+", +--- 5530,5536 ---- + smsg((char_u *)_("Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line %d"), + fname, lnum); + } +! else if (is_aff_rule(items, itemcnt, "COMPOUNDFLAG", 2) + && compflags == NULL) + { + /* Turn flag "c" into COMPOUNDRULE compatible string "c+", +*************** +*** 5376,5382 **** + compflags = p; + } + } +! else if (STRCMP(items[0], "COMPOUNDRULE") == 0 && itemcnt == 2) + { + /* Concatenate this string to previously defined ones, using a + * slash to separate them. */ +--- 5543,5557 ---- + compflags = p; + } + } +! else if (is_aff_rule(items, itemcnt, "COMPOUNDRULES", 2)) +! { +! /* We don't use the count, but do check that it's a number and +! * not COMPOUNDRULE mistyped. */ +! if (atoi((char *)items[1]) == 0) +! smsg((char_u *)_("Wrong COMPOUNDRULES value in %s line %d: %s"), +! fname, lnum, items[1]); +! } +! else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2)) + { + /* Concatenate this string to previously defined ones, using a + * slash to separate them. */ +*************** +*** 5395,5401 **** + compflags = p; + } + } +! else if (STRCMP(items[0], "COMPOUNDWORDMAX") == 0 && itemcnt == 2 + && compmax == 0) + { + compmax = atoi((char *)items[1]); +--- 5570,5576 ---- + compflags = p; + } + } +! else if (is_aff_rule(items, itemcnt, "COMPOUNDWORDMAX", 2) + && compmax == 0) + { + compmax = atoi((char *)items[1]); +*************** +*** 5403,5409 **** + smsg((char_u *)_("Wrong COMPOUNDWORDMAX value in %s line %d: %s"), + fname, lnum, items[1]); + } +! else if (STRCMP(items[0], "COMPOUNDMIN") == 0 && itemcnt == 2 + && compminlen == 0) + { + compminlen = atoi((char *)items[1]); +--- 5578,5584 ---- + smsg((char_u *)_("Wrong COMPOUNDWORDMAX value in %s line %d: %s"), + fname, lnum, items[1]); + } +! else if (is_aff_rule(items, itemcnt, "COMPOUNDMIN", 2) + && compminlen == 0) + { + compminlen = atoi((char *)items[1]); +*************** +*** 5411,5417 **** + smsg((char_u *)_("Wrong COMPOUNDMIN value in %s line %d: %s"), + fname, lnum, items[1]); + } +! else if (STRCMP(items[0], "COMPOUNDSYLMAX") == 0 && itemcnt == 2 + && compsylmax == 0) + { + compsylmax = atoi((char *)items[1]); +--- 5586,5592 ---- + smsg((char_u *)_("Wrong COMPOUNDMIN value in %s line %d: %s"), + fname, lnum, items[1]); + } +! else if (is_aff_rule(items, itemcnt, "COMPOUNDSYLMAX", 2) + && compsylmax == 0) + { + compsylmax = atoi((char *)items[1]); +*************** +*** 5419,5450 **** + smsg((char_u *)_("Wrong COMPOUNDSYLMAX value in %s line %d: %s"), + fname, lnum, items[1]); + } +! else if (STRCMP(items[0], "CHECKCOMPOUNDDUP") == 0 && itemcnt == 1) + { + compoptions |= COMP_CHECKDUP; + } +! else if (STRCMP(items[0], "CHECKCOMPOUNDREP") == 0 && itemcnt == 1) + { + compoptions |= COMP_CHECKREP; + } +! else if (STRCMP(items[0], "CHECKCOMPOUNDCASE") == 0 && itemcnt == 1) + { + compoptions |= COMP_CHECKCASE; + } +! else if (STRCMP(items[0], "CHECKCOMPOUNDTRIPLE") == 0 +! && itemcnt == 1) + { + compoptions |= COMP_CHECKTRIPLE; + } +! else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0 +! && itemcnt == 2) + { + if (atoi((char *)items[1]) == 0) + smsg((char_u *)_("Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"), + fname, lnum, items[1]); + } +! else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0 +! && itemcnt == 3) + { + garray_T *gap = &spin->si_comppat; + int i; +--- 5594,5622 ---- + smsg((char_u *)_("Wrong COMPOUNDSYLMAX value in %s line %d: %s"), + fname, lnum, items[1]); + } +! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDDUP", 1)) + { + compoptions |= COMP_CHECKDUP; + } +! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDREP", 1)) + { + compoptions |= COMP_CHECKREP; + } +! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDCASE", 1)) + { + compoptions |= COMP_CHECKCASE; + } +! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDTRIPLE", 1)) + { + compoptions |= COMP_CHECKTRIPLE; + } +! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 2)) + { + if (atoi((char *)items[1]) == 0) + smsg((char_u *)_("Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"), + fname, lnum, items[1]); + } +! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 3)) + { + garray_T *gap = &spin->si_comppat; + int i; +*************** +*** 5463,5486 **** + = getroom_save(spin, items[2]); + } + } +! else if (STRCMP(items[0], "SYLLABLE") == 0 && itemcnt == 2 + && syllable == NULL) + { + syllable = getroom_save(spin, items[1]); + } +! else if (STRCMP(items[0], "NOBREAK") == 0 && itemcnt == 1) + { + spin->si_nobreak = TRUE; + } +! else if (STRCMP(items[0], "NOSPLITSUGS") == 0 && itemcnt == 1) + { + spin->si_nosplitsugs = TRUE; + } +! else if (STRCMP(items[0], "NOSUGFILE") == 0 && itemcnt == 1) + { + spin->si_nosugfile = TRUE; + } +! else if (STRCMP(items[0], "PFXPOSTPONE") == 0 && itemcnt == 1) + { + aff->af_pfxpostpone = TRUE; + } +--- 5635,5658 ---- + = getroom_save(spin, items[2]); + } + } +! else if (is_aff_rule(items, itemcnt, "SYLLABLE", 2) + && syllable == NULL) + { + syllable = getroom_save(spin, items[1]); + } +! else if (is_aff_rule(items, itemcnt, "NOBREAK", 1)) + { + spin->si_nobreak = TRUE; + } +! else if (is_aff_rule(items, itemcnt, "NOSPLITSUGS", 1)) + { + spin->si_nosplitsugs = TRUE; + } +! else if (is_aff_rule(items, itemcnt, "NOSUGFILE", 1)) + { + spin->si_nosugfile = TRUE; + } +! else if (is_aff_rule(items, itemcnt, "PFXPOSTPONE", 1)) + { + aff->af_pfxpostpone = TRUE; + } +*************** +*** 5771,5794 **** + } + } + } +! else if (STRCMP(items[0], "FOL") == 0 && itemcnt == 2 +! && fol == NULL) + { + fol = vim_strsave(items[1]); + } +! else if (STRCMP(items[0], "LOW") == 0 && itemcnt == 2 +! && low == NULL) + { + low = vim_strsave(items[1]); + } +! else if (STRCMP(items[0], "UPP") == 0 && itemcnt == 2 +! && upp == NULL) + { + upp = vim_strsave(items[1]); + } +! else if ((STRCMP(items[0], "REP") == 0 +! || STRCMP(items[0], "REPSAL") == 0) +! && itemcnt == 2) + { + /* Ignore REP/REPSAL count */; + if (!isdigit(*items[1])) +--- 5943,5962 ---- + } + } + } +! else if (is_aff_rule(items, itemcnt, "FOL", 2) && fol == NULL) + { + fol = vim_strsave(items[1]); + } +! else if (is_aff_rule(items, itemcnt, "LOW", 2) && low == NULL) + { + low = vim_strsave(items[1]); + } +! else if (is_aff_rule(items, itemcnt, "UPP", 2) && upp == NULL) + { + upp = vim_strsave(items[1]); + } +! else if (is_aff_rule(items, itemcnt, "REP", 2) +! || is_aff_rule(items, itemcnt, "REPSAL", 2)) + { + /* Ignore REP/REPSAL count */; + if (!isdigit(*items[1])) +*************** +*** 5819,5825 **** + : &spin->si_rep, items[1], items[2]); + } + } +! else if (STRCMP(items[0], "MAP") == 0 && itemcnt == 2) + { + /* MAP item or count */ + if (!found_map) +--- 5987,5993 ---- + : &spin->si_rep, items[1], items[2]); + } + } +! else if (is_aff_rule(items, itemcnt, "MAP", 2)) + { + /* MAP item or count */ + if (!found_map) +*************** +*** 5856,5864 **** + ga_append(&spin->si_map, '/'); + } + } +! /* Accept "SAL from to" and "SAL from to # comment". */ +! else if (STRCMP(items[0], "SAL") == 0 +! && (itemcnt == 3 || (itemcnt > 3 && items[3][0] == '#'))) + { + if (do_sal) + { +--- 6024,6031 ---- + ga_append(&spin->si_map, '/'); + } + } +! /* Accept "SAL from to" and "SAL from to #comment". */ +! else if (is_aff_rule(items, itemcnt, "SAL", 3)) + { + if (do_sal) + { +*************** +*** 5877,5888 **** + : items[2]); + } + } +! else if (STRCMP(items[0], "SOFOFROM") == 0 && itemcnt == 2 + && sofofrom == NULL) + { + sofofrom = getroom_save(spin, items[1]); + } +! else if (STRCMP(items[0], "SOFOTO") == 0 && itemcnt == 2 + && sofoto == NULL) + { + sofoto = getroom_save(spin, items[1]); +--- 6044,6055 ---- + : items[2]); + } + } +! else if (is_aff_rule(items, itemcnt, "SOFOFROM", 2) + && sofofrom == NULL) + { + sofofrom = getroom_save(spin, items[1]); + } +! else if (is_aff_rule(items, itemcnt, "SOFOTO", 2) + && sofoto == NULL) + { + sofoto = getroom_save(spin, items[1]); +*************** +*** 6017,6022 **** +--- 6184,6205 ---- + } + + /* ++ * Return TRUE when items[0] equals "rulename", there are "mincount" items or ++ * a comment is following after item "mincount". ++ */ ++ static int ++ is_aff_rule(items, itemcnt, rulename, mincount) ++ char_u **items; ++ int itemcnt; ++ char *rulename; ++ int mincount; ++ { ++ return (STRCMP(items[0], rulename) == 0 ++ && (itemcnt == mincount ++ || (itemcnt > mincount && items[mincount][0] == '#'))); ++ } ++ ++ /* + * For affix "entry" move COMPOUNDFORBIDFLAG and COMPOUNDPERMITFLAG from + * ae_flags to ae_comppermit and ae_compforbid. + */ +*************** +*** 11492,11506 **** + vim_strncpy(preword + sp->ts_prewordlen, + tword + sp->ts_splitoff, + sp->ts_twordlen - sp->ts_splitoff); +! p = preword; +! while (*skiptowhite(p) != NUL) +! p = skipwhite(skiptowhite(p)); +! if (fword_ends && !can_compound(slang, p, +! compflags + sp->ts_compsplit)) +! /* Compound is not allowed. But it may still be +! * possible if we add another (short) word. */ + compound_ok = FALSE; + + /* Get pointer to last char of previous word. */ + p = preword + sp->ts_prewordlen; + mb_ptr_back(preword, p); +--- 11675,11698 ---- + vim_strncpy(preword + sp->ts_prewordlen, + tword + sp->ts_splitoff, + sp->ts_twordlen - sp->ts_splitoff); +! +! /* Verify CHECKCOMPOUNDPATTERN rules. */ +! if (match_checkcompoundpattern(preword, sp->ts_prewordlen, +! &slang->sl_comppat)) + compound_ok = FALSE; + ++ if (compound_ok) ++ { ++ p = preword; ++ while (*skiptowhite(p) != NUL) ++ p = skipwhite(skiptowhite(p)); ++ if (fword_ends && !can_compound(slang, p, ++ compflags + sp->ts_compsplit)) ++ /* Compound is not allowed. But it may still be ++ * possible if we add another (short) word. */ ++ compound_ok = FALSE; ++ } ++ + /* Get pointer to last char of previous word. */ + p = preword + sp->ts_prewordlen; + mb_ptr_back(preword, p); +*************** +*** 11697,11706 **** + && (slang->sl_compsylmax < MAXWLEN + || sp->ts_complen + 1 - sp->ts_compsplit + < slang->sl_compmax) +! && (byte_in_str(sp->ts_complen == sp->ts_compsplit +! ? slang->sl_compstartflags +! : slang->sl_compallflags, +! ((unsigned)flags >> 24)))) + { + try_compound = TRUE; + compflags[sp->ts_complen] = ((unsigned)flags >> 24); +--- 11889,11897 ---- + && (slang->sl_compsylmax < MAXWLEN + || sp->ts_complen + 1 - sp->ts_compsplit + < slang->sl_compmax) +! && (can_be_compound(sp, slang, +! compflags, ((unsigned)flags >> 24)))) +! + { + try_compound = TRUE; + compflags[sp->ts_complen] = ((unsigned)flags >> 24); +*** ../vim-7.2.059/src/version.c Sun Nov 30 15:15:56 2008 +--- src/version.c Sun Nov 30 21:09:23 2008 +*************** +*** 678,679 **** +--- 678,681 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 60, + /**/ + +-- +DEAD PERSON: I'm getting better! +CUSTOMER: No, you're not -- you'll be stone dead in a moment. +MORTICIAN: Oh, I can't take him like that -- it's against regulations. + The Quest for the Holy Grail (Monty Python) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/README.patches b/README.patches index 98a14bc6..2a8aff20 100644 --- a/README.patches +++ b/README.patches @@ -1,4 +1,4 @@ -Patches for Vim - Vi IMproved 7.1 +Patches for Vim - Vi IMproved 7.2 The files in this directory contain source code changes to fix problems in released versions of Vim. Each file also contains an @@ -14,314 +14,74 @@ Before patching, change to the top Vim directory, where the "src" and "runtime" directories are located. Depending on the version of "patch" that you use, you may have add an argument to make it patch the right file: - patch -p < 7.1.001 - patch -p0 < 7.1.001 + patch -p < 7.2.001 + patch -p0 < 7.2.001 After applying a patch, you need to compile Vim. There are no patches for binaries. Checksums for the patch files can be found in the file MD5. -Collection of patches for Vim 7.1: - SIZE NAME INCLUDES - 91424 7.1.001-100.gz patches 7.1.001 to 7.1.100, gzip'ed - 75402 7.1.101-200.gz patches 7.1.101 to 7.1.200, gzip'ed - - -Individual patches for Vim 7.1: +Individual patches for Vim 7.2: SIZE NAME FIXES - 2404 7.1.001 can't build with Gnome GUI - 2011 7.1.002 Oracle Pro*C/C++ files are not detected - 1529 7.1.003 (extra) Win32: menu entries end up in message history - 2481 7.1.004 crash when editing a directory - 3841 7.1.005 "cit" used on deletes - 2941 7.1.006 when reading from stdin 'modified' can't be reset in autocmd - 6458 7.1.007 (extra) Mac: context menu does not work, scrollbars not dimmed - 2631 7.1.008 getfsize() returns an invalid number for very big files - 1881 7.1.009 diff mode: tab to spaces change not highlighted correctly - 2796 7.1.010 Gnome: tab pages are not included in the saved session - 1934 7.1.011 buffer overflow when $VIMRUNTIME is very long - 1904 7.1.012 ":let &tw = 'asdf'" does not give an error message - 2139 7.1.013 ":syn include" only loads the first file - 1479 7.1.014 crash in C-indenting - 3743 7.1.015 MzScheme interface doesn't build on Mac; init problem - 2368 7.1.016 (after 7.1.012) error message when using ":cwindow" - 6729 7.1.017 ":confirm w" does not give a prompt when file is read-only - 1771 7.1.018 "p" at end of line doesn't work right when 've' is set - 1650 7.1.019 ":python" doesn't mention the command is not implemented - 3229 7.1.020 reading uninitialized memory when using a dialog - 2875 7.1.021 (after 7.1.015) MzScheme interface doesn't build on Win32 - 1842 7.1.022 when setting 'keymap' twice b:keymap_name variable isn't set - 1718 7.1.023 "dw" in a line with one character deletes the line - 1335 7.1.024 using a pointer that may have become invalid - 2292 7.1.025 search('pat', 'bc) doesn't find word under cursor at BOL - 1710 7.1.026 "[p" doesn't work in Visual mode - 3345 7.1.027 on Sun OS reading from a process substitutions doesn't work - 2239 7.1.028 ":sort" does nothing special with empty search pattern - 2692 7.1.029 (after 7.1.019) can't compile when all interfaces are used - 2364 7.1.030 vimtutor shell script checks for "vim6" but not for "vim7" - 6533 7.1.031 virtcol([123, '$']) doesn't work - 3006 7.1.032 possible crash when doing completion on the command line - 1530 7.1.033 buffer marked modified after ":bdel" and ":next" - 2956 7.1.034 Win64: compiler warnings for typecast, optimizer problem - 1797 7.1.035 after ":s/./&/#" all listed lines have a line number - 12171 7.1.036 add "none" to completion of ":echohl" and ":match" - 1817 7.1.037 using strcpy() for an overlapping string - 5704 7.1.038 'preseveindent' doesn't always work when 'et' is set - 1750 7.1.039 weird help-tags tag in docs file may make cause a crash - 53412 7.1.040 ":match" only supports three matches - 4614 7.1.041 (extra, after 7.1.040) update test makefiles for new test - 2366 7.1.042 (after 7.1.040) internal error when using matchadd() - 2820 7.1.043 in Ex mode using CTRL-D twice may cause a crash - 1632 7.1.044 in Insert mode 0 CTRL-T deletes all indent - 3101 7.1.045 double screen redraw in some situations - 1637 7.1.046 ":s/.*/&/" deletes composing characters - 1552 7.1.047 wrong argument for vim_regcomp() - 5010 7.1.048 paren highlighting is not updated after scrolling - 1722 7.1.049 can't compile with GTK2 when using hangul input feature - 4800 7.1.050 possible crash in C++ indenting - 2295 7.1.051 accessing uninitialized memory when finding spell suggestions - 2435 7.1.052 when creating a new match not all fields are initialized - 1473 7.1.053 reading uninitialized memory when updating command line - 4451 7.1.054 accessing uninitialized memory when displaying the fold column - 5414 7.1.055 using strcpy() with arguments that overlap - 3151 7.1.056 scrolling back at more prompt doesn't work properly - 2514 7.1.057 CursorHold causes problems for Normal and Visual mode commands - 10612 7.1.058 completion menu doesn't work properly when 'righleft' is set - 3350 7.1.059 in Ex mode "g/^/vi" and pressing CTRL-C: Vim hangs and beeps - 5066 7.1.060 splitting quickfix window messes up window layout - 6320 7.1.061 with latin1 'ignorecase' doesn't work for umlauts - 1550 7.1.062 (after 7.0.038) C comment indent can be wrong - 1391 7.1.063 compiler warning for uninitialized variable - 1405 7.1.064 on interix some files appear not to exist - 2983 7.1.065 Win32: MingW Compilation problem for newer version of w32api - 4553 7.1.066 when 'bomb' is changed the file should be considered modified - 7701 7.1.067 'infercase' doesn't work for thesaurus completion - 6709 7.1.068 'equalalways' equalizes windows too often - 2757 7.1.069 GTK GUI: confirm() dialog has a default button when not wanted - 1560 7.1.070 (extra) Win32 GUI: same confirm() default button problem - 5534 7.1.071 (after 7.1.040) add a basic test for regexp patterns - 5705 7.1.072 (extra, after 7.1.041 and 7.1.071) extra part of 7.1.071 - 3595 7.1.073 (after 7.1.062) crash when 'preserveindent' is set - 5259 7.1.074 crash when using string() on a recursively nested List - 1686 7.1.075 ":let v:statusmsg" reads memory already freed - 2376 7.1.076 a couple more strcpy() with overlapping arguments - 1551 7.1.077 "can_spell" is used without initializing it - 2678 7.1.078 dropping file name on gvim containing CSI byte doesn't work - 2922 7.1.079 "@" character in 'isfname' doesn't pick up umlauts for latin1 - 2960 7.1.080 (extra) Compiler warnings for gvimex.cpp - 3253 7.1.081 completion doesn't work after ":!cat ") may return < 0 for a Linewise selection - 1515 7.1.133 shorten_fname1() linked when it's not needed - 10379 7.1.134 (extra) Win32: Can't build with VC8 - 3337 7.1.135 Win32: ":e c:/tmp/foo" and ":e c:/tmp//foo" create two buffers - 1522 7.1.136 memory leak when using Ruby syntax highlighting - 1553 7.1.137 build failure when using EXITFREE - 1836 7.1.138 Perl: Msg() doesn't stop when "q" is typed at the more prompt - 1557 7.1.139 fold truncated when ending Insert mode with CTRL-C - 1664 7.1.140 v:count can't be used in an expression mapping - 2806 7.1.141 GTK: can't use negative offset with -geom argument - 2161 7.1.142 ":redir @A>" doesn't work - 1723 7.1.143 uninitialized memory read when diffing three files - 1250 7.1.144 after ":diffup" cursor can be in the wrong position - 6160 7.1.145 stay in Insert completion mode depending on the char typed - 2838 7.1.146 VMS: writing fails for rare record organisation - 2079 7.1.147 (after 7.1.127) freeing memory twice completing user name - 2557 7.1.148 QNX and some other systems require testing for sys/types.h - 4823 7.1.149 completion menu messed up when using the scroll bar - 1759 7.1.150 Visual mode "p" doesn't work when 'clipboard' has "unnamed" - 2108 7.1.151 lalloc(0) error for line completion with 'ic' and 'inf' set - 3183 7.1.152 display problem when 'hls' and 'cursorcolumn' are set - 4610 7.1.153 compiler warnings on SGI - 1547 7.1.154 (after 7.1.152) compiler warning for signed/unsigned compare - 1594 7.1.155 crash when 'undolevels' is 0 and repeating "udd" - 4174 7.1.156 overlapping arguments for strcpy() during cmdline completion - 1541 7.1.157 :" in Ex mode at end of file results in an error message - 4629 7.1.158 (extra) Win32: with utf-8 and cp1250 Alt-y is the wrong char - 1646 7.1.159 overlapping arguments for a strcpy() - 1661 7.1.160 getting/losing focus may cause hit-enter prompt to be redrawn - 4347 7.1.161 compilation errors with tiny features and EXITFREE - 4691 7.1.162 crash when using a modifier before "while" or "for" - 2367 7.1.163 warning for the unknown option 'bufsecret' - 1576 7.1.164 reading past end of regexp pattern - 5538 7.1.165 crash related to getting X window ID - 2134 7.1.166 memory leak when using "gp" in Visual mode - 2528 7.1.167 xxd crashes when using "xxd -b -c 110" - 2989 7.1.168 (extra) Win32 GUI: when no focus click doesn't position cursor - 1926 7.1.169 using uninitialized memory when system() fails - 1722 7.1.170 overlapping arguments to strcpy() - 2324 7.1.171 reading one byte before allocated memory. - 1536 7.1.172 if 'buftype' is "acwrite" Vim still does overwrite check - 1928 7.1.173 accessing freed memory when using "\%^" pattern - 2197 7.1.174 writing NUL past end of a buffer - 4722 7.1.175 doesn't work with some combination of option settings - 2943 7.1.176 compiling with Aap fails if "compiledby" contains '<' or '>' - 5450 7.1.177 freeing memory twice when in debug mode while reading a script - 1567 7.1.178 "%" doesn't work on "/* comment *//* comment */" - 6581 7.1.179 configure doesn't find TCL 8.5 - 7099 7.1.180 regexp patterns are not sufficiently tested - 1878 7.1.181 accessing uninitialized memory in Farsi mode with ":s" - 5457 7.1.182 with tab pages and an argument list session file may be wrong - 2489 7.1.183 Internal error for ":echo matchstr('a', 'a\%[\&]')" - 2132 7.1.184 crash when deleting backwards over a line break in Insert mode - 3744 7.1.185 "gR" and then BS doesn't work properly with multi-byte chars - 3294 7.1.186 "expand('')" returns a bogus value after ":cd dir" - 2341 7.1.187 Win32 GUI: custom completion using system() doesn't work - 1688 7.1.188 "W10" message could be displayed in the second column - 1950 7.1.189 (after 7.1.104) need to call plain_vgetc() in ask_yesno() - 1685 7.1.190 cursor after end-of-line: "iA sentence.)" - 2007 7.1.191 Win32 GUI: when not in focus click in scrollbar doesn't work - 2605 7.1.192 CTRL-C doesn't stop duplicating text for "s" in Visual block - 2962 7.1.193 some of the Vim 5.x digraphs could be supported - 1650 7.1.194 Unix: ":echo glob('~/{}')" results in "/home/user//" - 2273 7.1.195 '0 mark doesn't work for "~/foo ~ foo" - 2642 7.1.196 (extra) Win32 GUI: "\n" in a tooltip doesn't cause line break - 2308 7.1.197 Mac: "make install" doesn't work when $prefix is set - 1460 7.1.198 hang when using ":s/\n//gn" - 3572 7.1.199 can't do command line completion for a file name extension - 2310 7.1.200 (after 7.1.177 and 7.1.182) compiler warnings - 2705 7.1.201 when reading stdin 'fenc' and 'ff' are not set - 2383 7.1.202 incomplete utf-8 byte sequence is not checked for validity - 2261 7.1.203 if 'virtualedit' is "onemore" then ":normal 99|" is not right - 2891 7.1.204 (extra) Win32: 'balloonexpr' tooltip disappears after 4 sec - 5481 7.1.205 can't get the operator in an ":omap" - 1690 7.1.206 compiler warnings when using MODIFIED_BY - 7708 7.1.207 netbeans: "remove" cannot delete one line - 2051 7.1.208 on Alpha get an unaligned access error - 2249 7.1.209 GTK GUI: when using the netrw plugin ":gui" causes a hang - 1923 7.1.210 listing mapping for 0xdb fails when 'encoding' is utf-8 - 25525 7.1.211 matchparen plugin may take so long it looks like Vim hangs - 1491 7.1.212 accessing a byte before a line - 1750 7.1.213 aborting ":tabedit" from the ATTENTION dialog leaves tab open - 8399 7.1.214 ":1s/g\n\zs1//" deletes characters from the first line - 6476 7.1.215 it's difficult to figure out the nesting of syntax items - 2360 7.1.216 variants of --remote-tab are not mentioned for "vim --help" - 7103 7.1.217 the "help-tags" tag may be missing from runtime/doc/tags - 1864 7.1.218 syntax region without "keepend" could be truncated - 12134 7.1.219 (after 7.1.215) synstack() doesn't work for one char region - 3928 7.1.220 cursor may end up on trail byte after ")" - 1978 7.1.221 when inserting a "(" the following highlighting may be wrong - 3531 7.1.222 (after 7.1.217) wildcards of ":helptags" are not expanded - 8138 7.1.223 glob() doesn't handle "'" when 'shell' is "sh" or "bash" - 2131 7.1.224 "vim -F -o one two" sets 'rightleft' in one window only - 1767 7.1.225 using unitialized value when XGetWMNormalHints() fails - 1957 7.1.226 command line completion fails for a file name with a '&' char - 5595 7.1.227 hang in syntax HL when moving over a ")" - 1678 7.1.228 with 'foldmethod' "indent" fold can't be closed after "3>>" - 1758 7.1.229 a fold is closed when backspacing in Insert mode - 2052 7.1.230 memory leak when executing SourceCmd autocommands - 8648 7.1.231 when shifting lines the change is acted upon multiple times - 2002 7.1.232 (after 7.1.207 and 7.1.211) compiler warnings with MSVC - 3249 7.1.233 crash with Insert mode completion for a user defined command - 6865 7.1.234 display problems when diff'ing three files - 5925 7.1.235 pattern matching is slow when using a lot of simple patterns - 28992 7.1.236 hang when using complicated pattern and 'hlsearch' or ":match" - 1704 7.1.237 compiler warning on an Alpha processor in Motif code - 1801 7.1.238 searchpair() may fail when using 'c' or 'r' flag - 1639 7.1.239 (after 7.1.233) compiler warning for sprintf() argument - 5157 7.1.240 "gUe" may stop before the end of the word - 3093 7.1.241 focus change events not always ignored - 2262 7.1.242 "cib" doesn't work properly on "(x)" - 4475 7.1.243 (after 7.1.240) "U" doesn't work on all text in Visual mode - 1847 7.1.244 GUI may have part of the command line cut off - 2767 7.1.245 pressing CTRL-\ three times causes Vim to quit - 2739 7.1.246 configure hangs when the man pager is something strange - 6028 7.1.247 Netbeans: backspacing in Insert mode may skip a character - 3691 7.1.248 can't set the '" mark; can't know if setpos() was successful - 2144 7.1.249 after "U" the cursor can be past end of line - 1684 7.1.250 error for ":setglobal fenc=anything" when 'modifiable' is off - 3134 7.1.251 accessing freed memory when spell checking enabled - 1399 7.1.252 (after 7.1.243) test 39 fails when locale uses utf-8 encoding - 1751 7.1.253 ":sort" doesn't work in a one line file - 1894 7.1.254 Tests 49 and 55 fail when the locale is French - 1514 7.1.255 Vim doesn't support utf-32 - 50921 7.1.256 findfile() also returns directories - 3326 7.1.257 configure can't always find the Tcl header files - 3360 7.1.258 crash when doing "d/\n/e" and 'virtualedit' is "all" - 1944 7.1.259 cursor in wrong place with 'rl', "utf-8" and illegal byte - 1805 7.1.260 cursor position wrong after ^@ wrapping halfway if using utf-8 - 2255 7.1.261 for a 2 byte BOM UCS-2 is used, which doesn't work for UTF-16 - 3438 7.1.262 can't get the process ID of Vim - 2442 7.1.263 filetype with dot doesn't work for indent plugins - 6295 7.1.264 crash when C-indenting - 1310 7.1.265 hang when completing file name and space in 'isfname' - 2510 7.1.266 version string returned by terminal may be used as typed input - 1957 7.1.267 when changing folds cursor may be positioned in a wrong place - 1576 7.1.268 always shows "+" at end of screen line with 'cursurline' - 6183 7.1.269 matchparen plugin has an arbitrary line number limit - 2861 7.1.270 ":?foo?" matches in current line since patch 7.1.025 - 1582 7.1.271 in tiny version ":!touch %" causes curbuf to be wrong - 2334 7.1.272 buffer name [Location List] not used for buffer in other tab - 2504 7.1.273 when profiling on Linux Vim exits early - 1549 7.1.274 (after 7.1.272) compiler warning with optimized build - 40835 7.1.275 (extra) Mac: ATSUI and 'antialias' don't work together - 4946 7.1.276 "gw" uses 'formatexpr', even though the docs say it doesn't - 2802 7.1.277 default for 'paragraphs' misses some items - 1989 7.1.278 (extra, after 7.1.275) build problem - 3848 7.1.279 when using cscope temporary files are left behind - 1556 7.1.280 (after 7.1.275) Mac: build problems without multibyte feature - 2094 7.1.281 (after 7.1.279) Vim hangs when cscope doesn't exit - 16302 7.1.282 (extra) Win64: Installing context menu, compiler warnings - 7633 7.1.283 non-extra part of 7.1.282 - 2258 7.1.284 compiler warnings for functions without prototype - 5787 7.1.285 (extra) Mac: dialog hotkeys don't work - 2045 7.1.286 (after 7.1.103) "w" at end of buffer moves cursor too far - 1859 7.1.287 crash when reversing a list after using it - 3182 7.1.288 (after 7.1.281) cscope leaves behind temp files with gvim - 1979 7.1.289 when EXITFREE is defined and 'acd' is set freed memory is used - 2146 7.1.290 reading unwritten bytes when spell checking with large indent - 1940 7.1.291 compiler warning for int-long conversion - 6698 7.1.292 when using a pattern with "\@<=" the submatches can be wrong - 3087 7.1.293 spell checking considers super/subscript chars as word chars + 1877 7.2.001 Mac: pseudo-ttys don't work properly on Leopard + 1462 7.2.002 leaking memory when displaying menus + 3663 7.2.003 typo in translated message, message not translated + 3413 7.2.004 Cscope help message is not translated + 4638 7.2.005 a few problems when profiling + 1552 7.2.006 HTML files are not recognized by contents + 16735 7.2.007 (extra) minor issues for VMS + 1947 7.2.008 wrong window count when using :bunload in a BufHidden autocmd + 2245 7.2.009 can't compile with Perl 5.10 on MS-aindows + 5415 7.2.010 "K" in Visual mode does not properly escape all characters + 2873 7.2.011 error when inserting a float value from expression register + 1444 7.2.012 compiler warnings when building with startup timing + 4157 7.2.013 hang when waiting for X selection, consuming lots of CPU time + 1769 7.2.014 synstack() doesn't work in an emptly line + 1943 7.2.015 "make all test install" doesn't stop when the test fails + 4536 7.2.016 cmdline completion pattern can be in freed memory + 5319 7.2.017 X11: strlen() used wrongly, pasting very big selection fails + 1390 7.2.018 memory leak when substitute is aborted + 2269 7.2.019 completion and exists() don't work for ":noautocmd" + 1521 7.2.020 "kvim" starts the GUI even though KDE is no longer supported + 4806 7.2.021 getting full file name when executing autocmds may be slow + 3823 7.2.022 (extra) cannot run tests with the MingW compiler + 2062 7.2.023 'cursorcolumn' wrong in a closed fold when display is shifted + 1452 7.2.024 'history' can be made negative, causes out-of-memory error + 1470 7.2.025 a CursorHold event that invokes system() is retriggered + 2969 7.2.026 (after 7.2.010) 'K' uses the rest of the line + 3235 7.2.027 can use cscope commands in the sandbox, might not be safe + 1466 7.2.028 confusing error message for missing () + 1291 7.2.029 no completion for ":doautoall" like for ":doautocmd" + 1546 7.2.030 (after 7.2.027) can't compile, ex_oldfiles undefined + 39400 7.2.031 file names from viminfo are not available to the user + 1583 7.2.032 (after 7.2.031) can't compile with EXITFREE defined + 2270 7.2.033 using "ucs-2le" for two-byte BOM, but text might be "utf-16le" + 2372 7.2.034 memory leak in spell info when deleting a buffer + 3522 7.2.035 mismatches for library and Vim alloc/free functions + 7545 7.2.036 (extra) mismatches for library and Vim alloc/free functions + 1576 7.2.037 double free with GTK 1 and compiled with EXITFREE + 2438 7.2.038 overlapping arguments to memcpy() + 1378 7.2.039 accessing freed memory on exit when EXITFREE is defined + 1836 7.2.040 ":e ++ff=dos foo" gets "unix" 'ff' when CR before NL missing + 22993 7.2.041 diff messed up when editing a diff buffer in another tab page + 4987 7.2.042 restoring view in autocmd sometimes doesn't work completely + 2550 7.2.043 VMS: Too many chars escaped in filename and shell commands + 5639 7.2.044 crash because of gcc 4 being over protective for strcpy() + 2056 7.2.045 the Python interface has an empty entry in sys.path + 1704 7.2.046 wrong check for filling buffer with encoding + 2470 7.2.047 using -nb while it is not supported makes other side hang + 4758 7.2.048 v:count and v:prevcount are not set correctly + 32552 7.2.049 (extra) Win32: the clipboard doesn't support UTF-16 + 8484 7.2.050 compiler warnings for not using return value of fwrite() + 15179 7.2.051 can't avoid 'wig' and 'suffixes' for glob() and globpath() + 2611 7.2.052 synIDattr() doesn't support "sp" for special color + 1754 7.2.053 crash when using WorkShop command ":ws foo" + 2006 7.2.054 compilation warnings for fprintf format + 34319 7.2.055 various compiler warnings with strict checking + 1635 7.2.056 (after 7.2.050) tests 58 and 59 fail + 3210 7.2.057 (after 7.2.056) trying to put size_t in int variable + 2338 7.2.058 can't add a feature name in the :version output + 1847 7.2.059 diff is not always displayed properly + 34772 7.2.060 spell checking doesn't work well for compound words diff --git a/filetype.vim b/filetype.vim new file mode 100644 index 00000000..81d4db30 --- /dev/null +++ b/filetype.vim @@ -0,0 +1,2449 @@ +" Vim support file to detect file types +" +" Maintainer: Bram Moolenaar +" Last Change: 2008 Nov 01 + +" Listen very carefully, I will say this only once +if exists("did_load_filetypes") + finish +endif +let did_load_filetypes = 1 + +" Line continuation is used here, remove 'C' from 'cpoptions' +let s:cpo_save = &cpo +set cpo&vim + +augroup filetypedetect + +" Ignored extensions +if exists("*fnameescape") +au BufNewFile,BufRead ?\+.orig,?\+.bak,?\+.old,?\+.new,?\+.dpkg-dist,?\+.dpkg-old,?\+.rpmsave,?\+.rpmnew + \ exe "doau filetypedetect BufRead " . fnameescape(expand(":r")) +au BufNewFile,BufRead *~ + \ let s:name = expand("") | + \ let s:short = substitute(s:name, '\~$', '', '') | + \ if s:name != s:short && s:short != "" | + \ exe "doau filetypedetect BufRead " . fnameescape(s:short) | + \ endif | + \ unlet! s:name s:short +au BufNewFile,BufRead ?\+.in + \ if expand(":t") != "configure.in" | + \ exe "doau filetypedetect BufRead " . fnameescape(expand(":r")) | + \ endif +elseif &verbose > 0 + echomsg "Warning: some filetypes will not be recognized because this version of Vim does not have fnameescape()" +endif + +" Pattern used to match file names which should not be inspected. +" Currently finds compressed files. +if !exists("g:ft_ignore_pat") + let g:ft_ignore_pat = '\.\(Z\|gz\|bz2\|zip\|tgz\)$' +endif + +" Function used for patterns that end in a star: don't set the filetype if the +" file name matches ft_ignore_pat. +func! s:StarSetf(ft) + if expand("") !~ g:ft_ignore_pat + exe 'setf ' . a:ft + endif +endfunc + +" Abaqus or Trasys +au BufNewFile,BufRead *.inp call s:Check_inp() + +func! s:Check_inp() + if getline(1) =~ '^\*' + setf abaqus + else + let n = 1 + if line("$") > 500 + let nmax = 500 + else + let nmax = line("$") + endif + while n <= nmax + if getline(n) =~? "^header surface data" + setf trasys + break + endif + let n = n + 1 + endwhile + endif +endfunc + +" A-A-P recipe +au BufNewFile,BufRead *.aap setf aap + +" A2ps printing utility +au BufNewFile,BufRead etc/a2ps.cfg,etc/a2ps/*.cfg,a2psrc,.a2psrc setf a2ps + +" ABAB/4 +au BufNewFile,BufRead *.abap setf abap + +" ABC music notation +au BufNewFile,BufRead *.abc setf abc + +" ABEL +au BufNewFile,BufRead *.abl setf abel + +" AceDB +au BufNewFile,BufRead *.wrm setf acedb + +" Ada (83, 9X, 95) +au BufNewFile,BufRead *.adb,*.ads,*.ada setf ada +if has("vms") + au BufNewFile,BufRead *.gpr,*.ada_m,*.adc setf ada +else + au BufNewFile,BufRead *.gpr setf ada +endif + +" AHDL +au BufNewFile,BufRead *.tdf setf ahdl + +" AMPL +au BufNewFile,BufRead *.run setf ampl + +" Ant +au BufNewFile,BufRead build.xml setf ant + +" Apache style config file +au BufNewFile,BufRead proftpd.conf* call s:StarSetf('apachestyle') + +" Apache config file +au BufNewFile,BufRead .htaccess setf apache +au BufNewFile,BufRead httpd.conf*,srm.conf*,access.conf*,apache.conf*,apache2.conf*,/etc/apache2/*.conf* call s:StarSetf('apache') + +" XA65 MOS6510 cross assembler +au BufNewFile,BufRead *.a65 setf a65 + +" Applescript +au BufNewFile,BufRead *.scpt setf applescript + +" Applix ELF +au BufNewFile,BufRead *.am + \ if expand("") !~? 'Makefile.am\>' | setf elf | endif + +" ALSA configuration +au BufNewFile,BufRead ~/.asoundrc,/usr/share/alsa/alsa.conf,/etc/asound.conf setf alsaconf + +" Arc Macro Language +au BufNewFile,BufRead *.aml setf aml + +" Arch Inventory file +au BufNewFile,BufRead .arch-inventory,=tagging-method setf arch + +" ART*Enterprise (formerly ART-IM) +au BufNewFile,BufRead *.art setf art + +" ASN.1 +au BufNewFile,BufRead *.asn,*.asn1 setf asn + +" Active Server Pages (with Visual Basic Script) +au BufNewFile,BufRead *.asa + \ if exists("g:filetype_asa") | + \ exe "setf " . g:filetype_asa | + \ else | + \ setf aspvbs | + \ endif + +" Active Server Pages (with Perl or Visual Basic Script) +au BufNewFile,BufRead *.asp + \ if exists("g:filetype_asp") | + \ exe "setf " . g:filetype_asp | + \ elseif getline(1) . getline(2) . getline(3) =~? "perlscript" | + \ setf aspperl | + \ else | + \ setf aspvbs | + \ endif + +" Grub (must be before catch *.lst) +au BufNewFile,BufRead /boot/grub/menu.lst,/boot/grub/grub.conf,/etc/grub.conf setf grub + +" Assembly (all kinds) +" *.lst is not pure assembly, it has two extra columns (address, byte codes) +au BufNewFile,BufRead *.asm,*.[sS],*.[aA],*.mac,*.lst call s:FTasm() + +" This function checks for the kind of assembly that is wanted by the user, or +" can be detected from the first five lines of the file. +func! s:FTasm() + " make sure b:asmsyntax exists + if !exists("b:asmsyntax") + let b:asmsyntax = "" + endif + + if b:asmsyntax == "" + call s:FTasmsyntax() + endif + + " if b:asmsyntax still isn't set, default to asmsyntax or GNU + if b:asmsyntax == "" + if exists("g:asmsyntax") + let b:asmsyntax = g:asmsyntax + else + let b:asmsyntax = "asm" + endif + endif + + exe "setf " . fnameescape(b:asmsyntax) +endfunc + +func! s:FTasmsyntax() + " see if file contains any asmsyntax=foo overrides. If so, change + " b:asmsyntax appropriately + let head = " ".getline(1)." ".getline(2)." ".getline(3)." ".getline(4). + \" ".getline(5)." " + let match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s') + if match != '' + let b:asmsyntax = match + elseif ((head =~? '\.title') || (head =~? '\.ident') || (head =~? '\.macro') || (head =~? '\.subtitle') || (head =~? '\.library')) + let b:asmsyntax = "vmasm" + endif +endfunc + +" Macro (VAX) +au BufNewFile,BufRead *.mar setf vmasm + +" Atlas +au BufNewFile,BufRead *.atl,*.as setf atlas + +" Autoit v3 +au BufNewFile,BufRead *.au3 setf autoit + +" Autohotkey +au BufNewFile,BufRead *.ahk setf autohotkey + +" Automake +au BufNewFile,BufRead [mM]akefile.am,GNUmakefile.am setf automake + +" Autotest .at files are actually m4 +au BufNewFile,BufRead *.at setf m4 + +" Avenue +au BufNewFile,BufRead *.ave setf ave + +" Awk +au BufNewFile,BufRead *.awk setf awk + +" B +au BufNewFile,BufRead *.mch,*.ref,*.imp setf b + +" BASIC or Visual Basic +au BufNewFile,BufRead *.bas call s:FTVB("basic") + +" Check if one of the first five lines contains "VB_Name". In that case it is +" probably a Visual Basic file. Otherwise it's assumed to be "alt" filetype. +func! s:FTVB(alt) + if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)' + setf vb + else + exe "setf " . a:alt + endif +endfunc + +" Visual Basic Script (close to Visual Basic) +au BufNewFile,BufRead *.vbs,*.dsm,*.ctl setf vb + +" IBasic file (similar to QBasic) +au BufNewFile,BufRead *.iba,*.ibi setf ibasic + +" FreeBasic file (similar to QBasic) +au BufNewFile,BufRead *.fb,*.bi setf freebasic + +" Batch file for MSDOS. +au BufNewFile,BufRead *.bat,*.sys setf dosbatch +" *.cmd is close to a Batch file, but on OS/2 Rexx files also use *.cmd. +au BufNewFile,BufRead *.cmd + \ if getline(1) =~ '^/\*' | setf rexx | else | setf dosbatch | endif + +" Batch file for 4DOS +au BufNewFile,BufRead *.btm call s:FTbtm() +func! s:FTbtm() + if exists("g:dosbatch_syntax_for_btm") && g:dosbatch_syntax_for_btm + setf dosbatch + else + setf btm + endif +endfunc + +" BC calculator +au BufNewFile,BufRead *.bc setf bc + +" BDF font +au BufNewFile,BufRead *.bdf setf bdf + +" BibTeX bibliography database file +au BufNewFile,BufRead *.bib setf bib + +" BibTeX Bibliography Style +au BufNewFile,BufRead *.bst setf bst + +" BIND configuration +au BufNewFile,BufRead named.conf,rndc.conf setf named + +" BIND zone +au BufNewFile,BufRead named.root setf bindzone +au BufNewFile,BufRead *.db call s:BindzoneCheck('') + +func! s:BindzoneCheck(default) + if getline(1).getline(2).getline(3).getline(4) =~ '^; <<>> DiG [0-9.]\+ <<>>\|BIND.*named\|$ORIGIN\|$TTL\|IN\s\+SOA' + setf bindzone + elseif a:default != '' + exe 'setf ' . a:default + endif +endfunc + +" Blank +au BufNewFile,BufRead *.bl setf blank + +" Blkid cache file +au BufNewFile,BufRead /etc/blkid.tab,/etc/blkid.tab.old setf xml + +" C or lpc +au BufNewFile,BufRead *.c call s:FTlpc() + +func! s:FTlpc() + if exists("g:lpc_syntax_for_c") + let lnum = 1 + while lnum <= 12 + if getline(lnum) =~# '^\(//\|inherit\|private\|protected\|nosave\|string\|object\|mapping\|mixed\)' + setf lpc + return + endif + let lnum = lnum + 1 + endwhile + endif + setf c +endfunc + +" Calendar +au BufNewFile,BufRead calendar setf calendar +au BufNewFile,BufRead */.calendar/*, + \*/share/calendar/*/calendar.*,*/share/calendar/calendar.* + \ call s:StarSetf('calendar') + +" C# +au BufNewFile,BufRead *.cs setf cs + +" Cdrdao TOC +au BufNewFile,BufRead *.toc setf cdrtoc + +" Cdrdao config +au BufNewFile,BufRead etc/cdrdao.conf,etc/defaults/cdrdao,etc/default/cdrdao,~/.cdrdao setf cdrdaoconf + +" Cfengine +au BufNewFile,BufRead cfengine.conf setf cfengine + +" Comshare Dimension Definition Language +au BufNewFile,BufRead *.cdl setf cdl + +" Conary Recipe +au BufNewFile,BufRead *.recipe setf conaryrecipe + +" Controllable Regex Mutilator +au BufNewFile,BufRead *.crm setf crm + +" Cyn++ +au BufNewFile,BufRead *.cyn setf cynpp + +" Cynlib +" .cc and .cpp files can be C++ or Cynlib. +au BufNewFile,BufRead *.cc + \ if exists("cynlib_syntax_for_cc")|setf cynlib|else|setf cpp|endif +au BufNewFile,BufRead *.cpp + \ if exists("cynlib_syntax_for_cpp")|setf cynlib|else|setf cpp|endif + +" C++ +au BufNewFile,BufRead *.cxx,*.c++,*.hh,*.hxx,*.hpp,*.ipp,*.moc,*.tcc,*.inl setf cpp +if has("fname_case") + au BufNewFile,BufRead *.C,*.H setf cpp +endif + +" .h files can be C, Ch C++, ObjC or ObjC++. +" Set c_syntax_for_h if you want C, ch_syntax_for_h if you want Ch. ObjC is +" detected automatically. +au BufNewFile,BufRead *.h call s:FTheader() + +func! s:FTheader() + if match(getline(1, min([line("$"), 200])), '^@\(interface\|end\|class\)') > -1 + setf objc + elseif exists("g:c_syntax_for_h") + setf c + elseif exists("g:ch_syntax_for_h") + setf ch + else + setf cpp + endif +endfunc + +" Ch (CHscript) +au BufNewFile,BufRead *.chf setf ch + +" TLH files are C++ headers generated by Visual C++'s #import from typelibs +au BufNewFile,BufRead *.tlh setf cpp + +" Cascading Style Sheets +au BufNewFile,BufRead *.css setf css + +" Century Term Command Scripts (*.cmd too) +au BufNewFile,BufRead *.con setf cterm + +" Changelog +au BufNewFile,BufRead changelog.Debian,changelog.dch,NEWS.Debian,NEWS.dch + \ setf debchangelog + +au BufNewFile,BufRead [cC]hange[lL]og + \ if getline(1) =~ '; urgency=' + \| setf debchangelog + \| else + \| setf changelog + \| endif + +au BufNewFile,BufRead NEWS + \ if getline(1) =~ '; urgency=' + \| setf debchangelog + \| endif + +" CHILL +au BufNewFile,BufRead *..ch setf chill + +" Changes for WEB and CWEB or CHILL +au BufNewFile,BufRead *.ch call s:FTchange() + +" This function checks if one of the first ten lines start with a '@'. In +" that case it is probably a change file. +" If the first line starts with # or ! it's probably a ch file. +" If a line has "main", "include", "//" ir "/*" it's probably ch. +" Otherwise CHILL is assumed. +func! s:FTchange() + let lnum = 1 + while lnum <= 10 + if getline(lnum)[0] == '@' + setf change + return + endif + if lnum == 1 && (getline(1)[0] == '#' || getline(1)[0] == '!') + setf ch + return + endif + if getline(lnum) =~ "MODULE" + setf chill + return + endif + if getline(lnum) =~ 'main\s*(\|#\s*include\|//' + setf ch + return + endif + let lnum = lnum + 1 + endwhile + setf chill +endfunc + +" ChordPro +au BufNewFile,BufRead *.chopro,*.crd,*.cho,*.crdpro,*.chordpro setf chordpro + +" Clean +au BufNewFile,BufRead *.dcl,*.icl setf clean + +" Clever +au BufNewFile,BufRead *.eni setf cl + +" Clever or dtd +au BufNewFile,BufRead *.ent call s:FTent() + +func! s:FTent() + " This function checks for valid cl syntax in the first five lines. + " Look for either an opening comment, '#', or a block start, '{". + " If not found, assume SGML. + let lnum = 1 + while lnum < 6 + let line = getline(lnum) + if line =~ '^\s*[#{]' + setf cl + return + elseif line !~ '^\s*$' + " Not a blank line, not a comment, and not a block start, + " so doesn't look like valid cl code. + break + endif + let lnum = lnum + 1 + endw + setf dtd +endfunc + +" Clipper (or FoxPro; could also be eviews) +au BufNewFile,BufRead *.prg + \ if exists("g:filetype_prg") | + \ exe "setf " . g:filetype_prg | + \ else | + \ setf clipper | + \ endif + +" Cmake +au BufNewFile,BufRead CMakeLists.txt,*.cmake,*.cmake.in setf cmake + +" Cmusrc +au BufNewFile,BufRead ~/.cmus/{autosave,rc,command-history,*.theme} setf cmusrc +au BufNewFile,BufRead */cmus/{rc,*.theme} setf cmusrc + +" Cobol +au BufNewFile,BufRead *.cbl,*.cob,*.lib setf cobol +" cobol or zope form controller python script? (heuristic) +au BufNewFile,BufRead *.cpy + \ if getline(1) =~ '^##' | + \ setf python | + \ else | + \ setf cobol | + \ endif + +" Coco/R +au BufNewFile,BufRead *.atg setf coco + +" Cold Fusion +au BufNewFile,BufRead *.cfm,*.cfi,*.cfc setf cf + +" Configure scripts +au BufNewFile,BufRead configure.in,configure.ac setf config + +" CUDA Cumpute Unified Device Architecture +au BufNewFile,BufRead *.cu setf cuda + +" WildPackets EtherPeek Decoder +au BufNewFile,BufRead *.dcd setf dcd + +" Enlightenment configuration files +au BufNewFile,BufRead *enlightenment/*.cfg setf c + +" Eterm +au BufNewFile,BufRead *Eterm/*.cfg setf eterm + +" Lynx config files +au BufNewFile,BufRead lynx.cfg setf lynx + +" Quake +au BufNewFile,BufRead *baseq[2-3]/*.cfg,*id1/*.cfg setf quake +au BufNewFile,BufRead *quake[1-3]/*.cfg setf quake + +" Quake C +au BufNewFile,BufRead *.qc setf c + +" Configure files +au BufNewFile,BufRead *.cfg setf cfg + +" Communicating Sequential Processes +au BufNewFile,BufRead *.csp,*.fdr setf csp + +" CUPL logic description and simulation +au BufNewFile,BufRead *.pld setf cupl +au BufNewFile,BufRead *.si setf cuplsim + +" Debian Control +au BufNewFile,BufRead */debian/control setf debcontrol +au BufNewFile,BufRead control + \ if getline(1) =~ '^Source:' + \| setf debcontrol + \| endif + +" Debian Sources.list +au BufNewFile,BufRead /etc/apt/sources.list setf debsources + +" Deny hosts +au BufNewFile,BufRead denyhosts.conf setf denyhosts + +" ROCKLinux package description +au BufNewFile,BufRead *.desc setf desc + +" the D language or dtrace +au BufNewFile,BufRead *.d call s:DtraceCheck() + +func! s:DtraceCheck() + let lines = getline(1, min([line("$"), 100])) + if match(lines, '^#!\S\+dtrace\|#pragma\s\+D\s\+option\|:\S\{-}:\S\{-}:') > -1 + setf dtrace + else + setf d + endif +endfunc + +" Desktop files +au BufNewFile,BufRead *.desktop,.directory setf desktop + +" Dict config +au BufNewFile,BufRead dict.conf,.dictrc setf dictconf + +" Dictd config +au BufNewFile,BufRead dictd.conf setf dictdconf + +" Diff files +au BufNewFile,BufRead *.diff,*.rej,*.patch setf diff + +" Dircolors +au BufNewFile,BufRead .dir_colors,/etc/DIR_COLORS setf dircolors + +" Diva (with Skill) or InstallShield +au BufNewFile,BufRead *.rul + \ if getline(1).getline(2).getline(3).getline(4).getline(5).getline(6) =~? 'InstallShield' | + \ setf ishd | + \ else | + \ setf diva | + \ endif + +" DCL (Digital Command Language - vms) or DNS zone file +au BufNewFile,BufRead *.com call s:BindzoneCheck('dcl') + +" DOT +au BufNewFile,BufRead *.dot setf dot + +" Dylan - lid files +au BufNewFile,BufRead *.lid setf dylanlid + +" Dylan - intr files (melange) +au BufNewFile,BufRead *.intr setf dylanintr + +" Dylan +au BufNewFile,BufRead *.dylan setf dylan + +" Microsoft Module Definition +au BufNewFile,BufRead *.def setf def + +" Dracula +au BufNewFile,BufRead *.drac,*.drc,*lvs,*lpe setf dracula + +" dsl +au BufNewFile,BufRead *.dsl setf dsl + +" DTD (Document Type Definition for XML) +au BufNewFile,BufRead *.dtd setf dtd + +" EDIF (*.edf,*.edif,*.edn,*.edo) +au BufNewFile,BufRead *.ed\(f\|if\|n\|o\) setf edif + +" Embedix Component Description +au BufNewFile,BufRead *.ecd setf ecd + +" Eiffel or Specman +au BufNewFile,BufRead *.e,*.E call s:FTe() + +" Elinks configuration +au BufNewFile,BufRead */etc/elinks.conf,*/.elinks/elinks.conf setf elinks + +func! s:FTe() + let n = 1 + while n < 100 && n < line("$") + if getline(n) =~ "^\\s*\\(<'\\|'>\\)\\s*$" + setf specman + return + endif + let n = n + 1 + endwhile + setf eiffel +endfunc + +" ERicsson LANGuage; Yaws is erlang too +au BufNewFile,BufRead *.erl,*.hrl,*.yaws setf erlang + +" Elm Filter Rules file +au BufNewFile,BufRead filter-rules setf elmfilt + +" ESMTP rc file +au BufNewFile,BufRead *esmtprc setf esmtprc + +" ESQL-C +au BufNewFile,BufRead *.ec,*.EC setf esqlc + +" Esterel +au BufNewFile,BufRead *.strl setf esterel + +" Essbase script +au BufNewFile,BufRead *.csc setf csc + +" Exim +au BufNewFile,BufRead exim.conf setf exim + +" Expect +au BufNewFile,BufRead *.exp setf expect + +" Exports +au BufNewFile,BufRead exports setf exports + +" Factor +au BufNewFile,BufRead *.factor setf factor + +" Fetchmail RC file +au BufNewFile,BufRead .fetchmailrc setf fetchmail + +" FlexWiki +au BufNewFile,BufRead *.wiki setf flexwiki + +" Focus Executable +au BufNewFile,BufRead *.fex,*.focexec setf focexec + +" Focus Master file (but not for auto.master) +au BufNewFile,BufRead auto.master setf conf +au BufNewFile,BufRead *.mas,*.master setf master + +" Forth +au BufNewFile,BufRead *.fs,*.ft setf forth + +" Reva Forth +au BufNewFile,BufRead *.frt setf reva + +" Fortran +if has("fname_case") + au BufNewFile,BufRead *.F,*.FOR,*.FPP,*.FTN,*.F77,*.F90,*.F95 setf fortran +endif +au BufNewFile,BufRead *.f,*.for,*.fortran,*.fpp,*.ftn,*.f77,*.f90,*.f95 setf fortran + +" Framescript +au BufNewFile,BufRead *.fsl setf framescript + +" FStab +au BufNewFile,BufRead fstab,mtab setf fstab + +" GDB command files +au BufNewFile,BufRead .gdbinit setf gdb + +" GDMO +au BufNewFile,BufRead *.mo,*.gdmo setf gdmo + +" Gedcom +au BufNewFile,BufRead *.ged setf gedcom + +" Git +autocmd BufNewFile,BufRead *.git/COMMIT_EDITMSG setf gitcommit +autocmd BufNewFile,BufRead *.git/config,.gitconfig setf gitconfig +autocmd BufNewFile,BufRead git-rebase-todo setf gitrebase +autocmd BufNewFile,BufRead .msg.[0-9]* + \ if getline(1) =~ '^From.*# This line is ignored.$' | + \ setf gitsendemail | + \ endif +autocmd BufNewFile,BufRead *.git/** + \ if getline(1) =~ '^\x\{40\}\>\|^ref: ' | + \ setf git | + \ endif + +" Gkrellmrc +au BufNewFile,BufRead gkrellmrc,gkrellmrc_? setf gkrellmrc + +" GP scripts (2.0 and onward) +au BufNewFile,BufRead *.gp,.gprc setf gp + +" GPG +au BufNewFile,BufRead */.gnupg/options setf gpg +au BufNewFile,BufRead */.gnupg/gpg.conf setf gpg +au BufNewFile,BufRead /usr/**/gnupg/options.skel setf gpg + +" Gnuplot scripts +au BufNewFile,BufRead *.gpi setf gnuplot + +" GrADS scripts +au BufNewFile,BufRead *.gs setf grads + +" Gretl +au BufNewFile,BufRead *.gretl setf gretl + +" Groovy +au BufNewFile,BufRead *.groovy setf groovy + +" GNU Server Pages +au BufNewFile,BufRead *.gsp setf gsp + +" Group file +au BufNewFile,BufRead /etc/group,/etc/group-,/etc/group.edit,/etc/gshadow,/etc/gshadow-,/etc/gshadow.edit,/var/backups/group.bak,/var/backups/gshadow.bak setf group + +" GTK RC +au BufNewFile,BufRead .gtkrc,gtkrc setf gtkrc + +" Haml +au BufNewFile,BufRead *.haml setf haml + +" Hamster Classic | Playground files +au BufNewFile,BufRead *.hsc,*.hsm setf hamster + +" Haskell +au BufNewFile,BufRead *.hs setf haskell +au BufNewFile,BufRead *.lhs setf lhaskell +au BufNewFile,BufRead *.chs setf chaskell + +" Haste +au BufNewFile,BufRead *.ht setf haste +au BufNewFile,BufRead *.htpp setf hastepreproc + +" Hercules +au BufNewFile,BufRead *.vc,*.ev,*.rs,*.sum,*.errsum setf hercules + +" HEX (Intel) +au BufNewFile,BufRead *.hex,*.h32 setf hex + +" Tilde (must be before HTML) +au BufNewFile,BufRead *.t.html setf tilde + +" HTML (.shtml and .stm for server side) +au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm call s:FThtml() + +" Distinguish between HTML, XHTML and Django +func! s:FThtml() + let n = 1 + while n < 10 && n < line("$") + if getline(n) =~ '\' + setf htmldjango + return + endif + let n = n + 1 + endwhile + setf html +endfunc + +" HTML with Ruby - eRuby +au BufNewFile,BufRead *.erb,*.rhtml setf eruby + +" HTML with M4 +au BufNewFile,BufRead *.html.m4 setf htmlm4 + +" HTML Cheetah template +au BufNewFile,BufRead *.tmpl setf htmlcheetah + +" Host config +au BufNewFile,BufRead /etc/host.conf setf hostconf + +" Hosts access +au BufNewFile,BufRead /etc/hosts.allow,/etc/hosts.deny setf hostsaccess + +" Hyper Builder +au BufNewFile,BufRead *.hb setf hb + +" Icon +au BufNewFile,BufRead *.icn setf icon + +" IDL (Interface Description Language) +au BufNewFile,BufRead *.idl call s:FTidl() + +" Distinguish between standard IDL and MS-IDL +func! s:FTidl() + let n = 1 + while n < 50 && n < line("$") + if getline(n) =~ '^\s*import\s\+"\(unknwn\|objidl\)\.idl"' + setf msidl + return + endif + let n = n + 1 + endwhile + setf idl +endfunc + +" Microsoft IDL (Interface Description Language) Also *.idl +" MOF = WMI (Windows Management Instrumentation) Managed Object Format +au BufNewFile,BufRead *.odl,*.mof setf msidl + +" Icewm menu +au BufNewFile,BufRead */.icewm/menu setf icemenu + +" Indent profile (must come before IDL *.pro!) +au BufNewFile,BufRead .indent.pro setf indent +au BufNewFile,BufRead indent.pro call s:ProtoCheck('indent') + +" IDL (Interactive Data Language) +au BufNewFile,BufRead *.pro call s:ProtoCheck('idlang') + +" Distinguish between "default" and Cproto prototype file. */ +func! s:ProtoCheck(default) + " Cproto files have a comment in the first line and a function prototype in + " the second line, it always ends in ";". Indent files may also have + " comments, thus we can't match comments to see the difference. + if getline(2) =~ ';$' + setf cpp + else + exe 'setf ' . a:default + endif +endfunc + + +" Indent RC +au BufNewFile,BufRead indentrc setf indent + +" Inform +au BufNewFile,BufRead *.inf,*.INF setf inform + +" Initng +au BufNewFile,BufRead /etc/initng/**/*.i,*.ii setf initng + +" Ipfilter +au BufNewFile,BufRead ipf.conf,ipf6.conf,ipf.rules setf ipfilter + +" Informix 4GL (source - canonical, include file, I4GL+M4 preproc.) +au BufNewFile,BufRead *.4gl,*.4gh,*.m4gl setf fgl + +" .INI file for MSDOS +au BufNewFile,BufRead *.ini setf dosini + +" SysV Inittab +au BufNewFile,BufRead inittab setf inittab + +" Inno Setup +au BufNewFile,BufRead *.iss setf iss + +" JAL +au BufNewFile,BufRead *.jal,*.JAL setf jal + +" Jam +au BufNewFile,BufRead *.jpl,*.jpr setf jam + +" Java +au BufNewFile,BufRead *.java,*.jav setf java + +" JavaCC +au BufNewFile,BufRead *.jj,*.jjt setf javacc + +" JavaScript, ECMAScript +au BufNewFile,BufRead *.js,*.javascript,*.es setf javascript + +" Java Server Pages +au BufNewFile,BufRead *.jsp setf jsp + +" Java Properties resource file (note: doesn't catch font.properties.pl) +au BufNewFile,BufRead *.properties,*.properties_??,*.properties_??_?? setf jproperties +au BufNewFile,BufRead *.properties_??_??_* call s:StarSetf('jproperties') + +" Jess +au BufNewFile,BufRead *.clp setf jess + +" Jgraph +au BufNewFile,BufRead *.jgr setf jgraph + +" Kixtart +au BufNewFile,BufRead *.kix setf kix + +" Kimwitu[++] +au BufNewFile,BufRead *.k setf kwt + +" KDE script +au BufNewFile,BufRead *.ks setf kscript + +" Kconfig +au BufNewFile,BufRead Kconfig,Kconfig.debug setf kconfig + +" Lace (ISE) +au BufNewFile,BufRead *.ace,*.ACE setf lace + +" Latte +au BufNewFile,BufRead *.latte,*.lte setf latte + +" Limits +au BufNewFile,BufRead /etc/limits setf limits + +" LambdaProlog (*.mod too, see Modsim) +au BufNewFile,BufRead *.sig setf lprolog + +" LDAP LDIF +au BufNewFile,BufRead *.ldif setf ldif + +" Ld loader +au BufNewFile,BufRead *.ld setf ld + +" Lex +au BufNewFile,BufRead *.lex,*.l setf lex + +" Libao +au BufNewFile,BufRead /etc/libao.conf,*/.libao setf libao + +" Libsensors +au BufNewFile,BufRead /etc/sensors.conf setf sensors + +" LFTP +au BufNewFile,BufRead lftp.conf,.lftprc,*lftp/rc setf lftp + +" Lifelines (or Lex for C++!) +au BufNewFile,BufRead *.ll setf lifelines + +" Lilo: Linux loader +au BufNewFile,BufRead lilo.conf* call s:StarSetf('lilo') + +" Lisp (*.el = ELisp, *.cl = Common Lisp, *.jl = librep Lisp) +if has("fname_case") + au BufNewFile,BufRead *.lsp,*.lisp,*.el,*.cl,*.jl,*.L,.emacs,.sawfishrc setf lisp +else + au BufNewFile,BufRead *.lsp,*.lisp,*.el,*.cl,*.jl,.emacs,.sawfishrc setf lisp +endif + +" SBCL implementation of Common Lisp +au BufNewFile,BufRead sbclrc,.sbclrc setf lisp + +" Lite +au BufNewFile,BufRead *.lite,*.lt setf lite + +" LiteStep RC files +au BufNewFile,BufRead */LiteStep/*/*.rc setf litestep + +" Login access +au BufNewFile,BufRead /etc/login.access setf loginaccess + +" Login defs +au BufNewFile,BufRead /etc/login.defs setf logindefs + +" Logtalk +au BufNewFile,BufRead *.lgt setf logtalk + +" LOTOS +au BufNewFile,BufRead *.lot,*.lotos setf lotos + +" Lout (also: *.lt) +au BufNewFile,BufRead *.lou,*.lout setf lout + +" Lua +au BufNewFile,BufRead *.lua setf lua + +" Linden Scripting Language (Second Life) +au BufNewFile,BufRead *.lsl setf lsl + +" Lynx style file (or LotusScript!) +au BufNewFile,BufRead *.lss setf lss + +" M4 +au BufNewFile,BufRead *.m4 + \ if expand("") !~? 'html.m4$\|fvwm2rc' | setf m4 | endif + +" MaGic Point +au BufNewFile,BufRead *.mgp setf mgp + +" Mail (for Elm, trn, mutt, muttng, rn, slrn) +au BufNewFile,BufRead snd.\d\+,.letter,.letter.\d\+,.followup,.article,.article.\d\+,pico.\d\+,mutt{ng,}-*-\w\+,mutt[[:alnum:]_-]\{6\},ae\d\+.txt,/tmp/SLRN[0-9A-Z.]\+,*.eml setf mail + +" Mail aliases +au BufNewFile,BufRead /etc/mail/aliases,/etc/aliases setf mailaliases + +" Mailcap configuration file +au BufNewFile,BufRead .mailcap,mailcap setf mailcap + +" Makefile +au BufNewFile,BufRead *[mM]akefile,*.mk,*.mak,*.dsp setf make + +" MakeIndex +au BufNewFile,BufRead *.ist,*.mst setf ist + +" Manpage +au BufNewFile,BufRead *.man setf man + +" Man config +au BufNewFile,BufRead /etc/man.conf,man.config setf manconf + +" Maple V +au BufNewFile,BufRead *.mv,*.mpl,*.mws setf maple + +" Map (UMN mapserver config file) +au BufNewFile,BufRead *.map setf map + +" Mason +au BufNewFile,BufRead *.mason,*.mhtml setf mason + +" Matlab or Objective C +au BufNewFile,BufRead *.m call s:FTm() + +func! s:FTm() + let n = 1 + while n < 10 + let line = getline(n) + if line =~ '^\s*\(#\s*\(include\|import\)\>\|/\*\)' + setf objc + return + endif + if line =~ '^\s*%' + setf matlab + return + endif + if line =~ '^\s*(\*' + setf mma + return + endif + let n = n + 1 + endwhile + if exists("g:filetype_m") + exe "setf " . g:filetype_m + else + setf matlab + endif +endfunc + +" Mathematica notebook +au BufNewFile,BufRead *.nb setf mma + +" Maya Extension Language +au BufNewFile,BufRead *.mel setf mel + +" Messages +au BufNewFile,BufRead /var/log/messages,/var/log/messages.*[0-9] setf messages + +" Metafont +au BufNewFile,BufRead *.mf setf mf + +" MetaPost +au BufNewFile,BufRead *.mp setf mp + +" MGL +au BufNewFile,BufRead *.mgl setf mgl + +" MMIX or VMS makefile +au BufNewFile,BufRead *.mms call s:FTmms() + +" Symbian meta-makefile definition (MMP) +au BufNewFile,BufRead *.mmp setf mmp + +func! s:FTmms() + let n = 1 + while n < 10 + let line = getline(n) + if line =~ '^\s*\(%\|//\)' || line =~ '^\*' + setf mmix + return + endif + if line =~ '^\s*#' + setf make + return + endif + let n = n + 1 + endwhile + setf mmix +endfunc + + +" Modsim III (or LambdaProlog) +au BufNewFile,BufRead *.mod + \ if getline(1) =~ '\' | + \ setf lprolog | + \ else | + \ setf modsim3 | + \ endif + +" Modula 2 +au BufNewFile,BufRead *.m2,*.DEF,*.MOD,*.md,*.mi setf modula2 + +" Modula 3 (.m3, .i3, .mg, .ig) +au BufNewFile,BufRead *.[mi][3g] setf modula3 + +" Monk +au BufNewFile,BufRead *.isc,*.monk,*.ssc,*.tsc setf monk + +" MOO +au BufNewFile,BufRead *.moo setf moo + +" Modconf +au BufNewFile,BufRead /etc/modules.conf,/etc/conf.modules setf modconf +au BufNewFile,BufRead /etc/modutils/* + \ if executable(expand("")) != 1 + \| call s:StarSetf('modconf') + \|endif + +" Mplayer config +au BufNewFile,BufRead mplayer.conf,*/.mplayer/config setf mplayerconf + +" Moterola S record +au BufNewFile,BufRead *.s19,*.s28,*.s37 setf srec + +" Mrxvtrc +au BufNewFile,BufRead mrxvtrc,.mrxvtrc setf mrxvtrc + +" Msql +au BufNewFile,BufRead *.msql setf msql + +" Mysql +au BufNewFile,BufRead *.mysql setf mysql + +" M$ Resource files +au BufNewFile,BufRead *.rc setf rc + +" MuPAD source +au BufRead,BufNewFile *.mu setf mupad + +" Mush +au BufNewFile,BufRead *.mush setf mush + +" Mutt setup file (also for Muttng) +au BufNewFile,BufRead Mutt{ng,}rc setf muttrc + +" Nano +au BufNewFile,BufRead /etc/nanorc,.nanorc setf nanorc + +" Nastran input/DMAP +"au BufNewFile,BufRead *.dat setf nastran + +" Natural +au BufNewFile,BufRead *.NS[ACGLMNPS] setf natural + +" Netrc +au BufNewFile,BufRead .netrc setf netrc + +" Novell netware batch files +au BufNewFile,BufRead *.ncf setf ncf + +" Nroff/Troff (*.ms and *.t are checked below) +au BufNewFile,BufRead *.me + \ if expand("") != "read.me" && expand("") != "click.me" | + \ setf nroff | + \ endif +au BufNewFile,BufRead *.tr,*.nr,*.roff,*.tmac,*.mom setf nroff +au BufNewFile,BufRead *.[1-9] call s:FTnroff() + +" This function checks if one of the first five lines start with a dot. In +" that case it is probably an nroff file: 'filetype' is set and 1 is returned. +func! s:FTnroff() + if getline(1)[0] . getline(2)[0] . getline(3)[0] . getline(4)[0] . getline(5)[0] =~ '\.' + setf nroff + return 1 + endif + return 0 +endfunc + +" Nroff or Objective C++ +au BufNewFile,BufRead *.mm call s:FTmm() + +func! s:FTmm() + let n = 1 + while n < 10 + let line = getline(n) + if line =~ '^\s*\(#\s*\(include\|import\)\>\|/\*\)' + setf objcpp + return + endif + let n = n + 1 + endwhile + setf nroff +endfunc + +" Not Quite C +au BufNewFile,BufRead *.nqc setf nqc + +" NSIS +au BufNewFile,BufRead *.nsi setf nsis + +" OCAML +au BufNewFile,BufRead *.ml,*.mli,*.mll,*.mly setf ocaml + +" Occam +au BufNewFile,BufRead *.occ setf occam + +" Omnimark +au BufNewFile,BufRead *.xom,*.xin setf omnimark + +" OpenROAD +au BufNewFile,BufRead *.or setf openroad + +" OPL +au BufNewFile,BufRead *.[Oo][Pp][Ll] setf opl + +" Oracle config file +au BufNewFile,BufRead *.ora setf ora + +" Packet filter conf +au BufNewFile,BufRead pf.conf setf pf + +" Pam conf +au BufNewFile,BufRead /etc/pam.conf setf pamconf + +" PApp +au BufNewFile,BufRead *.papp,*.pxml,*.pxsl setf papp + +" Password file +au BufNewFile,BufRead /etc/passwd,/etc/passwd-,/etc/passwd.edit,/etc/shadow,/etc/shadow-,/var/backups/passwd.bak,/var/backups/shadow.bak setf passwd + +" Pascal (also *.p) +au BufNewFile,BufRead *.pas setf pascal + +" Delphi project file +au BufNewFile,BufRead *.dpr setf pascal + +" PDF +au BufNewFile,BufRead *.pdf setf pdf + +" Perl +if has("fname_case") + au BufNewFile,BufRead *.pl,*.PL call s:FTpl() +else + au BufNewFile,BufRead *.pl call s:FTpl() +endif +au BufNewFile,BufRead *.plx,*.al setf perl + +func! s:FTpl() + if exists("g:filetype_pl") + exe "setf " . g:filetype_pl + else + " recognize Prolog by specific text in the first non-empty line + " require a blank after the '%' because Perl uses "%list" and "%translate" + let l = getline(nextnonblank(1)) + if l =~ '\' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-' + setf prolog + else + setf perl + endif + endif +endfunc + +" Perl, XPM or XPM2 +au BufNewFile,BufRead *.pm + \ if getline(1) =~ "XPM2" | + \ setf xpm2 | + \ elseif getline(1) =~ "XPM" | + \ setf xpm | + \ else | + \ setf perl | + \ endif + +" Perl POD +au BufNewFile,BufRead *.pod setf pod + +" Php, php3, php4, etc. +" Also Phtml (was used for PHP 2 in the past) +" Also .ctp for Cake template file +au BufNewFile,BufRead *.php,*.php\d,*.phtml,*.ctp setf php + +" Pike +au BufNewFile,BufRead *.pike,*.lpc,*.ulpc,*.pmod setf pike + +" Pinfo config +au BufNewFile,BufRead */etc/pinforc,*/.pinforc setf pinfo + +" Palm Resource compiler +au BufNewFile,BufRead *.rcp setf pilrc + +" Pine config +au BufNewFile,BufRead .pinerc,pinerc,.pinercex,pinercex setf pine + +" PL/M (also: *.inp) +au BufNewFile,BufRead *.plm,*.p36,*.pac setf plm + +" PL/SQL +au BufNewFile,BufRead *.pls,*.plsql setf plsql + +" PLP +au BufNewFile,BufRead *.plp setf plp + +" PO and PO template (GNU gettext) +au BufNewFile,BufRead *.po,*.pot setf po + +" Postfix main config +au BufNewFile,BufRead main.cf setf pfmain + +" PostScript (+ font files, encapsulated PostScript, Adobe Illustrator) +au BufNewFile,BufRead *.ps,*.pfa,*.afm,*.eps,*.epsf,*.epsi,*.ai setf postscr + +" PostScript Printer Description +au BufNewFile,BufRead *.ppd setf ppd + +" Povray +au BufNewFile,BufRead *.pov setf pov + +" Povray configuration +au BufNewFile,BufRead .povrayrc setf povini + +" Povray, PHP or assembly +au BufNewFile,BufRead *.inc call s:FTinc() + +func! s:FTinc() + if exists("g:filetype_inc") + exe "setf " . g:filetype_inc + else + let lines = getline(1).getline(2).getline(3) + if lines =~? "perlscript" + setf aspperl + elseif lines =~ "<%" + setf aspvbs + elseif lines =~ "' + \ || line =~ '^\s*{' || line =~ '^\s*(\*' + setf pascal + return + elseif line !~ '^\s*$' || line =~ '^/\*' + " Not an empty line: Doesn't look like valid Pascal code. + " Or it looks like a Progress /* comment + break + endif + let lnum = lnum + 1 + endw + setf progress +endfunc + + +" Software Distributor Product Specification File (POSIX 1387.2-1995) +au BufNewFile,BufRead *.psf setf psf +au BufNewFile,BufRead INDEX,INFO + \ if getline(1) =~ '^\s*\(distribution\|installed_software\|root\|bundle\|product\)\s*$' | + \ setf psf | + \ endif + +" Prolog +au BufNewFile,BufRead *.pdb setf prolog + +" Promela +au BufNewFile,BufRead *.pml setf promela + +" Protocols +au BufNewFile,BufRead /etc/protocols setf protocols + +" Pyrex +au BufNewFile,BufRead *.pyx,*.pxd setf pyrex + +" Python +au BufNewFile,BufRead *.py,*.pyw setf python + +" Quixote (Python-based web framework) +au BufNewFile,BufRead *.ptl setf python + +" Radiance +au BufNewFile,BufRead *.rad,*.mat setf radiance + +" Ratpoison config/command files +au BufNewFile,BufRead .ratpoisonrc,ratpoisonrc setf ratpoison + +" RCS file +au BufNewFile,BufRead *\,v setf rcs + +" Readline +au BufNewFile,BufRead .inputrc,inputrc setf readline + +" Registry for MS-Windows +au BufNewFile,BufRead *.reg + \ if getline(1) =~? '^REGEDIT[0-9]*\s*$\|^Windows Registry Editor Version \d*\.\d*\s*$' | setf registry | endif + +" Renderman Interface Bytestream +au BufNewFile,BufRead *.rib setf rib + +" Rexx +au BufNewFile,BufRead *.rexx,*.rex,*.jrexx,*.rxj,*.orx setf rexx + +" R (Splus) +if has("fname_case") + au BufNewFile,BufRead *.s,*.S setf r +else + au BufNewFile,BufRead *.s setf r +endif + +" R Help file +if has("fname_case") + au BufNewFile,BufRead *.rd,*.Rd setf rhelp +else + au BufNewFile,BufRead *.rd setf rhelp +endif + +" R noweb file +if has("fname_case") + au BufNewFile,BufRead *.Rnw,*.rnw,*.Snw,*.snw setf rnoweb +else + au BufNewFile,BufRead *.rnw,*.snw setf rnoweb +endif + +" Rexx, Rebol or R +au BufNewFile,BufRead *.r,*.R call s:FTr() + +func! s:FTr() + let max = line("$") > 50 ? 50 : line("$") + + for n in range(1, max) + " Rebol is easy to recognize, check for that first + if getline(n) =~? '\' + setf rebol + return + endif + endfor + + for n in range(1, max) + " R has # comments + if getline(n) =~ '^\s*#' + setf r + return + endif + " Rexx has /* comments */ + if getline(n) =~ '^\s*/\*' + setf rexx + return + endif + endfor + + " Nothing recognized, assume Rexx + setf rexx +endfunc + +" Remind +au BufNewFile,BufRead .reminders* call s:StarSetf('remind') + +" Resolv.conf +au BufNewFile,BufRead resolv.conf setf resolv + +" Relax NG Compact +au BufNewFile,BufRead *.rnc setf rnc + +" RPL/2 +au BufNewFile,BufRead *.rpl setf rpl + +" Robots.txt +au BufNewFile,BufRead robots.txt setf robots + +" Rpcgen +au BufNewFile,BufRead *.x setf rpcgen + +" reStructuredText Documentation Format +au BufNewFile,BufRead *.rst setf rst + +" RTF +au BufNewFile,BufRead *.rtf setf rtf + +" Interactive Ruby shell +au BufNewFile,BufRead .irbrc,irbrc setf ruby + +" Ruby +au BufNewFile,BufRead *.rb,*.rbw,*.gem,*.gemspec setf ruby + +" Ruby on Rails +au BufNewFile,BufRead *.builder,*.rxml,*.rjs setf ruby + +" Rantfile and Rakefile is like Ruby +au BufNewFile,BufRead [rR]antfile,*.rant,[rR]akefile,*.rake setf ruby + +" S-lang (or shader language!) +au BufNewFile,BufRead *.sl setf slang + +" Samba config +au BufNewFile,BufRead smb.conf setf samba + +" SAS script +au BufNewFile,BufRead *.sas setf sas + +" Sass +au BufNewFile,BufRead *.sass setf sass + +" Sather +au BufNewFile,BufRead *.sa setf sather + +" Scilab +au BufNewFile,BufRead *.sci,*.sce setf scilab + +" SD: Streaming Descriptors +au BufNewFile,BufRead *.sd setf sd + +" SDL +au BufNewFile,BufRead *.sdl,*.pr setf sdl + +" sed +au BufNewFile,BufRead *.sed setf sed + +" Sieve (RFC 3028) +au BufNewFile,BufRead *.siv setf sieve + +" Sendmail +au BufNewFile,BufRead sendmail.cf setf sm + +" Sendmail .mc files are actually m4. Could also be MS Message text file. +au BufNewFile,BufRead *.mc call s:McSetf() + +func! s:McSetf() + " Rely on the file to start with a comment. + " MS message text files use ';', Sendmail files use '#' or 'dnl' + for lnum in range(1, min([line("$"), 20])) + let line = getline(lnum) + if line =~ '^\s*\(#\|dnl\)' + setf m4 " Sendmail .mc file + return + elseif line =~ '^\s*;' + setf msmessages " MS Message text file + return + endif + endfor + setf m4 " Default: Sendmail .mc file +endfunc + +" Services +au BufNewFile,BufRead /etc/services setf services + +" Service Location config +au BufNewFile,BufRead /etc/slp.conf setf slpconf + +" Service Location registration +au BufNewFile,BufRead /etc/slp.reg setf slpreg + +" Service Location SPI +au BufNewFile,BufRead /etc/slp.spi setf slpspi + +" Setserial config +au BufNewFile,BufRead /etc/serial.conf setf setserial + +" SGML +au BufNewFile,BufRead *.sgm,*.sgml + \ if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'linuxdoc' | + \ setf sgmllnx | + \ elseif getline(1) =~ '") =~ g:ft_ignore_pat + return + endif + if a:name =~ '\' + let b:is_kornshell = 1 + if exists("b:is_bash") + unlet b:is_bash + endif + if exists("b:is_sh") + unlet b:is_sh + endif + elseif exists("g:bash_is_sh") || a:name =~ '\' || a:name =~ '\' + let b:is_bash = 1 + if exists("b:is_kornshell") + unlet b:is_kornshell + endif + if exists("b:is_sh") + unlet b:is_sh + endif + elseif a:name =~ '\' + let b:is_sh = 1 + if exists("b:is_kornshell") + unlet b:is_kornshell + endif + if exists("b:is_bash") + unlet b:is_bash + endif + endif + call SetFileTypeShell("sh") +endfunc + +" For shell-like file types, check for an "exec" command hidden in a comment, +" as used for Tcl. +" Also called from scripts.vim, thus can't be local to this script. +func! SetFileTypeShell(name) + if expand("") =~ g:ft_ignore_pat + return + endif + let l = 2 + while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)' + " Skip empty and comment lines. + let l = l + 1 + endwhile + if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ '^\s*#.*\\$' + " Found an "exec" line after a comment with continuation + let n = substitute(getline(l),'\s*exec\s\+\([^ ]*/\)\=', '', '') + if n =~ '\' | + \ setf xml | + \ else | + \ setf smil | + \ endif + +" SMIL or SNMP MIB file +au BufNewFile,BufRead *.smi + \ if getline(1) =~ '\' | + \ setf smil | + \ else | + \ setf mib | + \ endif + +" SMITH +au BufNewFile,BufRead *.smt,*.smith setf smith + +" Snobol4 and spitbol +au BufNewFile,BufRead *.sno,*.spt setf snobol4 + +" SNMP MIB files +au BufNewFile,BufRead *.mib,*.my setf mib + +" Snort Configuration +au BufNewFile,BufRead *.hog,snort.conf,vision.conf setf hog +au BufNewFile,BufRead *.rules call s:FTRules() + +let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*' +func! s:FTRules() + if expand(':p') =~ '^/etc/udev/\%(rules\.d/\)\=.*\.rules$' + setf udevrules + return + endif + try + let config_lines = readfile('/etc/udev/udev.conf') + catch /^Vim\%((\a\+)\)\=:E484/ + setf hog + return + endtry + let dir = expand(':p:h') + for line in config_lines + if line =~ s:ft_rules_udev_rules_pattern + let udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', "") + if dir == udev_rules + setf udevrules + endif + break + endif + endfor + setf hog +endfunc + + +" Spec (Linux RPM) +au BufNewFile,BufRead *.spec setf spec + +" Speedup (AspenTech plant simulator) +au BufNewFile,BufRead *.speedup,*.spdata,*.spd setf spup + +" Slice +au BufNewFile,BufRead *.ice setf slice + +" Spice +au BufNewFile,BufRead *.sp,*.spice setf spice + +" Spyce +au BufNewFile,BufRead *.spy,*.spi setf spyce + +" Squid +au BufNewFile,BufRead squid.conf setf squid + +" SQL for Oracle Designer +au BufNewFile,BufRead *.tyb,*.typ,*.tyc,*.pkb,*.pks setf sql + +" SQL +au BufNewFile,BufRead *.sql call s:SQL() + +func! s:SQL() + if exists("g:filetype_sql") + exe "setf " . g:filetype_sql + else + setf sql + endif +endfunc + +" SQLJ +au BufNewFile,BufRead *.sqlj setf sqlj + +" SQR +au BufNewFile,BufRead *.sqr,*.sqi setf sqr + +" OpenSSH configuration +au BufNewFile,BufRead ssh_config,*/.ssh/config setf sshconfig + +" OpenSSH server configuration +au BufNewFile,BufRead sshd_config setf sshdconfig + +" Stata +au BufNewFile,BufRead *.ado,*.class,*.do,*.imata,*.mata setf stata + +" SMCL +au BufNewFile,BufRead *.hlp,*.ihlp,*.smcl setf smcl + +" Stored Procedures +au BufNewFile,BufRead *.stp setf stp + +" Standard ML +au BufNewFile,BufRead *.sml setf sml + +" Sratus VOS command macro +au BufNewFile,BufRead *.cm setf voscm + +" Sysctl +au BufNewFile,BufRead /etc/sysctl.conf setf sysctl + +" Sudoers +au BufNewFile,BufRead /etc/sudoers,sudoers.tmp setf sudoers + +" If the file has an extension of 't' and is in a directory 't' then it is +" almost certainly a Perl test file. +" If the first line starts with '#' and contains 'perl' it's probably a Perl +" file. +" (Slow test) If a file contains a 'use' statement then it is almost certainly +" a Perl file. +func! s:FTperl() + if expand("%:e") == 't' && expand("%:p:h:t") == 't' + setf perl + return 1 + endif + if getline(1)[0] == '#' && getline(1) =~ 'perl' + setf perl + return 1 + endif + if search('^use\s\s*\k', 'nc', 30) + setf perl + return 1 + endif + return 0 +endfunc + +" Tads (or Nroff or Perl test file) +au BufNewFile,BufRead *.t + \ if !s:FTnroff() && !s:FTperl() | setf tads | endif + +" Tags +au BufNewFile,BufRead tags setf tags + +" TAK +au BufNewFile,BufRead *.tak setf tak + +" Tcl (JACL too) +au BufNewFile,BufRead *.tcl,*.tk,*.itcl,*.itk,*.jacl setf tcl + +" TealInfo +au BufNewFile,BufRead *.tli setf tli + +" Telix Salt +au BufNewFile,BufRead *.slt setf tsalt + +" Terminfo +au BufNewFile,BufRead *.ti setf terminfo + +" TeX +au BufNewFile,BufRead *.latex,*.sty,*.dtx,*.ltx,*.bbl setf tex +au BufNewFile,BufRead *.tex call s:FTtex() + +" Choose context, plaintex, or tex (LaTeX) based on these rules: +" 1. Check the first line of the file for "%&". +" 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords. +" 3. Default to "latex" or to g:tex_flavor, can be set in user's vimrc. +func! s:FTtex() + let firstline = getline(1) + if firstline =~ '^%&\s*\a\+' + let format = tolower(matchstr(firstline, '\a\+')) + let format = substitute(format, 'pdf', '', '') + if format == 'tex' + let format = 'plain' + endif + else + " Default value, may be changed later: + let format = exists("g:tex_flavor") ? g:tex_flavor : 'plain' + " Save position, go to the top of the file, find first non-comment line. + let save_cursor = getpos('.') + call cursor(1,1) + let firstNC = search('^\s*[^[:space:]%]', 'c', 1000) + if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword. + let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>' + let cpat = 'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>' + let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)', + \ 'cnp', firstNC + 1000) + if kwline == 1 " lpat matched + let format = 'latex' + elseif kwline == 2 " cpat matched + let format = 'context' + endif " If neither matched, keep default set above. + " let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000) + " let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000) + " if cline > 0 + " let format = 'context' + " endif + " if lline > 0 && (cline == 0 || cline > lline) + " let format = 'tex' + " endif + endif " firstNC + call setpos('.', save_cursor) + endif " firstline =~ '^%&\s*\a\+' + + " Translation from formats to file types. TODO: add AMSTeX, RevTex, others? + if format == 'plain' + setf plaintex + elseif format == 'context' + setf context + else " probably LaTeX + setf tex + endif + return +endfunc + +" ConTeXt +au BufNewFile,BufRead tex/context/*/*.tex,*.mkii,*.mkiv setf context + +" Texinfo +au BufNewFile,BufRead *.texinfo,*.texi,*.txi setf texinfo + +" TeX configuration +au BufNewFile,BufRead texmf.cnf setf texmf + +" Tidy config +au BufNewFile,BufRead .tidyrc,tidyrc setf tidy + +" TF mud client +au BufNewFile,BufRead *.tf,.tfrc,tfrc setf tf + +" TPP - Text Presentation Program +au BufNewFile,BufReadPost *.tpp setf tpp + +" Trustees +au BufNewFile,BufRead trustees.conf setf trustees + +" TSS - Geometry +au BufNewFile,BufReadPost *.tssgm setf tssgm + +" TSS - Optics +au BufNewFile,BufReadPost *.tssop setf tssop + +" TSS - Command Line (temporary) +au BufNewFile,BufReadPost *.tsscl setf tsscl + +" Motif UIT/UIL files +au BufNewFile,BufRead *.uit,*.uil setf uil + +" Udev conf +au BufNewFile,BufRead /etc/udev/udev.conf setf udevconf + +" Udev permissions +au BufNewFile,BufRead /etc/udev/permissions.d/*.permissions setf udevperm +" +" Udev symlinks config +au BufNewFile,BufRead /etc/udev/cdsymlinks.conf setf sh + +" UnrealScript +au BufNewFile,BufRead *.uc setf uc + +" Updatedb +au BufNewFile,BufRead /etc/updatedb.conf setf updatedb + +" Vera +au BufNewFile,BufRead *.vr,*.vri,*.vrh setf vera + +" Verilog HDL +au BufNewFile,BufRead *.v setf verilog + +" Verilog-AMS HDL +au BufNewFile,BufRead *.va,*.vams setf verilogams + +" VHDL +au BufNewFile,BufRead *.hdl,*.vhd,*.vhdl,*.vbe,*.vst setf vhdl +au BufNewFile,BufRead *.vhdl_[0-9]* call s:StarSetf('vhdl') + +" Vim script +au BufNewFile,BufRead *.vim,*.vba,.exrc,_exrc setf vim + +" Viminfo file +au BufNewFile,BufRead .viminfo,_viminfo setf viminfo + +" Virata Config Script File or Drupal module +au BufRead,BufNewFile *.hw,*.module,*.pkg + \ if getline(1) =~ '' | + \ let b:xf86c_xfree86_version = 3 | + \ endif | + \ setf xf86conf + +" Xorg config +au BufNewFile,BufRead xorg.conf,xorg.conf-4 let b:xf86c_xfree86_version = 4 | setf xf86conf + +" Xinetd conf +au BufNewFile,BufRead /etc/xinetd.conf setf xinetd + +" XS Perl extension interface language +au BufNewFile,BufRead *.xs setf xs + +" X resources file +au BufNewFile,BufRead .Xdefaults,.Xpdefaults,.Xresources,xdm-config,*.ad setf xdefaults + +" Xmath +au BufNewFile,BufRead *.msc,*.msf setf xmath +au BufNewFile,BufRead *.ms + \ if !s:FTnroff() | setf xmath | endif + +" XML specific variants: docbk and xbl +au BufNewFile,BufRead *.xml call s:FTxml() + +func! s:FTxml() + let n = 1 + while n < 100 && n < line("$") + let line = getline(n) + if line =~ '\)' && getline(n) !~ '^\s*#\s*include' + setf racc + return + endif + let n = n + 1 + endwhile + setf yacc +endfunc + + +" Yaml +au BufNewFile,BufRead *.yaml,*.yml setf yaml + +" Zope +" dtml (zope dynamic template markup language), pt (zope page template), +" cpt (zope form controller page template) +au BufNewFile,BufRead *.dtml,*.pt,*.cpt call s:FThtml() +" zsql (zope sql method) +au BufNewFile,BufRead *.zsql call s:SQL() + +" Z80 assembler asz80 +au BufNewFile,BufRead *.z8a setf z8a + +augroup END + + +" Source the user-specified filetype file, for backwards compatibility with +" Vim 5.x. +if exists("myfiletypefile") && filereadable(expand(myfiletypefile)) + execute "source " . myfiletypefile +endif + + +" Check for "*" after loading myfiletypefile, so that scripts.vim is only used +" when there are no matching file name extensions. +" Don't do this for compressed files. +augroup filetypedetect +au BufNewFile,BufRead * + \ if !did_filetype() && expand("") !~ g:ft_ignore_pat + \ | runtime! scripts.vim | endif +au StdinReadPost * if !did_filetype() | runtime! scripts.vim | endif + + +" Extra checks for when no filetype has been detected now. Mostly used for +" patterns that end in "*". E.g., "zsh*" matches "zsh.vim", but that's a Vim +" script file. +" Most of these should call s:StarSetf() to avoid names ending in .gz and the +" like are used. + +" More Apache files. +au BufNewFile,BufRead /etc/apache2/conf.*/*,/etc/apache2/sites-*/*,/etc/apache2/mods-*/* call s:StarSetf('apache') + +" Asterisk config file +au BufNewFile,BufRead *asterisk/*.conf* call s:StarSetf('asterisk') +au BufNewFile,BufRead *asterisk*/*voicemail.conf* call s:StarSetf('asteriskvm') + +" Bazaar version control +au BufNewFile,BufRead bzr_log.* setf bzr + +" BIND zone +au BufNewFile,BufRead */named/db.*,*/bind/db.* call s:StarSetf('bindzone') + +" Changelog +au BufNewFile,BufRead [cC]hange[lL]og* + \ if getline(1) =~ '; urgency=' + \| call s:StarSetf('debchangelog') + \|else + \| call s:StarSetf('changelog') + \|endif + +" Crontab +au BufNewFile,BufRead crontab,crontab.*,/etc/cron.d/* call s:StarSetf('crontab') + +" Debian Sources.list +au BufNewFile,BufRead /etc/apt/sources.list.d/* call s:StarSetf('debsources') + +" Dracula +au BufNewFile,BufRead drac.* call s:StarSetf('dracula') + +" Fvwm +au BufNewFile,BufRead */.fvwm/* call s:StarSetf('fvwm') +au BufNewFile,BufRead *fvwmrc*,*fvwm95*.hook + \ let b:fvwm_version = 1 | call s:StarSetf('fvwm') +au BufNewFile,BufRead *fvwm2rc* + \ if expand(":e") == "m4" + \| call s:StarSetf('fvwm2m4') + \|else + \| let b:fvwm_version = 2 | call s:StarSetf('fvwm') + \|endif + +" GTK RC +au BufNewFile,BufRead .gtkrc*,gtkrc* call s:StarSetf('gtkrc') + +" Jam +au BufNewFile,BufRead Prl*.*,JAM*.* call s:StarSetf('jam') + +" Jargon +au! BufNewFile,BufRead *jarg* + \ if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'THIS IS THE JARGON FILE' + \| call s:StarSetf('jargon') + \|endif + +" Kconfig +au BufNewFile,BufRead Kconfig.* call s:StarSetf('kconfig') + +" Makefile +au BufNewFile,BufRead [mM]akefile* call s:StarSetf('make') + +" Ruby Makefile +au BufNewFile,BufRead [rR]akefile* call s:StarSetf('ruby') + +" Mail (also matches muttrc.vim, so this is below the other checks) +au BufNewFile,BufRead mutt[[:alnum:]._-]\{6\} setf mail + +" Modconf +au BufNewFile,BufRead /etc/modprobe.* call s:StarSetf('modconf') + +" Mutt setup file +au BufNewFile,BufRead .mutt{ng,}rc*,*/.mutt{ng,}/mutt{ng,}rc* call s:StarSetf('muttrc') +au BufNewFile,BufRead mutt{ng,}rc*,Mutt{ng,}rc* call s:StarSetf('muttrc') + +" Nroff macros +au BufNewFile,BufRead tmac.* call s:StarSetf('nroff') + +" Pam conf +au BufNewFile,BufRead /etc/pam.d/* call s:StarSetf('pamconf') + +" Printcap and Termcap +au BufNewFile,BufRead *printcap* + \ if !did_filetype() + \| let b:ptcap_type = "print" | call s:StarSetf('ptcap') + \|endif +au BufNewFile,BufRead *termcap* + \ if !did_filetype() + \| let b:ptcap_type = "term" | call s:StarSetf('ptcap') + \|endif + +" Vim script +au BufNewFile,BufRead *vimrc* call s:StarSetf('vim') + +" Subversion commit file +au BufNewFile,BufRead svn-commit*.tmp setf svn + +" X resources file +au BufNewFile,BufRead Xresources*,*/app-defaults/*,*/Xresources/* call s:StarSetf('xdefaults') + +" XFree86 config +au BufNewFile,BufRead XF86Config-4* + \ let b:xf86c_xfree86_version = 4 | call s:StarSetf('xf86conf') +au BufNewFile,BufRead XF86Config* + \ if getline(1) =~ '\' + \| let b:xf86c_xfree86_version = 3 + \|endif + \|call s:StarSetf('xf86conf') + +" X11 xmodmap +au BufNewFile,BufRead *xmodmap* call s:StarSetf('xmodmap') + +" Xinetd conf +au BufNewFile,BufRead /etc/xinetd.d/* call s:StarSetf('xinetd') + +" Z-Shell script +au BufNewFile,BufRead zsh*,zlog* call s:StarSetf('zsh') + + +" Generic configuration file (check this last, it's just guessing!) +au BufNewFile,BufRead,StdinReadPost * + \ if !did_filetype() && expand("") !~ g:ft_ignore_pat + \ && (getline(1) =~ '^#' || getline(2) =~ '^#' || getline(3) =~ '^#' + \ || getline(4) =~ '^#' || getline(5) =~ '^#') | + \ setf conf | + \ endif + +" Use the plugin-filetype checks last, they may overrule any of the previously +" detected filetypes. +runtime! ftdetect/*.vim + +augroup END + + +" If the GUI is already running, may still need to install the Syntax menu. +" Don't do it when the 'M' flag is included in 'guioptions'. +if has("menu") && has("gui_running") + \ && !exists("did_install_syntax_menu") && &guioptions !~# "M" + source :p:h/menu.vim +endif + +" Function called for testing all functions defined here. These are +" script-local, thus need to be executed here. +" Returns a string with error messages (hopefully empty). +func! TestFiletypeFuncs(testlist) + let output = '' + for f in a:testlist + try + exe f + catch + let output = output . "\n" . f . ": " . v:exception + endtry + endfor + return output +endfunc + +" Restore 'cpoptions' +let &cpo = s:cpo_save +unlet s:cpo_save diff --git a/gzip.vim b/gzip.vim new file mode 100644 index 00000000..65602387 --- /dev/null +++ b/gzip.vim @@ -0,0 +1,36 @@ +" Vim plugin for editing compressed files. +" Maintainer: Bram Moolenaar +" Last Change: 2005 Jul 26 + +" Exit quickly when: +" - this plugin was already loaded +" - when 'compatible' is set +" - some autocommands are already taking care of compressed files +if exists("loaded_gzip") || &cp || exists("#BufReadPre#*.gz") + finish +endif +let loaded_gzip = 1 + +augroup gzip + " Remove all gzip autocommands + au! + + " Enable editing of gzipped files. + " The functions are defined in autoload/gzip.vim. + " + " Set binary mode before reading the file. + " Use "gzip -d", gunzip isn't always available. + autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z setlocal bin + autocmd BufReadPost,FileReadPost *.gz call gzip#read("gzip -dn") + autocmd BufReadPost,FileReadPost *.bz2 call gzip#read("bzip2 -d") + autocmd BufReadPost,FileReadPost *.Z call gzip#read("uncompress") + autocmd BufWritePost,FileWritePost *.gz call gzip#write("gzip") + autocmd BufWritePost,FileWritePost *.bz2 call gzip#write("bzip2") + autocmd BufWritePost,FileWritePost *.Z call gzip#write("compress -f") + autocmd FileAppendPre *.gz call gzip#appre("gzip -dn") + autocmd FileAppendPre *.bz2 call gzip#appre("bzip2 -d") + autocmd FileAppendPre *.Z call gzip#appre("uncompress") + autocmd FileAppendPost *.gz call gzip#write("gzip") + autocmd FileAppendPost *.bz2 call gzip#write("bzip2") + autocmd FileAppendPost *.Z call gzip#write("compress -f") +augroup END diff --git a/netrw.vim b/netrw.vim new file mode 100644 index 00000000..7b688659 --- /dev/null +++ b/netrw.vim @@ -0,0 +1,8011 @@ +" netrw.vim: Handles file transfer and remote directory listing across +" AUTOLOAD SECTION +" Date: Oct 23, 2008 +" Version: 134 +" Maintainer: Charles E Campbell, Jr +" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim +" Copyright: Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1 +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided +" *as is* and come with no warranty of any kind, either +" expressed or implied. By using this plugin, you agree that +" in no event will the copyright holder be liable for any damages +" resulting from the use of this software. +"redraw!|call DechoSep()|call inputsave()|call input("Press to continue")|call inputrestore() +" +" But be doers of the Word, and not only hearers, deluding your own selves {{{1 +" (James 1:22 RSV) +" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +" Load Once: {{{1 +if &cp || exists("g:loaded_netrw") + finish +endif +let g:loaded_netrw = "v134" +if v:version < 702 + echohl WarningMsg + echo "***warning*** this version of netrw needs vim 7.2" + echohl Normal + finish +endif +if !exists("s:NOTE") + let s:NOTE = 0 + let s:WARNING = 1 + let s:ERROR = 2 +endif + +" sanity checks +if v:version < 700 + call netrw#ErrorMsg(s:WARNING,"you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw",1) + finish +endif + +let s:keepcpo= &cpo +setlocal cpo&vim +"DechoTabOn +"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw) + +" ====================== +" Netrw Variables: {{{1 +" ====================== + +" --------------------------------------------------------------------- +" Netrw Constants: {{{2 +if !exists("g:netrw_dirhist_cnt") + let g:netrw_dirhist_cnt= 0 +endif +if !exists("s:LONGLIST") + let s:THINLIST = 0 + let s:LONGLIST = 1 + let s:WIDELIST = 2 + let s:TREELIST = 3 + let s:MAXLIST = 4 +endif + +" --------------------------------------------------------------------- +" Default values for netrw's global protocol variables {{{2 +if !exists("g:netrw_dav_cmd") + if executable("cadaver") + let g:netrw_dav_cmd = "cadaver" + elseif executable("curl") + let g:netrw_dav_cmd = "curl" + else + let g:netrw_dav_cmd = "" + endif +endif +if !exists("g:netrw_fetch_cmd") + if executable("fetch") + let g:netrw_fetch_cmd = "fetch -o" + else + let g:netrw_fetch_cmd = "" + endif +endif +if !exists("g:netrw_ftp_cmd") + let g:netrw_ftp_cmd = "ftp" +endif +if !exists("g:netrw_http_cmd") + if executable("elinks") + let g:netrw_http_cmd = "elinks" + if !exists("g:netrw_http_xcmd") + let g:netrw_http_xcmd= "-dump >" + endif + elseif executable("links") + let g:netrw_http_cmd = "links" + if !exists("g:netrw_http_xcmd") + let g:netrw_http_xcmd= "-dump >" + endif + elseif executable("curl") + let g:netrw_http_cmd = "curl" + if !exists("g:netrw_http_xcmd") + let g:netrw_http_xcmd= "-o" + endif + elseif executable("wget") + let g:netrw_http_cmd = "wget" + if !exists("g:netrw_http_xcmd") + let g:netrw_http_xcmd= "-q -O" + endif + elseif executable("fetch") + let g:netrw_http_cmd = "fetch" + if !exists("g:netrw_http_xcmd") + let g:netrw_http_xcmd= "-o" + endif + else + let g:netrw_http_cmd = "" + endif +endif +if !exists("g:netrw_rcp_cmd") + let g:netrw_rcp_cmd = "rcp" +endif +if !exists("g:netrw_rsync_cmd") + let g:netrw_rsync_cmd = "rsync" +endif +if !exists("g:netrw_scp_cmd") + let g:netrw_scp_cmd = "scp -q" +endif +if !exists("g:netrw_sftp_cmd") + let g:netrw_sftp_cmd = "sftp" +endif +if !exists("g:netrw_ssh_cmd") + let g:netrw_ssh_cmd= "ssh" +endif + +if (has("win32") || has("win95") || has("win64") || has("win16")) + \ && exists("g:netrw_use_nt_rcp") + \ && g:netrw_use_nt_rcp + \ && executable( $SystemRoot .'/system32/rcp.exe') + let s:netrw_has_nt_rcp = 1 + let s:netrw_rcpmode = '-b' +else + let s:netrw_has_nt_rcp = 0 + let s:netrw_rcpmode = '' +endif + +" --------------------------------------------------------------------- +" Default values for netrw's global variables {{{2 +" Cygwin Detection ------- {{{3 +if !exists("g:netrw_cygwin") + if has("win32") || has("win95") || has("win64") || has("win16") + if &shell =~ '\%(\\|\\)\%(\.exe\)\=$' + let g:netrw_cygwin= 1 + else + let g:netrw_cygwin= 0 + endif + else + let g:netrw_cygwin= 0 + endif +endif +" Default values - a-c ---------- {{{3 +if !exists("g:netrw_alto") + let g:netrw_alto= &sb +endif +if !exists("g:netrw_altv") + let g:netrw_altv= &spr +endif +if !exists("g:netrw_browse_split") + let g:netrw_browse_split= 0 +endif +if !exists("g:netrw_chgwin") + let g:netrw_chgwin = -1 +endif +if !exists("g:netrw_compress") + let g:netrw_compress= "gzip" +endif +if !exists("g:netrw_ctags") + let g:netrw_ctags= "ctags" +endif +if !exists("g:netrw_cursorline") + let g:netrw_cursorline= 1 + let s:netrw_usercul = &cursorline + let s:netrw_usercuc = &cursorcolumn +endif +" Default values - d-g ---------- {{{3 +if !exists("g:netrw_dirhist_cnt") + let g:netrw_dirhist_cnt= 0 +endif +if !exists("g:netrw_decompress") + let g:netrw_decompress= { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"} +endif +if !exists("g:netrw_dirhistmax") + let g:netrw_dirhistmax= 10 +endif +if !exists("g:netrw_fastbrowse") + let g:netrw_fastbrowse= 1 +endif +if !exists("g:netrw_ftp_browse_reject") + let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$' +endif +if !exists("g:netrw_ftp_list_cmd") + if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin) + let g:netrw_ftp_list_cmd = "ls -lF" + let g:netrw_ftp_timelist_cmd = "ls -tlF" + let g:netrw_ftp_sizelist_cmd = "ls -slF" + else + let g:netrw_ftp_list_cmd = "dir" + let g:netrw_ftp_timelist_cmd = "dir" + let g:netrw_ftp_sizelist_cmd = "dir" + endif +endif +if !exists("g:netrw_ftpmode") + let g:netrw_ftpmode= "binary" +endif +" Default values - h-lh ---------- {{{3 +if !exists("g:netrw_hide") + let g:netrw_hide= 1 +endif +if !exists("g:netrw_ignorenetrc") + if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$' + let g:netrw_ignorenetrc= 1 + else + let g:netrw_ignorenetrc= 0 + endif +endif +if !exists("g:netrw_keepdir") + let g:netrw_keepdir= 1 +endif +if !exists("g:netrw_list_cmd") + if g:netrw_scp_cmd =~ '^pscp' && executable("pscp") + " provide a 'pscp' listing command + if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk") + let g:netrw_scp_cmd ="pscp -i C:\\private.ppk" + endif + let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:" + elseif executable(g:netrw_ssh_cmd) + " provide a default listing command + let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa" + else +" call Decho(g:netrw_ssh_cmd." is not executable") + let g:netrw_list_cmd= "" + endif +endif +if !exists("g:netrw_list_hide") + let g:netrw_list_hide= "" +endif +" Default values - lh-lz ---------- {{{3 +if !exists("g:netrw_localcopycmd") + if has("win32") || has("win95") || has("win64") || has("win16") + if g:netrw_cygwin + let g:netrw_localcopycmd= "cp" + else + let g:netrw_localcopycmd= "copy" + endif + elseif has("unix") || has("macunix") + let g:netrw_localcopycmd= "cp" + else + let g:netrw_localcopycmd= "" + endif +endif +if !exists("g:netrw_local_mkdir") + let g:netrw_local_mkdir= "mkdir" +endif +if !exists("g:netrw_localmovecmd") + if has("win32") || has("win95") || has("win64") || has("win16") + if g:netrw_cygwin + let g:netrw_localmovecmd= "mv" + else + let g:netrw_localmovecmd= "move" + endif + elseif has("unix") || has("macunix") + let g:netrw_localmovecmd= "mv" + else + let g:netrw_localmovecmd= "" + endif +endif +if !exists("g:netrw_local_rmdir") + let g:netrw_local_rmdir= "rmdir" +endif +if !exists("g:netrw_liststyle") + let g:netrw_liststyle= s:THINLIST +endif +if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST + " sanity check + let g:netrw_liststyle= s:THINLIST +endif +if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp' + let g:netrw_list_cmd= g:netrw_list_cmd." -l" +endif +" Default values - m-r ---------- {{{3 +if !exists("g:netrw_markfileesc") + let g:netrw_markfileesc= '*./[\~' +endif +if !exists("g:netrw_maxfilenamelen") + let g:netrw_maxfilenamelen= 32 +endif +if !exists("g:netrw_menu") + let g:netrw_menu= 1 +endif +if !exists("g:netrw_mkdir_cmd") + let g:netrw_mkdir_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir" +endif +if !exists("g:netrw_mousemaps") + if exists("&mouse") && &mouse =~ '[anh]' + let g:netrw_mousemaps= 1 + else + let g:netrw_mousemaps= 0 + endif +endif +if !exists("g:netrw_retmap") + let g:netrw_retmap= 0 +endif +if !exists("g:netrw_preview") + let g:netrw_preview= 0 +endif +if !exists("g:netrw_scpport") + let g:netrw_scpport= "-P" +endif +if !exists("g:netrw_sshport") + let g:netrw_sshport= "-p" +endif +if !exists("g:netrw_rename_cmd") + let g:netrw_rename_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mv" +endif +if !exists("g:netrw_rm_cmd") + let g:netrw_rm_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm" +endif +if !exists("g:netrw_rmdir_cmd") + let g:netrw_rmdir_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir" +endif +if !exists("g:netrw_rmf_cmd") + let g:netrw_rmf_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f" +endif +" Default values - s ---------- {{{3 + " set up shell quoting character +if exists("g:netrw_silent") && g:netrw_silent != 0 + let s:netrw_silentxfer= "silent " +else + let s:netrw_silentxfer= "" +endif +if !exists("g:netrw_sort_by") + " alternatives: date size + let g:netrw_sort_by= "name" +endif +if !exists("g:netrw_sort_options") + let g:netrw_sort_options= "" +endif +if !exists("g:netrw_sort_direction") + " alternative: reverse (z y x ...) + let g:netrw_sort_direction= "normal" +endif +if !exists("g:netrw_sort_sequence") + let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$' +endif +if !exists("g:netrw_special_syntax") + let g:netrw_special_syntax= 0 +endif +if !exists("g:netrw_ssh_browse_reject") + let g:netrw_ssh_browse_reject='^total\s\+\d\+$' +endif +if !has("patch192") + if !exists("g:netrw_use_noswf") + let g:netrw_use_noswf= 1 + endif +else + let g:netrw_use_noswf= 0 +endif +" Default values - t-w ---------- {{{3 +if !exists("g:netrw_timefmt") + let g:netrw_timefmt= "%c" +endif +if !exists("g:netrw_xstrlen") + let g:netrw_xstrlen= 1 +endif +if !exists("g:NetrwTopLvlMenu") + let g:NetrwTopLvlMenu= "Netrw." +endif +if !exists("g:netrw_use_errorwindow") + let g:netrw_use_errorwindow= 1 +endif +if !exists("g:netrw_win95ftp") + let g:netrw_win95ftp= 1 +endif +if !exists("g:netrw_winsize") + let g:netrw_winsize= "" +endif +" --------------------------------------------------------------------- +" Default values for netrw's script variables: {{{2 +if !exists("g:netrw_fname_escape") + let g:netrw_fname_escape= ' ?&;%' +endif +if !exists("g:netrw_glob_escape") + let g:netrw_glob_escape= '[]*?`{~$' +endif +if !exists("g:netrw_tmpfile_escape") + let g:netrw_tmpfile_escape= ' &;' +endif +let s:netrw_map_escape = "<|\n\r\\\\"" + +" BufEnter event ignored by decho when following variable is true +" Has a side effect that doau BufReadPost doesn't work, so +" files read by network transfer aren't appropriately highlighted. +"let g:decho_bufenter = 1 "Decho + +" ============================== +" Netrw Utility Functions: {{{1 +" ============================== + +" ------------------------------------------------------------------------ +" s:NetrwOptionSave: save options and set to "standard" form {{{2 +" 06/08/07 : removed call to NetrwSafeOptions(), either placed +" immediately after NetrwOptionSave() calls in NetRead +" and NetWrite, or after the s:NetrwEnew() call in +" NetrwBrowse. +" vt: normally its "w:" or "s:" (a variable type) +fun! s:NetrwOptionSave(vt) +" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">") + +" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist")) + if !exists("{a:vt}netrw_optionsave") + let {a:vt}netrw_optionsave= 1 + else +" call Dret("s:NetrwOptionSave : options already saved") + return + endif +" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")) + + " Save current settings and current directory + let s:yykeep = @@ + if exists("&l:acd") + let {a:vt}netrw_acdkeep = &l:acd + endif + let {a:vt}netrw_aikeep = &l:ai + let {a:vt}netrw_awkeep = &l:aw + let {a:vt}netrw_cikeep = &l:ci + let {a:vt}netrw_cinkeep = &l:cin + let {a:vt}netrw_cinokeep = &l:cino + let {a:vt}netrw_comkeep = &l:com + let {a:vt}netrw_cpokeep = &l:cpo + if g:netrw_keepdir + let {a:vt}netrw_dirkeep = getcwd() + endif + let {a:vt}netrw_fokeep = &l:fo " formatoptions + let {a:vt}netrw_gdkeep = &l:gd " gdefault + let {a:vt}netrw_hidkeep = &l:hidden + let {a:vt}netrw_magickeep = &l:magic + let {a:vt}netrw_repkeep = &l:report + let {a:vt}netrw_spellkeep = &l:spell + let {a:vt}netrw_twkeep = &l:tw " textwidth + let {a:vt}netrw_wigkeep = &l:wig " wildignore + if has("win32") && !has("win95") + let {a:vt}netrw_swfkeep = &l:swf " swapfile + endif + if &go =~ 'a' | silent! let {a:vt}netrw_regstar = @* | endif + silent! let {a:vt}netrw_regslash= @/ + +" call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%")) +endfun + +" ------------------------------------------------------------------------ +" s:NetrwOptionRestore: restore options {{{2 +fun! s:NetrwOptionRestore(vt) +" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")) + if !exists("{a:vt}netrw_optionsave") +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist") + return + endif + unlet {a:vt}netrw_optionsave + + if exists("&acd") + if exists("{a:vt}netrw_acdkeep") +" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) + let curdir = getcwd() + let &l:acd = {a:vt}netrw_acdkeep + unlet {a:vt}netrw_acdkeep + if &l:acd +" call Decho("exe keepjumps lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason + try + if !exists("&l:acd") && !&l:acd + exe 'keepjumps lcd '.fnameescape(curdir) + endif + catch /^Vim\%((\a\+)\)\=:E472/ + call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61) + endtry + endif + endif + endif + if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif + if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif + if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif + if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif + if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif + if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif + if exists("{a:vt}netrw_cpokeep") |let &l:cpo = {a:vt}netrw_cpokeep |unlet {a:vt}netrw_cpokeep |endif + if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir + let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g') + if exists("{a:vt}netrw_dirkeep") |exe "keepjumps lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif + endif + if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif + if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif + if exists("{a:vt}netrw_hidkeep") |let &l:hidden = {a:vt}netrw_hidkeep |unlet {a:vt}netrw_hidkeep |endif + if exists("{a:vt}netrw_magic") |let &l:magic = {a:vt}netrw_magic |unlet {a:vt}netrw_magic |endif + if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif + if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif + if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif + if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif + if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif + if exists("{a:vt}netrw_swfkeep") + if &directory == "" + " user hasn't specified a swapfile directory; + " netrw will temporarily set the swapfile directory + " to the current directory as returned by getcwd(). + let &l:directory = getcwd() + silent! let &l:swf = {a:vt}netrw_swfkeep + setlocal directory= + unlet {a:vt}netrw_swfkeep + elseif &l:swf != {a:vt}netrw_swfkeep + " following line causes a Press ENTER in windows -- can't seem to work around it!!! + silent! let &l:swf= {a:vt}netrw_swfkeep + unlet {a:vt}netrw_swfkeep + endif + endif + if exists("{a:vt}netrw_regstar") |silent! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif + if exists("{a:vt}netrw_regslash")|silent! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif + +" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) +" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")) +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%")) +endfun + +" --------------------------------------------------------------------- +" s:NetrwSafeOptions: sets options to help netrw do its job {{{2 +fun! s:NetrwSafeOptions() +" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">") +" call Decho("window's ft=".&ft) + setlocal cino= + setlocal com= + setlocal cpo-=aA + if exists("&acd") | setlocal noacd | endif + setlocal nocin noai noci magic nospell nohid wig= noaw + setlocal fo=nroql2 + setlocal tw=0 + setlocal report=10000 + setlocal isk+=@ isk+=* isk+=/ + if g:netrw_use_noswf && has("win32") && !has("win95") + setlocal noswf + endif +" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")) +" call Dret("s:NetrwSafeOptions") +endfun + +" --------------------------------------------------------------------- +" netrw#NetrwClean: remove netrw {{{2 +" supports :NetrwClean -- remove netrw from first directory on runtimepath +" :NetrwClean! -- remove netrw from all directories on runtimepath +fun! netrw#NetrwClean(sys) +" call Dfunc("netrw#NetrwClean(sys=".a:sys.")") + + if a:sys + let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No") + else + let choice= confirm("Remove personal copy of netrw?","&Yes\n&No") + endif +" call Decho("choice=".choice) + let diddel= 0 + let diddir= "" + + if choice == 1 + for dir in split(&rtp,',') + if filereadable(dir."/plugin/netrwPlugin.vim") +" call Decho("removing netrw-related files from ".dir) + if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif + if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif + if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif + if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif + if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif + if s:NetrwDelete(dir."/syntax/netrwlist.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55) |endif + let diddir= dir + let diddel= diddel + 1 + if !a:sys|break|endif + endif + endfor + endif + + echohl WarningMsg + if diddel == 0 + echomsg "netrw is either not installed or not removable" + elseif diddel == 1 + echomsg "removed one copy of netrw from <".diddir.">" + else + echomsg "removed ".diddel." copies of netrw" + endif + echohl None + +" call Dret("netrw#NetrwClean") +endfun + +" ------------------------------------------------------------------------ +" Netrw Transfer Functions: {{{1 +" =============================== + +" ------------------------------------------------------------------------ +" netrw#NetRead: responsible for reading a file over the net {{{2 +" mode: =0 read remote file and insert before current line +" =1 read remote file and insert after current line +" =2 replace with remote file +" =3 obtain file, but leave in temporary format +fun! netrw#NetRead(mode,...) +" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw) + + " save options {{{3 + call s:NetrwOptionSave("w:") + call s:NetrwSafeOptions() + + " interpret mode into a readcmd {{{3 + if a:mode == 0 " read remote file before current line + let readcmd = "0r" + elseif a:mode == 1 " read file after current line + let readcmd = "r" + elseif a:mode == 2 " replace with remote file + let readcmd = "%r" + elseif a:mode == 3 " skip read of file (leave as temporary) + let readcmd = "t" + else + exe a:mode + let readcmd = "r" + endif + let ichoice = (a:0 == 0)? 0 : 1 +" call Decho("readcmd<".readcmd."> ichoice=".ichoice) + + " Get Temporary Filename {{{3 + let tmpfile= s:GetTempfile("") + if tmpfile == "" +" call Dret("netrw#NetRead : unable to get a tempfile!") + return + endif + + while ichoice <= a:0 + + " attempt to repeat with previous host-file-etc + if exists("b:netrw_lastfile") && a:0 == 0 +" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") + let choice = b:netrw_lastfile + let ichoice= ichoice + 1 + + else + exe "let choice= a:" . ichoice +" call Decho("no lastfile: choice<" . choice . ">") + + if match(choice,"?") == 0 + " give help + echomsg 'NetRead Usage:' + echomsg ':Nread machine:path uses rcp' + echomsg ':Nread "machine path" uses ftp with <.netrc>' + echomsg ':Nread "machine id password path" uses ftp' + echomsg ':Nread dav://machine[:port]/path uses cadaver' + echomsg ':Nread fetch://machine/path uses fetch' + echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>' + echomsg ':Nread http://[user@]machine/path uses http wget' + echomsg ':Nread rcp://[user@]machine/path uses rcp' + echomsg ':Nread rsync://machine[:port]/path uses rsync' + echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp' + echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp' + sleep 4 + break + + elseif match(choice,'^"') != -1 + " Reconstruct Choice if choice starts with '"' +" call Decho("reconstructing choice") + if match(choice,'"$') != -1 + " case "..." + let choice=strpart(choice,1,strlen(choice)-2) + else + " case "... ... ..." + let choice = strpart(choice,1,strlen(choice)-1) + let wholechoice = "" + + while match(choice,'"$') == -1 + let wholechoice = wholechoice . " " . choice + let ichoice = ichoice + 1 + if ichoice > a:0 + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3) + endif +" call Dret("netrw#NetRead :2 getcwd<".getcwd().">") + return + endif + let choice= a:{ichoice} + endwhile + let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1) + endif + endif + endif + +" call Decho("choice<" . choice . ">") + let ichoice= ichoice + 1 + + " Determine method of read (ftp, rcp, etc) {{{3 + call s:NetrwMethod(choice) + if !exists("b:netrw_method") || b:netrw_method < 0 +" call Dfunc("netrw#NetRead : unsupported method") + return + endif + let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix + + " Check if NetrwBrowse() should be handling this request +" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">") + if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^http://' +" call Decho("yes, choice matches '^.*[\/]$'") + keepjumps call s:NetrwBrowse(0,choice) +" call Dret("netrw#NetRead :3 getcwd<".getcwd().">") + return + endif + + " ============ + " Perform Protocol-Based Read {{{3 + " =========================== + if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 + echo "(netrw) Processing your read request..." + endif + + "......................................... + " rcp: NetRead Method #1 {{{3 + if b:netrw_method == 1 " read with rcp +" call Decho("read via rcp (method #1)") + " ER: nothing done with g:netrw_uid yet? + " ER: on Win2K" rcp machine[.user]:file tmpfile + " ER: if machine contains '.' adding .user is required (use $USERNAME) + " ER: the tmpfile is full path: rcp sees C:\... as host C + if s:netrw_has_nt_rcp == 1 + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_machine .'.'. g:netrw_uid + else + " Any way needed it machine contains a '.' + let uid_machine = g:netrw_machine .'.'. $USERNAME + endif + else + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif + endif +" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " ftp + <.netrc>: NetRead Method #2 {{{3 + elseif b:netrw_method == 2 " read with ftp + <.netrc> +" call Decho("read via ftp+.netrc (method #2)") + let netrw_fname= b:netrw_fname + call s:SaveBufVars()|new|call s:RestoreBufVars() + let filtbuf= bufnr("%") + setlocal ff=unix + put =g:netrw_ftpmode +" call Decho("filter input: ".getline(line("$"))) + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline(line("$"))) + endif + call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile) +" call Decho("filter input: ".getline(line("$"))) + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1) + else +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' + let debugkeep = &debug + setlocal debug=msg + call netrw#ErrorMsg(s:ERROR,getline(1),4) + let &debug = debugkeep + endif + call s:SaveBufVars() + bd! + if bufname("%") == "" && getline("$") == "" && line('$') == 1 + " needed when one sources a file in a nolbl setting window via ftp + q! + endif + call s:RestoreBufVars() + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3 + elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname + " Construct execution string (four lines) which will be passed through filter +" call Decho("read via ftp+mipf (method #3)") + let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) + call s:SaveBufVars()|new|call s:RestoreBufVars() + let filtbuf= bufnr("%") + setlocal ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port +" call Decho("filter input: ".getline('.')) + else + put ='open '.g:netrw_machine +" call Decho("filter input: ".getline('.')) + endif + + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid +" call Decho("filter input: ".getline('.')) + put ='\"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('.')) + else + put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('.')) + endif + + if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" + put =g:netrw_ftpmode +" call Decho("filter input: ".getline('.')) + endif + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('.')) + endif + put ='get \"'.netrw_fname.'\" '.tmpfile +" call Decho("filter input: ".getline('.')) + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password + norm! 1Gdd +" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" +" call Decho("error<".getline(1).">") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,getline(1),5) + endif + endif + call s:SaveBufVars()|bd!|call s:RestoreBufVars() + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " scp: NetRead Method #4 {{{3 + elseif b:netrw_method == 4 " read with scp +" call Decho("read via scp (method #4)") + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " ".g:netrw_scpport." ".g:netrw_port + else + let useport= "" + endif +" call Decho("exe s:netrw_silentxfer.!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " http: NetRead Method #5 (wget) {{{3 + elseif b:netrw_method == 5 +" call Decho("read via http (method #5)") + if g:netrw_http_cmd == "" + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6) + endif +" call Dret("netrw#NetRead :4 getcwd<".getcwd().">") + return + endif + + if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd") + " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch) +" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)") + if exists("g:netrw_http_xcmd") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1) + else +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1) + endif + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + + else + " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker) +" call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)") + let netrw_html= substitute(b:netrw_fname,"#.*$","","") + let netrw_tag = substitute(b:netrw_fname,"^.*#","","") +" call Decho("netrw_html<".netrw_html.">") +" call Decho("netrw_tag <".netrw_tag.">") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1)) + exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1) + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) +" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/') + exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\" + endif + let b:netrw_lastfile = choice + setlocal ro + + "......................................... + " dav: NetRead Method #6 {{{3 + elseif b:netrw_method == 6 +" call Decho("read via cadaver (method #6)") + + if !executable(g:netrw_dav_cmd) + call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73) +" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable") + return + endif + if g:netrw_dav_cmd =~ "curl" +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1) + else + " Construct execution string (four lines) which will be passed through filter + let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) + new + setlocal ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port + else + put ='open '.g:netrw_machine + endif + put ='user '.g:netrw_uid.' '.s:netrw_passwd + put ='get '.netrw_fname.' '.tmpfile + put ='quit' + + " perform cadaver operation: + norm! 1Gdd +" call Decho("executing: %!".g:netrw_dav_cmd) + exe s:netrw_silentxfer."%!".g:netrw_dav_cmd + bd! + endif + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " rsync: NetRead Method #7 {{{3 + elseif b:netrw_method == 7 +" call Decho("read via rsync (method #7)") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) + let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " fetch: NetRead Method #8 {{{3 + " fetch://[user@]host[:http]/path + elseif b:netrw_method == 8 +" call Decho("read via fetch (method #8)") + if g:netrw_fetch_cmd == "" + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"fetch command not available",7) + endif +" call Dret("NetRead") + endif + if exists("g:netrw_option") && g:netrw_option == ":http" + let netrw_option= "http" + else + let netrw_option= "ftp" + endif +" call Decho("read via fetch for ".netrw_option) + + if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != "" +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1) + else +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1) + endif + + let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + setlocal ro + + "......................................... + " sftp: NetRead Method #9 {{{3 + elseif b:netrw_method == 9 +" call Decho("read via sftp (method #9)") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile) + exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " Complain {{{3 + else + call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8) + endif + endwhile + + " cleanup {{{3 + if exists("b:netrw_method") +" call Decho("cleanup b:netrw_method and b:netrw_fname") + unlet b:netrw_method + unlet b:netrw_fname + endif + if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't' +" call Decho("cleanup by deleting tmpfile<".tmpfile.">") + call s:NetrwDelete(tmpfile) + endif + call s:NetrwOptionRestore("w:") + +" call Dret("netrw#NetRead :5 getcwd<".getcwd().">") +endfun + +" ------------------------------------------------------------------------ +" netrw#NetWrite: responsible for writing a file over the net {{{2 +fun! netrw#NetWrite(...) range +" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw) + + " option handling + let mod= 0 + call s:NetrwOptionSave("w:") + call s:NetrwSafeOptions() + + " Get Temporary Filename {{{3 + let tmpfile= s:GetTempfile("") + if tmpfile == "" +" call Dret("netrw#NetWrite : unable to get a tempfile!") + return + endif + + if a:0 == 0 + let ichoice = 0 + else + let ichoice = 1 + endif + + let curbufname= expand("%") +" call Decho("curbufname<".curbufname.">") + if &binary + " For binary writes, always write entire file. + " (line numbers don't really make sense for that). + " Also supports the writing of tar and zip files. +" call Decho("(write entire file) silent exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)) + silent exe "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile) + elseif g:netrw_cygwin + " write (selected portion of) file to temporary + let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','') +" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)) + silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile) + else + " write (selected portion of) file to temporary +" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)) + silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile) + endif + + if curbufname == "" + " if the file is [No Name], and one attempts to Nwrite it, the buffer takes + " on the temporary file's name. Deletion of the temporary file during + " cleanup then causes an error message. + 0file! + endif + + " While choice loop: {{{3 + while ichoice <= a:0 + + " Process arguments: {{{4 + " attempt to repeat with previous host-file-etc + if exists("b:netrw_lastfile") && a:0 == 0 +" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") + let choice = b:netrw_lastfile + let ichoice= ichoice + 1 + else + exe "let choice= a:" . ichoice + + " Reconstruct Choice if choice starts with '"' + if match(choice,"?") == 0 + echomsg 'NetWrite Usage:"' + echomsg ':Nwrite machine:path uses rcp' + echomsg ':Nwrite "machine path" uses ftp with <.netrc>' + echomsg ':Nwrite "machine id password path" uses ftp' + echomsg ':Nwrite dav://[user@]machine/path uses cadaver' + echomsg ':Nwrite fetch://[user@]machine/path uses fetch' + echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)' + echomsg ':Nwrite rcp://machine/path uses rcp' + echomsg ':Nwrite rsync://[user@]machine/path uses rsync' + echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp' + echomsg ':Nwrite sftp://[user@]machine/path uses sftp' + sleep 4 + break + + elseif match(choice,"^\"") != -1 + if match(choice,"\"$") != -1 + " case "..." + let choice=strpart(choice,1,strlen(choice)-2) + else + " case "... ... ..." + let choice = strpart(choice,1,strlen(choice)-1) + let wholechoice = "" + + while match(choice,"\"$") == -1 + let wholechoice= wholechoice . " " . choice + let ichoice = ichoice + 1 + if choice > a:0 + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13) + endif +" call Dret("netrw#NetWrite") + return + endif + let choice= a:{ichoice} + endwhile + let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1) + endif + endif + endif + let ichoice= ichoice + 1 +" call Decho("choice<" . choice . "> ichoice=".ichoice) + + " Determine method of write (ftp, rcp, etc) {{{4 + call s:NetrwMethod(choice) + if !exists("b:netrw_method") || b:netrw_method < 0 +" call Dfunc("netrw#NetWrite : unsupported method") + return + endif + + " ============= + " Perform Protocol-Based Write {{{4 + " ============================ + if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 + echo "(netrw) Processing your write request..." +" call Decho("(netrw) Processing your write request...") + endif + + "......................................... + " rcp: NetWrite Method #1 {{{4 + if b:netrw_method == 1 +" call Decho("write via rcp (method #1)") + if s:netrw_has_nt_rcp == 1 + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_machine .'.'. g:netrw_uid + else + let uid_machine = g:netrw_machine .'.'. $USERNAME + endif + else + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif + endif +" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1) + let b:netrw_lastfile = choice + + "......................................... + " ftp + <.netrc>: NetWrite Method #2 {{{4 + elseif b:netrw_method == 2 +" call Decho("write via ftp+.netrc (method #2)") + let netrw_fname= b:netrw_fname + new +" call Decho("filter input window#".winnr()) + setlocal ff=unix + put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline("$")) + endif + call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"') +" call Decho("filter input: ".getline("$")) + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + else +" call Decho("filter input window#".winnr()) +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,getline(1),14) + endif + let mod=1 + endif + bd! + let b:netrw_lastfile = choice + + "......................................... + " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{4 + elseif b:netrw_method == 3 + " Construct execution string (four lines) which will be passed through filter +" call Decho("read via ftp+mipf (method #3)") + let netrw_fname= b:netrw_fname + new + setlocal ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port +" call Decho("filter input: ".getline('.')) + else + put ='open '.g:netrw_machine +" call Decho("filter input: ".getline('.')) + endif + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid +" call Decho("filter input: ".getline('.')) + put ='\"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('.')) + else + put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('.')) + endif + put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"' +" call Decho("filter input: ".getline('.')) + " save choice/id/password for future use + let b:netrw_lastfile = choice + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password + norm! 1Gdd +" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,getline(1),15) + endif + let mod=1 + endif + bd! + + "......................................... + " scp: NetWrite Method #4 {{{4 + elseif b:netrw_method == 4 +" call Decho("write via scp (method #4)") + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port) + else + let useport= "" + endif +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1) + let b:netrw_lastfile = choice + + "......................................... + " http: NetWrite Method #5 {{{4 + elseif b:netrw_method == 5 +" call Decho("write via http (method #5)") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"currently does not support writing using http:",16) + endif + + "......................................... + " dav: NetWrite Method #6 (cadaver) {{{4 + elseif b:netrw_method == 6 +" call Decho("write via cadaver (method #6)") + + " Construct execution string (four lines) which will be passed through filter + let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) + new + setlocal ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port + else + put ='open '.g:netrw_machine + endif + if exists("g:netrw_uid") && exists("s:netrw_passwd") + put ='user '.g:netrw_uid.' '.s:netrw_passwd + endif + put ='put '.tmpfile.' '.netrw_fname + + " perform cadaver operation: + norm! 1Gdd +" call Decho("executing: %!".g:netrw_dav_cmd) + exe s:netrw_silentxfer."%!".g:netrw_dav_cmd + bd! + let b:netrw_lastfile = choice + + "......................................... + " rsync: NetWrite Method #7 {{{4 + elseif b:netrw_method == 7 +" call Decho("write via rsync (method #7)") +" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1) + let b:netrw_lastfile = choice + + "......................................... + " sftp: NetWrite Method #9 {{{4 + elseif b:netrw_method == 9 +" call Decho("read via sftp (method #9)") + let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif + new + setlocal ff=unix + put ='put \"'.escape(tmpfile,'\').'\" '.netrw_fname +" call Decho("filter input: ".getline('.')) + norm! 1Gdd +" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)) + exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1) + bd! + let b:netrw_lastfile= choice + + "......................................... + " Complain {{{4 + else + call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17) + endif + endwhile + + " Cleanup: {{{3 +" call Decho("cleanup") + if s:FileReadable(tmpfile) +" call Decho("tmpfile<".tmpfile."> readable, will now delete it") + call s:NetrwDelete(tmpfile) + endif + call s:NetrwOptionRestore("w:") + + if a:firstline == 1 && a:lastline == line("$") + " restore modifiability; usually equivalent to set nomod + let &mod= mod + endif + +" call Dret("netrw#NetWrite") +endfun + +" --------------------------------------------------------------------- +" netrw#NetSource: source a remotely hosted vim script {{{2 +" uses NetRead to get a copy of the file into a temporarily file, +" then sources that file, +" then removes that file. +fun! netrw#NetSource(...) +" call Dfunc("netrw#NetSource() a:0=".a:0) + if a:0 > 0 && a:1 == '?' + " give help + echomsg 'NetSource Usage:' + echomsg ':Nsource dav://machine[:port]/path uses cadaver' + echomsg ':Nsource fetch://machine/path uses fetch' + echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>' + echomsg ':Nsource http://[user@]machine/path uses http wget' + echomsg ':Nsource rcp://[user@]machine/path uses rcp' + echomsg ':Nsource rsync://machine[:port]/path uses rsync' + echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp' + echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp' + sleep 4 + else + let i= 1 + while i <= a:0 + call netrw#NetRead(3,a:{i}) +" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">") + if s:FileReadable(s:netrw_tmpfile) +" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile)) + exe "so ".fnameescape(s:netrw_tmpfile) +" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")") + call delete(s:netrw_tmpfile) + unlet s:netrw_tmpfile + else + call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48) + endif + let i= i + 1 + endwhile + endif +" call Dret("netrw#NetSource") +endfun + +" =========================================== +" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2 +" readcmd == %r : replace buffer with newly read file +" == 0r : read file at top of buffer +" == r : read file after current line +" == t : leave file in temporary form (ie. don't read into buffer) +fun! s:NetrwGetFile(readcmd, tfile, method) +" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)") + + " readcmd=='t': simply do nothing + if a:readcmd == 't' +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("NetrwGetFile : skip read of <".a:tfile.">") + return + endif + + " get name of remote filename (ie. url and all) + let rfile= bufname("%") +" call Decho("rfile<".rfile.">") + + if exists("*NetReadFixup") + " for the use of NetReadFixup (not otherwise used internally) + let line2= line("$") + endif + + if a:readcmd[0] == '%' + " get file into buffer +" call Decho("get file into buffer") + + " rename the current buffer to the temp file (ie. tfile) + if g:netrw_cygwin + let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','') + else + let tfile= a:tfile + endif +" call Decho("exe silent! keepalt file ".fnameescape(tfile)) + exe "silent! keepalt file ".fnameescape(tfile) + + " edit temporary file (ie. read the temporary file in) + if rfile =~ '\.zip$' +" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)") + call zip#Browse(tfile) + elseif rfile =~ '\.tar$' +" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)") + call tar#Browse(tfile) + elseif rfile =~ '\.tar\.gz' +" call Decho("handling remote gzip-compressed tar file") + call tar#Browse(tfile) + elseif rfile =~ '\.tar\.bz2' +" call Decho("handling remote bz2-compressed tar file") + call tar#Browse(tfile) + else +" call Decho("edit temporary file") + e! + endif + + " rename buffer back to remote filename +" call Decho("exe silent! keepalt file ".fnameescape(rfile)) + exe "silent! keepalt file ".fnameescape(rfile) + if a:method == 5 + set ft=html + else + filetype detect + endif +" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!") + let line1 = 1 + let line2 = line("$") + + elseif s:FileReadable(a:tfile) + " read file after current line +" call Decho("read file<".a:tfile."> after current line") + let curline = line(".") + let lastline= line("$") +" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline) + exe a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile) + let line1= curline + 1 + let line2= line("$") - lastline + 1 + + else + " not readable +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Decho("tfile<".a:tfile."> not readable") + call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9) +" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable") + return + endif + + " User-provided (ie. optional) fix-it-up command + if exists("*NetReadFixup") +" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")") + call NetReadFixup(a:method, line1, line2) +" else " Decho +" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")") + endif + + if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' + " update the Buffers menu + call s:UpdateBuffersMenu() + endif + +" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile)) + + " make sure file is being displayed +" redraw! + +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("NetrwGetFile") +endfun + +" ------------------------------------------------------------------------ +" s:NetrwMethod: determine method of transfer {{{2 +" Input: +" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file] +" Output: +" b:netrw_method= 1: rcp +" 2: ftp + <.netrc> +" 3: ftp + machine, id, password, and [path]filename +" 4: scp +" 5: http (wget) +" 6: dav +" 7: rsync +" 8: fetch +" 9: sftp +" g:netrw_machine= hostname +" b:netrw_fname = filename +" g:netrw_port = optional port number (for ftp) +" g:netrw_choice = copy of input url (choice) +fun! s:NetrwMethod(choice) +" call Dfunc("NetrwMethod(a:choice<".a:choice.">)") + + " record current g:netrw_machine, if any + " curmachine used if protocol == ftp and no .netrc + if exists("g:netrw_machine") + let curmachine= g:netrw_machine +" call Decho("curmachine<".curmachine.">") + else + let curmachine= "N O T A HOST" + endif + + " initialization + let b:netrw_method = 0 + let g:netrw_machine = "" + let b:netrw_fname = "" + let g:netrw_port = "" + let g:netrw_choice = a:choice + + " Patterns: + " mipf : a:machine a:id password filename Use ftp + " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd + " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd + " rcpurm : rcp://[user@]host/filename Use rcp + " rcphf : [user@]host:filename Use rcp + " scpurm : scp://[user@]host[[#:]port]/filename Use scp + " httpurm : http://[user@]host/filename Use wget + " davurm : dav[s]://host[:port]/path Use cadaver/curl + " rsyncurm : rsync://host[:port]/path Use rsync + " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http) + " sftpurm : sftp://[user@]host/filename Use scp + let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$' + let mf = '^\(\S\+\)\s\+\(\S\+\)$' + let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$' + let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$' + let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$' + let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$' + let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$' + let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$' + let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$' + let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$' + let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$' + +" call Decho("determine method:") + " Determine Method + " rcp://user@hostname/...path-to-file + if match(a:choice,rcpurm) == 0 +" call Decho("rcp://...") + let b:netrw_method = 1 + let userid = substitute(a:choice,rcpurm,'\1',"") + let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"") + let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"") + if userid != "" + let g:netrw_uid= userid + endif + + " scp://user@hostname/...path-to-file + elseif match(a:choice,scpurm) == 0 +" call Decho("scp://...") + let b:netrw_method = 4 + let g:netrw_machine = substitute(a:choice,scpurm,'\1',"") + let g:netrw_port = substitute(a:choice,scpurm,'\2',"") + let b:netrw_fname = substitute(a:choice,scpurm,'\3',"") + + " http://user@hostname/...path-to-file + elseif match(a:choice,httpurm) == 0 +" call Decho("http://...") + let b:netrw_method = 5 + let g:netrw_machine= substitute(a:choice,httpurm,'\1',"") + let b:netrw_fname = substitute(a:choice,httpurm,'\2',"") + + " dav://hostname[:port]/..path-to-file.. + elseif match(a:choice,davurm) == 0 +" call Decho("dav://...") + let b:netrw_method= 6 + if a:choice =~ '^s' + let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"") + else + let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"") + endif + let b:netrw_fname = substitute(a:choice,davurm,'\3',"") + + " rsync://user@hostname/...path-to-file + elseif match(a:choice,rsyncurm) == 0 +" call Decho("rsync://...") + let b:netrw_method = 7 + let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"") + let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"") + + " ftp://[user@]hostname[[:#]port]/...path-to-file + elseif match(a:choice,ftpurm) == 0 +" call Decho("ftp://...") + let userid = substitute(a:choice,ftpurm,'\2',"") + let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"") + let g:netrw_port = substitute(a:choice,ftpurm,'\4',"") + let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"") +" call Decho("g:netrw_machine<".g:netrw_machine.">") + if userid != "" + let g:netrw_uid= userid + endif + if exists("s:netrw_passwd") && curmachine != g:netrw_machine + " if there's a change in hostname, require password re-entry + unlet s:netrw_passwd + endif + if exists("g:netrw_uid") && exists("s:netrw_passwd") + let b:netrw_method = 3 + else + if s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc + let b:netrw_method= 2 + else + if !exists("g:netrw_uid") || g:netrw_uid == "" + call NetUserPass() + elseif !exists("s:netrw_passwd") || s:netrw_passwd == "" + call NetUserPass(g:netrw_uid) + " else just use current g:netrw_uid and s:netrw_passwd + endif + let b:netrw_method= 3 + endif + endif + + elseif match(a:choice,fetchurm) == 0 +" call Decho("fetch://...") + let b:netrw_method = 8 + let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"") + let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"") + let b:netrw_option = substitute(a:choice,fetchurm,'\4',"") + let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"") + + " Issue an ftp : "machine id password [path/]filename" + elseif match(a:choice,mipf) == 0 +" call Decho("(ftp) host id pass file") + let b:netrw_method = 3 + let g:netrw_machine = substitute(a:choice,mipf,'\1',"") + let g:netrw_uid = substitute(a:choice,mipf,'\2',"") + let s:netrw_passwd = substitute(a:choice,mipf,'\3',"") + let b:netrw_fname = substitute(a:choice,mipf,'\4',"") + + " Issue an ftp: "hostname [path/]filename" + elseif match(a:choice,mf) == 0 +" call Decho("(ftp) host file") + if exists("g:netrw_uid") && exists("s:netrw_passwd") + let b:netrw_method = 3 + let g:netrw_machine = substitute(a:choice,mf,'\1',"") + let b:netrw_fname = substitute(a:choice,mf,'\2',"") + + elseif s:FileReadable(expand("$HOME/.netrc")) + let b:netrw_method = 2 + let g:netrw_machine = substitute(a:choice,mf,'\1',"") + let b:netrw_fname = substitute(a:choice,mf,'\2',"") + endif + + " sftp://user@hostname/...path-to-file + elseif match(a:choice,sftpurm) == 0 +" call Decho("sftp://...") + let b:netrw_method = 9 + let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"") + let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"") + + " Issue an rcp: hostname:filename" (this one should be last) + elseif match(a:choice,rcphf) == 0 +" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">") + let b:netrw_method = 1 + let userid = substitute(a:choice,rcphf,'\2',"") + let g:netrw_machine = substitute(a:choice,rcphf,'\3',"") + let b:netrw_fname = substitute(a:choice,rcphf,'\4',"") +" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">") +" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">") +" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">") +" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">") + if userid != "" + let g:netrw_uid= userid + endif + + else + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45) + endif + let b:netrw_method = -1 + endif + + " remove any leading [:#] from port number + if g:netrw_port != "" + let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','') + endif + +" call Decho("a:choice <".a:choice.">") +" call Decho("b:netrw_method <".b:netrw_method.">") +" call Decho("g:netrw_machine<".g:netrw_machine.">") +" call Decho("g:netrw_port <".g:netrw_port.">") +" if exists("g:netrw_uid") "Decho +" call Decho("g:netrw_uid <".g:netrw_uid.">") +" endif "Decho +" if exists("s:netrw_passwd") "Decho +" call Decho("s:netrw_passwd <".s:netrw_passwd.">") +" endif "Decho +" call Decho("b:netrw_fname <".b:netrw_fname.">") +" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method) +endfun + +" ------------------------------------------------------------------------ +" NetReadFixup: this sort of function is typically written by the user {{{2 +" to handle extra junk that their system's ftp dumps +" into the transfer. This function is provided as an +" example and as a fix for a Windows 95 problem: in my +" experience, win95's ftp always dumped four blank lines +" at the end of the transfer. +if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp + fun! NetReadFixup(method, line1, line2) +" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")") + + " sanity checks -- attempt to convert inputs to integers + let method = a:method + 0 + let line1 = a:line1 + 0 + let line2 = a:line2 + 0 + if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0 +" call Dret("NetReadFixup") + return + endif + + if method == 3 " ftp (no <.netrc>) + let fourblanklines= line2 - 3 + if fourblanklines >= line1 + exe "silent ".fourblanklines.",".line2."g/^\s*$/d" + endif + endif + +" call Dret("NetReadFixup") + endfun +endif + +" --------------------------------------------------------------------- +" NetUserPass: set username and password for subsequent ftp transfer {{{2 +" Usage: :call NetUserPass() -- will prompt for userid and password +" :call NetUserPass("uid") -- will prompt for password +" :call NetUserPass("uid","password") -- sets global userid and password +fun! NetUserPass(...) + + " get/set userid + if a:0 == 0 +" call Dfunc("NetUserPass(a:0<".a:0.">)") + if !exists("g:netrw_uid") || g:netrw_uid == "" + " via prompt + let g:netrw_uid= input('Enter username: ') + endif + else " from command line +" call Dfunc("NetUserPass(a:1<".a:1.">) {") + let g:netrw_uid= a:1 + endif + + " get password + if a:0 <= 1 " via prompt +" call Decho("a:0=".a:0." case <=1:") + let s:netrw_passwd= inputsecret("Enter Password: ") + else " from command line +" call Decho("a:0=".a:0." case >1: a:2<".a:2.">") + let s:netrw_passwd=a:2 + endif + +" call Dret("NetUserPass") +endfun + +" =========================================== +" Shared Browsing Support: {{{1 +" =========================================== + +" --------------------------------------------------------------------- +" s:BrowserMaps: {{{2 +fun! s:BrowserMaps(islocal) +" call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">") + if a:islocal +" call Decho("make local maps") + nnoremap :call netrw#LocalBrowseCheck(NetrwBrowseChgDir(1,NetrwGetWord())) + nnoremap - :exe "norm! 0"call netrw#LocalBrowseCheck(NetrwBrowseChgDir(1,'../')) + nnoremap a :call NetrwHide(1) + nnoremap mb :call NetrwBookHistHandler(0,b:netrw_curdir) + nnoremap mc :call NetrwMarkFileCopy(1) + nnoremap md :call NetrwMarkFileDiff(1) + nnoremap me :call NetrwMarkFileEdit(1) + nnoremap mf :call NetrwMarkFile(1,NetrwGetWord()) + nnoremap mg :call NetrwMarkFileGrep(1) + nnoremap mh :call NetrwMarkHideSfx(1) + nnoremap mm :call NetrwMarkFileMove(1) + nnoremap mp :call NetrwMarkFilePrint(1) + nnoremap mr :call NetrwMarkFileRegexp(1) + nnoremap ms :call NetrwMarkFileSource(1) + nnoremap mT :call NetrwMarkFileTag(1) + nnoremap mt :call NetrwMarkFileTgt(1) + nnoremap mu :call NetrwUnMarkFile(1) + nnoremap mx :call NetrwMarkFileExe(1) + nnoremap mz :call NetrwMarkFileCompress(1) + nnoremap gb :call NetrwBookHistHandler(1,b:netrw_curdir) + nnoremap gh :call NetrwHidden(1) + nnoremap c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir) + nnoremap C :let g:netrw_chgwin= winnr() + nnoremap d :call NetrwMakeDir("") + nnoremap i :call NetrwListStyle(1) + nnoremap o :call NetrwSplit(3) + nnoremap O :call NetrwObtain(1) + nnoremap p :call NetrwPreview(NetrwBrowseChgDir(1,NetrwGetWord(),1)) + nnoremap P :call NetrwPrevWinOpen(1) + nnoremap qb :call NetrwBookHistHandler(2,b:netrw_curdir) + nnoremap mB :call NetrwBookHistHandler(6,b:netrw_curdir) + nnoremap qf :call NetrwFileInfo(1,NetrwGetWord()) + nnoremap r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'exe "norm! 0"call NetrwRefresh(1,NetrwBrowseChgDir(1,'./')) + nnoremap s :call NetrwSortStyle(1) + nnoremap S :call NetSortSequence(1) + nnoremap t :call NetrwSplit(4) + nnoremap u :call NetrwBookHistHandler(4,expand("%")) + nnoremap U :call NetrwBookHistHandler(5,expand("%")) + nnoremap v :call NetrwSplit(5) + nnoremap x :call netrw#NetrwBrowseX(NetrwBrowseChgDir(1,NetrwGetWord(),0),0)" + nnoremap % :call NetrwOpenFile(1) + if !hasmapto('NetrwHideEdit') + nmap NetrwHideEdit + endif + nnoremap NetrwHideEdit :call NetrwHideEdit(1) + if !hasmapto('NetrwRefresh') + nmap NetrwRefresh + endif + nnoremap NetrwRefresh :call NetrwRefresh(1,NetrwBrowseChgDir(1,'./')) + if s:didstarstar || !mapcheck("","n") + nnoremap :Nexplore + endif + if s:didstarstar || !mapcheck("","n") + nnoremap :Pexplore + endif + let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape) + if g:netrw_mousemaps == 1 + nnoremap :call NetrwLeftmouse(1) + nnoremap :call NetrwPrevWinOpen(1) + nnoremap :call NetrwMarkFile(1,NetrwGetWord()) + exe 'nnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'vnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' + endif + exe 'nnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'vnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'nnoremap D :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'vnoremap D :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'nnoremap R :call NetrwLocalRename("'.mapsafecurdir.'")' + exe 'vnoremap R :call NetrwLocalRename("'.mapsafecurdir.'")' + exe 'nnoremap m :call NetrwMakeDir("")' + nnoremap :he netrw-quickhelp + + else " remote +" call Decho("make remote maps") + call s:RemotePathAnalysis(b:netrw_curdir) + nnoremap :call NetrwBrowse(0,NetrwBrowseChgDir(0,NetrwGetWord())) + nnoremap :call NetrwRefresh(0,NetrwBrowseChgDir(0,'./')) + nnoremap - :exe "norm! 0"call NetrwBrowse(0,NetrwBrowseChgDir(0,'../')) + nnoremap a :call NetrwHide(0) + nnoremap mb :call NetrwBookHistHandler(0,b:netrw_curdir) + nnoremap mc :call NetrwMarkFileCopy(0) + nnoremap md :call NetrwMarkFileDiff(0) + nnoremap me :call NetrwMarkFileEdit(0) + nnoremap mf :call NetrwMarkFile(0,NetrwGetWord()) + nnoremap mg :call NetrwMarkFileGrep(0) + nnoremap mh :call NetrwMarkHideSfx(0) + nnoremap mm :call NetrwMarkFileMove(0) + nnoremap mp :call NetrwMarkFilePrint(0) + nnoremap mr :call NetrwMarkFileRegexp(0) + nnoremap ms :call NetrwMarkFileSource(0) + nnoremap mT :call NetrwMarkFileTag(0) + nnoremap mt :call NetrwMarkFileTgt(0) + nnoremap mu :call NetrwUnMarkFile(0) + nnoremap mx :call NetrwMarkFileExe(0) + nnoremap mz :call NetrwMarkFileCompress(0) + nnoremap gb :call NetrwBookHistHandler(1,b:netrw_cur) + nnoremap gh :call NetrwHidden(0) + nnoremap C :let g:netrw_chgwin= winnr() + nnoremap i :call NetrwListStyle(0) + nnoremap o :call NetrwSplit(0) + nnoremap O :call NetrwObtain(0) + nnoremap p :call NetrwPreview(NetrwBrowseChgDir(1,NetrwGetWord(),1)) + nnoremap P :call NetrwPrevWinOpen(0) + nnoremap qb :call NetrwBookHistHandler(2,b:netrw_curdir) + nnoremap mB :call NetrwBookHistHandler(6,b:netrw_curdir) + nnoremap qf :call NetrwFileInfo(0,NetrwGetWord()) + nnoremap r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'exe "norm! 0"call NetrwBrowse(0,NetrwBrowseChgDir(0,'./')) + nnoremap s :call NetrwSortStyle(0) + nnoremap S :call NetSortSequence(0) + nnoremap t :call NetrwSplit(1) + nnoremap u :call NetrwBookHistHandler(4,b:netrw_curdir) + nnoremap U :call NetrwBookHistHandler(5,b:netrw_curdir) + nnoremap v :call NetrwSplit(2) + nnoremap x :call netrw#NetrwBrowseX(NetrwBrowseChgDir(0,NetrwGetWord()),1) + nnoremap % :call NetrwOpenFile(0) + if !hasmapto('NetrwHideEdit') + nmap NetrwHideEdit + endif + nnoremap NetrwHideEdit :call NetrwHideEdit(0) + if !hasmapto('NetrwRefresh') + nmap NetrwRefresh + endif + + let mapsafepath = escape(s:path, s:netrw_map_escape) + let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape) + + nnoremap NetrwRefresh :call NetrwRefresh(0,NetrwBrowseChgDir(0,'./')) + if g:netrw_mousemaps == 1 + nnoremap :call NetrwLeftmouse(0) + nnoremap :call NetrwPrevWinOpen(0) + nnoremap :call NetrwMarkFile(0,NetrwGetWord()) + exe 'nnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'vnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + endif + exe 'nnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'vnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'nnoremap d :call NetrwMakeDir("'.mapsafeusermach.'")' + exe 'nnoremap D :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'vnoremap D :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'nnoremap R :call NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'vnoremap R :call NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")' + nnoremap :he netrw-quickhelp + endif + call s:SetRexDir(a:islocal,b:netrw_curdir) +" call Dret("s:BrowserMaps") +endfun + +" --------------------------------------------------------------------- +" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2 +fun! s:ExplorePatHls(pattern) +" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)") + let repat= substitute(a:pattern,'^**/\{1,2}','','') +" call Decho("repat<".repat.">") + let repat= escape(repat,'][.\') +" call Decho("repat<".repat.">") + let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>' +" call Dret("s:ExplorePatHls repat<".repat.">") + return repat +endfun + +" --------------------------------------------------------------------- +" s:NetrwBookHistHandler: {{{2 +" 0: (user: ) bookmark current directory +" 1: (user: ) change to the bookmarked directory +" 2: (user: ) list bookmarks +" 3: (browsing) record current directory history +" 4: (user: ) go up (previous) bookmark +" 5: (user: ) go down (next) bookmark +" 6: (user: ) delete bookmark +fun! s:NetrwBookHistHandler(chg,curdir) +" call Dfunc("NetrwBookHistHandler(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." histcnt=".g:netrw_dirhist_cnt." histmax=".g:netrw_dirhistmax) + + if a:chg == 0 + " bookmark the current directory +" call Decho("(user: ) bookmark the current directory") + if !exists("g:netrw_bookmarklist") + let g:netrw_bookmarklist= [] + endif + if index(g:netrw_bookmarklist,a:curdir) == -1 + " curdir not currently in g:netrw_bookmarklist, so include it + call add(g:netrw_bookmarklist,a:curdir) + call sort(g:netrw_bookmarklist) + endif + echo "bookmarked the current directory" + + elseif a:chg == 1 + " change to the bookmarked directory +" call Decho("(user: <".v:count."mb>) change to the bookmarked directory") + if exists("g:netrw_bookmarklist[v:count-1]") + exe "e ".fnameescape(g:netrw_bookmarklist[v:count-1]) + else + echomsg "Sorry, bookmark#".v:count." doesn't exist!" + endif + + elseif a:chg == 2 +" redraw! + let didwork= 0 + " list user's bookmarks +" call Decho("(user: ) list user's bookmarks") + if exists("g:netrw_bookmarklist") +" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks') + let cnt= 1 + for bmd in g:netrw_bookmarklist +" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1]) + echo "Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1] + let didwork = 1 + let cnt = cnt + 1 + endfor + endif + + " list directory history + let cnt = g:netrw_dirhist_cnt + let first = 1 + let histcnt = 0 + while ( first || cnt != g:netrw_dirhist_cnt ) +" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt) + let histcnt= histcnt + 1 + if exists("g:netrw_dirhist_{cnt}") +" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt}) + echo "Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt} + let didwork= 1 + endif + let first = 0 + let cnt = ( cnt - 1 ) % g:netrw_dirhistmax + if cnt < 0 + let cnt= cnt + g:netrw_dirhistmax + endif + endwhile + if didwork + call inputsave()|call input("Press to continue")|call inputrestore() + endif + + elseif a:chg == 3 + " saves most recently visited directories (when they differ) +" call Decho("(browsing) record curdir history") + if !exists("g:netrw_dirhist_cnt") || !exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") || g:netrw_dirhist_{g:netrw_dirhist_cnt} != a:curdir + let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax + let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir +" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">") + endif + + elseif a:chg == 4 + " u: change to the previous directory stored on the history list +" call Decho("(user: ) chg to prev dir from history") + let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax + if g:netrw_dirhist_cnt < 0 + let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax + endif + if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") +" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") + setlocal ma noro +" call Decho("setlocal ma noro") + %d + setlocal nomod +" call Decho("setlocal nomod") + endif +" " call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})) + exe "e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}) + else + let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax + echo "Sorry, no predecessor directory exists yet" + endif + + elseif a:chg == 5 + " U: change to the subsequent directory stored on the history list +" call Decho("(user: ) chg to next dir from history") + let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax + if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") +" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") + setlocal ma noro +" call Decho("setlocal ma noro") + %d +" call Decho("removed all lines from buffer (%d)") + setlocal nomod +" call Decho("setlocal nomod") + endif +" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})) + exe "e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}) + else + let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax + if g:netrw_dirhist_cnt < 0 + let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax + endif + echo "Sorry, no successor directory exists yet" + endif + + elseif a:chg == 6 + " delete the v:count'th bookmark +" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">") + let savefile= s:NetrwHome()."/.netrwbook" + if filereadable(savefile) + call s:NetrwBookHistSave() " done here to merge bookmarks first + call delete(savefile) + endif + call remove(g:netrw_bookmarklist,v:count-1) + endif + call s:NetrwBookmarkMenu() +" call Dret("NetrwBookHistHandler") +endfun + +" --------------------------------------------------------------------- +" s:NetrwBookHistRead: this function reads bookmarks and history {{{2 +" Sister function: s:NetrwBookHistSave() +fun! s:NetrwBookHistRead() +" call Dfunc("s:NetrwBookHistRead()") + if !exists("s:netrw_initbookhist") + let savefile= s:NetrwHome()."/.netrwbook" + if filereadable(savefile) +" call Decho("sourcing .netrwbook") + exe "so ".savefile + endif + let savefile= s:NetrwHome()."/.netrwhist" + if filereadable(savefile) +" call Decho("sourcing .netrwhist") + exe "so ".savefile + endif + let s:netrw_initbookhist= 1 + au VimLeave * call s:NetrwBookHistSave() + endif +" call Dret("s:NetrwBookHistRead") +endfun + +" --------------------------------------------------------------------- +" s:NetrwBookHistSave: this function saves bookmarks and history {{{2 +" Sister function: s:NetrwBookHistRead() +" I used to do this via viminfo but that appears to +" be unreliable for long-term storage +" COMBAK: does $HOME work under windows??? +fun! s:NetrwBookHistSave() +" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax) + let savefile= s:NetrwHome()."/.netrwhist" + 1split + enew + setlocal noswf + + " save .netrwhist -- no attempt to merge + file .netrwhist + call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax) + call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt) + let lastline = line("$") + let cnt = 1 + while cnt <= g:netrw_dirhist_cnt + call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'") + let cnt= cnt + 1 + endwhile + exe "silent! w! ".savefile + %d + + if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] + " merge and write .netrwbook + let savefile= s:NetrwHome()."/.netrwbook" + + if filereadable(savefile) + let booklist= deepcopy(g:netrw_bookmarklist) + exe "silent so ".savefile + for bdm in booklist + if index(g:netrw_bookmarklist,bdm) == -1 + call add(g:netrw_bookmarklist,bdm) + endif + endfor + call sort(g:netrw_bookmarklist) + exe "silent! w! ".savefile + endif + + " construct and save .netrwbook + call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist)) + exe "silent! w! ".savefile + endif + let bgone= bufnr("%") + q! + exe bgone."bwipe!" + +" call Dret("s:NetrwBookHistSave") +endfun + +" --------------------------------------------------------------------- +" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2 +" list of the contents of a local or remote directory. It is assumed that the +" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted +" with the requested remote hostname first. +fun! s:NetrwBrowse(islocal,dirname) + if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif +" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%").">") +" call Decho("tab#".tabpagenr()." win#".winnr()) +" call Dredir("ls!") + if !exists("s:netrw_initbookhist") + call s:NetrwBookHistRead() + endif + + if exists("s:netrw_skipbrowse") + unlet s:netrw_skipbrowse +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse) + return + endif + if !exists("*shellescape") + call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69) +" call Dret("s:NetrwBrowse : missing shellescape()") + return + endif + if !exists("*fnameescape") + call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70) +" call Dret("s:NetrwBrowse : missing fnameescape()") + return + endif + + call s:NetrwOptionSave("w:") + call s:NetrwSafeOptions() + + " re-instate any marked files + if exists("s:netrwmarkfilelist_{bufnr('%')}") +" call Decho("clearing marked files") + exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" + endif + + if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep +" call Decho("handle w:netrw_acdkeep:") +" call Decho("keepjumps lcd ".fnameescape(a:dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")") + exe 'keepjumps lcd '.fnameescape(a:dirname) +" call Decho("getcwd<".getcwd().">") + + elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"' + " looks like a regular file, attempt transfer +" call Decho("attempt transfer as regular file<".a:dirname.">") + + " remove any filetype indicator from end of dirname, except for the {{{3 + " "this is a directory" indicator (/). + " There shouldn't be one of those here, anyway. + let path= substitute(a:dirname,'[*=@|]\r\=$','','e') +" call Decho("new path<".path.">") + call s:RemotePathAnalysis(a:dirname) + + " remote-read the requested file into current buffer {{{3 + mark ' + call s:NetrwEnew(a:dirname) + setlocal ma noro +" call Decho("setlocal ma noro") + let b:netrw_curdir= a:dirname +" call Decho("exe silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)." (bt=".&bt.")") + exe "silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path) + exe "silent keepalt doau BufReadPre ".fnameescape(s:fname) + silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path) + if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' + " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error + exe "silent keepalt doau BufReadPost ".fnameescape(s:fname) + endif + + " save certain window-oriented variables into buffer-oriented variables {{{3 + call s:SetBufWinVars() + call s:NetrwOptionRestore("w:") + setlocal ma nomod + +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : file<".s:fname.">") + return + endif + + " use buffer-oriented WinVars if buffer ones exist but window ones don't {{{3 + call s:UseBufWinVars() + + " set up some variables {{{3 + let b:netrw_browser_active = 1 + let dirname = a:dirname + let s:last_sort_by = g:netrw_sort_by + + " set up menu {{{3 + call s:NetrwMenu(1) + + " set up buffer {{{3 + let reusing= s:NetrwGetBuffer(a:islocal,dirname) + " maintain markfile highlighting + if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != "" +" call Decho("bufnr(%)=".bufnr('%')) +" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/") + exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" + else +" call Decho("2match none") + 2match none + endif + if reusing + call s:NetrwOptionRestore("w:") + setlocal noma nomod nowrap +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : re-using buffer") + return + endif + + " set b:netrw_curdir to the new directory name {{{3 +" call Decho("set b:netrw_curdir to the new directory name:") + let b:netrw_curdir= dirname + if b:netrw_curdir =~ '[/\\]$' + let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e') + endif + if b:netrw_curdir == '' + if has("amiga") + " On the Amiga, the empty string connotes the current directory + let b:netrw_curdir= getcwd() + else + " under unix, when the root directory is encountered, the result + " from the preceding substitute is an empty string. + let b:netrw_curdir= '/' + endif + endif + if !a:islocal && b:netrw_curdir !~ '/$' + let b:netrw_curdir= b:netrw_curdir.'/' + endif +" call Decho("b:netrw_curdir<".b:netrw_curdir.">") + + " ------------ + " (local only) {{{3 + " ------------ + if a:islocal +" call Decho("local only:") + + " Set up ShellCmdPost handling. Append current buffer to browselist + call s:LocalFastBrowser() + + " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3 + if !g:netrw_keepdir +" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) +" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist")) + if !exists("&l:acd") || !&l:acd +" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir)) + try + exe 'keepjumps lcd '.fnameescape(b:netrw_curdir) + catch /^Vim\%((\a\+)\)\=:E472/ + call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61) + if exists("w:netrw_prvdir") + let b:netrw_curdir= w:netrw_prvdir + else + call s:NetrwOptionRestore("w:") + setlocal noma nomod nowrap + let b:netrw_curdir= dirname +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">") + return + endif + endtry + endif + endif + + " -------------------------------- + " remote handling: {{{3 + " -------------------------------- + else +" call Decho("remote only:") + + " analyze a:dirname and g:netrw_list_cmd {{{4 +" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> a:dirname<".a:dirname.">") + if a:dirname =~ "^NetrwTreeListing\>" + let dirname= b:netrw_curdir +" call Decho("(dirname was ".a:dirname.") dirname<".dirname.">") + elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") + let dirname= substitute(b:netrw_curdir,'\\','/','g') + if dirname !~ '/$' + let dirname= dirname.'/' + endif + let b:netrw_curdir = dirname +" call Decho("(liststyle is TREELIST) dirname<".dirname.">") + else + let dirname = substitute(a:dirname,'\\','/','g') +" call Decho("(normal) dirname<".dirname.">") + endif + + let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$' + if dirname !~ dirpat + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20) + endif + call s:NetrwOptionRestore("w:") + setlocal noma nomod nowrap +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">") + return + endif + let b:netrw_curdir= dirname +" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)") + endif " (additional remote handling) + + " ----------------------- + " Directory Listing: {{{3 + " ----------------------- + call s:BrowserMaps(a:islocal) + call s:PerformListing(a:islocal) + + " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd + " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed). + " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting + " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh() + " function gets called due to that autocmd; it notices that the following variable is set + " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008 + let s:locbrowseshellcmd= 1 + +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : did PerformListing") + return +endfun + +" --------------------------------------------------------------------- +" s:NetrwFileInfo: supports qf (query for file information) {{{2 +fun! s:NetrwFileInfo(islocal,fname) +" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)") + if a:islocal + if (has("unix") || has("macunix")) && executable("/bin/ls") + if exists("b:netrw_curdir") +" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>') + if b:netrw_curdir =~ '/$' + echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname)) + else + echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname)) + endif + else +" call Decho('using ls '.a:fname." using cwd<".getcwd().">") + echo system("/bin/ls -lsad ".shellescape(a:fname)) + endif + else + " use vim functions to return information about file below cursor +" call Decho("using vim functions to query for file info") + if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]' + let fname= substitute(a:fname,".$","","") + else + let fname= a:fname + endif + let t = getftime(fname) + let sz = getfsize(fname) + echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)) +" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))) + endif + else + echo "sorry, \"qf\" not supported yet for remote files" + endif +" call Dret("s:NetrwFileInfo") +endfun + +" --------------------------------------------------------------------- +" s:NetrwGetBuffer: {{{2 +" returns 0=cleared buffer +" 1=re-used buffer +fun! s:NetrwGetBuffer(islocal,dirname) +" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle) + let dirname= a:dirname + + " re-use buffer if possible {{{3 +" call Decho("--re-use a buffer if possible--") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST + " find NetrwTreeList buffer if there is one + if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0 +" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr) + let eikeep= &ei + set ei=all + exe "b ".w:netrw_treebufnr + let &ei= eikeep +" call Dret("s:NetrwGetBuffer : bufnum#".w:netrw_treebufnr."") + return + endif + let bufnum= -1 +" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist") + + else + " find buffer number of buffer named precisely the same as dirname {{{3 +" call Decho("--find buffer numnber of buffer named precisely the same as dirname--") +" call Dredir("ls!") + + " get dirname and associated buffer number + let bufnum = bufnr(escape(dirname,'\')) +" call Decho(" find buffer<".dirname.">'s number ") +" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum) + + if bufnum < 0 && dirname !~ '/$' + " trying appending a trailing / +" call Decho(" try appending a trailing / to dirname<".dirname.">") + let bufnum= bufnr(escape(dirname.'/','\')) + if bufnum > 0 + let dirname= dirname.'/' + endif + endif + + if bufnum < 0 && dirname =~ '/$' + " trying removing a trailing / +" call Decho(" try removing a trailing / from dirname<".dirname.">") + let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\')) + if bufnum > 0 + let dirname= substitute(dirname,'/$','','') + endif + endif + +" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)") + " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches) + if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.' + " handle approximate matches +" call Decho(" handling approx match: bufnum#%d<".bufname(bufnum)."> approx=dirname<".dirname.">") + let ibuf = 1 + let buflast = bufnr("$") +" call Decho(" findbuf2: buflast=".buflast) + while ibuf <= buflast + let bname= substitute(bufname(ibuf),'\\','/','g') + let bname= substitute(bname,'.\zs/$','','') +" call Decho(" findbuf3: dirname<".dirname."> bufname(".ibuf.")<".bname.">") + if bname != '' && dirname =~ '/'.bname.'/\=$' | break | endif + if bname =~ '^'.dirname.'/\=$' | break | endif + if dirname =~ '^'.bname.'/$' | break | endif + let ibuf= ibuf + 1 + endwhile + if ibuf > buflast + let bufnum= -1 + else + let bufnum= ibuf + endif +" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")") + endif + endif + + " get enew buffer and name it -or- re-use buffer {{{3 +" call Decho("--get enew buffer and name it OR re-use buffer-- (bufnum=".bufnum.")") + mark ' + if bufnum < 0 || !bufexists(bufnum) + call s:NetrwEnew(dirname) +" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)") + " name the buffer + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST + " Got enew buffer; transform into a NetrwTreeListing +" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --") + if !exists("s:netrw_treelistnum") + let s:netrw_treelistnum= 1 + else + let s:netrw_treelistnum= s:netrw_treelistnum + 1 + endif + let w:netrw_treebufnr= bufnr("%") +" call Decho(" exe silent! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum)) + exe 'silent! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum) + nnoremap [ :silent call TreeListMove('[') + nnoremap ] :silent call TreeListMove(']') + nnoremap [[ :silent call TreeListMove('[') + nnoremap ]] :silent call TreeListMove(']') +" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr) + else +" let v:errmsg= "" " Decho + let escdirname= fnameescape(dirname) +" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">") +" call Decho(' exe silent! keepalt file '.escdirname) + exe 'silent! keepalt file '.escdirname +" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">") + endif +" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">") + + else " Re-use the buffer +" call Decho("--re-use buffer#".bufnum.": --") + let eikeep= &ei + set ei=all + if getline(2) =~ '^" Netrw Directory Listing' +" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum) + exe "keepalt b ".bufnum + else +" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum) + exe "b ".bufnum + endif + if bufname("%") == '.' +" call Decho("exe silent! keepalt file ".fnameescape(getcwd())) + exe "silent! keepalt file ".fnameescape(getcwd()) + endif + let &ei= eikeep + if line("$") <= 1 + call s:NetrwListSettings(a:islocal) +" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it") + return 0 + elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST +" call Decho("--re-use tree listing--") +" call Decho(" clear buffer<".expand("%")."> with :%d") + silent %d + call s:NetrwListSettings(a:islocal) +" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh") + return 0 + else +" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%")) + return 1 + endif + endif + + " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3 + " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast) + " slow 0 D D Deleting a buffer implies it will not be re-used (slow) + " med 1 D H + " fast 2 H H +" call Decho("--do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc--") + let fname= expand("%") + call s:NetrwListSettings(a:islocal) +" call Decho("exe keepalt file ".fnameescape(fname)) + exe "keepalt file ".fnameescape(fname) + + " delete all lines from buffer {{{3 +" call Decho("--delete all lines from buffer--") +" call Decho(" clear buffer<".expand("%")."> with :%d") + keepalt silent! %d + +" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%")) + return 0 +endfun + +" --------------------------------------------------------------------- +" s:NetrwGetcwd: get the current directory. {{{2 +" Change backslashes to forward slashes, if any. +" If doesc is true, escape certain troublesome characters +fun! s:NetrwGetcwd(doesc) +" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")") + let curdir= substitute(getcwd(),'\\','/','ge') + if curdir !~ '[\/]$' + let curdir= curdir.'/' + endif + if a:doesc + let curdir= fnameescape(curdir) + endif +" call Dret("NetrwGetcwd <".curdir.">") + return curdir +endfun + +" --------------------------------------------------------------------- +" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2 +fun! s:NetrwGetWord() +" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol(".")) + call s:UseBufWinVars() + + " insure that w:netrw_liststyle is set up + if !exists("w:netrw_liststyle") + if exists("g:netrw_liststyle") + let w:netrw_liststyle= g:netrw_liststyle + else + let w:netrw_liststyle= s:THINLIST + endif +" call Decho("w:netrw_liststyle=".w:netrw_liststyle) + endif + + if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt + " Active Banner support +" call Decho("active banner handling") + norm! 0 + let dirname= "./" + let curline= getline('.') + + if curline =~ '"\s*Sorted by\s' + norm s + let s:netrw_skipbrowse= 1 + echo 'Pressing "s" also works' + + elseif curline =~ '"\s*Sort sequence:' + let s:netrw_skipbrowse= 1 + echo 'Press "S" to edit sorting sequence' + + elseif curline =~ '"\s*Quick Help:' + norm ? + let s:netrw_skipbrowse= 1 + echo 'Pressing "?" also works' + + elseif curline =~ '"\s*\%(Hiding\|Showing\):' + norm a + let s:netrw_skipbrowse= 1 + echo 'Pressing "a" also works' + + elseif line("$") > w:netrw_bannercnt + exe 'silent keepjumps '.w:netrw_bannercnt + endif + + elseif w:netrw_liststyle == s:THINLIST +" call Decho("thin column handling") + norm! 0 + let dirname= getline('.') + + elseif w:netrw_liststyle == s:LONGLIST +" call Decho("long column handling") + norm! 0 + let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e') + + elseif w:netrw_liststyle == s:TREELIST +" call Decho("treelist handling") + let dirname= substitute(getline('.'),'^\(| \)*','','e') + + else +" call Decho("obtain word from wide listing") + let dirname= getline('.') + + if !exists("b:netrw_cpf") + let b:netrw_cpf= 0 + exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif' +" call Decho("computed cpf=".b:netrw_cpf) + endif + +" call Decho("buf#".bufnr("%")."<".bufname("%").">") + let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf +" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt) +" call Decho("1: dirname<".dirname.">") + if filestart == 0 + norm! 0ma + else + call cursor(line("."),filestart+1) + norm! ma + endif + let rega= @a + let eofname= filestart + b:netrw_cpf + 1 + if eofname <= col("$") + call cursor(line("."),filestart+b:netrw_cpf+1) + norm! "ay`a + else + norm! "ay$ + endif + let dirname = @a + let @a = rega +" call Decho("2: dirname<".dirname.">") + let dirname= substitute(dirname,'\s\+$','','e') +" call Decho("3: dirname<".dirname.">") + endif + + " symlinks are indicated by a trailing "@". Remove it before further processing. + let dirname= substitute(dirname,"@$","","") + + " executables are indicated by a trailing "*". Remove it before further processing. + let dirname= substitute(dirname,"\*$","","") + +" call Dret("s:NetrwGetWord <".dirname.">") + return dirname +endfun + +" --------------------------------------------------------------------- +" s:NetrwListSettings: {{{2 +fun! s:NetrwListSettings(islocal) +" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")") + let fname= bufname("%") +" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro") + setlocal bt=nofile nobl ma nonu nowrap noro +" call Decho("exe keepalt file ".fnameescape(fname)) + exe "keepalt file ".fnameescape(fname) + if g:netrw_use_noswf + setlocal noswf + endif +" call Dredir("ls!") +" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen) + exe "setlocal ts=".g:netrw_maxfilenamelen + setlocal isk+=.,~,- + if g:netrw_fastbrowse > a:islocal + setlocal bh=hide + else + setlocal bh=delete + endif +" call Dret("s:NetrwListSettings") +endfun + +" --------------------------------------------------------------------- +" s:NetrwListStyle: {{{2 +" islocal=0: remote browsing +" =1: local browsing +fun! s:NetrwListStyle(islocal) +" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle) + let fname = s:NetrwGetWord() + if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif + let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST +" call Decho("fname<".fname.">") +" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle) +" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">") + + if w:netrw_liststyle == s:THINLIST + " use one column listing +" call Decho("use one column list") + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') + + elseif w:netrw_liststyle == s:LONGLIST + " use long list +" call Decho("use long list") + let g:netrw_list_cmd = g:netrw_list_cmd." -l" + + elseif w:netrw_liststyle == s:WIDELIST + " give wide list +" call Decho("use wide list") + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') + + elseif w:netrw_liststyle == s:TREELIST +" call Decho("use tree list") + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') + + else + call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46) + let g:netrw_liststyle = s:THINLIST + let w:netrw_liststyle = g:netrw_liststyle + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') + endif + setlocal ma noro +" call Decho("setlocal ma noro") + + " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh +" call Decho("clear buffer<".expand("%")."> with :%d") + %d + + " refresh the listing + let svpos= netrw#NetrwSavePosn() + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + if w:netrw_liststyle != s:WIDELIST + if g:netrw_cursorline == 2 + setlocal cursorline + let &cursorcolumn= s:netrw_usercuc + elseif g:netrw_cursorline + setlocal cursorline +" call Decho("setlocal cursorline") + endif + else + if g:netrw_cursorline == 2 + setlocal cursorline cursorcolumn +" call Decho("setlocal cursorline cursorcolumn") + elseif g:netrw_cursorline + let &cursorline= s:netrw_usercul + endif + endif + + " keep cursor on the filename + silent keepjumps $ + let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc') +" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A')) + if result <= 0 && exists("w:netrw_bannercnt") + exe "keepjumps ".w:netrw_bannercnt + endif + +" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : "")) +endfun + +" --------------------------------------------------------------------- +" s:NetrwBookmarkMenu: Uses menu priorities {{{2 +" .2.[cnt] for bookmarks, and +" .3.[cnt] for history +" (see s:NetrwMenu()) +fun! s:NetrwBookmarkMenu() + if !exists("s:netrw_menucnt") + return + endif +" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt) + + " the following test assures that gvim is running, has menus available, and has menus enabled. + if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu + if exists("g:NetrwTopLvlMenu") +" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)") + exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks' + exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete' + endif + if !exists("s:netrw_initbookhist") + call s:NetrwBookHistRead() + endif + + " show bookmarked places + if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] + let cnt= 1 + for bmd in g:netrw_bookmarklist +" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd) + let bmd= escape(bmd,'. ') + + " show bookmarks for goto menu + exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\" + + " show bookmarks for deletion menu + exe 'silent! menu '.g:NetrwMenuPriority.".8.2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete.'.bmd.' '.cnt."mB" + let cnt= cnt + 1 + endfor + + endif + + " show directory browsing history + let cnt = g:netrw_dirhist_cnt + let first = 1 + let histcnt = 0 + while ( first || cnt != g:netrw_dirhist_cnt ) + let histcnt = histcnt + 1 + let priority = g:netrw_dirhist_cnt + histcnt + if exists("g:netrw_dirhist_{cnt}") + let histdir= escape(g:netrw_dirhist_{cnt},'./&? ') +" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir) + exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\" + endif + let first = 0 + let cnt = ( cnt - 1 ) % g:netrw_dirhistmax + if cnt < 0 + let cnt= cnt + g:netrw_dirhistmax + endif + endwhile + + endif +" call Dret("NetrwBookmarkMenu") +endfun + +" --------------------------------------------------------------------- +" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2 +" directory and a new directory name. Also, if the +" "new directory name" is actually a file, +" NetrwBrowseChgDir() edits the file. +fun! s:NetrwBrowseChgDir(islocal,newdir,...) +" call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">") + + if !exists("b:netrw_curdir") + " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called + " and the current window is the NetrwMessage window. +" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!") +" call Decho("getcwd<".getcwd().">") +" call Dredir("ls!") +" call Dret("s:NetrwBrowseChgDir") + return + endif + + call s:NetrwOptionSave("s:") + call s:NetrwSafeOptions() + let nbcd_curpos = netrw#NetrwSavePosn() + let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos + let dirname = substitute(b:netrw_curdir,'\\','/','ge') + let newdir = a:newdir + let dolockout = 0 + + " set up o/s-dependent directory recognition pattern + if has("amiga") + let dirpat= '[\/:]$' + else + let dirpat= '[\/]$' + endif +" call Decho("dirname<".dirname."> dirpat<".dirpat.">") + + if dirname !~ dirpat + " apparently vim is "recognizing" that it is in a directory and + " is removing the trailing "/". Bad idea, so I put it back. + let dirname= dirname.'/' +" call Decho("adjusting dirname<".dirname.">") + endif + + if newdir !~ dirpat + " ------------ + " edit a file: + " ------------ +" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)' + let dirname= s:NetrwTreeDir() + if dirname =~ '/$' + let dirname= dirname.newdir + else + let dirname= s:NetrwTreeDir()."/".newdir + endif +" call Decho("tree listing") + elseif newdir =~ '^\(/\|\a:\)' + let dirname= newdir + else + let dirname= s:ComposePath(dirname,newdir) + endif +" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")") + " this lets NetrwBrowseX avoid the edit + if a:0 < 1 +" call Decho("set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist")) + call s:NetrwOptionRestore("s:") + if !exists("s:didsplit") + if g:netrw_browse_split == 1 + new + wincmd _ + elseif g:netrw_browse_split == 2 + rightb vert new + wincmd | + elseif g:netrw_browse_split == 3 + tabnew + elseif g:netrw_browse_split == 4 + if s:NetrwPrevWinOpen(2) == 3 +" call Dret("s:NetrwBrowseChgDir") + return + endif + else + " handling a file, didn't split, so remove menu +" call Decho("handling a file+didn't split, so remove menu") + call s:NetrwMenu(0) + " optional change to window + if g:netrw_chgwin >= 1 + exe "keepjumps ".g:netrw_chgwin."wincmd w" + endif + endif + endif + " the point where netrw actually edits the (local) file + " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will + if a:islocal +" call Decho("edit local file: exe e! ".fnameescape(dirname)) + exe "e! ".fnameescape(dirname) + else +" call Decho("remote file: NetrwBrowse will edit it") + endif + let dolockout= 1 + endif + + elseif newdir =~ '^/' + " --------------------------------- + " just go to the new directory spec + " --------------------------------- +" call Decho('case "just go to new directory spec": newdir<'.newdir.'>') + let dirname= newdir + call s:SetRexDir(a:islocal,dirname) + call s:NetrwOptionRestore("s:") + + elseif newdir == './' + " -------------------------- + " refresh the directory list + " -------------------------- +" call Decho('case "refresh directory listing": newdir == "./"') + call s:SetRexDir(a:islocal,dirname) + + elseif newdir == '../' + " ------------------- + " go up one directory + " ------------------- +" call Decho('case "go up one directory": newdir == "../"') + + if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") + " force a refresh +" call Decho("clear buffer<".expand("%")."> with :%d") + setlocal noro ma +" call Decho("setlocal noro ma") + keepjumps %d + endif + + if has("amiga") + " amiga +" call Decho('case "go up one directory": newdir == "../" and amiga') + if a:islocal + let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','') + let dirname= substitute(dirname,'/$','','') + else + let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','') + endif +" call Decho("amiga: dirname<".dirname."> (go up one dir)") + + else + " unix or cygwin +" call Decho('case "go up one directory": newdir == "../" and unix or cygwin') + if a:islocal + let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','') + if dirname == "" + let dirname= '/' + endif + else + let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','') + endif +" call Decho("unix: dirname<".dirname."> (go up one dir)") + endif + call s:SetRexDir(a:islocal,dirname) + + elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") +" call Decho('case liststyle is TREELIST and w:netrw_treedict exists') + " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh) + setlocal noro ma +" call Decho("setlocal noro ma") + if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")) +" call Decho("clear buffer<".expand("%")."> with :%d") + keepjumps %d + endif + let treedir = s:NetrwTreeDir() + let s:treecurpos = nbcd_curpos + let haskey= 0 +" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">") + + " search treedict for tree dir as-is + if has_key(w:netrw_treedict,treedir) +" call Decho('....searched for treedir<'.treedir.'> : found it!') + let haskey= 1 + else +" call Decho('....searched for treedir<'.treedir.'> : not found') + endif + + " search treedict for treedir with a / appended + if !haskey && treedir !~ '/$' + if has_key(w:netrw_treedict,treedir."/") + let treedir= treedir."/" +" call Decho('....searched.for treedir<'.treedir.'> found it!') + let haskey = 1 + else +" call Decho('....searched for treedir<'.treedir.'/> : not found') + endif + endif + + " search treedict for treedir with any trailing / elided + if !haskey && treedir =~ '/$' + let treedir= substitute(treedir,'/$','','') + if has_key(w:netrw_treedict,treedir) +" call Decho('....searched.for treedir<'.treedir.'> found it!') + let haskey = 1 + else +" call Decho('....searched for treedir<'.treedir.'> : not found') + endif + endif + + if haskey + " close tree listing for selected subdirectory +" call Decho("closing selected subdirectory<".dirname.">") + call remove(w:netrw_treedict,treedir) +" call Decho("removed entry<".dirname."> from treedict") +" call Decho("yielding treedict<".string(w:netrw_treedict).">") + let dirname= w:netrw_treetop + else + " go down one directory + let dirname= substitute(treedir,'/*$','/','') +" call Decho("go down one dir: treedir<".treedir.">") + endif + call s:SetRexDir(a:islocal,dirname) + + else + " go down one directory + let dirname= s:ComposePath(dirname,newdir) +" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">") + call s:SetRexDir(a:islocal,dirname) + endif + + call s:NetrwOptionRestore("s:") + if dolockout +" call Decho("doing modification lockout settings: ma nomod noro") + setlocal ma nomod noro +" call Decho("setlocal ma nomod noro") + endif + +" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">") + return dirname +endfun + +" --------------------------------------------------------------------- +" s:NetrwBrowseX: allows users to write custom functions to operate on {{{2 +" files given their extension. Passes 0=local, 1=remote +fun! netrw#NetrwBrowseX(fname,remote) +" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")") + + " set up the filename + " (lower case the extension, make a local copy of a remote file) + let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e') + if has("win32") || has("win95") || has("win64") || has("win16") + let exten= substitute(exten,'^.*$','\L&\E','') + endif +" call Decho("exten<".exten.">") + + " seems kde systems often have gnome-open due to dependencies, even though + " gnome-open's subsidiary display tools are largely absent. Kde systems + " usually have "kdeinit" running, though... (tnx Mikolaj Machowski) + if !exists("s:haskdeinit") + if has("unix") + let s:haskdeinit= system("ps -e") =~ 'kdeinit' + if v:shell_error + let s:haskdeinit = 0 + endif + else + let s:haskdeinit= 0 + endif +" call Decho("setting s:haskdeinit=".s:haskdeinit) + endif + + if a:remote == 1 + " create a local copy +" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname.">") + setlocal bh=delete + call netrw#NetRead(3,a:fname) + " attempt to rename tempfile + let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','') + let newname= substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','') +" call Decho("basename<".basename.">") +" call Decho("newname <".newname.">") + if rename(s:netrw_tmpfile,newname) == 0 + " renaming succeeded + let fname= newname + else + " renaming failed + let fname= s:netrw_tmpfile + endif + else + let fname= a:fname + endif +" call Decho("fname<".fname.">") +" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten)) + + " set up redirection + if &srr =~ "%s" + if (has("win32") || has("win95") || has("win64") || has("win16")) + let redir= substitute(&srr,"%s","nul","") + else + let redir= substitute(&srr,"%s","/dev/null","") + endif + elseif (has("win32") || has("win95") || has("win64") || has("win16")) + let redir= &srr . "nul" + else + let redir= &srr . "/dev/null" + endif +" call Decho("redir{".redir."} srr{".&srr."}") + + " extract any viewing options. Assumes that they're set apart by quotes. + if exists("g:netrw_browsex_viewer") + if g:netrw_browsex_viewer =~ '\s' + let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','') + let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." " + let oviewer = '' + let cnt = 1 + while !executable(viewer) && viewer != oviewer + let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','') + let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." " + let cnt = cnt + 1 + let oviewer = viewer +" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">") + endwhile + else + let viewer = g:netrw_browsex_viewer + let viewopt = "" + endif +" call Decho("viewer<".viewer."> viewopt<".viewopt.">") + endif + + " execute the file handler + if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-' +" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") + let ret= netrwFileHandlers#Invoke(exten,fname) + + elseif exists("g:netrw_browsex_viewer") && executable(viewer) +" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") +" call Decho("exe silent !".viewer." ".viewopt.shellescape(fname,1).redir) + exe "silent !".viewer." ".viewopt.shellescape(fname,1).redir + let ret= v:shell_error + + elseif has("win32") || has("win64") +" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)) + exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1) + call inputsave()|call input("Press to continue")|call inputrestore() + let ret= v:shell_error + + elseif has("unix") && executable("gnome-open") && !s:haskdeinit +" call Decho("exe silent !gnome-open ".shellescape(fname,1)." ".redir) + exe "silent !gnome-open ".shellescape(fname,1).redir + let ret= v:shell_error + + elseif has("unix") && executable("kfmclient") && s:haskdeinit +" call Decho("exe silent !kfmclient exec ".shellescape(fname,1)." ".redir) + exe "silent !kfmclient exec ".shellescape(fname,1)." ".redir + let ret= v:shell_error + + elseif has("macunix") && executable("open") +" call Decho("exe silent !open ".shellescape(fname,1)." ".redir) + exe "silent !open ".shellescape(fname,1)." ".redir + let ret= v:shell_error + + else + " netrwFileHandlers#Invoke() always returns 0 + let ret= netrwFileHandlers#Invoke(exten,fname) + endif + + " if unsuccessful, attempt netrwFileHandlers#Invoke() + if ret + let ret= netrwFileHandlers#Invoke(exten,fname) + endif + + " restoring redraw! after external file handlers + redraw! + + " cleanup: remove temporary file, + " delete current buffer if success with handler, + " return to prior buffer (directory listing) + " Feb 12, 2008: had to de-activiate removal of + " temporary file because it wasn't getting seen. +" if a:remote == 1 && fname != a:fname +" call Decho("deleting temporary file<".fname.">") +" call s:NetrwDelete(fname) +" endif + + if a:remote == 1 + setlocal bh=delete bt=nofile + if g:netrw_use_noswf + setlocal noswf + endif + exe "norm! \" +" redraw! + endif + +" call Dret("NetrwBrowseX") +endfun + +" --------------------------------------------------------------------- +" netrw#Explore: launch the local browser in the directory of the current file {{{2 +" indx: == -1: Nexplore +" == -2: Pexplore +" == +: this is overloaded: +" * If Nexplore/Pexplore is in use, then this refers to the +" indx'th item in the w:netrw_explore_list[] of items which +" matched the */pattern **/pattern *//pattern **//pattern +" * If Hexplore or Vexplore, then this will override +" g:netrw_winsize to specify the qty of rows or columns the +" newly split window should have. +" dosplit==0: the window will be split iff the current file has been modified +" dosplit==1: the window will be split before running the local browser +" style == 0: Explore style == 1: Explore! +" == 2: Hexplore style == 3: Hexplore! +" == 4: Vexplore style == 5: Vexplore! +" == 6: Texplore +"DechoTabOn +fun! netrw#Explore(indx,dosplit,style,...) +" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." a:0=".a:0) + if !exists("b:netrw_curdir") + let b:netrw_curdir= getcwd() +" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)") + endif + let curfile= b:netrw_curdir +" call Decho("curfile<".curfile.">") + + " save registers + silent! let keepregstar = @* + silent! let keepregplus = @+ + silent! let keepregslash= @/ + + " if dosplit or file has been modified + if a:dosplit || &modified || a:style == 6 +" call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style) + call s:SaveWinVars() + let winsize= g:netrw_winsize + if a:indx > 0 + let winsize= a:indx + endif + + if a:style == 0 " Explore, Sexplore +" call Decho("style=0: Explore or Sexplore") + exe winsize."wincmd s" + + elseif a:style == 1 "Explore!, Sexplore! +" call Decho("style=1: Explore! or Sexplore!") + exe winsize."wincmd v" + + elseif a:style == 2 " Hexplore +" call Decho("style=2: Hexplore") + exe "bel ".winsize."wincmd s" + + elseif a:style == 3 " Hexplore! +" call Decho("style=3: Hexplore!") + exe "abo ".winsize."wincmd s" + + elseif a:style == 4 " Vexplore +" call Decho("style=4: Vexplore") + exe "lefta ".winsize."wincmd v" + + elseif a:style == 5 " Vexplore! +" call Decho("style=5: Vexplore!") + exe "rightb ".winsize."wincmd v" + + elseif a:style == 6 " Texplore + call s:SaveBufVars() +" call Decho("style = 6: Texplore") + tabnew + call s:RestoreBufVars() + endif + call s:RestoreWinVars() + endif + norm! 0 + + if a:0 > 0 +" call Decho("case [a:0=".a:0."]>0: a:1<".a:1.">") + if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)) + let dirname= substitute(a:1,'\~',expand("$HOME"),'') +" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)") + elseif a:1 == '.' + let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd() + if dirname !~ '/$' + let dirname= dirname."/" + endif +" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")") + elseif a:1 =~ '\$' + let dirname= expand(a:1) + else + let dirname= a:1 +" call Decho("using dirname<".dirname.">") + endif + else + " clear explore +" call Decho("clearing explore variables") + 2match none + if exists("s:explore_match") |unlet s:explore_match |endif + if exists("s:explore_indx") |unlet s:explore_indx |endif + if exists("s:dirstarstar") |unlet s:dirstarstar |endif + if exists("s:dirstarstar") |unlet s:dirstarstar |endif + if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif + if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif + if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif + if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif +" redraw! + echo " " + echo " " +" call Dret("netrw#Explore : cleared list") + return + endif + + if dirname =~ '/\*\*/' + " handle .../**/.../filepat +" call Decho("case Explore .../**/.../filepat") + let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','') + if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16"))) + let b:netrw_curdir = prefixdir + else + let b:netrw_curdir= getcwd().'/'.prefixdir + endif + let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','') + let starpat= 4; +" call Decho("pwd<".getcwd()."> dirname<".dirname.">") +" call Decho("case Explore ../**/../filepat (starpat=".starpat.")") + + elseif dirname =~ '^\*//' + " starpat=1: Explore *//pattern (current directory only search for files containing pattern) +" call Decho("case Explore *//pattern") + let pattern= substitute(dirname,'^\*//\(.*\)$','\1','') + let starpat= 1 +" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">") + if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif + + elseif dirname =~ '^\*\*//' + " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) +" call Decho("case Explore **//pattern") + let pattern= substitute(dirname,'^\*\*//','','') + let starpat= 2 +" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">") + + elseif dirname =~ '^\*/' + " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) + let starpat= 3 +" call Decho("case Explore */filepat (starpat=".starpat.")") + + elseif dirname=~ '^\*\*/' + " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) + let starpat= 4 +" call Decho("case Explore **/filepat (starpat=".starpat.")") + else + let starpat= 0 + endif + + if starpat == 0 && a:indx >= 0 + " [Explore Hexplore Vexplore Sexplore] [dirname] +" call Decho("case dirname<".dirname."> a:indx=".a:indx.": Explore Hexplore Vexplore Sexplore") + if dirname == "" + let dirname= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e') + endif + if dirname =~ '^scp:' || dirname =~ '^ftp:' +" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)") + call s:NetrwBrowse(0,dirname) + else + if dirname == ""|let dirname= getcwd()|endif +" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)") + call netrw#LocalBrowseCheck(dirname) + endif + +" call Decho("curfile<".curfile.">") + if has("win32") || has("win95") || has("win64") || has("win16") + call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW') + else + call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW') + endif + + " starpat=1: Explore *//pattern (current directory only search for files containing pattern) + " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) + " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) + " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) + elseif a:indx <= 0 + " Nexplore, Pexplore, Explore: handle starpat +" call Decho("case Nexplore, Pexplore, , : starpat=".starpat." a:indx=".a:indx) + if !mapcheck("","n") && !mapcheck("","n") && exists("b:netrw_curdir") +" call Decho("set up and maps") + let s:didstarstar= 1 + nnoremap :Pexplore + nnoremap :Nexplore + endif + + if has("path_extra") +" call Decho("starpat=".starpat.": has +path_extra") + if !exists("w:netrw_explore_indx") + let w:netrw_explore_indx= 0 + endif + + let indx = a:indx +" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]") + + if indx == -1 + " Nexplore +" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")") + if !exists("w:netrw_explore_list") " sanity check + call netrw#ErrorMsg(s:WARNING,"using Nexplore or improperly; see help for netrw-starstar",40) + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore") + return + endif + let indx= w:netrw_explore_indx + if indx < 0 | let indx= 0 | endif + if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif + let curfile= w:netrw_explore_list[indx] +" call Decho("indx=".indx." curfile<".curfile.">") + while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx] + let indx= indx + 1 +" call Decho("indx=".indx." (Nexplore while loop)") + endwhile + if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif +" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx) + + elseif indx == -2 + " Pexplore +" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")") + if !exists("w:netrw_explore_list") " sanity check + call netrw#ErrorMsg(s:WARNING,"using Pexplore or improperly; see help for netrw-starstar",41) + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore") + return + endif + let indx= w:netrw_explore_indx + if indx < 0 | let indx= 0 | endif + if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif + let curfile= w:netrw_explore_list[indx] +" call Decho("indx=".indx." curfile<".curfile.">") + while indx >= 0 && curfile == w:netrw_explore_list[indx] + let indx= indx - 1 +" call Decho("indx=".indx." (Pexplore while loop)") + endwhile + if indx < 0 | let indx= 0 | endif +" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx) + + else + " Explore -- initialize + " build list of files to Explore with Nexplore/Pexplore +" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")") + let w:netrw_explore_indx= 0 + if !exists("b:netrw_curdir") + let b:netrw_curdir= getcwd() + endif +" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">") + + " switch on starpat to build the w:netrw_explore_list of files + if starpat == 1 + " starpat=1: Explore *//pattern (current directory only search for files containing pattern) +" call Decho("starpat=".starpat.": build *//pattern list") +" call Decho("pattern<".pattern.">") + exe "vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*" + let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)') + if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif + + elseif starpat == 2 + " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) +" call Decho("starpat=".starpat.": build **//pattern list") + try + exe "silent vimgrep /".pattern."/gj "."**/*" + catch /^Vim\%((\a\+)\)\=:E480/ + call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45) + if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore : no files matched pattern") + return + endtry + let s:netrw_curdir = b:netrw_curdir + let w:netrw_explore_list = getqflist() + let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)') + + elseif starpat == 3 + " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) +" call Decho("starpat=".starpat.": build */filepat list") + let filepat= substitute(dirname,'^\*/','','') + let filepat= substitute(filepat,'^[%#<]','\\&','') +" call Decho("b:netrw_curdir<".b:netrw_curdir.">") +" call Decho("filepat<".filepat.">") + let w:netrw_explore_list= split(expand(b:netrw_curdir."/".filepat),'\n') + if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif + + elseif starpat == 4 + " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) +" call Decho("starpat=".starpat.": build **/filepat list") + let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n') + if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif + endif " switch on starpat to build w:netrw_explore_list + + let w:netrw_explore_listlen = len(w:netrw_explore_list) +" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">") +" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen) + + if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/') + call netrw#ErrorMsg(s:WARNING,"no files matched",42) + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore : no files matched") + return + endif + endif " if indx ... endif + + " NetrwStatusLine support - for exploring support + let w:netrw_explore_indx= indx +" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen) + + " wrap the indx around, but issue a note + if indx >= w:netrw_explore_listlen || indx < 0 +" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")") + let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0 + let w:netrw_explore_indx= indx + call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43) + endif + + exe "let dirfile= w:netrw_explore_list[".indx."]" +" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">") + let newdir= substitute(dirfile,'/[^/]*$','','e') +" call Decho("newdir<".newdir.">") + +" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)") + call netrw#LocalBrowseCheck(newdir) + if !exists("w:netrw_liststyle") + let w:netrw_liststyle= g:netrw_liststyle + endif + if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST + call search('^'.substitute(dirfile,"^.*/","","").'\>',"W") + else + call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w") + endif + let w:netrw_explore_mtchcnt = indx + 1 + let w:netrw_explore_bufnr = bufnr("%") + let w:netrw_explore_line = line(".") + call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}') +" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line) + + else +" call Decho("your vim does not have +path_extra") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44) + endif + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore : missing +path_extra") + return + endif + + else +" call Decho("case Explore newdir<".dirname.">") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/' + silent! unlet w:netrw_treedict + silent! unlet w:netrw_treetop + endif + let newdir= dirname + if !exists("b:netrw_curdir") + call netrw#LocalBrowseCheck(getcwd()) + else + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir)) + endif + endif + + " visual display of **/ **// */ Exploration files + if exists("w:netrw_explore_indx") && exists("b:netrw_curdir") + if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir + " only update match list if current directory isn't the same as before + let s:explore_prvdir = b:netrw_curdir + let s:explore_match = "" + let dirlen = strlen(b:netrw_curdir) + if b:netrw_curdir !~ '/$' + let dirlen= dirlen + 1 + endif + let prvfname= "" + for fname in w:netrw_explore_list +" call Decho("fname<".fname.">") +"COMBAK -- g:netrw_markfileesc."'".g:netrw_markfileesc."'" ??? + if fname =~ '^'.b:netrw_curdir + if s:explore_match == "" + let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>' + else + let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>' + endif + elseif fname !~ '^/' && fname != prvfname + if s:explore_match == "" + let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>' + else + let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>' + endif + endif + let prvfname= fname + endfor +" call Decho("explore_match<".s:explore_match.">") + exe "2match netrwMarkFile /".s:explore_match."/" + endif + echo "==Pexplore ==Nexplore" + else + 2match none + if exists("s:explore_match") | unlet s:explore_match | endif + if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif + echo " " +" call Decho("cleared explore match list") + endif + + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore : @/<".@/.">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2 +" and switches the hiding mode. The actual hiding is done by +" s:NetrwListHide(). +" g:netrw_hide= 0: show all +" 1: show not-hidden files +" 2: show hidden files only +fun! s:NetrwHide(islocal) +" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide) + let svpos= netrw#NetrwSavePosn() + + if exists("s:netrwmarkfilelist_{bufnr('%')}") +" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">") +" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">") + + " hide the files in the markfile list + for fname in s:netrwmarkfilelist_{bufnr("%")} +" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk) + if match(g:netrw_list_hide,'\<'.fname.'\>') != -1 + " remove fname from hiding list + let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','') + let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g') + let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','') +" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">") + else + " append fname to hiding list + if exists("g:netrw_list_hide") && g:netrw_list_hide != "" + let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>' + else + let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>' + endif +" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">") + endif + endfor + call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir) + let g:netrw_hide= 1 + + else + + " switch between show-all/show-not-hidden/show-hidden + let g:netrw_hide=(g:netrw_hide+1)%3 + exe "norm! 0" + if g:netrw_hide && g:netrw_list_hide == "" + call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49) +" call Dret("NetrwHide") + return + endif + endif + + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) +" call Dret("NetrwHide") +endfun + +" --------------------------------------------------------------------- +" s:NetrwHidden: invoked by "gh" {{{2 +fun! s:NetrwHidden(islocal) +" call Dfunc("s:NetrwHidden()") + " save current position + let svpos= netrw#NetrwSavePosn() + + if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+' + " remove pattern from hiding list + let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','') + elseif strlen(g:netrw_list_hide) >= 1 + let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+' + else + let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+' + endif + + " refresh screen and return to saved position + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) +" call Dret("s:NetrwHidden") +endfun + +" --------------------------------------------------------------------- +" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2 +fun! s:NetrwHome() +" call Dfunc("s:NetrwHome()") + if exists("g:netrw_home") + let home= g:netrw_home + else + " go to vim plugin home + for home in split(&rtp,',') + [''] + if isdirectory(home) && filewritable(home) | break | endif + let basehome= substitute(home,'[/\\]\.vim$','','') + if isdirectory(basehome) && filewritable(basehome) + let home= basehome."/.vim" + break + endif + endfor + if home == "" + " just pick the first directory +" call Decho("just pick first directory in &rtp") + let home= substitute(&rtp,',.*$','','') + endif + if (has("win32") || has("win95") || has("win64") || has("win16")) + let home= substitute(home,'/','\\','g') + endif + endif + " insure that the home directory exists +" call Decho("picked home<".home.">") + if !isdirectory(home) + if exists("g:netrw_mkdir") +" call Decho("home<".home."> isn't a directory -- making it now with g:netrw_mkdir<".g:netrw_mkdir.">") +" call Decho("system(".g:netrw_mkdir." ".s:Escape(home).")") + call system(g:netrw_mkdir." ".s:Escape(home)) + else +" call Decho("home<".home."> isn't a directory -- making it now with mkdir()") + call mkdir(home) + endif + endif + let g:netrw_home= home +" call Dret("s:NetrwHome <".home.">") + return home +endfun + +" --------------------------------------------------------------------- +" s:NetrwLeftmouse: handles the when in a netrw browsing window {{{2 +fun! s:NetrwLeftmouse(islocal) +" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")") + if a:islocal + if exists("b:netrw_curdir") + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) + endif + else + if exists("b:netrw_curdir") + call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) + endif + endif +" call Dret("s:NetrwLeftmouse") +endfun + +" --------------------------------------------------------------------- +" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2 +" separated patterns given in g:netrw_list_hide +fun! s:NetrwListHide() +" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">") + + " find a character not in the "hide" string to use as a separator for :g and :v commands + " How-it-works: take the hiding command, convert it into a range. Duplicate + " characters don't matter. Remove all such characters from the '/~...90' + " string. Use the first character left as a separator character. + let listhide= g:netrw_list_hide + let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1) +" call Decho("sep=".sep) + + while listhide != "" + if listhide =~ ',' + let hide = substitute(listhide,',.*$','','e') + let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e') + else + let hide = listhide + let listhide = "" + endif + + " Prune the list by hiding any files which match + if g:netrw_hide == 1 +" call Decho("hiding<".hide."> listhide<".listhide.">") + exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d' + elseif g:netrw_hide == 2 +" call Decho("showing<".hide."> listhide<".listhide.">") + exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @' + endif + endwhile + if g:netrw_hide == 2 + exe 'silent keepjumps '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d' + exe 'silent keepjumps '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e' + endif + +" call Dret("NetrwListHide") +endfun + +" --------------------------------------------------------------------- +" NetrwHideEdit: allows user to edit the file/directory hiding list +fun! s:NetrwHideEdit(islocal) +" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")") + + " save current cursor position + let svpos= netrw#NetrwSavePosn() + + " get new hiding list from user + call inputsave() + let newhide= input("Edit Hiding List: ",g:netrw_list_hide) + call inputrestore() + let g:netrw_list_hide= newhide +" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">") + + " refresh the listing + silent call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./")) + + " restore cursor position + call netrw#NetrwRestorePosn(svpos) + +" call Dret("NetrwHideEdit") +endfun + +" --------------------------------------------------------------------- +" NetSortSequence: allows user to edit the sorting sequence +fun! s:NetSortSequence(islocal) +" call Dfunc("NetSortSequence(islocal=".a:islocal.")") + + let svpos= netrw#NetrwSavePosn() + call inputsave() + let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence) + call inputrestore() + + " refresh the listing + let g:netrw_sort_sequence= newsortseq + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + +" call Dret("NetSortSequence") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2 +fun! s:NetrwMakeDir(usrhost) +" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)") + + " get name of new directory from user. A bare will skip. + " if its currently a directory, also request will be skipped, but with + " a message. + call inputsave() + let newdirname= input("Please give directory name: ") + call inputrestore() +" call Decho("newdirname<".newdirname.">") + + if newdirname == "" +" call Dret("NetrwMakeDir : user aborted with bare ") + return + endif + + if a:usrhost == "" +" call Decho("local mkdir") + + " Local mkdir: + " sanity checks + let fullnewdir= b:netrw_curdir.'/'.newdirname +" call Decho("fullnewdir<".fullnewdir.">") + if isdirectory(fullnewdir) + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24) + endif +" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously") + return + endif + if s:FileReadable(fullnewdir) + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25) + endif +" call Dret("NetrwMakeDir : file<".newdirname."> exists previously") + return + endif + + " requested new local directory is neither a pre-existing file or + " directory, so make it! + if exists("*mkdir") + call mkdir(fullnewdir,"p") + else + let netrw_origdir= s:NetrwGetcwd(1) + exe 'keepjumps lcd '.fnameescape(b:netrw_curdir) +" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">") +" call Decho("exe silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1)) + exe "silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1) + if !g:netrw_keepdir + exe 'keepjumps lcd '.fnameescape(netrw_origdir) +" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">") + endif + endif + + if v:shell_error == 0 + " refresh listing +" call Decho("refresh listing") + let svpos= netrw#NetrwSavePosn() + call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) + call netrw#NetrwRestorePosn(svpos) + elseif !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26) + endif +" redraw! + + elseif !exists("b:netrw_method") || b:netrw_method == 4 + " Remote mkdir: +" call Decho("remote mkdir") + let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd) + let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname +" call Decho("exe silent! !".mkdircmd." ".shellescape(newdirname,1)) + exe "silent! !".mkdircmd." ".shellescape(newdirname,1) + if v:shell_error == 0 + " refresh listing + let svpos= netrw#NetrwSavePosn() + call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) + call netrw#NetrwRestorePosn(svpos) + elseif !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27) + endif +" redraw! + + elseif b:netrw_method == 2 + " COMBAK -- future work + call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68) + elseif b:netrw_method == 3 + " COMBAK -- future work + call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68) + endif + +" call Dret("NetrwMakeDir") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2 +" mark and unmark files. If a markfile list exists, +" then the rename and delete functions will use it instead +" of whatever may happen to be under the cursor at that +" moment. When the mouse and gui are available, +" shift-leftmouse may also be used to mark files. +" +" Creates two lists +" s:netrwmarkfilelist -- holds complete paths to all marked files +" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr()) +" +" Creates a marked file match string +" s:netrwmarfilemtch_# -- used with 2match to display marked files +" +" Creates a buffer version of islocal +" b:netrw_islocal +" +fun! s:NetrwMarkFile(islocal,fname) +" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)") + let curbufnr= bufnr("%") + let curdir = b:netrw_curdir + if exists("s:netrwmarkfilelist_{curbufnr}") + " markfile list exists +" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">") +" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">") + let b:netrw_islocal= a:islocal + + if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1 + " append filename to buffer's markfilelist +" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">") + call add(s:netrwmarkfilelist_{curbufnr},a:fname) + let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' + + else + " remove filename from buffer's markfilelist +" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">") + call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname') + if s:netrwmarkfilelist_{curbufnr} == [] + " local markfilelist is empty; remove it entirely +" call Decho("markfile list now empty") + call s:NetrwUnmarkList(curbufnr,curdir) + else + " rebuild match list to display markings correctly +" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr) + let s:netrwmarkfilemtch_{curbufnr}= "" + let first = 1 + for fname in s:netrwmarkfilelist_{curbufnr} + if first + let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' + else + let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' + endif + let first= 0 + endfor +" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">") +" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">") + endif + endif + + else + " initialize new markfilelist + +" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr) + let s:netrwmarkfilelist_{curbufnr}= [] + call add(s:netrwmarkfilelist_{curbufnr},a:fname) +" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">") + + " build initial markfile matching pattern + if a:fname =~ '/$' + let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc) + else + let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).'\>' + endif +" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">") + endif + + " handle global markfilelist + if exists("s:netrwmarkfilelist") + let dname= s:ComposePath(b:netrw_curdir,a:fname) + if index(s:netrwmarkfilelist,dname) == -1 + " append new filename to global markfilelist + call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname)) +" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">") + else + " remove new filename from global markfilelist +" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")") + call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"') +" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">") + if s:netrwmarkfilelist == [] + unlet s:netrwmarkfilelist + endif + endif + else + " initialize new global-directory markfilelist + let s:netrwmarkfilelist= [] + call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname)) +" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">") + endif + + " set up 2match'ing to netrwmarkfilemtch list + if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != "" +" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/") + exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/" + else +" call Decho("2match none") + 2match none + endif +" call Dret("s:NetrwMarkFile : netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2 +" compress/decompress files using the programs +" in g:netrw_compress and g:netrw_uncompress, +" using g:netrw_compress_suffix to know which to +" do. By default: +" g:netrw_compress = "gzip" +" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"} +fun! s:NetrwMarkFileCompress(islocal) +" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress") + for fname in s:netrwmarkfilelist_{curbufnr} + " for every filename in the marked list + for sfx in sort(keys(g:netrw_decompress)) + if fname =~ '\'.sfx.'$' + " fname has a suffix indicating that its compressed; apply associated decompression routine + let exe= s:WinPath(g:netrw_decompress[sfx]) +" call Decho("fname<".fname."> is compressed so decompress with <".exe.">") + if a:islocal + if g:netrw_keepdir + let fname= shellescape(s:ComposePath(curdir,fname)) + endif + else + let fname= shellescape(b:netrw_curdir.fname,1) + endif + if executable(exe) + if a:islocal + call system(exe." ".fname) + else + call s:RemoteSystem(exe." ".fname) + endif + else + call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50) + endif + break + endif + endfor + if exists("exe") + unlet exe + elseif a:islocal + " fname not a compressed file, so compress it + call system(s:WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname))) + else + " fname not a compressed file, so compress it + call s:RemoteSystem(s:WinPath(g:netrw_compress)." ".shellescape(fname)) + endif + endfor + call s:NetrwUnmarkList(curbufnr,curdir) + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + endif +" call Dret("s:NetrwMarkFileCompress") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2 +" If no marked files, then set up directory as the +" target. Currently does not support copying entire +" directories. Uses the local-buffer marked file list. +" Returns 1=success (used by NetrwMarkFileMove()) +" 0=failure +fun! s:NetrwMarkFileCopy(islocal) +" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">") + + " sanity checks + if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')}) + call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileCopy 0") + return 0 + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')})) + if !exists("s:netrwmftgt") + call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67) +" call Dret("s:NetrwMarkFileCopy 0") + return 0 + endif +" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">") + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + if a:islocal && s:netrwmftgt_islocal + " Copy marked files, local directory to local directory +" call Decho("copy from local to local") + let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)")) +" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")") + call system(s:WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt)) + + elseif a:islocal && !s:netrwmftgt_islocal + " Copy marked files, local directory to remote directory +" call Decho("copy from local to remote") + call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt) + + elseif !a:islocal && s:netrwmftgt_islocal +" call Decho("copy from remote to local") + call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt) + + elseif !a:islocal && !s:netrwmftgt_islocal +" call Decho("copy from remote to remote") + let curdir = getcwd() + let tmpdir = s:GetTempfile("") + if tmpdir !~ '/' + let tmpdir= curdir."/".tmpdir + endif + if exists("*mkdir") + call mkdir(tmpdir) + else + exe "silent! !".g:netrw_local_mkdir.' '.shellescape(tmpdir,1) + endif + if isdirectory(tmpdir) + exe "keepjumps lcd ".fnameescape(tmpdir) + call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir) + let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")') + call s:NetrwUpload(localfiles,s:netrwmftgt) + if getcwd() == tmpdir + for fname in s:netrwmarkfilelist_{bufnr('%')} + call s:NetrwDelete(fname) + endfor + exe "keepjumps lcd ".fnameescape(curdir) + exe "silent !".g:netrw_local_rmdir." ".shellescape(tmpdir,1) + else + exe "keepjumps lcd ".fnameescape(curdir) + endif + endif + endif + + " ------- + " cleanup + " ------- +" call Decho("cleanup") + + " remove markings from local buffer + call s:NetrwUnmarkList(curbufnr,curdir) + + " refresh buffers + if !s:netrwmftgt_islocal + call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt) + endif + if a:islocal + call s:NetrwRefreshDir(a:islocal,b:netrw_curdir) + endif + if g:netrw_fastbrowse <= 1 + call s:LocalBrowseShellCmdRefresh() + endif + +" call Dret("s:NetrwMarkFileCopy 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2 +" invoke vim's diff mode on the marked files. +" Either two or three files can be so handled. +" Uses the global marked file list. +fun! s:NetrwMarkFileDiff(islocal) +" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">") + let curbufnr= bufnr("%") + + if exists("s:netrwmarkfilelist_{curbufnr}") + let cnt = 0 + let curdir = b:netrw_curdir + for fname in s:netrwmarkfilelist + let cnt= cnt + 1 + if cnt == 1 +" call Decho("diffthis: fname<".fname.">") + exe "e ".fnameescape(fname) + diffthis + elseif cnt == 2 || cnt == 3 + vsplit + wincmd l +" call Decho("diffthis: ".fname) + exe "e ".fnameescape(fname) + diffthis + else + break + endif + endfor + call s:NetrwUnmarkList(curbufnr,curdir) + endif + +" call Dret("s:NetrwMarkFileDiff") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2 +" Uses global markfilelist +fun! s:NetrwMarkFileEdit(islocal) +" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")") + + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + if exists("s:netrwmarkfilelist_{curbufnr}") + call s:SetRexDir(a:islocal,curdir) + let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)")) + " unmark markedfile list +" call s:NetrwUnmarkList(curbufnr,curdir) + call s:NetrwUnmarkAll() +" call Decho("exe silent args ".flist) + exe "silent args ".flist + endif + +" call Dret("s:NetrwMarkFileEdit") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2 +" Uses the local marked-file list. +fun! s:NetrwMarkFileExe(islocal) +" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + if exists("s:netrwmarkfilelist_{curbufnr}") + " get the command + call inputsave() + let cmd= input("Enter command: ","","file") + call inputrestore() +" call Decho("cmd<".cmd.">") + + " apply command to marked files. Substitute: filename -> % + " If no %, then append a space and the filename to the command + for fname in s:netrwmarkfilelist_{curbufnr} + if a:islocal + if g:netrw_keepdir + let fname= shellescape(s:WinPath(s:ComposePath(curdir,fname))) + endif + else + let fname= shellescape(s:WinPath(b:netrw_curdir.fname)) + endif + if cmd =~ '%' + let xcmd= substitute(cmd,'%',fname,'g') + else + let xcmd= cmd.' '.fname + endif + if a:islocal +" call Decho("local: xcmd<".xcmd.">") + let ret= system(xcmd) + else +" call Decho("remote: xcmd<".xcmd.">") + let ret= s:RemoteSystem(xcmd) + endif + if v:shell_error < 0 + call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54) + break + else + echo ret + endif + endfor + + " unmark marked file list + call s:NetrwUnmarkList(curbufnr,curdir) + + " refresh the listing + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + else + call netrw#ErrorMsg(s:ERROR,"no files marked!",59) + endif + +" call Dret("s:NetrwMarkFileExe") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix +" as the marked file(s) (toggles suffix presence) +" Uses the local marked file list. +fun! s:NetrwMarkHideSfx(islocal) +" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curbufnr = bufnr("%") + + " s:netrwmarkfilelist_{curbufnr}: the List of marked files + if exists("s:netrwmarkfilelist_{curbufnr}") + + for fname in s:netrwmarkfilelist_{curbufnr} +" call Decho("s:NetrwMarkFileCopy: fname<".fname.">") + " construct suffix pattern + if fname =~ '\.' + let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','') + else + let sfxpat= '^\%(\%(\.\)\@!.\)*$' + endif + " determine if its in the hiding list or not + let inhidelist= 0 + if g:netrw_list_hide != "" + let itemnum = 0 + let hidelist= split(g:netrw_list_hide,',') + for hidepat in hidelist + if sfxpat == hidepat + let inhidelist= 1 + break + endif + let itemnum= itemnum + 1 + endfor + endif +" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">") + if inhidelist + " remove sfxpat from list + call remove(hidelist,itemnum) + let g:netrw_list_hide= join(hidelist,",") + elseif g:netrw_list_hide != "" + " append sfxpat to non-empty list + let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat + else + " set hiding list to sfxpat + let g:netrw_list_hide= sfxpat + endif + endfor + + " refresh the listing + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + else + call netrw#ErrorMsg(s:ERROR,"no files marked!",59) + endif + +" call Dret("s:NetrwMarkHideSfx") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2 +" Uses the global markfilelist +fun! s:NetrwMarkFileGrep(islocal) +" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curbufnr = bufnr("%") + + if exists("s:netrwmarkfilelist") +" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">") + let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)")) + call s:NetrwUnmarkAll() + + " ask user for pattern + call inputsave() + let pat= input("Enter pattern: ","") + call inputrestore() + if pat !~ '^\s' + if pat !~ '^/' + let pat= '/'.pat.'/' + endif + let pat= " ".pat + endif + + " use vimgrep for both local and remote +" call Decho("exe vimgrep".pat." ".netrwmarkfilelist) + exe "vimgrep".pat." ".netrwmarkfilelist + + 2match none + call netrw#NetrwRestorePosn(svpos) + endif + +" call Dret("s:NetrwMarkFileGrep") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2 +" uses the global marked file list +" s:netrwmfloc= 0: target directory is remote +" = 1: target directory is local +fun! s:NetrwMarkFileMove(islocal) +" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")") + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + " sanity check + if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')}) + call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileMove") + return + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')})) + if !exists("s:netrwmftgt") + call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67) +" call Dret("s:NetrwMarkFileCopy 0") + return 0 + endif +" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">") + + if a:islocal && s:netrwmftgt_islocal + " move: local -> local +" call Decho("move from local to local") +" call Decho("(s:NetrwMarkFileMove) local to local move") + if executable(g:netrw_localmovecmd) + for fname in s:netrwmarkfilelist_{bufnr("%")} +" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")") + let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt)) + if v:shell_error < 0 + call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54) + break + endif + endfor + else + call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57) + endif + + elseif a:islocal && !s:netrwmftgt_islocal + " move: local -> remote +" call Decho("move from local to remote") +" call Decho("copy") + let mflist= s:netrwmarkfilelist_{bufnr("%")} + call s:NetrwMarkFileCopy(a:islocal) +" call Decho("remove") + for fname in mflist + let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') + let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1) + endfor + unlet mflist + + elseif !a:islocal && s:netrwmftgt_islocal + " move: remote -> local +" call Decho("move from remote to local") +" call Decho("copy") + let mflist= s:netrwmarkfilelist_{bufnr("%")} + call s:NetrwMarkFileCopy(a:islocal) +" call Decho("remove") + for fname in mflist + let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') + let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1) + endfor + unlet mflist + + elseif !a:islocal && !s:netrwmftgt_islocal + " move: remote -> remote +" call Decho("move from remote to remote") +" call Decho("copy") + let mflist= s:netrwmarkfilelist_{bufnr("%")} + call s:NetrwMarkFileCopy(a:islocal) +" call Decho("remove") + for fname in mflist + let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') + let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1) + endfor + unlet mflist + endif + + " ------- + " cleanup + " ------- +" call Decho("cleanup") + + " remove markings from local buffer + call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer + + " refresh buffers + if !s:netrwmftgt_islocal + call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt) + endif + if a:islocal + call s:NetrwRefreshDir(a:islocal,b:netrw_curdir) + endif + if g:netrw_fastbrowse <= 1 + call s:LocalBrowseShellCmdRefresh() + endif + +" call Dret("s:NetrwMarkFileMove") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2 +" using the hardcopy command. Local marked-file list only. +fun! s:NetrwMarkFilePrint(islocal) +" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")") + let curbufnr= bufnr("%") + if exists("s:netrwmarkfilelist_{curbufnr}") + let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr} + let curdir = b:netrw_curdir + call s:NetrwUnmarkList(curbufnr,curdir) + for fname in netrwmarkfilelist + if a:islocal + if g:netrw_keepdir + let fname= s:ComposePath(curdir,fname) + endif + else + let fname= curdir.fname + endif + 1split + " the autocmds will handle both local and remote files +" call Decho("exe silent e ".escape(fname,' ')) + exe "silent e ".fnameescape(fname) +" call Decho("hardcopy") + hardcopy + q + endfor + 2match none + endif +" call Dret("s:NetrwMarkFilePrint") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2 +" files when given a regexp (for which a prompt is +" issued). +fun! s:NetrwMarkFileRegexp(islocal) +" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")") + + " get the regular expression + call inputsave() + let regexp= input("Enter regexp: ","","file") + call inputrestore() + + if a:islocal + " get the matching list of files using local glob() +" call Decho("handle local regexp") + let dirname = escape(b:netrw_curdir,g:netrw_glob_escape) + let filelist = glob(s:ComposePath(dirname,regexp)) + if filelist != "" + let filelist= filelist."\n" + endif + + " mark the list of files + while filelist != "" + if filelist =~ '\n' + let filename = substitute(filelist,'\n.*$','','e') + let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e') + else + let filename = filelist + let filelist = "" + endif +" call Decho("filelist<".filelist.">") +" call Decho("filename<".filename.">") + call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','','')) + endwhile + + else +" call Decho("handle remote regexp") + + " convert displayed listing into a filelist + let eikeep = &ei + let areg = @a + silent %y a + set ei=all ma +" call Decho("set ei=all ma") + 1split + enew + silent norm! "ap + 2 + let bannercnt= search('^" =====','W') + exe "silent 1,".bannercnt."d" + set bt=nofile + if g:netrw_liststyle == s:LONGLIST + silent %s/\s\{2,}\S.*$//e + elseif g:netrw_liststyle == s:WIDELIST + silent %s/\s\{2,}/\r/ge + elseif g:netrw_liststyle == s:TREELIST + silent %s/^| //e + silent! g/^ .*$/d + endif + " convert regexp into the more usual glob-style format + let regexp= substitute(regexp,'\*','.*','g') +" call Decho("regexp<".regexp.">") + exe "silent! v/".escape(regexp,'/')."/d" + let filelist= getline(1,line("$")) + q! + for filename in filelist + call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','','')) + endfor + unlet filelist + let @a = areg + let &ei = eikeep + endif + +" call Dret("s:NetrwMarkFileRegexp") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2 +" Uses the local marked file list. +fun! s:NetrwMarkFileSource(islocal) +" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")") + let curbufnr= bufnr("%") + if exists("s:netrwmarkfilelist_{curbufnr}") + let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")} + let curdir = b:netrw_curdir + call s:NetrwUnmarkList(curbufnr,curdir) + for fname in netrwmarkfilelist + if a:islocal + if g:netrw_keepdir + let fname= s:ComposePath(curdir,fname) + endif + else + let fname= curdir.fname + endif + " the autocmds will handle sourcing both local and remote files +" call Decho("exe so ".fnameescape(fname)) + exe "so ".fnameescape(fname) + endfor + 2match none + endif +" call Dret("s:NetrwMarkFileSource") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2 +" Uses the global markfilelist +fun! s:NetrwMarkFileTag(islocal) +" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + if exists("s:netrwmarkfilelist") +" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">") + let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")")) + call s:NetrwUnmarkAll() + + if a:islocal + if executable(g:netrw_ctags) +" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")") + call system(g:netrw_ctags." ".netrwmarkfilelist) + else + call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51) + endif + else + let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist) + call netrw#NetrwObtain(a:islocal,"tags") + let curdir= b:netrw_curdir + 1split + e tags + let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','') +" call Decho("curdir<".curdir."> path<".path.">") + exe '%s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e' + wq! + endif + 2match none + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + endif + +" call Dret("s:NetrwMarkFileTag") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2 +" Sets up two variables, +" s:netrwmftgt : holds the target directory +" s:netrwmftgt_islocal : 0=target directory is remote +" 1=target directory is local +fun! s:NetrwMarkFileTgt(islocal) +" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curdir = b:netrw_curdir + let hadtgt = exists("s:netrwmftgt") + if !exists("w:netrw_bannercnt") + let w:netrw_bannercnt= b:netrw_bannercnt + endif + + " set up target + if line(".") < w:netrw_bannercnt + " if cursor in banner region, use b:netrw_curdir for the target + let s:netrwmftgt= b:netrw_curdir +" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">") + + else + " get word under cursor. + " * If directory, use it for the target. + " * If file, use b:netrw_curdir for the target + let curword= s:NetrwGetWord() + let tgtdir = s:ComposePath(curdir,curword) + if a:islocal && isdirectory(tgtdir) + let s:netrwmftgt = tgtdir +" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">") + elseif !a:islocal && tgtdir =~ '/$' + let s:netrwmftgt = tgtdir +" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">") + else + let s:netrwmftgt = curdir +" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">") + endif + endif + if a:islocal + " simplify the target (eg. /abc/def/../ghi -> /abc/ghi) + let s:netrwmftgt= simplify(s:netrwmftgt) +" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">") + endif + if g:netrw_cygwin + let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','') + let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','') + endif + let s:netrwmftgt_islocal= a:islocal + + if g:netrw_fastbrowse <= 1 + call s:LocalBrowseShellCmdRefresh() + endif + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + if !hadtgt + norm! j + endif + +" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwOpenFile: query user for a filename and open it {{{2 +fun! s:NetrwOpenFile(islocal) +" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")") + call inputsave() + let fname= input("Enter filename: ") + call inputrestore() + if fname !~ '[/\\]' + if exists("b:netrw_curdir") + if exists("g:netrw_quiet") + let netrw_quiet_keep = g:netrw_quiet + endif + let g:netrw_quiet = 1 + if b:netrw_curdir =~ '/$' + exe "e ".fnameescape(b:netrw_curdir.fname) + else + exe "e ".fnameescape(b:netrw_curdir."/".fname) + endif + if exists("netrw_quiet_keep") + let g:netrw_quiet= netrw_quiet_keep + else + unlet g:netrw_quiet + endif + endif + else + exe "e ".fnameescape(fname) + endif +" call Dret("s:NetrwOpenFile") +endfun + +" --------------------------------------------------------------------- +" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2 +fun! s:NetrwUnmarkList(curbufnr,curdir) +" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)") + + " remove all files in local marked-file list from global list + if exists("s:netrwmarkfilelist_{a:curbufnr}") + for mfile in s:netrwmarkfilelist_{a:curbufnr} + let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile + let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile + call remove(s:netrwmarkfilelist,idx) " remove from global list + endfor + if s:netrwmarkfilelist == [] + unlet s:netrwmarkfilelist + endif + + " getting rid of the local marked-file lists is easy + unlet s:netrwmarkfilelist_{a:curbufnr} + endif + if exists("s:netrwmarkfilemtch_{a:curbufnr}") + unlet s:netrwmarkfilemtch_{a:curbufnr} + endif + 2match none +" call Dret("s:NetrwUnmarkList") +endfun + +" --------------------------------------------------------------------- +" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2 +fun! s:NetrwUnmarkAll() +" call Dfunc("s:NetrwUnmarkAll()") + if exists("s:netrwmarkfilelist") + unlet s:netrwmarkfilelist + endif + silent call s:NetrwUnmarkAll2() + 2match none +" call Dret("s:NetrwUnmarkAll") +endfun + +" --------------------------------------------------------------------- +" s:NetrwUnmarkAll2: {{{2 +fun! s:NetrwUnmarkAll2() +" call Dfunc("s:NetrwUnmarkAll2()") + redir => netrwmarkfilelist_let + let + redir END + let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list + call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_ + call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to + for flist in netrwmarkfilelist_list + let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','') + unlet s:netrwmarkfilelist_{curbufnr} + unlet s:netrwmarkfilemtch_{curbufnr} + endfor +" call Dret("s:NetrwUnmarkAll2") +endfun + +" --------------------------------------------------------------------- +" s:NetrwUnMarkFile: {{{2 +fun! s:NetrwUnMarkFile(islocal) +" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curbufnr = bufnr("%") + + " unmark marked file list (although I expect s:NetrwUpload() + " to do it, I'm just making sure) + if exists("s:netrwmarkfilelist_{bufnr('%')}") +" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%")) + unlet s:netrwmarkfilelist + unlet s:netrwmarkfilelist_{curbufnr} + unlet s:netrwmarkfilemtch_{curbufnr} + 2match none + endif + +" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) +" call Dret("s:NetrwUnMarkFile") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMenu: generates the menu for gvim and netrw {{{2 +fun! s:NetrwMenu(domenu) + + if !exists("g:NetrwMenuPriority") + let g:NetrwMenuPriority= 80 + endif + + if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu +" call Dfunc("NetrwMenu(domenu=".a:domenu.")") + + if !exists("s:netrw_menu_enabled") && a:domenu +" call Decho("initialize menu") + let s:netrw_menu_enabled= 1 + exe 'silent! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help ' + exe 'silent! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :' + exe 'silent! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory- -' + exe 'silent! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewerx x' + exe 'silent! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directorymb mb' + exe 'silent! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)u u' + exe 'silent! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)U U' + exe 'silent! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Listqb qb' + exe 'silent! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List'." \'" + exe 'silent! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ SequenceS S' + exe 'silent! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files'."gh gh" + exe 'silent! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing'." \" + exe 'silent! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options:NetrwSettings '.":NetrwSettings\" + exe 'silent! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/DirectoryD D' + exe 'silent! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window '."\" + exe 'silent! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directoryp p' + exe 'silent! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ WindowP P' + exe 'silent! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Windowo o' + exe 'silent! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Windowv v' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore ' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only):Explore\ */ :Explore */' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs):Explore\ **/ :Explore **/' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (curdir\ only):Explore\ *// :Explore *//' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (+subdirs):Explore\ **// :Explore **//' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match:Nexplore :Nexplore' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match:Pexplore :Pexplore' + exe 'silent! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectoryd d' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Filemf mf' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexpmr mr' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Controla a' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Targetmc mc' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.DeleteD D' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diffmd md' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Editme me' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmdmx mx' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Targetmm mm' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.ObtainO O' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Printmp mp' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.ReplaceR R' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Targetmt mt' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.TagmT mT' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompressmz mz' + exe 'silent! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ FileO O' + exe 'silent! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)i i' + exe 'silent! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Showa a' + exe 'silent! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order'."r r" + exe 'silent! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)s s' + exe 'silent! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/DirectoryR R' + exe 'silent! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directoryc c' + call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x + let s:netrw_menucnt= 28 + + elseif !a:domenu + let s:netrwcnt = 0 + let curwin = winnr() + windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif + exe curwin."wincmd w" + + if s:netrwcnt <= 1 +" call Decho("clear menus") + exe 'silent! unmenu '.g:NetrwTopLvlMenu +" call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*') + silent! unlet s:netrw_menu_enabled + endif + endif +" call Dret("NetrwMenu") + endif + +endfun + +" --------------------------------------------------------------------- +" s:NetrwObtain: obtain file under cursor or from markfile list {{{2 +" Used by the O maps (as NetrwObtain()) +fun! s:NetrwObtain(islocal) +" call Dfunc("NetrwObtain(islocal=".a:islocal.")") + + if exists("s:netrwmarkfilelist_{bufnr('%')}") + let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://' + call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')}) + call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir) + else + call netrw#NetrwObtain(a:islocal,expand("")) + endif + +" call Dret("NetrwObtain") +endfun + +" --------------------------------------------------------------------- +" netrw#NetrwObtain: {{{2 +" netrw#NetrwObtain(islocal,fname[,tgtdirectory]) +" islocal=0 obtain from remote source +" =1 obtain from local source +" fname : a filename or a list of filenames +" tgtdir : optional place where files are to go (not present, uses getcwd()) +fun! netrw#NetrwObtain(islocal,fname,...) +" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0) + " NetrwStatusLine support - for obtaining support + + if type(a:fname) == 1 + let fnamelist= [ a:fname ] + elseif type(a:fname) == 3 + let fnamelist= a:fname + else + call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62) +" call Dret("netrw#NetrwObtain") + return + endif +" call Decho("fnamelist<".string(fnamelist).">") + if a:0 > 0 + let tgtdir= a:1 + else + let tgtdir= getcwd() + endif +" call Decho("tgtdir<".tgtdir.">") + + if exists("b:netrw_islocal") && b:netrw_islocal + " obtain a file from local b:netrw_curdir to (local) tgtdir +" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir) + if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir + let topath= s:ComposePath(tgtdir,"") + if (has("win32") || has("win95") || has("win64") || has("win16")) + " transfer files one at time +" call Decho("transfer files one at a time") + for fname in fnamelist +" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")") + call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath)) + endfor + else + " transfer files with one command +" call Decho("transfer files with one command") + let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)")) +" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")") + call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath)) + endif + elseif !exists("b:netrw_curdir") + call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36) + else + call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37) + endif + + else + " obtain files from remote b:netrw_curdir to local tgtdir +" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir) + if type(a:fname) == 1 + call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname) + endif + call s:NetrwMethod(b:netrw_curdir) + + if b:netrw_method == 4 + " obtain file using scp +" call Decho("obtain via scp (method#4)") + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " ".g:netrw_scpport." ".g:netrw_port + else + let useport= "" + endif + if b:netrw_fname =~ '/' + let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','') + else + let path= "" + endif + let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)')) +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)) + exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1) + + elseif b:netrw_method == 2 + " obtain file using ftp + .netrc +" call Decho("obtain via ftp+.netrc (method #2)") + call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars() + let tmpbufnr= bufnr("%") + setlocal ff=unix + if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" + put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) + endif + + if exists("b:netrw_fname") && b:netrw_fname != "" + call setline(line("$")+1,'cd "'.b:netrw_fname.'"') +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + for fname in fnamelist + call setline(line("$")+1,'get "'.fname.'"') +" call Decho("filter input: ".getline('$')) + endfor + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + else +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' + let debugkeep= &debug + setlocal debug=msg + call netrw#ErrorMsg(s:ERROR,getline(1),4) + let &debug= debugkeep + endif + + elseif b:netrw_method == 3 + " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc) +" call Decho("obtain via ftp+mipf (method #3)") + call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars() + let tmpbufnr= bufnr("%") + setlocal ff=unix + + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port +" call Decho("filter input: ".getline('$')) + else + put ='open '.g:netrw_machine +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid +" call Decho("filter input: ".getline('$')) + put ='\"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('$')) + else + put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" + put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) + endif + + if exists("b:netrw_fname") && b:netrw_fname != "" + call setline(line("$")+1,'cd "'.b:netrw_fname.'"') +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + for fname in fnamelist + call setline(line("$")+1,'get "'.fname.'"') + endfor +" call Decho("filter input: ".getline('$')) + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password + norm! 1Gdd +" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" +" call Decho("error<".getline(1).">") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,getline(1),5) + endif + endif + elseif !exists("b:netrw_method") || b:netrw_method < 0 +" call Dfunc("netrw#NetrwObtain : unsupported method") + return + endif + + " restore status line + if type(a:fname) == 1 && exists("s:netrw_users_stl") + call s:SetupNetrwStatusLine(s:netrw_users_stl) + endif + + endif + + " cleanup + if exists("tmpbufnr") + if bufnr("%") != tmpbufnr + exe tmpbufnr."bw!" + else + q! + endif + endif + +" call Dret("netrw#NetrwObtain") +endfun + +" --------------------------------------------------------------------- +" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2 +" If there's only one window, then the window will first be split. +" Returns: +" choice = 0 : didn't have to choose +" choice = 1 : saved modified file in window first +" choice = 2 : didn't save modified file, opened window +" choice = 3 : cancel open +fun! s:NetrwPrevWinOpen(islocal) +" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")") + + " grab a copy of the b:netrw_curdir to pass it along to newly split windows + let curdir = b:netrw_curdir + + " get last window number and the word currently under the cursor + let lastwinnr = winnr("$") + let curword = s:NetrwGetWord() + let choice = 0 +" call Decho("lastwinnr=".lastwinnr." curword<".curword.">") + + let didsplit = 0 + if lastwinnr == 1 + " if only one window, open a new one first +" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")") + if g:netrw_preview +" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s") + exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s" + else +" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") + exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" + endif + let didsplit = 1 + + else + call s:SaveBufVars() +" call Decho("wincmd p") + wincmd p + call s:RestoreBufVars() + " if the previous window's buffer has been changed (is modified), + " and it doesn't appear in any other extant window, then ask the + " user if s/he wants to abandon modifications therein. + let bnr = winbufnr(0) + let bnrcnt = 0 + if &mod +" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr()) + let eikeep= &ei + set ei=all + windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif + exe bnr."wincmd p" + let &ei= eikeep +" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr()) + if bnrcnt == 1 + let bufname= bufname(winbufnr(winnr())) + let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel") +" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr()) + + if choice == 1 + " Yes -- write file & then browse + let v:errmsg= "" + silent w + if v:errmsg != "" + call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30) + if didsplit + q + else + wincmd p + endif +" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">") + return choice + endif + + elseif choice == 2 + " No -- don't worry about changed file, just browse anyway + setlocal nomod + call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31) + wincmd p + + else + " Cancel -- don't do this + if didsplit + q + else + wincmd p + endif +" call Dret("NetrwPrevWinOpen ".choice." : cancelled") + return choice + endif + endif + endif + endif + + " restore b:netrw_curdir (window split/enew may have lost it) + let b:netrw_curdir= curdir + if a:islocal < 2 + if a:islocal + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword)) + else + call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword)) + endif + endif +" call Dret("NetrwPrevWinOpen ".choice) + return choice +endfun + +" --------------------------------------------------------------------- +" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2 +" Always assumed to be local -> remote +" call s:NetrwUpload(filename, target) +" call s:NetrwUpload(filename, target, fromdirectory) +fun! s:NetrwUpload(fname,tgt,...) +" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0) + + if a:tgt =~ '^\a\+://' + let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','') + else + let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','') + endif +" call Decho("tgtdir<".tgtdir.">") + + if a:0 > 0 + let fromdir= a:1 + else + let fromdir= getcwd() + endif +" call Decho("fromdir<".fromdir.">") + + if type(a:fname) == 1 + " handle uploading a single file using NetWrite +" call Decho("handle uploading a single file via NetWrite") + 1split +" call Decho("exe e ".fnameescape(a:fname)) + exe "e ".fnameescape(a:fname) +" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines") + if a:tgt =~ '/$' + let wfname= substitute(a:fname,'^.*/','','') +" call Decho("exe w! ".fnameescape(wfname)) + exe "w! ".fnameescape(a:tgt.wfname) + else +" call Decho("writing local->remote: exe w ".fnameescape(a:tgt)) + exe "w ".fnameescape(a:tgt) +" call Decho("done writing local->remote") + endif + q! + + elseif type(a:fname) == 3 + " handle uploading a list of files via scp +" call Decho("handle uploading a list of files via scp") + let curdir= getcwd() + if a:tgt =~ '^scp:' + exe "keepjumps silent lcd ".fnameescape(fromdir) + let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')}) + let args = join(map(filelist,"shellescape(v:val, 1)")) + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " ".g:netrw_scpport." ".g:netrw_port + else + let useport= "" + endif + let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','') + let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','') +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)) + exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1) + exe "keepjumps silent lcd ".fnameescape(curdir) + + elseif a:tgt =~ '^ftp:' + call s:NetrwMethod(a:tgt) + + if b:netrw_method == 2 + " handle uploading a list of files via ftp+.netrc + let netrw_fname = b:netrw_fname + silent keepjumps new +" call Decho("filter input window#".winnr()) + + put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) + + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + + call setline(line("$")+1,'lcd "'.fromdir.'"') +" call Decho("filter input: ".getline('$')) + + call setline(line("$")+1,'cd "'.tgtdir.'"') +" call Decho("filter input: ".getline('$')) + + for fname in a:fname + call setline(line("$")+1,'put "'.fname.'"') +" call Decho("filter input: ".getline('$')) + endfor + + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + else +" call Decho("filter input window#".winnr()) +" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + silent g/Local directory now/d + if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' + call netrw#ErrorMsg(s:ERROR,getline(1),14) + else + bw!|q + endif + + elseif b:netrw_method == 3 + " upload with ftp + machine, id, passwd, and fname (ie. no .netrc) + let netrw_fname= b:netrw_fname + call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars() + let tmpbufnr= bufnr("%") + setlocal ff=unix + + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port +" call Decho("filter input: ".getline('$')) + else + put ='open '.g:netrw_machine +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid +" call Decho("filter input: ".getline('$')) + call setline(line("$")+1,'"'.s:netrw_passwd.'"') +" call Decho("filter input: ".getline('$')) + else + put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('$')) + endif + + call setline(line("$")+1,'lcd "'.fromdir.'"') +" call Decho("filter input: ".getline('$')) + + if exists("b:netrw_fname") && b:netrw_fname != "" + call setline(line("$")+1,'cd "'.b:netrw_fname.'"') +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + + for fname in a:fname + call setline(line("$")+1,'put "'.fname.'"') +" call Decho("filter input: ".getline('$')) + endfor + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password + norm! 1Gdd +" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n") + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + silent g/Local directory now/d + if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' + let debugkeep= &debug + setlocal debug=msg + call netrw#ErrorMsg(s:ERROR,getline(1),15) + let &debug = debugkeep + let mod = 1 + else + bw!|q + endif + elseif !exists("b:netrw_method") || b:netrw_method < 0 +" call Dfunc("netrw#NetrwUpload : unsupported method") + return + endif + else + call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63) + endif + endif + +" call Dret("s:NetrwUpload") +endfun + +" --------------------------------------------------------------------- +" s:NetrwPreview: {{{2 +fun! s:NetrwPreview(path) range +" call Dfunc("NetrwPreview(path<".a:path.">)") + call s:NetrwOptionSave("s:") + call s:NetrwSafeOptions() + if has("quickfix") + if !isdirectory(a:path) + exe (g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path) + elseif !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38) + endif + elseif !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39) + endif + call s:NetrwOptionRestore("s:") +" call Dret("NetrwPreview") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRefresh: {{{2 +fun! s:NetrwRefresh(islocal,dirname) +" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction) + " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first. + " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here. + " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself. + setlocal ma noro +" call Decho("setlocal ma noro") +" call Decho("clear buffer<".expand("%")."> with :%d") + %d + if a:islocal + call netrw#LocalBrowseCheck(a:dirname) + else + call s:NetrwBrowse(a:islocal,a:dirname) + endif + call netrw#NetrwRestorePosn() + + " restore file marks + if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != "" +" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/") + exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" + else +" call Decho("2match none") + 2match none + endif + +" redraw! +" call Dret("NetrwRefresh") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRefreshDir: refreshes a directory by name {{{2 +" Called by NetrwMarkFileCopy() +" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh() +fun! s:NetrwRefreshDir(islocal,dirname) +" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse) + if g:netrw_fastbrowse == 0 + " slowest mode (keep buffers refreshed, local or remote) +" call Decho("slowest mode: keep buffers refreshed, local or remote") + let tgtwin= bufwinnr(a:dirname) +" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin) + + if tgtwin > 0 + " tgtwin is being displayed, so refresh it + let curwin= winnr() +" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")") + exe tgtwin."wincmd w" + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + exe curwin."wincmd w" + + elseif bufnr(a:dirname) > 0 + let bn= bufnr(a:dirname) +" call Decho("bd bufnr(".a:dirname.")=".bn) + exe "silent bd ".bn + endif + + elseif g:netrw_fastbrowse <= 1 +" call Decho("medium-speed mode: refresh local buffers only") + call s:LocalBrowseShellCmdRefresh() + endif +" call Dret("s:NetrwRefreshDir") +endfun + +" --------------------------------------------------------------------- +" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2 +" What this function does is to compute a priority for the patterns +" in the g:netrw_sort_sequence. It applies a substitute to any +" "files" that satisfy each pattern, putting the priority / in +" front. An "*" pattern handles the default priority. +fun! s:NetrwSetSort() +" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt) + if w:netrw_liststyle == s:LONGLIST + let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge') + else + let seqlist = g:netrw_sort_sequence + endif + " sanity check -- insure that * appears somewhere + if seqlist == "" + let seqlist= '*' + elseif seqlist !~ '\*' + let seqlist= seqlist.',*' + endif + let priority = 1 + while seqlist != "" + if seqlist =~ ',' + let seq = substitute(seqlist,',.*$','','e') + let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e') + else + let seq = seqlist + let seqlist = "" + endif + let sepchr= "\" + if priority < 10 + let spriority= "00".priority.sepchr + elseif priority < 100 + let spriority= "0".priority.sepchr + else + let spriority= priority.sepchr + endif +" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">") + + " sanity check + if w:netrw_bannercnt > line("$") + " apparently no files were left after a Hiding pattern was used +" call Dret("SetSort : no files left after hiding") + return + endif + if seq == '*' + let starpriority= spriority + else + exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/' + " sometimes multiple sorting patterns will match the same file or directory. + " The following substitute is intended to remove the excess matches. + exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^\d\{3}'.sepchr.'\d\{3}\//s/^\d\{3}'.sepchr.'\(\d\{3}\/\).\@=/\1/e' + endif + let priority = priority + 1 + endwhile + if exists("starpriority") + exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}'.sepchr.'/s/^/'.starpriority.'/' + endif + + " Following line associated with priority -- items that satisfy a priority + " pattern get prefixed by ###/ which permits easy sorting by priority. + " Sometimes files can satisfy multiple priority patterns -- only the latest + " priority pattern needs to be retained. So, at this point, these excess + " priority prefixes need to be removed, but not directories that happen to + " be just digits themselves. + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}'.sepchr.'\)\%(\d\{3}'.sepchr.'\)\+\ze./\1/e' + +" call Dret("SetSort") +endfun + +" ===================================================================== +" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2 +fun! s:NetrwSortStyle(islocal) +" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">") + call s:NetrwSaveWordPosn() + let svpos= netrw#NetrwSavePosn() + + let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name' + norm! 0 + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + +" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwSplit: mode {{{2 +" =0 : net and o +" =1 : net and t +" =2 : net and v +" =3 : local and o +" =4 : local and t +" =5 : local and v +fun! s:NetrwSplit(mode) +" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv) + + call s:SaveWinVars() + + if a:mode == 0 + " remote and o +" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") + exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" + let s:didsplit= 1 + call s:RestoreWinVars() + call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) + unlet s:didsplit + + elseif a:mode == 1 + " remote and t + let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord()) +" call Decho("tabnew") + tabnew + let s:didsplit= 1 + call s:RestoreWinVars() + call s:NetrwBrowse(0,newdir) + unlet s:didsplit + + elseif a:mode == 2 + " remote and v +" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v") + exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v" + let s:didsplit= 1 + call s:RestoreWinVars() + call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) + unlet s:didsplit + + elseif a:mode == 3 + " local and o +" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") + exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" + let s:didsplit= 1 + call s:RestoreWinVars() + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) + unlet s:didsplit + + elseif a:mode == 4 + " local and t + let netrw_curdir= b:netrw_curdir + let cursorword = s:NetrwGetWord() +" call Decho("tabnew") + tabnew + let b:netrw_curdir= netrw_curdir + let s:didsplit= 1 + call s:RestoreWinVars() + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword)) + unlet s:didsplit + + elseif a:mode == 5 + " local and v +" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v") + exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v" + let s:didsplit= 1 + call s:RestoreWinVars() + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) + unlet s:didsplit + + else + call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45) + endif + +" call Dret("s:NetrwSplit") +endfun + +" --------------------------------------------------------------------- +" NetrwStatusLine: {{{2 +fun! NetrwStatusLine() + +" vvv NetrwStatusLine() debugging vvv +" let g:stlmsg="" +" if !exists("w:netrw_explore_bufnr") +" let g:stlmsg="!X" +" elseif w:netrw_explore_bufnr != bufnr("%") +" let g:stlmsg="explore_bufnr!=".bufnr("%") +" endif +" if !exists("w:netrw_explore_line") +" let g:stlmsg=" !X" +" elseif w:netrw_explore_line != line(".") +" let g:stlmsg=" explore_line!={line(.)<".line(".").">" +" endif +" if !exists("w:netrw_explore_list") +" let g:stlmsg=" !X" +" endif +" ^^^ NetrwStatusLine() debugging ^^^ + + if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list") + " restore user's status line + let &stl = s:netrw_users_stl + let &laststatus = s:netrw_users_ls + if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif + if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif + return "" + else + return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen + endif +endfun + +" --------------------------------------------------------------------- +" s:NetrwTreeDir: determine tree directory given current cursor position {{{2 +" (full path directory with trailing slash returned) +fun! s:NetrwTreeDir() +" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">") + + let treedir= b:netrw_curdir +" call Decho("set initial treedir<".treedir.">") + let s:treecurpos= netrw#NetrwSavePosn() + + if w:netrw_liststyle == s:TREELIST +" call Decho("w:netrrw_liststyle is TREELIST:") +" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">") + if getline('.') =~ '/$' + let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e') + else + let treedir= "" + endif + +" call Decho("treedir<".treedir.">") + + " detect user attempting to close treeroot + if getline('.') !~ '|' && getline('.') != '..' +" call Decho("user attempted to close treeroot") + " now force a refresh +" call Decho("clear buffer<".expand("%")."> with :%d") + keepjumps %d +" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">") + return b:netrw_curdir + endif + + " elide all non-depth information + let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e') +" call Decho("depth<".depth."> 1st subst") + + " elide first depth + let depth = substitute(depth,'^| ','','') +" call Decho("depth<".depth."> 2nd subst") + + " construct treedir by searching backwards at correct depth +" call Decho("constructing treedir<".treedir."> depth<".depth.">") + while depth != "" && search('^'.depth.'[^|].\{-}/$','bW') + let dirname= substitute(getline('.'),'^\(| \)*','','e') + let treedir= dirname.treedir + let depth = substitute(depth,'^| ','','') +" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">") + endwhile + if w:netrw_treetop =~ '/$' + let treedir= w:netrw_treetop.treedir + else + let treedir= w:netrw_treetop.'/'.treedir + endif +" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line(".")) + endif + let treedir= substitute(treedir,'//$','/','') + +" " now force a refresh +"" call DECHO("clear buffer<".expand("%")."> with :%d") +" setlocal ma noro +" keepjumps %d + +" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">") + return treedir +endfun + +" --------------------------------------------------------------------- +" s:NetrwTreeDisplay: recursive tree display {{{2 +fun! s:NetrwTreeDisplay(dir,depth) +" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)") + + " insure that there are no folds + setlocal nofen + + " install ../ and shortdir + if a:depth == "" + call setline(line("$")+1,'../') +" call Decho("setline#".line("$")." ../ (depth is zero)") + endif + if a:dir =~ '^\a\+://' + if a:dir == w:netrw_treetop + let shortdir= a:dir + else + let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e') + endif + call setline(line("$")+1,a:depth.shortdir) + else + let shortdir= substitute(a:dir,'^.*/','','e') + call setline(line("$")+1,a:depth.shortdir.'/') + endif +" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">") + + " append a / to dir if its missing one + let dir= a:dir + if dir !~ '/$' + let dir= dir.'/' + endif + + " display subtrees (if any) + let depth= "| ".a:depth + +" call Decho("display subtrees with depth<".depth."> and current leaves") + for entry in w:netrw_treedict[a:dir] + let direntry= substitute(dir.entry,'/$','','e') +" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">") + if entry =~ '/$' && has_key(w:netrw_treedict,direntry) +" call Decho("<".direntry."> is a key in treedict - display subtree for it") + call s:NetrwTreeDisplay(direntry,depth) + elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/') +" call Decho("<".direntry."/> is a key in treedict - display subtree for it") + call s:NetrwTreeDisplay(direntry.'/',depth) + else +" call Decho("<".entry."> is not a key in treedict (no subtree)") + call setline(line("$")+1,depth.entry) + endif + endfor +" call Dret("NetrwTreeDisplay") +endfun + +" --------------------------------------------------------------------- +" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2 +fun! s:NetrwTreeListing(dirname) + if w:netrw_liststyle == s:TREELIST +" call Dfunc("NetrwTreeListing() bufname<".expand("%").">") +" call Decho("curdir<".a:dirname.">") +" call Decho("win#".winnr().": w:netrw_treetop ".(exists("w:netrw_treetop")? "exists" : "doesn't exit")." w:netrw_treedict ".(exists("w:netrw_treedict")? "exists" : "doesn't exit")) + + " update the treetop +" call Decho("update the treetop") + if !exists("w:netrw_treetop") + let w:netrw_treetop= a:dirname +" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)") + elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop) + let w:netrw_treetop= a:dirname +" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)") + endif + + " insure that we have at least an empty treedict + if !exists("w:netrw_treedict") + let w:netrw_treedict= {} + endif + + " update the directory listing for the current directory +" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]") +" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$")) + exe "silent! keepjumps ".w:netrw_bannercnt.',$g@^\.\.\=/$@d' + let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$")) +" call Decho("w:treedict[".a:dirname."]= ".w:netrw_treedict[a:dirname]) + exe "silent! keepjumps ".w:netrw_bannercnt.",$d" + + " if past banner, record word + if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt + let fname= expand("") + else + let fname= "" + endif +" call Decho("fname<".fname.">") + + " display from treetop on down + call s:NetrwTreeDisplay(w:netrw_treetop,"") + +" call Dret("NetrwTreeListing : bufname<".expand("%").">") + endif +endfun + +" --------------------------------------------------------------------- +" s:NetrwWideListing: {{{2 +fun! s:NetrwWideListing() + + if w:netrw_liststyle == s:WIDELIST +" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo) + " look for longest filename (cpf=characters per filename) + " cpf: characters per file + " fpl: files per line + " fpc: files per column + setlocal ma noro +" call Decho("setlocal ma noro") + let b:netrw_cpf= 0 + if line("$") >= w:netrw_bannercnt + exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif' + else +" call Dret("NetrwWideListing") + return + endif +" call Decho("max file strlen+1=".b:netrw_cpf) + let b:netrw_cpf= b:netrw_cpf + 1 + + " determine qty files per line (fpl) + let w:netrw_fpl= winwidth(0)/b:netrw_cpf + if w:netrw_fpl <= 0 + let w:netrw_fpl= 1 + endif +" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl) + + " make wide display + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/' + let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl + let newcolstart = w:netrw_bannercnt + fpc + let newcolend = newcolstart + fpc - 1 +" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]") + silent! let keepregstar = @* + while line("$") >= newcolstart + if newcolend > line("$") | let newcolend= line("$") | endif + let newcolqty= newcolend - newcolstart + exe newcolstart + if newcolqty == 0 + exe "silent keepjumps norm! 0\$hx".w:netrw_bannercnt."G$p" + else + exe "silent keepjumps norm! 0\".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p' + endif + exe "silent keepjumps ".newcolstart.','.newcolend.'d' + exe 'silent keepjumps '.w:netrw_bannercnt + endwhile + silent! let @*= keepregstar + exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e' + setlocal noma nomod ro +" call Dret("NetrwWideListing") + endif + +endfun + +" --------------------------------------------------------------------- +" s:PerformListing: {{{2 +fun! s:PerformListing(islocal) +" call Dfunc("s:PerformListing(islocal=".a:islocal.") buf(%)=".bufnr("%")."<".bufname("%").">") + + call s:NetrwSafeOptions() + setlocal noro ma +" call Decho("setlocal noro ma") + +" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho +" call Decho("(netrw) Processing your browsing request...") +" endif " Decho + +" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a')) + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") + " force a refresh for tree listings +" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d") + keepjumps %d + endif + + " save current directory on directory history list + call s:NetrwBookHistHandler(3,b:netrw_curdir) + + " Set up the banner {{{3 +" call Decho("set up banner") + keepjumps put ='\" ============================================================================' + keepjumps put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')' + keepjumps put ='\" '.b:netrw_curdir + keepjumps 1d + let w:netrw_bannercnt= 3 + exe "keepjumps ".w:netrw_bannercnt + + let sortby= g:netrw_sort_by + if g:netrw_sort_direction =~ "^r" + let sortby= sortby." reversed" + endif + + " Sorted by... {{{3 +" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">") + if g:netrw_sort_by =~ "^n" +" call Decho("directories will be sorted by name") + " sorted by name + keepjumps put ='\" Sorted by '.sortby + keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence + let w:netrw_bannercnt= w:netrw_bannercnt + 2 + else +" call Decho("directories will be sorted by size or time") + " sorted by size or date + keepjumps put ='\" Sorted by '.sortby + let w:netrw_bannercnt= w:netrw_bannercnt + 1 + endif + exe "keepjumps ".w:netrw_bannercnt + + " show copy/move target, if any + if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal") +" call Decho("show copy/move target<".s:netrwmftgt.">") + keepjumps put ='' + if s:netrwmftgt_islocal + call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)') + else + call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)') + endif + let w:netrw_bannercnt= w:netrw_bannercnt + 1 + else +" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt") + endif + exe "keepjumps ".w:netrw_bannercnt + + " Hiding... -or- Showing... {{{3 +" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)") + if g:netrw_list_hide != "" && g:netrw_hide + if g:netrw_hide == 1 + keepjumps put ='\" Hiding: '.g:netrw_list_hide + else + keepjumps put ='\" Showing: '.g:netrw_list_hide + endif + let w:netrw_bannercnt= w:netrw_bannercnt + 1 + endif + exe "keepjumps ".w:netrw_bannercnt + keepjumps put ='\" Quick Help: :help -:go up dir D:delete R:rename s:sort-by x:exec' + keepjumps put ='\" ============================================================================' + let w:netrw_bannercnt= w:netrw_bannercnt + 2 + + " bannercnt should index the line just after the banner + let w:netrw_bannercnt= w:netrw_bannercnt + 1 + exe "keepjumps ".w:netrw_bannercnt +" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$")) + + " set up syntax highlighting {{{3 +" call Decho("set up syntax highlighting") + if has("syntax") + setlocal ft=netrw + if !exists("g:syntax_on") || !g:syntax_on + setlocal ft= + endif + endif + + " get list of files +" call Decho("Get list of files - islocal=".a:islocal) + if a:islocal + call s:LocalListing() + else " remote + call s:NetrwRemoteListing() + endif +" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)") + + " manipulate the directory listing (hide, sort) {{{3 + if line("$") >= w:netrw_bannercnt +" call Decho("manipulate directory listing (hide)") +" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">") + if g:netrw_hide && g:netrw_list_hide != "" + call s:NetrwListHide() + endif + if line("$") >= w:netrw_bannercnt +" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">") + + if g:netrw_sort_by =~ "^n" + " sort by name + call s:NetrwSetSort() + + if w:netrw_bannercnt < line("$") +" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")") + if g:netrw_sort_direction =~ 'n' + " normal direction sorting + exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options + else + " reverse direction sorting + exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options + endif + endif + " remove priority pattern prefix +" call Decho("remove priority pattern prefix") + let sepchr= "\" + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}'.sepchr.'//e' + + elseif a:islocal + if w:netrw_bannercnt < line("$") +" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction) + if g:netrw_sort_direction =~ 'n' +" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort') + exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options + else +" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!') + exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options + endif + endif + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e' + endif + + elseif g:netrw_sort_direction =~ 'r' +" call Decho('reverse the sorted listing') + exe 'silent keepjumps '.w:netrw_bannercnt.'g/^/m '.w:netrw_bannercnt + endif + endif + + " convert to wide/tree listing {{{3 +" call Decho("modify display if wide/tree listing style") + call s:NetrwWideListing() + call s:NetrwTreeListing(b:netrw_curdir) + + if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt + " place cursor on the top-left corner of the file listing +" call Decho("place cursor on top-left corner of file listing") + exe 'silent keepjumps '.w:netrw_bannercnt + norm! 0 + endif + + " record previous current directory + let w:netrw_prvdir= b:netrw_curdir +" call Decho("record netrw_prvdir<".w:netrw_prvdir.">") + + " save certain window-oriented variables into buffer-oriented variables {{{3 + call s:SetBufWinVars() + call s:NetrwOptionRestore("w:") + + " set display to netrw display settings +" call Decho("set display to netrw display settings (noma nomod etc)") + setlocal noma nomod nonu nobl nowrap ro + if exists("s:treecurpos") + + call netrw#NetrwRestorePosn(s:treecurpos) + unlet s:treecurpos + endif + +" call Dret("s:PerformListing : curpos<".string(getpos(".")).">") +endfun + +" --------------------------------------------------------------------- +" s:SetupNetrwStatusLine: {{{2 +fun! s:SetupNetrwStatusLine(statline) +" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)") + + if !exists("s:netrw_setup_statline") + let s:netrw_setup_statline= 1 +" call Decho("do first-time status line setup") + + if !exists("s:netrw_users_stl") + let s:netrw_users_stl= &stl + endif + if !exists("s:netrw_users_ls") + let s:netrw_users_ls= &laststatus + endif + + " set up User9 highlighting as needed + let keepa= @a + redir @a + try + hi User9 + catch /^Vim\%((\a\+)\)\=:E411/ + if &bg == "dark" + hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue + else + hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue + endif + endtry + redir END + let @a= keepa + endif + + " set up status line (may use User9 highlighting) + " insure that windows have a statusline + " make sure statusline is displayed + let &stl=a:statline + setlocal laststatus=2 +" call Decho("stl=".&stl) + redraw + +" call Dret("SetupNetrwStatusLine : stl=".&stl) +endfun + +" --------------------------------------------------------------------- +" Remote Directory Browsing Support: {{{1 +" =========================================== + +" --------------------------------------------------------------------- +" s:NetrwRemoteListing: {{{2 +fun! s:NetrwRemoteListing() +" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)") + + call s:RemotePathAnalysis(b:netrw_curdir) + + " sanity check: + if exists("b:netrw_method") && b:netrw_method =~ '[235]' +" call Decho("b:netrw_method=".b:netrw_method) + if !executable("ftp") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18) + endif + call s:NetrwOptionRestore("w:") +" call Dret("s:NetrwRemoteListing") + return + endif + + elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == '' + if !exists("g:netrw_quiet") + if g:netrw_list_cmd == "" + call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47) + else + call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19) + endif + endif + + call s:NetrwOptionRestore("w:") +" call Dret("s:NetrwRemoteListing") + return + endif " (remote handling sanity check) + + if exists("b:netrw_method") +" call Decho("setting w:netrw_method<".b:netrw_method.">") + let w:netrw_method= b:netrw_method + endif + + if s:method == "ftp" + " use ftp to get remote file listing +" call Decho("use ftp to get remote file listing") + let s:method = "ftp" + let listcmd = g:netrw_ftp_list_cmd + if g:netrw_sort_by =~ '^t' + let listcmd= g:netrw_ftp_timelist_cmd + elseif g:netrw_sort_by =~ '^s' + let listcmd= g:netrw_ftp_sizelist_cmd + endif +" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)") + call s:NetrwRemoteFtpCmd(s:path,listcmd) +" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))' + + if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST + " shorten the listing +" call Decho("generate short listing") + exe "keepjumps ".w:netrw_bannercnt + + " cleanup + if g:netrw_ftp_browse_reject != "" + exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d" + endif + silent! keepjumps %s/\r$//e + + " if there's no ../ listed, then put ./ and ../ in + let line1= line(".") + exe "keepjumps ".w:netrw_bannercnt + let line2= search('^\.\.\/\%(\s\|$\)','cnW') + if line2 == 0 +" call Decho("netrw is putting ./ and ../ into listing") + keepjumps put='../' + keepjumps put='./' + endif + exe "keepjumps ".line1 + keepjumps norm! 0 + +" call Decho("line1=".line1." line2=".line2." line(.)=".line(".")) + if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup +" call Decho("M$ ftp cleanup") + exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(\|\d\+\)\s\+//' + else " normal ftp cleanup +" call Decho("normal ftp cleanup") + exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e' + exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e' + exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e' + endif + endif + + else + " use ssh to get remote file listing {{{3 +" call Decho("use ssh to get remote file listing: s:path<".s:path.">") + let listcmd= s:MakeSshCmd(g:netrw_list_cmd) +" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)") + if g:netrw_scp_cmd =~ '^pscp' +" call Decho("1: exe silent r! ".shellescape(listcmd.s:path, 1)) + exe "silent r! ".listcmd.shellescape(s:path, 1) + " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like + g/^Listing directory/d + g/^d[-rwx][-rwx][-rwx]/s+$+/+e + silent g/^l[-rwx][-rwx][-rwx]/s+$+@+e + if g:netrw_liststyle != s:LONGLIST + g/^[dlsp-][-rwx][-rwx][-rwx]/s/^.*\s\(\S\+\)$/\1/e + endif + else + if s:path == "" +" call Decho("2: exe silent r! ".listcmd) + exe "silent r! ".listcmd + else +" call Decho("3: exe silent r! ".listcmd.' '.shellescape(s:path,1)) + exe "silent r! ".listcmd.' '.shellescape(s:path,1) +" call Decho("listcmd<".listcmd."> path<".s:path.">") + endif + endif + + " cleanup + if g:netrw_ftp_browse_reject != "" +" call Decho("(cleanup) exe silent! g/".g:netrw_ssh_browse_reject."/keepjumps d") + exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d" + endif + endif + + if w:netrw_liststyle == s:LONGLIST + " do a long listing; these substitutions need to be done prior to sorting {{{3 +" call Decho("fix long listing:") + + if s:method == "ftp" + " cleanup + exe "keepjumps ".w:netrw_bannercnt + while getline('.') =~ g:netrw_ftp_browse_reject + keepjumps d + endwhile + " if there's no ../ listed, then put ./ and ../ in + let line1= line(".") + keepjumps 1 + silent keepjumps call search('^\.\.\/\%(\s\|$\)','W') + let line2= line(".") + if line2 == 0 + exe 'keepjumps '.w:netrw_bannercnt."put='./'" + if b:netrw_curdir != '/' + exe 'keepjumps '.w:netrw_bannercnt."put='../'" + endif + endif + exe "keepjumps ".line1 + keepjumps norm! 0 + endif + + if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup +" call Decho("M$ ftp site listing cleanup") + exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(\|\d\+\)\s\+\)\(\w.*\)$/\2\t\1/' + elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") +" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$")) + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e' + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e' + exe 'silent keepjumps '.w:netrw_bannercnt + endif + endif + +" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho +" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))' +" endif " Decho +" call Dret("s:NetrwRemoteListing") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2 +fun! s:NetrwRemoteRm(usrhost,path) range +" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol(".")) +" call Decho("firstline=".a:firstline." lastline=".a:lastline) + let svpos= netrw#NetrwSavePosn() + + let all= 0 + if exists("s:netrwmarkfilelist_{bufnr('%')}") + " remove all marked files +" call Decho("remove all marked files with bufnr#".bufnr("%")) + for fname in s:netrwmarkfilelist_{bufnr("%")} + let ok= s:NetrwRemoteRmFile(a:path,fname,all) + if ok =~ 'q\%[uit]' + break + elseif ok =~ 'a\%[ll]' + let all= 1 + endif + endfor + call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir) + + else + " remove files specified by range +" call Decho("remove files specified by range") + + " preparation for removing multiple files/directories + let ctr= a:firstline + + " remove multiple files and directories + while ctr <= a:lastline + exe ctr + let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all) + if ok =~ 'q\%[uit]' + break + elseif ok =~ 'a\%[ll]' + let all= 1 + endif + let ctr= ctr + 1 + endwhile + endif + + " refresh the (remote) directory listing +" call Decho("refresh remote directory listing") + call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) + call netrw#NetrwRestorePosn(svpos) + +" call Dret("s:NetrwRemoteRm") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRemoteRmFile: {{{2 +fun! s:NetrwRemoteRmFile(path,rmfile,all) +" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all) + + let all= a:all + let ok = "" + + if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$') + " attempt to remove file +" call Decho("attempt to remove file (all=".all.")") + if !all + echohl Statement +" call Decho("case all=0:") + call inputsave() + let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") + call inputrestore() + echohl NONE + if ok == "" + let ok="no" + endif + let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') + if ok =~ 'a\%[ll]' + let all= 1 + endif + endif + + if all || ok =~ 'y\%[es]' || ok == "" +" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : "")) + if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) +" call Decho("case ftp:") + let path= a:path + if path =~ '^\a\+://' + let path= substitute(path,'^\a\+://[^/]\+/','','') + endif + silent! keepjumps .,$d + call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"') + else +" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">") + let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd) +" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">") + if !exists("b:netrw_curdir") + call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53) + let ok="q" + else + let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','') +" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">") +" call Decho("remotedir<".remotedir.">") +" call Decho("rmfile<".a:rmfile.">") + if remotedir != "" + let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile)) + else + let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile)) + endif +" call Decho("call system(".netrw_rm_cmd.")") + let ret= system(netrw_rm_cmd) + if ret != 0 + call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60) + endif +" call Decho("returned=".ret." errcode=".v:shell_error) + endif + endif + elseif ok =~ 'q\%[uit]' +" call Decho("ok==".ok) + break + endif + + else + " attempt to remove directory +" call Decho("attempt to remove directory") + if !all + call inputsave() + let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") + call inputrestore() + if ok == "" + let ok="no" + endif + let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') + if ok =~ 'a\%[ll]' + let all= 1 + endif + endif + + if all || ok =~ 'y\%[es]' || ok == "" + if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) + call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile) + else + let rmfile = substitute(a:path.a:rmfile,'/$','','') + let netrw_rmdir_cmd = s:MakeSshCmd(s:WinPath(g:netrw_rmdir_cmd)).' '.shellescape(s:WinPath(rmfile)) +" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")") + let ret= system(netrw_rmdir_cmd) +" call Decho("returned=".ret." errcode=".v:shell_error) + + if v:shell_error != 0 +" call Decho("v:shell_error not 0") + let netrw_rmf_cmd= s:MakeSshCmd(s:WinPath(g:netrw_rmf_cmd)).' '.shellescape(s:WinPath(substitute(rmfile,'[\/]$','','e'))) +" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")") + let ret= system(netrw_rmf_cmd) +" call Decho("returned=".ret." errcode=".v:shell_error) + + if v:shell_error != 0 && !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22) + endif + endif + endif + + elseif ok =~ 'q\%[uit]' + break + endif + endif + +" call Dret("s:NetrwRemoteRmFile ".ok) + return ok +endfun + +" --------------------------------------------------------------------- +" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2 +" This function assumes that a long listing will be received. Size, time, +" and reverse sorts will be requested of the server but not otherwise +" enforced here. +fun! s:NetrwRemoteFtpCmd(path,listcmd) +" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method) +" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt) + + " because WinXX ftp uses unix style input + let ffkeep= &ff + setlocal ma ff=unix noro +" call Decho("setlocal ma ff=unix noro") + + " clear off any older non-banner lines + " note that w:netrw_bannercnt indexes the line after the banner +" call Decho('exe silent! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)") + exe "silent! keepjumps ".w:netrw_bannercnt.",$d" + + "......................................... + if w:netrw_method == 2 || w:netrw_method == 5 + " ftp + <.netrc>: Method #2 + if a:path != "" + put ='cd \"'.a:path.'\"' + endif + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('.')) + endif + call setline(line("$")+1,a:listcmd) +" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))' + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + else +" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + + "......................................... + elseif w:netrw_method == 3 + " ftp + machine,id,passwd,filename: Method #3 + setlocal ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port + else + put ='open '.g:netrw_machine + endif + + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid + put ='\"'.s:netrw_passwd.'\"' + else + put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' + endif + + if a:path != "" + put ='cd \"'.a:path.'\"' + endif + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('.')) + endif + call setline(line("$")+1,a:listcmd) + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password +" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))' +" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n") + exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n" + + "......................................... + else + call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23) + endif + + " cleanup for Windows + if has("win32") || has("win95") || has("win64") || has("win16") + silent! keepjumps %s/\r$//e + endif + if a:listcmd == "dir" + " infer directory/link based on the file permission string + silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@ + silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/ + if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST + exe "silent! keepjumps ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e' + endif + endif + + " ftp's listing doesn't seem to include ./ or ../ + if !search('^\.\/$\|\s\.\/$','wn') + exe 'keepjumps '.w:netrw_bannercnt + put ='./' + endif + if !search('^\.\.\/$\|\s\.\.\/$','wn') + exe 'keepjumps '.w:netrw_bannercnt + put ='../' + endif + + " restore settings + let &ff= ffkeep +" call Dret("NetrwRemoteFtpCmd") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRemoteRename: rename a remote file or directory {{{2 +fun! s:NetrwRemoteRename(usrhost,path) range +" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)") + + " preparation for removing multiple files/directories + let svpos = netrw#NetrwSavePosn() + let ctr = a:firstline + let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd) + + " rename files given by the markfilelist + if exists("s:netrwmarkfilelist_{bufnr('%')}") + for oldname in s:netrwmarkfilelist_{bufnr("%")} +" call Decho("oldname<".oldname.">") + if exists("subfrom") + let newname= substitute(oldname,subfrom,subto,'') +" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") + else + call inputsave() + let newname= input("Moving ".oldname." to : ",oldname) + call inputrestore() + if newname =~ '^s/' + let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','') + let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','') + let newname = substitute(oldname,subfrom,subto,'') +" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") + endif + endif + + if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) + call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname) + else + let oldname= shellescape(a:path.oldname) + let newname= shellescape(a:path.newname) +" call Decho("system(s:WinPath(".rename_cmd.") ".oldname.' '.newname.")") + let ret = system(s:WinPath(rename_cmd).' '.oldname.' '.newname) + endif + + endfor + call s:NetrwUnMarkFile(1) + + else + + " attempt to rename files/directories + while ctr <= a:lastline + exe "keepjumps ".ctr + + let oldname= s:NetrwGetWord() +" call Decho("oldname<".oldname.">") + + call inputsave() + let newname= input("Moving ".oldname." to : ",oldname) + call inputrestore() + + if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) + call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname) + else + let oldname= shellescape(a:path.oldname) + let newname= shellescape(a:path.newname) +" call Decho("system(s:WinPath(".rename_cmd.") ".oldname.' '.newname.")") + let ret = system(s:WinPath(rename_cmd).' '.oldname.' '.newname) + endif + + let ctr= ctr + 1 + endwhile + endif + + " refresh the directory + call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) + call netrw#NetrwRestorePosn(svpos) + +" call Dret("NetrwRemoteRename") +endfun + +" --------------------------------------------------------------------- +" Local Directory Browsing Support: {{{1 +" ========================================== + +" --------------------------------------------------------------------- +" netrw#LocalBrowseCheck: {{{2 +fun! netrw#LocalBrowseCheck(dirname) + " unfortunate interaction -- split window debugging can't be + " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter + " event triggers another call to LocalBrowseCheck() when attempts + " to write to the DBG buffer are made. + " The &ft == "netrw" test was installed because the BufEnter event + " would hit when re-entering netrw windows, creating unexpected + " refreshes (and would do so in the middle of NetrwSaveOptions(), too) +" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname)) + if isdirectory(a:dirname) +" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$")) + if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) + silent! call s:NetrwBrowse(1,a:dirname) + elseif &ft == "netrw" && line("$") == 1 + silent! call s:NetrwBrowse(1,a:dirname) + endif + endif + " not a directory, ignore it +endfun + +" --------------------------------------------------------------------- +" s:LocalListing: does the job of "ls" for local directories {{{2 +fun! s:LocalListing() +" call Dfunc("s:LocalListing()") +" call Decho("&ma=".&ma) +" call Decho("&mod=".&mod) +" call Decho("&ro=".&ro) +" call Decho("bufname(%)<".bufname("%").">") + +" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif +" if exists("g:netrw_sort_by")|call Decho('g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("g:netrw_sort_by doesn't exist")|endif + + " get the list of files contained in the current directory + let dirname = escape(b:netrw_curdir,g:netrw_glob_escape) + let dirnamelen = strlen(b:netrw_curdir) + let filelist = glob(s:ComposePath(dirname,"*")) +" call Decho("glob(dirname<".dirname."/*>)=".filelist) + if filelist != "" + let filelist= filelist."\n" + endif + let filelist= filelist.glob(s:ComposePath(dirname,".*")) +" call Decho("glob(dirname<".dirname."/.*>)=".filelist) + + " Coding choice: either elide ./ if present + " or include ./ if not present + if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)' + " elide /path/. from glob() entries if present +" call Decho("elide /path/. from glob entries if present") + let filelist = substitute(filelist,'\n','\t','g') + let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','') + let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','') + let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','') + let filelist = substitute(filelist,'\t','\n','g') + endif +" call Decho("filelist<".filelist.">") + if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)' + " include ../ in the glob() entry if its missing +" call Decho("forcibly tacking on ..") + let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../") +" call Decho("filelist<".filelist.">") + endif + if b:netrw_curdir == '/' + " remove .. from filelist when current directory is root directory +" call Decho("remove .. from filelist") + let filelist= substitute(filelist,'/\.\.\n','','') + endif + " remove multiple contiguous newlines + let filelist= substitute(filelist,'\n\{2,}','\n','ge') + if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) + " change all \s to /s +" call Decho('change all \s to /s') + let filelist= substitute(filelist,'\','/','g') + else + " escape all \s to \\ +" call Decho('escape all \s to \\') + let filelist= substitute(filelist,'\','\\','g') + endif + +" call Decho("(before while) dirname<".dirname.">") +" call Decho("(before while) dirnamelen<".dirnamelen.">") +" call Decho("(before while) filelist<".filelist.">") + + while filelist != "" + if filelist =~ '\n' + let filename = substitute(filelist,'\n.*$','','e') + let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e') + else + let filename = filelist + let filelist = "" + endif +" call Decho(" ") +" call Decho("(while) filelist<".filelist.">") +" call Decho("(while) filename<".filename.">") + + if getftype(filename) == "link" + " indicate a symbolic link +" call Decho("indicate <".filename."> is a symbolic link with trailing @") + let pfile= filename."@" + + elseif getftype(filename) == "socket" + " indicate a socket +" call Decho("indicate <".filename."> is a socket with trailing =") + let pfile= filename."=" + + elseif getftype(filename) == "fifo" + " indicate a fifo +" call Decho("indicate <".filename."> is a fifo with trailing |") + let pfile= filename."|" + + elseif isdirectory(filename) + " indicate a directory +" call Decho("indicate <".filename."> is a directory with trailing /") + let pfile= filename."/" + + elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename) + if (has("win32") || has("win95") || has("win64") || has("win16")) + if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$' + " indicate an executable +" call Decho("indicate <".filename."> is executable with trailing *") + let pfile= filename."*" + else + " normal file + let pfile= filename + endif + elseif executable(filename) + " indicate an executable +" call Decho("indicate <".filename."> is executable with trailing *") + let pfile= filename."*" + else + " normal file + let pfile= filename + endif + + else + " normal file + let pfile= filename + endif +" call Decho("pfile<".pfile."> (after *@/ appending)") + + if pfile =~ '//$' + let pfile= substitute(pfile,'//$','/','e') +" call Decho("change // to /: pfile<".pfile.">") + endif + let pfile= strpart(pfile,dirnamelen) + let pfile= substitute(pfile,'^[/\\]','','e') +" call Decho("filename<".filename.">") +" call Decho("pfile <".pfile.">") + + if w:netrw_liststyle == s:LONGLIST + let sz = getfsize(filename) + let fsz = strpart(" ",1,15-s:Strlen(sz)).sz + let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename)) +" call Decho("sz=".sz." fsz=".fsz) + endif + + if g:netrw_sort_by =~ "^t" + " sort by time (handles time up to 1 quintillion seconds, US) +" call Decho("getftime(".filename.")=".getftime(filename)) + let t = getftime(filename) + let ft = strpart("000000000000000000",1,18-s:Strlen(t)).t +" call Decho("exe keepjumps put ='".ft.'/'.filename."'") + let ftpfile= ft.'/'.pfile + keepjumps silent! put=ftpfile + + elseif g:netrw_sort_by =~ "^s" + " sort by size (handles file sizes up to 1 quintillion bytes, US) +" call Decho("getfsize(".filename.")=".getfsize(filename)) + let sz = getfsize(filename) + let fsz = strpart("000000000000000000",1,18-s:Strlen(sz)).sz +" call Decho("exe keepjumps put ='".fsz.'/'.filename."'") + let fszpfile= fsz.'/'.pfile + keepjumps silent! put =fszpfile + + else + " sort by name +" call Decho("exe keepjumps put ='".pfile."'") + keepjumps silent! put=pfile + endif + endwhile + + " cleanup any windows mess at end-of-line + silent! keepjumps %s/\r$//e + exe "setlocal ts=".g:netrw_maxfilenamelen +" call Decho("setlocal ts=".g:netrw_maxfilenamelen) + +" call Dret("s:LocalListing") +endfun + +" --------------------------------------------------------------------- +" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2 +" performed any shell command. The idea is to cause all local-browsing +" buffers to be refreshed after a user has executed some shell command, +" on the chance that s/he removed/created a file/directory with it. +fun! s:LocalBrowseShellCmdRefresh() +" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs") + " determine which buffers currently reside in a tab + if !exists("s:netrw_browselist") +" call Dret("LocalBrowseShellCmdRefresh : browselist is empty") + return + endif + if !exists("w:netrw_bannercnt") +" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw windwo") + return + endif + if exists("s:locbrowseshellcmd") + if s:locbrowseshellcmd + let s:locbrowseshellcmd= 0 +" call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh") + return + endif + let s:locbrowseshellcmd= 0 + endif + let itab = 1 + let buftablist = [] + while itab <= tabpagenr("$") + let buftablist = buftablist + tabpagebuflist() + let itab = itab + 1 + tabn + endwhile +" call Decho("buftablist".string(buftablist)) +" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">") + " GO through all buffers on netrw_browselist (ie. just local-netrw buffers): + " | refresh any netrw window + " | wipe out any non-displaying netrw buffer + let curwin = winnr() + let ibl = 0 + for ibuf in s:netrw_browselist +" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf)) + if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1 + " wipe out any non-displaying netrw buffer +" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">") + exe "silent! bd ".fnameescape(ibuf) + call remove(s:netrw_browselist,ibl) +" call Decho("browselist=".string(s:netrw_browselist)) + continue + elseif index(tabpagebuflist(),ibuf) != -1 + " refresh any netrw buffer +" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf)) + exe bufwinnr(ibuf)."wincmd w" + call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) + endif + let ibl= ibl + 1 + endfor + exe curwin."wincmd w" + +" call Dret("LocalBrowseShellCmdRefresh") +endfun + +" --------------------------------------------------------------------- +" s:NetrwLocalRm: {{{2 +fun! s:NetrwLocalRm(path) range +" call Dfunc("s:NetrwLocalRm(path<".a:path.">)") +" call Decho("firstline=".a:firstline." lastline=".a:lastline) + + " preparation for removing multiple files/directories + let ret = 0 + let all = 0 + let svpos = netrw#NetrwSavePosn() + + if exists("s:netrwmarkfilelist_{bufnr('%')}") + " remove all marked files +" call Decho("remove all marked files") + for fname in s:netrwmarkfilelist_{bufnr("%")} + let ok= s:NetrwLocalRmFile(a:path,fname,all) + if ok =~ 'q\%[uit]' || ok == "no" + break + elseif ok =~ 'a\%[ll]' + let all= 1 + endif + endfor + call s:NetrwUnMarkFile(1) + + else + " remove (multiple) files and directories +" call Decho("remove files in range [".a:firstline.",".a:lastline."]") + + let ctr = a:firstline + while ctr <= a:lastline + exe "keepjumps ".ctr + + " sanity checks + if line(".") < w:netrw_bannercnt + let ctr= ctr + 1 + continue + endif + let curword= s:NetrwGetWord() + if curword == "./" || curword == "../" + let ctr= ctr + 1 + continue + endif + let ok= s:NetrwLocalRmFile(a:path,curword,all) + if ok =~ 'q\%[uit]' || ok == "no" + break + elseif ok =~ 'a\%[ll]' + let all= 1 + endif + let ctr= ctr + 1 + endwhile + endif + + " refresh the directory +" call Decho("bufname<".bufname("%").">") + if bufname("%") != "NetrwMessage" + call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) + call netrw#NetrwRestorePosn(svpos) + endif + +" call Dret("s:NetrwLocalRm") +endfun + +" --------------------------------------------------------------------- +" s:NetrwLocalRmFile: remove file fname given the path {{{2 +" Give confirmation prompt unless all==1 +fun! s:NetrwLocalRmFile(path,fname,all) +" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all) + + let all= a:all + let ok = "" + norm! 0 + let rmfile= s:ComposePath(a:path,a:fname) +" call Decho("rmfile<".rmfile.">") + + if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$') + " attempt to remove file +" call Decho("attempt to remove file<".rmfile.">") + if !all + echohl Statement + call inputsave() + let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") + call inputrestore() + echohl NONE + if ok == "" + let ok="no" + endif +" call Decho("response: ok<".ok.">") + let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') +" call Decho("response: ok<".ok."> (after sub)") + if ok =~ 'a\%[ll]' + let all= 1 + endif + endif + + if all || ok =~ 'y\%[es]' || ok == "" + let ret= s:NetrwDelete(rmfile) +" call Decho("errcode=".v:shell_error." ret=".ret) + endif + + else + " attempt to remove directory + if !all + echohl Statement + call inputsave() + let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") + call inputrestore() + let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') + if ok == "" + let ok="no" + endif + if ok =~ 'a\%[ll]' + let all= 1 + endif + endif + let rmfile= substitute(rmfile,'[\/]$','','e') + + if all || ok =~ 'y\%[es]' || ok == "" +" call Decho("1st attempt: system(s:WinPath(".g:netrw_local_rmdir.') '.shellescape(rmfile).')') + call system(s:WinPath(g:netrw_local_rmdir).' '.shellescape(rmfile)) +" call Decho("v:shell_error=".v:shell_error) + + if v:shell_error != 0 +" call Decho("2nd attempt to remove directory<".rmfile.">") + let errcode= s:NetrwDelete(rmfile) +" call Decho("errcode=".errcode) + + if errcode != 0 + if has("unix") +" call Decho("3rd attempt to remove directory<".rmfile.">") + call system("rm ".shellescape(rmfile)) + if v:shell_error != 0 && !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34) + let ok="no" + endif + elseif !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35) + let ok="no" + endif + endif + endif + endif + endif + +" call Dret("s:NetrwLocalRmFile ".ok) + return ok +endfun + +" --------------------------------------------------------------------- +" s:NetrwLocalRename: rename a remote file or directory {{{2 +fun! s:NetrwLocalRename(path) range +" call Dfunc("NetrwLocalRename(path<".a:path.">)") + + " preparation for removing multiple files/directories + let ctr = a:firstline + let svpos= netrw#NetrwSavePosn() + + " rename files given by the markfilelist + if exists("s:netrwmarkfilelist_{bufnr('%')}") + for oldname in s:netrwmarkfilelist_{bufnr("%")} +" call Decho("oldname<".oldname.">") + if exists("subfrom") + let newname= substitute(oldname,subfrom,subto,'') +" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") + else + call inputsave() + let newname= input("Moving ".oldname." to : ",oldname) + call inputrestore() + if newname =~ '^s/' + let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','') + let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','') +" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") + let newname = substitute(oldname,subfrom,subto,'') + endif + endif + call rename(oldname,newname) + endfor + call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir) + + else + + " attempt to rename files/directories + while ctr <= a:lastline + exe "keepjumps ".ctr + + " sanity checks + if line(".") < w:netrw_bannercnt + let ctr= ctr + 1 + continue + endif + let curword= s:NetrwGetWord() + if curword == "./" || curword == "../" + let ctr= ctr + 1 + continue + endif + + norm! 0 + let oldname= s:ComposePath(a:path,curword) +" call Decho("oldname<".oldname.">") + + call inputsave() + let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e')) + call inputrestore() + + call rename(oldname,newname) +" call Decho("renaming <".oldname."> to <".newname.">") + + let ctr= ctr + 1 + endwhile + endif + + " refresh the directory +" call Decho("refresh the directory listing") + call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) + call netrw#NetrwRestorePosn(svpos) + +" call Dret("NetrwLocalRename") +endfun + +" --------------------------------------------------------------------- +" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2 +" +" g:netrw_ Directory Is +" fastbrowse Local Remote +" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow) +" med 1 D H H=Hiding a buffer implies it may be re-used (fast) +" fast 2 H H +" +" Deleting a buffer means that it will be re-loaded when examined, hence "slow". +" Hiding a buffer means that it will be re-used when examined, hence "fast". +" (re-using a buffer may not be as accurate) +fun! s:LocalFastBrowser() +" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse) + + " initialize browselist, a list of buffer numbers that the local browser has used + if !exists("s:netrw_browselist") +" call Decho("initialize s:netrw_browselist") + let s:netrw_browselist= [] + endif + + " append current buffer to fastbrowse list + if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1] +" call Decho("appendng current buffer to browselist") + call add(s:netrw_browselist,bufnr("%")) +" call Decho("browselist=".string(s:netrw_browselist)) + endif + + " enable autocmd events to handle refreshing/removing local browser buffers + " If local browse buffer is currently showing: refresh it + " If local browse buffer is currently hidden : wipe it + if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1 +" call Decho("setting up local-browser shell command refresh") + let s:netrw_browser_shellcmd= 1 + augroup AuNetrwShellCmd + au! + if (has("win32") || has("win95") || has("win64") || has("win16")) +" call Decho("autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()") + au ShellCmdPost * call s:LocalBrowseShellCmdRefresh() + else + au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh() +" call Decho("autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()") + endif + augroup END + endif + + " user must have changed fastbrowse to its fast setting, so remove + " the associated autocmd events + if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd") +" call Decho("remove AuNetrwShellCmd autcmd group") + unlet s:netrw_browser_shellcmd + augroup AuNetrwShellCmd + au! + augroup END + augroup! AuNetrwShellCmd + endif + +" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">") +endfun + +" --------------------------------------------------------------------- +" Support Functions: {{{1 + +" --------------------------------------------------------------------- +" netrw#ErrorMsg: {{{2 +" 0=note = s:NOTE +" 1=warning = s:WARNING +" 2=error = s:ERROR +" Oct 12, 2008 : max errnum currently is 73 +fun! netrw#ErrorMsg(level,msg,errnum) +" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow) + + if a:level == 1 + let level= "**warning** (netrw) " + elseif a:level == 2 + let level= "**error** (netrw) " + else + let level= "**note** (netrw) " + endif +" call Decho("level=".level) + + if g:netrw_use_errorwindow + " (default) netrw creates a one-line window to show error/warning + " messages (reliably displayed) + + " record current window number for NetrwRestorePosn()'s benefit + let s:winBeforeErr= winnr() +" call Decho("s:winBeforeErr=".s:winBeforeErr) + + " getting messages out reliably is just plain difficult! + " This attempt splits the current window, creating a one line window. + if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0 +" call Decho("write to NetrwMessage buffer") + exe bufwinnr("NetrwMessage")."wincmd w" +" call Decho("setlocal ma noro") + setlocal ma noro + call setline(line("$")+1,level.a:msg) + $ + else +" call Decho("create a NetrwMessage buffer window") + bo 1split + enew + setlocal bt=nofile + file NetrwMessage +" call Decho("setlocal ma noro") + setlocal ma noro + call setline(line("$"),level.a:msg) + endif +" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr()) + if &fo !~ '[ta]' + syn clear + syn match netrwMesgNote "^\*\*note\*\*" + syn match netrwMesgWarning "^\*\*warning\*\*" + syn match netrwMesgError "^\*\*error\*\*" + hi link netrwMesgWarning WarningMsg + hi link netrwMesgError Error + endif + setlocal noma ro bh=wipe + + else + " (optional) netrw will show messages using echomsg. Even if the + " message doesn't appear, at least it'll be recallable via :messages +" redraw! + if a:level == s:WARNING + echohl WarningMsg + elseif a:level == s:ERROR + echohl Error + endif + echomsg level.a:msg +" call Decho("echomsg ***netrw*** ".a:msg) + echohl None + endif + +" call Dret("netrw#ErrorMsg") +endfun + +" --------------------------------------------------------------------- +" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2 +fun! netrw#NetrwRestorePosn(...) +" call Dfunc("netrw#NetrwRestorePosn() a:0=".a:0." winnr=".(exists("w:netrw_winnr")? w:netrw_winnr : -1)." line=".(exists("w:netrw_line")? w:netrw_line : -1)." col=".(exists("w:netrw_col")? w:netrw_col : -1)." hline=".(exists("w:netrw_hline")? w:netrw_hline : -1)) + let eikeep= &ei + set ei=all + if expand("%") == "NetrwMessage" + exe s:winBeforeErr."wincmd w" + endif + + if a:0 > 0 + exe a:1 + endif + + " restore window + if exists("w:netrw_winnr") +" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w") + exe "silent! ".w:netrw_winnr."wincmd w" + endif + if v:shell_error == 0 + " as suggested by Bram M: redraw on no error + " allows protocol error messages to remain visible +" redraw! + endif + + " restore top-of-screen line + if exists("w:netrw_hline") +" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z") + exe "norm! ".w:netrw_hline."G0z\" + endif + + " restore position + if exists("w:netrw_line") && exists("w:netrw_col") +" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|") + exe "norm! ".w:netrw_line."G0".w:netrw_col."\" + endif + + let &ei= eikeep +" call Dret("netrw#NetrwRestorePosn") +endfun + +" --------------------------------------------------------------------- +" netrw#NetrwSavePosn: saves position of cursor on screen {{{2 +fun! netrw#NetrwSavePosn() +" call Dfunc("netrw#NetrwSavePosn()") + " Save current line and column + let w:netrw_winnr= winnr() + let w:netrw_line = line(".") + let w:netrw_col = virtcol(".") + + " Save top-of-screen line + norm! H0 + let w:netrw_hline= line(".") + + " set up string holding position parameters + let ret = "let w:netrw_winnr=".w:netrw_winnr."|let w:netrw_line=".w:netrw_line."|let w:netrw_col=".w:netrw_col."|let w:netrw_hline=".w:netrw_hline + + call netrw#NetrwRestorePosn() +" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline) + return ret +endfun + +" ------------------------------------------------------------------------ +" netrw#RFC2396: converts %xx into characters {{{2 +fun! netrw#RFC2396(fname) +" call Dfunc("netrw#RFC2396(fname<".a:fname.">)") + let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t") +" call Dret("netrw#RFC2396 ".fname) + return fname +endfun + +" --------------------------------------------------------------------- +" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2 +fun! s:ComposePath(base,subdir) +" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)") + + if(has("amiga")) +" call Decho("amiga") + let ec = a:base[strlen(a:base)-1] + if ec != '/' && ec != ':' + let ret = a:base . "/" . a:subdir + else + let ret = a:base . a:subdir + endif + + elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16")) +" call Decho("windows") + let ret= a:subdir + + elseif a:base =~ '^\a\+://' +" call Decho("remote linux/macos") + let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','') + let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','') + if a:subdir == '../' + if curpath =~ '[^/]/[^/]\+/$' + let curpath= substitute(curpath,'[^/]\+/$','','') + else + let curpath="" + endif + let ret= urlbase.curpath + else + let ret= urlbase.curpath.a:subdir + endif +" call Decho("urlbase<".urlbase.">") +" call Decho("curpath<".curpath.">") +" call Decho("ret<".ret.">") + + else +" call Decho("local linux/macos") + let ret = substitute(a:base."/".a:subdir,"//","/","g") + if a:base =~ '^//' + " keeping initial '//' for the benefit of network share listing support + let ret= '/'.ret + endif + let ret= simplify(ret) + endif + +" call Dret("s:ComposePath ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:FileReadable: o/s independent filereadable {{{2 +fun! s:FileReadable(fname) +" call Dfunc("s:FileReadable(fname<".a:fname.">)") + + if g:netrw_cygwin + let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/','')) + else + let ret= filereadable(a:fname) + endif + +" call Dret("s:FileReadable ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2 +" Places correct suffix on end of temporary filename, +" using the suffix provided with fname +fun! s:GetTempfile(fname) +" call Dfunc("s:GetTempfile(fname<".a:fname.">)") + + if !exists("b:netrw_tmpfile") + " get a brand new temporary filename + let tmpfile= tempname() +" call Decho("tmpfile<".tmpfile."> : from tempname()") + + let tmpfile= substitute(tmpfile,'\','/','ge') +" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /") + + " sanity check -- does the temporary file's directory exist? + if !isdirectory(substitute(tmpfile,'[^/]\+$','','e')) +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) + call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2) +" call Dret("s:GetTempfile getcwd<".getcwd().">") + return "" + endif + + " let netrw#NetSource() know about the tmpfile + let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX() +" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">") + + " o/s dependencies + if g:netrw_cygwin != 0 + let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e') + elseif has("win32") || has("win95") || has("win64") || has("win16") + if !exists("+shellslash") || !&ssl + let tmpfile = substitute(tmpfile,'/','\','g') + endif + else + let tmpfile = tmpfile + endif + let b:netrw_tmpfile= tmpfile +" call Decho("o/s dependent fixed tempname<".tmpfile.">") + else + " re-use temporary filename + let tmpfile= b:netrw_tmpfile +" call Decho("tmpfile<".tmpfile."> re-using") + endif + + " use fname's suffix for the temporary file + if a:fname != "" + if a:fname =~ '\.[^./]\+$' +" call Decho("using fname<".a:fname.">'s suffix") + if a:fname =~ '.tar.gz' || a:fname =~ '.tar.bz2' + let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e') + else + let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e') + endif +" call Decho("suffix<".suffix.">") + let tmpfile= substitute(tmpfile,'\.tmp$','','e') +" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)") + let tmpfile .= suffix +" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">") + let s:netrw_tmpfile= tmpfile " supports netrw#NetSource() + endif + endif + +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:GetTempfile <".tmpfile.">") + return tmpfile +endfun + +" --------------------------------------------------------------------- +" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2 +" a correct command for use with a system() call +fun! s:MakeSshCmd(sshcmd) +" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">") + let sshcmd = substitute(a:sshcmd,'\',s:user.s:machine,'') + if exists("g:netrw_port") && g:netrw_port != "" + let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'') + elseif exists("s:port") && s:port != "" + let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'') + else + let sshcmd= substitute(sshcmd,"USEPORT ",'','') + endif +" call Dret("s:MakeSshCmd <".sshcmd.">") + return sshcmd +endfun + +" --------------------------------------------------------------------- +" s:NetrwBMShow: {{{2 +fun! s:NetrwBMShow() +" call Dfunc("s:NetrwBMShow()") + redir => bmshowraw + menu + redir END + let bmshowlist = split(bmshowraw,'\n') + if bmshowlist != [] + let bmshowfuncs= filter(bmshowlist,'v:val =~ "\\d\\+_BMShow()"') + if bmshowfuncs != [] + let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','') + if bmshowfunc =~ '^call.*BMShow()' + exe "silent! ".bmshowfunc + endif + endif + endif +" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwDelete: Deletes a file. {{{2 +" Uses Steve Hall's idea to insure that Windows paths stay +" acceptable. No effect on Unix paths. +" Examples of use: let result= s:NetrwDelete(path) +fun! s:NetrwDelete(path) +" call Dfunc("s:NetrwDelete(path<".a:path.">)") + + let path = s:WinPath(a:path) + if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) + if exists("+shellslash") + let sskeep= &shellslash + setlocal noshellslash + let result = delete(path) + let &shellslash = sskeep + else +" call Decho("exe let result= ".a:cmd."('".path."')") + let result= delete(path) + endif + else +" call Decho("let result= delete(".path.")") + let result= delete(path) + endif + if result < 0 + call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71) + endif + +" call Dret("s:NetrwDelete ".result) + return result +endfun + +" --------------------------------------------------------------------- +" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2 +fun! s:NetrwEnew(curdir) +" call Dfunc("s:NetrwEnew(curdir<".a:curdir.">) buf#".bufnr("%")."<".bufname("%").">") + + " grab a function-local-variable copy of buffer variables + if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif + if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif + if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif + if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif + if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif + if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif + if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif + if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif + if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif + if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif + if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif + if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif + if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif + if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif + if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif + if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif + + call s:NetrwOptionRestore("w:") +" call Decho("generate a buffer with keepjumps keepalt enew!") + keepjumps keepalt enew! + call s:NetrwOptionSave("w:") + + " copy function-local-variables to buffer variable equivalents + if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif + if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif + if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif + if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif + if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif + if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif + if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif + if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif + if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif + if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif + if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif + if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif + if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif + if exists("netrw_method") |let b:netrw_method = netrw_method |endif + if exists("netrw_option") |let b:netrw_option = netrw_option |endif + if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif + + let b:netrw_curdir= a:curdir + if b:netrw_curdir =~ '/$' + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST + file NetrwTreeListing + nno [ :silent call TreeListMove('[') + nno ] :silent call TreeListMove(']') + else + exe "silent! keepalt file ".fnameescape(b:netrw_curdir) + endif + endif + +" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">") +endfun + +" ------------------------------------------------------------------------ +" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2 +" changed sorting, etc. Also see s:NetrwRestoreWordPosn(). +fun! s:NetrwSaveWordPosn() +" call Dfunc("NetrwSaveWordPosn()") + let s:netrw_saveword= '^'.fnameescape(getline('.')).'$' +" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2 +" changed sorting, etc. Also see s:NetrwSaveWordPosn(). +fun! s:NetrwRestoreWordPosn() +" call Dfunc("NetrwRestoreWordPosn()") + silent! call search(s:netrw_saveword,'w') +" call Dret("NetrwRestoreWordPosn") +endfun + +" --------------------------------------------------------------------- +" s:RestoreBufVars: {{{2 +fun! s:RestoreBufVars() +" call Dfunc("s:RestoreBufVars()") + + if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif + if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif + if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif + if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif + if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif + if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif + +" call Dret("s:RestoreBufVars") +endfun + +" --------------------------------------------------------------------- +" s:RemotePathAnalysis: {{{2 +fun! s:RemotePathAnalysis(dirname) +" call Dfunc("s:RemotePathAnalysis()") + + let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$' + let s:method = substitute(a:dirname,dirpat,'\1','') + let s:user = substitute(a:dirname,dirpat,'\2','') + let s:machine = substitute(a:dirname,dirpat,'\3','') + let s:port = substitute(a:dirname,dirpat,'\4','') + let s:path = substitute(a:dirname,dirpat,'\5','') + let s:fname = substitute(a:dirname,'^.*/\ze.','','') + +" call Decho("set up s:method <".s:method .">") +" call Decho("set up s:user <".s:user .">") +" call Decho("set up s:machine<".s:machine.">") +" call Decho("set up s:port <".s:port.">") +" call Decho("set up s:path <".s:path .">") +" call Decho("set up s:fname <".s:fname .">") + +" call Dret("s:RemotePathAnalysis") +endfun + +" --------------------------------------------------------------------- +" s:RemoteSystem: runs a command on a remote host using ssh {{{2 +" Returns status +" Runs system() on +" [cd REMOTEDIRPATH;] a:cmd +" Note that it doesn't do shellescape(a:cmd)! +fun! s:RemoteSystem(cmd) +" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)") + if !executable(g:netrw_ssh_cmd) + call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52) + elseif !exists("b:netrw_curdir") + call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53) + else + let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME") + let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','') + if remotedir != "" + let cmd= cmd.' cd '.shellescape(remotedir).";" + else + let cmd= cmd.' ' + endif + let cmd= cmd.a:cmd +" call Decho("call system(".cmd.")") + let ret= system(cmd) + endif +" call Dret("s:RemoteSystem ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2 +fun! s:RestoreWinVars() +" call Dfunc("s:RestoreWinVars()") + if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif + if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif + if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif + if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif + if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif + if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif + if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif + if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif + if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif + if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif + if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif + if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif + if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif + if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif + if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif + if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif + if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif + if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif +" call Dret("s:RestoreWinVars") +endfun + +" --------------------------------------------------------------------- +" s:Rexplore: implements returning from a buffer to a netrw directory {{{2 +" +" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap +" is true) and a command, :Rexplore, which call this function. +" +" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir() +fun! s:NetrwRexplore(islocal,dirname) +" call Dfunc("s:NetrwRexplore(islocal=".a:islocal." dirname<".a:dirname.">)") + if a:islocal + call netrw#LocalBrowseCheck(a:dirname) + else + call s:NetrwBrowse(0,a:dirname) + endif + if exists("s:nbcd_curpos_{bufnr('%')}") + call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')}) + unlet s:nbcd_curpos_{bufnr('%')} + endif +" call Dret("s:NetrwRexplore") +endfun + +" --------------------------------------------------------------------- +" s:SaveBufVars: {{{2 +fun! s:SaveBufVars() +" call Dfunc("s:SaveBufVars()") + + if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif + if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif + if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif + if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif + if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif + if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif + +" call Dret("s:SaveBufVars") +endfun + +" --------------------------------------------------------------------- +" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2 +fun! s:SaveWinVars() +" call Dfunc("s:SaveWinVars()") + if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif + if exists("w:netrw_col") |let s:col = w:netrw_col |endif + if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif + if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif + if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif + if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif + if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif + if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif + if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif + if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif + if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif + if exists("w:netrw_line") |let s:line = w:netrw_line |endif + if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif + if exists("w:netrw_method") |let s:method = w:netrw_method |endif + if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif + if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif + if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif + if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif +" call Dret("s:SaveWinVars") +endfun + +" --------------------------------------------------------------------- +" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2 +" To allow separate windows to have their own activities, such as +" Explore **/pattern, several variables have been made window-oriented. +" However, when the user splits a browser window (ex: ctrl-w s), these +" variables are not inherited by the new window. SetBufWinVars() and +" UseBufWinVars() get around that. +fun! s:SetBufWinVars() +" call Dfunc("s:SetBufWinVars()") + if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif + if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif + if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif + if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif + if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif + if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif + if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif + if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif + if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif + if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif +" call Dret("s:SetBufWinVars") +endfun + +" --------------------------------------------------------------------- +" s:SetRexDir: set directory for :Rexplore {{{2 +fun! s:SetRexDir(islocal,dirname) +" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)") + " set up Rex and leftmouse-double-click + if a:islocal + exe 'com! Rexplore call s:NetrwRexplore(1,"'.escape(a:dirname,'"\').'")' + if g:netrw_retmap + if !hasmapto("NetrwReturn") && maparg("<2-leftmouse>","n") == "" + nmap <2-leftmouse> NetrwReturn + endif + let dir = escape(a:dirname, s:netrw_map_escape) + exe 'nnoremap NetrwReturn :call NetrwRexplore(1,"'.dir.'")' + endif + else + exe 'com! Rexplore call s:NetrwRexplore(0,"'.escape(a:dirname,'"\').'")' + if g:netrw_retmap + if !hasmapto("NetrwReturn") && maparg("<2-leftmouse>","n") == "" + nmap <2-leftmouse> NetrwReturn + endif + let dir = escape(a:dirname, s:netrw_map_escape) + exe 'nnoremap NetrwReturn :call NetrwRexplore(0,"'.dir.'")' + endif + endif +" call Dret("s:SetRexDir") +endfun + +" --------------------------------------------------------------------- +" s:Strlen: this function returns the length of a string, even if its {{{2 +" using two-byte etc characters. +" Currently, its only used if g:Align_xstrlen is set to a +" nonzero value. Solution from Nicolai Weibull, vim docs +" (:help strlen()), Tony Mechelynck, and my own invention. +fun! s:Strlen(x) +" call Dfunc("s:Strlen(x<".a:x.">") + if g:netrw_xstrlen == 1 + " number of codepoints (Latin a + combining circumflex is two codepoints) + " (comment from TM, solution from NW) + let ret= strlen(substitute(a:x,'.','c','g')) + + elseif g:netrw_xstrlen == 2 + " number of spacing codepoints (Latin a + combining circumflex is one spacing + " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.) + " (comment from TM, solution from TM) + let ret=strlen(substitute(a:x, '.\Z', 'x', 'g')) + + elseif g:netrw_xstrlen == 3 + " virtual length (counting, for instance, tabs as anything between 1 and + " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately + " preceded by lam, one otherwise, etc.) + " (comment from TM, solution from me) + let modkeep= &mod + exe "norm! o\" + call setline(line("."),a:x) + let ret= virtcol("$") - 1 + d + let &mod= modkeep + + else + " at least give a decent default + ret= strlen(a:x) + endif +" call Dret("s:Strlen ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:TreeListMove: {{{2 +fun! s:TreeListMove(dir) +" call Dfunc("s:TreeListMove(dir<".a:dir.">)") + let curline = getline('.') + let prvline = (line(".") > 1)? getline(line(".")-1) : '' + let nxtline = (line(".") < line("$"))? getline(line(".")+1) : '' + let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','') + let indentm1 = substitute(curindent,'^| ','','') +" call Decho("prvline <".prvline."> #".line(".")-1) +" call Decho("curline <".curline."> #".line(".")) +" call Decho("nxtline <".nxtline."> #".line(".")+1) +" call Decho("curindent<".curindent.">") +" call Decho("indentm1 <".indentm1.">") + + if curline !~ '/$' +" call Decho('regfile') + if a:dir == '[' && prvline != '' + norm! 0 + let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file +" call Decho("regfile srch back: ".nl) + elseif a:dir == ']' && nxtline != '' + norm! $ + let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file +" call Decho("regfile srch fwd: ".nl) + endif + + elseif a:dir == '[' && prvline != '' + norm! 0 + let curline= line(".") + let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation +" call Decho("dir srch back ind: ".nl) + if nl != 0 + if line(".") == curline-1 + let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1 +" call Decho("dir srch back ind-1: ".nl) + endif + endif + + elseif a:dir == ']' && nxtline != '' + norm! $ + let curline = line(".") + let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation +" call Decho("dir srch fwd ind: ".nl) + if nl != 0 + if line(".") == curline+1 + let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1 +" call Decho("dir srch fwd ind-1: ".nl) + endif + endif + + endif + +" call Dret("s:TreeListMove") +endfun + +" --------------------------------------------------------------------- +" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2 +" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function +" can't be called except via emenu. But due to locale, that menu line may not be called +" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway. +fun! s:UpdateBuffersMenu() +" call Dfunc("s:UpdateBuffersMenu()") + if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' + try + silent emenu Buffers.Refresh\ menu + catch /^Vim\%((\a\+)\)\=:E/ + let v:errmsg= "" + silent call s:NetrwBMShow() + endtry + endif +" call Dret("s:UpdateBuffersMenu") +endfun + +" --------------------------------------------------------------------- +" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2 +" Matching function to BufferWinVars() +fun! s:UseBufWinVars() +" call Dfunc("s:UseBufWinVars()") + if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif + if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif + if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif + if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif + if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif + if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif + if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif + if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif + if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif + if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif +" call Dret("s:UseBufWinVars") +endfun + +" --------------------------------------------------------------------- +" s:WinPath: {{{2 +fun! s:WinPath(path) +" call Dfunc("s:WinPath(path<".a:path.">)") + if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) + " remove trailing slash (Win95) + let path = substitute(a:path, '\(\\\|/\)$', '', 'g') + " remove escaped spaces + let path = substitute(path, '\ ', ' ', 'g') + " convert slashes to backslashes + let path = substitute(path, '/', '\', 'g') + else + let path= a:path + endif +" call Dret("s:WinPath <".path.">") + return path +endfun + +" --------------------------------------------------------------------- +" Settings Restoration: {{{2 +let &cpo= s:keepcpo +unlet s:keepcpo + +" ------------------------------------------------------------------------ +" Modelines: {{{1 +" vim:ts=8 fdm=marker diff --git a/netrwFileHandlers.vim b/netrwFileHandlers.vim new file mode 100644 index 00000000..1515b009 --- /dev/null +++ b/netrwFileHandlers.vim @@ -0,0 +1,361 @@ +" netrwFileHandlers: contains various extension-based file handlers for +" netrw's browsers' x command ("eXecute launcher") +" Author: Charles E. Campbell, Jr. +" Date: Sep 30, 2008 +" Version: 10 +" Copyright: Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1 +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" netrwFileHandlers.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 damages +" resulting from the use of this software. +" +" Rom 6:23 (WEB) For the wages of sin is death, but the free gift of God {{{1 +" is eternal life in Christ Jesus our Lord. + +" --------------------------------------------------------------------- +" Load Once: {{{1 +if exists("g:loaded_netrwFileHandlers") || &cp + finish +endif +let g:loaded_netrwFileHandlers= "v10" +if v:version < 702 + echohl WarningMsg + echo "***warning*** this version of netrwFileHandlers needs vim 7.2" + echohl Normal + finish +endif +let s:keepcpo= &cpo +set cpo&vim + +" --------------------------------------------------------------------- +" netrwFileHandlers#Invoke: {{{1 +fun! netrwFileHandlers#Invoke(exten,fname) +" call Dfunc("netrwFileHandlers#Invoke(exten<".a:exten."> fname<".a:fname.">)") + let fname= a:fname + " list of supported special characters. Consider rcs,v --- that can be + " supported with a NFH_rcsCOMMAv() handler + if a:fname =~ '[@:,$!=\-+%?;~]' + let specials= { +\ '@' : 'AT', +\ ':' : 'COLON', +\ ',' : 'COMMA', +\ '$' : 'DOLLAR', +\ '!' : 'EXCLAMATION', +\ '=' : 'EQUAL', +\ '-' : 'MINUS', +\ '+' : 'PLUS', +\ '%' : 'PERCENT', +\ '?' : 'QUESTION', +\ ';' : 'SEMICOLON', +\ '~' : 'TILDE'} + let fname= substitute(a:fname,'[@:,$!=\-+%?;~]','\=specials[submatch(0)]','ge') +" call Decho('fname<'.fname.'> done with dictionary') + endif + + if a:exten != "" && exists("*NFH_".a:exten) + " support user NFH_*() functions +" call Decho("let ret= netrwFileHandlers#NFH_".a:exten.'("'.fname.'")') + exe "let ret= NFH_".a:exten.'("'.fname.'")' + elseif a:exten != "" && exists("*s:NFH_".a:exten) + " use builtin-NFH_*() functions +" call Decho("let ret= netrwFileHandlers#NFH_".a:exten.'("'.fname.'")') + exe "let ret= s:NFH_".a:exten.'("'.fname.'")' + endif + +" call Dret("netrwFileHandlers#Invoke 0 : ret=".ret) + return 0 +endfun + +" --------------------------------------------------------------------- +" s:NFH_html: handles html when the user hits "x" when the {{{1 +" cursor is atop a *.html file +fun! s:NFH_html(pagefile) +" call Dfunc("s:NFH_html(".a:pagefile.")") + + let page= substitute(a:pagefile,'^','file://','') + + if executable("mozilla") +" call Decho("executing !mozilla ".page) + exe "!mozilla ".shellescape(page,1) + elseif executable("netscape") +" call Decho("executing !netscape ".page) + exe "!netscape ".shellescape(page,1) + else +" call Dret("s:NFH_html 0") + return 0 + endif + +" call Dret("s:NFH_html 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_htm: handles html when the user hits "x" when the {{{1 +" cursor is atop a *.htm file +fun! s:NFH_htm(pagefile) +" call Dfunc("s:NFH_htm(".a:pagefile.")") + + let page= substitute(a:pagefile,'^','file://','') + + if executable("mozilla") +" call Decho("executing !mozilla ".page) + exe "!mozilla ".shellescape(page,1) + elseif executable("netscape") +" call Decho("executing !netscape ".page) + exe "!netscape ".shellescape(page,1) + else +" call Dret("s:NFH_htm 0") + return 0 + endif + +" call Dret("s:NFH_htm 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_jpg: {{{1 +fun! s:NFH_jpg(jpgfile) +" call Dfunc("s:NFH_jpg(jpgfile<".a:jpgfile.">)") + + if executable("gimp") + exe "silent! !gimp -s ".shellescape(a:jpgfile,1) + elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE") +" call Decho("silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".escape(a:jpgfile," []|'")) + exe "!".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:jpgfile,1) + else +" call Dret("s:NFH_jpg 0") + return 0 + endif + +" call Dret("s:NFH_jpg 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_gif: {{{1 +fun! s:NFH_gif(giffile) +" call Dfunc("s:NFH_gif(giffile<".a:giffile.">)") + + if executable("gimp") + exe "silent! !gimp -s ".shellescape(a:giffile,1) + elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE") + exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:giffile,1) + else +" call Dret("s:NFH_gif 0") + return 0 + endif + +" call Dret("s:NFH_gif 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_png: {{{1 +fun! s:NFH_png(pngfile) +" call Dfunc("s:NFH_png(pngfile<".a:pngfile.">)") + + if executable("gimp") + exe "silent! !gimp -s ".shellescape(a:pngfile,1) + elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE") + exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:pngfile,1) + else +" call Dret("s:NFH_png 0") + return 0 + endif + +" call Dret("s:NFH_png 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_pnm: {{{1 +fun! s:NFH_pnm(pnmfile) +" call Dfunc("s:NFH_pnm(pnmfile<".a:pnmfile.">)") + + if executable("gimp") + exe "silent! !gimp -s ".shellescape(a:pnmfile,1) + elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE") + exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:pnmfile,1) + else +" call Dret("s:NFH_pnm 0") + return 0 + endif + +" call Dret("s:NFH_pnm 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_bmp: visualize bmp files {{{1 +fun! s:NFH_bmp(bmpfile) +" call Dfunc("s:NFH_bmp(bmpfile<".a:bmpfile.">)") + + if executable("gimp") + exe "silent! !gimp -s ".a:bmpfile + elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE") + exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:bmpfile,1) + else +" call Dret("s:NFH_bmp 0") + return 0 + endif + +" call Dret("s:NFH_bmp 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_pdf: visualize pdf files {{{1 +fun! s:NFH_pdf(pdf) +" call Dfunc("s:NFH_pdf(pdf<".a:pdf.">)") + if executable("gs") + exe 'silent! !gs '.shellescape(a:pdf,1) + elseif executable("pdftotext") + exe 'silent! pdftotext -nopgbrk '.shellescape(a:pdf,1) + else +" call Dret("s:NFH_pdf 0") + return 0 + endif + +" call Dret("s:NFH_pdf 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_doc: visualize doc files {{{1 +fun! s:NFH_doc(doc) +" call Dfunc("s:NFH_doc(doc<".a:doc.">)") + + if executable("oowriter") + exe 'silent! !oowriter '.shellescape(a:doc,1) + redraw! + else +" call Dret("s:NFH_doc 0") + return 0 + endif + +" call Dret("s:NFH_doc 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_sxw: visualize sxw files {{{1 +fun! s:NFH_sxw(sxw) +" call Dfunc("s:NFH_sxw(sxw<".a:sxw.">)") + + if executable("oowriter") + exe 'silent! !oowriter '.shellescape(a:sxw,1) + redraw! + else +" call Dret("s:NFH_sxw 0") + return 0 + endif + +" call Dret("s:NFH_sxw 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_xls: visualize xls files {{{1 +fun! s:NFH_xls(xls) +" call Dfunc("s:NFH_xls(xls<".a:xls.">)") + + if executable("oocalc") + exe 'silent! !oocalc '.shellescape(a:xls,1) + redraw! + else +" call Dret("s:NFH_xls 0") + return 0 + endif + +" call Dret("s:NFH_xls 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_ps: handles PostScript files {{{1 +fun! s:NFH_ps(ps) +" call Dfunc("s:NFH_ps(ps<".a:ps.">)") + if executable("gs") +" call Decho("exe silent! !gs ".a:ps) + exe "silent! !gs ".shellescape(a:ps,1) + redraw! + elseif executable("ghostscript") +" call Decho("exe silent! !ghostscript ".a:ps) + exe "silent! !ghostscript ".shellescape(a:ps,1) + redraw! + elseif executable("gswin32") +" call Decho("exe silent! !gswin32 ".shellescape(a:ps,1)) + exe "silent! !gswin32 ".shellescape(a:ps,1) + redraw! + else +" call Dret("s:NFH_ps 0") + return 0 + endif + +" call Dret("s:NFH_ps 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_eps: handles encapsulated PostScript files {{{1 +fun! s:NFH_eps(eps) +" call Dfunc("s:NFH_eps()") + if executable("gs") + exe "silent! !gs ".shellescape(a:eps,1) + redraw! + elseif executable("ghostscript") + exe "silent! !ghostscript ".shellescape(a:eps,1) + redraw! + elseif executable("ghostscript") + exe "silent! !ghostscript ".shellescape(a:eps,1) + redraw! + elseif executable("gswin32") + exe "silent! !gswin32 ".shellescape(a:eps,1) + redraw! + else +" call Dret("s:NFH_eps 0") + return 0 + endif +" call Dret("s:NFH_eps 0") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_fig: handles xfig files {{{1 +fun! s:NFH_fig(fig) +" call Dfunc("s:NFH_fig()") + if executable("xfig") + exe "silent! !xfig ".a:fig + redraw! + else +" call Dret("s:NFH_fig 0") + return 0 + endif + +" call Dret("s:NFH_fig 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NFH_obj: handles tgif's obj files {{{1 +fun! s:NFH_obj(obj) +" call Dfunc("s:NFH_obj()") + if has("unix") && executable("tgif") + exe "silent! !tgif ".a:obj + redraw! + else +" call Dret("s:NFH_obj 0") + return 0 + endif + +" call Dret("s:NFH_obj 1") + return 1 +endfun + +let &cpo= s:keepcpo +" --------------------------------------------------------------------- +" Modelines: {{{1 +" vim: fdm=marker diff --git a/netrwPlugin.vim b/netrwPlugin.vim new file mode 100644 index 00000000..73c5e2c6 --- /dev/null +++ b/netrwPlugin.vim @@ -0,0 +1,159 @@ +" netrwPlugin.vim: Handles file transfer and remote directory listing across a network +" PLUGIN SECTION +" Date: Aug 10, 2008 +" Maintainer: Charles E Campbell, Jr +" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim +" Copyright: Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1 +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided +" *as is* and comes with no warranty of any kind, either +" expressed or implied. By using this plugin, you agree that +" in no event will the copyright holder be liable for any damages +" resulting from the use of this software. +" +" But be doers of the Word, and not only hearers, deluding your own selves {{{1 +" (James 1:22 RSV) +" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +" Load Once: {{{1 +if &cp || exists("g:loaded_netrwPlugin") + finish +endif +let g:loaded_netrwPlugin = "v134" +if v:version < 702 + echohl WarningMsg | echo "***netrw*** you need vim version 7.2 for this version of netrw" | echohl None + finish +endif +let s:keepcpo = &cpo +set cpo&vim + +" --------------------------------------------------------------------- +" Public Interface: {{{1 + +" Local Browsing: {{{2 +augroup FileExplorer + au! + au BufEnter * silent! call s:LocalBrowse(expand("")) + if has("win32") || has("win95") || has("win64") || has("win16") + au BufEnter .* silent! call s:LocalBrowse(expand("")) + endif +augroup END + +" Network Browsing Reading Writing: {{{2 +augroup Network + au! + if has("win32") || has("win95") || has("win64") || has("win16") + au BufReadCmd file://* exe "silent doau BufReadPre ".fnameescape(netrw#RFC2396(expand("")))|exe 'e '.fnameescape(substitute(netrw#RFC2396(expand("")),'file://\(.*\)','\1',""))|exe "bwipe ".fnameescape(expand(""))|exe "silent doau BufReadPost ".fnameescape(netrw#RFC2396(expand(""))) + else + au BufReadCmd file://* exe "silent doau BufReadPre ".fnameescape(netrw#RFC2396(expand("")))|exe 'e '.fnameescape(substitute(netrw#RFC2396(expand("")),'file://\(.*\)','\1',""))|exe "bwipe ".fnameescape(expand(""))|exe "silent doau BufReadPost ".fnameescape(netrw#RFC2396(expand(""))) + au BufReadCmd file://localhost/* exe "silent doau BufReadPre ".fnameescape(netrw#RFC2396(expand("")))|exe 'e '.fnameescape(substitute(netrw#RFC2396(expand("")),'file://localhost/\(.*\)','\1',""))|exe "bwipe ".fnameescape(substitute(expand(""),'file://\(\k\+@\)\=','',''))|exe "silent doau BufReadPost ".fnameescape(netrw#RFC2396(expand(""))) + endif + au BufReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe "silent doau BufReadPre ".fnameescape(expand(""))|exe '2Nread '.fnameescape(expand(""))|exe "silent doau BufReadPost ".fnameescape(expand("")) + au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe "silent doau FileReadPre ".fnameescape(expand(""))|exe 'Nread '.fnameescape(expand(""))|exe "silent doau FileReadPost ".fnameescape(expand("")) + au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,davs://*,rsync://*,sftp://* exe "silent doau BufWritePre ".fnameescape(expand(""))|exe 'Nwrite '.fnameescape(expand(""))|exe "silent doau BufWritePost ".fnameescape(expand("")) + au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,davs://*,rsync://*,sftp://* exe "silent doau FileWritePre ".fnameescape(expand(""))|exe "'[,']".'Nwrite '.fnameescape(expand(""))|exe "silent doau FileWritePost ".fnameescape(expand("")) + try + au SourceCmd ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("")) + catch /^Vim\%((\a\+)\)\=:E216/ + au SourcePre ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("")) + endtry +augroup END + +" Commands: :Nread, :Nwrite, :NetUserPass {{{2 +com! -count=1 -nargs=* Nread call netrw#NetrwSavePosn()call netrw#NetRead(,)call netrw#NetrwRestorePosn() +com! -range=% -nargs=* Nwrite call netrw#NetrwSavePosn(),call netrw#NetWrite()call netrw#NetrwRestorePosn() +com! -nargs=* NetUserPass call NetUserPass() +com! -nargs=* Nsource call netrw#NetrwSavePosn()call netrw#NetSource()call netrw#NetrwRestorePosn() + +" Commands: :Explore, :Sexplore, Hexplore, Vexplore {{{2 +com! -nargs=* -bar -bang -count=0 -complete=dir Explore call netrw#Explore(,0,0+0,) +com! -nargs=* -bar -bang -count=0 -complete=dir Sexplore call netrw#Explore(,1,0+0,) +com! -nargs=* -bar -bang -count=0 -complete=dir Hexplore call netrw#Explore(,1,2+0,) +com! -nargs=* -bar -bang -count=0 -complete=dir Vexplore call netrw#Explore(,1,4+0,) +com! -nargs=* -bar -count=0 -complete=dir Texplore call netrw#Explore(,0,6 ,) +com! -nargs=* -bar -bang Nexplore call netrw#Explore(-1,0,0,) +com! -nargs=* -bar -bang Pexplore call netrw#Explore(-2,0,0,) + +" Commands: NetrwSettings {{{2 +com! -nargs=0 NetrwSettings call netrwSettings#NetrwSettings() +com! -bang NetrwClean call netrw#NetrwClean(0) + +" Maps: +if !exists("g:netrw_nogx") && maparg('g','n') == "" + if !hasmapto('NetrwBrowseX') + nmap gx NetrwBrowseX + endif + nno NetrwBrowseX :call netrw#NetrwBrowseX(expand(""),0) +endif + +" --------------------------------------------------------------------- +" LocalBrowse: {{{2 +fun! s:LocalBrowse(dirname) + " unfortunate interaction -- debugging calls can't be used here; + " the BufEnter event causes triggering when attempts to write to + " the DBG buffer are made. +" echomsg "dirname<".a:dirname.">" + if has("amiga") + " The check against '' is made for the Amiga, where the empty + " string is the current directory and not checking would break + " things such as the help command. + if a:dirname != '' && isdirectory(a:dirname) + silent! call netrw#LocalBrowseCheck(a:dirname) + endif + elseif isdirectory(a:dirname) +" echomsg "dirname<".dirname."> isdir" + silent! call netrw#LocalBrowseCheck(a:dirname) + endif + " not a directory, ignore it +endfun + +" --------------------------------------------------------------------- +" NetrwStatusLine: {{{1 +fun! NetrwStatusLine() +" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".") + if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list") + let &stl= s:netrw_explore_stl + if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif + if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif + return "" + else + return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen + endif +endfun + +" ------------------------------------------------------------------------ +" NetUserPass: set username and password for subsequent ftp transfer {{{1 +" Usage: :call NetUserPass() -- will prompt for userid and password +" :call NetUserPass("uid") -- will prompt for password +" :call NetUserPass("uid","password") -- sets global userid and password +fun! NetUserPass(...) + + " get/set userid + if a:0 == 0 +" call Dfunc("NetUserPass(a:0<".a:0.">)") + if !exists("g:netrw_uid") || g:netrw_uid == "" + " via prompt + let g:netrw_uid= input('Enter username: ') + endif + else " from command line +" call Dfunc("NetUserPass(a:1<".a:1.">) {") + let g:netrw_uid= a:1 + endif + + " get password + if a:0 <= 1 " via prompt +" call Decho("a:0=".a:0." case <=1:") + let g:netrw_passwd= inputsecret("Enter Password: ") + else " from command line +" call Decho("a:0=".a:0." case >1: a:2<".a:2.">") + let g:netrw_passwd=a:2 + endif +" call Dret("NetUserPass") +endfun + +" ------------------------------------------------------------------------ +" Modelines And Restoration: {{{1 +let &cpo= s:keepcpo +unlet s:keepcpo +" vim:ts=8 fdm=marker diff --git a/netrwSettings.vim b/netrwSettings.vim new file mode 100644 index 00000000..daf9e21a --- /dev/null +++ b/netrwSettings.vim @@ -0,0 +1,207 @@ +" netrwSettings.vim: makes netrw settings simpler +" Date: Sep 03, 2008 +" Maintainer: Charles E Campbell, Jr +" Version: 13 +" Copyright: Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1 +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" netrwSettings.vim is provided *as is* and comes with no +" warranty of any kind, either expressed or implied. By using +" this plugin, you agree that in no event will the copyright +" holder be liable for any damages resulting from the use +" of this software. +" +" Mat 4:23 (WEB) Jesus went about in all Galilee, teaching in their {{{1 +" synagogues, preaching the gospel of the kingdom, and healing +" every disease and every sickness among the people. +" Load Once: {{{1 +if exists("g:loaded_netrwSettings") || &cp + finish +endif +let g:loaded_netrwSettings = "v13" +if v:version < 700 + echohl WarningMsg + echo "***warning*** this version of netrwSettings needs vim 7.0" + echohl Normal + finish +endif + +" --------------------------------------------------------------------- +" NetrwSettings: {{{1 +fun! netrwSettings#NetrwSettings() + " this call is here largely just to insure that netrw has been loaded + call netrw#NetrwSavePosn() + if !exists("g:loaded_netrw") + echohl WarningMsg | echomsg "***sorry*** netrw needs to be loaded prior to using NetrwSettings" | echohl None + return + endif + + above wincmd s + enew + setlocal noswapfile bh=wipe + set ft=vim + file Netrw\ Settings + + " these variables have the following default effects when they don't + " exist (ie. have not been set by the user in his/her .vimrc) + if !exists("g:netrw_liststyle") + let g:netrw_liststyle= 0 + let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa" + endif + if !exists("g:netrw_silent") + let g:netrw_silent= 0 + endif + if !exists("g:netrw_use_nt_rcp") + let g:netrw_use_nt_rcp= 0 + endif + if !exists("g:netrw_ftp") + let g:netrw_ftp= 0 + endif + if !exists("g:netrw_ignorenetrc") + let g:netrw_ignorenetrc= 0 + endif + + put ='+ ---------------------------------------------' + put ='+ NetrwSettings: by Charles E. Campbell, Jr.' + put ='+ Press with cursor atop any line for help' + put ='+ ---------------------------------------------' + let s:netrw_settings_stop= line(".") + + put ='' + put ='+ Netrw Protocol Commands' + put = 'let g:netrw_dav_cmd = '.g:netrw_dav_cmd + put = 'let g:netrw_fetch_cmd = '.g:netrw_fetch_cmd + put = 'let g:netrw_ftp_cmd = '.g:netrw_ftp_cmd + put = 'let g:netrw_http_cmd = '.g:netrw_http_cmd + put = 'let g:netrw_rcp_cmd = '.g:netrw_rcp_cmd + put = 'let g:netrw_rsync_cmd = '.g:netrw_rsync_cmd + put = 'let g:netrw_scp_cmd = '.g:netrw_scp_cmd + put = 'let g:netrw_sftp_cmd = '.g:netrw_sftp_cmd + put = 'let g:netrw_ssh_cmd = '.g:netrw_ssh_cmd + let s:netrw_protocol_stop= line(".") + put = '' + + put ='+Netrw Transfer Control' + put = 'let g:netrw_cygwin = '.g:netrw_cygwin + put = 'let g:netrw_ftp = '.g:netrw_ftp + put = 'let g:netrw_ftpmode = '.g:netrw_ftpmode + put = 'let g:netrw_ignorenetrc = '.g:netrw_ignorenetrc + put = 'let g:netrw_sshport = '.g:netrw_sshport + put = 'let g:netrw_use_nt_rcp = '.g:netrw_use_nt_rcp + put = 'let g:netrw_win95ftp = '.g:netrw_win95ftp + let s:netrw_xfer_stop= line(".") + put ='' + put ='+ Netrw Messages' + put ='let g:netrw_use_errorwindow = '.g:netrw_use_errorwindow + + put = '' + put ='+ Netrw Browser Control' + put = 'let g:netrw_alto = '.g:netrw_alto + put = 'let g:netrw_altv = '.g:netrw_altv + put = 'let g:netrw_browse_split = '.g:netrw_browse_split + if exists("g:netrw_browsex_viewer") + put = 'let g:netrw_browsex_viewer = '.g:netrw_browsex_viewer + else + put = 'let g:netrw_browsex_viewer = (not defined)' + endif + put = 'let g:netrw_compress = '.g:netrw_compress + put = 'let g:netrw_cursorline = '.g:netrw_cursorline + let decompressline= line("$") + put ='let g:netrw_decompress...' + put = 'let g:netrw_dirhistmax = '.g:netrw_dirhistmax + put = 'let g:netrw_fastbrowse = '.g:netrw_fastbrowse + let fnameescline= line("$") + put = 'let g:netrw_fname_escape...' + put = 'let g:netrw_ftp_browse_reject = '.g:netrw_ftp_browse_reject + put = 'let g:netrw_ftp_list_cmd = '.g:netrw_ftp_list_cmd + put = 'let g:netrw_ftp_sizelist_cmd = '.g:netrw_ftp_sizelist_cmd + put = 'let g:netrw_ftp_timelist_cmd = '.g:netrw_ftp_timelist_cmd + let globescline= line("$") + put ='let g:netrw_glob_escape...' + put = 'let g:netrw_hide = '.g:netrw_hide + put = 'let g:netrw_keepdir = '.g:netrw_keepdir + put = 'let g:netrw_list_cmd = '.g:netrw_list_cmd + put = 'let g:netrw_list_hide = '.g:netrw_list_hide + put = 'let g:netrw_liststyle = '.g:netrw_liststyle + put = 'let g:netrw_localcopycmd = '.g:netrw_localcopycmd + put = 'let g:netrw_local_mkdir = '.g:netrw_local_mkdir + put = 'let g:netrw_localmovecmd = '.g:netrw_localmovecmd + put = 'let g:netrw_local_rmdir = '.g:netrw_local_rmdir + put = 'let g:netrw_maxfilenamelen = '.g:netrw_maxfilenamelen + put = 'let g:netrw_menu = '.g:netrw_menu + put = 'let g:netrw_mkdir_cmd = '.g:netrw_mkdir_cmd + put = 'let g:netrw_preview = '.g:netrw_preview + put = 'let g:netrw_rename_cmd = '.g:netrw_rename_cmd + put = 'let g:netrw_retmap = '.g:netrw_retmap + put = 'let g:netrw_rm_cmd = '.g:netrw_rm_cmd + put = 'let g:netrw_rmdir_cmd = '.g:netrw_rmdir_cmd + put = 'let g:netrw_rmf_cmd = '.g:netrw_rmf_cmd + put = 'let g:netrw_silent = '.g:netrw_silent + put = 'let g:netrw_sort_by = '.g:netrw_sort_by + put = 'let g:netrw_sort_direction = '.g:netrw_sort_direction + put = 'let g:netrw_sort_options = '.g:netrw_sort_options + put = 'let g:netrw_sort_sequence = '.g:netrw_sort_sequence + put = 'let g:netrw_special_syntax = '.g:netrw_special_syntax + put = 'let g:netrw_ssh_browse_reject = '.g:netrw_ssh_browse_reject + put = 'let g:netrw_scpport = '.g:netrw_scpport + put = 'let g:netrw_sshport = '.g:netrw_sshport + put = 'let g:netrw_timefmt = '.g:netrw_timefmt + let tmpfileescline= line("$") + put ='let g:netrw_tmpfile_escape...' + put = 'let g:netrw_use_noswf = '.g:netrw_use_noswf + put = 'let g:netrw_xstrlen = '.g:netrw_xstrlen + put = 'let g:netrw_winsize = '.g:netrw_winsize + + put ='' + put ='+ For help, place cursor on line and press ' + + 1d + silent %s/^+/"/e + res 99 + silent %s/= \([^0-9].*\)$/= '\1'/e + silent %s/= $/= ''/e + 1 + + call setline(decompressline,"let g:netrw_decompress = ".substitute(string(g:netrw_decompress),"^'\\(.*\\)'$",'\1','')) + call setline(fnameescline, "let g:netrw_fname_escape = '".escape(g:netrw_fname_escape,"'")."'") + call setline(globescline, "let g:netrw_glob_escape = '".escape(g:netrw_glob_escape,"'")."'") + call setline(tmpfileescline,"let g:netrw_tmpfile_escape = '".escape(g:netrw_tmpfile_escape,"'")."'") + + set nomod + + nmap :call NetrwSettingHelp() + nnoremap :call NetrwSettingHelp() + let tmpfile= tempname() + exe 'au BufWriteCmd Netrw\ Settings silent w! '.tmpfile.'|so '.tmpfile.'|call delete("'.tmpfile.'")|set nomod' +endfun + +" --------------------------------------------------------------------- +" NetrwSettingHelp: {{{2 +fun! NetrwSettingHelp() +" call Dfunc("NetrwSettingHelp()") + let curline = getline(".") + if curline =~ '=' + let varhelp = substitute(curline,'^\s*let ','','e') + let varhelp = substitute(varhelp,'\s*=.*$','','e') +" call Decho("trying help ".varhelp) + try + exe "he ".varhelp + catch /^Vim\%((\a\+)\)\=:E149/ + echo "***sorry*** no help available for <".varhelp.">" + endtry + elseif line(".") < s:netrw_settings_stop + he netrw-settings + elseif line(".") < s:netrw_protocol_stop + he netrw-externapp + elseif line(".") < s:netrw_xfer_stop + he netrw-variables + else + he netrw-browse-var + endif +" call Dret("NetrwSettingHelp") +endfun + +" --------------------------------------------------------------------- +" Modelines: {{{1 +" vim:ts=8 fdm=marker diff --git a/sources b/sources index 786a587f..10578951 100644 --- a/sources +++ b/sources @@ -1,3 +1,3 @@ -605cc7ae31bcc9d7864bb0bb6025f55d vim-7.1-extra.tar.gz -144aa049ba70621acf4247f0459f3ee7 vim-7.1-lang.tar.gz -44c6b4914f38d6f9aa959640b89da329 vim-7.1.tar.bz2 +35e04482f07c57221c9a751aaa3b8dac vim-7.2-extra.tar.gz +d8884786979e0e520c112faf2e176f05 vim-7.2-lang.tar.gz +556572edfda7a319541a3bc860c7fd36 vim-7.2.tar.bz2 diff --git a/tar.vim b/tar.vim new file mode 100644 index 00000000..af6fbca2 --- /dev/null +++ b/tar.vim @@ -0,0 +1,500 @@ +" tar.vim: Handles browsing tarfiles +" AUTOLOAD PORTION +" Date: Aug 08, 2008 +" Version: 23 + modifications by Bram +" Maintainer: Charles E Campbell, Jr +" License: Vim License (see vim's :help license) +" +" Contains many ideas from Michael Toren's +" +" Copyright: Copyright (C) 2005-2008 Charles E. Campbell, Jr. {{{1 +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" tar.vim and tarPlugin.vim are provided *as is* and comes +" with no warranty of any kind, either expressed or implied. +" By using this plugin, you agree that in no event will the +" copyright holder be liable for any damages resulting from +" the use of this software. + +" --------------------------------------------------------------------- +" Load Once: {{{1 +let s:keepcpo= &cpo +set cpo&vim +if &cp || exists("g:loaded_tar") || v:version < 700 + finish +endif +let g:loaded_tar= "v23b" +"call Decho("loading autoload/tar.vim") +if v:version < 701 || (v:version == 701 && !has("patch299")) + echoerr "(autoload/tar.vim) need vim v7.1 with patchlevel 299" +endif + +" --------------------------------------------------------------------- +" Default Settings: {{{1 +if !exists("g:tar_browseoptions") + let g:tar_browseoptions= "Ptf" +endif +if !exists("g:tar_readoptions") + let g:tar_readoptions= "OPxf" +endif +if !exists("g:tar_cmd") + let g:tar_cmd= "tar" +endif +if !exists("g:tar_writeoptions") + let g:tar_writeoptions= "uf" +endif + +if !exists("g:netrw_cygwin") + if has("win32") || has("win95") || has("win64") || has("win16") + if &shell =~ '\%(\\|\\)\%(\.exe\)\=$' + let g:netrw_cygwin= 1 + else + let g:netrw_cygwin= 0 + endif + else + let g:netrw_cygwin= 0 + endif +endif + +" set up shell quoting character +if !exists("g:tar_shq") + if exists("&shq") && &shq != "" + let g:tar_shq= &shq + elseif has("win32") || has("win95") || has("win64") || has("win16") + if exists("g:netrw_cygwin") && g:netrw_cygwin + let g:tar_shq= "'" + else + let g:tar_shq= '"' + endif + else + let g:tar_shq= "'" + endif +" call Decho("g:tar_shq<".g:tar_shq.">") +endif + +" ---------------- +" Functions: {{{1 +" ---------------- + +" --------------------------------------------------------------------- +" tar#Browse: {{{2 +fun! tar#Browse(tarfile) +" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)") + let repkeep= &report + set report=10 + + " sanity checks + if !executable(g:tar_cmd) + redraw! + echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' +" call inputsave()|call input("Press to continue")|call inputrestore() + let &report= repkeep +" call Dret("tar#Browse") + return + endif + if !filereadable(a:tarfile) +" call Decho('a:tarfile<'.a:tarfile.'> not filereadable') + if a:tarfile !~# '^\a\+://' + " if its an url, don't complain, let url-handlers such as vim do its thing + redraw! + echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + endif + let &report= repkeep +" call Dret("tar#Browse : file<".a:tarfile."> not readable") + return + endif + if &ma != 1 + set ma + endif + let w:tarfile= a:tarfile + + setlocal noswapfile + setlocal buftype=nofile + setlocal bufhidden=hide + setlocal nobuflisted + setlocal nowrap + set ft=tar + + " give header +" call Decho("printing header") + let lastline= line("$") + call setline(lastline+1,'" tar.vim version '.g:loaded_tar) + call setline(lastline+2,'" Browsing tarfile '.a:tarfile) + call setline(lastline+3,'" Select a file with cursor and press ENTER') + $put ='' + 0d + $ + + let tarfile= a:tarfile + if has("win32") && executable("cygpath") + " assuming cygwin + let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e') + endif + let curlast= line("$") + if tarfile =~# '\.\(gz\|tgz\)$' +" call Decho("1: exe silent r! gzip -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") + exe "silent r! gzip -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " + elseif tarfile =~# '\.lrp' +" call Decho("2: exe silent r! cat -- ".s:Escape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") + exe "silent r! cat -- ".s:Escape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " + elseif tarfile =~# '\.bz2$' +" call Decho("3: exe silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") + exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " + else + if tarfile =~ '^\s*-' + " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. + let tarfile = substitute(tarfile, '-', './-', '') + endif +" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile,1)) + exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile,1) + endif + if v:shell_error != 0 + redraw! + echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">" +" call inputsave()|call input("Press to continue")|call inputrestore() +" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") + return + endif + if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)') + redraw! + echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + silent %d + let eikeep= &ei + set ei=BufReadCmd,FileReadCmd + exe "r ".fnameescape(a:tarfile) + let &ei= eikeep + 1d +" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") + return + endif + + setlocal noma nomod ro + noremap :call TarBrowseSelect() + + let &report= repkeep +" call Dret("tar#Browse : w:tarfile<".w:tarfile.">") +endfun + +" --------------------------------------------------------------------- +" TarBrowseSelect: {{{2 +fun! s:TarBrowseSelect() +" call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">") + let repkeep= &report + set report=10 + let fname= getline(".") +" call Decho("fname<".fname.">") + + if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' + redraw! + echohl WarningMsg | echo '***error*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"; See :help tar-options' +" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') + return + endif + + " sanity check + if fname =~ '^"' + let &report= repkeep +" call Dret("TarBrowseSelect") + return + endif + + " about to make a new window, need to use w:tarfile + let tarfile= w:tarfile + let curfile= expand("%") + if has("win32") && executable("cygpath") + " assuming cygwin + let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e') + endif + + new + if !exists("g:tar_nomax") || g:tar_nomax == 0 + wincmd _ + endif + let s:tblfile_{winnr()}= curfile + call tar#Read("tarfile:".tarfile.'::'.fname,1) + filetype detect + + let &report= repkeep +" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") +endfun + +" --------------------------------------------------------------------- +" tar#Read: {{{2 +fun! tar#Read(fname,mode) +" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") + let repkeep= &report + set report=10 + let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') + let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') + if has("win32") && executable("cygpath") + " assuming cygwin + let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e') + endif +" call Decho("tarfile<".tarfile.">") +" call Decho("fname<".fname.">") + + if fname =~ '\.gz$' && executable("zcat") + let decmp= "|zcat" + let doro = 1 + elseif fname =~ '\.bz2$' && executable("bzcat") + let decmp= "|bzcat" + let doro = 1 + else + let decmp="" + let doro = 0 + if fname =~ '\.gz$\|\.bz2$\|\.Z$\|\.zip$' + setlocal bin + endif + endif + + if exists("g:tar_secure") + let tar_secure= " -- " + else + let tar_secure= " " + endif + if tarfile =~# '\.\(gz\|tgz\)$' +" call Decho("5: exe silent r! gzip -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.s:Escape(fname,1)) + exe "silent r! gzip -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp + elseif tarfile =~# '\.lrp$' +" call Decho("6: exe silent r! cat ".s:Escape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp) + exe "silent r! cat -- ".s:Escape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp + elseif tarfile =~# '\.bz2$' +" call Decho("7: exe silent r! bzip2 -d -c ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp) + exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp + else + if tarfile =~ '^\s*-' + " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. + let tarfile = substitute(tarfile, '-', './-', '') + endif +" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions." "s:Escape(tarfile,1).tar_secure..s:Escape(fname,1).decmp) + exe "silent r! ".g:tar_cmd." -".g:tar_readoptions." ".s:Escape(tarfile,1).tar_secure.s:Escape(fname,1).decmp + endif + + if doro + " because the reverse process of compressing changed files back into the tarball is not currently supported + setlocal ro + endif + + let w:tarfile= a:fname + exe "file tarfile::".fnameescape(fname) + + " cleanup + 0d + set nomod + + let &report= repkeep +" call Dret("tar#Read : w:tarfile<".w:tarfile.">") +endfun + +" --------------------------------------------------------------------- +" tar#Write: {{{2 +fun! tar#Write(fname) +" call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") + let repkeep= &report + set report=10 + + if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-' + redraw! + echohl WarningMsg | echo '***error*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"; See :help tar-options' +" call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"') + return + endif + + " sanity checks + if !executable(g:tar_cmd) + redraw! + echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' +" call inputsave()|call input("Press to continue")|call inputrestore() + let &report= repkeep +" call Dret("tar#Write") + return + endif + if !exists("*mkdir") + redraw! + echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + let &report= repkeep +" call Dret("tar#Write") + return + endif + + let curdir= getcwd() + let tmpdir= tempname() +" call Decho("orig tempname<".tmpdir.">") + if tmpdir =~ '\.' + let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') + endif +" call Decho("tmpdir<".tmpdir.">") + call mkdir(tmpdir,"p") + + " attempt to change to the indicated directory + try + exe "cd ".fnameescape(tmpdir) + catch /^Vim\%((\a\+)\)\=:E344/ + redraw! + echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + let &report= repkeep +" call Dret("tar#Write") + return + endtry +" call Decho("current directory now: ".getcwd()) + + " place temporary files under .../_ZIPVIM_/ + if isdirectory("_ZIPVIM_") + call s:Rmdir("_ZIPVIM_") + endif + call mkdir("_ZIPVIM_") + cd _ZIPVIM_ +" call Decho("current directory now: ".getcwd()) + + let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\)::.*$','\1','') + let fname = substitute(w:tarfile,'tarfile:.\{-}::\(.*\)$','\1','') + + " handle compressed archives + if tarfile =~# '\.gz' + call system("gzip -d -- ".s:Escape(tarfile,0)) + let tarfile = substitute(tarfile,'\.gz','','e') + let compress= "gzip -- ".s:Escape(tarfile,0) +" call Decho("compress<".compress.">") + elseif tarfile =~# '\.tgz' + call system("gzip -d -- ".s:Escape(tarfile,0)) + let tarfile = substitute(tarfile,'\.tgz','.tar','e') + let compress= "gzip -- ".s:Escape(tarfile,0) + let tgz = 1 +" call Decho("compress<".compress.">") + elseif tarfile =~# '\.bz2' + call system("bzip2 -d -- ".s:Escape(tarfile,0)) + let tarfile = substitute(tarfile,'\.bz2','','e') + let compress= "bzip2 -- ".s:Escape(tarfile,0) +" call Decho("compress<".compress.">") + endif +" call Decho("tarfile<".tarfile.">") + + if v:shell_error != 0 + redraw! + echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + else + +" call Decho("tarfile<".tarfile."> fname<".fname.">") + + if fname =~ '/' + let dirpath = substitute(fname,'/[^/]\+$','','e') + if executable("cygpath") + let dirpath = substitute(system("cygpath ".s:Escape(dirpath, 0)),'\n','','e') + endif + call mkdir(dirpath,"p") + endif + if tarfile !~ '/' + let tarfile= curdir.'/'.tarfile + endif + if tarfile =~ '^\s*-' + " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. + let tarfile = substitute(tarfile, '-', './-', '') + endif +" call Decho("tarfile<".tarfile."> fname<".fname.">") + + if exists("g:tar_secure") + let tar_secure= " -- " + else + let tar_secure= " " + endif + exe "w! ".fnameescape(fname) + if executable("cygpath") + let tarfile = substitute(system("cygpath ".s:Escape(tarfile,0)),'\n','','e') + endif + + " delete old file from tarfile +" call Decho("system(".g:tar_cmd." --delete -f ".s:Escape(tarfile,0)." -- ".s:Escape(fname,0).")") + call system(g:tar_cmd." --delete -f ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0)) + if v:shell_error != 0 + redraw! + echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + else + + " update tarfile with new file +" call Decho(g:tar_cmd." -".g:tar_writeoptions." ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0)) + call system(g:tar_cmd." -".g:tar_writeoptions." ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0)) + if v:shell_error != 0 + redraw! + echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + elseif exists("compress") +" call Decho("call system(".compress.")") + call system(compress) + if exists("tgz") +" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")") + call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e')) + endif + endif + endif + + " support writing tarfiles across a network + if s:tblfile_{winnr()} =~ '^\a\+://' +" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">") + let tblfile= s:tblfile_{winnr()} + 1split|enew + let binkeep= &binary + let eikeep = &ei + set binary ei=all + exe "e! ".fnameescape(tarfile) + call netrw#NetWrite(tblfile) + let &ei = eikeep + let &binary = binkeep + q! + unlet s:tblfile_{winnr()} + endif + endif + + " cleanup and restore current directory + cd .. + call s:Rmdir("_ZIPVIM_") + exe "cd ".fnameescape(curdir) + setlocal nomod + + let &report= repkeep +" call Dret("tar#Write") +endfun + +" --------------------------------------------------------------------- +" Rmdir: {{{2 +fun! s:Rmdir(fname) +" call Dfunc("Rmdir(fname<".a:fname.">)") + if has("unix") + call system("/bin/rm -rf -- ".s:Escape(a:fname,0)) + elseif has("win32") || has("win95") || has("win64") || has("win16") + if &shell =~? "sh$" + call system("/bin/rm -rf -- ".s:Escape(a:fname,0)) + else + call system("del /S ".s:Escape(a:fname,0)) + endif + endif +" call Dret("Rmdir") +endfun + +" --------------------------------------------------------------------- +" s:Escape: {{{2 +fun s:Escape(name,isfilt) + " shellescape() was added by patch 7.0.111 + if exists("*shellescape") + if a:isfilt + let qnameq= shellescape(a:name,1) + else + let qnameq= shellescape(a:name) + endif + else + let qnameq= g:tar_shq . a:name . g:tar_shq + endif + return qnameq +endfun + +" --------------------------------------------------------------------- +" Modelines And Restoration: {{{1 +let &cpo= s:keepcpo +unlet s:keepcpo +" vim:ts=8 fdm=marker diff --git a/vim-6.4-cvim.patch b/vim-6.4-cvim.patch deleted file mode 100644 index 046891e1..00000000 --- a/vim-6.4-cvim.patch +++ /dev/null @@ -1,100 +0,0 @@ ---- vim64/runtime/doc/tags.rhcvim 2005-10-15 16:00:26.000000000 +0200 -+++ vim64/runtime/doc/tags 2005-12-20 12:08:06.000000000 +0100 -@@ -4033,6 +4033,7 @@ - byte2line() eval.txt /*byte2line()* - bzip2 pi_gzip.txt /*bzip2* - c change.txt /*c* -+c-support csupport.txt /*c-support* - c-syntax syntax.txt /*c-syntax* - c.vim syntax.txt /*c.vim* - cW change.txt /*cW* -@@ -4278,6 +4279,41 @@ - csqf if_cscop.txt /*csqf* - cst if_cscop.txt /*cst* - csto if_cscop.txt /*csto* -+csupport csupport.txt /*csupport* -+csupport-comm csupport.txt /*csupport-comm* -+csupport-comm-1 csupport.txt /*csupport-comm-1* -+csupport-comm-2 csupport.txt /*csupport-comm-2* -+csupport-comm-3 csupport.txt /*csupport-comm-3* -+csupport-comm-4 csupport.txt /*csupport-comm-4* -+csupport-comm-5 csupport.txt /*csupport-comm-5* -+csupport-comm-6 csupport.txt /*csupport-comm-6* -+csupport-comm-7 csupport.txt /*csupport-comm-7* -+csupport-custom csupport.txt /*csupport-custom* -+csupport-custom-1 csupport.txt /*csupport-custom-1* -+csupport-custom-2 csupport.txt /*csupport-custom-2* -+csupport-dictionary csupport.txt /*csupport-dictionary* -+csupport-hotkeys csupport.txt /*csupport-hotkeys* -+csupport-idioms csupport.txt /*csupport-idioms* -+csupport-proto csupport.txt /*csupport-proto* -+csupport-release-notes csupport.txt /*csupport-release-notes* -+csupport-run csupport.txt /*csupport-run* -+csupport-run-1 csupport.txt /*csupport-run-1* -+csupport-run-2 csupport.txt /*csupport-run-2* -+csupport-run-3 csupport.txt /*csupport-run-3* -+csupport-run-4 csupport.txt /*csupport-run-4* -+csupport-run-5 csupport.txt /*csupport-run-5* -+csupport-run-6 csupport.txt /*csupport-run-6* -+csupport-run-7 csupport.txt /*csupport-run-7* -+csupport-run-8 csupport.txt /*csupport-run-8* -+csupport-snippets csupport.txt /*csupport-snippets* -+csupport-stat csupport.txt /*csupport-stat* -+csupport-taglist csupport.txt /*csupport-taglist* -+csupport-tempfiles csupport.txt /*csupport-tempfiles* -+csupport-tempfiles-1 csupport.txt /*csupport-tempfiles-1* -+csupport-tempfiles-2 csupport.txt /*csupport-tempfiles-2* -+csupport-usage-gvim csupport.txt /*csupport-usage-gvim* -+csupport-windows csupport.txt /*csupport-windows* -+csupport.txt csupport.txt /*csupport.txt* - csverb if_cscop.txt /*csverb* - ctags tagsrch.txt /*ctags* - ctags-gone version6.txt /*ctags-gone* -@@ -4857,7 +4893,6 @@ - hebrew.txt hebrew.txt /*hebrew.txt* - help various.txt /*help* - help-context help.txt /*help-context* --help-tags tags 1 - help-translated various.txt /*help-translated* - help-xterm-window various.txt /*help-xterm-window* - help.txt help.txt /*help.txt* ---- vim64/cvim/plugin/c.vim.rhcvim 2005-09-03 12:00:40.000000000 +0200 -+++ vim64/cvim/plugin/c.vim 2005-12-20 12:09:37.000000000 +0100 -@@ -48,7 +48,8 @@ - " - else - " -- let s:root_dir = $HOME.'/.vim/' -+" let s:root_dir = $HOME.'/.vim/' -+ let s:root_dir = $VIMRUNTIME.'/' - let s:escfilename = ' \%#[]' - " - endif -@@ -64,7 +65,7 @@ - " - " Modul global variables (with default values) which can be overridden. - " --let s:C_AuthorName = "" -+let s:C_AuthorName = "read README.csupport to learn how to set defaults" - let s:C_AuthorRef = "" - let s:C_Email = "" - let s:C_Company = "" -@@ -2465,12 +2466,12 @@ - " Automated header insertion - "------------------------------------------------------------------------------ - " --if has("autocmd") -- autocmd BufNewFile *.c,*.cc,*.cxx,*.c++,*.C,*.H,*.hh,*.hxx,*.hpp,*.moc,*.tcc,*.inl -- \ call C_CommentTemplates('cheader') -- autocmd BufNewFile *.hh,*.hxx,*.hpp -- \ call C_CommentTemplates('hheader') --endif " has("autocmd") -+" if has("autocmd") -+" autocmd BufNewFile *.c,*.cc,*.cxx,*.c++,*.C,*.H,*.hh,*.hxx,*.hpp,*.moc,*.tcc,*.inl -+" \ call C_CommentTemplates('cheader') -+" autocmd BufNewFile *.hh,*.hxx,*.hpp -+" \ call C_CommentTemplates('hheader') -+" endif " has("autocmd") - " - "===================================================================================== - " vim: set tabstop=2 shiftwidth=2: diff --git a/vim-7.0-vimspelltypo.patch b/vim-7.0-vimspelltypo.patch deleted file mode 100644 index 4e6595b3..00000000 --- a/vim-7.0-vimspelltypo.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- vim70/runtime/tools/vimspell.sh.typo 2006-09-28 16:48:52.000000000 +0200 -+++ vim70/runtime/tools/vimspell.sh 2006-09-28 16:49:29.000000000 +0200 -@@ -22,7 +22,7 @@ - # create a file in the safest way possible. - if test "$OUTFILE" = none; then - OUTFILE=$tmp/vimspell$$ -- [ -e $OUTFILE ] && { echo "Cannot use temporary file $OUTFILE, it already exists!; exit 1 ; } -+ [ -e $OUTFILE ] && { echo "Cannot use temporary file $OUTFILE, it already exists!"; exit 1 ; } - (umask 077; touch $OUTFILE) - fi - # Note the copy of vimspell cannot be deleted on exit since it is diff --git a/vim-7.1-ada.patch b/vim-7.1-ada.patch deleted file mode 100644 index c48d7ecc..00000000 --- a/vim-7.1-ada.patch +++ /dev/null @@ -1,7018 +0,0 @@ -diff -urN vim71/runtime/autoload/adacomplete.vim vim71_ada/runtime/autoload/adacomplete.vim ---- vim71/runtime/autoload/adacomplete.vim 2007-05-05 19:34:16.000000000 +0200 -+++ vim71_ada/runtime/autoload/adacomplete.vim 2008-01-16 16:46:40.000000000 +0100 -@@ -1,13 +1,13 @@ - "------------------------------------------------------------------------------ - " Description: Vim Ada omnicompletion file - " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ - " Maintainer: Martin Krischik --" $Author: karsten $ --" $Date: 2008/01/18 15:30:13 $ --" Version: 4.2 --" $Revision: 1.3 $ --" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ -+" $Author: karsten $ -+" $Date: 2008/01/18 15:30:13 $ -+" Version: 4.5 -+" $Revision: 1.3 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ - " History: 24.05.2006 MK Unified Headers - " 26.05.2006 MK improved search for begin of word. - " 16.07.2006 MK Ada-Mode as vim-ball -diff -urN vim71/runtime/autoload/ada.vim vim71_ada/runtime/autoload/ada.vim ---- vim71/runtime/autoload/ada.vim 2007-05-05 20:02:22.000000000 +0200 -+++ vim71_ada/runtime/autoload/ada.vim 2008-01-16 16:46:40.000000000 +0100 -@@ -1,14 +1,16 @@ - "------------------------------------------------------------------------------ - " Description: Perform Ada specific completion & tagging. - " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ --" Maintainer: Martin Krischik -+" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+" Maintainer: Martin Krischik -+" Taylor Venable - " Neil Bird --" $Author: karsten $ --" $Date: 2008/01/18 15:30:13 $ --" Version: 4.2 --" $Revision: 1.3 $ --" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/18 15:30:13 $ -+" Version: 4.5 -+" $Revision: 1.3 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ - " History: 24.05.2006 MK Unified Headers - " 26.05.2006 MK ' should not be in iskeyword. - " 16.07.2006 MK Ada-Mode as vim-ball -@@ -17,6 +19,10 @@ - " 05.11.2006 MK Bram suggested not to use include protection for - " autoload - " 05.11.2006 MK Bram suggested to save on spaces -+" 08.07.2007 TV fix mapleader problems. -+" 09.05.2007 MK Session just won't work no matter how much -+" tweaking is done -+" 19.09.2007 NO still some mapleader problems - " Help Page: ft-ada-functions - "------------------------------------------------------------------------------ - -@@ -425,7 +431,15 @@ - execute '!ctags --excmd=number ' . l:Filename - endfunction ada#Create_Tags - --function ada#Switch_Session (New_Session) "{{{1 -+" Section: ada#Switch_Session {{{1 -+" -+function ada#Switch_Session (New_Session) -+ " -+ " you should not save to much date into the seession since they will -+ " be sourced -+ " -+ set sessionoptions=buffers,curdir,folds,globals,resize,slash,tabpages,tabpages,unix,winpos,winsize -+ - if a:New_Session != v:this_session - " - " We actualy got a new session - otherwise there -@@ -437,18 +451,23 @@ - - let v:this_session = a:New_Session - -- if filereadable (v:this_session) -- execute 'source ' . v:this_session -- endif -+ "if filereadable (v:this_session) -+ "execute 'source ' . v:this_session -+ "endif - - augroup ada_session - autocmd! - autocmd VimLeavePre * execute 'mksession! ' . v:this_session - augroup END -+ " -+ "if exists ("g:Tlist_Auto_Open") && g:Tlist_Auto_Open -+ "TlistOpen -+ "endif -+ - endif - - return --endfunction ada#Switch_Session "}}}1 -+endfunction ada#Switch_Session - - " Section: GNAT Pretty Printer folding {{{1 - " -@@ -546,18 +565,23 @@ - \ a:Keys . - \" :" . a:Command . "" - else -+ if exists("g:mapleader") -+ let l:leader = g:mapleader -+ else -+ let l:leader = '\' -+ endif - execute - \ "50amenu " . - \ "Ada." . escape(a:Text, ' ') . -- \ "" . escape(g:mapleader . "a" . a:Keys , '\') . -+ \ "" . escape(l:leader . "a" . a:Keys , '\') . - \ " :" . a:Command . "" - execute - \ "nnoremap " . -- \ escape(g:mapleader . "a" . a:Keys , '\') . -+ \ escape(l:leader . "a" . a:Keys , '\') . - \" :" . a:Command - execute - \ "inoremap " . -- \ escape(g:mapleader . "a" . a:Keys , '\') . -+ \ escape(l:leader . "a" . a:Keys , '\') . - \" :" . a:Command - endif - return -@@ -566,10 +590,15 @@ - " Section: ada#Map_Popup {{{2 - " - function ada#Map_Popup (Text, Keys, Command) -+ if exists("g:mapleader") -+ let l:leader = g:mapleader -+ else -+ let l:leader = '\' -+ endif - execute - \ "50amenu " . - \ "PopUp." . escape(a:Text, ' ') . -- \ "" . escape(g:mapleader . "a" . a:Keys , '\') . -+ \ "" . escape(l:leader . "a" . a:Keys , '\') . - \ " :" . a:Command . "" - - call ada#Map_Menu (a:Text, a:Keys, a:Command) -diff -urN vim71/runtime/autoload/decada.vim vim71_ada/runtime/autoload/decada.vim ---- vim71/runtime/autoload/decada.vim 2007-05-05 19:25:32.000000000 +0200 -+++ vim71_ada/runtime/autoload/decada.vim 2008-01-16 16:46:41.000000000 +0100 -@@ -1,14 +1,14 @@ - "------------------------------------------------------------------------------ - " Description: Vim Ada/Dec Ada compiler file - " Language: Ada (Dec Ada) --" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ - " Copyright: Copyright (C) 2006 Martin Krischik --" Maintainer: Martin Krischik --" $Author: karsten $ --" $Date: 2008/01/18 15:30:13 $ --" Version: 4.2 --" $Revision: 1.3 $ --" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/18 15:30:13 $ -+" Version: 4.5 -+" $Revision: 1.3 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ - " History: 21.07.2006 MK New Dec Ada - " 15.10.2006 MK Bram's suggestion for runtime integration - " 05.11.2006 MK Bram suggested not to use include protection for -@@ -45,7 +45,7 @@ - call ada#Switch_Session (a:1) - elseif argc() == 0 && strlen (v:servername) > 0 - call ada#Switch_Session ( -- \ expand('~')[0:-2] . ".vimfiles.session]" . -+ \ expand('~')[0:-2] . ".vimfiles.session]decada_" . - \ v:servername . ".vim") - endif - return -diff -urN vim71/runtime/autoload/gnat.vim vim71_ada/runtime/autoload/gnat.vim ---- vim71/runtime/autoload/gnat.vim 2007-05-05 20:18:20.000000000 +0200 -+++ vim71_ada/runtime/autoload/gnat.vim 2008-01-16 16:46:46.000000000 +0100 -@@ -1,14 +1,15 @@ - "------------------------------------------------------------------------------ - " Description: Vim Ada/GNAT compiler file - " Language: Ada (GNAT) --" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ - " Copyright: Copyright (C) 2006 Martin Krischik --" Maintainer: Martin Krischik --" $Author: karsten $ --" $Date: 2008/01/18 15:30:13 $ --" Version: 4.2 --" $Revision: 1.3 $ --" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ -+" Maintainer: Martin Krischi k -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/18 15:30:13 $ -+" Version: 4.5 -+" $Revision: 1.3 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ - " History: 24.05.2006 MK Unified Headers - " 16.07.2006 MK Ada-Mode as vim-ball - " 05.08.2006 MK Add session support -@@ -16,6 +17,7 @@ - " 05.11.2006 MK Bram suggested not to use include protection for - " autoload - " 05.11.2006 MK Bram suggested to save on spaces -+" 19.09.2007 NO use project file only when there is a project - " Help Page: compiler-gnat - "------------------------------------------------------------------------------ - -@@ -71,13 +73,19 @@ - execute 'mksession! ' . v:this_session - endif - -- if strlen (self.Project_File) > 0 -- call ada#Switch_Session ( -- \ expand('~') . "/vimfiles/session/" . -- \ fnamemodify (self.Project_File, ":t:r") . ".vim") -- else -- call ada#Switch_Session ('') -- endif -+ "if strlen (self.Project_File) > 0 -+ "if has("vms") -+ "call ada#Switch_Session ( -+ "\ expand('~')[0:-2] . ".vimfiles.session]gnat_" . -+ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") -+ "else -+ "call ada#Switch_Session ( -+ "\ expand('~') . "/vimfiles/session/gnat_" . -+ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") -+ "endif -+ "else -+ "call ada#Switch_Session ('') -+ "endif - - return - endfunction gnat#Set_Project_File " }}}1 -diff -urN vim71/runtime/compiler/decada.vim vim71_ada/runtime/compiler/decada.vim ---- vim71/runtime/compiler/decada.vim 2007-05-05 20:09:54.000000000 +0200 -+++ vim71_ada/runtime/compiler/decada.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -1,16 +1,17 @@ - "------------------------------------------------------------------------------ - " Description: Vim Ada/Dec Ada compiler file - " Language: Ada (Dec Ada) --" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ - " Copyright: Copyright (C) 2006 Martin Krischik --" Maintainer: Martin Krischik --" $Author: karsten $ --" $Date: 2008/01/18 15:30:13 $ --" Version: 4.2 --" $Revision: 1.3 $ --" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ -+" Maintainer: Martin Krischik -+" $Author: karsten $ -+" $Date: 2008/01/18 15:30:13 $ -+" Version: 4.5 -+" $Revision: 1.3 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ - " History: 21.07.2006 MK New Dec Ada - " 15.10.2006 MK Bram's suggestion for runtime integration -+" 08.09.2006 MK Correct double load protection. - " Help Page: compiler-decada - "------------------------------------------------------------------------------ - -@@ -24,6 +25,13 @@ - - if !exists("g:decada") - let g:decada = decada#New () -+ -+ call ada#Map_Menu ( -+ \'Dec Ada.Build', -+ \'', -+ \'call decada.Make ()') -+ -+ call g:decada.Set_Session () - endif - - if exists(":CompilerSet") != 2 -@@ -33,16 +41,9 @@ - command -nargs=* CompilerSet setlocal - endif - --call g:decada.Set_Session () -- - execute "CompilerSet makeprg=" . escape (g:decada.Make_Command, ' ') - execute "CompilerSet errorformat=" . escape (g:decada.Error_Format, ' ') - --call ada#Map_Menu ( -- \'Dec Ada.Build', -- \'', -- \'call decada.Make ()') -- - finish " 1}}} - - "------------------------------------------------------------------------------ -diff -urN vim71/runtime/compiler/gnat.vim vim71_ada/runtime/compiler/gnat.vim ---- vim71/runtime/compiler/gnat.vim 2007-05-05 20:04:19.000000000 +0200 -+++ vim71_ada/runtime/compiler/gnat.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -1,17 +1,19 @@ - "------------------------------------------------------------------------------ - " Description: Vim Ada/GNAT compiler file - " Language: Ada (GNAT) --" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ - " Copyright: Copyright (C) 2006 Martin Krischik --" Maintainer: Martin Krischik --" $Author: karsten $ --" $Date: 2008/01/18 15:30:13 $ --" Version: 4.2 --" $Revision: 1.3 $ --" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ -+" Maintainer: Martin Krischi k -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/18 15:30:13 $ -+" Version: 4.5 -+" $Revision: 1.3 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ - " History: 24.05.2006 MK Unified Headers - " 16.07.2006 MK Ada-Mode as vim-ball - " 15.10.2006 MK Bram's suggestion for runtime integration -+" 19.09.2007 NO use project file only when there is a project - " Help Page: compiler-gnat - "------------------------------------------------------------------------------ - -@@ -46,6 +48,8 @@ - \ 'GNAT.Set Projectfile\.\.\.', - \ ':SetProject', - \ 'call gnat.Set_Project_File ()') -+ -+ call g:gnat.Set_Session () - endif - - if exists(":CompilerSet") != 2 -@@ -55,8 +59,6 @@ - command -nargs=* CompilerSet setlocal - endif - --call g:gnat.Set_Session () -- - execute "CompilerSet makeprg=" . escape (g:gnat.Get_Command('Make'), ' ') - execute "CompilerSet errorformat=" . escape (g:gnat.Error_Format, ' ') - -diff -urN vim71/runtime/doc/ft_ada.txt vim71_ada/runtime/doc/ft_ada.txt ---- vim71/runtime/doc/ft_ada.txt 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/runtime/doc/ft_ada.txt 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,516 @@ -+*ft_ada.txt* Ada File type Plug-ins Last change: 2007 Seb 17 -+ -+ -+ ADA FILE TYPE PLUG-INS REFERENCE MANUAL~ -+ -+ADA *ada.vim* -+ -+1. Syntax Highlighting |ft-ada-syntax| -+2. Plug-in |ft-ada-plugin| -+3. Omni Completion |ft-ada-omni| -+ 3.1 Omni Completion with "gnat xref" |gnat-xref| -+ 3.2 Omni Completion with "ctags" |ada-ctags| -+4. Compiler Support |ada-compiler| -+ 4.1 GNAT |compiler-gnat| -+ 4.1 Dec Ada |compiler-decada| -+5. References |ada-reference| -+ 5.1 Options |ft-ada-options| -+ 5.2 Functions |ft-ada-functions| -+ 5.3 Commands |ft-ada-commands| -+ 5.4 Variables |ft-ada-variables| -+ 5.5 Constants |ft-ada-contstants| -+8. Extra Plug-ins |ada-extra-plugins| -+ -+============================================================================== -+1. Syntax Highlighting ~ -+ *ft-ada-syntax* -+ -+This mode is designed for the 2005 edition of Ada ("Ada 2005"), which includes -+support for objected-programming, protected types, and so on. It handles code -+written for the original Ada language ("Ada83", "Ada87", "Ada95") as well, -+though code which uses Ada 2005-only keywords will be wrongly colored (such -+code should be fixed anyway). For more information about Ada, see -+http://www.adapower.com. -+ -+The Ada mode handles a number of situations cleanly. -+ -+For example, it knows that the "-" in "-5" is a number, but the same character -+in "A-5" is an operator. Normally, a "with" or "use" clause referencing -+another compilation unit is coloured the same way as C's "#include" is coloured. -+If you have "Conditional" or "Repeat" groups coloured differently, then "end -+if" and "end loop" will be coloured as part of those respective groups. -+ -+You can set these to different colours using vim's "highlight" command (e.g., -+to change how loops are displayed, enter the command ":hi Repeat" followed by -+the colour specification; on simple terminals the colour specification -+ctermfg=White often shows well). -+ -+There are several options you can select in this Ada mode. See|ft-ada-options| -+for a complete list. -+ -+To enable them, assign a value to the option. For example, to turn one on: -+ > -+ > let g:ada_standard_types = 1 -+> -+To disable them use ":unlet". Example: -+> -+ > unlet g:ada_standard_types -+ -+You can just use ":" and type these into the command line to set these -+temporarily before loading an Ada file. You can make these option settings -+permanent by adding the "let" command(s), without a colon, to your "~/.vimrc" -+file. -+ -+Even on a slow (90Mhz) PC this mode works quickly, but if you find the -+performance unacceptable, turn on |g:ada_withuse_ordinary|. -+ -+Syntax folding instructions (|fold-syntax|) are added when |g:ada_folding| is -+set. -+ -+============================================================================== -+2. File type Plug-in ~ -+ *ft-ada-indent* *ft-ada-plugin* -+ -+The Ada plug-in provides support for: -+ -+ - auto indenting (|indent.txt|) -+ - insert completion (|i_CTRL-N|) -+ - user completion (|i_CTRL-X_CTRL-U|) -+ - tag searches (|tagsrch.txt|) -+ - Quick Fix (|quickfix.txt|) -+ - backspace handling (|'backspace'|) -+ - comment handling (|'comments'|, |'commentstring'|) -+ -+The plug-in only activates the features of the Ada mode whenever an Ada -+files is opened and add adds Ada related entries to the main and pop-up menu. -+ -+============================================================================== -+3. Omni Completion ~ -+ *ft-ada-omni* -+ -+The Ada omni-completions (|i_CTRL-X_CTRL-O|) uses tags database created either -+by "gnat xref -v" or the "exuberant Ctags (http://ctags.sourceforge.net). The -+complete function will automatically detect which tool was used to create the -+tags file. -+ -+------------------------------------------------------------------------------ -+3.1 Omni Completion with "gnat xref" ~ -+ *gnat-xref* -+ -+GNAT XREF uses the compiler internal information (ali-files) to produce the -+tags file. This has the advantage to be 100% correct and the option of deep -+nested analysis. However the code must compile, the generator is quite -+slow and the created tags file contains only the basic Ctags information for -+each entry - not enough for some of the more advanced Vim code browser -+plug-ins. -+ -+NOTE: "gnat xref -v" is very tricky to use as it has almost no diagnostic -+ output - If nothing is printed then usually the parameters are wrong. -+ Here some important tips: -+ -+1) You need to compile your code first and use the "-aO" option to point to -+ your .ali files. -+2) "gnat xref -v ../Include/adacl.ads" won't work - use the "gnat xref -v -+ -aI../Include adacl.ads" instead. -+3) "gnat xref -v -aI../Include *.ad?" won't work - use "cd ../Include" and -+ then "gnat xref -v *.ad?" -+4) Project manager support is completely broken - don't even try "gnat xref -+ -Padacl.gpr". -+5) VIM is faster when the tags file is sorted - use "sort --unique -+ --ignore-case --output=tags tags" . -+6) Remember to insert "!_TAG_FILE_SORTED 2 %sort ui" as first line to mark -+ the file assorted. -+ -+------------------------------------------------------------------------------ -+3.2 Omni Completion with "ctags"~ -+ *ada-ctags* -+ -+Exuberant Ctags uses it's own multi-language code parser. The parser is quite -+fast, produces a lot of extra informations (hence the name "Exuberant Ctags") -+and can run on files which currently do not compile. -+ -+There are also lots of other Vim-tools which use exuberant Ctags. -+ -+You will need to install a version of the Exuberant Ctags which has Ada -+support patched in. Such a version is available from the GNU Ada Project -+(http://gnuada.sourceforge.net). -+ -+The Ada parser for Exuberant Ctags is fairly new - don't expect complete -+support yet. -+ -+============================================================================== -+4. Compiler Support ~ -+ *ada-compiler* -+ -+The Ada mode supports more then one Ada compiler and will automatically load the -+compiler set in|g:ada_default_compiler|whenever an Ada source is opened. The -+provided compiler plug-ins are split into the actual compiler plug-in and a -+collection of support functions and variables. This allows the easy -+development of specialized compiler plug-ins fine tuned to your development -+environment. -+ -+------------------------------------------------------------------------------ -+4.1 GNAT ~ -+ *compiler-gnat* -+ -+GNAT is the only free (beer and speech) Ada compiler available. There are -+several version available which differentiate in the licence terms used. -+ -+The GNAT compiler plug-in will perform a compile on pressing and then -+immediately shows the result. You can set the project file to be used by -+setting: -+ > -+ > call g:gnat.Set_Project_File ('my_project.gpr') -+ -+Setting a project file will also create a Vim session (|views-sessions|) so - -+like with the GPS - opened files, window positions etc. will remembered -+separately for all projects. -+ -+ *gnat_members* -+GNAT OBJECT ~ -+ -+ *g:gnat.Make()* -+g:gnat.Make() -+ Calls|g:gnat.Make_Command|and displays the result inside a -+ |quickfix| window. -+ -+ *g:gnat.Pretty()* -+g:gnat.Pretty() -+ Calls|g:gnat.Pretty_Command| -+ -+ *g:gnat.Find()* -+g:gnat.Find() -+ Calls|g:gnat.Find_Command| -+ -+ *g:gnat.Tags()* -+g:gnat.Tags() -+ Calls|g:gnat.Tags_Command| -+ -+ *g:gnat.Set_Project_File()* -+g:gnat.Set_Project_File([{file}]) -+ Set gnat project file and load associated session. An open -+ project will be closed and the session written. If called -+ without file name the file selector opens for selection of a -+ project file. If called with an empty string then the project -+ and associated session are closed. -+ -+ *g:gnat.Project_File* -+g:gnat.Project_File string -+ Current project file. -+ -+ *g:gnat.Make_Command* -+g:gnat.Make_Command string -+ External command used for|g:gnat.Make()| (|'makeprg'|). -+ -+ *g:gnat.Pretty_Program* -+g:gnat.Pretty_Program string -+ External command used for|g:gnat.Pretty()| -+ -+ *g:gnat.Find_Program* -+g:gnat.Find_Program string -+ External command used for|g:gnat.Find()| -+ -+ *g:gnat.Tags_Command* -+g:gnat.Tags_Command string -+ External command used for|g:gnat.Tags()| -+ -+ *g:gnat.Error_Format* -+g:gnat.Error_Format string -+ Error format (|'errorformat'|) -+ -+------------------------------------------------------------------------------ -+4.2 Dec Ada ~ -+ *compiler-hpada* *compiler-decada* -+ *compiler-vaxada* *compiler-compaqada* -+ -+Dec Ada (also known by - in chronological order - VAX Ada, Dec Ada, Compaq Ada -+and HP Ada) is a fairly dated Ada 83 compiler. Support is basic: will -+compile the current unit. -+ -+The Dec Ada compiler expects the package name and not the file name to be -+passed a parameter. The compiler plug-in supports the usual file name -+convention to convert the file into a unit name. For separates both '-' and -+'__' are allowed. -+ -+ *decada_members* -+DEC ADA OBJECT ~ -+ -+ *g:decada.Make()* -+g:decada.Make() function -+ Calls|g:decada.Make_Command|and displays the result inside a -+ |quickfix| window. -+ -+ *g:decada.Unit_Name()* -+g:decada.Unit_Name() function -+ Get the Unit name for the current file. -+ -+ *g:decada.Make_Command* -+g:decada.Make_Command string -+ External command used for|g:decadat.Make()| (|'makeprg'|). -+ -+ *g:decada.Error_Format* -+g:decada.Error_Format| string -+ Error format (|'errorformat'|). -+ -+============================================================================== -+5. References ~ -+ *ada-reference* -+ -+------------------------------------------------------------------------------ -+5.1 Options ~ -+ *ft-ada-options* -+ -+ *g:ada_standard_types* -+g:ada_standard_types bool (true when exists) -+ Highlight types in package Standard (e.g., "Float") -+ -+ *g:ada_space_errors* -+ *g:ada_no_trail_space_error* -+ *g:ada_no_tab_space_error* -+ *g:ada_all_tab_usage* -+g:ada_space_errors bool (true when exists) -+ Highlight extraneous errors in spaces ... -+ g:ada_no_trail_space_error -+ - but ignore trailing spaces at the end of a line -+ g:ada_no_tab_space_error -+ - but ignore tabs after spaces -+ g:ada_all_tab_usage -+ - highlight all tab use -+ -+ *g:ada_line_errors* -+g:ada_line_errors bool (true when exists) -+ Highlight lines which are to long. Note: This highlighting -+ option is quite CPU intensive. -+ -+ *g:ada_rainbow_color* -+g:ada_rainbow_color bool (true when exists) -+ Use rainbow colours for '(' and ')'. You need the -+ rainbow_parenthesis for this to work -+ -+ *g:ada_folding* -+g:ada_folding set ('sigpft') -+ Use folding for Ada sources. -+ 's': activate syntax folding on load -+ 'p': fold packages -+ 'f': fold functions and procedures -+ 't': fold types -+ 'c': fold conditionals -+ 'g': activate gnat pretty print folding on load -+ 'i': lone 'is' folded with line above -+ 'b': lone 'begin' folded with line above -+ 'p': lone 'private' folded with line above -+ 'x': lone 'exception' folded with line above -+ 'i': activate indent folding on load -+ -+ Note: Syntax folding is in an early (unuseable) stage and -+ indent or gnat pretty folding is suggested. -+ -+ For gnat pretty folding to work the following settings are -+ suggested: -cl3 -M79 -c2 -c3 -c4 -A1 -A2 -A3 -A4 -A5 -+ -+ For indent folding to work the following settings are -+ suggested: shiftwidth=3 softtabstop=3 -+ -+ *g:ada_abbrev* -+g:ada_abbrev bool (true when exists) -+ Add some abbreviations. This feature more or less superseded -+ by the various completion methods. -+ -+ *g:ada_withuse_ordinary* -+g:ada_withuse_ordinary bool (true when exists) -+ Show "with" and "use" as ordinary keywords (when used to -+ reference other compilation units they're normally highlighted -+ specially). -+ -+ *g:ada_begin_preproc* -+g:ada_begin_preproc bool (true when exists) -+ Show all begin-like keywords using the colouring of C -+ preprocessor commands. -+ -+ *g:ada_omni_with_keywords* -+g:ada_omni_with_keywords -+ Add Keywords, Pragmas, Attributes to omni-completions -+ (|compl-omni|). Note: You can always complete then with user -+ completion (|i_CTRL-X_CTRL-U|). -+ -+ *g:ada_extended_tagging* -+g:ada_extended_tagging enum ('jump', 'list') -+ use extended tagging, two options are available -+ 'jump': use tjump to jump. -+ 'list': add tags quick fix list. -+ Normal tagging does not support function or operator -+ overloading as these features are not available in C and -+ tagging was originally developed for C. -+ -+ *g:ada_extended_completion* -+g:ada_extended_completion -+ Uses extended completion for and completions -+ (|i_CTRL-N|). In this mode the '.' is used as part of the -+ identifier so that 'Object.Method' or 'Package.Procedure' are -+ completed together. -+ -+ *g:ada_gnat_extensions* -+g:ada_gnat_extensions bool (true when exists) -+ Support GNAT extensions. -+ -+ *g:ada_with_gnat_project_files* -+g:ada_with_gnat_project_files bool (true when exists) -+ Add gnat project file keywords and Attributes. -+ -+ *g:ada_default_compiler* -+g:ada_default_compiler string -+ set default compiler. Currently supported is 'gnat' and -+ 'decada'. -+ -+An "exists" type is a boolean is considered true when the variable is defined -+and false when the variable is undefined. The value which the variable is -+set makes no difference. -+ -+------------------------------------------------------------------------------ -+5.3 Commands ~ -+ *ft-ada-commands* -+ -+:AdaRainbow *:AdaRainbow* -+ Toggles rainbow colour (|g:ada_rainbow_color|) mode for -+ '(' and ')' -+ -+:AdaLines *:AdaLines* -+ Toggles line error (|g:ada_line_errors|) display -+ -+:AdaSpaces *:AdaSpaces* -+ Toggles space error (|g:ada_space_errors|) display. -+ -+:AdaTagDir *:AdaTagDir* -+ Creates tags file for the directory of the current file. -+ -+:AdaTagFile *:AdaTagFile* -+ Creates tags file for the current file. -+ -+:AdaTypes *:AdaTypes* -+ Toggles standard types (|g:ada_standard_types|) colour. -+ -+:GnatFind *:GnatFind* -+ Calls |g:gnat.Find()| -+ -+:GnatPretty *:GnatPretty* -+ Calls |g:gnat.Pretty()| -+ -+:GnatTags *:GnatTags* -+ Calls |g:gnat.Tags()| -+ -+------------------------------------------------------------------------------ -+5.3 Variables ~ -+ *ft-ada-variables* -+ -+ *g:gnat* -+g:gnat object -+ Control object which manages GNAT compiles. The object -+ is created when the first Ada source code is loaded provided -+ that |g:ada_default_compiler|is set to 'gnat'. See|gnat_members| -+ for details. -+ -+ *g:decada* -+g:decada object -+ Control object which manages Dec Ada compiles. The object -+ is created when the first Ada source code is loaded provided -+ that |g:ada_default_compiler|is set to 'decada'. See -+ |decada_members|for details. -+ -+------------------------------------------------------------------------------ -+5.4 Constants ~ -+ *ft-ada-constants* -+ ft-ada-constants -+ -+All constants are locked. See |:lockvar| for details. -+ -+ *g:ada#WordRegex* -+g:ada#WordRegex string -+ Regular expression to search for Ada words -+ -+ *g:ada#DotWordRegex* -+g:ada#DotWordRegex string -+ Regular expression to search for Ada words separated by dots. -+ -+ *g:ada#Comment* -+g:ada#Comment string -+ Regular expression to search for Ada comments -+ -+ *g:ada#Keywords* -+g:ada#Keywords list of dictionaries -+ List of keywords, attributes etc. pp. in the format used by -+ omni completion. See |complete-items| for details. -+ -+ *g:ada#Ctags_Kinds* -+g:ada#Ctags_Kinds dictionary of lists -+ Dictionary of the various kinds of items which the Ada support -+ for Ctags generates. -+ -+------------------------------------------------------------------------------ -+5.2 Functions ~ -+ *ft-ada-functions* -+ -+ada#Word([{line}, {col}]) *ada#Word()* -+ Return full name of Ada entity under the cursor (or at given -+ line/column), stripping white space/newlines as necessary. -+ -+ada#List_Tag([{line}, {col}]) *ada#Listtags()* -+ List all occurrences of the Ada entity under the cursor (or at -+ given line/column) inside the quick-fix window -+ -+ada#Jump_Tag ({ident}, {mode}) *ada#Jump_Tag()* -+ List all occurrences of the Ada entity under the cursor (or at -+ given line/column) in the tag jump list. Mode can either be -+ 'tjump' or 'stjump'. -+ -+ada#Create_Tags ({option}) *ada#Create_Tags()* -+ Creates tag file using Ctags. The option can either be 'file' -+ for the current file, 'dir' for the directory of the current -+ file or a file name. -+ -+gnat#Insert_Tags_Header() *gnat#Insert_Tags_Header()* -+ Adds the tag file header (!_TAG_) information to the current -+ file which are missing from the GNAT XREF output. -+ -+ada#Switch_Syntax_Option ({option}) *ada#Switch_Syntax_Option()* -+ Toggles highlighting options on or off. Used for the Ada menu. -+ -+ *gnat#New()* -+gnat#New () -+ Create a new gnat object. See |g:gnat| for details. -+ -+ -+============================================================================== -+8. Extra Plugins ~ -+ *ada-extra-plugins* -+ -+You can optionally install the following extra plug-in. They work well with Ada -+and enhance the ability of the Ada mode.: -+ -+backup.vim -+ http://www.vim.org/scripts/script.php?script_id=1537 -+ Keeps as many backups as you like so you don't have to. -+ -+rainbow_parenthsis.vim -+ http://www.vim.org/scripts/script.php?script_id=1561 -+ Very helpful since Ada uses only '(' and ')'. -+ -+nerd_comments.vim -+ http://www.vim.org/scripts/script.php?script_id=1218 -+ Excellent commenting and uncommenting support for almost any -+ programming language. -+ -+matchit.vim -+ http://www.vim.org/scripts/script.php?script_id=39 -+ '%' jumping for any language. The normal '%' jump only works for '{}' -+ style languages. The Ada mode will set the needed search patters. -+ -+taglist.vim -+ http://www.vim.org/scripts/script.php?script_id=273 -+ Source code explorer sidebar. There is a patch for Ada available. -+ -+The GNU Ada Project distribution (http://gnuada.sourceforge.net) of Vim -+contains all of the above. -+ -+============================================================================== -+vim: textwidth=78 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+vim: filetype=help -diff -urN vim71/runtime/ftplugin/ada.vim vim71_ada/runtime/ftplugin/ada.vim ---- vim71/runtime/ftplugin/ada.vim 2007-05-05 19:17:45.000000000 +0200 -+++ vim71_ada/runtime/ftplugin/ada.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -1,14 +1,15 @@ - "------------------------------------------------------------------------------ - " Description: Perform Ada specific completion & tagging. - " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ --" Maintainer: Martin Krischik -+" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+" Maintainer: Martin Krischik -+" Taylor Venable - " Neil Bird --" $Author: karsten $ --" $Date: 2008/01/18 15:30:13 $ --" Version: 4.2 --" $Revision: 1.3 $ --" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ -+" $Author: karsten $ -+" $Date: 2008/01/18 15:30:13 $ -+" Version: 4.5 -+" $Revision: 1.3 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ - " History: 24.05.2006 MK Unified Headers - " 26.05.2006 MK ' should not be in iskeyword. - " 16.07.2006 MK Ada-Mode as vim-ball -@@ -17,6 +18,7 @@ - " 05.11.2006 MK Bram suggested not to use include protection for - " autoload - " 05.11.2006 MK Bram suggested to save on spaces -+" 08.07.2007 TV fix default compiler problems. - " Help Page: ft-ada-plugin - "------------------------------------------------------------------------------ - " Provides mapping overrides for tag jumping that figure out the current -@@ -30,7 +32,7 @@ - endif - - " Don't load another plugin for this buffer --let b:did_ftplugin = 38 -+let b:did_ftplugin = 45 - - " - " Temporarily set cpoptions to ensure the script loads OK -@@ -104,8 +106,17 @@ - \ s:notend . '\:\\s\+\' - endif - -+ - " Section: Compiler {{{1 - " -+if ! exists("g:ada_default_compiler") -+ if has("vms") -+ let g:ada_default_compiler = 'decada' -+ else -+ let g:ada_default_compiler = 'gnat' -+ endif -+endif -+ - if ! exists("current_compiler") || - \ current_compiler != g:ada_default_compiler - execute "compiler " . g:ada_default_compiler -diff -urN vim71/runtime/indent/ada.vim vim71_ada/runtime/indent/ada.vim ---- vim71/runtime/indent/ada.vim 2007-05-05 19:25:37.000000000 +0200 -+++ vim71_ada/runtime/indent/ada.vim 2008-01-16 16:37:02.000000000 +0100 -@@ -1,19 +1,21 @@ - "------------------------------------------------------------------------------ - " Description: Vim Ada indent file - " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ - " Copyright: Copyright (C) 2006 Martin Krischik --" Maintainer: Martin Krischik -+" Maintainer: Martin Krischik - " Neil Bird --" $Author: karsten $ --" $Date: 2008/01/18 15:30:13 $ --" Version: 4.2 --" $Revision: 1.3 $ --" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ -+" Ned Okie -+" $Author: karsten $ -+" $Date: 2008/01/18 15:30:13 $ -+" Version: 4.5 -+" $Revision: 1.3 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ - " History: 24.05.2006 MK Unified Headers - " 16.07.2006 MK Ada-Mode as vim-ball - " 15.10.2006 MK Bram's suggestion for runtime integration - " 05.11.2006 MK Bram suggested to save on spaces -+" 19.09.2007 NO g: missing before ada#Comment - " Help Page: ft-vim-indent - "------------------------------------------------------------------------------ - " ToDo: -@@ -27,7 +29,7 @@ - finish - endif - --let b:did_indent = 1 -+let b:did_indent = 45 - - setlocal indentexpr=GetAdaIndent() - setlocal indentkeys-=0{,0} -@@ -58,7 +60,7 @@ - " Seems to work OK as it 'starts' with the indent of the /previous/ line. - function s:MainBlockIndent (prev_indent, prev_lnum, blockstart, stop_at) - let lnum = a:prev_lnum -- let line = substitute( getline(lnum), ada#Comment, '', '' ) -+ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) - while lnum > 1 - if a:stop_at != '' && line =~ '^\s*' . a:stop_at && indent(lnum) < a:prev_indent - return a:prev_indent -@@ -72,7 +74,7 @@ - let lnum = prevnonblank(lnum - 1) - " Get previous non-blank/non-comment-only line - while 1 -- let line = substitute( getline(lnum), ada#Comment, '', '' ) -+ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) - if line !~ '^\s*$' && line !~ '^\s*#' - break - endif -@@ -116,7 +118,7 @@ - " Get previous non-blank/non-comment-only line - while 1 - let line = getline(lnum) -- let line = substitute( line, ada#Comment, '', '' ) -+ let line = substitute( line, g:ada#Comment, '', '' ) - if line !~ '^\s*$' - break - endif -@@ -143,7 +145,8 @@ - let lnum = prevnonblank(lnum - 1) - " Get previous non-blank/non-comment-only line - while 1 -- let line = substitute( getline(lnum), ada#Comment, '', '' ) -+ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) -+ - if line !~ '^\s*$' && line !~ '^\s*#' - break - endif -@@ -222,7 +225,7 @@ - exe lnum - exe 'normal! $F)%' - if getline('.') =~ '^\s*(' -- " Dire layout - use previous indent (could check for ada#Comment here) -+ " Dire layout - use previous indent (could check for g:ada#Comment here) - let ind = indent( prevnonblank( line('.')-1 ) ) - else - let ind = indent('.') -diff -urN vim71/runtime/macros/svnignore.bash vim71_ada/runtime/macros/svnignore.bash ---- vim71/runtime/macros/svnignore.bash 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/runtime/macros/svnignore.bash 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,9 @@ -+#!/bin/bash -+ -+svn propedit \ -+ --editor-cmd="gvim -f" \ -+ svn:ignore \ -+ "${@}" ; -+ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/runtime/macros/svnignore.btm vim71_ada/runtime/macros/svnignore.btm ---- vim71/runtime/macros/svnignore.btm 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/runtime/macros/svnignore.btm 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,27 @@ -+::!C:\Bin\4Portable\App\4\4nt.EXE -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+:: Description: Works like "tail -f" . -+:: $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+:: Maintainer: Martin Krischik -+:: Jason Heddings (vim at heddway dot com) -+:: $Author: karsten $ -+:: $Date: 2008/01/18 15:30:13 $ -+:: Version: 3.0 -+:: $Revision: 1.3 $ -+:: $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.btm $ -+:: History: 17.11.2007 Edit svn:ignore data -+:: Help Page: tail.txt -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+ -+svn propedit ^ -+ --editor-cmd="gvim -f" ^ -+ svn:ignore ^ -+ "%[$]" -+ -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+:: Copyright (C) 2006 Martin Krischik -+:: -+:: Vim is Charityware - see ":help license" or uganda.txt for licence details. -+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -+:: vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+:: vim: filetype=btm encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/runtime/macros/svnignore.zsh vim71_ada/runtime/macros/svnignore.zsh ---- vim71/runtime/macros/svnignore.zsh 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/runtime/macros/svnignore.zsh 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,29 @@ -+#!/bin/zsh -+#------------------------------------------------------------------------------ -+# Description: Works like "tail -f" . -+# $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+# Maintainer: Martin Krischik -+# Jason Heddings (vim at heddway dot com) -+# $Author: karsten $ -+# $Date: 2008/01/18 15:30:13 $ -+# Version: 3.0 -+# $Revision: 1.3 $ -+# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.zsh $ -+# History: 17.11.2007 Edit svn:ignore data -+# Help Page: tail.txt -+#------------------------------------------------------------------------------ -+ -+setopt No_X_Trace; -+ -+svn propedit \ -+ --editor-cmd="gvim -f" \ -+ svn:ignore \ -+ "${=@}" ; -+ -+#------------------------------------------------------------------------------ -+# Copyright (C) 2006 Martin Krischik -+# -+# Vim is Charityware - see ":help license" or uganda.txt for licence details. -+#------------------------------------------------------------------------------ -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/runtime/macros/vim.bash vim71_ada/runtime/macros/vim.bash ---- vim71/runtime/macros/vim.bash 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/runtime/macros/vim.bash 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,191 @@ -+#!/bin/echo usage: source -+########################################################### {{{1 ########### -+# Description: Set alias names for a custom installed vim/ctags. -+# Language: Bash Shell Script -+# $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+# Maintainer: Martin Krischik -+# $Author: karsten $ -+# $Date: 2008/01/18 15:30:13 $ -+# Version: 3.6 -+# $Revision: 1.3 $ -+# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/vim.bash $ -+# History: 26.07.2006 MK pretty new -+# Usage: copy to /etc/profile.d and make world executable -+########################################################### }}}1 ########### -+ -+ -+if ! type lxpm 2>/dev/null 1>/dev/null; then -+ -+ # Variablen -+ UName=$(uname) -+ -+ case "${UName}" in # {{{1 -+ (Linux*) # {{{2 -+ if test -x "/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; -+ else -+ unset VIM 1>/dev/null 2>/dev/null; -+ unset VIMRUNTIME 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}2 -+ (CYGWIN*) # {{{2 -+ if test -x "/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" -+ else -+ unset VIM 1>/dev/null 2>/dev/null; -+ unset VIMRUNTIME 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}2 -+ (SunOS) # {{{2 -+ if test -x "/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; -+ elif test -x "${HOME}/opt/gnat/tools/bin/vim"; then -+ declare -x VIM="${HOME}/opt/gnat/tools"; -+ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" -+ PATH="${VIM}/bin:${PATH}" -+ else -+ unset VIM 1>/dev/null 2>/dev/null; -+ unset VIMRUNTIME 1>/dev/null 2>/dev/null; -+ fi -+ ;; # }}}2 -+ (*) # {{{2 -+ ;; # }}}2 -+ esac; # }}}1 -+ -+ # Simple Functions -+ -+ for i in ctags etags eview evim ex gview gvim gvimdiff rgview rgvim rview rvim view vim vimdiff vimtutor xxd; do # {{{1 -+ -+ case "${UName}" in # {{{2 -+ (MINGW*) # {{{3 -+ if test -n "${VIM}"; then -+ declare -x -f ${i}; -+ -+ eval "function ${i} () -+ { -+ ${VIM}/vim71/gvim.exe \"\${@}\" -+ return; -+ }" -+ else -+ unset -f ${i} 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}3 -+ (Linux|CYGWIN*) # {{{3 -+ if test -n "${VIM}"; then -+ declare -x -f ${i}; -+ -+ eval "function ${i} () -+ { -+ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ -+ \"${VIM}/bin/${i}\" \"\${@}\" ; -+ return; -+ }" -+ else -+ unset -f ${i} 1>/dev/null 2>/dev/null; -+ fi; -+ ;; # }}}3 -+ (*) # {{{3 -+ ;; # }}}3 -+ esac; # }}}2 -+ done; # }}}1 -+ -+ # Server Functions -+ -+ for i in lxpm med epm; do # {{{1 -+ declare -x -f ${i} -+ -+ case "${UName}" in # {{{2 -+ (MINGW*) # {{{3 -+ if test -n "${VIM}"; then -+ eval "function ${i} () -+ { -+ if test -z "\${1}"; then -+ ${VIM}/vim71/gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & -+ else -+ ${VIM}/vim71/gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & -+ fi; -+ return; -+ }" -+ else -+ eval "function ${i} () -+ { -+ if test -z "\${1}"; then -+ gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & -+ else -+ gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & -+ fi; -+ return; -+ }" -+ fi; -+ ;; # }}}3 -+ (Linux|CYGWIN*|SunOS) # {{{3 -+ if test -n "${VIM}"; then -+ eval "function ${i} () -+ { -+ if test -z \"\${1}\"; then -+ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ -+ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" \"\${@}\" \ -+ >/dev/null 2>/dev/null & -+ else -+ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ -+ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" \ -+ >/dev/null 2>/dev/null & -+ fi -+ return; -+ }" -+ else -+ eval "function ${i} () -+ { -+ if test -z \"\${1}\"; then -+ gvim --servername \"${i} ${HOSTNAME}\" >/dev/null 2>/dev/null & -+ else -+ gvim --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" >/dev/null 2>/dev/null & -+ fi -+ return; -+ }" -+ fi; -+ ;; # }}}3 -+ (*) # {{{3 -+ ;; # }}}3 -+ esac; # }}}2 -+ done; # }}}1 -+ -+ # Some applications read the EDITOR variable to determine your favourite text -+ # editor. So uncomment the line below and enter the editor of your choice :-) -+ if test -n "${VIM}"; then -+ declare -x EDITOR="${VIM}/bin/gvim -f"; -+ declare -x VISUAL="${VIM}/bin/gvim -f"; -+ else -+ declare -x EDITOR="$(which gvim) -f"; -+ declare -x VISUAL="$(which gvim) -f"; -+ fi; -+ # Unset local Variablen -+ -+ unset UName -+ -+ printf "\e[42m%-30.30s : \e[43m %-40.40s \e[m\n" "$(basename ${BASH_SOURCE:-${0}})" "VIM 7.0 symbols set." -+ -+fi; -+ -+########################################################### {{{1 ########### -+# Copyright (C) 2006 Martin Krischik -+# -+# This program is free software; you can redistribute it and/or -+# modify it under the terms of the GNU General Public License -+# as published by the Free Software Foundation; either version 2 -+# of the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -+########################################################### }}}1 ########### -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab -+# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker -diff -urN vim71/runtime/macros/vim.zsh vim71_ada/runtime/macros/vim.zsh ---- vim71/runtime/macros/vim.zsh 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/runtime/macros/vim.zsh 2008-01-16 16:37:02.000000000 +0100 -@@ -0,0 +1,17 @@ -+#!/bin/echo usage: source -+ -+setopt No_Verbose -+setopt No_X_Trace -+setopt Typeset_Silent; -+ -+# -+# Bash script is zsh compatible -+# -+HOSTNAME="${HOSTNAME:-${HOST}}" -+BASH_SOURCE="$(basename ${0} .zsh).bash" -+source "$(dirname ${0})/${BASH_SOURCE}" -+unset BASH_SOURCE; -+ -+############################################################# {{{1 ########### -+# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab -+# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell -diff -urN vim71/runtime/plugin/matchit.vim vim71_ada/runtime/plugin/matchit.vim ---- vim71/runtime/plugin/matchit.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/runtime/plugin/matchit.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,814 @@ -+" matchit.vim: (global plugin) Extended "%" matching -+" Last Change: Tue Oct 24 11:00 AM 2006 EDT -+" Maintainer: Benji Fisher PhD -+" Version: 1.12, for Vim 6.3+ -+" URL: http://www.vim.org/script.php?script_id=39 -+ -+" Documentation: -+" The documentation is in a separate file, matchit.txt . -+ -+" Credits: -+" Vim editor by Bram Moolenaar (Thanks, Bram!) -+" Original script and design by Raul Segura Acevedo -+" Support for comments by Douglas Potts -+" Support for back references and other improvements by Benji Fisher -+" Support for many languages by Johannes Zellner -+" Suggestions for improvement, bug reports, and support for additional -+" languages by Jordi-Albert Batalla, Neil Bird, Servatius Brandt, Mark -+" Collett, Stephen Wall, Dany St-Amant, Yuheng Xie, and Johannes Zellner. -+ -+" Debugging: -+" If you'd like to try the built-in debugging commands... -+" :MatchDebug to activate debugging for the current buffer -+" This saves the values of several key script variables as buffer-local -+" variables. See the MatchDebug() function, below, for details. -+ -+" TODO: I should think about multi-line patterns for b:match_words. -+" This would require an option: how many lines to scan (default 1). -+" This would be useful for Python, maybe also for *ML. -+" TODO: Maybe I should add a menu so that people will actually use some of -+" the features that I have implemented. -+" TODO: Eliminate the MultiMatch function. Add yet another argument to -+" Match_wrapper() instead. -+" TODO: Allow :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1' -+" TODO: Make backrefs safer by using '\V' (very no-magic). -+" TODO: Add a level of indirection, so that custom % scripts can use my -+" work but extend it. -+ -+" allow user to prevent loading -+" and prevent duplicate loading -+if exists("loaded_matchit") || &cp -+ finish -+endif -+let loaded_matchit = 1 -+let s:last_mps = "" -+let s:last_words = "" -+ -+let s:save_cpo = &cpo -+set cpo&vim -+ -+nnoremap % :call Match_wrapper('',1,'n') -+nnoremap g% :call Match_wrapper('',0,'n') -+vnoremap % :call Match_wrapper('',1,'v') m'gv`` -+vnoremap g% :call Match_wrapper('',0,'v') m'gv`` -+onoremap % v:call Match_wrapper('',1,'o') -+onoremap g% v:call Match_wrapper('',0,'o') -+ -+" Analogues of [{ and ]} using matching patterns: -+nnoremap [% :call MultiMatch("bW", "n") -+nnoremap ]% :call MultiMatch("W", "n") -+vmap [% [%m'gv`` -+vmap ]% ]%m'gv`` -+" vnoremap [% :call MultiMatch("bW", "v") m'gv`` -+" vnoremap ]% :call MultiMatch("W", "v") m'gv`` -+onoremap [% v:call MultiMatch("bW", "o") -+onoremap ]% v:call MultiMatch("W", "o") -+ -+" text object: -+vmap a% [%v]% -+ -+" Auto-complete mappings: (not yet "ready for prime time") -+" TODO Read :help write-plugin for the "right" way to let the user -+" specify a key binding. -+" let g:match_auto = '' -+" let g:match_autoCR = '' -+" if exists("g:match_auto") -+" execute "inoremap " . g:match_auto . ' x"=Autocomplete()Pls' -+" endif -+" if exists("g:match_autoCR") -+" execute "inoremap " . g:match_autoCR . ' =Autocomplete()' -+" endif -+" if exists("g:match_gthhoh") -+" execute "inoremap " . g:match_gthhoh . ' :call Gthhoh()' -+" endif " gthhoh = "Get the heck out of here!" -+ -+let s:notslash = '\\\@" -+ endif -+ " In s:CleanUp(), we may need to check whether the cursor moved forward. -+ let startline = line(".") -+ let startcol = col(".") -+ " Use default behavior if called with a count or if no patterns are defined. -+ if v:count -+ exe "normal! " . v:count . "%" -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ elseif !exists("b:match_words") || b:match_words == "" -+ silent! normal! % -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ end -+ -+ " First step: if not already done, set the script variables -+ " s:do_BR flag for whether there are backrefs -+ " s:pat parsed version of b:match_words -+ " s:all regexp based on s:pat and the default groups -+ " -+ " Allow b:match_words = "GetVimMatchWords()" . -+ if b:match_words =~ ":" -+ let match_words = b:match_words -+ else -+ execute "let match_words =" b:match_words -+ endif -+" Thanks to Preben "Peppe" Guldberg and Bram Moolenaar for this suggestion! -+ if (match_words != s:last_words) || (&mps != s:last_mps) || -+ \ exists("b:match_debug") -+ let s:last_words = match_words -+ let s:last_mps = &mps -+ if match_words !~ s:notslash . '\\\d' -+ let s:do_BR = 0 -+ let s:pat = match_words -+ else -+ let s:do_BR = 1 -+ let s:pat = s:ParseWords(match_words) -+ endif -+ " The next several lines were here before -+ " BF started messing with this script. -+ " quote the special chars in 'matchpairs', replace [,:] with \| and then -+ " append the builtin pairs (/*, */, #if, #ifdef, #else, #elif, #endif) -+ " let default = substitute(escape(&mps, '[$^.*~\\/?]'), '[,:]\+', -+ " \ '\\|', 'g').'\|\/\*\|\*\/\|#if\>\|#ifdef\>\|#else\>\|#elif\>\|#endif\>' -+ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . -+ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' -+ " s:all = pattern with all the keywords -+ let s:all = s:pat . (strlen(s:pat) ? "," : "") . default -+ let s:all = substitute(s:all, s:notslash . '\zs[,:]\+', '\\|', 'g') -+ let s:all = '\%(' . s:all . '\)' -+ " let s:all = '\%(' . substitute(s:all, '\\\ze[,:]', '', 'g') . '\)' -+ if exists("b:match_debug") -+ let b:match_pat = s:pat -+ endif -+ endif -+ -+ " Second step: set the following local variables: -+ " matchline = line on which the cursor started -+ " curcol = number of characters before match -+ " prefix = regexp for start of line to start of match -+ " suffix = regexp for end of match to end of line -+ " Require match to end on or after the cursor and prefer it to -+ " start on or before the cursor. -+ let matchline = getline(startline) -+ if a:word != '' -+ " word given -+ if a:word !~ s:all -+ echohl WarningMsg|echo 'Missing rule for word:"'.a:word.'"'|echohl NONE -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ endif -+ let matchline = a:word -+ let curcol = 0 -+ let prefix = '^\%(' -+ let suffix = '\)$' -+ " Now the case when "word" is not given -+ else " Find the match that ends on or after the cursor and set curcol. -+ let regexp = s:Wholematch(matchline, s:all, startcol-1) -+ let curcol = match(matchline, regexp) -+ let endcol = matchend(matchline, regexp) -+ let suf = strlen(matchline) - endcol -+ let prefix = (curcol ? '^.*\%' . (curcol + 1) . 'c\%(' : '^\%(') -+ let suffix = (suf ? '\)\%' . (endcol + 1) . 'c.*$' : '\)$') -+ " If the match comes from the defaults, bail out. -+ if matchline !~ prefix . -+ \ substitute(s:pat, s:notslash.'\zs[,:]\+', '\\|', 'g') . suffix -+ silent! norm! % -+ return s:CleanUp(restore_options, a:mode, startline, startcol) -+ endif -+ endif -+ if exists("b:match_debug") -+ let b:match_match = matchstr(matchline, regexp) -+ let b:match_col = curcol+1 -+ endif -+ -+ " Third step: Find the group and single word that match, and the original -+ " (backref) versions of these. Then, resolve the backrefs. -+ " Set the following local variable: -+ " group = colon-separated list of patterns, one of which matches -+ " = ini:mid:fin or ini:fin -+ " -+ " Reconstruct the version with unresolved backrefs. -+ let patBR = substitute(match_words.',', -+ \ s:notslash.'\zs[,:]*,[,:]*', ',', 'g') -+ let patBR = substitute(patBR, s:notslash.'\zs:\{2,}', ':', 'g') -+ " Now, set group and groupBR to the matching group: 'if:endif' or -+ " 'while:endwhile' or whatever. A bit of a kluge: s:Choose() returns -+ " group . "," . groupBR, and we pick it apart. -+ let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) -+ let i = matchend(group, s:notslash . ",") -+ let groupBR = strpart(group, i) -+ let group = strpart(group, 0, i-1) -+ " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix -+ if s:do_BR " Do the hard part: resolve those backrefs! -+ let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) -+ endif -+ if exists("b:match_debug") -+ let b:match_wholeBR = groupBR -+ let i = matchend(groupBR, s:notslash . ":") -+ let b:match_iniBR = strpart(groupBR, 0, i-1) -+ endif -+ -+ " Fourth step: Set the arguments for searchpair(). -+ let i = matchend(group, s:notslash . ":") -+ let j = matchend(group, '.*' . s:notslash . ":") -+ let ini = strpart(group, 0, i-1) -+ let mid = substitute(strpart(group, i,j-i-1), s:notslash.'\zs:', '\\|', 'g') -+ let fin = strpart(group, j) -+ "Un-escape the remaining , and : characters. -+ let ini = substitute(ini, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') -+ let mid = substitute(mid, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') -+ let fin = substitute(fin, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') -+ " searchpair() requires that these patterns avoid \(\) groups. -+ let ini = substitute(ini, s:notslash . '\zs\\(', '\\%(', 'g') -+ let mid = substitute(mid, s:notslash . '\zs\\(', '\\%(', 'g') -+ let fin = substitute(fin, s:notslash . '\zs\\(', '\\%(', 'g') -+ " Set mid. This is optimized for readability, not micro-efficiency! -+ if a:forward && matchline =~ prefix . fin . suffix -+ \ || !a:forward && matchline =~ prefix . ini . suffix -+ let mid = "" -+ endif -+ " Set flag. This is optimized for readability, not micro-efficiency! -+ if a:forward && matchline =~ prefix . fin . suffix -+ \ || !a:forward && matchline !~ prefix . ini . suffix -+ let flag = "bW" -+ else -+ let flag = "W" -+ endif -+ " Set skip. -+ if exists("b:match_skip") -+ let skip = b:match_skip -+ elseif exists("b:match_comment") " backwards compatibility and testing! -+ let skip = "r:" . b:match_comment -+ else -+ let skip = 's:comment\|string' -+ endif -+ let skip = s:ParseSkip(skip) -+ if exists("b:match_debug") -+ let b:match_ini = ini -+ let b:match_tail = (strlen(mid) ? mid.'\|' : '') . fin -+ endif -+ -+ " Fifth step: actually start moving the cursor and call searchpair(). -+ " Later, :execute restore_cursor to get to the original screen. -+ let restore_cursor = virtcol(".") . "|" -+ normal! g0 -+ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor -+ normal! H -+ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor -+ execute restore_cursor -+ call cursor(0, curcol + 1) -+ " normal! 0 -+ " if curcol -+ " execute "normal!" . curcol . "l" -+ " endif -+ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on")) -+ let skip = "0" -+ else -+ execute "if " . skip . "| let skip = '0' | endif" -+ endif -+ let sp_return = searchpair(ini, mid, fin, flag, skip) -+ let final_position = "call cursor(" . line(".") . "," . col(".") . ")" -+ " Restore cursor position and original screen. -+ execute restore_cursor -+ normal! m' -+ if sp_return > 0 -+ execute final_position -+ endif -+ return s:CleanUp(restore_options, a:mode, startline, startcol, mid.'\|'.fin) -+endfun -+ -+" Restore options and do some special handling for Operator-pending mode. -+" The optional argument is the tail of the matching group. -+fun! s:CleanUp(options, mode, startline, startcol, ...) -+ execute "set" a:options -+ " Open folds, if appropriate. -+ if a:mode != "o" -+ if &foldopen =~ "percent" -+ normal! zv -+ endif -+ " In Operator-pending mode, we want to include the whole match -+ " (for example, d%). -+ " This is only a problem if we end up moving in the forward direction. -+ elseif (a:startline < line(".")) || -+ \ (a:startline == line(".") && a:startcol < col(".")) -+ if a:0 -+ " Check whether the match is a single character. If not, move to the -+ " end of the match. -+ let matchline = getline(".") -+ let currcol = col(".") -+ let regexp = s:Wholematch(matchline, a:1, currcol-1) -+ let endcol = matchend(matchline, regexp) -+ if endcol > currcol " This is NOT off by one! -+ execute "normal!" . (endcol - currcol) . "l" -+ endif -+ endif " a:0 -+ endif " a:mode != "o" && etc. -+ return 0 -+endfun -+ -+" Example (simplified HTML patterns): if -+" a:groupBR = '<\(\k\+\)>:' -+" a:prefix = '^.\{3}\(' -+" a:group = '<\(\k\+\)>:' -+" a:suffix = '\).\{2}$' -+" a:matchline = "12312" or "12312" -+" then extract "tag" from a:matchline and return ":" . -+fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline) -+ if a:matchline !~ a:prefix . -+ \ substitute(a:group, s:notslash . '\zs:', '\\|', 'g') . a:suffix -+ return a:group -+ endif -+ let i = matchend(a:groupBR, s:notslash . ':') -+ let ini = strpart(a:groupBR, 0, i-1) -+ let tailBR = strpart(a:groupBR, i) -+ let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix, -+ \ a:groupBR) -+ let i = matchend(word, s:notslash . ":") -+ let wordBR = strpart(word, i) -+ let word = strpart(word, 0, i-1) -+ " Now, a:matchline =~ a:prefix . word . a:suffix -+ if wordBR != ini -+ let table = s:Resolve(ini, wordBR, "table") -+ else -+ " let table = "----------" -+ let table = "" -+ let d = 0 -+ while d < 10 -+ if tailBR =~ s:notslash . '\\' . d -+ " let table[d] = d -+ let table = table . d -+ else -+ let table = table . "-" -+ endif -+ let d = d + 1 -+ endwhile -+ endif -+ let d = 9 -+ while d -+ if table[d] != "-" -+ let backref = substitute(a:matchline, a:prefix.word.a:suffix, -+ \ '\'.table[d], "") -+ " Are there any other characters that should be escaped? -+ let backref = escape(backref, '*,:') -+ execute s:Ref(ini, d, "start", "len") -+ let ini = strpart(ini, 0, start) . backref . strpart(ini, start+len) -+ let tailBR = substitute(tailBR, s:notslash . '\zs\\' . d, -+ \ escape(backref, '\\'), 'g') -+ endif -+ let d = d-1 -+ endwhile -+ if exists("b:match_debug") -+ if s:do_BR -+ let b:match_table = table -+ let b:match_word = word -+ else -+ let b:match_table = "" -+ let b:match_word = "" -+ endif -+ endif -+ return ini . ":" . tailBR -+endfun -+ -+" Input a comma-separated list of groups with backrefs, such as -+" a:groups = '\(foo\):end\1,\(bar\):end\1' -+" and return a comma-separated list of groups with backrefs replaced: -+" return '\(foo\):end\(foo\),\(bar\):end\(bar\)' -+fun! s:ParseWords(groups) -+ let groups = substitute(a:groups.",", s:notslash.'\zs[,:]*,[,:]*', ',', 'g') -+ let groups = substitute(groups, s:notslash . '\zs:\{2,}', ':', 'g') -+ let parsed = "" -+ while groups =~ '[^,:]' -+ let i = matchend(groups, s:notslash . ':') -+ let j = matchend(groups, s:notslash . ',') -+ let ini = strpart(groups, 0, i-1) -+ let tail = strpart(groups, i, j-i-1) . ":" -+ let groups = strpart(groups, j) -+ let parsed = parsed . ini -+ let i = matchend(tail, s:notslash . ':') -+ while i != -1 -+ " In 'if:else:endif', ini='if' and word='else' and then word='endif'. -+ let word = strpart(tail, 0, i-1) -+ let tail = strpart(tail, i) -+ let i = matchend(tail, s:notslash . ':') -+ let parsed = parsed . ":" . s:Resolve(ini, word, "word") -+ endwhile " Now, tail has been used up. -+ let parsed = parsed . "," -+ endwhile " groups =~ '[^,:]' -+ return parsed -+endfun -+ -+" TODO I think this can be simplified and/or made more efficient. -+" TODO What should I do if a:start is out of range? -+" Return a regexp that matches all of a:string, such that -+" matchstr(a:string, regexp) represents the match for a:pat that starts -+" as close to a:start as possible, before being preferred to after, and -+" ends after a:start . -+" Usage: -+" let regexp = s:Wholematch(getline("."), 'foo\|bar', col(".")-1) -+" let i = match(getline("."), regexp) -+" let j = matchend(getline("."), regexp) -+" let match = matchstr(getline("."), regexp) -+fun! s:Wholematch(string, pat, start) -+ let group = '\%(' . a:pat . '\)' -+ let prefix = (a:start ? '\(^.*\%<' . (a:start + 2) . 'c\)\zs' : '^') -+ let len = strlen(a:string) -+ let suffix = (a:start+1 < len ? '\(\%>'.(a:start+1).'c.*$\)\@=' : '$') -+ if a:string !~ prefix . group . suffix -+ let prefix = '' -+ endif -+ return prefix . group . suffix -+endfun -+ -+" No extra arguments: s:Ref(string, d) will -+" find the d'th occurrence of '\(' and return it, along with everything up -+" to and including the matching '\)'. -+" One argument: s:Ref(string, d, "start") returns the index of the start -+" of the d'th '\(' and any other argument returns the length of the group. -+" Two arguments: s:Ref(string, d, "foo", "bar") returns a string to be -+" executed, having the effect of -+" :let foo = s:Ref(string, d, "start") -+" :let bar = s:Ref(string, d, "len") -+fun! s:Ref(string, d, ...) -+ let len = strlen(a:string) -+ if a:d == 0 -+ let start = 0 -+ else -+ let cnt = a:d -+ let match = a:string -+ while cnt -+ let cnt = cnt - 1 -+ let index = matchend(match, s:notslash . '\\(') -+ if index == -1 -+ return "" -+ endif -+ let match = strpart(match, index) -+ endwhile -+ let start = len - strlen(match) -+ if a:0 == 1 && a:1 == "start" -+ return start - 2 -+ endif -+ let cnt = 1 -+ while cnt -+ let index = matchend(match, s:notslash . '\\(\|\\)') - 1 -+ if index == -2 -+ return "" -+ endif -+ " Increment if an open, decrement if a ')': -+ let cnt = cnt + (match[index]=="(" ? 1 : -1) " ')' -+ " let cnt = stridx('0(', match[index]) + cnt -+ let match = strpart(match, index+1) -+ endwhile -+ let start = start - 2 -+ let len = len - start - strlen(match) -+ endif -+ if a:0 == 1 -+ return len -+ elseif a:0 == 2 -+ return "let " . a:1 . "=" . start . "| let " . a:2 . "=" . len -+ else -+ return strpart(a:string, start, len) -+ endif -+endfun -+ -+" Count the number of disjoint copies of pattern in string. -+" If the pattern is a literal string and contains no '0' or '1' characters -+" then s:Count(string, pattern, '0', '1') should be faster than -+" s:Count(string, pattern). -+fun! s:Count(string, pattern, ...) -+ let pat = escape(a:pattern, '\\') -+ if a:0 > 1 -+ let foo = substitute(a:string, '[^'.a:pattern.']', "a:1", "g") -+ let foo = substitute(a:string, pat, a:2, "g") -+ let foo = substitute(foo, '[^' . a:2 . ']', "", "g") -+ return strlen(foo) -+ endif -+ let result = 0 -+ let foo = a:string -+ let index = matchend(foo, pat) -+ while index != -1 -+ let result = result + 1 -+ let foo = strpart(foo, index) -+ let index = matchend(foo, pat) -+ endwhile -+ return result -+endfun -+ -+" s:Resolve('\(a\)\(b\)', '\(c\)\2\1\1\2') should return table.word, where -+" word = '\(c\)\(b\)\(a\)\3\2' and table = '-32-------'. That is, the first -+" '\1' in target is replaced by '\(a\)' in word, table[1] = 3, and this -+" indicates that all other instances of '\1' in target are to be replaced -+" by '\3'. The hard part is dealing with nesting... -+" Note that ":" is an illegal character for source and target, -+" unless it is preceded by "\". -+fun! s:Resolve(source, target, output) -+ let word = a:target -+ let i = matchend(word, s:notslash . '\\\d') - 1 -+ let table = "----------" -+ while i != -2 " There are back references to be replaced. -+ let d = word[i] -+ let backref = s:Ref(a:source, d) -+ " The idea is to replace '\d' with backref. Before we do this, -+ " replace any \(\) groups in backref with :1, :2, ... if they -+ " correspond to the first, second, ... group already inserted -+ " into backref. Later, replace :1 with \1 and so on. The group -+ " number w+b within backref corresponds to the group number -+ " s within a:source. -+ " w = number of '\(' in word before the current one -+ let w = s:Count( -+ \ substitute(strpart(word, 0, i-1), '\\\\', '', 'g'), '\(', '1') -+ let b = 1 " number of the current '\(' in backref -+ let s = d " number of the current '\(' in a:source -+ while b <= s:Count(substitute(backref, '\\\\', '', 'g'), '\(', '1') -+ \ && s < 10 -+ if table[s] == "-" -+ if w + b < 10 -+ " let table[s] = w + b -+ let table = strpart(table, 0, s) . (w+b) . strpart(table, s+1) -+ endif -+ let b = b + 1 -+ let s = s + 1 -+ else -+ execute s:Ref(backref, b, "start", "len") -+ let ref = strpart(backref, start, len) -+ let backref = strpart(backref, 0, start) . ":". table[s] -+ \ . strpart(backref, start+len) -+ let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1') -+ endif -+ endwhile -+ let word = strpart(word, 0, i-1) . backref . strpart(word, i+1) -+ let i = matchend(word, s:notslash . '\\\d') - 1 -+ endwhile -+ let word = substitute(word, s:notslash . '\zs:', '\\', 'g') -+ if a:output == "table" -+ return table -+ elseif a:output == "word" -+ return word -+ else -+ return table . word -+ endif -+endfun -+ -+" Assume a:comma = ",". Then the format for a:patterns and a:1 is -+" a:patterns = ",,..." -+" a:1 = ",,..." -+" If is the first pattern that matches a:string then return -+" if no optional arguments are given; return , if a:1 is given. -+fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...) -+ let tail = (a:patterns =~ a:comma."$" ? a:patterns : a:patterns . a:comma) -+ let i = matchend(tail, s:notslash . a:comma) -+ if a:0 -+ let alttail = (a:1 =~ a:comma."$" ? a:1 : a:1 . a:comma) -+ let j = matchend(alttail, s:notslash . a:comma) -+ endif -+ let current = strpart(tail, 0, i-1) -+ if a:branch == "" -+ let currpat = current -+ else -+ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') -+ endif -+ while a:string !~ a:prefix . currpat . a:suffix -+ let tail = strpart(tail, i) -+ let i = matchend(tail, s:notslash . a:comma) -+ if i == -1 -+ return -1 -+ endif -+ let current = strpart(tail, 0, i-1) -+ if a:branch == "" -+ let currpat = current -+ else -+ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') -+ endif -+ if a:0 -+ let alttail = strpart(alttail, j) -+ let j = matchend(alttail, s:notslash . a:comma) -+ endif -+ endwhile -+ if a:0 -+ let current = current . a:comma . strpart(alttail, 0, j-1) -+ endif -+ return current -+endfun -+ -+" Call this function to turn on debugging information. Every time the main -+" script is run, buffer variables will be saved. These can be used directly -+" or viewed using the menu items below. -+if !exists(":MatchDebug") -+ command! -nargs=0 MatchDebug call s:Match_debug() -+endif -+ -+fun! s:Match_debug() -+ let b:match_debug = 1 " Save debugging information. -+ " pat = all of b:match_words with backrefs parsed -+ amenu &Matchit.&pat :echo b:match_pat -+ " match = bit of text that is recognized as a match -+ amenu &Matchit.&match :echo b:match_match -+ " curcol = cursor column of the start of the matching text -+ amenu &Matchit.&curcol :echo b:match_col -+ " wholeBR = matching group, original version -+ amenu &Matchit.wh&oleBR :echo b:match_wholeBR -+ " iniBR = 'if' piece, original version -+ amenu &Matchit.ini&BR :echo b:match_iniBR -+ " ini = 'if' piece, with all backrefs resolved from match -+ amenu &Matchit.&ini :echo b:match_ini -+ " tail = 'else\|endif' piece, with all backrefs resolved from match -+ amenu &Matchit.&tail :echo b:match_tail -+ " fin = 'endif' piece, with all backrefs resolved from match -+ amenu &Matchit.&word :echo b:match_word -+ " '\'.d in ini refers to the same thing as '\'.table[d] in word. -+ amenu &Matchit.t&able :echo '0:' . b:match_table . ':9' -+endfun -+ -+" Jump to the nearest unmatched "(" or "if" or "" if a:spflag == "bW" -+" or the nearest unmatched "" or "endif" or ")" if a:spflag == "W". -+" Return a "mark" for the original position, so that -+" let m = MultiMatch("bW", "n") ... execute m -+" will return to the original position. If there is a problem, do not -+" move the cursor and return "", unless a count is given, in which case -+" go up or down as many levels as possible and again return "". -+" TODO This relies on the same patterns as % matching. It might be a good -+" idea to give it its own matching patterns. -+fun! s:MultiMatch(spflag, mode) -+ if !exists("b:match_words") || b:match_words == "" -+ return "" -+ end -+ let restore_options = (&ic ? "" : "no") . "ignorecase" -+ if exists("b:match_ignorecase") -+ let &ignorecase = b:match_ignorecase -+ endif -+ let startline = line(".") -+ let startcol = col(".") -+ -+ " First step: if not already done, set the script variables -+ " s:do_BR flag for whether there are backrefs -+ " s:pat parsed version of b:match_words -+ " s:all regexp based on s:pat and the default groups -+ " This part is copied and slightly modified from s:Match_wrapper(). -+ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . -+ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' -+ " Allow b:match_words = "GetVimMatchWords()" . -+ if b:match_words =~ ":" -+ let match_words = b:match_words -+ else -+ execute "let match_words =" b:match_words -+ endif -+ if (match_words != s:last_words) || (&mps != s:last_mps) || -+ \ exists("b:match_debug") -+ let s:last_words = match_words -+ let s:last_mps = &mps -+ if match_words !~ s:notslash . '\\\d' -+ let s:do_BR = 0 -+ let s:pat = match_words -+ else -+ let s:do_BR = 1 -+ let s:pat = s:ParseWords(match_words) -+ endif -+ let s:all = '\%(' . substitute(s:pat . (strlen(s:pat)?",":"") . default, -+ \ '[,:]\+','\\|','g') . '\)' -+ if exists("b:match_debug") -+ let b:match_pat = s:pat -+ endif -+ endif -+ -+ " Second step: figure out the patterns for searchpair() -+ " and save the screen, cursor position, and 'ignorecase'. -+ " - TODO: A lot of this is copied from s:Match_wrapper(). -+ " - maybe even more functionality should be split off -+ " - into separate functions! -+ let cdefault = (s:pat =~ '[^,]$' ? "," : "") . default -+ let open = substitute(s:pat . cdefault, -+ \ s:notslash . '\zs:.\{-}' . s:notslash . ',', '\\),\\(', 'g') -+ let open = '\(' . substitute(open, s:notslash . '\zs:.*$', '\\)', '') -+ let close = substitute(s:pat . cdefault, -+ \ s:notslash . '\zs,.\{-}' . s:notslash . ':', '\\),\\(', 'g') -+ let close = substitute(close, '^.\{-}' . s:notslash . ':', '\\(', '') . '\)' -+ if exists("b:match_skip") -+ let skip = b:match_skip -+ elseif exists("b:match_comment") " backwards compatibility and testing! -+ let skip = "r:" . b:match_comment -+ else -+ let skip = 's:comment\|string' -+ endif -+ let skip = s:ParseSkip(skip) -+ " let restore_cursor = line(".") . "G" . virtcol(".") . "|" -+ " normal! H -+ " let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor -+ let restore_cursor = virtcol(".") . "|" -+ normal! g0 -+ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor -+ normal! H -+ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor -+ execute restore_cursor -+ -+ " Third step: call searchpair(). -+ " Replace '\('--but not '\\('--with '\%(' and ',' with '\|'. -+ let openpat = substitute(open, '\(\\\@" or ... -+" and return "endif" or "endwhile" or "" or ... . -+" For now, this uses b:match_words and the same script variables -+" as s:Match_wrapper() . Later, it may get its own patterns, -+" either from a buffer variable or passed as arguments. -+" fun! s:Autocomplete() -+" echo "autocomplete not yet implemented :-(" -+" if !exists("b:match_words") || b:match_words == "" -+" return "" -+" end -+" let startpos = s:MultiMatch("bW") -+" -+" if startpos == "" -+" return "" -+" endif -+" " - TODO: figure out whether 'if' or '' matched, and construct -+" " - the appropriate closing. -+" let matchline = getline(".") -+" let curcol = col(".") - 1 -+" " - TODO: Change the s:all argument if there is a new set of match pats. -+" let regexp = s:Wholematch(matchline, s:all, curcol) -+" let suf = strlen(matchline) - matchend(matchline, regexp) -+" let prefix = (curcol ? '^.\{' . curcol . '}\%(' : '^\%(') -+" let suffix = (suf ? '\).\{' . suf . '}$' : '\)$') -+" " Reconstruct the version with unresolved backrefs. -+" let patBR = substitute(b:match_words.',', '[,:]*,[,:]*', ',', 'g') -+" let patBR = substitute(patBR, ':\{2,}', ':', "g") -+" " Now, set group and groupBR to the matching group: 'if:endif' or -+" " 'while:endwhile' or whatever. -+" let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) -+" let i = matchend(group, s:notslash . ",") -+" let groupBR = strpart(group, i) -+" let group = strpart(group, 0, i-1) -+" " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix -+" if s:do_BR -+" let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) -+" endif -+" " let g:group = group -+" -+" " - TODO: Construct the closing from group. -+" let fake = "end" . expand("") -+" execute startpos -+" return fake -+" endfun -+ -+" Close all open structures. "Get the heck out of here!" -+" fun! s:Gthhoh() -+" let close = s:Autocomplete() -+" while strlen(close) -+" put=close -+" let close = s:Autocomplete() -+" endwhile -+" endfun -+ -+" Parse special strings as typical skip arguments for searchpair(): -+" s:foo becomes (current syntax item) =~ foo -+" S:foo becomes (current syntax item) !~ foo -+" r:foo becomes (line before cursor) =~ foo -+" R:foo becomes (line before cursor) !~ foo -+fun! s:ParseSkip(str) -+ let skip = a:str -+ if skip[1] == ":" -+ if skip[0] == "s" -+ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" . -+ \ strpart(skip,2) . "'" -+ elseif skip[0] == "S" -+ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" . -+ \ strpart(skip,2) . "'" -+ elseif skip[0] == "r" -+ let skip = "strpart(getline('.'),0,col('.'))=~'" . strpart(skip,2). "'" -+ elseif skip[0] == "R" -+ let skip = "strpart(getline('.'),0,col('.'))!~'" . strpart(skip,2). "'" -+ endif -+ endif -+ return skip -+endfun -+ -+let &cpo = s:save_cpo -+ -+" vim:sts=2:sw=2: -diff -urN vim71/runtime/plugin/taglist.vim vim71_ada/runtime/plugin/taglist.vim ---- vim71/runtime/plugin/taglist.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/runtime/plugin/taglist.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,4524 @@ -+" File: taglist.vim -+" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) -+" 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 -+" 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. -+" -+" 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 -+" you to efficiently browse through source code files for different -+" programming languages. You can visit the taglist plugin home page for more -+" information: -+" -+" http://vim-taglist.sourceforge.net -+" -+" You can subscribe to the taglist mailing list to post your questions -+" or suggestions for improvement or to report bugs. Visit the following -+" page for subscribing to the mailing list: -+" -+" http://groups.yahoo.com/group/taglist/ -+" -+" For more information about using this plugin, after installing the -+" taglist plugin, use the ":help taglist" command. -+" -+" Installation -+" ------------ -+" 1. Download the taglist.zip file and unzip the files to the $HOME/.vim -+" or the $HOME/vimfiles or the $VIM/vimfiles directory. This should -+" unzip the following two files (the directory structure should be -+" preserved): -+" -+" 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. -+" 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. -+" 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 -+" utility (not to the directory) in the .vimrc file. -+" 4. If you are running a terminal/console version of Vim and the -+" terminal doesn't support changing the window width then set the -+" 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. -+" 5. Restart Vim. -+" 6. You can now use the ":TlistToggle" command to open/close the taglist -+" window. You can use the ":help taglist" command to get more -+" information about using the taglist plugin. -+" -+" ****************** Do not modify after this line ************************ -+ -+" Line continuation used here -+let s:cpo_save = &cpo -+set cpo&vim -+ -+if !exists('loaded_taglist') -+ " First time loading the taglist plugin -+ " -+ " To speed up the loading of Vim, the taglist plugin uses autoload -+ " mechanism to load the taglist functions. -+ " Only define the configuration variables, user commands and some -+ " auto-commands and finish sourcing the file -+ -+ " The taglist plugin requires the built-in Vim system() function. If this -+ " function is not available, then don't load the plugin. -+ if !exists('*system') -+ echomsg 'Taglist: Vim system() built-in function is not available. ' . -+ \ 'Plugin is not loaded.' -+ let loaded_taglist = 'no' -+ let &cpo = s:cpo_save -+ finish -+ endif -+ -+ " Location of the exuberant ctags tool -+ if !exists('Tlist_Ctags_Cmd') -+ if executable('exuberant-ctags') -+ " On Debian Linux, exuberant ctags is installed -+ " as exuberant-ctags -+ let Tlist_Ctags_Cmd = 'exuberant-ctags' -+ elseif executable(' exctags') -+ " On Free-BSD, exuberant ctags is installed as exctags -+ let Tlist_Ctags_ Cmd = 'exctags' -+ elseif executable('ctags') -+ let Tlist_Ctags_Cmd = 'ctags' -+ elseif executable('ctags.exe') -+ let Tlist_Ctags_Cmd = 'ctags.exe' -+ elseif executable('tags') -+ let Tlist_Ctags_Cmd = 'tags' -+ else -+ " echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . -+ " \ 'not found in PATH. Plugin is not loaded.' -+ " Skip loading the plugin -+ let loaded_taglist = 'no' -+ let &cpo = s:cpo_save -+ finish -+ endif -+ endif -+ -+ -+ " Automatically open the taglist window on Vim startup -+ if !exists('Tlist_Auto_Open') -+ 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 -+ endif -+ -+ if !exists('Tlist_Show_Menu') -+ let Tlist_Show_Menu = 0 -+ endif -+ -+ " Tag listing sort type - 'name' or 'order' -+ if !exists('Tlist_Sort_Type') -+ let Tlist_Sort_Type = 'order' -+ endif -+ -+ " Tag listing window split (horizontal/vertical) control -+ if !exists('Tlist_Use_Horiz_Window') -+ let Tlist_Use_Horiz_Window = 0 -+ endif -+ -+ " Open the vertically split taglist window on the left or on the right -+ " side. This setting is relevant only if Tlist_Use_Horiz_Window is set to -+ " zero (i.e. only for vertically split windows) -+ if !exists('Tlist_Use_Right_Window') -+ let Tlist_Use_Right_Window = 0 -+ endif -+ -+ " Increase Vim window width to display vertically split taglist window. -+ " For MS-Windows version of Vim running in a MS-DOS window, this must be -+ " set to 0 otherwise the system may hang due to a Vim limitation. -+ if !exists('Tlist_Inc_Winwidth') -+ if (has('win16') || has('win95')) && !has('gui_running') -+ let Tlist_Inc_Winwidth = 0 -+ else -+ let Tlist_Inc_Winwidth = 1 -+ endif -+ endif -+ -+ " Vertically split taglist window width setting -+ if !exists('Tlist_WinWidth') -+ let Tlist_WinWidth = 30 -+ endif -+ -+ " Horizontally split taglist window height setting -+ if !exists('Tlist_WinHeight') -+ let Tlist_WinHeight = 10 -+ endif -+ -+ " Display tag prototypes or tag names in the taglist window -+ if !exists('Tlist_Display_Prototype') -+ let Tlist_Display_Prototype = 0 -+ endif -+ -+ " Display tag scopes in the taglist window -+ if !exists('Tlist_Display_Tag_Scope') -+ let Tlist_Display_Tag_Scope = 1 -+ endif -+ -+ " Use single left mouse click to jump to a tag. By default this is disabled. -+ " Only double click using the mouse will be processed. -+ if !exists('Tlist_Use_SingleClick') -+ let Tlist_Use_SingleClick = 0 -+ endif -+ -+ " Control whether additional help is displayed as part of the taglist or -+ " not. Also, controls whether empty lines are used to separate the tag -+ " tree. -+ if !exists('Tlist_Compact_Format') -+ let Tlist_Compact_Format = 0 -+ endif -+ -+ " Exit Vim if only the taglist window is currently open. By default, this is -+ " set to zero. -+ if !exists('Tlist_Exit_OnlyWindow') -+ let Tlist_Exit_OnlyWindow = 0 -+ endif -+ -+ " Automatically close the folds for the non-active files in the taglist -+ " window -+ if !exists('Tlist_File_Fold_Auto_Close') -+ let Tlist_File_Fold_Auto_Close = 0 -+ endif -+ -+ " Close the taglist window when a tag is selected -+ if !exists('Tlist_Close_On_Select') -+ let Tlist_Close_On_Select = 0 -+ endif -+ -+ " Automatically update the taglist window to display tags for newly -+ " edited files -+ if !exists('Tlist_Auto_Update') -+ let Tlist_Auto_Update = 1 -+ endif -+ -+ " Automatically highlight the current tag -+ if !exists('Tlist_Auto_Highlight_Tag') -+ let Tlist_Auto_Highlight_Tag = 1 -+ endif -+ -+ " Automatically highlight the current tag on entering a buffer -+ if !exists('Tlist_Highlight_Tag_On_BufEnter') -+ let Tlist_Highlight_Tag_On_BufEnter = 1 -+ endif -+ -+ " Enable fold column to display the folding for the tag tree -+ if !exists('Tlist_Enable_Fold_Column') -+ let Tlist_Enable_Fold_Column = 1 -+ endif -+ -+ " Display the tags for only one file in the taglist window -+ if !exists('Tlist_Show_One_File') -+ let Tlist_Show_One_File = 0 -+ endif -+ -+ if !exists('Tlist_Max_Submenu_Items') -+ let Tlist_Max_Submenu_Items = 20 -+ endif -+ -+ if !exists('Tlist_Max_Tag_Length') -+ let Tlist_Max_Tag_Length = 10 -+ endif -+ -+ " Do not change the name of the taglist title variable. The winmanager -+ " plugin relies on this name to determine the title for the taglist -+ " plugin. -+ let TagList_title = "__Tag_List__" -+ -+ " Taglist debug messages -+ let s:tlist_msg = '' -+ -+ " Define the taglist autocommand to automatically open the taglist window -+ " on Vim startup -+ if g:Tlist_Auto_Open -+ autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open() -+ endif -+ -+ " Refresh the taglist -+ if g:Tlist_Process_File_Always -+ autocmd BufEnter * call s:Tlist_Refresh() -+ endif -+ -+ if g:Tlist_Show_Menu -+ autocmd GUIEnter * call s:Tlist_Menu_Init() -+ endif -+ -+ " When the taglist buffer is created when loading a Vim session file, -+ " the taglist buffer needs to be initialized. The BufFilePost event -+ " is used to handle this case. -+ autocmd BufFilePost __Tag_List__ call s:Tlist_Vim_Session_Load() -+ -+ " Define the user commands to manage the taglist window -+ command! -nargs=0 -bar TlistToggle call s:Tlist_Window_Toggle() -+ command! -nargs=0 -bar TlistOpen call s:Tlist_Window_Open() -+ " For backwards compatiblity define the Tlist command -+ command! -nargs=0 -bar Tlist TlistToggle -+ command! -nargs=+ -complete=file TlistAddFiles -+ \ call s:Tlist_Add_Files() -+ command! -nargs=+ -complete=dir TlistAddFilesRecursive -+ \ call s:Tlist_Add_Files_Recursive() -+ command! -nargs=0 -bar TlistClose call s:Tlist_Window_Close() -+ command! -nargs=0 -bar TlistUpdate call s:Tlist_Update_Current_File() -+ command! -nargs=0 -bar TlistHighlightTag call s:Tlist_Window_Highlight_Tag( -+ \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1) -+ " For backwards compatiblity define the TlistSync command -+ command! -nargs=0 -bar TlistSync TlistHighlightTag -+ command! -nargs=* -complete=buffer TlistShowPrototype -+ \ echo Tlist_Get_Tag_Prototype_By_Line() -+ command! -nargs=* -complete=buffer TlistShowTag -+ \ echo Tlist_Get_Tagname_By_Line() -+ command! -nargs=* -complete=file TlistSessionLoad -+ \ call s:Tlist_Session_Load() -+ command! -nargs=* -complete=file TlistSessionSave -+ \ call s:Tlist_Session_Save() -+ command! -bar TlistLock let Tlist_Auto_Update=0 -+ command! -bar TlistUnlock let Tlist_Auto_Update=1 -+ -+ " Commands for enabling/disabling debug and to display debug messages -+ command! -nargs=? -complete=file -bar TlistDebug -+ \ call s:Tlist_Debug_Enable() -+ command! -nargs=0 -bar TlistUndebug call s:Tlist_Debug_Disable() -+ command! -nargs=0 -bar TlistMessages call s:Tlist_Debug_Show() -+ -+ " Define autocommands to autoload the taglist plugin when needed. -+ -+ " Trick to get the current script ID -+ map xx xx -+ let s:tlist_sid = substitute(maparg('xx'), '\(\d\+_\)xx$', -+ \ '\1', '') -+ unmap xx -+ -+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Window_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Menu_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined Tlist_* source ' . -+ \ escape(expand(''), ' ') -+ exe 'autocmd FuncUndefined TagList_* source ' . -+ \ escape(expand(''), ' ') -+ -+ let loaded_taglist = 'fast_load_done' -+ -+ if g:Tlist_Show_Menu && has('gui_running') -+ call s:Tlist_Menu_Init() -+ endif -+ -+ " restore 'cpo' -+ let &cpo = s:cpo_save -+ finish -+endif -+ -+if !exists('s:tlist_sid') -+ " Two or more versions of taglist plugin are installed. Don't -+ " load this version of the plugin. -+ finish -+endif -+ -+unlet! s:tlist_sid -+ -+if loaded_taglist != 'fast_load_done' -+ " restore 'cpo' -+ let &cpo = s:cpo_save -+ finish -+endif -+ -+" Taglist plugin functionality is available -+let loaded_taglist = 'available' -+ -+"------------------- end of user configurable options -------------------- -+ -+" Default language specific settings for supported file types and tag types -+" -+" Variable name format: -+" -+" s:tlist_def_{vim_ftype}_settings -+" -+" vim_ftype - Filetype detected by Vim -+" -+" Value format: -+" -+" ;:;:;... -+" -+" ctags_ftype - File type supported by exuberant ctags -+" flag - Flag supported by exuberant ctags to generate a tag type -+" name - Name of the tag type used in the taglist window to display the -+" tags of this type -+" -+ -+" Ada language -+let s:tlist_def_ada_settings = 'ada;' . -+ \ 'P:package spec;' . -+ \ 'p:package body;' . -+ \ 'T:type spec;' . -+ \ 't:type;' . -+ \ 'U:subtype spec;' . -+ \ 'u:subtype;' . -+ \ 'c:component;' . -+ \ 'l:literal;' . -+ \ 'V:variable spec;' . -+ \ 'v:variable;' . -+ \ 'f:formal;' . -+ \ 'n:constant;' . -+ \ 'x:exception;' . -+ \ 'R:subprogram spec;' . -+ \ 'r:subprogram body;' . -+ \ 'K:task spec;' . -+ \ 'k:task body;' . -+ \ 'O:protected spec;' . -+ \ 'o:protected body;' . -+ \ 'E:entry spec;' . -+ \ 'e:entry body;' . -+ \ 'b:label;' . -+ \ 'i:identifier;' . -+ \ 'a:autovar;' . -+ \ 'y:annon' -+ -+" assembly language -+let s:tlist_def_asm_settings = 'asm;d:define;l:label;m:macro;t:type' -+ -+" aspperl language -+let s:tlist_def_aspperl_settings = 'asp;f:function;s:sub;v:variable' -+ -+" aspvbs language -+let s:tlist_def_aspvbs_settings = 'asp;f:function;s:sub;v:variable' -+ -+" awk language -+let s:tlist_def_awk_settings = 'awk;f:function' -+ -+" beta language -+let s:tlist_def_beta_settings = 'beta;f:fragment;s:slot;v:pattern' -+ -+" c language -+let s:tlist_def_c_settings = 'c;d:macro;g:enum;s:struct;u:union;t:typedef;' . -+ \ 'v:variable;f:function' -+ -+" c++ language -+let s:tlist_def_cpp_settings = 'c++;n:namespace;v:variable;d:macro;t:typedef;' . -+ \ 'c:class;g:enum;s:struct;u:union;f:function' -+ -+" c# language -+let s:tlist_def_cs_settings = 'c#;d:macro;t:typedef;n:namespace;c:class;' . -+ \ 'E:event;g:enum;s:struct;i:interface;' . -+ \ 'p:properties;m:method' -+ -+" cobol language -+let s:tlist_def_cobol_settings = 'cobol;d:data;f:file;g:group;p:paragraph;' . -+ \ 'P:program;s:section' -+ -+" eiffel language -+let s:tlist_def_eiffel_settings = 'eiffel;c:class;f:feature' -+ -+" erlang language -+let s:tlist_def_erlang_settings = 'erlang;d:macro;r:record;m:module;f:function' -+ -+" expect (same as tcl) language -+let s:tlist_def_expect_settings = 'tcl;c:class;f:method;p:procedure' -+ -+" fortran language -+let s:tlist_def_fortran_settings = 'fortran;p:program;b:block data;' . -+ \ 'c:common;e:entry;i:interface;k:type;l:label;m:module;' . -+ \ 'n:namelist;t:derived;v:variable;f:function;s:subroutine' -+ -+" HTML language -+let s:tlist_def_html_settings = 'html;a:anchor;f:javascript function' -+ -+" java language -+let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' . -+ \ 'f:field;m:method' -+ -+" javascript language -+let s:tlist_def_javascript_settings = 'javascript;f:function' -+ -+" lisp language -+let s:tlist_def_lisp_settings = 'lisp;f:function' -+ -+" lua language -+let s:tlist_def_lua_settings = 'lua;f:function' -+ -+" makefiles -+let s:tlist_def_make_settings = 'make;m:macro' -+ -+" pascal language -+let s:tlist_def_pascal_settings = 'pascal;f:function;p:procedure' -+ -+" perl language -+let s:tlist_def_perl_settings = 'perl;c:constant;l:label;p:package;s:subroutine' -+ -+" php language -+let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function' -+ -+" python language -+let s:tlist_def_python_settings = 'python;c:class;m:member;f:function' -+ -+" rexx language -+let s:tlist_def_rexx_settings = 'rexx;s:subroutine' -+ -+" ruby language -+let s:tlist_def_ruby_settings = 'ruby;c:class;f:method;F:function;' . -+ \ 'm:singleton method' -+ -+" scheme language -+let s:tlist_def_scheme_settings = 'scheme;s:set;f:function' -+ -+" shell language -+let s:tlist_def_sh_settings = 'sh;f:function' -+ -+" C shell language -+let s:tlist_def_csh_settings = 'sh;f:function' -+ -+" Z shell language -+let s:tlist_def_zsh_settings = 'sh;f:function' -+ -+" slang language -+let s:tlist_def_slang_settings = 'slang;n:namespace;f:function' -+ -+" sml language -+let s:tlist_def_sml_settings = 'sml;e:exception;c:functor;s:signature;' . -+ \ 'r:structure;t:type;v:value;f:function' -+ -+" sql language -+let s:tlist_def_sql_settings = 'sql;c:cursor;F:field;P:package;r:record;' . -+ \ 's:subtype;t:table;T:trigger;v:variable;f:function;p:procedure' -+ -+" tcl language -+let s:tlist_def_tcl_settings = 'tcl;c:class;f:method;m:method;p:procedure' -+ -+" vera language -+let s:tlist_def_vera_settings = 'vera;c:class;d:macro;e:enumerator;' . -+ \ 'f:function;g:enum;m:member;p:program;' . -+ \ 'P:prototype;t:task;T:typedef;v:variable;' . -+ \ 'x:externvar' -+ -+"verilog language -+let s:tlist_def_verilog_settings = 'verilog;m:module;c:constant;P:parameter;' . -+ \ 'e:event;r:register;t:task;w:write;p:port;v:variable;f:function' -+ -+" vim language -+let s:tlist_def_vim_settings = 'vim;a:autocmds;v:variable;f:function' -+ -+" yacc language -+let s:tlist_def_yacc_settings = 'yacc;l:label' -+ -+"------------------- end of language specific options -------------------- -+ -+" Vim window size is changed by the taglist plugin or not -+let s:tlist_winsize_chgd = -1 -+" Taglist window is maximized or not -+let s:tlist_win_maximized = 0 -+" Name of files in the taglist -+let s:tlist_file_names='' -+" Number of files in the taglist -+let s:tlist_file_count = 0 -+" Number of filetypes supported by taglist -+let s:tlist_ftype_count = 0 -+" Is taglist part of other plugins like winmanager or cream? -+let s:tlist_app_name = "none" -+" Are we displaying brief help text -+let s:tlist_brief_help = 1 -+" List of files removed on user request -+let s:tlist_removed_flist = "" -+" Index of current file displayed in the taglist window -+let s:tlist_cur_file_idx = -1 -+" Taglist menu is empty or not -+let s:tlist_menu_empty = 1 -+ -+" An autocommand is used to refresh the taglist window when entering any -+" buffer. We don't want to refresh the taglist window if we are entering the -+" file window from one of the taglist functions. The 'Tlist_Skip_Refresh' -+" variable is used to skip the refresh of the taglist window and is set -+" and cleared appropriately. -+let s:Tlist_Skip_Refresh = 0 -+ -+" 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 -+ call setline('$', ' ') -+ endif -+ -+ if s:tlist_brief_help -+ " Add the brief help -+ call append(0, '" Press to display help text') -+ else -+ " Add the extensive help -+ call append(0, '" : Jump to tag definition') -+ call append(1, '" o : Jump to tag definition in new window') -+ call append(2, '" p : Preview the tag definition') -+ call append(3, '" : Display tag prototype') -+ call append(4, '" u : Update tag list') -+ call append(5, '" s : Select sort field') -+ call append(6, '" d : Remove file from taglist') -+ call append(7, '" x : Zoom-out/Zoom-in taglist window') -+ call append(8, '" + : Open a fold') -+ call append(9, '" - : Close a fold') -+ call append(10, '" * : Open all folds') -+ call append(11, '" = : Close all folds') -+ 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') -+ endif -+endfunction -+ -+" Tlist_Window_Toggle_Help_Text() -+" Toggle taglist plugin help text between the full version and the brief -+" version -+function! s:Tlist_Window_Toggle_Help_Text() -+ if g:Tlist_Compact_Format -+ " In compact display mode, do not display help -+ return -+ endif -+ -+ " Include the empty line displayed after the help text -+ let brief_help_size = 1 -+ let full_help_size = 16 -+ -+ setlocal modifiable -+ -+ " Set report option to a huge value to prevent informational messages -+ " while deleting the lines -+ let old_report = &report -+ set report=99999 -+ -+ " Remove the currently highlighted tag. Otherwise, the help text -+ " might be highlighted by mistake -+ match none -+ -+ " Toggle between brief and full help text -+ if s:tlist_brief_help -+ let s:tlist_brief_help = 0 -+ -+ " Remove the previous help -+ exe '1,' . brief_help_size . ' delete _' -+ -+ " Adjust the start/end line numbers for the files -+ call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) -+ else -+ let s:tlist_brief_help = 1 -+ -+ " Remove the previous help -+ exe '1,' . full_help_size . ' delete _' -+ -+ " Adjust the start/end line numbers for the files -+ call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) -+ endif -+ -+ call s:Tlist_Window_Display_Help() -+ -+ " Restore the report option -+ let &report = old_report -+ -+ setlocal nomodifiable -+endfunction -+ -+" Taglist debug support -+let s:tlist_debug = 0 -+ -+" File for storing the debug messages -+let s:tlist_debug_file = '' -+ -+" Tlist_Debug_Enable -+" Enable logging of taglist debug messages. -+function! s:Tlist_Debug_Enable(...) -+ let s:tlist_debug = 1 -+ -+ " Check whether a valid file name is supplied. -+ if a:1 != '' -+ let s:tlist_debug_file = fnamemodify(a:1, ':p') -+ -+ " Empty the log file -+ exe 'redir! > ' . s:tlist_debug_file -+ redir END -+ -+ " Check whether the log file is present/created -+ if !filewritable(s:tlist_debug_file) -+ call s:Tlist_Warning_Msg('Taglist: Unable to create log file ' -+ \ . s:tlist_debug_file) -+ let s:tlist_debug_file = '' -+ endif -+ endif -+endfunction -+ -+" Tlist_Debug_Disable -+" Disable logging of taglist debug messages. -+function! s:Tlist_Debug_Disable(...) -+ let s:tlist_debug = 0 -+ let s:tlist_debug_file = '' -+endfunction -+ -+" Tlist_Debug_Show -+" Display the taglist debug messages in a new window -+function! s:Tlist_Debug_Show() -+ if s:tlist_msg == '' -+ call s:Tlist_Warning_Msg('Taglist: No debug messages') -+ return -+ endif -+ -+ " Open a new window to display the taglist debug messages -+ new taglist_debug.txt -+ " Delete all the lines (if the buffer already exists) -+ silent! %delete _ -+ " Add the messages -+ silent! put =s:tlist_msg -+ " Move the cursor to the first line -+ normal! gg -+endfunction -+ -+" Tlist_Log_Msg -+" Log the supplied debug message along with the time -+function! s:Tlist_Log_Msg(msg) -+ if s:tlist_debug -+ if s:tlist_debug_file != '' -+ exe 'redir >> ' . s:tlist_debug_file -+ silent echon strftime('%H:%M:%S') . ': ' . a:msg . "\n" -+ redir END -+ else -+ " Log the message into a variable -+ " Retain only the last 3000 characters -+ let len = strlen(s:tlist_msg) -+ if len > 3000 -+ let s:tlist_msg = strpart(s:tlist_msg, len - 3000) -+ endif -+ let s:tlist_msg = s:tlist_msg . strftime('%H:%M:%S') . ': ' . -+ \ a:msg . "\n" -+ endif -+ endif -+endfunction -+ -+" Tlist_Warning_Msg() -+" Display a message using WarningMsg highlight group -+function! s:Tlist_Warning_Msg(msg) -+ echohl WarningMsg -+ echomsg a:msg -+ echohl None -+endfunction -+ -+" Last returned file index for file name lookup. -+" Used to speed up file lookup -+let s:tlist_file_name_idx_cache = -1 -+ -+" Tlist_Get_File_Index() -+" Return the index of the specified filename -+function! s:Tlist_Get_File_Index(fname) -+ if s:tlist_file_count == 0 || a:fname == '' -+ return -1 -+ endif -+ -+ " If the new filename is same as the last accessed filename, then -+ " return that index -+ if s:tlist_file_name_idx_cache != -1 && -+ \ s:tlist_file_name_idx_cache < s:tlist_file_count -+ if s:tlist_{s:tlist_file_name_idx_cache}_filename == a:fname -+ " Same as the last accessed file -+ return s:tlist_file_name_idx_cache -+ endif -+ endif -+ -+ " First, check whether the filename is present -+ let s_fname = a:fname . "\n" -+ let i = stridx(s:tlist_file_names, s_fname) -+ if i == -1 -+ let s:tlist_file_name_idx_cache = -1 -+ return -1 -+ endif -+ -+ " Second, compute the file name index -+ let nl_txt = substitute(strpart(s:tlist_file_names, 0, i), "[^\n]", '', 'g') -+ let s:tlist_file_name_idx_cache = strlen(nl_txt) -+ return s:tlist_file_name_idx_cache -+endfunction -+ -+" Last returned file index for line number lookup. -+" Used to speed up file lookup -+let s:tlist_file_lnum_idx_cache = -1 -+ -+" 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_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 -+ if s:tlist_file_lnum_idx_cache != -1 && -+ \ s:tlist_file_lnum_idx_cache < s:tlist_file_count -+ if a:lnum >= s:tlist_{s:tlist_file_lnum_idx_cache}_start && -+ \ a:lnum <= s:tlist_{s:tlist_file_lnum_idx_cache}_end -+ return s:tlist_file_lnum_idx_cache -+ endif -+ endif -+ -+ let fidx = -1 -+ -+ 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 -+ -+ endif -+ else -+ " 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 -+ -+ return fidx -+endfunction -+ -+" Tlist_Exe_Cmd_No_Acmds -+" Execute the specified Ex command after disabling autocommands -+function! s:Tlist_Exe_Cmd_No_Acmds(cmd) -+ let old_eventignore = &eventignore -+ set eventignore=all -+ exe a:cmd -+ let &eventignore = old_eventignore -+endfunction -+ -+" Tlist_Skip_File() -+" Check whether tag listing is supported for the specified file -+function! s:Tlist_Skip_File(filename, ftype) -+ " Skip buffers with no names and buffers with filetype not set -+ if a:filename == '' || a:ftype == '' -+ return 1 -+ endif -+ -+ " Skip files which are not supported by exuberant ctags -+ " First check whether default settings for this filetype are available. -+ " If it is not available, then check whether user specified settings are -+ " available. If both are not available, then don't list the tags for this -+ " filetype -+ let var = 's:tlist_def_' . a:ftype . '_settings' -+ if !exists(var) -+ let var = 'g:tlist_' . a:ftype . '_settings' -+ if !exists(var) -+ return 1 -+ endif -+ endif -+ -+ " Skip files which are not readable or files which are not yet stored -+ " to the disk -+ if !filereadable(a:filename) -+ return 1 -+ endif -+ -+ return 0 -+endfunction -+ -+" Tlist_User_Removed_File -+" Returns 1 if a file is removed by a user from the taglist -+function! s:Tlist_User_Removed_File(filename) -+ return stridx(s:tlist_removed_flist, a:filename . "\n") != -1 -+endfunction -+ -+" Tlist_Update_Remove_List -+" Update the list of user removed files from the taglist -+" add == 1, add the file to the removed list -+" add == 0, delete the file from the removed list -+function! s:Tlist_Update_Remove_List(filename, add) -+ if a:add -+ let s:tlist_removed_flist = s:tlist_removed_flist . a:filename . "\n" -+ else -+ let idx = stridx(s:tlist_removed_flist, a:filename . "\n") -+ let text_before = strpart(s:tlist_removed_flist, 0, idx) -+ let rem_text = strpart(s:tlist_removed_flist, idx) -+ let next_idx = stridx(rem_text, "\n") -+ let text_after = strpart(rem_text, next_idx + 1) -+ -+ let s:tlist_removed_flist = text_before . text_after -+ endif -+endfunction -+ -+" Tlist_FileType_Init -+" Initialize the ctags arguments and tag variable for the specified -+" file type -+function! s:Tlist_FileType_Init(ftype) -+ call s:Tlist_Log_Msg('Tlist_FileType_Init (' . a:ftype . ')') -+ " If the user didn't specify any settings, then use the default -+ " ctags args. Otherwise, use the settings specified by the user -+ let var = 'g:tlist_' . a:ftype . '_settings' -+ if exists(var) -+ " User specified ctags arguments -+ let settings = {var} . ';' -+ else -+ " Default ctags arguments -+ let var = 's:tlist_def_' . a:ftype . '_settings' -+ if !exists(var) -+ " No default settings for this file type. This filetype is -+ " not supported -+ return 0 -+ endif -+ let settings = s:tlist_def_{a:ftype}_settings . ';' -+ endif -+ -+ let msg = 'Taglist: Invalid ctags option setting - ' . settings -+ -+ " Format of the option that specifies the filetype and ctags arugments: -+ " -+ " ;flag1:name1;flag2:name2;flag3:name3 -+ " -+ -+ " Extract the file type to pass to ctags. This may be different from the -+ " file type detected by Vim -+ let pos = stridx(settings, ';') -+ if pos == -1 -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let ctags_ftype = strpart(settings, 0, pos) -+ if ctags_ftype == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ " Make sure a valid filetype is supplied. If the user didn't specify a -+ " valid filetype, then the ctags option settings may be treated as the -+ " filetype -+ if ctags_ftype =~ ':' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ -+ " Remove the file type from settings -+ let settings = strpart(settings, pos + 1) -+ if settings == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ -+ " Process all the specified ctags flags. The format is -+ " flag1:name1;flag2:name2;flag3:name3 -+ let ctags_flags = '' -+ let cnt = 0 -+ while settings != '' -+ " Extract the flag -+ let pos = stridx(settings, ':') -+ if pos == -1 -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let flag = strpart(settings, 0, pos) -+ if flag == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ " Remove the flag from settings -+ let settings = strpart(settings, pos + 1) -+ -+ " Extract the tag type name -+ let pos = stridx(settings, ';') -+ if pos == -1 -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let name = strpart(settings, 0, pos) -+ if name == '' -+ call s:Tlist_Warning_Msg(msg) -+ return 0 -+ endif -+ let settings = strpart(settings, pos + 1) -+ -+ let cnt = cnt + 1 -+ -+ let s:tlist_{a:ftype}_{cnt}_name = flag -+ let s:tlist_{a:ftype}_{cnt}_fullname = name -+ let ctags_flags = ctags_flags . flag -+ endwhile -+ -+ let s:tlist_{a:ftype}_ctags_args = '--language-force=' . ctags_ftype . -+ \ ' --' . ctags_ftype . '-types=' . ctags_flags -+ let s:tlist_{a:ftype}_count = cnt -+ let s:tlist_{a:ftype}_ctags_flags = ctags_flags -+ -+ " Save the filetype name -+ let s:tlist_ftype_{s:tlist_ftype_count}_name = a:ftype -+ let s:tlist_ftype_count = s:tlist_ftype_count + 1 -+ -+ return 1 -+endfunction -+ -+" Tlist_Get_Filetype -+" Determine the filetype for the specified file -+function! s:Tlist_Get_Filetype(fname) -+ " Ignore the filetype autocommands -+ let old_eventignore = &eventignore -+ set eventignore=FileType -+ -+ " Save the 'filetype', as this will be changed temporarily -+ let old_filetype = &filetype -+ -+ " Run the filetypedetect group of autocommands to determine -+ " the filetype -+ exe 'doautocmd filetypedetect BufRead ' . a:fname -+ -+ " Save the detected filetype -+ let ftype = &filetype -+ -+ " Restore the previous state -+ let &filetype = old_filetype -+ let &eventignore = old_eventignore -+ -+ return ftype -+endfunction -+ -+" Tlist_Get_Buffer_Filetype -+" Get the filetype for the specified buffer -+function! s:Tlist_Get_Buffer_Filetype(bnum) -+ if bufloaded(a:bnum) -+ " For loaded buffers, the 'filetype' is already determined -+ return getbufvar(a:bnum, '&filetype') -+ endif -+ -+ " For unloaded buffers, if the 'filetype' option is set, return it -+ let ftype = getbufvar(a:bnum, '&filetype') -+ if ftype != '' -+ return ftype -+ endif -+ -+ " Skip non-existent buffers -+ if !bufexists(a:bnum) -+ return '' -+ endif -+ -+ " For buffers whose filetype is not yet determined, try to determine -+ " the filetype -+ let bname = bufname(a:bnum) -+ -+ return s:Tlist_Get_Filetype(bname) -+endfunction -+ -+" Tlist_Discard_TagInfo -+" Discard the stored tag information for a file -+function! s:Tlist_Discard_TagInfo(fidx) -+ call s:Tlist_Log_Msg('Tlist_Discard_TagInfo (' . -+ \ s:tlist_{a:fidx}_filename . ')') -+ let ftype = s:tlist_{a:fidx}_filetype -+ -+ " Discard information about the tags defined in the file -+ let i = 1 -+ while i <= s:tlist_{a:fidx}_tag_count -+ let fidx_i = 's:tlist_' . a:fidx . '_' . i -+ unlet! {fidx_i}_tag -+ unlet! {fidx_i}_tag_name -+ unlet! {fidx_i}_tag_type -+ unlet! {fidx_i}_ttype_idx -+ unlet! {fidx_i}_tag_proto -+ unlet! {fidx_i}_tag_searchpat -+ unlet! {fidx_i}_tag_linenum -+ let i = i + 1 -+ endwhile -+ -+ let s:tlist_{a:fidx}_tag_count = 0 -+ -+ " Discard information about tag type groups -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{i}_name -+ if s:tlist_{a:fidx}_{ttype} != '' -+ let fidx_ttype = 's:tlist_' . a:fidx . '_' . ttype -+ let {fidx_ttype} = '' -+ let {fidx_ttype}_offset = 0 -+ let cnt = {fidx_ttype}_count -+ let {fidx_ttype}_count = 0 -+ let j = 1 -+ while j <= cnt -+ unlet! {fidx_ttype}_{j} -+ let j = j + 1 -+ endwhile -+ endif -+ let i = i + 1 -+ endwhile -+ -+ " Discard the stored menu command also -+ let s:tlist_{a:fidx}_menu_cmd = '' -+endfunction -+ -+" 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_Window_Update_Line_Offsets(start_idx, increment, offset) -+ let i = a:start_idx -+ -+ while i < s:tlist_file_count -+ if s:tlist_{i}_visible -+ " Update the start/end line number only if the file is visible -+ if a:increment -+ let s:tlist_{i}_start = s:tlist_{i}_start + a:offset -+ let s:tlist_{i}_end = s:tlist_{i}_end + a:offset -+ else -+ let s:tlist_{i}_start = s:tlist_{i}_start - a:offset -+ let s:tlist_{i}_end = s:tlist_{i}_end - a:offset -+ endif -+ endif -+ let i = i + 1 -+ endwhile -+endfunction -+ -+" Tlist_Discard_FileInfo -+" Discard the stored information for a file -+function! s:Tlist_Discard_FileInfo(fidx) -+ call s:Tlist_Log_Msg('Tlist_Discard_FileInfo (' . -+ \ s:tlist_{a:fidx}_filename . ')') -+ call s:Tlist_Discard_TagInfo(a:fidx) -+ -+ let ftype = s:tlist_{a:fidx}_filetype -+ -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{i}_name -+ unlet! s:tlist_{a:fidx}_{ttype} -+ unlet! s:tlist_{a:fidx}_{ttype}_offset -+ unlet! s:tlist_{a:fidx}_{ttype}_count -+ let i = i + 1 -+ endwhile -+ -+ unlet! s:tlist_{a:fidx}_filename -+ unlet! s:tlist_{a:fidx}_sort_type -+ unlet! s:tlist_{a:fidx}_filetype -+ unlet! s:tlist_{a:fidx}_mtime -+ unlet! s:tlist_{a:fidx}_start -+ unlet! s:tlist_{a:fidx}_end -+ unlet! s:tlist_{a:fidx}_valid -+ unlet! s:tlist_{a:fidx}_visible -+ unlet! s:tlist_{a:fidx}_tag_count -+ unlet! s:tlist_{a:fidx}_menu_cmd -+endfunction -+ -+" Tlist_Window_Remove_File_From_Display -+" Remove the specified 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 -+ return -+ endif -+ -+ " Remove the tags displayed for the specified file from the window -+ let start = s:tlist_{a:fidx}_start -+ " Include the empty line after the last line also -+ if g:Tlist_Compact_Format -+ let end = s:tlist_{a:fidx}_end -+ else -+ let end = s:tlist_{a:fidx}_end + 1 -+ endif -+ -+ setlocal modifiable -+ exe 'silent! ' . start . ',' . end . 'delete _' -+ setlocal nomodifiable -+ -+ " 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_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) -+endfunction -+ -+" Tlist_Remove_File -+" Remove the file under the cursor or the specified file index -+" user_request - User requested to remove the file from taglist -+function! s:Tlist_Remove_File(file_idx, user_request) -+ let fidx = a:file_idx -+ -+ if fidx == -1 -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ endif -+ call s:Tlist_Log_Msg('Tlist_Remove_File (' . -+ \ s:tlist_{fidx}_filename . ', ' . a:user_request . ')') -+ -+ let save_winnr = winnr() -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ " Taglist window is open, remove the file from display -+ -+ if save_winnr != winnum -+ let old_eventignore = &eventignore -+ set eventignore=all -+ exe winnum . 'wincmd w' -+ endif -+ -+ call s:Tlist_Window_Remove_File_From_Display(fidx) -+ -+ if save_winnr != winnum -+ exe save_winnr . 'wincmd w' -+ let &eventignore = old_eventignore -+ endif -+ endif -+ -+ let fname = s:tlist_{fidx}_filename -+ -+ if a:user_request -+ " As the user requested to remove the file from taglist, -+ " add it to the removed list -+ call s:Tlist_Update_Remove_List(fname, 1) -+ endif -+ -+ " Remove the file name from the taglist list of filenames -+ let idx = stridx(s:tlist_file_names, fname . "\n") -+ let text_before = strpart(s:tlist_file_names, 0, idx) -+ let rem_text = strpart(s:tlist_file_names, idx) -+ let next_idx = stridx(rem_text, "\n") -+ let text_after = strpart(rem_text, next_idx + 1) -+ let s:tlist_file_names = text_before . text_after -+ -+ call s:Tlist_Discard_FileInfo(fidx) -+ -+ " Shift all the file variables by one index -+ let i = fidx + 1 -+ -+ while i < s:tlist_file_count -+ let j = i - 1 -+ -+ let s:tlist_{j}_filename = s:tlist_{i}_filename -+ let s:tlist_{j}_sort_type = s:tlist_{i}_sort_type -+ let s:tlist_{j}_filetype = s:tlist_{i}_filetype -+ let s:tlist_{j}_mtime = s:tlist_{i}_mtime -+ let s:tlist_{j}_start = s:tlist_{i}_start -+ let s:tlist_{j}_end = s:tlist_{i}_end -+ let s:tlist_{j}_valid = s:tlist_{i}_valid -+ let s:tlist_{j}_visible = s:tlist_{i}_visible -+ let s:tlist_{j}_tag_count = s:tlist_{i}_tag_count -+ let s:tlist_{j}_menu_cmd = s:tlist_{i}_menu_cmd -+ -+ let k = 1 -+ while k <= s:tlist_{j}_tag_count -+ let s:tlist_{j}_{k}_tag = s:tlist_{i}_{k}_tag -+ let s:tlist_{j}_{k}_tag_name = s:tlist_{i}_{k}_tag_name -+ let s:tlist_{j}_{k}_tag_type = s:Tlist_Get_Tag_Type_By_Tag(i, k) -+ let s:tlist_{j}_{k}_ttype_idx = s:tlist_{i}_{k}_ttype_idx -+ let s:tlist_{j}_{k}_tag_proto = s:Tlist_Get_Tag_Prototype(i, k) -+ let s:tlist_{j}_{k}_tag_searchpat = s:Tlist_Get_Tag_SearchPat(i, k) -+ let s:tlist_{j}_{k}_tag_linenum = s:Tlist_Get_Tag_Linenum(i, k) -+ let k = k + 1 -+ endwhile -+ -+ let ftype = s:tlist_{i}_filetype -+ -+ let k = 1 -+ while k <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{k}_name -+ let s:tlist_{j}_{ttype} = s:tlist_{i}_{ttype} -+ let s:tlist_{j}_{ttype}_offset = s:tlist_{i}_{ttype}_offset -+ let s:tlist_{j}_{ttype}_count = s:tlist_{i}_{ttype}_count -+ if s:tlist_{j}_{ttype} != '' -+ let l = 1 -+ while l <= s:tlist_{j}_{ttype}_count -+ let s:tlist_{j}_{ttype}_{l} = s:tlist_{i}_{ttype}_{l} -+ let l = l + 1 -+ endwhile -+ endif -+ let k = k + 1 -+ endwhile -+ -+ " As the file and tag information is copied to the new index, -+ " discard the previous information -+ call s:Tlist_Discard_FileInfo(i) -+ -+ let i = i + 1 -+ endwhile -+ -+ " Reduce the number of files displayed -+ let s:tlist_file_count = s:tlist_file_count - 1 -+ -+ if g:Tlist_Show_One_File -+ " If the tags for only one file is displayed and if we just -+ " now removed that file, then invalidate the current file idx -+ if s:tlist_cur_file_idx == fidx -+ let s:tlist_cur_file_idx = -1 -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Goto_Window -+" Goto the taglist window -+function! s:Tlist_Window_Goto_Window() -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ if winnr() != winnum -+ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Create -+" Create a new taglist window. If it is already open, jump to it -+function! s:Tlist_Window_Create() -+ call s:Tlist_Log_Msg('Tlist_Window_Create()') -+ " If the window is open, jump to it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ " Jump to the existing window -+ if winnr() != winnum -+ exe winnum . 'wincmd w' -+ endif -+ return -+ endif -+ -+ " If used with winmanager don't open windows. Winmanager will handle -+ " the window/buffer management -+ if s:tlist_app_name == "winmanager" -+ return -+ endif -+ -+ " Create a new window. If user prefers a horizontal window, then open -+ " a horizontally split window. Otherwise open a vertically split -+ " window -+ if g:Tlist_Use_Horiz_Window -+ " Open a horizontally split window -+ let win_dir = 'botright' -+ " Horizontal window height -+ let win_size = g:Tlist_WinHeight -+ else -+ if s:tlist_winsize_chgd == -1 -+ " Open a vertically split window. Increase the window size, if -+ " needed, to accomodate the new window -+ if g:Tlist_Inc_Winwidth && -+ \ &columns < (80 + g:Tlist_WinWidth) -+ " Save the original window position -+ let s:tlist_pre_winx = getwinposx() -+ let s:tlist_pre_winy = getwinposy() -+ -+ " one extra column is needed to include the vertical split -+ let &columns= &columns + g:Tlist_WinWidth + 1 -+ -+ let s:tlist_winsize_chgd = 1 -+ else -+ let s:tlist_winsize_chgd = 0 -+ endif -+ endif -+ -+ if g:Tlist_Use_Right_Window -+ " Open the window at the rightmost place -+ let win_dir = 'botright vertical' -+ else -+ " Open the window at the leftmost place -+ let win_dir = 'topleft vertical' -+ endif -+ let win_size = g:Tlist_WinWidth -+ endif -+ -+ " If the tag listing temporary buffer already exists, then reuse it. -+ " Otherwise create a new buffer -+ let bufnum = bufnr(g:TagList_title) -+ if bufnum == -1 -+ " Create a new buffer -+ let wcmd = g:TagList_title -+ else -+ " Edit the existing buffer -+ let wcmd = '+buffer' . bufnum -+ endif -+ -+ " Create the taglist window -+ exe 'silent! ' . win_dir . ' ' . win_size . 'split ' . wcmd -+ -+ " Save the new window position -+ let s:tlist_winx = getwinposx() -+ let s:tlist_winy = getwinposy() -+ -+ " Initialize the taglist window -+ call s:Tlist_Window_Init() -+endfunction -+ -+" Tlist_Window_Zoom -+" Zoom (maximize/minimize) the taglist window -+function! s:Tlist_Window_Zoom() -+ if s:tlist_win_maximized -+ " Restore the window back to the previous size -+ if g:Tlist_Use_Horiz_Window -+ exe 'resize ' . g:Tlist_WinHeight -+ else -+ exe 'vert resize ' . g:Tlist_WinWidth -+ endif -+ let s:tlist_win_maximized = 0 -+ else -+ " Set the window size to the maximum possible without closing other -+ " windows -+ if g:Tlist_Use_Horiz_Window -+ resize -+ else -+ vert resize -+ endif -+ let s:tlist_win_maximized = 1 -+ endif -+endfunction -+ -+" Tlist_Ballon_Expr -+" When the mouse cursor is over a tag in the taglist window, display the -+" tag prototype (balloon) -+function! Tlist_Ballon_Expr() -+ " Get the file index -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(v:beval_lnum) -+ if fidx == -1 -+ return '' -+ endif -+ -+ " Get the tag output line for the current tag -+ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, v:beval_lnum) -+ if tidx == 0 -+ return '' -+ endif -+ -+ " Get the tag search pattern and display it -+ return s:Tlist_Get_Tag_Prototype(fidx, tidx) -+endfunction -+ -+" Tlist_Window_Check_Width -+" Check the width of the taglist window. For horizontally split windows, the -+" 'winfixheight' option is used to fix the height of the window. For -+" vertically split windows, Vim doesn't support the 'winfixwidth' option. So -+" need to handle window width changes from this function. -+function! s:Tlist_Window_Check_Width() -+ let tlist_winnr = bufwinnr(g:TagList_title) -+ if tlist_winnr == -1 -+ return -+ endif -+ -+ let width = winwidth(tlist_winnr) -+ if width != g:Tlist_WinWidth -+ call s:Tlist_Log_Msg("Tlist_Window_Check_Width: Changing window " . -+ \ "width from " . width . " to " . g:Tlist_WinWidth) -+ let save_winnr = winnr() -+ if save_winnr != tlist_winnr -+ call s:Tlist_Exe_Cmd_No_Acmds(tlist_winnr . 'wincmd w') -+ endif -+ exe 'vert resize ' . g:Tlist_WinWidth -+ if save_winnr != tlist_winnr -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Exit_Only_Window -+" If the 'Tlist_Exit_OnlyWindow' option is set, then exit Vim if only the -+" taglist window is present. -+function! s:Tlist_Window_Exit_Only_Window() -+ " Before quitting Vim, delete the taglist buffer so that -+ " the '0 mark is correctly set to the previous buffer. -+ if v:version < 700 -+ if winbufnr(2) == -1 -+ bdelete -+ quit -+ endif -+ else -+ if winbufnr(2) == -1 -+ if tabpagenr('$') == 1 -+ " Only one tag page is present -+ bdelete -+ quit -+ else -+ " More than one tab page is present. Close only the current -+ " tab page -+ close -+ endif -+ endif -+ endif -+endfunction -+ -+" Tlist_Window_Init -+" Set the default options for the taglist window -+function! s:Tlist_Window_Init() -+ call s:Tlist_Log_Msg('Tlist_Window_Init()') -+ -+ " The 'readonly' option should not be set for the taglist buffer. -+ " If Vim is started as "view/gview" or if the ":view" command is -+ " used, then the 'readonly' option is set for all the buffers. -+ " Unset it for the taglist buffer -+ setlocal noreadonly -+ -+ " Set the taglist buffer filetype to taglist -+ setlocal filetype=taglist -+ -+ " Define taglist window element highlighting -+ syntax match TagListComment '^" .*' -+ syntax match TagListFileName '^[^" ].*$' -+ syntax match TagListTitle '^ \S.*$' -+ syntax match TagListTagScope '\s\[.\{-\}\]$' -+ -+ " Define the highlighting only if colors are supported -+ if has('gui_running') || &t_Co > 2 -+ " 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 default link TagListTagName Search -+ endif -+ " Colors to highlight comments and titles -+ if hlexists('MyTagListComment') -+ highlight link TagListComment MyTagListComment -+ else -+ highlight clear TagListComment -+ highlight default link TagListComment Comment -+ endif -+ if hlexists('MyTagListTitle') -+ highlight link TagListTitle MyTagListTitle -+ else -+ highlight clear TagListTitle -+ highlight default link TagListTitle Title -+ endif -+ if hlexists('MyTagListFileName') -+ highlight link TagListFileName MyTagListFileName -+ else -+ highlight clear TagListFileName -+ highlight default TagListFileName guibg=Grey ctermbg=darkgray -+ \ guifg=white ctermfg=white -+ endif -+ if hlexists('MyTagListTagScope') -+ highlight link TagListTagScope MyTagListTagScope -+ else -+ highlight clear TagListTagScope -+ highlight default link TagListTagScope Identifier -+ endif -+ else -+ highlight default TagListTagName term=reverse cterm=reverse -+ endif -+ -+ " Folding related settings -+ setlocal foldenable -+ setlocal foldminlines=0 -+ setlocal foldmethod=manual -+ setlocal foldlevel=9999 -+ if g:Tlist_Enable_Fold_Column -+ setlocal foldcolumn=3 -+ else -+ setlocal foldcolumn=0 -+ endif -+ setlocal foldtext=v:folddashes.getline(v:foldstart) -+ -+ if s:tlist_app_name != "winmanager" -+ " Mark buffer as scratch -+ silent! setlocal buftype=nofile -+ if s:tlist_app_name == "none" -+ silent! setlocal bufhidden=delete -+ endif -+ silent! setlocal noswapfile -+ " Due to a bug in Vim 6.0, the winbufnr() function fails for unlisted -+ " buffers. So if the taglist buffer is unlisted, multiple taglist -+ " windows will be opened. This bug is fixed in Vim 6.1 and above -+ if v:version >= 601 -+ silent! setlocal nobuflisted -+ endif -+ endif -+ -+ silent! setlocal nowrap -+ -+ " If the 'number' option is set in the source window, it will affect the -+ " taglist window. So forcefully disable 'number' option for the taglist -+ " window -+ silent! setlocal nonumber -+ -+ " Use fixed height when horizontally split window is used -+ if g:Tlist_Use_Horiz_Window -+ if v:version >= 602 -+ set winfixheight -+ endif -+ endif -+ if !g:Tlist_Use_Horiz_Window && v:version >= 700 -+ set winfixwidth -+ endif -+ -+ " Setup balloon evaluation to display tag prototype -+ if v:version >= 700 && has('balloon_eval') -+ setlocal balloonexpr=Tlist_Ballon_Expr() -+ set ballooneval -+ 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_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 -+ nnoremap - :silent! foldclose -+ nnoremap * :silent! %foldopen! -+ nnoremap = :silent! %foldclose -+ nnoremap :silent! foldopen -+ nnoremap :silent! foldclose -+ nnoremap :silent! %foldopen! -+ 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_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_Window_Jump_To_Tag('useopen') -+ " Windows needs return -+ 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 -+ inoremap - :silent! foldclose -+ inoremap * :silent! %foldopen! -+ inoremap = :silent! %foldclose -+ inoremap :silent! foldopen -+ inoremap :silent! foldclose -+ inoremap :silent! %foldopen! -+ inoremap :call -+ \ 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_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 -+ if g:Tlist_Use_SingleClick == 1 -+ " Contributed by Bindu Wavell -+ " attempt to perform single click mapping, it would be much -+ " nicer if we could nnoremap ... however vim does -+ " not fire the when you use the mouse -+ " to enter a buffer. -+ let clickmap = ':if bufname("%") =~ "__Tag_List__" ' . -+ \ 'call Tlist_Window_Jump_To_Tag("useopen") ' . -+ \ ' endif ' -+ if maparg('', 'n') == '' -+ " no mapping for leftmouse -+ exe ':nnoremap ' . clickmap -+ else -+ " we have a mapping -+ let mapcmd = ':nnoremap ' -+ let mapcmd = mapcmd . substitute(substitute( -+ \ maparg('', 'n'), '|', '', 'g'), -+ \ '\c^', '', '') -+ let mapcmd = mapcmd . clickmap -+ exe mapcmd -+ endif -+ endif -+ -+ " Define the taglist autocommands -+ augroup TagListAutoCmds -+ autocmd! -+ " Display the tag prototype for the tag under the cursor. -+ autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info() -+ " Highlight the current tag periodically -+ 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 -+ autocmd BufUnload __Tag_List__ call s:Tlist_Post_Close_Cleanup() -+ " 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('')) -+ endif -+ " Exit Vim itself if only the taglist window is present (optional) -+ if g:Tlist_Exit_OnlyWindow -+ autocmd BufEnter __Tag_List__ nested -+ \ call s:Tlist_Window_Exit_Only_Window() -+ endif -+ if s:tlist_app_name != "winmanager" && -+ \ !g:Tlist_Process_File_Always && -+ \ (!has('gui_running') || !g:Tlist_Show_Menu) -+ " Auto refresh the taglist window -+ autocmd BufEnter * call s:Tlist_Refresh() -+ endif -+ -+ if !g:Tlist_Use_Horiz_Window -+ if v:version < 700 -+ autocmd WinEnter * call s:Tlist_Window_Check_Width() -+ endif -+ endif -+ augroup end -+ -+ " Restore the previous cpoptions settings -+ let &cpoptions = old_cpoptions -+endfunction -+ -+" Tlist_Window_Refresh -+" Display the tags for all the files in the taglist window -+function! s:Tlist_Window_Refresh() -+ call s:Tlist_Log_Msg('Tlist_Window_Refresh()') -+ " Set report option to a huge value to prevent informational messages -+ " while deleting the lines -+ let old_report = &report -+ set report=99999 -+ -+ " Mark the buffer as modifiable -+ setlocal modifiable -+ -+ " Delete the contents of the buffer to the black-hole register -+ silent! %delete _ -+ -+ " As we have cleared the taglist window, mark all the files -+ " as not visible -+ let i = 0 -+ while i < s:tlist_file_count -+ let s:tlist_{i}_visible = 0 -+ let i = i + 1 -+ endwhile -+ -+ if g:Tlist_Compact_Format == 0 -+ " Display help in non-compact mode -+ call s:Tlist_Window_Display_Help() -+ endif -+ -+ " Mark the buffer as not modifiable -+ setlocal nomodifiable -+ -+ " Restore the report option -+ let &report = old_report -+ -+ " If the tags for only one file should be displayed in the taglist -+ " window, then no need to add the tags here. The bufenter autocommand -+ " will add the tags for that file. -+ if g:Tlist_Show_One_File -+ return -+ endif -+ -+ " List all the tags for the previously processed files -+ " Do this only if taglist is configured to display tags for more than -+ " one file. Otherwise, when Tlist_Show_One_File is configured, -+ " tags for the wrong file will be displayed. -+ let i = 0 -+ while i < s:tlist_file_count -+ call s:Tlist_Window_Refresh_File(s:tlist_{i}_filename, -+ \ s:tlist_{i}_filetype) -+ let i = i + 1 -+ endwhile -+ -+ if g:Tlist_Auto_Update -+ " Add and list the tags for all buffers in the Vim buffer list -+ let i = 1 -+ let last_bufnum = bufnr('$') -+ while i <= last_bufnum -+ if buflisted(i) -+ let fname = fnamemodify(bufname(i), ':p') -+ let ftype = s:Tlist_Get_Buffer_Filetype(i) -+ " If the file doesn't support tag listing, skip it -+ if !s:Tlist_Skip_File(fname, ftype) -+ call s:Tlist_Window_Refresh_File(fname, ftype) -+ endif -+ endif -+ let i = i + 1 -+ endwhile -+ endif -+ -+ " If Tlist_File_Fold_Auto_Close option is set, then close all the folds -+ if g:Tlist_File_Fold_Auto_Close -+ " Close all the folds -+ silent! %foldclose -+ endif -+ -+ " Move the cursor to the top of the taglist window -+ normal! gg -+endfunction -+ -+" Tlist_Post_Close_Cleanup() -+" Close the taglist window and adjust the Vim window width -+function! s:Tlist_Post_Close_Cleanup() -+ call s:Tlist_Log_Msg('Tlist_Post_Close_Cleanup()') -+ " Mark all the files as not visible -+ let i = 0 -+ while i < s:tlist_file_count -+ let s:tlist_{i}_visible = 0 -+ let i = i + 1 -+ endwhile -+ -+ " Remove the taglist autocommands -+ silent! autocmd! TagListAutoCmds -+ -+ " Clear all the highlights -+ match none -+ -+ silent! syntax clear TagListTitle -+ silent! syntax clear TagListComment -+ silent! syntax clear TagListTagScope -+ -+ " Remove the left mouse click mapping if it was setup initially -+ if g:Tlist_Use_SingleClick -+ if hasmapto('') -+ nunmap -+ endif -+ endif -+ -+ if s:tlist_app_name != "winmanager" -+ if g:Tlist_Use_Horiz_Window || g:Tlist_Inc_Winwidth == 0 || -+ \ s:tlist_winsize_chgd != 1 || -+ \ &columns < (80 + g:Tlist_WinWidth) -+ " No need to adjust window width if using horizontally split taglist -+ " window or if columns is less than 101 or if the user chose not to -+ " adjust the window width -+ else -+ " If the user didn't manually move the window, then restore the window -+ " position to the pre-taglist position -+ if s:tlist_pre_winx != -1 && s:tlist_pre_winy != -1 && -+ \ getwinposx() == s:tlist_winx && -+ \ getwinposy() == s:tlist_winy -+ exe 'winpos ' . s:tlist_pre_winx . ' ' . s:tlist_pre_winy -+ endif -+ -+ " Adjust the Vim window width -+ let &columns= &columns - (g:Tlist_WinWidth + 1) -+ endif -+ endif -+ -+ let s:tlist_winsize_chgd = -1 -+ -+ " Reset taglist state variables -+ if s:tlist_app_name == "winmanager" -+ let s:tlist_app_name = "none" -+ endif -+ let s:tlist_window_initialized = 0 -+endfunction -+ -+" Tlist_Window_Refresh_File() -+" List the tags defined in the specified file in a Vim window -+function! s:Tlist_Window_Refresh_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Window_Refresh_File (' . a:filename . ')') -+ " First check whether the file already exists -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx != -1 -+ let file_listed = 1 -+ else -+ let file_listed = 0 -+ endif -+ -+ if !file_listed -+ " Check whether this file is removed based on user request -+ " If it is, then don't display the tags for this file -+ if s:Tlist_User_Removed_File(a:filename) -+ return -+ endif -+ endif -+ -+ if file_listed && s:tlist_{fidx}_visible -+ " Check whether the file tags are currently valid -+ if s:tlist_{fidx}_valid -+ " Goto the first line in the file -+ exe s:tlist_{fidx}_start -+ -+ " If the line is inside a fold, open the fold -+ if foldclosed('.') != -1 -+ exe "silent! " . s:tlist_{fidx}_start . "," . -+ \ s:tlist_{fidx}_end . "foldopen!" -+ endif -+ return -+ endif -+ -+ " Discard and remove the tags for this file from display -+ call s:Tlist_Discard_TagInfo(fidx) -+ call s:Tlist_Window_Remove_File_From_Display(fidx) -+ endif -+ -+ " Process and generate a list of tags defined in the file -+ if !file_listed || !s:tlist_{fidx}_valid -+ let ret_fidx = s:Tlist_Process_File(a:filename, a:ftype) -+ if ret_fidx == -1 -+ return -+ endif -+ let fidx = ret_fidx -+ endif -+ -+ " Set report option to a huge value to prevent informational messages -+ " while adding lines to the taglist window -+ let old_report = &report -+ set report=99999 -+ -+ if g:Tlist_Show_One_File -+ " Remove the previous file -+ if s:tlist_cur_file_idx != -1 -+ 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 -+ endif -+ let s:tlist_cur_file_idx = fidx -+ endif -+ -+ " Mark the buffer as modifiable -+ setlocal modifiable -+ -+ " Add new files to the end of the window. For existing files, add them at -+ " the same line where they were previously present. If the file is not -+ " visible, then add it at the end -+ if s:tlist_{fidx}_start == 0 || !s:tlist_{fidx}_visible -+ if g:Tlist_Compact_Format -+ let s:tlist_{fidx}_start = line('$') -+ else -+ let s:tlist_{fidx}_start = line('$') + 1 -+ endif -+ endif -+ -+ let s:tlist_{fidx}_visible = 1 -+ -+ " Goto the line where this file should be placed -+ if g:Tlist_Compact_Format -+ exe s:tlist_{fidx}_start -+ else -+ exe s:tlist_{fidx}_start - 1 -+ endif -+ -+ let txt = fnamemodify(s:tlist_{fidx}_filename, ':t') . ' (' . -+ \ fnamemodify(s:tlist_{fidx}_filename, ':p:h') . ')' -+ if g:Tlist_Compact_Format == 0 -+ silent! put =txt -+ else -+ silent! put! =txt -+ " Move to the next line -+ exe line('.') + 1 -+ endif -+ let file_start = s:tlist_{fidx}_start -+ -+ " Add the tag names grouped by tag type to the buffer with a title -+ let i = 1 -+ let ttype_cnt = s:tlist_{a:ftype}_count -+ while i <= ttype_cnt -+ let ttype = s:tlist_{a:ftype}_{i}_name -+ " Add the tag type only if there are tags for that type -+ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype -+ let ttype_txt = {fidx_ttype} -+ if ttype_txt != '' -+ let txt = ' ' . s:tlist_{a:ftype}_{i}_fullname -+ if g:Tlist_Compact_Format == 0 -+ let ttype_start_lnum = line('.') + 1 -+ silent! put =txt -+ else -+ let ttype_start_lnum = line('.') -+ silent! put! =txt -+ endif -+ silent! put =ttype_txt -+ -+ let {fidx_ttype}_offset = ttype_start_lnum - file_start -+ -+ " create a fold for this tag type -+ let fold_start = ttype_start_lnum -+ let fold_end = fold_start + {fidx_ttype}_count -+ exe fold_start . ',' . fold_end . 'fold' -+ -+ " Adjust the cursor position -+ if g:Tlist_Compact_Format == 0 -+ exe ttype_start_lnum + {fidx_ttype}_count -+ else -+ exe ttype_start_lnum + {fidx_ttype}_count + 1 -+ endif -+ -+ if g:Tlist_Compact_Format == 0 -+ " Separate the tag types by a empty line -+ silent! put ='' -+ endif -+ endif -+ let i = i + 1 -+ endwhile -+ -+ if s:tlist_{fidx}_tag_count == 0 -+ if g:Tlist_Compact_Format == 0 -+ silent! put ='' -+ endif -+ endif -+ -+ let s:tlist_{fidx}_end = line('.') - 1 -+ -+ " Create a fold for the entire file -+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' -+ exe 'silent! ' . s:tlist_{fidx}_start . ',' . -+ \ s:tlist_{fidx}_end . 'foldopen!' -+ -+ " Goto the starting line for this file, -+ exe s:tlist_{fidx}_start -+ -+ if s:tlist_app_name == "winmanager" -+ " To handle a bug in the winmanager plugin, add a space at the -+ " last line -+ call setline('$', ' ') -+ endif -+ -+ " Mark the buffer as not modifiable -+ setlocal nomodifiable -+ -+ " Restore the report option -+ let &report = old_report -+ -+ " Update the start and end line numbers for all the files following this -+ " file -+ let start = s:tlist_{fidx}_start -+ " include the empty line after the last line -+ if g:Tlist_Compact_Format -+ let end = s:tlist_{fidx}_end -+ else -+ let end = s:tlist_{fidx}_end + 1 -+ endif -+ 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) -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(1) -+ endif -+endfunction -+ -+" Tlist_Init_File -+" Initialize the variables for a new file -+function! s:Tlist_Init_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Init_File (' . a:filename . ')') -+ " Add new files at the end of the list -+ let fidx = s:tlist_file_count -+ let s:tlist_file_count = s:tlist_file_count + 1 -+ " Add the new file name to the taglist list of file names -+ let s:tlist_file_names = s:tlist_file_names . a:filename . "\n" -+ -+ " Initialize the file variables -+ let s:tlist_{fidx}_filename = a:filename -+ let s:tlist_{fidx}_sort_type = g:Tlist_Sort_Type -+ let s:tlist_{fidx}_filetype = a:ftype -+ let s:tlist_{fidx}_mtime = -1 -+ let s:tlist_{fidx}_start = 0 -+ let s:tlist_{fidx}_end = 0 -+ let s:tlist_{fidx}_valid = 0 -+ let s:tlist_{fidx}_visible = 0 -+ let s:tlist_{fidx}_tag_count = 0 -+ let s:tlist_{fidx}_menu_cmd = '' -+ -+ " Initialize the tag type variables -+ let i = 1 -+ while i <= s:tlist_{a:ftype}_count -+ let ttype = s:tlist_{a:ftype}_{i}_name -+ let s:tlist_{fidx}_{ttype} = '' -+ let s:tlist_{fidx}_{ttype}_offset = 0 -+ let s:tlist_{fidx}_{ttype}_count = 0 -+ let i = i + 1 -+ endwhile -+ -+ return fidx -+endfunction -+ -+" Tlist_Get_Tag_Type_By_Tag -+" Return the tag type for the specified tag index -+function! s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) -+ let ttype_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_type' -+ -+ " Already parsed and have the tag name -+ if exists(ttype_var) -+ return {ttype_var} -+ endif -+ -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let {ttype_var} = s:Tlist_Extract_Tagtype(tag_line) -+ -+ return {ttype_var} -+endfunction -+ -+" Tlist_Get_Tag_Prototype -+function! s:Tlist_Get_Tag_Prototype(fidx, tidx) -+ let tproto_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_proto' -+ -+ " Already parsed and have the tag prototype -+ if exists(tproto_var) -+ return {tproto_var} -+ endif -+ -+ " Parse and extract the tag prototype -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let start = stridx(tag_line, '/^') + 2 -+ let end = stridx(tag_line, '/;"' . "\t") -+ if tag_line[end - 1] == '$' -+ let end = end -1 -+ endif -+ let tag_proto = strpart(tag_line, start, end - start) -+ let {tproto_var} = substitute(tag_proto, '\s*', '', '') -+ -+ return {tproto_var} -+endfunction -+ -+" Tlist_Get_Tag_SearchPat -+function! s:Tlist_Get_Tag_SearchPat(fidx, tidx) -+ let tpat_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_searchpat' -+ -+ " Already parsed and have the tag search pattern -+ if exists(tpat_var) -+ return {tpat_var} -+ endif -+ -+ " Parse and extract the tag search pattern -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let start = stridx(tag_line, '/^') + 2 -+ let end = stridx(tag_line, '/;"' . "\t") -+ if tag_line[end - 1] == '$' -+ let end = end -1 -+ endif -+ let {tpat_var} = '\V\^' . strpart(tag_line, start, end - start) . -+ \ (tag_line[end] == '$' ? '\$' : '') -+ -+ return {tpat_var} -+endfunction -+ -+" Tlist_Get_Tag_Linenum -+" Return the tag line number, given the tag index -+function! s:Tlist_Get_Tag_Linenum(fidx, tidx) -+ let tline_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_linenum' -+ -+ " Already parsed and have the tag line number -+ if exists(tline_var) -+ return {tline_var} -+ endif -+ -+ " Parse and extract the tag line number -+ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag -+ let start = strridx(tag_line, 'line:') + 5 -+ let end = strridx(tag_line, "\t") -+ if end < start -+ let {tline_var} = strpart(tag_line, start) + 0 -+ else -+ let {tline_var} = strpart(tag_line, start, end - start) + 0 -+ endif -+ -+ return {tline_var} -+endfunction -+ -+" Tlist_Parse_Tagline -+" Parse a tag line from the ctags output. Separate the tag output based on the -+" tag type and store it in the tag type variable. -+" The format of each line in the ctags output is: -+" -+" tag_namefile_nameex_cmd;"extension_fields -+" -+function! s:Tlist_Parse_Tagline(tag_line) -+ if a:tag_line == '' -+ " Skip empty lines -+ return -+ endif -+ -+ " Extract the tag type -+ let ttype = s:Tlist_Extract_Tagtype(a:tag_line) -+ -+ " 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 -+ -+ " Update the total tag count -+ let s:tidx = s:tidx + 1 -+ -+ " The following variables are used to optimize this code. Vim is slow in -+ " using curly brace names. To reduce the amount of processing needed, the -+ " curly brace variables are pre-processed here -+ let fidx_tidx = 's:tlist_' . s:fidx . '_' . s:tidx -+ let fidx_ttype = 's:tlist_' . s:fidx . '_' . ttype -+ -+ " Update the count of this tag type -+ let ttype_idx = {fidx_ttype}_count + 1 -+ let {fidx_ttype}_count = ttype_idx -+ -+ " Store the ctags output for this tag -+ let {fidx_tidx}_tag = a:tag_line -+ -+ " Store the tag index and the tag type index (back pointers) -+ let {fidx_ttype}_{ttype_idx} = s:tidx -+ let {fidx_tidx}_ttype_idx = ttype_idx -+ -+ " Extract the tag name -+ let tag_name = strpart(a:tag_line, 0, stridx(a:tag_line, "\t")) -+ -+ " Extract the tag scope/prototype -+ if g:Tlist_Display_Prototype -+ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(s:fidx, s:tidx) -+ else -+ let ttxt = ' ' . tag_name -+ -+ " Add the tag scope, if it is available and is configured. Tag -+ " scope is the last field after the 'line:\t' field -+ if g:Tlist_Display_Tag_Scope -+ let tag_scope = s:Tlist_Extract_Tag_Scope(a:tag_line) -+ if tag_scope != '' -+ let ttxt = ttxt . ' [' . tag_scope . ']' -+ endif -+ endif -+ endif -+ -+ " Add this tag to the tag type variable -+ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" -+ -+ " Save the tag name -+ let {fidx_tidx}_tag_name = tag_name -+endfunction -+ -+" Tlist_Process_File -+" Get the list of tags defined in the specified file and store them -+" in Vim variables. Returns the file index where the tags are stored. -+function! s:Tlist_Process_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Process_File (' . a:filename . ', ' . -+ \ a:ftype . ')') -+ " Check whether this file is supported -+ if s:Tlist_Skip_File(a:filename, a:ftype) -+ return -1 -+ endif -+ -+ " If the tag types for this filetype are not yet created, then create -+ " them now -+ let var = 's:tlist_' . a:ftype . '_count' -+ if !exists(var) -+ if s:Tlist_FileType_Init(a:ftype) == 0 -+ return -1 -+ endif -+ endif -+ -+ " If this file is already processed, then use the cached values -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx == -1 -+ " First time, this file is loaded -+ let fidx = s:Tlist_Init_File(a:filename, a:ftype) -+ else -+ " File was previously processed. Discard the tag information -+ call s:Tlist_Discard_TagInfo(fidx) -+ endif -+ -+ let s:tlist_{fidx}_valid = 1 -+ -+ " Exuberant ctags arguments to generate a tag list -+ let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nks ' -+ -+ " Form the ctags argument depending on the sort type -+ if s:tlist_{fidx}_sort_type == 'name' -+ let ctags_args = ctags_args . '--sort=yes' -+ else -+ let ctags_args = ctags_args . '--sort=no' -+ endif -+ -+ " Add the filetype specific arguments -+ let ctags_args = ctags_args . ' ' . s:tlist_{a:ftype}_ctags_args -+ -+ " Ctags command to produce output with regexp for locating the tags -+ let ctags_cmd = g:Tlist_Ctags_Cmd . ctags_args -+ let ctags_cmd = ctags_cmd . ' "' . a:filename . '"' -+ -+ if &shellxquote == '"' -+ " Double-quotes within double-quotes will not work in the -+ " command-line.If the 'shellxquote' option is set to double-quotes, -+ " then escape the double-quotes in the ctags command-line. -+ let ctags_cmd = escape(ctags_cmd, '"') -+ endif -+ -+ " In Windows 95, if not using cygwin, disable the 'shellslash' -+ " option. Otherwise, this will cause problems when running the -+ " ctags command. -+ if has('win95') && !has('win32unix') -+ let old_shellslash = &shellslash -+ set noshellslash -+ endif -+ -+ if has('win32') && !has('win32unix') && !has('win95') -+ \ && (&shell =~ 'cmd.exe') -+ " Windows does not correctly deal with commands that have more than 1 -+ " set of double quotes. It will strip them all resulting in: -+ " 'C:\Program' is not recognized as an internal or external command -+ " operable program or batch file. To work around this, place the -+ " command inside a batch file and call the batch file. -+ " Do this only on Win2K, WinXP and above. -+ " Contributed by: David Fishburn. -+ let s:taglist_tempfile = fnamemodify(tempname(), ':h') . -+ \ '\taglist.cmd' -+ exe 'redir! > ' . s:taglist_tempfile -+ silent echo ctags_cmd -+ redir END -+ -+ call s:Tlist_Log_Msg('Cmd inside batch file: ' . ctags_cmd) -+ let ctags_cmd = '"' . s:taglist_tempfile . '"' -+ endif -+ -+ call s:Tlist_Log_Msg('Cmd: ' . ctags_cmd) -+ -+ " Run ctags and get the tag list -+ let cmd_output = system(ctags_cmd) -+ -+ " Restore the value of the 'shellslash' option. -+ if has('win95') && !has('win32unix') -+ let &shellslash = old_shellslash -+ endif -+ -+ if exists('s:taglist_tempfile') -+ " Delete the temporary cmd file created on MS-Windows -+ call delete(s:taglist_tempfile) -+ endif -+ -+ " Handle errors -+ if v:shell_error -+ let msg = "Taglist: Failed to generate tags for " . a:filename -+ call s:Tlist_Warning_Msg(msg) -+ if cmd_output != '' -+ call s:Tlist_Warning_Msg(cmd_output) -+ endif -+ return fidx -+ endif -+ -+ " Store the modification time for the file -+ let s:tlist_{fidx}_mtime = getftime(a:filename) -+ -+ " No tags for current file -+ if cmd_output == '' -+ call s:Tlist_Log_Msg('No tags defined in ' . a:filename) -+ return fidx -+ endif -+ -+ call s:Tlist_Log_Msg('Generated tags information for ' . a:filename) -+ -+ if v:version > 601 -+ " The following script local variables are used by the -+ " Tlist_Parse_Tagline() function. -+ let s:ctags_flags = s:tlist_{a:ftype}_ctags_flags -+ let s:fidx = fidx -+ let s:tidx = 0 -+ -+ " Process the ctags output one line at a time. The substitute() -+ " command is used to parse the tag lines instead of using the -+ " matchstr()/stridx()/strpart() functions for performance reason -+ call substitute(cmd_output, "\\([^\n]\\+\\)\n", -+ \ '\=s:Tlist_Parse_Tagline(submatch(1))', 'g') -+ -+ " Save the number of tags for this file -+ let s:tlist_{fidx}_tag_count = s:tidx -+ -+ " The following script local variables are no longer needed -+ unlet! s:ctags_flags -+ unlet! s:tidx -+ unlet! s:fidx -+ else -+ " Due to a bug in Vim earlier than version 6.1, -+ " we cannot use substitute() to parse the ctags output. -+ " Instead the slow str*() functions are used -+ let ctags_flags = s:tlist_{a:ftype}_ctags_flags -+ let tidx = 0 -+ -+ while cmd_output != '' -+ " Extract one line at a time -+ let idx = stridx(cmd_output, "\n") -+ let one_line = strpart(cmd_output, 0, idx) -+ " Remove the line from the tags output -+ let cmd_output = strpart(cmd_output, idx + 1) -+ -+ if one_line == '' -+ " Line is not in proper tags format -+ continue -+ endif -+ -+ " Extract the tag type -+ let ttype = s:Tlist_Extract_Tagtype(one_line) -+ -+ " Make sure the tag type is a valid and supported one -+ if ttype == '' || stridx(ctags_flags, ttype) == -1 -+ " Line is not in proper tags format or Tag type is not -+ " supported -+ continue -+ endif -+ -+ " Update the total tag count -+ let tidx = tidx + 1 -+ -+ " The following variables are used to optimize this code. Vim is -+ " slow in using curly brace names. To reduce the amount of -+ " processing needed, the curly brace variables are pre-processed -+ " here -+ let fidx_tidx = 's:tlist_' . fidx . '_' . tidx -+ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype -+ -+ " Update the count of this tag type -+ let ttype_idx = {fidx_ttype}_count + 1 -+ let {fidx_ttype}_count = ttype_idx -+ -+ " Store the ctags output for this tag -+ let {fidx_tidx}_tag = one_line -+ -+ " Store the tag index and the tag type index (back pointers) -+ let {fidx_ttype}_{ttype_idx} = tidx -+ let {fidx_tidx}_ttype_idx = ttype_idx -+ -+ " Extract the tag name -+ let tag_name = strpart(one_line, 0, stridx(one_line, "\t")) -+ -+ " Extract the tag scope/prototype -+ if g:Tlist_Display_Prototype -+ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(fidx, tidx) -+ else -+ let ttxt = ' ' . tag_name -+ -+ " Add the tag scope, if it is available and is configured. Tag -+ " scope is the last field after the 'line:\t' field -+ if g:Tlist_Display_Tag_Scope -+ let tag_scope = s:Tlist_Extract_Tag_Scope(one_line) -+ if tag_scope != '' -+ let ttxt = ttxt . ' [' . tag_scope . ']' -+ endif -+ endif -+ endif -+ -+ " Add this tag to the tag type variable -+ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" -+ -+ " Save the tag name -+ let {fidx_tidx}_tag_name = tag_name -+ endwhile -+ -+ " Save the number of tags for this file -+ let s:tlist_{fidx}_tag_count = tidx -+ endif -+ -+ call s:Tlist_Log_Msg('Processed ' . s:tlist_{fidx}_tag_count . -+ \ ' tags in ' . a:filename) -+ -+ return fidx -+endfunction -+ -+" Tlist_Update_File -+" Update the tags for a file (if needed) -+function! Tlist_Update_File(filename, ftype) -+ call s:Tlist_Log_Msg('Tlist_Update_File (' . a:filename . ')') -+ " If the file doesn't support tag listing, skip it -+ if s:Tlist_Skip_File(a:filename, a:ftype) -+ return -+ endif -+ -+ " Convert the file name to a full path -+ let fname = fnamemodify(a:filename, ':p') -+ -+ " First check whether the file already exists -+ let fidx = s:Tlist_Get_File_Index(fname) -+ -+ if fidx != -1 && s:tlist_{fidx}_valid -+ " File exists and the tags are valid -+ " Check whether the file was modified after the last tags update -+ " If it is modified, then update the tags -+ if s:tlist_{fidx}_mtime == getftime(fname) -+ return -+ endif -+ else -+ " If the tags were removed previously based on a user request, -+ " as we are going to update the tags (based on the user request), -+ " remove the filename from the deleted list -+ call s:Tlist_Update_Remove_List(fname, 0) -+ endif -+ -+ " If the taglist window is opened, update it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum == -1 -+ " Taglist window is not present. Just update the taglist -+ " and return -+ call s:Tlist_Process_File(fname, a:ftype) -+ else -+ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != -1 -+ " If tags for only one file are displayed and we are not -+ " updating the tags for that file, then no need to -+ " refresh the taglist window. Otherwise, the taglist -+ " window should be updated. -+ if s:tlist_{s:tlist_cur_file_idx}_filename != fname -+ call s:Tlist_Process_File(fname, a:ftype) -+ return -+ endif -+ endif -+ -+ " Save the current window number -+ let save_winnr = winnr() -+ -+ " Goto the taglist window -+ call s:Tlist_Window_Goto_Window() -+ -+ " Save the cursor position -+ let save_line = line('.') -+ let save_col = col('.') -+ -+ " Update the taglist window -+ call s:Tlist_Window_Refresh_File(fname, a:ftype) -+ -+ " Restore the cursor position -+ if v:version >= 601 -+ call cursor(save_line, save_col) -+ else -+ exe save_line -+ exe 'normal! ' . save_col . '|' -+ endif -+ -+ if winnr() != save_winnr -+ " Go back to the original window -+ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') -+ endif -+ endif -+ -+ " Update the taglist menu -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(1) -+ endif -+endfunction -+ -+" Tlist_Window_Close -+" Close the taglist window -+function! s:Tlist_Window_Close() -+ call s:Tlist_Log_Msg('Tlist_Window_Close()') -+ " Make sure the taglist window exists -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum == -1 -+ call s:Tlist_Warning_Msg('Error: Taglist window is not open') -+ return -+ endif -+ -+ if winnr() == winnum -+ " Already in the taglist window. Close it and return -+ if winbufnr(2) != -1 -+ " If a window other than the taglist window is open, -+ " then only close the taglist window. -+ close -+ endif -+ else -+ " Goto the taglist window, close it and then come back to the -+ " original window -+ let curbufnr = bufnr('%') -+ exe winnum . '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 -+endfunction -+ -+" Tlist_Window_Mark_File_Window -+" Mark the current window as the file window to use when jumping to a tag. -+" Only if the current window is a non-plugin, non-preview and non-taglist -+" window -+function! s:Tlist_Window_Mark_File_Window() -+ if getbufvar('%', '&buftype') == '' && !&previewwindow -+ let w:tlist_file_window = "yes" -+ endif -+endfunction -+ -+" Tlist_Window_Open -+" Open and refresh the taglist window -+function! s:Tlist_Window_Open() -+ call s:Tlist_Log_Msg('Tlist_Window_Open()') -+ " If the window is open, jump to it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ " Jump to the existing window -+ if winnr() != winnum -+ exe winnum . 'wincmd w' -+ endif -+ return -+ endif -+ -+ if s:tlist_app_name == "winmanager" -+ " Taglist plugin is no longer part of the winmanager app -+ let s:tlist_app_name = "none" -+ endif -+ -+ " Get the filename and filetype for the specified buffer -+ let curbuf_name = fnamemodify(bufname('%'), ':p') -+ let curbuf_ftype = getbufvar('%', '&filetype') -+ let cur_lnum = line('.') -+ -+ " Mark the current window as the desired window to open a file when a tag -+ " is selected. -+ call s:Tlist_Window_Mark_File_Window() -+ -+ " Open the taglist window -+ call s:Tlist_Window_Create() -+ -+ call s:Tlist_Window_Refresh() -+ -+ if g:Tlist_Show_One_File -+ " Add only the current buffer and file -+ " -+ " If the file doesn't support tag listing, skip it -+ if !s:Tlist_Skip_File(curbuf_name, curbuf_ftype) -+ call s:Tlist_Window_Refresh_File(curbuf_name, curbuf_ftype) -+ endif -+ endif -+ -+ if g:Tlist_File_Fold_Auto_Close -+ " Open the fold for the current file, as all the folds in -+ " the taglist window are closed -+ let fidx = s:Tlist_Get_File_Index(curbuf_name) -+ if fidx != -1 -+ exe "silent! " . s:tlist_{fidx}_start . "," . -+ \ s:tlist_{fidx}_end . "foldopen!" -+ endif -+ endif -+ -+ " Highlight the current tag -+ call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) -+endfunction -+ -+" Tlist_Window_Toggle() -+" Open or close a taglist window -+function! s:Tlist_Window_Toggle() -+ call s:Tlist_Log_Msg('Tlist_Window_Toggle()') -+ " If taglist window is open then close it. -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ call s:Tlist_Window_Close() -+ return -+ endif -+ -+ call s:Tlist_Window_Open() -+ -+ " 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 -+ call s:Tlist_Menu_Update_File(0) -+ endif -+endfunction -+ -+" 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 -+ -+ " 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 -+ -+ " 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) -+ -+ let all_files = strpart(all_files, nl_idx + 1) -+ if one_file == '' -+ continue -+ endif -+ -+ " Skip non-directory names -+ if !isdirectory(one_file) -+ continue -+ endif -+ -+ 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 -+" Add files recursively from a directory -+function! s:Tlist_Add_Files_Recursive(dir, ...) -+ let dir_name = fnamemodify(a:dir, ':p') -+ if !isdirectory(dir_name) -+ call s:Tlist_Warning_Msg('Error: ' . dir_name . ' is not a directory') -+ return -+ endif -+ -+ if a:0 == 1 -+ " User specified file pattern -+ let pat = a:1 -+ else -+ " Default file pattern -+ let pat = '*' -+ endif -+ -+ echon "\r " -+ echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t') -+ let fcnt = s:Tlist_Process_Dir(dir_name, pat) -+ -+ echon "\rAdded " . fcnt . " files to the taglist" -+endfunction -+ -+" Tlist_Add_Files -+" Add the specified list of files to the taglist -+function! s:Tlist_Add_Files(...) -+ let flist = '' -+ let i = 1 -+ -+ " Get all the files matching the file patterns supplied as argument -+ while i <= a:0 -+ let flist = flist . glob(a:{i}) . "\n" -+ let i = i + 1 -+ endwhile -+ -+ if flist == '' -+ call s:Tlist_Warning_Msg('Error: No matching files are found') -+ return -+ endif -+ -+ let fcnt = s:Tlist_Process_Filelist(flist) -+ echon "\rAdded " . fcnt . " files to the taglist" -+endfunction -+ -+" Tlist_Extract_Tagtype -+" Extract the tag type from the tag text -+function! s:Tlist_Extract_Tagtype(tag_line) -+ " The tag type is after the tag prototype field. The prototype field -+ " ends with the /;"\t string. We add 4 at the end to skip the characters -+ " in this special string.. -+ let start = strridx(a:tag_line, '/;"' . "\t") + 4 -+ let end = strridx(a:tag_line, 'line:') - 1 -+ let ttype = strpart(a:tag_line, start, end - start) -+ -+ return ttype -+endfunction -+ -+" Tlist_Extract_Tag_Scope -+" Extract the tag scope from the tag text -+function! s:Tlist_Extract_Tag_Scope(tag_line) -+ let start = strridx(a:tag_line, 'line:') -+ let end = strridx(a:tag_line, "\t") -+ if end <= start -+ return '' -+ endif -+ -+ let tag_scope = strpart(a:tag_line, end + 1) -+ let tag_scope = strpart(tag_scope, stridx(tag_scope, ':') + 1) -+ -+ return tag_scope -+endfunction -+ -+" Tlist_Refresh() -+" Refresh the taglist -+function! s:Tlist_Refresh() -+ call s:Tlist_Log_Msg('Tlist_Refresh (Skip_Refresh = ' . -+ \ s:Tlist_Skip_Refresh . ', ' . bufname('%') . ')') -+ " If we are entering the buffer from one of the taglist functions, then -+ " no need to refresh the taglist window again. -+ if s:Tlist_Skip_Refresh -+ " We still need to update the taglist menu -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(0) -+ endif -+ return -+ endif -+ -+ " If part of the winmanager plugin and not configured to process -+ " tags always and not configured to display the tags menu, then return -+ if (s:tlist_app_name == 'winmanager') && !g:Tlist_Process_File_Always -+ \ && !g:Tlist_Show_Menu -+ return -+ endif -+ -+ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help -+ if &buftype != '' -+ return -+ endif -+ -+ let filename = fnamemodify(bufname('%'), ':p') -+ let ftype = &filetype -+ -+ " If the file doesn't support tag listing, skip it -+ if s:Tlist_Skip_File(filename, ftype) -+ return -+ endif -+ -+ let tlist_win = bufwinnr(g:TagList_title) -+ -+ " If the taglist window is not opened and not configured to process -+ " tags always and not displaying the tags menu, then return -+ if tlist_win == -1 && !g:Tlist_Process_File_Always && !g:Tlist_Show_Menu -+ return -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 -+ " Check whether this file is removed based on user request -+ " If it is, then don't display the tags for this file -+ if s:Tlist_User_Removed_File(filename) -+ return -+ endif -+ -+ " If the taglist should not be auto updated, then return -+ if !g:Tlist_Auto_Update -+ return -+ endif -+ endif -+ -+ let cur_lnum = line('.') -+ -+ if fidx == -1 -+ " Update the tags for the file -+ let fidx = s:Tlist_Process_File(filename, ftype) -+ else -+ let mtime = getftime(filename) -+ if s:tlist_{fidx}_mtime != mtime -+ " Invalidate the tags listed for this file -+ let s:tlist_{fidx}_valid = 0 -+ -+ " Update the taglist and the window -+ call Tlist_Update_File(filename, ftype) -+ -+ " Store the new file modification time -+ let s:tlist_{fidx}_mtime = mtime -+ endif -+ endif -+ -+ " Update the taglist window -+ if tlist_win != -1 -+ " Disable screen updates -+ let old_lazyredraw = &lazyredraw -+ set nolazyredraw -+ -+ " Save the current window number -+ let save_winnr = winnr() -+ -+ " Goto the taglist window -+ call s:Tlist_Window_Goto_Window() -+ -+ if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter -+ " Save the cursor position -+ let save_line = line('.') -+ let save_col = col('.') -+ endif -+ -+ " Update the taglist window -+ call s:Tlist_Window_Refresh_File(filename, ftype) -+ -+ " Open the fold for the file -+ exe "silent! " . s:tlist_{fidx}_start . "," . -+ \ s:tlist_{fidx}_end . "foldopen!" -+ -+ if g:Tlist_Highlight_Tag_On_BufEnter && g:Tlist_Auto_Highlight_Tag -+ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != fidx -+ " If displaying tags for only one file in the taglist -+ " window and about to display the tags for a new file, -+ " then center the current tag line for the new file -+ let center_tag_line = 1 -+ else -+ let center_tag_line = 0 -+ endif -+ -+ " Highlight the current tag -+ call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) -+ else -+ " Restore the cursor position -+ if v:version >= 601 -+ call cursor(save_line, save_col) -+ else -+ exe save_line -+ exe 'normal! ' . save_col . '|' -+ endif -+ endif -+ -+ " Jump back to the original window -+ if save_winnr != winnr() -+ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') -+ endif -+ -+ " Restore screen updates -+ let &lazyredraw = old_lazyredraw -+ endif -+ -+ " Update the taglist menu -+ if g:Tlist_Show_Menu -+ call s:Tlist_Menu_Update_File(0) -+ endif -+endfunction -+ -+" Tlist_Change_Sort() -+" Change the sort order of the tag listing -+" caller == 'cmd', command used in the taglist window -+" caller == 'menu', taglist menu -+" action == 'toggle', toggle sort from name to order and vice versa -+" action == 'set', set the sort order to sort_type -+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 == 'cmd' -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ -+ " Remove the previous highlighting -+ match none -+ elseif a:caller == 'menu' -+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) -+ if fidx == -1 -+ return -+ endif -+ endif -+ -+ if a:action == 'toggle' -+ let sort_type = s:tlist_{fidx}_sort_type -+ -+ " Toggle the sort order from 'name' to 'order' and vice versa -+ if sort_type == 'name' -+ let s:tlist_{fidx}_sort_type = 'order' -+ else -+ let s:tlist_{fidx}_sort_type = 'name' -+ endif -+ else -+ let s:tlist_{fidx}_sort_type = a:sort_type -+ endif -+ -+ " Invalidate the tags listed for this file -+ let s:tlist_{fidx}_valid = 0 -+ -+ if a:caller == 'cmd' -+ " Save the current line for later restoration -+ let curline = '\V\^' . getline('.') . '\$' -+ -+ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, -+ \ s:tlist_{fidx}_filetype) -+ -+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' -+ -+ " Go back to the cursor line before the tag list is sorted -+ call search(curline, 'w') -+ -+ call s:Tlist_Menu_Update_File(1) -+ else -+ call s:Tlist_Menu_Remove_File() -+ -+ call s:Tlist_Refresh() -+ endif -+endfunction -+ -+" Tlist_Update_Current_File() -+" Update taglist for the current buffer by regenerating the tag list -+" Contributed by WEN Guopeng. -+function! s:Tlist_Update_Current_File() -+ call s:Tlist_Log_Msg('Tlist_Update_Current_File()') -+ if winnr() == bufwinnr(g:TagList_title) -+ " In the taglist window. Update the current file -+ call s:Tlist_Window_Update_File() -+ else -+ " Not in the taglist window. Update the current buffer -+ let filename = fnamemodify(bufname('%'), ':p') -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx != -1 -+ let s:tlist_{fidx}_valid = 0 -+ endif -+ call Tlist_Update_File(filename, &filetype) -+ endif -+endfunction -+ -+" Tlist_Window_Update_File() -+" 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_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ -+ " Remove the previous highlighting -+ match none -+ -+ " Save the current line for later restoration -+ let curline = '\V\^' . getline('.') . '\$' -+ -+ let s:tlist_{fidx}_valid = 0 -+ -+ " Update the taglist window -+ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, -+ \ s:tlist_{fidx}_filetype) -+ -+ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' -+ -+ " Go back to the tag line before the list is updated -+ call search(curline, 'w') -+endfunction -+ -+" Tlist_Window_Get_Tag_Type_By_Linenum() -+" Return the tag type index for the specified line in the taglist window -+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 -+ " tag type start line number and the number of tags in a tag type -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{i}_name -+ let start_lnum = -+ \ s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset -+ let end = start_lnum + s:tlist_{a:fidx}_{ttype}_count -+ if a:lnum >= start_lnum && a:lnum <= end -+ break -+ endif -+ let i = i + 1 -+ endwhile -+ -+ " Current line doesn't belong to any of the displayed tag types -+ if i > s:tlist_{ftype}_count -+ return '' -+ endif -+ -+ return ttype -+endfunction -+ -+" 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 == '' -+ return 0 -+ endif -+ -+ " Compute the index into the displayed tags for the tag type -+ let ttype_lnum = s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset -+ let tidx = a:lnum - ttype_lnum -+ if tidx == 0 -+ return 0 -+ endif -+ -+ " Get the corresponding tag line and return it -+ return s:tlist_{a:fidx}_{ttype}_{tidx} -+endfunction -+ -+" Tlist_Window_Highlight_Line -+" Highlight the current line -+function! s:Tlist_Window_Highlight_Line() -+ " Clear previously selected name -+ match none -+ -+ " Highlight the current line -+ if g:Tlist_Display_Prototype == 0 -+ let pat = '/\%' . line('.') . 'l\s\+\zs.*/' -+ else -+ let pat = '/\%' . line('.') . 'l.*/' -+ endif -+ -+ exe 'match TagListTagName ' . pat -+endfunction -+ -+" 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_Window_Open_File(win_ctrl, filename, tagpat) -+ 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 == '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 -+ 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 -+ let first_usable_win = 0 -+ -+ let i = 1 -+ let bnum = winbufnr(i) -+ while bnum != -1 -+ if getwinvar(i, 'tlist_file_window') == 'yes' -+ let fwin_num = i -+ break -+ endif -+ if first_usable_win == 0 && -+ \ getbufvar(bnum, '&buftype') == '' && -+ \ !getwinvar(i, '&previewwindow') -+ " First non-taglist, non-plugin and non-preview window -+ let first_usable_win = i -+ endif -+ let i = i + 1 -+ let bnum = winbufnr(i) -+ endwhile -+ -+ " If a previously used window is not found, then use the first -+ " non-taglist window -+ if fwin_num == 0 -+ let fwin_num = first_usable_win -+ endif -+ -+ if fwin_num != 0 -+ " Jump to the file window -+ exe fwin_num . "wincmd w" -+ -+ " If the user asked to jump to the tag in a new window, then split -+ " the existing window into two. -+ if a:win_ctrl == 'newwin' -+ split -+ endif -+ exe "edit " . escape(a:filename, ' ') -+ else -+ " Open a new window -+ if g:Tlist_Use_Horiz_Window -+ exe 'leftabove split ' . escape(a:filename, ' ') -+ else -+ if winbufnr(2) == -1 -+ " Only the taglist window is present -+ if g:Tlist_Use_Right_Window -+ exe 'leftabove vertical split ' . -+ \ escape(a:filename, ' ') -+ else -+ exe 'rightbelow vertical split ' . -+ \ escape(a:filename, ' ') -+ endif -+ -+ " Go to the taglist window to change the window size to -+ " the user configured value -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ if g:Tlist_Use_Horiz_Window -+ exe 'resize ' . g:Tlist_WinHeight -+ else -+ exe 'vertical resize ' . g:Tlist_WinWidth -+ endif -+ " Go back to the file window -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ else -+ " A plugin or help window is also present -+ wincmd w -+ exe 'leftabove split ' . escape(a:filename, ' ') -+ endif -+ endif -+ endif -+ " Mark the window, so that it can be reused. -+ call s:Tlist_Window_Mark_File_Window() -+ else -+ if v:version >= 700 -+ " If the file is opened in more than one window, then check -+ " whether the last accessed window has the selected file. -+ " If it does, then use that window. -+ let lastwin_bufnum = winbufnr(winnr('#')) -+ if bufnr(a:filename) == lastwin_bufnum -+ let winnum = winnr('#') -+ endif -+ endif -+ exe winnum . 'wincmd w' -+ -+ " If the user asked to jump to the tag in a new window, then split the -+ " existing window into two. -+ if a:win_ctrl == 'newwin' -+ split -+ endif -+ endif -+ endif -+ -+ " Jump to the tag -+ if a:tagpat != '' -+ " Add the current cursor position to the jump list, so that user can -+ " jump back using the ' and ` marks. -+ mark ' -+ silent call search(a:tagpat, 'w') -+ -+ " Bring the line to the middle of the window -+ normal! z. -+ -+ " If the line is inside a fold, open the fold -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+ endif -+ -+ " If the user selects to preview the tag then jump back to the -+ " taglist window -+ if a:win_ctrl == 'preview' -+ " Go back to the taglist window -+ let winnum = bufwinnr(g:TagList_title) -+ exe winnum . 'wincmd w' -+ else -+ " 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_Window_Goto_Window() -+ close -+ -+ " Go back to the window displaying the selected file -+ let wnum = bufwinnr(a:filename) -+ if wnum != -1 && wnum != winnr() -+ call s:Tlist_Exe_Cmd_No_Acmds(wnum . 'wincmd w') -+ endif -+ endif -+ endif -+ -+ let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh -+endfunction -+ -+" Tlist_Window_Jump_To_Tag() -+" Jump to the location of the current 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(' . a:win_ctrl . ')') -+ " Do not process comment lines and empty lines -+ let curline = getline('.') -+ if curline =~ '^\s*$' || curline[0] == '"' -+ return -+ endif -+ -+ " If inside a closed fold, then use the first line of the fold -+ " and jump to the file. -+ let lnum = foldclosed('.') -+ if lnum == -1 -+ " Jump to the selected tag or file -+ let lnum = line('.') -+ else -+ " Open the closed fold -+ .foldopen! -+ endif -+ -+ 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_Window_Get_Tag_Index(fidx, lnum) -+ if tidx != 0 -+ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx) -+ -+ " Highlight the tagline -+ call s:Tlist_Window_Highlight_Line() -+ else -+ " Selected a line which is not a tag name. Just edit the file -+ let tagpat = '' -+ endif -+ -+ call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) -+endfunction -+ -+" Tlist_Window_Show_Info() -+" Display information about the entry under the cursor -+function! s:Tlist_Window_Show_Info() -+ call s:Tlist_Log_Msg('Tlist_Window_Show_Info()') -+ -+ " Clear the previously displayed line -+ echo -+ -+ " Do not process comment lines and empty lines -+ let curline = getline('.') -+ if curline =~ '^\s*$' || curline[0] == '"' -+ return -+ endif -+ -+ " If inside a fold, then don't display the prototype -+ if foldclosed('.') != -1 -+ return -+ endif -+ -+ let lnum = line('.') -+ -+ " Get the file index -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) -+ if fidx == -1 -+ return -+ endif -+ -+ if lnum == s:tlist_{fidx}_start -+ " Cursor is on a file name -+ let fname = s:tlist_{fidx}_filename -+ if strlen(fname) > 50 -+ let fname = fnamemodify(fname, ':t') -+ endif -+ echo fname . ', Filetype=' . s:tlist_{fidx}_filetype . -+ \ ', Tag count=' . s:tlist_{fidx}_tag_count -+ return -+ endif -+ -+ " Get the tag output line for the current tag -+ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) -+ if tidx == 0 -+ " Cursor is on a tag type -+ let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) -+ if ttype == '' -+ return -+ endif -+ -+ let ttype_name = '' -+ -+ let ftype = s:tlist_{fidx}_filetype -+ let i = 1 -+ while i <= s:tlist_{ftype}_count -+ if ttype == s:tlist_{ftype}_{i}_name -+ let ttype_name = s:tlist_{ftype}_{i}_fullname -+ break -+ endif -+ let i = i + 1 -+ endwhile -+ -+ echo 'Tag type=' . ttype_name . -+ \ ', Tag count=' . s:tlist_{fidx}_{ttype}_count -+ return -+ endif -+ -+ " Get the tag search pattern and display it -+ echo s:Tlist_Get_Tag_Prototype(fidx, tidx) -+endfunction -+ -+" Tlist_Find_Nearest_Tag_Idx -+" Find the tag idx nearest to the supplied line number -+" Returns -1, if a tag couldn't be found for the specified line number -+function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum) -+ let sort_type = s:tlist_{a:fidx}_sort_type -+ -+ let left = 1 -+ let right = s:tlist_{a:fidx}_tag_count -+ -+ if sort_type == 'order' -+ " Tags sorted by order, use a binary search. -+ " The idea behind this function is taken from the ctags.vim script (by -+ " Alexey Marinichev) available at the Vim online website. -+ -+ " If the current line is the less than the first tag, then no need to -+ " search -+ let first_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, 1) -+ -+ if a:linenum < first_lnum -+ return -1 -+ endif -+ -+ while left < right -+ let middle = (right + left + 1) / 2 -+ let middle_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, middle) -+ -+ if middle_lnum == a:linenum -+ let left = middle -+ break -+ endif -+ -+ if middle_lnum > a:linenum -+ let right = middle - 1 -+ else -+ let left = middle -+ endif -+ endwhile -+ else -+ " Tags sorted by name, use a linear search. (contributed by Dave -+ " Eggum). -+ " Look for a tag with a line number less than or equal to the supplied -+ " line number. If multiple tags are found, then use the tag with the -+ " line number closest to the supplied line number. IOW, use the tag -+ " with the highest line number. -+ let closest_lnum = 0 -+ let final_left = 0 -+ while left <= right -+ let lnum = s:Tlist_Get_Tag_Linenum(a:fidx, left) -+ -+ if lnum < a:linenum && lnum > closest_lnum -+ let closest_lnum = lnum -+ let final_left = left -+ elseif lnum == a:linenum -+ let closest_lnum = lnum -+ let final_left = left -+ break -+ else -+ let left = left + 1 -+ endif -+ endwhile -+ if closest_lnum == 0 -+ return -1 -+ endif -+ if left >= right -+ let left = final_left -+ endif -+ endif -+ -+ return left -+endfunction -+ -+" 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_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. -+ if !g:Tlist_Auto_Highlight_Tag && a:cntx == 1 -+ return -+ endif -+ -+ if a:filename == '' -+ return -+ endif -+ -+ " 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 -+ -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx == -1 -+ return -+ endif -+ -+ " If the file is currently not displayed in the taglist window, then retrn -+ if !s:tlist_{fidx}_visible -+ return -+ endif -+ -+ " If there are no tags for this file, then no need to proceed further -+ if s:tlist_{fidx}_tag_count == 0 -+ return -+ endif -+ -+ " Ignore all autocommands -+ let old_ei = &eventignore -+ set eventignore=all -+ -+ " Save the original window number -+ let org_winnr = winnr() -+ -+ if org_winnr == winnum -+ let in_taglist_window = 1 -+ else -+ let in_taglist_window = 0 -+ endif -+ -+ " Go to the taglist window -+ if !in_taglist_window -+ exe winnum . 'wincmd w' -+ endif -+ -+ " Clear previously selected name -+ match none -+ -+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, a:cur_lnum) -+ if tidx == -1 -+ " Make sure the current tag line is visible in the taglist window. -+ " Calling the winline() function makes the line visible. Don't know -+ " of a better way to achieve this. -+ let lnum = line('.') -+ -+ if lnum < s:tlist_{fidx}_start || lnum > s:tlist_{fidx}_end -+ " Move the cursor to the beginning of the file -+ exe s:tlist_{fidx}_start -+ endif -+ -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+ -+ call winline() -+ -+ if !in_taglist_window -+ exe org_winnr . 'wincmd w' -+ endif -+ -+ " Restore the autocommands -+ let &eventignore = old_ei -+ return -+ endif -+ -+ " Extract the tag type -+ let ttype = s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) -+ -+ " Compute the line number -+ " Start of file + Start of tag type + offset -+ let lnum = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + -+ \ s:tlist_{fidx}_{tidx}_ttype_idx -+ -+ " Goto the line containing the tag -+ exe lnum -+ -+ " Open the fold -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+ -+ if a:center -+ " Move the tag line to the center of the taglist window -+ normal! z. -+ else -+ " Make sure the current tag line is visible in the taglist window. -+ " Calling the winline() function makes the line visible. Don't know -+ " of a better way to achieve this. -+ call winline() -+ endif -+ -+ " Highlight the tag name -+ call s:Tlist_Window_Highlight_Line() -+ -+ " Go back to the original window -+ if !in_taglist_window -+ exe org_winnr . 'wincmd w' -+ endif -+ -+ " Restore the autocommands -+ let &eventignore = old_ei -+ return -+endfunction -+ -+" Tlist_Get_Tag_Prototype_By_Line -+" Get the prototype for the tag on or before the specified line number in the -+" current buffer -+function! Tlist_Get_Tag_Prototype_By_Line(...) -+ if a:0 == 0 -+ " Arguments are not supplied. Use the current buffer name -+ " and line number -+ let filename = bufname('%') -+ let linenr = line('.') -+ elseif a:0 == 2 -+ " Filename and line number are specified -+ let filename = a:1 -+ let linenr = a:2 -+ if linenr !~ '\d\+' -+ " Invalid line number -+ return "" -+ endif -+ else -+ " Sufficient arguments are not supplied -+ let msg = 'Usage: Tlist_Get_Tag_Prototype_By_Line ' . -+ \ '' -+ call s:Tlist_Warning_Msg(msg) -+ return "" -+ endif -+ -+ " Expand the file to a fully qualified name -+ let filename = fnamemodify(filename, ':p') -+ if filename == '' -+ return "" -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 -+ return "" -+ endif -+ -+ " If there are no tags for this file, then no need to proceed further -+ if s:tlist_{fidx}_tag_count == 0 -+ return "" -+ endif -+ -+ " Get the tag text using the line number -+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) -+ if tidx == -1 -+ return "" -+ endif -+ -+ return s:Tlist_Get_Tag_Prototype(fidx, tidx) -+endfunction -+ -+" Tlist_Get_Tagname_By_Line -+" Get the tag name on or before the specified line number in the -+" current buffer -+function! Tlist_Get_Tagname_By_Line(...) -+ if a:0 == 0 -+ " Arguments are not supplied. Use the current buffer name -+ " and line number -+ let filename = bufname('%') -+ let linenr = line('.') -+ elseif a:0 == 2 -+ " Filename and line number are specified -+ let filename = a:1 -+ let linenr = a:2 -+ if linenr !~ '\d\+' -+ " Invalid line number -+ return "" -+ endif -+ else -+ " Sufficient arguments are not supplied -+ let msg = 'Usage: Tlist_Get_Tagname_By_Line ' -+ call s:Tlist_Warning_Msg(msg) -+ return "" -+ endif -+ -+ " Make sure the current file has a name -+ let filename = fnamemodify(filename, ':p') -+ if filename == '' -+ return "" -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 -+ return "" -+ endif -+ -+ " If there are no tags for this file, then no need to proceed further -+ if s:tlist_{fidx}_tag_count == 0 -+ return "" -+ endif -+ -+ " Get the tag name using the line number -+ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) -+ if tidx == -1 -+ return "" -+ endif -+ -+ return s:tlist_{fidx}_{tidx}_tag_name -+endfunction -+ -+" 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_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 -+ if a:dir == -1 -+ normal! zk -+ else -+ " While moving down to the start of the next fold, -+ " no need to do go to the start of the next file. -+ normal! zj -+ return -+ endif -+ endif -+ -+ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) -+ if fidx == -1 -+ return -+ endif -+ -+ let cur_lnum = line('.') -+ -+ if a:dir == -1 -+ if cur_lnum > s:tlist_{fidx}_start -+ " Move to the beginning of the current file -+ exe s:tlist_{fidx}_start -+ return -+ endif -+ -+ 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 -+ -+ 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 -+ " Cursor is at the last file, wrap around to the first file -+ let fidx = 0 -+ endif -+ -+ if s:tlist_{fidx}_start != 0 -+ exe s:tlist_{fidx}_start -+ endif -+ return -+ endif -+endfunction -+ -+" Tlist_Session_Load -+" Load a taglist session (information about all the displayed files -+" and the tags) from the specified file -+function! s:Tlist_Session_Load(...) -+ if a:0 == 0 || a:1 == '' -+ call s:Tlist_Warning_Msg('Usage: TlistSessionLoad ') -+ return -+ endif -+ -+ let sessionfile = a:1 -+ -+ if !filereadable(sessionfile) -+ let msg = 'Taglist: Error - Unable to open file ' . sessionfile -+ call s:Tlist_Warning_Msg(msg) -+ return -+ endif -+ -+ " Mark the current window as the file window -+ call s:Tlist_Window_Mark_File_Window() -+ -+ " Source the session file -+ exe 'source ' . sessionfile -+ -+ let new_file_count = g:tlist_file_count -+ unlet! g:tlist_file_count -+ -+ let i = 0 -+ while i < new_file_count -+ let ftype = g:tlist_{i}_filetype -+ unlet! g:tlist_{i}_filetype -+ -+ if !exists('s:tlist_' . ftype . '_count') -+ if s:Tlist_FileType_Init(ftype) == 0 -+ let i = i + 1 -+ continue -+ endif -+ endif -+ -+ let fname = g:tlist_{i}_filename -+ unlet! g:tlist_{i}_filename -+ -+ let fidx = s:Tlist_Get_File_Index(fname) -+ if fidx != -1 -+ let s:tlist_{fidx}_visible = 0 -+ let i = i + 1 -+ continue -+ else -+ " As we are loading the tags from the session file, if this -+ " file was previously deleted by the user, now we need to -+ " add it back. So remove the file from the deleted list. -+ call s:Tlist_Update_Remove_List(fname, 0) -+ endif -+ -+ let fidx = s:Tlist_Init_File(fname, ftype) -+ -+ let s:tlist_{fidx}_filename = fname -+ -+ let s:tlist_{fidx}_sort_type = g:tlist_{i}_sort_type -+ unlet! g:tlist_{i}_sort_type -+ -+ let s:tlist_{fidx}_filetype = ftype -+ let s:tlist_{fidx}_mtime = getftime(fname) -+ -+ let s:tlist_{fidx}_start = 0 -+ let s:tlist_{fidx}_end = 0 -+ -+ let s:tlist_{fidx}_valid = 1 -+ -+ let s:tlist_{fidx}_tag_count = g:tlist_{i}_tag_count -+ unlet! g:tlist_{i}_tag_count -+ -+ let j = 1 -+ while j <= s:tlist_{fidx}_tag_count -+ let s:tlist_{fidx}_{j}_tag = g:tlist_{i}_{j}_tag -+ let s:tlist_{fidx}_{j}_tag_name = g:tlist_{i}_{j}_tag_name -+ let s:tlist_{fidx}_{j}_ttype_idx = g:tlist_{i}_{j}_ttype_idx -+ unlet! g:tlist_{i}_{j}_tag -+ unlet! g:tlist_{i}_{j}_tag_name -+ unlet! g:tlist_{i}_{j}_ttype_idx -+ let j = j + 1 -+ endwhile -+ -+ let j = 1 -+ while j <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{j}_name -+ -+ if exists('g:tlist_' . i . '_' . ttype) -+ let s:tlist_{fidx}_{ttype} = g:tlist_{i}_{ttype} -+ unlet! g:tlist_{i}_{ttype} -+ let s:tlist_{fidx}_{ttype}_offset = 0 -+ let s:tlist_{fidx}_{ttype}_count = g:tlist_{i}_{ttype}_count -+ unlet! g:tlist_{i}_{ttype}_count -+ -+ let k = 1 -+ while k <= s:tlist_{fidx}_{ttype}_count -+ let s:tlist_{fidx}_{ttype}_{k} = g:tlist_{i}_{ttype}_{k} -+ unlet! g:tlist_{i}_{ttype}_{k} -+ let k = k + 1 -+ endwhile -+ else -+ let s:tlist_{fidx}_{ttype} = '' -+ let s:tlist_{fidx}_{ttype}_offset = 0 -+ let s:tlist_{fidx}_{ttype}_count = 0 -+ endif -+ -+ let j = j + 1 -+ endwhile -+ -+ let i = i + 1 -+ endwhile -+ -+ " If the taglist window is open, then update it -+ let winnum = bufwinnr(g:TagList_title) -+ if winnum != -1 -+ let save_winnr = winnr() -+ -+ " Goto the taglist window -+ call s:Tlist_Window_Goto_Window() -+ -+ " Refresh the taglist window -+ call s:Tlist_Window_Refresh() -+ -+ " Go back to the original window -+ if save_winnr != winnr() -+ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') -+ endif -+ endif -+endfunction -+ -+" Tlist_Session_Save -+" Save a taglist session (information about all the displayed files -+" and the tags) into the specified file -+function! s:Tlist_Session_Save(...) -+ if a:0 == 0 || a:1 == '' -+ call s:Tlist_Warning_Msg('Usage: TlistSessionSave ') -+ return -+ endif -+ -+ let sessionfile = a:1 -+ -+ if s:tlist_file_count == 0 -+ " There is nothing to save -+ call s:Tlist_Warning_Msg('Warning: Taglist is empty. Nothing to save.') -+ return -+ endif -+ -+ if filereadable(sessionfile) -+ let ans = input('Do you want to overwrite ' . sessionfile . ' (Y/N)?') -+ if ans !=? 'y' -+ return -+ endif -+ -+ echo "\n" -+ endif -+ -+ let old_verbose = &verbose -+ set verbose&vim -+ -+ exe 'redir! > ' . sessionfile -+ -+ silent! echo '" Taglist session file. This file is auto-generated.' -+ silent! echo '" File information' -+ silent! echo 'let tlist_file_count = ' . s:tlist_file_count -+ -+ let i = 0 -+ -+ while i < s:tlist_file_count -+ " Store information about the file -+ silent! echo 'let tlist_' . i . "_filename = '" . -+ \ s:tlist_{i}_filename . "'" -+ silent! echo 'let tlist_' . i . '_sort_type = "' . -+ \ s:tlist_{i}_sort_type . '"' -+ silent! echo 'let tlist_' . i . '_filetype = "' . -+ \ s:tlist_{i}_filetype . '"' -+ silent! echo 'let tlist_' . i . '_tag_count = ' . -+ \ s:tlist_{i}_tag_count -+ " Store information about all the tags -+ let j = 1 -+ while j <= s:tlist_{i}_tag_count -+ let txt = escape(s:tlist_{i}_{j}_tag, '"\\') -+ silent! echo 'let tlist_' . i . '_' . j . '_tag = "' . txt . '"' -+ silent! echo 'let tlist_' . i . '_' . j . '_tag_name = "' . -+ \ s:tlist_{i}_{j}_tag_name . '"' -+ silent! echo 'let tlist_' . i . '_' . j . '_ttype_idx' . ' = ' . -+ \ s:tlist_{i}_{j}_ttype_idx -+ let j = j + 1 -+ endwhile -+ -+ " Store information about all the tags grouped by their type -+ let ftype = s:tlist_{i}_filetype -+ let j = 1 -+ while j <= s:tlist_{ftype}_count -+ let ttype = s:tlist_{ftype}_{j}_name -+ if s:tlist_{i}_{ttype}_count != 0 -+ let txt = substitute(s:tlist_{i}_{ttype}, "\n", "\\\\n", 'g') -+ silent! echo 'let tlist_' . i . '_' . ttype . ' = "' . -+ \ txt . '"' -+ silent! echo 'let tlist_' . i . '_' . ttype . '_count = ' . -+ \ s:tlist_{i}_{ttype}_count -+ let k = 1 -+ while k <= s:tlist_{i}_{ttype}_count -+ silent! echo 'let tlist_' . i . '_' . ttype . '_' . k . -+ \ ' = ' . s:tlist_{i}_{ttype}_{k} -+ let k = k + 1 -+ endwhile -+ endif -+ let j = j + 1 -+ endwhile -+ -+ silent! echo -+ -+ let i = i + 1 -+ endwhile -+ -+ redir END -+ -+ let &verbose = old_verbose -+endfunction -+ -+" Tlist_Buffer_Removed -+" 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 . ')') -+ -+ " Make sure a valid filename is supplied -+ if a:filename == '' -+ return -+ endif -+ -+ " Get tag list index of the specified file -+ let fidx = s:Tlist_Get_File_Index(a:filename) -+ if fidx == -1 -+ " File not present in the taglist -+ return -+ endif -+ -+ " Remove the file from the list -+ call s:Tlist_Remove_File(fidx, 0) -+endfunction -+ -+" When a buffer is deleted, remove the file from the taglist -+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(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) -+ if winnum == -1 -+ call s:Tlist_Warning_Msg('Taglist: Error - Taglist window is not open') -+ return -+ endif -+ -+ " Save the original window number -+ let org_winnr = winnr() -+ if org_winnr == winnum -+ let in_taglist_window = 1 -+ else -+ let in_taglist_window = 0 -+ endif -+ -+ if in_taglist_window -+ " When entering the taglist window, no need to update the folds -+ return -+ endif -+ -+ " Go to the taglist window -+ if !in_taglist_window -+ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') -+ endif -+ -+ " Close all the folds -+ silent! %foldclose -+ -+ " Get tag list index of the specified file -+ 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 -+ if !in_taglist_window -+ call s:Tlist_Exe_Cmd_No_Acmds(org_winnr . 'wincmd w') -+ endif -+endfunction -+ -+" 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_Window_Check_Auto_Open() -+ let open_window = 0 -+ -+ let i = 1 -+ let buf_num = winbufnr(i) -+ while buf_num != -1 -+ let filename = fnamemodify(bufname(buf_num), ':p') -+ if !s:Tlist_Skip_File(filename, getbufvar(buf_num, '&filetype')) -+ let open_window = 1 -+ break -+ endif -+ let i = i + 1 -+ let buf_num = winbufnr(i) -+ endwhile -+ -+ if open_window -+ call s:Tlist_Window_Toggle() -+ endif -+endfunction -+ -+function! s:Tlist_Menu_Add_Base_Menu() -+ call s:Tlist_Log_Msg('Adding the base menu') -+ -+ " Add the menu -+ anoremenu T&ags.Refresh\ menu :call Tlist_Menu_Refresh() -+ anoremenu T&ags.Sort\ menu\ by.Name -+ \ :call Tlist_Change_Sort('menu', 'set', 'name') -+ anoremenu T&ags.Sort\ menu\ by.Order -+ \ :call Tlist_Change_Sort('menu', 'set', 'order') -+ anoremenu T&ags.-SEP1- : -+ -+ if &mousemodel =~ 'popup' -+ anoremenu PopUp.T&ags.Refresh\ menu -+ \ :call Tlist_Menu_Refresh() -+ anoremenu PopUp.T&ags.Sort\ menu\ by.Name -+ \ :call Tlist_Change_Sort('menu', 'set', 'name') -+ anoremenu PopUp.T&ags.Sort\ menu\ by.Order -+ \ :call Tlist_Change_Sort('menu', 'set', 'order') -+ anoremenu PopUp.T&ags.-SEP1- : -+ endif -+endfunction -+ -+let s:menu_char_prefix = -+ \ '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' -+ -+" Tlist_Menu_Get_Tag_Type_Cmd -+" Get the menu command for the specified tag type -+" 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 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 -+ -+ " Number of tag entries for this tag type -+ let tcnt = s:tlist_{fidx_ttype}_count -+ if tcnt == 0 " No entries for this tag type -+ return '' -+ endif -+ -+ let mcmd = '' -+ -+ " Create the menu items for the tags. -+ " Depending on the number of tags of this type, split the menu into -+ " multiple sub-menus, if needed. -+ if tcnt > g:Tlist_Max_Submenu_Items -+ let j = 1 -+ while j <= tcnt -+ let final_index = j + g:Tlist_Max_Submenu_Items - 1 -+ if final_index > tcnt -+ let final_index = tcnt -+ endif -+ -+ " Extract the first and last tag name and form the -+ " sub-menu name -+ let tidx = s:tlist_{fidx_ttype}_{j} -+ let first_tag = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ let tidx = s:tlist_{fidx_ttype}_{final_index} -+ let last_tag = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ " Truncate the names, if they are greater than the -+ " max length -+ let first_tag = strpart(first_tag, 0, g:Tlist_Max_Tag_Length) -+ let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length) -+ -+ " Form the menu command prefix -+ 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 -+ -+ while j <= final_index -+ let tidx = s:tlist_{fidx_ttype}_{j} -+ -+ let tname = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ let mcmd = mcmd . m_prefix . '\&' . -+ \ s:menu_char_prefix[m_prefix_idx] . '\.' . -+ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . -+ \ tidx . ')|' -+ -+ let m_prefix_idx = m_prefix_idx + 1 -+ let j = j + 1 -+ endwhile -+ endwhile -+ else -+ " Character prefix used to number the menu items (hotkey) -+ let m_prefix_idx = 0 -+ -+ 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} -+ -+ let tname = s:tlist_{a:fidx}_{tidx}_tag_name -+ -+ let mcmd = mcmd . m_prefix . '\&' . -+ \ s:menu_char_prefix[m_prefix_idx] . '\.' . -+ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . tidx -+ \ . ')|' -+ -+ let m_prefix_idx = m_prefix_idx + 1 -+ let j = j + 1 -+ endwhile -+ endif -+ -+ return mcmd -+endfunction -+ -+" Update the taglist menu with the tags for the specified file -+function! s:Tlist_Menu_File_Refresh(fidx) -+ call s:Tlist_Log_Msg('Refreshing the tag menu for ' . s:tlist_{a:fidx}_filename) -+ " The 'B' flag is needed in the 'cpoptions' option -+ let old_cpoptions = &cpoptions -+ set cpoptions&vim -+ -+ exe s:tlist_{a:fidx}_menu_cmd -+ -+ " Update the popup menu (if enabled) -+ if &mousemodel =~ 'popup' -+ let cmd = substitute(s:tlist_{a:fidx}_menu_cmd, ' T\\&ags\.', -+ \ ' PopUp.T\\\&ags.', "g") -+ exe cmd -+ endif -+ -+ " The taglist menu is not empty now -+ let s:tlist_menu_empty = 0 -+ -+ " Restore the 'cpoptions' settings -+ let &cpoptions = old_cpoptions -+endfunction -+ -+" Tlist_Menu_Update_File -+" Add the taglist menu -+function! s:Tlist_Menu_Update_File(clear_menu) -+ if !has('gui_running') -+ " Not running in GUI mode -+ return -+ endif -+ -+ call s:Tlist_Log_Msg('Updating the tag menu, clear_menu = ' . a:clear_menu) -+ -+ " Remove the tags menu -+ if a:clear_menu -+ call s:Tlist_Menu_Remove_File() -+ -+ endif -+ -+ let fname = escape(fnamemodify(bufname('%'), ':t'), '.') -+ if fname != '' -+ exe 'anoremenu T&ags.' . fname . ' ' -+ anoremenu T&ags.-SEP2- : -+ endif -+ -+ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help -+ if &buftype != '' -+ return -+ endif -+ -+ let filename = fnamemodify(bufname('%'), ':p') -+ let ftype = &filetype -+ -+ " If the file doesn't support tag listing, skip it -+ if s:Tlist_Skip_File(filename, ftype) -+ return -+ endif -+ -+ let fidx = s:Tlist_Get_File_Index(filename) -+ if fidx == -1 || !s:tlist_{fidx}_valid -+ " Check whether this file is removed based on user request -+ " If it is, then don't display the tags for this file -+ if s:Tlist_User_Removed_File(filename) -+ return -+ endif -+ -+ " Process the tags for the file -+ let fidx = s:Tlist_Process_File(filename, ftype) -+ if fidx == -1 -+ return -+ endif -+ endif -+ -+ if !s:tlist_{fidx}_tag_count -+ return -+ endif -+ -+ if s:tlist_{fidx}_menu_cmd != '' -+ " Update the menu with the cached command -+ call s:Tlist_Menu_File_Refresh(fidx) -+ -+ return -+ endif -+ -+ " We are going to add entries to the tags menu, so the menu won't be -+ " empty -+ let s:tlist_menu_empty = 0 -+ -+ 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, add_ttype_name, i) -+ if mcmd != '' -+ let cmd = cmd . mcmd -+ endif -+ -+ let i = i + 1 -+ endwhile -+ -+ " Cache the menu command for reuse -+ let s:tlist_{fidx}_menu_cmd = cmd -+ -+ " Update the menu -+ call s:Tlist_Menu_File_Refresh(fidx) -+endfunction -+ -+" Tlist_Menu_Remove_File -+" Remove the tags displayed in the tags menu -+function! s:Tlist_Menu_Remove_File() -+ if !has('gui_running') || s:tlist_menu_empty -+ return -+ endif -+ -+ call s:Tlist_Log_Msg('Removing the tags menu for a file') -+ -+ " Cleanup the Tags menu -+ silent! unmenu T&ags -+ if &mousemodel =~ 'popup' -+ silent! unmenu PopUp.T&ags -+ endif -+ -+ " Add a dummy menu item to retain teared off menu -+ noremenu T&ags.Dummy l -+ -+ silent! unmenu! T&ags -+ if &mousemodel =~ 'popup' -+ silent! unmenu! PopUp.T&ags -+ endif -+ -+ call s:Tlist_Menu_Add_Base_Menu() -+ -+ " Remove the dummy menu item -+ unmenu T&ags.Dummy -+ -+ let s:tlist_menu_empty = 1 -+endfunction -+ -+" Tlist_Menu_Refresh -+" Refresh the taglist menu -+function! s:Tlist_Menu_Refresh() -+ call s:Tlist_Log_Msg('Refreshing the tags menu') -+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) -+ if fidx != -1 -+ " Invalidate the cached menu command -+ let s:tlist_{fidx}_menu_cmd = '' -+ endif -+ -+ " Update the taglist, menu and window -+ call s:Tlist_Update_Current_File() -+endfunction -+ -+" Tlist_Menu_Jump_To_Tag -+" Jump to the selected tag -+function! s:Tlist_Menu_Jump_To_Tag(tidx) -+ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) -+ if fidx == -1 -+ return -+ endif -+ -+ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, a:tidx) -+ if tagpat == '' -+ return -+ endif -+ -+ " Add the current cursor position to the jump list, so that user can -+ " jump back using the ' and ` marks. -+ mark ' -+ -+ silent call search(tagpat, 'w') -+ -+ " Bring the line to the middle of the window -+ normal! z. -+ -+ " If the line is inside a fold, open the fold -+ if foldclosed('.') != -1 -+ .foldopen -+ endif -+endfunction -+ -+" Tlist_Menu_Init -+" Initialize the taglist menu -+function! s:Tlist_Menu_Init() -+ call s:Tlist_Menu_Add_Base_Menu() -+ -+ " Automatically add the tags defined in the current file to the menu -+ augroup TagListMenuCmds -+ autocmd! -+ -+ if !g:Tlist_Process_File_Always -+ autocmd BufEnter * call s:Tlist_Refresh() -+ endif -+ autocmd BufLeave * call s:Tlist_Menu_Remove_File() -+ augroup end -+ -+ call s:Tlist_Menu_Update_File(0) -+endfunction -+ -+" Tlist_Vim_Session_Load -+" Initialize the taglist window/buffer, which is created when loading -+" a Vim session file. -+function! s:Tlist_Vim_Session_Load() -+ call s:Tlist_Log_Msg('Tlist_Vim_Session_Load') -+ -+ " Initialize the taglist window -+ call s:Tlist_Window_Init() -+ -+ " Refresh the taglist window -+ call s:Tlist_Window_Refresh() -+endfunction -+ -+" Tlist_Set_App -+" Set the name of the external plugin/application to which taglist -+" belongs. -+" Taglist plugin is part of another plugin like cream or winmanager. -+function! Tlist_Set_App(name) -+ if a:name == "" -+ return -+ endif -+ -+ let s:tlist_app_name = a:name -+endfunction -+ -+" Winmanager integration -+ -+" Initialization required for integration with winmanager -+function! TagList_Start() -+ " If current buffer is not taglist buffer, then don't proceed -+ if bufname('%') != '__Tag_List__' -+ return -+ endif -+ -+ call Tlist_Set_App('winmanager') -+ -+ " Get the current filename from the winmanager plugin -+ let bufnum = WinManagerGetLastEditedFile() -+ if bufnum != -1 -+ let filename = fnamemodify(bufname(bufnum), ':p') -+ let ftype = getbufvar(bufnum, '&filetype') -+ endif -+ -+ " Initialize the taglist window, if it is not already initialized -+ if !exists('s:tlist_window_initialized') || !s:tlist_window_initialized -+ call s:Tlist_Window_Init() -+ call s:Tlist_Window_Refresh() -+ let s:tlist_window_initialized = 1 -+ endif -+ -+ " Update the taglist window -+ if bufnum != -1 -+ if !s:Tlist_Skip_File(filename, ftype) && g:Tlist_Auto_Update -+ call s:Tlist_Window_Refresh_File(filename, ftype) -+ endif -+ endif -+endfunction -+ -+function! TagList_IsValid() -+ return 0 -+endfunction -+ -+function! TagList_WrapUp() -+ return 0 -+endfunction -+ -+" restore 'cpo' -+let &cpo = s:cpo_save -+unlet s:cpo_save -+ -diff -urN vim71/runtime/syntax/ada.vim vim71_ada/runtime/syntax/ada.vim ---- vim71/runtime/syntax/ada.vim 2007-05-05 20:22:26.000000000 +0200 -+++ vim71_ada/runtime/syntax/ada.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -1,17 +1,17 @@ - "---------------------------------------------------------------------------- - " Description: Vim Ada syntax file - " Language: Ada (2005) --" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ -+" $Id: vim-7.1-ada.patch,v 1.3 2008/01/18 15:30:13 karsten Exp $ - " Copyright: Copyright (C) 2006 Martin Krischik - " Maintainer: Martin Krischik - " David A. Wheeler - " Simon Bradley - " Contributors: Preben Randhol. --" $Author: karsten $ --" $Date: 2008/01/18 15:30:13 $ --" Version: 4.2 --" $Revision: 1.3 $ --" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ -+" $Author: karsten $ -+" $Date: 2008/01/18 15:30:13 $ -+" Version: 4.5 -+" $Revision: 1.3 $ -+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ - " http://www.dwheeler.com/vim - " History: 24.05.2006 MK Unified Headers - " 26.05.2006 MK ' should not be in iskeyword. -@@ -98,7 +98,8 @@ - " - if exists("g:ada_rainbow_color") - syntax match adaSpecial "[:;.,]" -- runtime plugin/Rainbow_Parenthsis.vim -+ call rainbow_parenthsis#LoadRound () -+ call rainbow_parenthsis#Activate () - else - syntax match adaSpecial "[:;().,]" - endif -@@ -159,7 +160,7 @@ - " Section: end {{{1 - " Unless special ("end loop", "end if", etc.), "end" marks the end of a - " begin, package, task etc. Assiging it to adaEnd. --syntax match adaEnd "\" -+syntax match adaEnd /\/ - - syntax keyword adaPreproc pragma - -diff -urN vim71/runtime/syntax/bush.vim vim71_ada/runtime/syntax/bush.vim ---- vim71/runtime/syntax/bush.vim 1970-01-01 01:00:00.000000000 +0100 -+++ vim71_ada/runtime/syntax/bush.vim 2008-01-16 16:37:03.000000000 +0100 -@@ -0,0 +1,309 @@ -+" Vim syntax file -+" Language: BUSH / AdaScript -+" Maintainer: Ken O. Burtch -+" URL: http://www.pegasoft.ca/bush -+" Last Change: 2004-06-29 -+ -+" Former Maintainer: Simon Bradley -+" (was ) -+" Other contributors: Preben Randhol. -+" The formal spec of Ada95 (ARM) is the "Ada95 Reference Manual". -+" For more Ada95 info, see http://www.gnuada.org and http://www.adapower.com. -+ -+" This vim syntax file works on vim 5.6, 5.7, 5.8 and 6.x. -+" It implements Bram Moolenaar's April 25, 2001 recommendations to make -+" the syntax file maximally portable across different versions of vim. -+" If vim 6.0+ is available, -+" this syntax file takes advantage of the vim 6.0 advanced pattern-matching -+" functions to avoid highlighting uninteresting leading spaces in -+" some expressions containing "with" and "use". -+ -+" For version 5.x: Clear all syntax items -+" For version 6.x: Quit when a syntax file was already loaded -+if version < 600 -+ syntax clear -+elseif exists("b:current_syntax") -+ finish -+endif -+ -+" Ada is entirely case-insensitive. -+syn case ignore -+ -+" We don't need to look backwards to highlight correctly; -+" this speeds things up greatly. -+syn sync minlines=1 maxlines=1 -+ -+" Highlighting commands. There are 69 reserved words in total in Ada95. -+" Some keywords are used in more than one way. For example: -+" 1. "end" is a general keyword, but "end if" ends a Conditional. -+" 2. "then" is a conditional, but "and then" is an operator. -+ -+ -+" Standard Exceptions (including I/O). -+" We'll highlight the standard exceptions, similar to vim's Python mode. -+" It's possible to redefine the standard exceptions as something else, -+" but doing so is very bad practice, so simply highlighting them makes sense. -+syn keyword adaException Constraint_Error Program_Error Storage_Error -+syn keyword adaException Tasking_Error -+syn keyword adaException Status_Error Mode_Error Name_Error Use_Error -+syn keyword adaException Device_Error End_Error Data_Error Layout_Error -+syn keyword adaException Length_Error Pattern_Error Index_Error -+syn keyword adaException Translation_Error -+syn keyword adaException Time_Error Argument_Error -+syn keyword adaException Tag_Error -+syn keyword adaException Picture_Error -+" Interfaces -+syn keyword adaException Terminator_Error Conversion_Error -+syn keyword adaException Pointer_Error Dereference_Error Update_Error -+" This isn't in the Ada spec, but a GNAT extension. -+syn keyword adaException Assert_Failure -+" We don't list ALL exceptions defined in particular compilers (e.g., GNAT), -+" because it's quite reasonable to define those phrases as non-exceptions. -+ -+ -+" We don't normally highlight types in package Standard -+" (Integer, Character, Float, etc.). I don't think it looks good -+" with the other type keywords, and many Ada programs define -+" so many of their own types that it looks inconsistent. -+" However, if you want this highlighting, turn on "ada_standard_types". -+" For package Standard's definition, see ARM section A.1. -+ -+if exists("ada_standard_types") -+ syn keyword adaBuiltinType Boolean Integer Natural Positive Float -+ syn keyword adaBuiltinType Character Wide_Character -+ syn keyword adaBuiltinType String Wide_String -+ syn keyword adaBuiltinType Duration -+ " These aren't listed in ARM section A.1's code, but they're noted as -+ " options in ARM sections 3.5.4 and 3.5.7: -+ syn keyword adaBuiltinType Short_Integer Short_Short_Integer -+ syn keyword adaBuiltinType Long_Integer Long_Long_Integer -+ syn keyword adaBuiltinType Short_Float Short_Short_Float -+ syn keyword adaBuiltinType Long_Float Long_Long_Float -+ " BUSH-specific types -+ syn keyword adaBuiltinType command -+ syn keyword adaBuiltinType socket_type -+ syn keyword adaBuiltinType unbounded_string -+ syn keyword adaBuiltinType universal_typeless -+ syn keyword adaBuiltinType universal_string -+ syn keyword adaBuiltinType universal_numeric -+endif -+ -+" There are MANY other predefined types; they've not been added, because -+" determining when they're a type requires context in general. -+" One potential addition would be Unbounded_String. -+ -+ -+syn keyword adaLabel others -+ -+syn keyword adaOperator abs mod not rem xor -+syn match adaOperator "\" -+syn match adaOperator "\" -+syn match adaOperator "\" -+syn match adaOperator "\" -+syn match adaOperator "[-+*/<>&]" -+syn keyword adaOperator ** -+syn match adaOperator "[/<>]=" -+syn keyword adaOperator => -+syn match adaOperator "\.\." -+syn match adaOperator "=" -+ -+" We won't map "adaAssignment" by default, but we need to map ":=" to -+" something or the "=" inside it will be mislabelled as an operator. -+" Note that in Ada, assignment (:=) is not considered an operator. -+syn match adaAssignment ":=" -+ -+" Handle the box, <>, specially: -+syn keyword adaSpecial <> -+ -+" Numbers, including floating point, exponents, and alternate bases. -+syn match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" -+syn match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" -+ -+" Identify leading numeric signs. In "A-5" the "-" is an operator, -+" but in "A:=-5" the "-" is a sign. This handles "A3+-5" (etc.) correctly. -+" This assumes that if you put a don't put a space after +/- when it's used -+" as an operator, you won't put a space before it either -- which is true -+" in code I've seen. -+syn match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 -+ -+" Labels for the goto statement. -+syn region adaLabel start="<<" end=">>" -+ -+" Boolean Constants. -+syn keyword adaBoolean true false -+ -+" Warn people who try to use C/C++ notation erroneously: -+syn match adaError "//" -+syn match adaError "/\*" -+syn match adaError "==" -+ -+ -+if exists("ada_space_errors") -+ if !exists("ada_no_trail_space_error") -+ syn match adaSpaceError excludenl "\s\+$" -+ endif -+ if !exists("ada_no_tab_space_error") -+ syn match adaSpaceError " \+\t"me=e-1 -+ endif -+endif -+ -+" Unless special ("end loop", "end if", etc.), "end" marks the end of a -+" begin, package, task etc. Assiging it to adaEnd. -+syn match adaEnd "\" -+ -+syn keyword adaPreproc pragma -+ -+syn keyword adaRepeat exit for loop reverse while -+syn match adaRepeat "\" -+ -+syn keyword adaStatement accept delay goto raise requeue return -+syn keyword adaStatement terminate -+" BUSH-specific statements -+syn keyword adaStatement cd -+syn keyword adaStatement clear -+syn keyword adaStatement env -+syn keyword adaStatement inkey -+syn keyword adaStatement jobs -+syn keyword adaStatement logout -+syn keyword adaStatement pwd -+syn keyword adaStatement step -+syn keyword adaStatement trace -+syn keyword adaStatement typeset -+syn keyword adaStatement unset -+syn keyword adaStatement wait -+syn keyword adaStatement history -+syn keyword adaStatement "?" -+syn match adaStatement "\" -+ -+" Handle Ada's record keywords. -+" 'record' usually starts a structure, but "with null record;" does not, -+" and 'end record;' ends a structure. The ordering here is critical - -+" 'record;' matches a "with null record", so make it a keyword (this can -+" match when the 'with' or 'null' is on a previous line). -+" We see the "end" in "end record" before the word record, so we match that -+" pattern as adaStructure (and it won't match the "record;" pattern). -+syn match adaStructure "\" -+syn match adaStructure "\" -+syn match adaKeyword "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn match adaConditional "\" -+syn keyword adaConditional if case select -+syn keyword adaConditional elsif when -+ -+syn keyword adaKeyword all do exception in is new null out -+syn keyword adaKeyword separate until -+ -+" These keywords begin various constructs, and you _might_ want to -+" highlight them differently. -+syn keyword adaBegin begin body declare entry function generic -+syn keyword adaBegin package procedure protected renames task -+ -+ -+if exists("ada_withuse_ordinary") -+" Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. -+ syn keyword adaKeyword with use -+else -+ " Highlight "with" and "use" clauses like C's "#include" when they're used -+ " to reference other compilation units; otherwise they're ordinary keywords. -+ " If we have vim 6.0 or later, we'll use its advanced pattern-matching -+ " capabilities so that we won't match leading spaces. -+ syn match adaKeyword "\" -+ syn match adaKeyword "\" -+ if version < 600 -+ syn match adaBeginWith "^\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ syn match adaSemiWith ";\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>"lc=1 contains=adaInc -+ else -+ syn match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ syn match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc -+ endif -+ syn match adaInc "\" contained contains=NONE -+ syn match adaInc "\" contained contains=NONE -+ syn match adaInc "\" contained contains=NONE -+ " Recognize "with null record" as a keyword (even the "record"). -+ syn match adaKeyword "\" -+ " Consider generic formal parameters of subprograms and packages as keywords. -+ if version < 600 -+ syn match adaKeyword ";\s*with\s\+\(function\|procedure\|package\)\>" -+ syn match adaKeyword "^\s*with\s\+\(function\|procedure\|package\)\>" -+ else -+ syn match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>" -+ syn match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>" -+ endif -+endif -+ -+ -+" String and character constants. -+syn region adaString start=+"+ skip=+""+ end=+"+ -+syn match adaCharacter "'.'" -+ -+" Todo (only highlighted in comments) -+syn keyword adaTodo contained TODO FIXME XXX -+ -+" Comments. -+syn region adaComment oneline contains=adaTodo start="--" end="$" -+ -+ -+ -+" Define the default highlighting. -+" For version 5.7 and earlier: only when not done already -+" For version 5.8 and later: only when an item doesn't have highlighting yet -+if version >= 508 || !exists("did_ada_syn_inits") -+ if version < 508 -+ let did_ada_syn_inits = 1 -+ command -nargs=+ HiLink hi link -+ else -+ command -nargs=+ HiLink hi def link -+ endif -+ -+ " The default methods for highlighting. Can be overridden later. -+ HiLink adaCharacter Character -+ HiLink adaComment Comment -+ HiLink adaConditional Conditional -+ HiLink adaKeyword Keyword -+ HiLink adaLabel Label -+ HiLink adaNumber Number -+ HiLink adaSign Number -+ HiLink adaOperator Operator -+ HiLink adaPreproc PreProc -+ HiLink adaRepeat Repeat -+ HiLink adaSpecial Special -+ HiLink adaStatement Statement -+ HiLink adaString String -+ HiLink adaStructure Structure -+ HiLink adaTodo Todo -+ HiLink adaType Type -+ HiLink adaTypedef Typedef -+ HiLink adaStorageClass StorageClass -+ HiLink adaBoolean Boolean -+ HiLink adaException Exception -+ HiLink adaInc Include -+ HiLink adaError Error -+ HiLink adaSpaceError Error -+ HiLink adaBuiltinType Type -+ -+ if exists("ada_begin_preproc") -+ " This is the old default display: -+ HiLink adaBegin PreProc -+ HiLink adaEnd PreProc -+ else -+ " This is the new default display: -+ HiLink adaBegin Keyword -+ HiLink adaEnd Keyword -+ endif -+ -+ delcommand HiLink -+endif -+ -+let b:current_syntax = "ada" -+ -+" vim: ts=8 diff --git a/vim-7.1-erlang.patch b/vim-7.1-erlang.patch deleted file mode 100644 index e5efbe2b..00000000 --- a/vim-7.1-erlang.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up vim71/runtime/filetype.vim.erlang vim71/runtime/filetype.vim ---- vim71/runtime/filetype.vim.erlang 2008-02-25 17:50:50.000000000 +0100 -+++ vim71/runtime/filetype.vim 2008-02-25 17:51:17.000000000 +0100 -@@ -595,7 +595,7 @@ func! s:FTe() - endfunc - - " ERicsson LANGuage --au BufNewFile,BufRead *.erl setf erlang -+au BufNewFile,BufRead *.erl,*hrl setf erlang - - " Elm Filter Rules file - au BufNewFile,BufRead filter-rules setf elmfilt diff --git a/vim-6.4-lib64.patch b/vim-7.1-lib64.patch similarity index 58% rename from vim-6.4-lib64.patch rename to vim-7.1-lib64.patch index d74e6f26..9a21477b 100644 --- a/vim-6.4-lib64.patch +++ b/vim-7.1-lib64.patch @@ -1,7 +1,8 @@ ---- vim64/src/auto/configure.lib64 2005-10-15 14:55:10.000000000 +0200 -+++ vim64/src/auto/configure 2006-03-09 15:23:39.000000000 +0100 -@@ -1813,7 +1813,7 @@ - +diff -up vim71/src/auto/configure.lib64 vim71/src/auto/configure +--- vim71/src/auto/configure.lib64 2008-07-23 12:36:17.000000000 +0200 ++++ vim71/src/auto/configure 2008-07-23 12:37:04.000000000 +0200 +@@ -4291,7 +4291,7 @@ else + vi_cv_path_python_conf= for path in "${vi_cv_path_python_pfx}" "${vi_cv_path_python_epfx}"; do - for subdir in lib share; do @@ -9,9 +10,10 @@ d="${path}/${subdir}/python${vi_cv_var_python_version}/config" if test -d "$d" && test -f "$d/config.c"; then vi_cv_path_python_conf="$d" ---- vim64/src/configure.in.lib64 2006-03-09 15:24:07.000000000 +0100 -+++ vim64/src/configure.in 2006-03-09 15:24:47.000000000 +0100 -@@ -472,7 +472,7 @@ +diff -up vim71/src/configure.in.lib64 vim71/src/configure.in +--- vim71/src/configure.in.lib64 2008-07-23 12:36:17.000000000 +0200 ++++ vim71/src/configure.in 2008-07-23 12:36:17.000000000 +0200 +@@ -634,7 +634,7 @@ if test "$enable_pythoninterp" = "yes"; [ vi_cv_path_python_conf= for path in "${vi_cv_path_python_pfx}" "${vi_cv_path_python_epfx}"; do diff --git a/vim-7.0-fstabsyntax.patch b/vim-7.2-fstabsyntax.patch similarity index 55% rename from vim-7.0-fstabsyntax.patch rename to vim-7.2-fstabsyntax.patch index 9798132d..5acfe960 100644 --- a/vim-7.0-fstabsyntax.patch +++ b/vim-7.2-fstabsyntax.patch @@ -1,15 +1,16 @@ ---- vim70/runtime/syntax/fstab.vim.fstabsyntax 2006-09-11 14:03:39.000000000 +0200 -+++ vim70/runtime/syntax/fstab.vim 2006-09-11 14:14:34.000000000 +0200 -@@ -39,7 +39,7 @@ +diff -up vim72/runtime/syntax/fstab.vim.fstabsyntax vim72/runtime/syntax/fstab.vim +--- vim72/runtime/syntax/fstab.vim.fstabsyntax 2008-01-16 21:52:16.000000000 +0100 ++++ vim72/runtime/syntax/fstab.vim 2008-08-14 17:02:08.000000000 +0200 +@@ -46,7 +46,7 @@ syn keyword fsMountPointKeyword containe " Type syn cluster fsTypeCluster contains=fsTypeKeyword,fsTypeUnknown syn match fsTypeUnknown /\s\+\zs\w\+/ contained --syn keyword fsTypeKeyword contained adfs ados affs atfs audiofs auto autofs befs bfs cd9660 cfs cifs coda cramfs devfs devpts e2compr efs ext2 ext2fs ext3 fdesc ffs filecore hfs hpfs iso9660 jffs jffs2 jfs kernfs lfs linprocfs mfs minix msdos ncpfs nfs none ntfs null nwfs overlay ovlfs portal proc procfs ptyfs qnx4 reiserfs romfs shm smbfs std subfs swap sysfs sysv tcfs tmpfs udf ufs umap umsdos union usbfs userfs vfat vs3fs vxfs wrapfs wvfs xfs zisofs -+syn keyword fsTypeKeyword contained adfs ados affs atfs audiofs auto autofs befs bfs binfmt_misc cd9660 cfs cifs coda cramfs devfs devpts e2compr efs ext2 ext2fs ext3 fdesc ffs filecore hfs hpfs iso9660 jffs jffs2 jfs kernfs lfs linprocfs mfs minix msdos ncpfs nfs none ntfs null nwfs overlay ovlfs portal proc procfs ptyfs qnx4 reiserfs romfs rpc_pipefs shm smbfs std subfs swap sysfs sysv tcfs tmpfs udf ufs umap umsdos union usbfs userfs vfat vs3fs vxfs wrapfs wvfs xfs zisofs +-syn keyword fsTypeKeyword contained adfs ados affs atfs audiofs auto autofs befs bfs cd9660 cfs cifs coda cramfs devfs devpts e2compr efs ext2 ext2fs ext3 fdesc ffs filecore fuse hfs hpfs iso9660 jffs jffs2 jfs kernfs lfs linprocfs mfs minix msdos ncpfs nfs none ntfs null nwfs overlay ovlfs portal proc procfs ptyfs qnx4 reiserfs romfs shm smbfs sshfs std subfs swap sysfs sysv tcfs tmpfs udf ufs umap umsdos union usbfs userfs vfat vs3fs vxfs wrapfs wvfs xfs zisofs ++syn keyword fsTypeKeyword contained adfs ados affs atfs audiofs auto autofs befs bfs binfmt_misc cd9660 cfs cifs coda cramfs devfs devpts e2compr efs ext2 ext2fs ext3 fdesc ffs filecore fuse hfs hpfs iso9660 jffs jffs2 jfs kernfs lfs linprocfs mfs minix msdos ncpfs nfs none ntfs null nwfs overlay ovlfs portal proc procfs ptyfs qnx4 reiserfs romfs rpc_pipefs shm smbfs sshfs std subfs swap sysfs sysv tcfs tmpfs udf ufs umap umsdos union usbfs userfs vfat vs3fs vxfs wrapfs wvfs xfs zisofs " Options " ------- -@@ -51,7 +51,7 @@ +@@ -58,7 +58,7 @@ syn match fsOptionsString /[a-zA-Z0-9_-] syn keyword fsOptionsYesNo yes no syn cluster fsOptionsCheckCluster contains=fsOptionsExt2Check,fsOptionsFatCheck syn keyword fsOptionsSize 512 1024 2048 diff --git a/vim-selinux.patch b/vim-selinux.patch deleted file mode 100644 index c657f71e..00000000 --- a/vim-selinux.patch +++ /dev/null @@ -1,143 +0,0 @@ ---- vim62/src/configure.in.selinux 2004-01-20 11:34:17.177103792 -0500 -+++ vim62/src/configure.in 2004-01-20 11:34:18.507126105 -0500 -@@ -195,6 +195,21 @@ - fi - - -+dnl vim: set sw=2 tw=78 fo+=l: -+dnl Link with -lselinux for SELinux stuff; if not found -+AC_MSG_CHECKING(--disable-selinux argument) -+AC_ARG_ENABLE(selinux, -+ [ --disable-selinux Don't check for SELinux support.], -+ , [enable_selinux="yes"]) -+if test "$enable_selinux" = "yes"; then -+ AC_MSG_RESULT(no) -+ AC_CHECK_LIB(selinux, is_selinux_enabled, -+ [LIBS="$LIBS -lselinux" -+ AC_DEFINE(HAVE_SELINUX)]) -+else -+ AC_MSG_RESULT(yes) -+fi -+ - dnl Check user requested features. - - AC_MSG_CHECKING(--with-features argument) ---- vim62/src/config.h.in.selinux 2003-05-25 12:07:42.000000000 -0400 -+++ vim62/src/config.h.in 2004-01-20 11:34:18.507126105 -0500 -@@ -155,6 +155,7 @@ - #undef HAVE_READLINK - #undef HAVE_RENAME - #undef HAVE_SELECT -+#undef HAVE_SELINUX - #undef HAVE_SETENV - #undef HAVE_SETPGID - #undef HAVE_SETSID ---- vim62/src/fileio.c.selinux 2004-01-20 11:34:16.577093725 -0500 -+++ vim62/src/fileio.c 2004-01-20 11:34:18.517126273 -0500 -@@ -1,3 +1,4 @@ -+ - /* vi:set ts=8 sts=4 sw=4: - * - * VIM - Vi IMproved by Bram Moolenaar -@@ -3079,6 +3080,9 @@ - ) - mch_setperm(backup, - (perm & 0707) | ((perm & 07) << 3)); -+#ifdef HAVE_SELINUX -+ mch_copy_sec(fname, backup); -+#endif - #endif - - /* -@@ -3115,6 +3119,9 @@ - #ifdef HAVE_ACL - mch_set_acl(backup, acl); - #endif -+#ifdef HAVE_SELINUX -+ mch_copy_sec(fname, backup); -+#endif - break; - } - } -@@ -3719,6 +3726,12 @@ - mch_set_acl(wfname, acl); - #endif - -+#ifdef HAVE_SELINUX -+ /* Probably need to set the security context */ -+ if (!backup_copy) -+ mch_copy_sec(backup, wfname); -+#endif -+ - #ifdef UNIX - /* When creating a new file, set its owner/group to that of the original - * file. Get the new device and inode number. */ ---- vim62/src/os_unix.c.selinux 2004-01-20 11:34:15.897082317 -0500 -+++ vim62/src/os_unix.c 2004-01-20 11:37:54.310746614 -0500 -@@ -41,6 +41,10 @@ - # include - #endif - -+#ifdef HAVE_SELINUX -+#include -+static int selinux_enabled=-1; -+#endif - /* - * Use this prototype for select, some include files have a wrong prototype - */ -@@ -2279,6 +2283,55 @@ - } vim_acl_solaris_T; - # endif - -+mch_copy_sec(from_file, to_file) -+ char_u *from_file; -+ char_u *to_file; -+{ -+ if (from_file == NULL) -+ return; -+ -+#ifdef HAVE_SELINUX -+ if (selinux_enabled == -1) -+ selinux_enabled = is_selinux_enabled (); -+ -+ if (selinux_enabled>0) -+ { -+ security_context_t from_context=NULL; -+ security_context_t to_context=NULL; -+ if (getfilecon (from_file, &from_context) < 0) -+ { -+ /* If the filesystem doesn't support extended attributes, -+ the original had no special security context and the -+ target cannot have one either. */ -+ if (errno == EOPNOTSUPP) -+ return ; -+ -+ MSG_PUTS(_("\nCould not get security context for ")); -+ msg_outtrans(from_file); -+ msg_putchar('\n'); -+ return ; -+ } -+ if (getfilecon (to_file, &to_context) < 0) -+ { -+ MSG_PUTS(_("\nCould not get security context for ")); -+ msg_outtrans(to_file); -+ msg_putchar('\n'); -+ freecon (from_context); -+ return ; -+ } -+ if (strcmp(from_context,to_context) != 0 ) { -+ if (setfilecon (to_file, from_context) < 0) -+ { -+ MSG_PUTS(_("\nCould not set security context for ")); -+ msg_outtrans(to_file); -+ msg_putchar('\n'); -+ } -+ } -+ freecon (to_context); -+ freecon (from_context); -+ } -+#endif /* HAVE_SELINUX */ -+} - /* - * Return a pointer to the ACL of file "fname" in allocated memory. - * Return NULL if the ACL is not available for whatever reason. diff --git a/vim-selinux2.patch b/vim-selinux2.patch deleted file mode 100644 index 3bb6b649..00000000 --- a/vim-selinux2.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- vim70/src/memfile.c 2006-05-08 11:37:01.000000000 +0200 -+++ vim70/src/memfile.c.selinux 2006-05-08 11:34:45.000000000 +0200 -@@ -1325,5 +1325,8 @@ - mfp->mf_ffname = NULL; - } - else -+#ifdef HAVE_SELINUX -+ mch_copy_sec(fname, mfp->mf_fname); -+#endif - mch_hide(mfp->mf_fname); /* try setting the 'hidden' flag */ - } diff --git a/vim.spec b/vim.spec index 32aae062..783da148 100644 --- a/vim.spec +++ b/vim.spec @@ -8,23 +8,23 @@ %define desktop_file_utils_version 0.2.93 %endif -%define withnetbeans 0 +%define withnetbeans 1 %define withvimspell 0 %define withhunspell 0 %define withruby 1 -%define baseversion 7.1 +%define baseversion 7.2 #used for pre-releases: %define beta %{nil} -%define vimdir vim71%{?beta} -%define patchlevel 293 +%define vimdir vim72%{?beta} +%define patchlevel 060 Summary: The VIM editor URL: http://www.vim.org/ Name: vim Version: %{baseversion}.%{beta}%{patchlevel} -Release: 1%{?dist}.1 +Release: 1%{?dist} License: Vim Group: Applications/Editors Source0: ftp://ftp.vim.org/pub/vim/unix/vim-%{baseversion}%{?beta}%{?CVSDATE}.tar.bz2 @@ -45,6 +45,16 @@ Source13: vim-spell-files.tar.bz2 Source14: spec-template Source15: http://www.cvjb.de/comp/vim/forth.vim +# remove this for the next major version, CVE fixes: +Source16: ftp://ftp.vim.org/vol/2/vim/runtime/plugin/netrwPlugin.vim +Source17: ftp://ftp.vim.org/vol/2/vim/runtime/plugin/gzip.vim +Source18: ftp://ftp.vim.org/vol/2/vim/runtime/filetype.vim +Source19: ftp://ftp.vim.org/vol/2/vim/runtime/autoload/zip.vim +Source20: ftp://ftp.vim.org/vol/2/vim/runtime/autoload/tar.vim +Source21: ftp://ftp.vim.org/vol/2/vim/runtime/autoload/netrwFileHandlers.vim +Source22: ftp://ftp.vim.org/vol/2/vim/runtime/autoload/netrw.vim +Source23: ftp://ftp.vim.org/vol/2/vim/runtime/autoload/netrwSettings.vim + Patch2002: vim-7.0-fixkeys.patch Patch2003: vim-6.2-specsyntax.patch Patch2004: vim-7.0-crv.patch @@ -56,317 +66,77 @@ BuildRequires: hunspell-devel # Patches 001 < 999 are patches from the base maintainer. # If you're as lazy as me, generate the list using # for i in `seq 1 14`; do printf "Patch%03d: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.%03d\n" $i $i; done -Patch001: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.001 -Patch002: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.002 -Patch003: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.003 -Patch004: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.004 -Patch005: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.005 -Patch006: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.006 -Patch007: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.007 -Patch008: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.008 -Patch009: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.009 -Patch010: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.010 -Patch011: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.011 -Patch012: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.012 -Patch013: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.013 -Patch014: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.014 -Patch015: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.015 -Patch016: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.016 -Patch017: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.017 -Patch018: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.018 -Patch019: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.019 -Patch020: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.020 -Patch021: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.021 -Patch022: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.022 -Patch023: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.023 -Patch024: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.024 -Patch025: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.025 -Patch026: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.026 -Patch027: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.027 -Patch028: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.028 -Patch029: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.029 -Patch030: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.030 -Patch031: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.031 -Patch032: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.032 -Patch033: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.033 -Patch034: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.034 -Patch035: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.035 -Patch036: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.036 -Patch037: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.037 -Patch038: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.038 -Patch039: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.039 -Patch040: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.040 -Patch041: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.041 -Patch042: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.042 -Patch043: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.043 -Patch044: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.044 -Patch045: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.045 -Patch046: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.046 -Patch047: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.047 -Patch048: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.048 -Patch049: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.049 -Patch050: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.050 -Patch051: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.051 -Patch052: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.052 -Patch053: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.053 -Patch054: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.054 -Patch055: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.055 -Patch056: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.056 -Patch057: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.057 -Patch058: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.058 -Patch059: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.059 -Patch060: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.060 -Patch061: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.061 -Patch062: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.062 -Patch063: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.063 -Patch064: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.064 -Patch065: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.065 -Patch066: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.066 -Patch067: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.067 -Patch068: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.068 -Patch069: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.069 -Patch070: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.070 -Patch071: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.071 -Patch072: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.072 -Patch073: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.073 -Patch074: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.074 -Patch075: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.075 -Patch076: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.076 -Patch077: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.077 -Patch078: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.078 -Patch079: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.079 -Patch080: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.080 -Patch081: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.081 -Patch082: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.082 -Patch083: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.083 -Patch084: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.084 -Patch085: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.085 -Patch086: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.086 -Patch087: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.087 -Patch088: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.088 -Patch089: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.089 -Patch090: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.090 -Patch091: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.091 -Patch092: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.092 -Patch093: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.093 -Patch094: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.094 -Patch095: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.095 -Patch096: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.096 -Patch097: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.097 -Patch098: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.098 -Patch099: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.099 -Patch100: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.100 -Patch101: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.101 -Patch102: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.102 -Patch103: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.103 -Patch104: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.104 -Patch105: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.105 -Patch106: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.106 -Patch107: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.107 -Patch108: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.108 -Patch109: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.109 -Patch110: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.110 -Patch111: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.111 -Patch112: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.112 -Patch113: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.113 -Patch114: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.114 -Patch115: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.115 -Patch116: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.116 -Patch117: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.117 -Patch118: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.118 -Patch119: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.119 -Patch120: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.120 -Patch121: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.121 -Patch122: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.122 -Patch123: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.123 -Patch124: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.124 -Patch125: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.125 -Patch126: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.126 -Patch127: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.127 -Patch128: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.128 -Patch129: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.129 -Patch130: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.130 -Patch131: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.131 -Patch132: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.132 -Patch133: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.133 -Patch134: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.134 -Patch135: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.135 -Patch136: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.136 -Patch137: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.137 -Patch138: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.138 -Patch139: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.139 -Patch140: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.140 -Patch141: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.141 -Patch142: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.142 -Patch143: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.143 -Patch144: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.144 -Patch145: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.145 -Patch146: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.146 -Patch147: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.147 -Patch148: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.148 -Patch149: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.149 -Patch150: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.150 -Patch151: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.151 -Patch152: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.152 -Patch153: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.153 -Patch154: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.154 -Patch155: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.155 -Patch156: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.156 -Patch157: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.157 -Patch158: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.158 -Patch159: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.159 -Patch160: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.160 -Patch161: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.161 -Patch162: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.162 -Patch163: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.163 -Patch164: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.164 -Patch165: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.165 -Patch166: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.166 -Patch167: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.167 -Patch168: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.168 -Patch169: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.169 -Patch170: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.170 -Patch171: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.171 -Patch172: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.172 -Patch173: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.173 -Patch174: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.174 -Patch175: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.175 -Patch176: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.176 -Patch177: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.177 -Patch178: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.178 -Patch179: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.179 -Patch180: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.180 -Patch181: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.181 -Patch182: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.182 -Patch183: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.183 -Patch184: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.184 -Patch185: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.185 -Patch186: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.186 -Patch187: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.187 -Patch188: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.188 -Patch189: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.189 -Patch190: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.190 -Patch191: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.191 -Patch192: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.192 -Patch193: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.193 -Patch194: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.194 -Patch195: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.195 -Patch196: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.196 -Patch197: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.197 -Patch198: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.198 -Patch199: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.199 -Patch200: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.200 -Patch201: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.201 -Patch202: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.202 -Patch203: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.203 -Patch204: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.204 -Patch205: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.205 -Patch206: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.206 -Patch207: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.207 -Patch208: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.208 -Patch209: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.209 -Patch210: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.210 -Patch211: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.211 -Patch212: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.212 -Patch213: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.213 -Patch214: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.214 -Patch215: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.215 -Patch216: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.216 -Patch217: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.217 -Patch218: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.218 -Patch219: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.219 -Patch220: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.220 -Patch221: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.221 -Patch222: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.222 -Patch223: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.223 -Patch224: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.224 -Patch225: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.225 -Patch226: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.226 -Patch227: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.227 -Patch228: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.228 -Patch229: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.229 -Patch230: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.230 -Patch231: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.231 -Patch232: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.232 -Patch233: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.233 -Patch234: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.234 -Patch235: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.235 -Patch236: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.236 -Patch237: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.237 -Patch238: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.238 -Patch239: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.239 -Patch240: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.240 -Patch241: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.241 -Patch242: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.242 -Patch243: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.243 -Patch244: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.244 -Patch245: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.245 -Patch246: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.246 -Patch247: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.247 -Patch248: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.248 -Patch249: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.249 -Patch250: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.250 -Patch251: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.251 -Patch252: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.252 -Patch253: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.253 -Patch254: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.254 -Patch255: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.255 -Patch256: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.256 -Patch257: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.257 -Patch258: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.258 -Patch259: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.259 -Patch260: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.260 -Patch261: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.261 -Patch262: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.262 -Patch263: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.263 -Patch264: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.264 -Patch265: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.265 -Patch266: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.266 -Patch267: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.267 -Patch268: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.268 -Patch269: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.269 -Patch270: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.270 -Patch271: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.271 -Patch272: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.272 -Patch273: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.273 -Patch274: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.274 -Patch275: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.275 -Patch276: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.276 -Patch277: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.277 -Patch278: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.278 -Patch279: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.279 -Patch280: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.280 -Patch281: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.281 -Patch282: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.282 -Patch283: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.283 -Patch284: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.284 -Patch285: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.285 -Patch286: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.286 -Patch287: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.287 -Patch288: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.288 -Patch289: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.289 -Patch290: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.290 -Patch291: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.291 -Patch292: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.292 -Patch293: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.293 +Patch001: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.001 +Patch002: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.002 +Patch003: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.003 +Patch004: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.004 +Patch005: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.005 +Patch006: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.006 +Patch007: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.007 +Patch008: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.008 +Patch009: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.009 +Patch010: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.010 +Patch011: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.011 +Patch012: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.012 +Patch013: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.013 +Patch014: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.014 +Patch015: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.015 +Patch016: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.016 +Patch017: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.017 +Patch018: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.018 +Patch019: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.019 +Patch020: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.020 +Patch021: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.021 +Patch022: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.022 +Patch023: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.023 +Patch024: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.024 +Patch025: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.025 +Patch026: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.026 +Patch027: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.027 +Patch028: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.028 +Patch029: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.029 +Patch030: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.030 +Patch031: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.031 +Patch032: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.032 +Patch033: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.033 +Patch034: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.034 +Patch035: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.035 +Patch036: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.036 +Patch037: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.037 +Patch038: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.038 +Patch039: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.039 +Patch040: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.040 +Patch041: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.041 +Patch042: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.042 +Patch043: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.043 +Patch044: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.044 +Patch045: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.045 +Patch046: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.046 +Patch047: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.047 +Patch048: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.048 +Patch049: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.049 +Patch050: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.050 +Patch051: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.051 +Patch052: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.052 +Patch053: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.053 +Patch054: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.054 +Patch055: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.055 +Patch056: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.056 +Patch057: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.057 +Patch058: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.058 +Patch059: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.059 +Patch060: ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.060 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch Patch3003: vim-6.1-rh3.patch Patch3004: vim-7.0-rclocation.patch Patch3006: vim-6.4-checkhl.patch -Patch3007: vim-7.0-fstabsyntax.patch -Patch3008: vim-6.4-lib64.patch +Patch3007: vim-7.2-fstabsyntax.patch +Patch3008: vim-7.1-lib64.patch Patch3009: vim-7.0-warning.patch Patch3010: vim-7.0-syncolor.patch -Patch3011: vim-7.0-vimspelltypo.patch -Patch3012: vim-7.0-specedit.patch -# Remove this one when the runtime files get updated (#246378): -Patch3013: vim-7.1-ada.patch -# -Patch3014: vim-7.1-erlang.patch -Patch3100: vim-selinux.patch -Patch3101: vim-selinux2.patch +Patch3011: vim-7.0-specedit.patch Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: python-devel ncurses-devel gettext perl-devel @@ -457,6 +227,7 @@ Requires: vim-common = %{epoch}:%{version}-%{release} libattr >= 2.4 gtk2 >= 2.6 Provides: gvim = %{version}-%{release} BuildRequires: gtk2-devel libSM-devel libXt-devel libXpm-devel Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) +Requires: hicolor-icon-theme %description X11 VIM (VIsual editor iMproved) is an updated and improved version of the @@ -500,22 +271,22 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch010 -p0 %patch011 -p0 %patch012 -p0 -%patch013 -p0 -%patch014 -p0 -%patch015 -p0 -%patch016 -p0 -%patch017 -p0 -%patch018 -p0 -%patch019 -p0 -%patch020 -p0 -%patch021 -p0 -%patch022 -p0 -%patch023 -p0 -%patch024 -p0 -%patch025 -p0 -%patch026 -p0 -%patch027 -p0 -%patch028 -p0 +%patch013 -p0 +%patch014 -p0 +%patch015 -p0 +%patch016 -p0 +%patch017 -p0 +%patch018 -p0 +%patch019 -p0 +%patch020 -p0 +%patch021 -p0 +%patch022 -p0 +%patch023 -p0 +%patch024 -p0 +%patch025 -p0 +%patch026 -p0 +%patch027 -p0 +%patch028 -p0 %patch029 -p0 %patch030 -p0 %patch031 -p0 @@ -548,239 +319,6 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch058 -p0 %patch059 -p0 %patch060 -p0 -%patch061 -p0 -%patch062 -p0 -%patch063 -p0 -%patch064 -p0 -%patch065 -p0 -%patch066 -p0 -%patch067 -p0 -%patch068 -p0 -%patch069 -p0 -%patch070 -p0 -%patch071 -p0 -%patch072 -p0 -%patch073 -p0 -%patch074 -p0 -%patch075 -p0 -%patch076 -p0 -%patch077 -p0 -%patch078 -p0 -%patch079 -p0 -%patch080 -p0 -%patch081 -p0 -%patch082 -p0 -%patch083 -p0 -%patch084 -p0 -%patch085 -p0 -%patch086 -p0 -%patch087 -p0 -%patch088 -p0 -%patch089 -p0 -%patch090 -p0 -%patch091 -p0 -%patch092 -p0 -%patch093 -p0 -%patch094 -p0 -%patch095 -p0 -%patch096 -p0 -%patch097 -p0 -%patch098 -p0 -%patch099 -p0 -%patch100 -p0 -%patch101 -p0 -%patch102 -p0 -%patch103 -p0 -%patch104 -p0 -%patch105 -p0 -%patch106 -p0 -%patch107 -p0 -%patch108 -p0 -%patch109 -p0 -%patch110 -p0 -%patch111 -p0 -%patch112 -p0 -%patch113 -p0 -%patch114 -p0 -%patch115 -p0 -%patch116 -p0 -%patch117 -p0 -%patch118 -p0 -%patch119 -p0 -%patch120 -p0 -%patch121 -p0 -%patch122 -p0 -%patch123 -p0 -%patch124 -p0 -%patch125 -p0 -%patch126 -p0 -%patch127 -p0 -%patch128 -p0 -%patch129 -p0 -%patch130 -p0 -%patch131 -p0 -%patch132 -p0 -%patch133 -p0 -%patch134 -p0 -%patch135 -p0 -%patch136 -p0 -%patch137 -p0 -%patch138 -p0 -%patch139 -p0 -%patch140 -p0 -%patch141 -p0 -%patch142 -p0 -%patch143 -p0 -%patch144 -p0 -%patch145 -p0 -%patch146 -p0 -%patch147 -p0 -%patch148 -p0 -%patch149 -p0 -%patch150 -p0 -%patch151 -p0 -%patch152 -p0 -%patch153 -p0 -%patch154 -p0 -%patch155 -p0 -%patch156 -p0 -%patch157 -p0 -%patch158 -p0 -%patch159 -p0 -%patch160 -p0 -%patch161 -p0 -%patch162 -p0 -%patch163 -p0 -%patch164 -p0 -%patch165 -p0 -%patch166 -p0 -%patch167 -p0 -%patch168 -p0 -%patch169 -p0 -%patch170 -p0 -%patch171 -p0 -%patch172 -p0 -%patch173 -p0 -%patch174 -p0 -%patch175 -p0 -%patch176 -p0 -%patch177 -p0 -%patch178 -p0 -%patch179 -p0 -%patch180 -p0 -%patch181 -p0 -%patch182 -p0 -%patch183 -p0 -%patch184 -p0 -%patch185 -p0 -%patch186 -p0 -%patch187 -p0 -%patch188 -p0 -%patch189 -p0 -%patch190 -p0 -%patch191 -p0 -%patch192 -p0 -%patch193 -p0 -%patch194 -p0 -%patch195 -p0 -%patch196 -p0 -%patch197 -p0 -%patch198 -p0 -%patch199 -p0 -%patch200 -p0 -%patch201 -p0 -%patch202 -p0 -%patch203 -p0 -%patch204 -p0 -%patch205 -p0 -%patch206 -p0 -%patch207 -p0 -%patch208 -p0 -%patch209 -p0 -%patch210 -p0 -%patch211 -p0 -%patch212 -p0 -%patch213 -p0 -%patch214 -p0 -%patch215 -p0 -%patch216 -p0 -%patch217 -p0 -%patch218 -p0 -%patch219 -p0 -%patch220 -p0 -%patch221 -p0 -%patch222 -p0 -%patch223 -p0 -%patch224 -p0 -%patch225 -p0 -%patch226 -p0 -%patch227 -p0 -%patch228 -p0 -%patch229 -p0 -%patch230 -p0 -%patch231 -p0 -%patch232 -p0 -%patch233 -p0 -%patch234 -p0 -%patch235 -p0 -%patch236 -p0 -%patch237 -p0 -%patch238 -p0 -%patch239 -p0 -%patch240 -p0 -%patch241 -p0 -%patch242 -p0 -%patch243 -p0 -%patch244 -p0 -%patch245 -p0 -%patch246 -p0 -%patch247 -p0 -%patch248 -p0 -%patch249 -p0 -%patch250 -p0 -%patch251 -p0 -%patch252 -p0 -%patch253 -p0 -%patch254 -p0 -%patch255 -p0 -%patch256 -p0 -%patch257 -p0 -%patch258 -p0 -%patch259 -p0 -%patch260 -p0 -%patch261 -p0 -%patch262 -p0 -%patch263 -p0 -%patch264 -p0 -%patch265 -p0 -%patch266 -p0 -%patch267 -p0 -%patch268 -p0 -%patch269 -p0 -%patch270 -p0 -%patch271 -p0 -%patch272 -p0 -%patch273 -p0 -%patch274 -p0 -%patch275 -p0 -%patch276 -p0 -%patch277 -p0 -%patch278 -p0 -%patch279 -p0 -%patch280 -p0 -%patch281 -p0 -%patch282 -p0 -%patch283 -p0 -%patch284 -p0 -%patch285 -p0 -%patch286 -p0 -%patch287 -p0 -%patch288 -p0 -%patch289 -p0 -%patch290 -p0 -%patch291 -p0 -%patch292 -p0 -%patch293 -p0 # install spell files @@ -799,15 +337,16 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch3009 -p1 %patch3010 -p1 %patch3011 -p1 -%patch3012 -p1 -%patch3013 -p1 -%patch3014 -p1 -%if %{WITH_SELINUX} -%patch3100 -p1 -%patch3101 -p1 -%endif cp -f %{SOURCE15} runtime/syntax/forth.vim +cp -f %{SOURCE16} runtime/plugin/netrwPlugin.vim +cp -f %{SOURCE17} runtime/plugin/gzip.vim +cp -f %{SOURCE18} runtime/plugin/filetype.vim +cp -f %{SOURCE19} runtime/autoload/zip.vim +cp -f %{SOURCE20} runtime/autoload/tar.vim +cp -f %{SOURCE21} runtime/autoload/netrwFileHandlers.vim +cp -f %{SOURCE22} runtime/autoload/netrw.vim +cp -f %{SOURCE23} runtime/autoload/netrwSettings.vim %build @@ -829,6 +368,11 @@ export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_ %else --disable-netbeans \ %endif +%if %{WITH_SELINUX} + --enable-selinux \ +%else + --disable-selinux \ +%endif %if "%{withruby}" == "1" --enable-rubyinterp \ %else @@ -850,6 +394,11 @@ make clean %else --disable-netbeans \ %endif +%if %{WITH_SELINUX} + --enable-selinux \ +%else + --disable-selinux \ +%endif %if "%{withruby}" == "1" --enable-rubyinterp \ %else @@ -865,6 +414,11 @@ perl -pi -e "s/\/etc\/vimrc/\/etc\/virc/" os_unix.h %configure --prefix=%{_prefix} --with-features=small --with-x=no \ --enable-multibyte \ --disable-netbeans \ +%if %{WITH_SELINUX} + --enable-selinux \ +%else + --disable-selinux \ +%endif --disable-pythoninterp --disable-perlinterp --disable-tclinterp \ --with-tlib=ncurses --enable-gui=no --disable-gpm --exec-prefix=/ \ --with-compiledby="" \ @@ -876,15 +430,20 @@ make %{?_smp_mflags} rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/bin mkdir -p $RPM_BUILD_ROOT/%{_bindir} -mkdir -p $RPM_BUILD_ROOT/%{_datadir}/%{name}/vimfiles/after +mkdir -p $RPM_BUILD_ROOT/%{_datadir}/%{name}/vimfiles/{after,autoload,colors,compiler,doc,ftdetect,ftplugin,indent,keymap,lang,plugin,print,spell,syntax,tutor} +mkdir -p $RPM_BUILD_ROOT/%{_datadir}/%{name}/vimfiles/after/{autoload,colors,compiler,doc,ftdetect,ftplugin,indent,keymap,lang,plugin,print,spell,syntax,tutor} cp -f %{SOURCE11} . cp -f %{SOURCE14} $RPM_BUILD_ROOT/%{_datadir}/%{name}/vimfiles/template.spec cp runtime/doc/uganda.txt LICENSE +# Those aren't Linux info files but some binary files for Amiga: +rm -f README*.info cd src make install DESTDIR=$RPM_BUILD_ROOT BINDIR=/bin +make installgtutorbin DESTDIR=$RPM_BUILD_ROOT BINDIR=/bin mv $RPM_BUILD_ROOT/bin/xxd $RPM_BUILD_ROOT/%{_bindir}/xxd +mv $RPM_BUILD_ROOT/bin/gvimtutor $RPM_BUILD_ROOT/%{_bindir}/gvimtutor mkdir -p $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/{16x16,32x32,48x48,64x64}/apps install -m755 gvim $RPM_BUILD_ROOT/%{_bindir}/gvim install -p -m644 %{SOURCE7} \ @@ -912,20 +471,17 @@ install -m755 enhanced-vim $RPM_BUILD_ROOT/%{_bindir}/vim rm -f .%{_mandir}/man1/rvim.1 ln -sf vim.1.gz .%{_mandir}/man1/vi.1.gz ln -sf vim.1.gz .%{_mandir}/man1/rvi.1.gz - ln -sf vim.1.gz .%{_mandir}/man1/rvim.1.gz ln -sf vim.1.gz .%{_mandir}/man1/vimdiff.1.gz ln -sf gvim ./%{_bindir}/gview ln -sf gvim ./%{_bindir}/gex ln -sf gvim ./%{_bindir}/evim ln -sf gvim ./%{_bindir}/gvimdiff - ln -sf vim.1.gz .%{_mandir}/man1/gvim.1.gz - ln -sf vim.1.gz .%{_mandir}/man1/gvimdiff.1.gz ln -sf gvim ./%{_bindir}/vimx %if "%{desktop_file}" == "1" mkdir -p $RPM_BUILD_ROOT/%{_datadir}/applications desktop-file-install --vendor fedora \ --dir $RPM_BUILD_ROOT/%{_datadir}/applications \ - --add-category "Application;Development;X-Red-Hat-Base" \ + --add-category "Development;TextEditor;X-Red-Hat-Base" \ %{SOURCE3} %else mkdir -p ./%{_sysconfdir}/X11/applnk/Applications @@ -940,7 +496,7 @@ pushd $RPM_BUILD_ROOT/%{_datadir}/%{name}/%{vimdir}/tutor mkdir conv iconv -f CP1252 -t UTF8 tutor.ca > conv/tutor.ca iconv -f CP1252 -t UTF8 tutor.it > conv/tutor.it - iconv -f CP1253 -t UTF8 tutor.gr > conv/tutor.gr + #iconv -f CP1253 -t UTF8 tutor.gr > conv/tutor.gr iconv -f CP1252 -t UTF8 tutor.fr > conv/tutor.fr iconv -f CP1252 -t UTF8 tutor.es > conv/tutor.es iconv -f CP1252 -t UTF8 tutor.de > conv/tutor.de @@ -954,7 +510,7 @@ mkdir conv iconv -f ISO-8859-2 -t UTF8 tutor.sk > conv/tutor.sk iconv -f KOI8R -t UTF8 tutor.ru > conv/tutor.ru iconv -f CP1252 -t UTF8 tutor.sv > conv/tutor.sv - mv -f tutor.gr.cp737 tutor.ja.euc tutor.ja.sjis tutor.ko.euc tutor.pl.cp1250 tutor.zh.big5 tutor.ru.cp1251 tutor.zh.euc conv/ + mv -f tutor.ja.euc tutor.ja.sjis tutor.ko.euc tutor.pl.cp1250 tutor.zh.big5 tutor.ru.cp1251 tutor.zh.euc conv/ rm -f tutor.ca tutor.de tutor.es tutor.fr tutor.gr tutor.it tutor.ja.utf-8 tutor.ko.utf-8 tutor.no tutor.pl tutor.sk tutor.ru tutor.sv mv -f conv/* . rmdir conv @@ -1008,6 +564,23 @@ rm -f $RPM_BUILD_ROOT/%{_datadir}/vim/%{vimdir}/tutor/tutor.gr.utf-8~ done ) +# Remove not UTF-8 manpages +for i in pl.ISO8859-2 it.ISO8859-1 ru.KOI8-R fr.ISO8859-1; do + rm -rf $RPM_BUILD_ROOT/%{_mandir}/$i +done + +# use common man1/ru directory +mv $RPM_BUILD_ROOT/%{_mandir}/ru.UTF-8 $RPM_BUILD_ROOT/%{_mandir}/ru + +# Remove duplicate man pages +for i in fr.UTF-8 it.UTF-8 pl.UTF-8; do + rm -rf $RPM_BUILD_ROOT/%{_mandir}/$i +done + +for i in rvim gvim.1 gvimdiff.1; do + echo ".so man1/vim.1" > $RPM_BUILD_ROOT/%{_mandir}/man1/$i +done + %post X11 touch --no-create %{_datadir}/icons/hicolor if [ -x /%{_bindir}/gtk-update-icon-cache ]; then @@ -1035,6 +608,21 @@ rm -rf $RPM_BUILD_ROOT %dir %{_datadir}/%{name}/%{vimdir} %dir %{_datadir}/%{name}/vimfiles %dir %{_datadir}/%{name}/vimfiles/after +%dir %{_datadir}/%{name}/vimfiles/after/* +%dir %{_datadir}/%{name}/vimfiles/autoload +%dir %{_datadir}/%{name}/vimfiles/colors +%dir %{_datadir}/%{name}/vimfiles/compiler +%dir %{_datadir}/%{name}/vimfiles/doc +%dir %{_datadir}/%{name}/vimfiles/ftdetect +%dir %{_datadir}/%{name}/vimfiles/ftplugin +%dir %{_datadir}/%{name}/vimfiles/indent +%dir %{_datadir}/%{name}/vimfiles/keymap +%dir %{_datadir}/%{name}/vimfiles/lang +%dir %{_datadir}/%{name}/vimfiles/plugin +%dir %{_datadir}/%{name}/vimfiles/print +%dir %{_datadir}/%{name}/vimfiles/spell +%dir %{_datadir}/%{name}/vimfiles/syntax +%dir %{_datadir}/%{name}/vimfiles/tutor %{_datadir}/%{name}/vimfiles/template.spec %{_datadir}/%{name}/%{vimdir}/autoload %{_datadir}/%{name}/%{vimdir}/colors @@ -1060,7 +648,9 @@ rm -rf $RPM_BUILD_ROOT %lang(cs) %{_datadir}/%{name}/%{vimdir}/lang/cs %lang(de) %{_datadir}/%{name}/%{vimdir}/lang/de %lang(en_GB) %{_datadir}/%{name}/%{vimdir}/lang/en_GB +%lang(eo) %{_datadir}/%{name}/%{vimdir}/lang/eo %lang(es) %{_datadir}/%{name}/%{vimdir}/lang/es +%lang(fi) %{_datadir}/%{name}/%{vimdir}/lang/fi %lang(fr) %{_datadir}/%{name}/%{vimdir}/lang/fr %lang(ga) %{_datadir}/%{name}/%{vimdir}/lang/ga %lang(it) %{_datadir}/%{name}/%{vimdir}/lang/it @@ -1068,6 +658,7 @@ rm -rf $RPM_BUILD_ROOT %lang(ko) %{_datadir}/%{name}/%{vimdir}/lang/ko %lang(no) %{_datadir}/%{name}/%{vimdir}/lang/no %lang(pl) %{_datadir}/%{name}/%{vimdir}/lang/pl +%lang(pt_BR) %{_datadir}/%{name}/%{vimdir}/lang/pt_BR %lang(ru) %{_datadir}/%{name}/%{vimdir}/lang/ru %lang(sk) %{_datadir}/%{name}/%{vimdir}/lang/sk %lang(sv) %{_datadir}/%{name}/%{vimdir}/lang/sv @@ -1085,10 +676,10 @@ rm -rf $RPM_BUILD_ROOT %{_mandir}/man1/rvi.* %{_mandir}/man1/rview.* %{_mandir}/man1/xxd.* -%lang(fr) %{_mandir}/fr*/*/* -%lang(it) %{_mandir}/it*/*/* -%lang(ru) %{_mandir}/ru*/*/* -%lang(pl) %{_mandir}/pl*/*/* +%lang(fr) %{_mandir}/fr/man1/* +%lang(it) %{_mandir}/it/man1/* +%lang(pl) %{_mandir}/pl/man1/* +%lang(ru) %{_mandir}/ru/man1/* %if %{withvimspell} %files spell @@ -1175,6 +766,7 @@ rm -rf $RPM_BUILD_ROOT %else /%{_sysconfdir}/X11/applnk/*/gvim.desktop %endif +%{_bindir}/gvimtutor %{_bindir}/gvim %{_bindir}/gvimdiff %{_bindir}/gview @@ -1186,353 +778,46 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog -* Sun May 25 2008 Dennis Gilmore 7.1.293-1.1 -- minor rebuild for sparc +* Mon Dec 01 2008 Karsten Hopp 7.2.060-1 +- patchlevel 60 -* Fri Apr 11 2008 Karsten Hopp 7.1.293-1 -- patchlevel 293 -- update forth syntax file (Benjamin Krill) +* Mon Nov 10 2008 Karsten Hopp 7.2.032-1 +- patchlevel 32 -* Wed Apr 02 2008 Karsten Hopp 7.1.291-1 -- patchlevel 291, more fixes for leftover /tmp/cscope* files +* Mon Nov 03 2008 Karsten Hopp 7.2.026-2 +- add more /usr/share/vim/vimfiles directories (#444387) -* Tue Mar 18 2008 Tom "spot" Callaway 7.1.283-2 -- add Requires for versioned perl (libperl.so) +* Mon Nov 03 2008 Karsten Hopp 7.2.026-1 +- patchlevel 26 +- own some directories in /usr/share/vim/vimfiles (#469491) -* Mon Mar 17 2008 Karsten Hopp 7.1.283-1 -- patchlevel 283, fixes leftover cscope files in /tmp +* Tue Oct 21 2008 Karsten Hopp 7.2.025-2 +- re-enable clean -* Wed Mar 12 2008 Karsten Hopp 7.1.273-1 -- update to patchlevel 273, this fixes #436902 +* Mon Oct 20 2008 Karsten Hopp 7.2.025-1 +- patchlevel 25 +- add Categories tag to desktop file (#226526) +- add requirement on hicolor-icon-theme to vim-X11 (#226526) +- drop Amiga info files (#226526) +- remove non-utf8 man pages (#226526) +- drop Application from categories (#226526) -* Tue Mar 11 2008 Karsten Hopp 7.1.270-1 -- patchlevel 270 -- don't write swapfile on most common locations for USB-sticks (#436752) -- add spec file template - -* Mon Mar 10 2008 Tom "spot" Callaway 7.1.269-2 -- BR: ExtUtils::Embed to find perl headers - -* Mon Mar 10 2008 Karsten Hopp 7.1.269-1 -- patchlevel 269 -- rebuild with new perl (#436731) - -* Mon Mar 03 2008 Karsten Hopp 7.1.266-1 -- patchlevel 266 -- add minimal help page for /bin/vi (#173974) - -* Mon Feb 25 2008 Karsten Hopp 7.1.262-1 -- patchlevel 262 -- add fix for #231124, BOM was ignored -- enable ruby interpreter (#215207) -- add filetype for Erlang header files (#417371) - -* Mon Feb 11 2008 Karsten Hopp 7.1.245-1 -- patchlevel 245 - -* Sun Jan 27 2008 Karsten Hopp 7.1.242-1 -- patchlevel 242 - -* Fri Jan 18 2008 Karsten Hopp 7.1.233-2 -- silence taglist plugin (#429200) - -* Fri Jan 18 2008 Karsten Hopp 7.1.233-1 -- patchlevel 233 -- fix ada patch - -* Wed Jan 16 2008 Karsten Hopp 7.1.230-2 -- add newer ada runtime files to fix bugzilla #246378 - -* Wed Jan 16 2008 Karsten Hopp 7.1.230-1 -- patchlevel 230, fixes memory leak - -* Mon Jan 14 2008 Karsten Hopp 7.1.228-1 -- patchlevel 228 -- allow overwriting WITH_SELING at build time (#427710) - -* Thu Jan 10 2008 Karsten Hopp 7.1.214-1 -- patchlevel 214 - -* Mon Jan 07 2008 Karsten Hopp 7.1.211-1 -- patchlevel 211 - -* Sat Dec 22 2007 Karsten Hopp 7.1.175-1 -- patchlevel 175 - -* Thu Nov 22 2007 Karsten Hopp 7.1.159-1 -- patchlevel 159 -- vim-enhanced requires which for vimtutor (#395371) - -* Thu Oct 04 2007 Karsten Hopp 7.1.135-1 -- patchlevel 135 - -* Wed Sep 26 2007 Karsten Hopp 7.1.122-1 -- patchlevel 122 - -* Tue Sep 25 2007 Karsten Hopp 7.1.119-1 -- patchlevel 119 - -* Mon Sep 24 2007 Karsten Hopp 7.1.116-1 -- patchlevel 116 - -* Fri Sep 07 2007 Karsten Hopp 7.1.100-1 -- patchlevel 100 - -* Fri Aug 24 2007 Karsten Hopp 7.1.87-1 -- add build requirement perl-devel -- fix tarball unpacking -- patchlevel 87 - -* Wed Aug 15 2007 Karsten Hopp 7.1.77-1 -- patchlevel 77 - -* Mon Aug 13 2007 Karsten Hopp 7.1.68-1 -- patchlevel 68 - -* Thu Aug 02 2007 Karsten Hopp 7.1.47-1 -- patchlevel 47 - -* Wed Jul 11 2007 Karsten Hopp 7.1.28-1 -- patchlevel 28 - -* Wed Jun 27 2007 Karsten Hopp 7.1.12-1 -- Patchlevel 12 - -* Mon Jun 04 2007 Karsten Hopp 7.1.2-1 -- vim 7.1 -- drop 240 patches - -* Tue May 22 2007 Karsten Hopp 7.0.235-1 -- Don't wake up system with blinking gvim cursor: - http://www.linuxpowertop.org/known.php - -* Mon Apr 30 2007 Karsten Hopp 7.0.235-1 -- update to patchlevel 235, fixes modeline issues - -* Tue Apr 17 2007 Karsten Hopp 7.0.224-3 -- fix typo in require line (vim-X11 - 2:7.0.224-2.fc7.i386 requires 4) - -* Mon Apr 16 2007 Karsten Hopp 7.0.224-2 -- use more macros -- drop BR perl -- move license to main doc directory -- set vendor to 'fedora' (desktop-file) -- don't own man directories -- preserve timestamps of non-generated files -- run update-desktop-database - -* Thu Apr 05 2007 Karsten Hopp 7.0.224-1 -- vim-X11 provides gvim - -* Fri Mar 30 2007 Karsten Hopp 7.0.224-1 -- patchlevel 224 - -* Wed Feb 21 2007 Karsten Hopp 7.0.195-2 -- rpmlint fixes (#226526) - -* Tue Feb 13 2007 Karsten Hopp 7.0.195-1 -- patchlevel 195 - -* Mon Feb 12 2007 Karsten Hopp 7.0.192-1 -- patchlevel 192 -- test fix for highlighting problems with curly brackets in #define (#203577) - -* Tue Feb 06 2007 Karsten Hopp 7.0.191-2 -- uses ncurses instead of ncursesw - -* Tue Feb 06 2007 Karsten Hopp 7.0.191-1 -- patchlevel 191 -- clean up spec file for rpmlint -- drop cvim stuff - -* Tue Jan 23 2007 Karsten Hopp 7.0.188-3 -- patchlevel 188 - -* Mon Jan 08 2007 Karsten Hopp 7.0.178-3 -- enable filetype plugin - -* Thu Dec 14 2006 Karsten Hopp 7.0.178-2 -- build vim-minimal with features=small instead of tiny (#219605) - -* Tue Dec 12 2006 Karsten Hopp 7.0.178-1 -- add vimfiles/after to list of owned directories - -* Tue Dec 12 2006 Karsten Hopp 7.0.178-1 -- patchlevel 178 -- use macros -- Resolves: #219154 - add directory /usr/share/vim/vimfiles for plugins - -* Thu Dec 7 2006 Jeremy Katz -- rebuild for python 2.5 - -* Wed Nov 22 2006 Karsten Hopp 7.0.168-1 -- patchlevel 168 -- link with ncurses - -* Tue Nov 21 2006 Karsten Hopp 7.0.164-2 -- patchlevel 164 - -* Mon Nov 13 2006 Karsten Hopp 7.0.162-2 -- fix lang problem in spec file mode -- use old g:packager variable when set - -* Fri Nov 10 2006 Karsten Hopp 7.0.162-1 -- patchlevel 162 - -* Mon Nov 06 2006 Karsten Hopp 7.0.158-1 -- patchlevel 158 - -* Tue Oct 17 2006 Karsten Hopp 7.0.139-1 -- patchlevel 139 -- provide vim, vi (#210950) - -* Thu Sep 28 2006 Jeremy Katz - 7.0.109-3 -- disable vim-spell subpackage as it pushes us over CD boundaries - -* Tue Sep 28 2006 Karsten Hopp 7.0.109-2 -- fix typo in vimspell.sh (#203178) - -* Tue Sep 19 2006 Karsten Hopp 7.0.109-1 -- update to patchlevel 109 to fix some redraw problems -- fix invisible comments in diff mode (#204042) - -* Tue Sep 12 2006 Karsten Hopp 7.0.100-1 -- Patchlevel 100 -- replace runtime files with newer ones - -* Mon Sep 11 2006 Karsten Hopp 7.0.099-1 -- Patchlevel 99 - -* Mon Sep 05 2006 Karsten Hopp 7.0.086-1 -- Patchlevel 86 - -* Mon Sep 04 2006 Karsten Hopp 7.0.083-1 -- Patchlevel 83 - -* Wed Aug 30 2006 Karsten Hopp 7.0.076-1 -- Patchlevel 76 - -* Thu Aug 25 2006 Karsten Hopp 7.0.066-2 -- fix vimdiff colors (#204042) - -* Thu Aug 24 2006 Karsten Hopp 7.0.066-1 -- fix syntax patch (#203798) -- patchlevel 66 - -* Wed Aug 17 2006 Karsten Hopp 7.0.063-1 -- Patchlevel 63 - -* Wed Aug 15 2006 Karsten Hopp 7.0.053-1 -- Patchlevel 53 -- Buildrequires libXpm-devel - -* Wed Aug 09 2006 Karsten Hopp 7.0.050-1 -- Patchlevel 50 - -* Thu Aug 03 2006 Karsten Hopp 7.0.042-2 -- clean up spec file - -* Mon Jul 24 2006 Karsten Hopp 7.0.042-1 -- patchlevel 42 - -* Wed Jul 20 2006 Karsten Hopp 7.0.039-1 -- patchlevel 39 -- allow usage of $VIM variable (#199465) - -* Wed Jul 12 2006 Jesse Keating - 2:7.0.035-1.1 -- rebuild - -* Tue Jun 27 2006 Karsten Hopp 7.0.035-1 -- patchlevel 35 - -* Wed Jun 21 2006 Karsten Hopp 7.0.022-2 -- add binfmt_misc rpc_pipefs to fstypes for better mtab highlighting - -* Tue Jun 20 2006 Karsten Hopp 7.0.022-1 +* Tue Sep 30 2008 Karsten Hopp 7.2.022-1 - patchlevel 22 -* Tue Jun 20 2006 Karsten Hopp 7.0.020-1 -- patchlevel 20 +* Mon Sep 08 2008 Karsten Hopp 7.2.013-1 +- patchlevel 13 -* Tue Jun 20 2006 Karsten Hopp 7.0.019-1 -- patchlevel 19 -- buildrequire autoconf +* Mon Aug 25 2008 Karsten Hopp 7.2.006-1 +- patchlevel 6 -* Tue May 30 2006 Karsten Hopp 7.0.017-1 -- patchlevel 17, although it affects just the Motif version -- own some directories (#192787) +* Mon Aug 18 2008 Karsten Hopp 7.2.002-1 +- patchlevel 2 +- fix specfile template (#446070) +- old specfile changelog moved to Changelog.rpm -* Sat May 13 2006 Karsten Hopp 7.0.016-1 -- patchlevel 016 - -* Fri May 12 2006 Karsten Hopp 7.0.012-1 -- patchlevel 012 - -* Thu May 11 2006 Karsten Hopp 7.0.010-1 -- patchlevel 010 - -* Wed May 10 2006 Karsten Hopp 7.0.005-2 -- patchlevel 005 -- move older changelogs (<7.0) into a file, no need to keep them - in the rpm database - -* Tue May 09 2006 Karsten Hopp 7.0.000-2 -- bump epoch, the buildsystem thinks 7.0.000-2 is older than 7.0.g001-1 - although rpm is quite happy with it. - -* Mon May 08 2006 Karsten Hopp 7.0.000-1 -- vim-7.0 -- Spell checking support for about 50 languages -- Intelligent completion for C, HTML, Ruby, Python, PHP, etc. -- Tab pages, each containing multiple windows -- Undo branches: never accidentally lose text again -- Vim script supports Lists and Dictionaries (similar to Python) -- Vim script profiling -- Improved Unicode support -- Highlighting of cursor line, cursor column and matching braces -- Translated manual pages support. -- Internal grep; works on all platforms, searches compressed files -- Browsing remote directories, zip and tar archives -- Printing multi-byte text -- find details about the changes since vim-6.4 with :help version7 - -- fix SE Linux context of temporary (.swp) files (#189968) -- /bin/vi /vim-minimal is now using /etc/virc to avoid .rpmnew files - when updating - -* Tue May 02 2006 Karsten Hopp 7.0.g001-1 -- vim-7.0g BETA - -* Fri Apr 28 2006 Karsten Hopp 7.0.f001-1 -- vim-7.0f3 BETA - -* Thu Apr 20 2006 Karsten Hopp 7.0.e001-1 -- vim-7.0e BETA - -* Tue Apr 11 2006 Karsten Hopp 7.0.d001-1 -- vim-7.0d BETA - -* Fri Apr 07 2006 Karsten Hopp 7.0c.000-3 -- fix vimrc filename - -* Thu Apr 06 2006 Karsten Hopp 7.0c.000-2 -- new snapshot - -* Tue Apr 04 2006 Karsten Hopp 7.0c.000-1 -- vim-7.0c BETA - -* Wed Mar 22 2006 Karsten Hopp 7.0aa.000-3 -- Rawhide build as vim, opposed to vim7 (prerelease) -- conflict with older man-pages-{it,fr} packages -- cleanup lang stuff - -* Thu Mar 16 2006 Karsten Hopp 7.0aa.000-2 -- make it coexist with vim-6 (temporarily) -- new CVS snapshot - -* Tue Mar 14 2006 Karsten Hopp 7.0aa.000-1 -- vim7 pre Release -- older changelogs available in Changelog.rpm +* Fri Aug 14 2008 Karsten Hopp 7.2.000-1 +- vim 7.2 +- drop 330 patches # vim:nrformats-=octal diff --git a/zip.vim b/zip.vim new file mode 100644 index 00000000..af56944c --- /dev/null +++ b/zip.vim @@ -0,0 +1,387 @@ +" zip.vim: Handles browsing zipfiles +" AUTOLOAD PORTION +" Date: Jul 30, 2008 +" Version: 22 +" Maintainer: Charles E Campbell, Jr +" License: Vim License (see vim's :help license) +" Copyright: Copyright (C) 2005-2008 Charles E. Campbell, Jr. {{{1 +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" zip.vim and zipPlugin.vim are provided *as is* and comes with +" no warranty of any kind, either expressed or implied. By using +" this plugin, you agree that in no event will the copyright +" holder be liable for any damages resulting from the use +" of this software. + +" --------------------------------------------------------------------- +" Load Once: {{{1 +let s:keepcpo= &cpo +set cpo&vim +if &cp || exists("g:loaded_zip") || v:version < 700 + finish +endif + +let g:loaded_zip = "v22" +let s:zipfile_escape = ' ?&;\' +let s:ERROR = 2 +let s:WARNING = 1 +let s:NOTE = 0 + +" --------------------------------------------------------------------- +" Global Values: {{{1 +if !exists("g:zip_shq") + if &shq != "" + let g:zip_shq= &shq + elseif has("unix") + let g:zip_shq= "'" + else + let g:zip_shq= '"' + endif +endif +if !exists("g:zip_zipcmd") + let g:zip_zipcmd= "zip" +endif +if !exists("g:zip_unzipcmd") + let g:zip_unzipcmd= "unzip" +endif + +" ---------------- +" Functions: {{{1 +" ---------------- + +" --------------------------------------------------------------------- +" zip#Browse: {{{2 +fun! zip#Browse(zipfile) +" call Dfunc("zip#Browse(zipfile<".a:zipfile.">)") + let repkeep= &report + set report=10 + + " sanity checks + if !exists("*fnameescape") + if &verbose > 1 + echoerr "the zip plugin is not available (your vim doens't support fnameescape())" + endif + return + endif + if !executable(g:zip_unzipcmd) + redraw! + echohl Error | echo "***error*** (zip#Browse) unzip not available on your system" +" call inputsave()|call input("Press to continue")|call inputrestore() + let &report= repkeep +" call Dret("zip#Browse") + return + endif + if !filereadable(a:zipfile) + if a:zipfile !~# '^\a\+://' + " if its an url, don't complain, let url-handlers such as vim do its thing + redraw! + echohl Error | echo "***error*** (zip#Browse) File not readable<".a:zipfile.">" | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + endif + let &report= repkeep +" call Dret("zip#Browse : file<".a:zipfile."> not readable") + return + endif +" call Decho("passed sanity checks") + if &ma != 1 + set ma + endif + let b:zipfile= a:zipfile + + setlocal noswapfile + setlocal buftype=nofile + setlocal bufhidden=hide + setlocal nobuflisted + setlocal nowrap + set ft=tar + + " give header + let lastline= line("$") + call setline(lastline+1,'" zip.vim version '.g:loaded_zip) + call setline(lastline+2,'" Browsing zipfile '.a:zipfile) + call setline(lastline+3,'" Select a file with cursor and press ENTER') + $put ='' + 0d + $ + +" call Decho("exe silent r! ".g:zip_unzipcmd." -l -- ".s:Escape(a:zipfile,1)) + exe "silent r! ".g:zip_unzipcmd." -l -- ".s:Escape(a:zipfile,1) + if v:shell_error != 0 + redraw! + echohl WarningMsg | echo "***warning*** (zip#Browse) ".fnameescape(a:zipfile)." is not a zip file" | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + silent %d + let eikeep= &ei + set ei=BufReadCmd,FileReadCmd + exe "r ".fnameescape(a:zipfile) + let &ei= eikeep + 1d +" call Dret("zip#Browse") + return + endif +" call Decho("line 6: ".getline(6)) + let namecol= stridx(getline(6),'Name') + 1 +" call Decho("namecol=".namecol) + 4,$g/^\s*----/d + 4,$g/^\s*\a/d + $d + if namecol > 0 + exe 'silent 4,$s/^.*\%'.namecol.'c//' + endif + + setlocal noma nomod ro + noremap :call ZipBrowseSelect() + + let &report= repkeep +" call Dret("zip#Browse") +endfun + +" --------------------------------------------------------------------- +" ZipBrowseSelect: {{{2 +fun! s:ZipBrowseSelect() +" call Dfunc("ZipBrowseSelect() zipfile<".b:zipfile."> curfile<".expand("%").">") + let repkeep= &report + set report=10 + let fname= getline(".") + + " sanity check + if fname =~ '^"' + let &report= repkeep +" call Dret("ZipBrowseSelect") + return + endif + if fname =~ '/$' + redraw! + echohl Error | echo "***error*** (zip#Browse) Please specify a file, not a directory" | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + let &report= repkeep +" call Dret("ZipBrowseSelect") + return + endif + +" call Decho("fname<".fname.">") + + " get zipfile to the new-window + let zipfile = b:zipfile + let curfile= expand("%") +" call Decho("zipfile<".zipfile.">") +" call Decho("curfile<".curfile.">") + + new + if !exists("g:zip_nomax") || g:zip_nomax == 0 + wincmd _ + endif + let s:zipfile_{winnr()}= curfile +" call Decho("exe e ".fnameescape("zipfile:".zipfile.'::'.fname)) + exe "e ".fnameescape("zipfile:".zipfile.'::'.fname) + filetype detect + + let &report= repkeep +" call Dret("ZipBrowseSelect : s:zipfile_".winnr()."<".s:zipfile_{winnr()}.">") +endfun + +" --------------------------------------------------------------------- +" zip#Read: {{{2 +fun! zip#Read(fname,mode) +" call Dfunc("zip#Read(fname<".a:fname.">,mode=".a:mode.")") + let repkeep= &report + set report=10 + + if has("unix") + let zipfile = substitute(a:fname,'zipfile:\(.\{-}\)::[^\\].*$','\1','') + let fname = substitute(a:fname,'zipfile:.\{-}::\([^\\].*\)$','\1','') + else + let zipfile = substitute(a:fname,'^.\{-}zipfile:\(.\{-}\)::[^\\].*$','\1','') + let fname = substitute(a:fname,'^.\{-}zipfile:.\{-}::\([^\\].*\)$','\1','') + let fname = substitute(fname, '[', '[[]', 'g') + endif +" call Decho("zipfile<".zipfile.">") +" call Decho("fname <".fname.">") + +" call Decho("exe r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fname,1)) + exe "silent r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fname,1) + + " cleanup + 0d + set nomod + + let &report= repkeep +" call Dret("zip#Read") +endfun + +" --------------------------------------------------------------------- +" zip#Write: {{{2 +fun! zip#Write(fname) +" call Dfunc("zip#Write(fname<".a:fname.">) zipfile_".winnr()."<".s:zipfile_{winnr()}.">") + let repkeep= &report + set report=10 + + " sanity checks + if !executable(g:zip_zipcmd) + redraw! + echohl Error | echo "***error*** (zip#Write) sorry, your system doesn't appear to have the zip pgm" | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + let &report= repkeep +" call Dret("zip#Write") + return + endif + if !exists("*mkdir") + redraw! + echohl Error | echo "***error*** (zip#Write) sorry, mkdir() doesn't work on your system" | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + let &report= repkeep +" call Dret("zip#Write") + return + endif + + let curdir= getcwd() + let tmpdir= tempname() +" call Decho("orig tempname<".tmpdir.">") + if tmpdir =~ '\.' + let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') + endif +" call Decho("tmpdir<".tmpdir.">") + call mkdir(tmpdir,"p") + + " attempt to change to the indicated directory + if s:ChgDir(tmpdir,s:ERROR,"(zip#Write) cannot cd to temporary directory") + let &report= repkeep +" call Dret("zip#Write") + return + endif +" call Decho("current directory now: ".getcwd()) + + " place temporary files under .../_ZIPVIM_/ + if isdirectory("_ZIPVIM_") + call s:Rmdir("_ZIPVIM_") + endif + call mkdir("_ZIPVIM_") + cd _ZIPVIM_ +" call Decho("current directory now: ".getcwd()) + + if has("unix") + let zipfile = substitute(a:fname,'zipfile:\(.\{-}\)::[^\\].*$','\1','') + let fname = substitute(a:fname,'zipfile:.\{-}::\([^\\].*\)$','\1','') + else + let zipfile = substitute(a:fname,'^.\{-}zipfile:\(.\{-}\)::[^\\].*$','\1','') + let fname = substitute(a:fname,'^.\{-}zipfile:.\{-}::\([^\\].*\)$','\1','') + endif +" call Decho("zipfile<".zipfile.">") +" call Decho("fname <".fname.">") + + if fname =~ '/' + let dirpath = substitute(fname,'/[^/]\+$','','e') + if executable("cygpath") + let dirpath = substitute(system("cygpath ".s:Escape(dirpath,0)),'\n','','e') + endif +" call Decho("mkdir(dirpath<".dirpath.">,p)") + call mkdir(dirpath,"p") + endif + if zipfile !~ '/' + let zipfile= curdir.'/'.zipfile + endif +" call Decho("zipfile<".zipfile."> fname<".fname.">") + + exe "w! ".fnameescape(fname) + if executable("cygpath") + let zipfile = substitute(system("cygpath ".s:Escape(zipfile,0)),'\n','','e') + endif + + if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$' + let fname = substitute(fname, '[', '[[]', 'g') + endif + +" call Decho(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0)) + call system(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0)) + if v:shell_error != 0 + redraw! + echohl Error | echo "***error*** (zip#Write) sorry, unable to update ".zipfile." with ".fname | echohl None +" call inputsave()|call input("Press to continue")|call inputrestore() + + elseif s:zipfile_{winnr()} =~ '^\a\+://' + " support writing zipfiles across a network + let netzipfile= s:zipfile_{winnr()} +" call Decho("handle writing <".zipfile."> across network as <".netzipfile.">") + 1split|enew + let binkeep= &binary + let eikeep = &ei + set binary ei=all + exe "e! ".fnameescape(zipfile) + call netrw#NetWrite(netzipfile) + let &ei = eikeep + let &binary = binkeep + q! + unlet s:zipfile_{winnr()} + endif + + " cleanup and restore current directory + cd .. + call s:Rmdir("_ZIPVIM_") + call s:ChgDir(curdir,s:WARNING,"(zip#Write) unable to return to ".curdir."!") + call s:Rmdir(tmpdir) + setlocal nomod + + let &report= repkeep +" call Dret("zip#Write") +endfun + +" --------------------------------------------------------------------- +" s:Escape: {{{2 +fun! s:Escape(fname,isfilt) +" call Dfunc("QuoteFileDir(fname<".a:fname."> isfilt=".a:isfilt.")") + if exists("*shellescape") + if a:isfilt + let qnameq= shellescape(a:fname,1) + else + let qnameq= shellescape(a:fname) + endif + else + let qnameq= g:zip_shq.escape(a:fname,g:zip_shq).g:zip_shq + endif +" call Dret("QuoteFileDir <".qnameq.">") + return qnameq +endfun + +" --------------------------------------------------------------------- +" ChgDir: {{{2 +fun! s:ChgDir(newdir,errlvl,errmsg) +" call Dfunc("ChgDir(newdir<".a:newdir."> errlvl=".a:errlvl." errmsg<".a:errmsg.">)") + + try + exe "cd ".fnameescape(a:newdir) + catch /^Vim\%((\a\+)\)\=:E344/ + redraw! + if a:errlvl == s:NOTE + echo "***note*** ".a:errmsg + elseif a:errlvl == s:WARNING + echohl WarningMsg | echo "***warning*** ".a:errmsg | echohl NONE + elseif a:errlvl == s:ERROR + echohl Error | echo "***error*** ".a:errmsg | echohl NONE + endif +" call inputsave()|call input("Press to continue")|call inputrestore() +" call Dret("ChgDir 1") + return 1 + endtry + +" call Dret("ChgDir 0") + return 0 +endfun + +" --------------------------------------------------------------------- +" s:Rmdir: {{{2 +fun! s:Rmdir(fname) +" call Dfunc("Rmdir(fname<".a:fname.">)") + if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$' + call system("rmdir /S/Q ".s:Escape(a:fname,0)) + else + call system("/bin/rm -rf ".s:Escape(a:fname,0)) + endif +" call Dret("Rmdir") +endfun + +" ------------------------------------------------------------------------ +" Modelines And Restoration: {{{1 +let &cpo= s:keepcpo +unlet s:keepcpo +" vim:ts=8 fdm=marker From ea9b3c4404f19097e8e469c6b981b757ac9f0ed5 Mon Sep 17 00:00:00 2001 From: Bill Nottingham Date: Thu, 26 Nov 2009 01:14:06 +0000 Subject: [PATCH 70/71] Fix typo that causes a failure to update the common directory. (releng #2781) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e93db5a4..8482b06e 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ NAME := vim SPECFILE = $(firstword $(wildcard *.spec)) define find-makefile-common -for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done +for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$d/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done endef MAKEFILE_COMMON := $(shell $(find-makefile-common)) From 97fb8e57b96ebe5f565f212f869af9bc061ffc6a Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 29 Jul 2010 15:02:51 +0000 Subject: [PATCH 71/71] dist-git conversion --- .cvsignore => .gitignore | 0 Makefile | 21 --------------------- branch | 1 - 3 files changed, 22 deletions(-) rename .cvsignore => .gitignore (100%) delete mode 100644 Makefile delete mode 100644 branch diff --git a/.cvsignore b/.gitignore similarity index 100% rename from .cvsignore rename to .gitignore diff --git a/Makefile b/Makefile deleted file mode 100644 index 8482b06e..00000000 --- a/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# Makefile for source rpm: vim -# $Id$ -NAME := vim -SPECFILE = $(firstword $(wildcard *.spec)) - -define find-makefile-common -for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$d/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done -endef - -MAKEFILE_COMMON := $(shell $(find-makefile-common)) - -ifeq ($(MAKEFILE_COMMON),) -# attempt a checkout -define checkout-makefile-common -test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2 -endef - -MAKEFILE_COMMON := $(shell $(checkout-makefile-common)) -endif - -include $(MAKEFILE_COMMON) diff --git a/branch b/branch deleted file mode 100644 index 1c26f782..00000000 --- a/branch +++ /dev/null @@ -1 +0,0 @@ -F-9