2

I am trying to "extract" my search results into a new buffer, but only the matches - not the whole lines.

For example I am trying to get a list of HTML color codes used in a file. I can identify them (in this case) with a search for "#.*?", which produces:

enter image description here

However, now I want all those matches copied into a new buffer to work on. I just can't seem to figure out how to do this?

Drew
  • 75,699
  • 9
  • 109
  • 225
MT.
  • 145
  • 5
  • What are you going to do with them after you edit them? Will you be returning the modified codes to the original file? – Tyler Jun 28 '21 at 18:18
  • No - importing them into a reference document for a style guide. – MT. Jun 28 '21 at 19:27
  • In other words, I don’t need to “return” them. I’m just trying to get a list of them easily. I can actually do this very easily in Sublime - but I’d like to understand the emacs or evil way to do it (if there is one). – MT. Jun 28 '21 at 19:28

1 Answers1

4

C-u M-x occur \"\(#[^\"]+\)\" <RETURN> \1

(this strips the quotes)

or

C-u M-x occur "#.+\" <RETURN>

(this keeps the quotes)

occur finds all lines that match the provided regexp. Calling it with the prefix argument (C-u) returns only the matched text, not the complete lines. Using the capture group (\(...\)) lets you select the group, while ignoring the enclosing quotes. If you don't care about including the quotes, you can drop the capture group.

For example:

(let (
      (base00 "#081724")
      (base01 "#033340")
      (base02 "#1d5483")
      (base03 "#2872b2")
      (base04 "#d3f9ee")
      (base05 "#a6f3dd")
      (base06 "#effffe")
      (base07 "#fffed9")
      (red "#ff694d")
      (orange "#f5b55f")
      (yellow "#fffe4e")
      (magenta "#afc0fd")
      (violet "#96a5d9")
      (blue "#bad6e2")
      (cyan "#d2f1ff")
      (green "#68f6cb")
      (twsblue "#0000ff"))

Calling occur as above produces:

#081724
#033340
#1d5483
#2872b2
#d3f9ee
#a6f3dd
#effffe
#fffed9
#ff694d
#f5b55f
#fffe4e
#afc0fd
#96a5d9
#bad6e2
#d2f1ff
#68f6cb
#0000ff
#002b36
Tyler
  • 21,719
  • 1
  • 52
  • 92
  • 1
    Thanks, this answered my question. I'm only 5 days into emacs, so I had never even heard of the prefix argument - thanks for that. For any that follow, I often want to do this immediately after doing a / search. I wrapped a function to make this work using the last thing you searched for (note, I'm using evil, so you might need to tweak the reference to the search pattern if not): https://gist.github.com/mtwomey/629bb4b2163450117b7a4c8fdcc8eb4a – MT. Jun 29 '21 at 01:36