Filter buffer on a search result
Talk0this wiki
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
\fand enter a pattern when prompted. - Type
\Fto 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 procedures
Edit
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 also
Edit
- Folding with Regular Expression to fold away lines without a search pattern rather than modifying it or using a scratch buffer
- Search for lines not containing pattern for some simple techniques to display lines of interest
- Copy the search results into clipboard to copy matching patterns (not lines)
- Redirect g search output uses
:redirwithg//pfor a limited one-line version of this tip - List lines with current search pattern highlighted defines command
PPto highlight matches displayed with:g//PP