Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I yank all matching lines into one buffer?

Tags:

vim

How do you yank all matching lines into a buffer?

Given a file like:

match 1 skip skip match 2 match 3 skip 

I want to be able issue a command to yank all lines that match a pattern (/^match/ for this example) into a single buffer so that I can put it into another doc, or into a summary or whatever.

The command should wind up with this in a buffer:

match 1 match 2 match 3 

My first thought was to try:

:g/^match/y 

But I just get the last match. This makes sense, because the :g command is effectively repeating the y for each matching line.

Perhaps there is a way to append a yank to buffer, rather than overwriting it. I couldn't find it.

like image 813
daotoad Avatar asked Sep 25 '09 01:09

daotoad


1 Answers

:g/^match/yank A

This runs the global command to yank any line that matches ^match and put it in register a. Because a is uppercase, instead of just setting the register to the value, it will append to it. Since the global command run the command against all matching lines, as a result you will get all lines appended to each other.

What this means is that you probably want to reset the register to an empty string before starting: :let @a="" or qaq (i.e., recording an empty macro).

And naturally, you can use the same with any named register.


  • :help registers
  • :help quote_alpha
  • :help global
  • Using Vi/Vim: Ex and Ex-like Commands
like image 109
rampion Avatar answered Sep 24 '22 01:09

rampion