DEV Community

Sérgio Araújo
Sérgio Araújo

Posted on • Edited on

Avoiding manual copy of infromation with vim

Introduction

For many times we need copy information from and to the system clipboard. For those situations, we can use a simple grep plus (pbcopy | xclip), but if you are with the file already open, or if you are in a system wich does not have GNU utils you can do the task simply using vim

The problem

Let's say you have to copy all lines of code with a specific pattern from all your opened files on vim:

vim * text.txt
Enter fullscreen mode Exit fullscreen mode

With the :args command we can see the list of all opened files we have.

:args
Enter fullscreen mode Exit fullscreen mode

The solution

We are gonna start cleaning the targed register, a kind of many vim "clipboards" that accept appending with a special thecnique.

:let @a=""
Enter fullscreen mode Exit fullscreen mode

With the above command we are making sure the register a is empty

:argdo g/pattern/yank A
Enter fullscreen mode Exit fullscreen mode

The argdo command performs a task over all opened files we have, and the magic happens with the global command. OBS: the use of A allows us to append every line of all files containing the pattern to the register a.

Now let's finish:

:let @+=@a
Enter fullscreen mode Exit fullscreen mode

OBS: If you simply try to use :argdo g/pattern/yank + will not work because the system clipboard does not allow "appending" any content to it.

How would it be like using grep?

grep 'pattern' *.txt | xclip -selection clipboard
Enter fullscreen mode Exit fullscreen mode

Creating aliases in order to make it easier

In my case I use zsh and on my aliases file I have

(( $+commands[xclip] )) && {
    alias pbpaste='xclip -i -selection clipboard -o'
    alias pbcopy='xclip -selection clipboard'
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)