Loading ...
Sorry, an error occurred while loading the content.

Re: Copying matched parts of lines

Expand Messages
  • Tim Chase
    ... (you can change the joining string from to n if you want each match on its own line in the gathered results) This will accumulate the matches in
    Message 1 of 4 , Mar 26, 2013
    • 0 Attachment
      On 2013-03-26 16:43, BPJ wrote:
      > Is it somehow possible with :g// to copy only the
      > matched parts of lines as with the -o option of grep?

      Not elegantly, but it can be done:

      :let @a=''|g/pattern/let @a=@a." ".matchstr(getline('.'), @/)

      (you can change the joining string from " " to "\n" if you want each
      match on its own line in the gathered results)

      This will accumulate the matches in register "a" for your pasting
      pleasure.

      It will only do the first match, as you'd have to better define the
      behavior you want if there are multiple matches on the same line.

      -tim


      --
      --
      You received this message from the "vim_use" maillist.
      Do not top-post! Type your reply below the text you are replying to.
      For more information, visit http://www.vim.org/maillist.php

      ---
      You received this message because you are subscribed to the Google Groups "vim_use" group.
      To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@....
      For more options, visit https://groups.google.com/groups/opt_out.
    • Tim Chase
      ... I believe Christian s comment about the recent enough Vim involves the /n flag actually executing the replacement if it s a sub-replace-special (earlier
      Message 2 of 4 , Mar 26, 2013
      • 0 Attachment
        On 2013-03-26 16:56, Christian Brabandt wrote:
        > On Tue, March 26, 2013 16:43, BPJ wrote:
        > > Is it somehow possible with :g// to copy only the
        > > matched parts of lines as with the -o option of grep?
        > >
        > > /bpj
        >
        > With a recent enough Vim, you can make use of :s command and
        > execute VimL on the replacement part while not modifying the match
        > (by using the 'n' flag):
        >
        >
        > fu! CopyMatches(match)
        > if !exists("g:a")
        > let g:a = []
        > endif
        > call add(g:a, a:match)
        > endfu
        >
        > :%s/foobar/\=CopyMatches(submatch(0))/gn
        > :new +put\ =g:a

        I believe Christian's comment about the "recent enough Vim" involves
        the /n flag actually executing the replacement if it's a
        sub-replace-special (earlier versions didn't, IIRC). If that's the
        case, the function can be modified to simply return the match:

        fu! CopyMatches(match)
        if !exists("g:a")
        let g:a=[]
        endif
        call add(g:a, a:match)
        return a:match
        endfu
        :%s/pattern/\=CopyMatches(submatch(0))/g

        It may have the unfortunate side-effect of setting 'modified' when all
        the modifications were NOOPs, but you can either simply undo the
        non-modification, or you can force the setting of 'nomodified'.

        -tim



        --
        --
        You received this message from the "vim_use" maillist.
        Do not top-post! Type your reply below the text you are replying to.
        For more information, visit http://www.vim.org/maillist.php

        ---
        You received this message because you are subscribed to the Google Groups "vim_use" group.
        To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@....
        For more options, visit https://groups.google.com/groups/opt_out.
      Your message has been successfully submitted and would be delivered to recipients shortly.