Proposed tip Please edit this page to improve it, or add your comments below (do not use the discussion page).
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 procedures
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
- 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