From f513c012d85ef38839de9d96bee97dda336233fa Mon Sep 17 00:00:00 2001 From: Audric Schiltknecht Date: Fri, 30 Aug 2013 17:50:14 +0200 Subject: Add MultipleSearch bundle --- .../MultipleSearch/autoload/MultipleSearch.vim | 343 +++++++++++++++++++++ .../bundle/MultipleSearch/doc/MultipleSearch.txt | 106 +++++++ .../MultipleSearch/plugin/MultipleSearch.vim | 51 +++ 3 files changed, 500 insertions(+) create mode 100644 vim/vim/bundle/MultipleSearch/autoload/MultipleSearch.vim create mode 100644 vim/vim/bundle/MultipleSearch/doc/MultipleSearch.txt create mode 100644 vim/vim/bundle/MultipleSearch/plugin/MultipleSearch.vim (limited to 'vim') diff --git a/vim/vim/bundle/MultipleSearch/autoload/MultipleSearch.vim b/vim/vim/bundle/MultipleSearch/autoload/MultipleSearch.vim new file mode 100644 index 0000000..a258748 --- /dev/null +++ b/vim/vim/bundle/MultipleSearch/autoload/MultipleSearch.vim @@ -0,0 +1,343 @@ +" File: MultipleSearch.vim (global plugin) +" Last Changed: 13 Aug 2008 +" Maintainer: Dan Sharp +" Version: 1.3 +" License: Vim License + +"----------------------------------------------------------------------------- +" MultipleSearch allows you to have the results of multiple searches displayed +" on the screen at the same time. Each search highlights its results in a +" different color, and all searches are displayed at once. After the maximum +" number of colors is used, the script starts over with the first color. +" +" The command syntax is: +" :Search +" which will highlight all occurrences of in the current buffer. A +" subsequent :Search will highlight all occurrences of +" in the current buffer, retaining the highlighting of as well. +" and are any search pattern like you would use in a +" normal / search. +" +" The :Search command honors Vim's 'ignorecase' and 'smartcase' settings for +" its own search. You can use the \c and \C flags in the search pattern to +" force case matching no matter the setting of 'ignorecase' and 'smartcase'. +" +" The :SearchBuffers command works just like :Search, but the search occurs in +" all currently listed buffers (i.e., those that appear in the output of :ls). +" The match in all buffers will have the same color. This is different than +" :bufdo Search because in that case, each buffer will highlight the +" match in a different color. +" +" To clear the highlighting, issue the command :SearchReset (for the current +" buffer) or :SearchBuffersReset (for all buffers). +" +" You can specify the maximum number of different colors to use by setting the +" g:MultipleSearchMaxColors variable in your .vimrc. The default setting is +" four, but the script should handle as much as your terminal / GUI can +" display. The g:MultipleSearchColorSequence variable lets you list the +" colors you want displayed, and in what order. To make the text more +" readable, you can set the g:MultipleSearchTextColorSequence variable to a +" list of colors for the text, each position corresponding to the color in the +" same position in g:MultipleSearchColorSequence. + +" If you change one of the preference variables, you can issue the command +" :SearchReinit +" to update the script with your new selections. + +" Supporters: +" Thanks to Peter Valach for suggestions and testing! +" Thanks to Jeff Mei for the suggestion and testing of the :SearchBuffers +" command. +" Thanks to Amber Hassan for fixing a problem with a search pattern containing +" quote characters! +" Thanks to Manuel Picaza for the mapping to :Search the word under the +" cursor. +" ---------------------------------------------------------------------------- + +" This script uses continuation lines, so make sure it runs using +" Vim-default 'cpoptions'. +let s:save_cpo = &cpo +set cpo&vim + +" FUNCTIONS +" -------------------------------------------------- + +" ----- +" Strntok: Utility function to implement C-like strntok() by Michael Geddes +" and Benji Fisher at http://groups.yahoo.com/group/vimdev/message/26788 +" ----- +function! s:Strntok( s, tok, n) + return matchstr( a:s.a:tok[0], '\v(\zs([^'.a:tok.']*)\ze['.a:tok.']){'.a:n.'}') +endfun + +" ----- +" MultipleSearchInit: Initialize the higlight groups. This function will add +" highlighting groups if g:MultipSearchMaxColors has increased since the +" plugin was first loaded. +" ----- +function! s:MultipleSearchInit() + " Specify a maximum number of colors to use. + if exists('g:MultipleSearchMaxColors') + let s:MaxColors = g:MultipleSearchMaxColors + else + let s:MaxColors = 4 + endif + + " Define the sequence of colors to use for searches. + if exists('g:MultipleSearchColorSequence') + let s:ColorSequence = g:MultipleSearchColorSequence + else + let s:ColorSequence = "red,yellow,blue,green,magenta,cyan,gray,brown" + endif + + " Define the text color for searches, so that it can still be read against the + " colored background. + if exists('g:MultipleSearchTextColorSequence') + let s:TextColorSequence = g:MultipleSearchTextColorSequence + else + let s:TextColorSequence = "white,black,white,black,white,black,black,white" + endif + + " Start off with the first color + let s:colorToUse = 0 + + let s:colorsInUse = 0 + + " Sanity check: make sure MaxColors is not larger than the number of + " colors in ColorSequence or the corresponding TextColorSequence. + let s:MaxColors = s:Min(s:MaxColors, s:ItemCount(s:ColorSequence . ','), + \ s:ItemCount(s:TextColorSequence . ',')) + + let loopCount = 0 + while loopCount < s:MaxColors + " Define the colors to use + let bgColor = s:Strntok(s:ColorSequence, ',', loopCount + 1) + let fgColor = s:Strntok(s:TextColorSequence, ',', loopCount + 1) + execute 'highlight MultipleSearch' . loopCount + \ . ' ctermbg=' . bgColor . ' guibg=' . bgColor + \ . ' ctermfg=' . fgColor . ' guifg=' . fgColor + let loopCount = loopCount + 1 + endwhile +endfunction + +" ----- +" ItemCount: Returns the number of items in the given string. +" ----- +function! s:ItemCount(string) + let itemCount = 0 + let newstring = a:string + let pos = stridx(newstring, ',') + while pos > -1 + let itemCount = itemCount + 1 + let newstring = strpart(newstring, pos + 1) + let pos = stridx(newstring, ',') + endwhile + return itemCount +endfunction + +" ----- +" Min: Returns the minimum of the given parameters. +" ----- +function! s:Min(...) + let min = a:1 + let index = 2 + while index <= a:0 + execute "if min > a:" . index . " | let min = a:" . index . " | endif" + let index = index + 1 + endwhile + return min +endfunction + +" ----- +" GetNextSequenceNumber: Determine the next Search color to use. +" ----- +function! s:GetNextSequenceNumber() + let sequenceNumber = s:colorToUse % s:MaxColors + let s:colorToUse = s:colorToUse + 1 + if s:colorToUse >= s:MaxColors + let s:colorToUse = 0 + endif + return sequenceNumber +endfunction + +" ----- +" DoSearch: The main searching function that highlights all matches in the +" current buffer. +" ----- +function! s:DoSearch(useSearch, forwhat) + " Clear the previous highlighting for this color + execute 'silent syntax clear ' . a:useSearch + + " Should it be a case-sensitive match or case-insensitive? + if &ignorecase == 1 + " If 'smartcase' is on and our search pattern has an upper-case + " character, do a case sensitive match. + if &smartcase == 1 + " match() respects 'ignorecase', so turn it off for now + set noignorecase + + if match(a:forwhat, '\u') > -1 + syntax case match + else + syntax case ignore + endif + + " Be sure to turn 'ignorecase' back on! + set ignorecase + else + syntax case ignore + endif + else + syntax case match + endif + + " Highlight the new search + execute 'syntax match ' . a:useSearch . ' "' . a:forwhat . '" containedin=ALL' + let @/ = a:forwhat +endfunction + +" ----- +" MultipleSearch: Highlight the given pattern in the next available color. +" Vim versions prior to 7.0 don't support the autoload mechanism, so define +" the main function without the autoload prefix. +" ----- +if v:version < 700 + function! MultipleSearch(allBuffers, forwhat) + call s:MultipleSearchCommon(a:allBuffers, a:forwhat) + endfunction +else + function! MultipleSearch#MultipleSearch(allBuffers, forwhat) + call s:MultipleSearchCommon(a:allBuffers, a:forwhat) + endfunction +endif + +" ----- +" MultipleSearchCommon: Highlight the given pattern in the next available color. +" ----- +function! s:MultipleSearchCommon(allBuffers, forwhat) + let patt = a:forwhat + + if( l:patt =~ "[^\\\\]'" ) " if single quote not escaped + let l:patt = escape(l:patt,"'") " escape single quotes with a \ char + endif + + if( l:patt =~ '[^\\]"' ) " if double quote not escaped + let l:patt = escape(l:patt, '"') " escape double quotes with a \ char + endif + + "let patt = escape(a:forwhat,"'") " escape single quotes with a \ char + "let l:patt = escape(l:patt, '"') " escape double quotes with a \ char + + " Determine which search color to use. + let s:curr_sequence = s:GetNextSequenceNumber() + let s:patterns{s:curr_sequence} = l:patt + let s:searchSequence = s:curr_sequence + if s:colorsInUse < s:MaxColors + let s:colorsInUse += 1 + endif + let useSearch = "MultipleSearch" . s:curr_sequence + + if a:allBuffers + " If a:allBuffers is on, we want to show the match in all currently + " listed buffers. + let counter = 1 + let bufCount = bufnr("$") + let current = bufnr("%") + let lz_save = &lazyredraw + + " Loop through all the buffers and perform the search in each one. + while counter <= bufCount + if buflisted(counter) + exec "buffer " . counter + call s:DoSearch(useSearch, l:patt) + endif + let counter = counter + 1 + endwhile + exec "buffer " . current + let &lazyredraw = lz_save + else + " Otherwise, just search in the current buffer. + call s:DoSearch(useSearch, l:patt) + endif +endfunction + +" --- +" DoReset: Clear the highlighting +" --- +function! s:DoReset() + let seq = 0 + while seq < s:MaxColors + execute 'syntax clear MultipleSearch' . seq + let seq = seq + 1 + endwhile +endfunction + +" ----- +" MultipleSearchReset: Clear all the current search selections. +" ----- +function! s:MultipleSearchReset(allBuffers) + let s:colorToUse = 0 + let s:colorsInUse = 0 + if a:allBuffers == 1 + " If a:allBuffers is on, we want to clear the match in all + " currently listed buffers. + let current = bufnr("%") + bufdo call s:DoReset() + execute "buffer " . current + else + " Otherwise, just clear the current buffer. + call s:DoReset() + endif +endfunction + +" ----- +" SearchNext: Switch to the next search item to cycle through with n and N +" ----- +function! s:SearchNext(direction) + if a:direction == 0 + let s:searchSequence += 1 + if s:searchSequence >= s:colorsInUse + let s:searchSequence = 0 + endif + else + let s:searchSequence -= 1 + if s:searchSequence < 0 + let s:searchSequence = s:colorsInUse - 1 + endif + endif + + let @/ = s:patterns{s:searchSequence} + call search(s:patterns{s:searchSequence}) +endfunction + + +" Initialize the script the first time through. +call MultipleSearchInit() + +let &cpo = s:save_cpo + +" COMMANDS +" ------------------------------------------------ + +" Clear the current search selections and start over with the first color in +" the sequence. +if !(exists(":SearchReset") == 2) + command -nargs=0 SearchReset :silent call MultipleSearchReset(0) +endif + +" Clear the current search selections and start over with the first color in +" the sequence. +if !(exists(":SearchBuffersReset") == 2) + command -nargs=0 SearchBuffersReset :silent call MultipleSearchReset(1) +endif + +" Reinitialize the script after changing one of the global preferences. +if !(exists(":SearchReinit") == 2) + command -nargs=0 SearchReinit :silent call MultipleSearchInit() +endif + +" Set the current search pattern to the next one in the list +nnoremap n :call SearchNext(0) +" +" Set the current search pattern to the previous one in the list +nnoremap N :call SearchNext(1) diff --git a/vim/vim/bundle/MultipleSearch/doc/MultipleSearch.txt b/vim/vim/bundle/MultipleSearch/doc/MultipleSearch.txt new file mode 100644 index 0000000..30381d5 --- /dev/null +++ b/vim/vim/bundle/MultipleSearch/doc/MultipleSearch.txt @@ -0,0 +1,106 @@ +*MultipleSearch.txt* Simultaneously show multiple search results Ver. 1.3 + +Maintainer: Dan Sharp +Last Changed: 13 Aug 2008 +License: Vim License + +============================================================================== +1. MultipleSearch Plugin *MultipleSearch* + +MultipleSearch allows you to have the results of multiple searches displayed +on the screen at the same time. Each search highlights its results in a +different color, and all searches are displayed at once. After the maximum +number of colors is used, the script starts over with the first color. + +Special thanks to: +Peter Valach for suggestions and testing! +Jeff Mei for the suggesting and testing the :SearchBuffers command. +Amber Hassan for fixing problems with a search pattern containing quote +characters! +Manuel Picaza for the mapping to :Search the word under the cursor. + +------------------------------------------------------------------------------ +2. Commands *MultipleSearch-commands* + +:Search *:Search* +will highlight all occurrences of in the current buffer. A +subsequent :Search will highlight all occurrences of +in the current buffer, retaining the highlighting of as well. + and are any search pattern like you would use in a +normal / search. + +The :Search command honors Vim's 'ignorecase' and 'smartcase' settings for +its own search. You can use the |\c| and |\C| flags in the search pattern to +force case matching no matter the setting of 'ignorecase' and 'smartcase'. + +:SearchBuffers *:SearchBuffers* +The :SearchBuffers command works just like :Search, but the search occurs in +all currently listed buffers (i.e., those that appear in the output of :ls). +The match in all buffers will have the same color. This is different than +:bufdo Search because in that case, each buffer will highlight the +match in a different color. + +" Clear the current search selections and start over with the first color in +" the sequence. +:SearchReset +To clear the highlighting, issue the command :SearchReset (for the current +buffer) or :SearchBuffersReset (for all buffers). + +" Clear the current search selections and start over with the first color in +" the sequence. +:SearchBuffersReset +To clear the highlighting, issue the command :SearchReset (for the current +buffer) or :SearchBuffersReset (for all buffers). + +" Reinitialize the script after changing one of the global preferences. +:SearchReinit +If you change one of the preference variables, you can issue the command +:SearchReinit +to update the script with your new selections. + +------------------------------------------------------------------------------ +3. Mappings *MultipleSearch-mappings* + +" Thanks to Manuel Picaza for the following mapping to :Search the word under +" the cursor. +nnoremap * + +" Following Manuel's idea, adapt the former 'Super Star' tip from vim.org to work with +" :Search on a visual selection. +vnoremap * + +" Set the current search pattern to the next one in the list +nnoremap n + +" Set the current search pattern to the previous one in the list +nnoremap N + +------------------------------------------------------------------------------ +4. Settings *MultipleSearch-settings* + +You can specify the maximum number of different colors to use by setting the +g:MultipleSearchMaxColors variable in your .vimrc. The default setting is +four, but the script should handle as much as your terminal / GUI can +display. The g:MultipleSearchColorSequence variable lets you list the +colors you want displayed, and in what order. To make the text more +readable, you can set the g:MultipleSearchTextColorSequence variable to a +list of colors for the text, each position corresponding to the color in the +same position in g:MultipleSearchColorSequence. + + *g:MultipleSearchMaxColors* +g:MultipleSearchMaxColors (Default: 8) + Specifes a maximum number of colors to use. + + *g:MultipleSearchColorSequence* +g:MultipleSearchColorSequence (Default: "red,yellow,blue,green,magenta, + cyan,gray,brown") + Defines the sequence of colors to use for searches. + + *g:MultipleSearchTextColorSequence* +g:MultipleSearchTextColorSequence (Default: "white,black,white,black,white, + black,black,white") + Defines the text color for searches, so that it can still be read against + the colored background. + +============================================================================== +vim: ft=help:norl:ts=8:tw=78 diff --git a/vim/vim/bundle/MultipleSearch/plugin/MultipleSearch.vim b/vim/vim/bundle/MultipleSearch/plugin/MultipleSearch.vim new file mode 100644 index 0000000..e0b470b --- /dev/null +++ b/vim/vim/bundle/MultipleSearch/plugin/MultipleSearch.vim @@ -0,0 +1,51 @@ +" File: MultipleSearch.vim (global plugin) +" Last Changed: 14 Aug 2008 +" Maintainer: Dan Sharp +" Version: 1.3 +" License: Vim License +" GetLatestVimScripts: 479 1 :AutoInstall: MultipleSearch.vba + +if exists('loaded_multiplesearch') + finish +endif +let loaded_multiplesearch = 1 + + +" Vim versions prior to 7.0 don't support the autoload mechanism, so go ahead +" and load the 'autoload' segment of the code and map the commands using the +" non-autoload format. +if v:version < 700 + runtime autoload/MultipleSearch.vim + + if !(exists(":SearchBuffers") == 2) + command -nargs=* SearchBuffers :silent call MultipleSearch(1, ) + endif + + if !(exists(":Search") == 2) + command -nargs=* Search :silent call MultipleSearch(0, ) + endif + + " Following Manuel's idea, adapt the former 'Super Star' tip from vim.org to work with + " :Search on a visual selection. + "vnoremap * y:execute ':Search \V=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")' + vnoremap * y:call MultipleSearch(0,'\V'.substitute(escape(@@,"\\/\"'"),"\n",'\\n','ge')) +else + " Only autoload the Search commands, since we shouldn't need to use + " :SearchReset and :SearchReinit until after the first :Search. + if !(exists(":SearchBuffers") == 2) + command -nargs=* SearchBuffers :silent call MultipleSearch#MultipleSearch(1, ) + endif + + if !(exists(":Search") == 2) + command -nargs=* Search :silent call MultipleSearch#MultipleSearch(0, ) + endif + + " Following Manuel's idea, adapt the former 'Super Star' tip from vim.org to work with + " :Search on a visual selection. + vnoremap * y:call MultipleSearch#MultipleSearch(0,'\V'.substitute(escape(@@,"\\/\"'"),"\n",'\\n','ge')) +endif + +" Thanks to Manuel Picaza for the following mapping to :Search the word under +" the cursor. +nnoremap * :execute ':Search \<' . expand('') . '\>' + -- cgit v1.2.3-70-g09d2