On 07/06/2010 4:43 PM, Shagen Ogandzhanjan wrote:
Hi, I have a question I've tried to answer myself - but I guess this time there is more sense to ask the respectable vim community: as vim documentation told me, [I "Display all lines that contain the keyword under the cursor." My question is - is there's any way to navigate
through generated list same way as we navigating through quickfix window?

I mean, I can type :N to jump to the Nth line or M[^I то jump to the Mth occurence - but i just want to jump from first occurence to the second one, etc.

thanks in advance
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Not that I am aware of.

You can do something like this though:

function! FindHiLite(prev_winnr, regex) range
  let akeep = @a
  let @a    = ""
  let ft    = &ft
  " Escape special characters in the regex
  let regex = substitute(
              \     substitute(
              \         escape(a:regex, '\\/.*$^~[]'),
              \         "\n$",
              \         "", ""
              \     ),
              \     "\n", '\\_[[:return:]]', "g"
              \ )
  " Do not escape the special characters
  let regex = a:regex
  " Add line numbers followed by a tab for each
  " line found
  exe a:firstline.','.a:lastline."g/".
              \ (&ignorecase==1?'\c':'\C').
              \ regex.'/' .
              \ ':let @a = @a . line(".") . "\t" . getline(".") . "\n"'
  topleft split
  enew!
  put a
  norm! 1G2dd
  exe "set hls nomod ft=".ft
  let @a= akeep

  " Wipes out the buffer
  nnoremap <buffer> q :bw!<CR>
  " Takes you back to the previous buffer and goes to the line specified at
  " the start of the match
  let prev_win_cmd=':'.(a:prev_winnr+1).'wincmd w'
exec 'nnoremap <buffer> <enter> :let cmd='."'".prev_win_cmd.' <Bar> :'."'.matchstr(getline('.'), '^\\d\\+')".' <Bar> exec cmd'.' <Bar> exec "normal zO"<CR>'
endfunction

command! -range=% -nargs=1 FindHiLite <line1>,<line2>call FindHiLite(winnr(), <q-args>)

Then map [I and ]I to use this function instead passing in the current word as an argument.
This mapping does it:
nmap ]I :exec 'FindHiLite '.expand('<cword>')<CR>

Then you can do anything you like. It is a buffer though, so you will have to close it.

Notice the last nnoremap at the end of the function. That is so you can hit <enter> on any line to take you back to the original file current line.

HTH,
Dave


--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Reply via email to