macosgnu-screenpbcopy

Unable to have pbcopy -clipboard inside Screen


Problem Not solved although one answer was accepted: We are working to get Jonah's code to work.

Problem: to change the code of (1) to (2)

I know the thread. I want to be able to run the following code inside Screen

Code (1)

cat ~/.vimrc | pbcopy                   (1)

Code (2)

cat ~/.vimrc > /tmp/pbcopy.pipe         (2)

My attempt to solve the problem: to put the following code to .zshrc

function pbcopy() { "(cat \"$1\")"  > /tmp/pbcopy.pipe } 

I get

cat masi | pbcopy          
pbcopy: command not found: (cat "")
cat: masi: No such file or directory

How can you use pbcopy inside Screen?


Solution

  • Alright, this is a screwy answer, but it is also a screwy question, so at least they match. You can create a named pipe with mkfifo, and then setup an infinite loop that reads files from the named pipe and pipes them to pbcopy (or xsel, xclip, etc.).

    1. In a terminal which is NOT in a screen session (run this only once):

    /usr/bin/mkfifo /tmp/pbcopy.pipe
    while true; do /bin/cat /tmp/pbcopy.pipe | /usr/bin/pbcopy; done
    

    You may want to turn this into a shell script like (this probably should be more robust)

    #!/bin/bash
    
    if [[ -e /tmp/pbcopy.pipe ]]; then
        echo "it looks like I am already running"
        echo "remove /tmp/pbcopy.pipe if you are certain I am not"
        exit 1
    fi
    
    while true; do
        /bin/cat /tmp/pbcopy.pipe | /usr/bin/pbcopy
    done
    

    which you can name pbcopy_server.sh, make executable (chmod a+x pbcopy_server.sh) and put somewhere in your path, so you can say nohup pbcopy_server.sh & when you first start your machine.

    2. In any other terminal (including those in screen sessions) you can now cat files (or redirect output of programs into /tmp/pbcopy.pipe and the text will appear in the clipboard.

    cat file > /tmp/pbcopy.pipe
    
    df -h > /tmp/pbcopy.pipe
    

    3. To make it look like you are calling the real pbcopy you can use something to do the cat'ing to /tmp/pbcopy.pipe for you.

    3a. Use a zsh function:

    function pbcopy() { cat > /tmp/pbcopy.pipe }
    

    3b. Or create a Perl script named pbcopy and put it in a directory earlier in your PATH than /usr/bin:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    open my $out, ">", "/tmp/pbcopy.pipe"
       or die "could not open pipe to pbcopy: $!\n";
    
    print $out $_ while <>;