We have been working on a quick grep integration for Vim, and it's looking decent enough for a quick plugin. There's one more easy thing we can improve, though: let's make it psychic! So far we had to tell grep what to look for, either by selecting the text in visual mode or by actually typing the search terms. Typing! That's so old fashioned. Let's make grep guess what to look for.
In vim you have a psychic function, expand(""). If you call expand(""), it will return whatever word is under the cursor. No need to visually select it. If you're still using the same vimrc definitions, you can do something like
nmap s :call FG95DoSearch(expand(""))
Let's clean things up a little bit:
" Wrap a grep command: search for needle, show results in a new window
function! FG_DoSearch(needle)
let grepbin = 'grep -nri '
tabnew
setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
let cmd = grepbin . ' "' . a:needle . '" *'
echom cmd
execute '$read !' . cmd
setlocal nomodifiable
endfunction
" Wrap a normal action: ask the user for input, then call func with it
function! FG_RequestInputAction(msg, func)
let needle = input(a:msg)
if strlen(needle) > 0
execute 'call' a:func .'("'. needle . '")'
endif
endfunction
" Wrap a visual action: call func with whatever is selected under the cursor
function! FG_VAction(func)
" Copy whatever is selected in visual mode
try
silent! let a_save = @a
silent! normal! gv"ay
silent! let needle = @a
finally
silent! let @a = a_save
endtry
" Remove whitespaces
let needle = substitute(needle, "92n92+","","g")
let needle = substitute(needle, "92r92+","","g")
let needle = substitute(needle, "^92s92+92|92s92+$","","g")
if strlen(needle) > 0
execute 'call' a:func .'("'. needle . '")'
endif
endfunction
" Wrap a normal action: call func with whatever is under the cursor
function! FG_NAction(func)
let needle = expand("")
if strlen(needle) > 0
execute 'call' a:func .'("'. needle . '")'
endif
endfunction
nmap s :call FG_NAction("FG_DoSearchText")
vmap s :call FG_VAction("FG_DoSearchText")
map S :call FG_RequestInputAction("Text search: ", "FG_DoSearchText")
Just copy paste that in your vimrc, now you can grep your project in three different ways: press s (,s) to look for the word currently under the cursor, S to type in a search term or select something in visual mode, then S to grep it.