From: Colin Patrick McCabe Date: Wed, 19 May 2010 21:02:51 +0000 (-0700) Subject: vim: add grep plugin X-Git-Url: http://club.cc.cmu.edu/~cmccabe/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=27f22dc97384e6261ea8d8b9d51974ae85b05f98;p=cmccabe-etc vim: add grep plugin --- diff --git a/.vim/plugin/grep.vim b/.vim/plugin/grep.vim new file mode 100644 index 0000000..b9e8f32 --- /dev/null +++ b/.vim/plugin/grep.vim @@ -0,0 +1,854 @@ +" File: grep.vim +" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) +" Version: 1.9 +" Last Modified: September 10, 2007 +" +" Overview +" -------- +" The grep plugin integrates the grep, fgrep, egrep, and agrep tools with +" Vim and allows you to search for a pattern in one or more files and jump +" to them. +" +" To use this plugin, you need the grep, fgrep, egrep, agrep, find and +" xargs utilities. These tools are present in most of the Unix installations. +" For MS-Windows systems, you can download the GNU grep and find utilities +" from the following sites: +" +" http://gnuwin32.sourceforge.net/packages/grep.htm +" http://gnuwin32.sourceforge.net/packages/findutils.htm +" +" Installation +" ------------ +" 1. Copy the grep.vim file to the $HOME/.vim/plugin or $HOME/vimfiles/plugin +" or $VIM/vimfiles/plugin directory. +" Refer to the following Vim help topics for more information about Vim +" plugins: +" :help add-plugin +" :help add-global-plugin +" :help runtimepath +" 2. If the grep executables are not already present in one of the directories +" in the PATH environment variable, then set the Grep_Path and other _Path +" variables to point to the location of the grep utilites in the .vimrc +" file. +" 3. Restart Vim. +" 4. You can now use the ":Grep" and other commands to search for patterns in +" files. +" +" Usage +" ----- +" The grep.vim plugin introduces the following Vim commands: +" +" :Grep - Search for the specified pattern in the specified files +" :GrepAdd - Same as ":Grep" but adds the results to the current results +" :Rgrep - Run recursive grep +" :RgrepAdd - Same as ":Rgrep" but adds the results to the current results +" :GrepBuffer - Search for a pattern on all open buffers +" :GrepBufferAdd - Same as ":GrepBuffer" but adds the results to the current +" results +" :Bgrep - Same as :GrepBuffer +" :BgrepAdd - Same as :GrepBufferAdd +" :GrepArgs - Search for a pattern on all the Vim argument +" filenames (:args) +" :GrepArgsAdd - Same as ":GrepArgs" but adds the results to the current +" results +" :Fgrep - Run fgrep +" :FgrepAdd - Same as ":Fgrep" but adds the results to the current +" results +" :Rfgrep - Run recursive fgrep +" :RfgrepAdd - Same as ":Rfgrep" but adds the results to the current +" results +" :Egrep - Run egrep +" :EgrepAdd - Same as ":Egrep" but adds the results to the current +" results +" :Regrep - Run recursive egrep +" :RegrepAdd - Same as ":Regrep" but adds the results to the current +" results +" :Agrep - Run agrep +" :AgrepAdd - Same as ":Agrep" but adds the results to the current +" results +" :Ragrep - Run recursive agrep +" :RagrepAdd - Same as ":Ragrep" but adds the results to the current +" results +" +" The above commands can be invoked like this: +" +" :Grep [] [ []] +" :Rgrep [] [ []] +" :Fgrep [] [ []] +" :Rfgrep [] [ []] +" :Egrep [] [ []] +" :Regrep [] [ []] +" :Agrep [] [ []] +" :Ragrep [] [ []] +" +" :GrepAdd [] [ []] +" :RgrepAdd [] [ []] +" :FgrepAdd [] [ []] +" :RfgrepAdd [] [ []] +" :EgrepAdd [] [ []] +" :RegrepAdd [] [ []] +" :AgrepAdd [] [ []] +" :RagrepAdd [] [ []] +" +" :GrepBuffer [] [] +" :Bgrep [] [] +" :GrepArgs [] [] +" +" :GrepBufferAdd [] [] +" :BgrepAdd [] [] +" :GrepArgsAdd [] [] +" +" In the above commands, all the arguments are optional. +" +" You can specify grep options like -i (ignore case) or -w (search for a word) +" to the above commands. If the are not specified, then the +" default grep options specified by the variable Grep_Default_Options is +" used. +" +" You can specify the grep pattern to search as an argument to the above +" commands. If the is not specified, then you will be +" prompted to enter a search pattern. By default, the keyword under the cursor +" is displayed for the search pattern prompt. You can accept the default or +" modify it. +" +" The search pattern is automatically enclosed by the character specified in +" the Grep_Shell_Quote_Char variable. You should not enclose the search +" pattern with a shell escape character. +" +" If you want to specify a search pattern with space characters or a +" multi-word pattern, then you should use the Grep command pattern input +" prompt to supply the pattern. +" +" You can specify one or more file names (or file patterns) to the above +" commands. If the are not specified, then you will be prompted +" to enter file names. By default, the pattern specified by the +" Grep_Default_Filelist variable is used. To specify the file name(s) as an +" argument to the above commands, you have to specify the search pattern also. +" +" When you enter only the command name, you will be prompted to enter the +" search pattern and the files in which to search for the pattern. By default, +" the keyword under the cursor is displayed for the search pattern prompt. +" Depending on the command, you may prompted for additional parameters like +" the directories to search for the pattern. +" +" You can retrieve previously entered values for the Grep prompts using the up +" and down arrow keys. You can cancel the command by pressing the escape key. +" You can use CTRL-U to erase the default shown for the prompt and CTRL-W to +" erase the previous word in the prompt. For more information about editing +" the prompt, read ':help cmdline-editing' Vim help topic. +" +" After invoking any of the grep commands, you can cancel the command, when +" you are prompted for a search pattern or file names or a directory by +" pressing the key. You cannot cancel (or kill) the +" grep/fgrep/egrep/agrep commands after the external command is invoked. +" +" The GrepAdd, RgrepAdd and other *Add commands append the search output to +" the current search output. This is useful if you want to see the search +" results for multiple patterns at the same time. These commands are available +" only in Vim version 7.0 and above. +" +" You can map a key to invoke any of the above commands. For example, the +" following map invokes the :Grep command to search for the keyword under the +" cursor: +" +" nnoremap :Grep +" +" The output of the grep command will be listed in the Vim quickfix window. +" 1. You can select a line in the quickfix window and press or double +" click on a match to jump to that line. +" 2. You can use the ":cnext" and ":cprev" commands to the jump to the next or +" previous output line. +" 3. You can use the ":colder" and ":cnewer" commands to go between multiple +" grep quickfix output windows. +" 4. The quickfix window need not be opened always to use the grep output. +" You can close the quickfix window and use the quickfix commands to jump +" to the grep matches. Use the ":copen" command to open the quickfix +" window again. +" +" For more information about other quickfix commands read ":help quickfix" +" +" When using GUI Vim, the Tools->Search menu item with a few sub-menu items is +" created for few variations of the search command. +" +" Configuration +" ------------- +" By changing the following variables you can configure the behavior of this +" plugin. Set the following variables in your .vimrc file using the 'let' +" command. +" +" The 'Grep_Path' variable is used to locate the grep utility. By default, +" this is set to grep. You can change this using the let command: +" +" :let Grep_Path = 'd:\tools\grep.exe' +" +" The 'Fgrep_Path' variable is used to locate the fgrep utility. By default, +" this is set to fgrep. You can change this using the let command: +" +" :let Fgrep_Path = 'd:\tools\fgrep.exe' +" +" The 'Egrep_Path' variable is used to locate the egrep utility. By default, +" this is set to egrep. You can change this using the let command: +" +" :let Egrep_Path = 'd:\tools\egrep.exe' +" +" The 'Agrep_Path' variable is used to locate the agrep utility. By default, +" this is set to agrep. You can change this using the let command: +" +" :let Agrep_Path = 'd:\tools\agrep.exe' +" +" The 'Grep_Find_Path' variable is used to locate the find utility. By +" default, this is set to d:\tools\find.exe. You can change this using the let +" command: +" +" :let Grep_Find_Path = 'd:\tools\find.exe' +" +" The 'Grep_Xargs_Path' variable is used to locate the xargs utility. By +" default, this is set to xargs. You can change this using the let +" command: +" +" :let Grep_Xargs_Path = 'd:\tools\xargs.exe' +" +" When running any one of the Grep commands, you will be prompted for the +" files in which to search for the pattern. The 'Grep_Default_Filelist' +" variable is used to specify to default for this prompt. By default, this +" variable is set to '*'. You can specify multiple matching patterns separated +" by spaces. You can change this settings using the let command: +" +" :let Grep_Default_Filelist = '*.[chS]' +" :let Grep_Default_Filelist = '*.c *.cpp *.asm' +" +" The 'Grep_Default_Options' is used to pass default command line options to +" the grep/fgrep/egrep/agrep utilities. By default, this is set to an empty +" string. You can change this using the let command: +" +" :let Grep_Default_Options = '-i' +" +" The 'Grep_Skip_Dirs' variable specifies the list of directories to skip +" while doing recursive searches. By default, this is set to 'RCS CVS SCCS'. +" You can change this using the let command: +" +" :let Grep_Skip_Dirs = 'dir1 dir2 dir3' +" +" The 'Grep_Skip_Files' variable specifies the list of files to skip while +" doing recursive searches. By default, this is set to '*~ *,v s.*'. You can +" change this using the let command: +" +" :let Grep_Skip_Files = '*.bak *~' +" +" By default, when you invoke the Grep commands the quickfix window will be +" opened with the grep output. You can disable opening the quickfix window, +" by setting the 'Grep_OpenQuickfixWindow' variable to zero: +" +" :let Grep_OpenQuickfixWindow = 0 +" +" You can manually open the quickfix window using the :cwindow command. +" +" By default, for recursive searches, the 'find' and 'xargs' utilities are +" used. If you don't have the 'xargs' utility or don't want to use the +" 'xargs' utility, " then you can set the 'Grep_Find_Use_Xargs' variable to +" zero. If this is set to zero, then only the 'find' utility is used for +" recursive searches: +" +" :let Grep_Find_Use_Xargs = 0 +" +" To handle file names with space characters in them, the xargs utility +" is invoked with the '--null' argument. If the xargs utility in your system +" doesn't accept the '--null' argument, then you can change the +" Grep_Xargs_Options variable. For example, to use the '--print0' xargs +" argument, you can use the following command: +" +" :let Grep_Xargs_Options = '--print0' +" +" The Grep_Cygwin_Find variable should be set to 1, if you are using the find +" utility from the cygwin package. This setting is used to handle the +" difference between the backslash and forward slash path separators. +" +" :let Grep_Cygwin_Find = 1 +" +" The 'Grep_Null_Device' variable specifies the name of the null device to +" pass to the grep commands. This is needed to force the grep commands to +" print the name of the file in which a match is found, if only one filename +" is specified. For Unix systems, this is set to /dev/null and for MS-Windows +" systems, this is set to NUL. You can modify this by using the let command: +" +" :let Grep_Null_Device = '/dev/null' +" +" The 'Grep_Shell_Quote_Char' variable specifies the quote character to use +" for protecting patterns from being interpreted by the shell. For Unix +" systems, this is set to "'" and for MS-Window systems, this is set to an +" empty string. You can change this using the let command: +" +" :let Grep_Shell_Quote_Char = "'" +" +" The 'Grep_Shell_Escape_Char' variable specifies the escape character to use +" for protecting special characters from being interpreted by the shell. For +" Unix systems, this is set to '\' and for MS-Window systems, this is set to +" an empty string. You can change this using the let command: +" +" :let Grep_Shell_Escape_Char = "'" +" +" --------------------- Do not modify after this line --------------------- +if exists("loaded_grep") + finish +endif +let loaded_grep = 1 + +" Line continuation used here +let s:cpo_save = &cpo +set cpo&vim + +" Location of the grep utility +if !exists("Grep_Path") + let Grep_Path = 'grep' +endif + +" Location of the fgrep utility +if !exists("Fgrep_Path") + let Fgrep_Path = 'fgrep' +endif + +" Location of the egrep utility +if !exists("Egrep_Path") + let Egrep_Path = 'egrep' +endif + +" Location of the agrep utility +if !exists("Agrep_Path") + let Agrep_Path = 'agrep' +endif + +" Location of the find utility +if !exists("Grep_Find_Path") + let Grep_Find_Path = 'find' +endif + +" Location of the xargs utility +if !exists("Grep_Xargs_Path") + let Grep_Xargs_Path = 'xargs' +endif + +" Open the Grep output window. Set this variable to zero, to not open +" the Grep output window by default. You can open it manually by using +" the :cwindow command. +if !exists("Grep_OpenQuickfixWindow") + let Grep_OpenQuickfixWindow = 1 +endif + +" Default grep file list +if !exists("Grep_Default_Filelist") + let Grep_Default_Filelist = '*' +endif + +" Default grep options +if !exists("Grep_Default_Options") + let Grep_Default_Options = '' +endif + +" Use the 'xargs' utility in combination with the 'find' utility. Set this +" to zero to not use the xargs utility. +if !exists("Grep_Find_Use_Xargs") + let Grep_Find_Use_Xargs = 1 +endif + +" The command-line arguments to supply to the xargs utility +if !exists('Grep_Xargs_Options') + let Grep_Xargs_Options = '--null' +endif + +" The find utility is from the cygwin package or some other find utility. +if !exists("Grep_Cygwin_Find") + let Grep_Cygwin_Find = 0 +endif + +" NULL device name to supply to grep. We need this because, grep will not +" print the name of the file, if only one filename is supplied. We need the +" filename for Vim quickfix processing. +if !exists("Grep_Null_Device") + if has("win32") || has("win16") || has("win95") + let Grep_Null_Device = 'NUL' + else + let Grep_Null_Device = '/dev/null' + endif +endif + +" Character to use to quote patterns and filenames before passing to grep. +if !exists("Grep_Shell_Quote_Char") + if has("win32") || has("win16") || has("win95") + let Grep_Shell_Quote_Char = '' + else + let Grep_Shell_Quote_Char = "'" + endif +endif + +" Character to use to escape special characters before passing to grep. +if !exists("Grep_Shell_Escape_Char") + if has("win32") || has("win16") || has("win95") + let Grep_Shell_Escape_Char = '' + else + let Grep_Shell_Escape_Char = '\' + endif +endif + +" The list of directories to skip while searching for a pattern. Set this +" variable to '', if you don't want to skip directories. +if !exists("Grep_Skip_Dirs") + let Grep_Skip_Dirs = 'RCS CVS SCCS' +endif + +" The list of files to skip while searching for a pattern. Set this variable +" to '', if you don't want to skip any files. +if !exists("Grep_Skip_Files") + let Grep_Skip_Files = '*~ *,v s.*' +endif + +" RunGrepCmd() +" Run the specified grep command using the supplied pattern +function! s:RunGrepCmd(cmd, pattern, action) + let cmd_output = system(a:cmd) + + if cmd_output == "" + echohl WarningMsg | + \ echomsg "Error: Pattern " . a:pattern . " not found" | + \ echohl None + return + endif + + let tmpfile = tempname() + + let old_verbose = &verbose + set verbose&vim + + exe "redir! > " . tmpfile + silent echon '[Search results for pattern: ' . a:pattern . "]\n" + silent echon cmd_output + redir END + + let &verbose = old_verbose + + let old_efm = &efm + set efm=%f:%\\s%#%l:%m + + if v:version >= 700 && a:action == 'add' + execute "silent! caddfile " . tmpfile + else + if exists(":cgetfile") + execute "silent! cgetfile " . tmpfile + else + execute "silent! cfile " . tmpfile + endif + endif + + let &efm = old_efm + + " Open the grep output window + if g:Grep_OpenQuickfixWindow == 1 + " Open the quickfix window below the current window + botright copen + endif + + call delete(tmpfile) +endfunction + +" RunGrepRecursive() +" Run specified grep command recursively +function! s:RunGrepRecursive(cmd_name, grep_cmd, action, ...) + if a:0 > 0 && (a:1 == "-?" || a:1 == "-h") + echo 'Usage: ' . a:cmd_name . " [] [ " . + \ "[]]" + return + endif + + let grep_opt = "" + let pattern = "" + let filepattern = "" + + let argcnt = 1 + while argcnt <= a:0 + if a:{argcnt} =~ '^-' + let grep_opt = grep_opt . " " . a:{argcnt} + elseif pattern == "" + let pattern = g:Grep_Shell_Quote_Char . a:{argcnt} . + \ g:Grep_Shell_Quote_Char + else + let filepattern = filepattern . " " . a:{argcnt} + endif + let argcnt= argcnt + 1 + endwhile + if grep_opt == "" + let grep_opt = g:Grep_Default_Options + endif + + if a:grep_cmd != 'agrep' + " Don't display messages about non-existent files + " Agrep doesn't support the -s option + let grep_opt = grep_opt . " -s" + endif + + if a:grep_cmd == 'grep' + let grep_path = g:Grep_Path + let grep_expr_option = '--' + elseif a:grep_cmd == 'fgrep' + let grep_path = g:Fgrep_Path + let grep_expr_option = '-e' + elseif a:grep_cmd == 'egrep' + let grep_path = g:Egrep_Path + let grep_expr_option = '-e' + elseif a:grep_cmd == 'agrep' + let grep_path = g:Agrep_Path + let grep_expr_option = '' + else + return + endif + + " No argument supplied. Get the identifier and file list from user + if pattern == "" + let pattern = input("Search for pattern: ", expand("")) + if pattern == "" + return + endif + let pattern = g:Grep_Shell_Quote_Char . pattern . + \ g:Grep_Shell_Quote_Char + endif + + let cwd = getcwd() + if g:Grep_Cygwin_Find == 1 + let cwd = substitute(cwd, "\\", "/", "g") + endif + if v:version >= 700 + let startdir = input("Start searching from directory: ", cwd, "dir") + else + let startdir = input("Start searching from directory: ", cwd) + endif + if startdir == "" + return + endif + + if filepattern == "" + let filepattern = input("Search in files matching pattern: ", + \ g:Grep_Default_Filelist) + if filepattern == "" + return + endif + endif + + let txt = filepattern . ' ' + let find_file_pattern = '' + while txt != '' + let one_pattern = strpart(txt, 0, stridx(txt, ' ')) + if find_file_pattern != '' + let find_file_pattern = find_file_pattern . ' -o' + endif + let find_file_pattern = find_file_pattern . ' -name ' . + \ g:Grep_Shell_Quote_Char . one_pattern . g:Grep_Shell_Quote_Char + let txt = strpart(txt, stridx(txt, ' ') + 1) + endwhile + let find_file_pattern = g:Grep_Shell_Escape_Char . '(' . + \ find_file_pattern . ' ' . g:Grep_Shell_Escape_Char . ')' + + let txt = g:Grep_Skip_Dirs + let find_prune = '' + if txt != '' + let txt = txt . ' ' + while txt != '' + let one_dir = strpart(txt, 0, stridx(txt, ' ')) + if find_prune != '' + let find_prune = find_prune . ' -o' + endif + let find_prune = find_prune . ' -name ' . one_dir + let txt = strpart(txt, stridx(txt, ' ') + 1) + endwhile + let find_prune = '-type d ' . g:Grep_Shell_Escape_Char . '(' . + \ find_prune + let find_prune = find_prune . ' ' . g:Grep_Shell_Escape_Char . ')' + endif + + let txt = g:Grep_Skip_Files + let find_skip_files = '-type f' + if txt != '' + let txt = txt . ' ' + while txt != '' + let one_file = strpart(txt, 0, stridx(txt, ' ')) + let find_skip_files = find_skip_files . ' ! -name ' . + \ g:Grep_Shell_Quote_Char . one_file . + \ g:Grep_Shell_Quote_Char + let txt = strpart(txt, stridx(txt, ' ') + 1) + endwhile + endif + + if g:Grep_Find_Use_Xargs == 1 + let cmd = g:Grep_Find_Path . " " . startdir + let cmd = cmd . " " . find_prune . " -prune -o" + let cmd = cmd . " " . find_skip_files + let cmd = cmd . " " . find_file_pattern + let cmd = cmd . " -print0 | " + let cmd = cmd . g:Grep_Xargs_Path . ' ' . g:Grep_Xargs_Options + let cmd = cmd . ' ' . grep_path . " " . grep_opt . " -n " + let cmd = cmd . grep_expr_option . " " . pattern + let cmd = cmd . ' ' . g:Grep_Null_Device + else + let cmd = g:Grep_Find_Path . " " . startdir + let cmd = cmd . " " . find_prune . " -prune -o" + let cmd = cmd . " " . find_skip_files + let cmd = cmd . " " . find_file_pattern + let cmd = cmd . " -exec " . grep_path . " " . grep_opt . " -n " + let cmd = cmd . grep_expr_option . " " . pattern + let cmd = cmd . " {} " . g:Grep_Null_Device . ' ' . + \ g:Grep_Shell_Escape_Char . ';' + endif + + call s:RunGrepCmd(cmd, pattern, a:action) +endfunction + +" RunGrepSpecial() +" Search for a pattern in all the opened buffers or filenames in the +" argument list +function! s:RunGrepSpecial(cmd_name, which, action, ...) + if a:0 > 0 && (a:1 == "-?" || a:1 == "-h") + echo 'Usage: ' . a:cmd_name . " [] []" + return + endif + + " Search in all the Vim buffers + if a:which == 'buffer' + " Get a list of all the buffer names + let last_bufno = bufnr("$") + + let i = 1 + let filenames = "" + + while i <= last_bufno + if bufexists(i) && buflisted(i) + let filenames = filenames . " " . bufname(i) + endif + let i = i + 1 + endwhile + + " No buffers + if filenames == "" + return + endif + elseif a:which == 'args' + " Search in all the filenames in the argument list + let arg_cnt = argc() + + if arg_cnt == 0 + echohl WarningMsg + echomsg "Error: Argument list is empty" + echohl None + return + endif + + let i = 0 + let filenames = "" + + while i < arg_cnt + let filenames = filenames . " " . argv(i) + let i = i + 1 + endwhile + + " No arguments + if filenames == "" + echohl WarningMsg + echomsg "Error: Argument list is empty" + echohl None + return + endif + endif + + let grep_opt = "" + let pattern = "" + + " Get the list of optional grep command-line options (if present) + " supplied by the user. All the grep options will be preceded + " by a '-' + let argcnt= 1 + while argcnt <= a:0 && a:{argcnt} =~ '^-' + let grep_opt = grep_opt . " " . a:{argcnt} + let argcnt = argcnt + 1 + endwhile + + " If the user didn't specify the option, then use the defaults + if grep_opt == "" + let grep_opt = g:Grep_Default_Options + endif + + " Don't display messages about non-existent files + let grep_opt = grep_opt . " -s" + + " The last argument specified by the user is the pattern + if argcnt == a:0 + let pattern = a:{argcnt} + else + " No argument supplied. Get the identifier and file list from user + let pattern = input("Search for pattern: ", expand("")) + if pattern == "" + return + endif + endif + + let pattern = g:Grep_Shell_Quote_Char . pattern . g:Grep_Shell_Quote_Char + + " Add /dev/null to the list of filenames, so that grep print the + " filename and linenumber when grepping in a single file + let filenames = filenames . " " . g:Grep_Null_Device + let cmd = g:Grep_Path . " " . grep_opt . " -n -- " + let cmd = cmd . pattern . " " . filenames + + call s:RunGrepCmd(cmd, pattern, a:action) +endfunction + +" RunGrep() +" Run the specified grep command +function! s:RunGrep(cmd_name, grep_cmd, action, ...) + if a:0 > 0 && (a:1 == "-?" || a:1 == "-h") + echo 'Usage: ' . a:cmd_name . " [] [ " . + \ "[]]" + return + endif + + let grep_opt = "" + let pattern = "" + let filenames = "" + + " Parse the arguments + " grep command-line flags are specified using the "-flag" format + " the next argument is assumed to be the pattern + " and the next arguments are assumed to be filenames or file patterns + let argcnt = 1 + while argcnt <= a:0 + if a:{argcnt} =~ '^-' + let grep_opt = grep_opt . " " . a:{argcnt} + elseif pattern == "" + let pattern = g:Grep_Shell_Quote_Char . a:{argcnt} . + \ g:Grep_Shell_Quote_Char + else + let filenames= filenames . " " . a:{argcnt} + endif + let argcnt = argcnt + 1 + endwhile + + if grep_opt == "" + let grep_opt = g:Grep_Default_Options + endif + + if a:grep_cmd != 'agrep' + " Don't display messages about non-existent files + " Agrep doesn't support the -s option + let grep_opt = grep_opt . " -s" + endif + + if a:grep_cmd == 'grep' + let grep_path = g:Grep_Path + let grep_expr_option = '--' + elseif a:grep_cmd == 'fgrep' + let grep_path = g:Fgrep_Path + let grep_expr_option = '-e' + elseif a:grep_cmd == 'egrep' + let grep_path = g:Egrep_Path + let grep_expr_option = '-e' + elseif a:grep_cmd == 'agrep' + let grep_path = g:Agrep_Path + let grep_expr_option = '' + else + return + endif + + " Get the identifier and file list from user + if pattern == "" + let pattern = input("Search for pattern: ", expand("")) + if pattern == "" + return + endif + let pattern = g:Grep_Shell_Quote_Char . pattern . + \ g:Grep_Shell_Quote_Char + endif + + if filenames == "" + if v:version >= 700 + let filenames = input("Search in files: ", g:Grep_Default_Filelist, + \ "file") + else + let filenames = input("Search in files: ", g:Grep_Default_Filelist) + endif + if filenames == "" + return + endif + endif + + " Add /dev/null to the list of filenames, so that grep print the + " filename and linenumber when grepping in a single file + let filenames = filenames . " " . g:Grep_Null_Device + let cmd = grep_path . " " . grep_opt . " -n " + let cmd = cmd . grep_expr_option . " " . pattern + let cmd = cmd . " " . filenames + + call s:RunGrepCmd(cmd, pattern, a:action) +endfunction + +" Define the set of grep commands +command! -nargs=* -complete=file Grep + \ call s:RunGrep('Grep', 'grep', 'set', ) +command! -nargs=* -complete=file Rgrep + \ call s:RunGrepRecursive('Rgrep', 'grep', 'set', ) +command! -nargs=* GrepBuffer + \ call s:RunGrepSpecial('GrepBuffer', 'buffer', 'set', ) +command! -nargs=* Bgrep + \ call s:RunGrepSpecial('Bgrep', 'buffer', 'set', ) +command! -nargs=* GrepArgs + \ call s:RunGrepSpecial('GrepArgs', 'args', 'set', ) + +command! -nargs=* -complete=file Fgrep + \ call s:RunGrep('Fgrep', 'fgrep', 'set', ) +command! -nargs=* -complete=file Rfgrep + \ call s:RunGrepRecursive('Rfgrep', 'fgrep', 'set', ) +command! -nargs=* -complete=file Egrep + \ call s:RunGrep('Egrep', 'egrep', 'set', ) +command! -nargs=* -complete=file Regrep + \ call s:RunGrepRecursive('Regrep', 'egrep', 'set', ) +command! -nargs=* -complete=file Agrep + \ call s:RunGrep('Agrep', 'agrep', 'set', ) +command! -nargs=* -complete=file Ragrep + \ call s:RunGrepRecursive('Ragrep', 'agrep', 'set', ) + +if v:version >= 700 +command! -nargs=* -complete=file GrepAdd + \ call s:RunGrep('GrepAdd', 'grep', 'add', ) +command! -nargs=* -complete=file RgrepAdd + \ call s:RunGrepRecursive('RgrepAdd', 'grep', 'add', ) +command! -nargs=* GrepBufferAdd + \ call s:RunGrepSpecial('GrepBufferAdd', 'buffer', 'add', ) +command! -nargs=* BgrepAdd + \ call s:RunGrepSpecial('BgrepAdd', 'buffer', 'add', ) +command! -nargs=* GrepArgsAdd + \ call s:RunGrepSpecial('GrepArgsAdd', 'args', 'add', ) + +command! -nargs=* -complete=file FgrepAdd + \ call s:RunGrep('FgrepAdd', 'fgrep', 'add', ) +command! -nargs=* -complete=file RfgrepAdd + \ call s:RunGrepRecursive('RfgrepAdd', 'fgrep', 'add', ) +command! -nargs=* -complete=file EgrepAdd + \ call s:RunGrep('EgrepAdd', 'egrep', 'add', ) +command! -nargs=* -complete=file RegrepAdd + \ call s:RunGrepRecursive('RegrepAdd', 'egrep', 'add', ) +command! -nargs=* -complete=file AgrepAdd + \ call s:RunGrep('AgrepAdd', 'agrep', 'add', ) +command! -nargs=* -complete=file RagrepAdd + \ call s:RunGrepRecursive('RagrepAdd', 'agrep', 'add', ) +endif + +" Add the Tools->Search Files menu +if has('gui_running') + anoremenu Tools.Search.Current\ Directory:Grep + \ :Grep + anoremenu Tools.Search.Recursively:Rgrep + \ :Rgrep + anoremenu Tools.Search.Buffer\ List:Bgrep + \ :Bgrep + anoremenu Tools.Search.Argument\ List:GrepArgs + \ :GrepArgs +endif + +" restore 'cpo' +let &cpo = s:cpo_save +unlet s:cpo_save + diff --git a/.vimrc b/.vimrc index 7409a88..34daeb4 100644 --- a/.vimrc +++ b/.vimrc @@ -53,7 +53,11 @@ map ,,# :s/^#//:nohlsearch map ," :s/^/\"/:nohlsearch map ,," :s/^\"//:nohlsearch -"*************** shortcuts ************** +"*************** shortcuts ************** map \b :ConqueTermSplit bash map \B :ConqueTermVSplit bash "command Bash execute ":ConqueTerm bash" + +"*************** grep plugin *************** +:let Grep_Default_Filelist = '*.c *.cpp *.rb *.h' +:let Grep_Skip_Files = '*.svn *~ *.bak'