Wikia

Vim Tips Wiki

Changes: Filter buffer on a search result

Edit

Back to page

m (See also: update link for moved tip)
(Change <tt> to <code>, perhaps also minor tweak.)
Line 3: Line 3:
 
|previous=1556
 
|previous=1556
 
|next=1558
 
|next=1558
|created=April 22, 2008
+
|created=2008
 
|complexity=basic
 
|complexity=basic
 
|author=Niels AdB
 
|author=Niels AdB
Line 51: Line 51:
 
</pre>
 
</pre>
   
In Vim, the command <tt>:source filter.vim</tt> will execute the script.
+
In Vim, the command <code>:source filter.vim</code> will execute the script.
   
 
Assuming the default leader key (backslash), you can now:
 
Assuming the default leader key (backslash), you can now:
*Type <tt>\f</tt> and enter a pattern when prompted.
+
*Type <code>\f</code> and enter a pattern when prompted.
*Type <tt>\F</tt> to filter on the last search pattern.
+
*Type <code>\F</code> to filter on the last search pattern.
 
*Press Escape to close the scratch buffer listing the search hits.
 
*Press Escape to close the scratch buffer listing the search hits.
   
For example, you could put the cursor on a word and press <tt>*</tt> to search for the next occurrence of that word. If you now type <tt>\F</tt> a new window will open with a list of all lines that contain the word you searched for. Press Escape to close the window.
+
For example, you could put the cursor on a word and press <code>*</code> to search for the next occurrence of that word. If you now type <code>\F</code> 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==
 
==Alternative procedures==
Line 69: Line 69:
 
</pre>
 
</pre>
   
The following will delete all lines that do not contain a pattern, leaving only the search hits. You could then press <tt>u</tt> to undo the changes.
+
The following will delete all lines that do not contain a pattern, leaving only the search hits. You could then press <code>u</code> to undo the changes.
 
<pre>
 
<pre>
 
:v/pattern/d
 
:v/pattern/d
Line 78: Line 78:
 
*[[Search for lines not containing pattern]] for some simple techniques to display lines of interest
 
*[[Search for lines not containing pattern]] for some simple techniques to display lines of interest
 
*[[VimTip478|Copy the search results into clipboard]] to copy matching patterns (not lines)
 
*[[VimTip478|Copy the search results into clipboard]] to copy matching patterns (not lines)
*[[VimTip1063|Redirect g search output]] uses <tt>:redir</tt> with <tt>g//p</tt> for a limited one-line version of this tip
+
*[[VimTip1063|Redirect g search output]] uses <code>:redir</code> with <code>g//p</code> for a limited one-line version of this tip
*[[VimTip1141|List lines with current search pattern highlighted]] defines command <tt>PP</tt> to highlight matches displayed with <tt>:g//PP</tt>
+
*[[VimTip1141|List lines with current search pattern highlighted]] defines command <code>PP</code> to highlight matches displayed with <code>:g//PP</code>
   
 
==Comments==
 
==Comments==

Revision as of 06:32, July 13, 2012

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 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

Comments

Around Wikia's network

Random Wiki