Fandom

Vim Tips Wiki

Filter buffer on a search result

Redirected from VimTip1557

1,624pages on
this wiki
Add New Page
Talk0 Share

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Tip 1557 Printable Monobook Previous Next

created 2008 · complexity basic · author Niels AdB · version 7.0


You may want to list all lines in the current buffer that match a pattern, for example, list all lines containing "Warning". The following script copies all matching lines to a scratch (temporary) buffer. You can then examine the list, or save it to a file.

Create a file called (for example) filter.vim containing:

" Gather search hits, and display in a new scratch buffer.
function! Gather(pattern)
  if !empty(a:pattern)
    let save_cursor = getpos(".")
    let orig_ft = &ft
    " append search hits to results list
    let results = []
    execute "g/" . a:pattern . "/call add(results, getline('.'))"
    call setpos('.', save_cursor)
    if !empty(results)
      " put list in new scratch buffer
      new
      setlocal buftype=nofile bufhidden=hide noswapfile
      execute "setlocal filetype=".orig_ft
      call append(1, results)
      1d  " delete initial blank line
    endif
  endif
endfunction

" Delete the current buffer if it is a scratch buffer (any changes are lost).
function! CloseScratch()
  if &buftype == "nofile" && &bufhidden == "hide" && !&swapfile
    " this is a scratch buffer
    bdelete
    return 1
  endif
  return 0
endfunction

nnoremap <silent> <Leader>f :call Gather(input("Search for: "))<CR>
nnoremap <silent> <Leader>F :call Gather(@/)<CR>
nnoremap <silent> <Esc> :call CloseScratch()<CR>

In Vim, the command :source filter.vim will execute the script.

Assuming the default leader key (backslash), you can now:

  • Type \f and enter a pattern when prompted.
  • Type \F to filter on the last search pattern.
  • Press Escape to close the scratch buffer listing the search hits.

For example, you could put the cursor on a word and press * to search for the next occurrence of that word. If you now type \F a new window will open with a list of all lines that contain the word you searched for. Press Escape to close the window.

Alternative proceduresEdit

A simple procedure to list all lines matching a pattern is:

" Print all lines that contain "pattern".
:g/pattern/p
" Following is equivalent.
:g/pattern

The following will delete all lines that do not contain a pattern, leaving only the search hits. You could then press u to undo the changes.

:v/pattern/d

See alsoEdit

CommentsEdit

Also on Fandom

Random Wiki