We've recently seen a very basic function to integrate grep to vim. We can improve it a little bit with very simple changes. Using this tip to have different key binding for different modes we can do something a bit smarter . Let's create two functions, one for normal mode that should prompt the user what to search for, and another function to automagically pick whatever is selected:
function! FG_DoSearch(needle)
let grepbin = 'grep -nri '
tabnew
setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
let cmd = grepbin . ' "' . a:needle . '" *'
execute '$read !' . cmd
setlocal nomodifiable
endfunction
function! FG_Search()
let needle = input("Search for: ")
call FG_DoSearch(needle)
endfunction
function! FG_Visual_Search()
" 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
call FG_DoSearch(needle)
endfunction
nmap s :call FG_Search()
vmap s :call FG_Visual_Search()
The magic here happens in the mapping: nmap will create a mapping that's only enabled when on "normal" mode, vmap when you're in visual mode. As usual, check :help map for more details.