Wikia

Vim Tips Wiki

Easy "Search Only In a Visually Selected Range"

Talk0
1,599pages on
this wiki
Revision as of 08:21, July 14, 2012 by JohnBot (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Recently created tip

We have not yet decided whether to keep this tip as its own page or merge it somewhere else. If you have a suggestion on the tip content, please edit this page or add your comments below (do not use the discussion page).

Please discuss whether to keep this as a new tip, or whether to merge it into an existing tip, on the new tips discussion page.
created January 17, 2012 · complexity basic · author Dinshaw H Dastoor · version 6.0

Very often, we want to search for a symbol (say a local variable) only in a specified range of lines that are visually selected for example a function or in general any visual region so as to confine our search.

Contents

Already existsEdit

A tip of this nature already exists: Search only over a visual range.

This tip is slightly different than the above because, here you visually select a range of lines, then press Esc and run a shortcut to search.

How to installEdit

Please source the following lines into your .vimrc file:

let g:sbr = 1
let g:sbc = 1
let g:ser = line("G")
let g:sec = col("G")
let g:searchstr = "searchfirst"
let g:sdir = "f"

function GetBlockInput()
  let g:searchstr = input('find what?:')
  let g:sbr = line("'<")
  let g:sbc = col("'<")
  let g:ser = line("'>")
  let g:sec = col("'>")
endfunction

function FindFirstRegion()
  call GetBlockInput()
  call FindNextRegion()
endfunction

function FindFirstRegionBack()
  call GetBlockInput()
  call FindNextRegionBack()
endfunction

function FindNextRegionWork()
  let l:fout = 0
  let l:fin = 0
  let l:crw = line(".")
  let l:ccl = col(".")
  let l:frw = -1
  let l:fcl = -1
  if g:sdir == "f"
    let l:flags = "w"
  else
    let l:flags = "wb"
  endif
  call search(g:searchstr, l:flags)
  let l:srw = line(".")
  let l:scl = col(".")
  while l:srw != 0 && (l:srw != l:frw || l:scl != l:fcl)
    if (l:srw == g:sbr && l:scl >= g:sbc) || (l:srw == g:ser && l:scl <= g:sec) || (l:srw > g:sbr && l:srw < g:ser)
      let l:fin = 1
      break
    else
      if l:fout == 0
        let l:fout = 1
        let l:frw = l:srw
        let l:fcl = l:scl
      endif
    endif
    call search(g:searchstr, l:flags)
    let l:srw = line(".")
    let l:scl = col(".")
  endwhile
  if l:fout == 1 && l:fin == 0
    execute "normal " . l:crw . "G"
    execute "normal " . l:ccl . "|"
  endif
endfunction

function FindNextRegion()
  let g:sdir = "f"
  call FindNextRegionWork()
endfunction

function FindNextRegionBack()
  let g:sdir = "b"
  call FindNextRegionWork()
endfunction

nnoremap <Leader>/ :call FindFirstRegion()<CR>
nnoremap <Leader>? :call FindFirstRegionBack()<CR>
nnoremap <Leader>n :call FindNextRegion()<CR>
nnoremap <Leader>p :call FindNextRegionBack()<CR>

Sample usageEdit

After visually selecting a range, press <Esc> and then press:

  • <Leader>/ to search forward for a string
  • <Leader>? to search backward for a string
  • <Leader>n for the next occurence
  • <Leader>p for the previous occurence of the search

where the Leader key by default is backslash.

AdvantagesEdit

  • Remembers the visually slected region so can do a <Leader>n or <Leader>p again at any time in normal mode.
  • Keeps your regular "/" search different from the visually selected one, so can mix your n/p and <Leader>n and <Leader>p shortcuts.

DisadvantageEdit

If you want normal searches ("/") and visually selected searches to use the same key ('/', 'n', 'p'), then you will not be able to use this script.

CommentsEdit

Advertisement | Your ad here

Photos

Add a Photo
103photos on this wiki
See all photos >

Recent Wiki Activity

See more >

Around Wikia's network

Random Wiki