3 Stimmen

pbcopy -Zwischenablage innerhalb von Screen kann nicht verwendet werden

Problem Nicht gelöst, obwohl eine Antwort akzeptiert wurde: Wir arbeiten daran, Jonahs Code zum Laufen zu bringen.

Problem: den Code von (1) in (2) zu ändern

Ich kenne die Gewinde . Ich möchte den folgenden Code in Screen ausführen können

Code (1)

cat ~/.vimrc | pbcopy                   (1)

Code (2)

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

Mein Versuch, das Problem zu lösen: um den folgenden Code in .zshrc einzufügen

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

Ich bekomme

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

Wie kann man pbcopy innerhalb von Screen verwenden?

6voto

Chas. Owens Punkte 62716

Na gut, das ist eine verrückte Antwort, aber es ist auch eine verrückte Frage, also passen sie wenigstens zusammen. Sie können eine benannte Pipe erstellen mit mkfifo und dann eine Endlosschleife einrichten, die Dateien aus der benannten Pipe liest und sie an pbcopy (oder xsel , xclip , usw.).

1. In einem Terminal, das sich NICHT in einer Bildschirmsitzung befindet (führen Sie dies nur einmal aus):

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

Sie können dies in ein Shell-Skript umwandeln, wie z.B. (dies sollte wahrscheinlich robuster sein)

#!/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

die Sie benennen können pbcopy_server.sh , ausführbar machen ( chmod a+x pbcopy_server.sh ) und irgendwo in Ihren Pfad einfügen, damit Sie sagen können nohup pbcopy_server.sh & wenn Sie Ihr Gerät zum ersten Mal starten.

2. In jedem anderen Terminal (auch in Bildschirmsitzungen) können Sie jetzt Dateien katalogisieren (oder die Ausgabe von Programmen nach /tmp/pbcopy.pipe umleiten, und der Text erscheint in der Zwischenablage.

cat file > /tmp/pbcopy.pipe

df -h > /tmp/pbcopy.pipe

3. Damit es so aussieht, als würden Sie den echten pbcopy Sie können etwas verwenden, um die Katalysatorfunktion zu übernehmen /tmp/pbcopy.pipe für Sie.

3a. Verwenden Sie eine zsh Funktion:

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

3b. Oder erstellen Sie ein Perl-Skript namens pbcopy und legen Sie es in ein Verzeichnis weiter oben in Ihrem PATH als /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 <>;

0 Stimmen

Wie sollte Ihr erster Befehl verwendet werden? Können Sie ein Beispiel nennen?

0 Stimmen

Ich habe den Code von Terminal A in eine Bildschirmsitzung eingegeben. Ich gebe den Code von Terminal B in eine andere Screen-Sitzung ein. Habe ich den Anfang Ihrer Lösung richtig gemacht?

1 Stimmen

Verbraucht die "while true"-Schleife nicht eine Menge Ressourcen?

1voto

Jonah Braun Punkte 3957

Es gibt eine viel einfachere Lösung, nämlich die Verwendung von osascript, wie sie unter http://www.samsarin.com/blog/2008/10/18/copying-gnu-screen-buffer-to-leopard-clipboard/

In den Kommentaren bietet Andrew Wason diese Lösung zum Kopieren des Bildschirmpuffers an:

Code in Ihrer .screenrc

# binds C-a b to copy the contents of your last screen copy to the MacOSX pasteboard
bind b eval "writebuf /tmp/screen-pbcopy" "exec /usr/bin/osascript -e 'tell application \"System Events\"' -e 'set the clipboard to (read posix file \"/tmp/screen-pbcopy\" as text)' -e 'end tell'"

Ebenfalls unter Verwendung von osascript ist hier ein Bash-Skript, das das Verhalten von pbcopy innerhalb von screen emuliert. Verbesserungen an diesem Skript sind willkommen:

Speichern Sie diesen Code als Bash-Skript irgendwo in Ihrem Pfad, zum Beispiel: ~/bin/pbcopyScreen.bash

#!/bin/bash

# saves all standard input to a file
cat > /tmp/screen_pbcopy_kludge_buffer

# uses osascript to set the MacOSX pastebaord to the contents of the file
/usr/bin/osascript -e 'tell application "System Events"' -e 'set the clipboard to (read posix file "/tmp/screen_pbcopy_kludge_buffer" as text)' -e 'end tell'

rm /tmp/screen_pbcopy_kludge_buffer

0 Stimmen

Es fällt mir schwer, den letzten Punkt ohne ein Beispiel zu verstehen. @Wie soll ich es nennen? @Wo soll ich ihn unterbringen? Es würde Sinn machen, wenn der erste Code den letzten in deiner Nachricht aufruft. @Wo ruft der erste Code den letzten Code auf?

0 Stimmen

Ja, das zweite Skript ist nur ein einfaches Bash-Skript, das Sie dort ablegen sollten, wo Sie Ihre persönlichen Skripte aufbewahren. Der .screenrc-Eintrag verwendet writebuf, um den Inhalt des Kopierpuffers zu speichern. Das zweite Bash-Skript akzeptiert Standardeingaben (wie das ursprüngliche pbcopy), daher würde es keinen Sinn machen, das erste Skript das zweite aufrufen zu lassen.

0 Stimmen

Ich habe den Code nicht zum Laufen gebracht. Ich habe den folgenden Code in meiner .screenrc % bind b eval "writebuf" "exec /Users/Masi/bin/pbcopyScreen.bash -c 'pbcopy < /tmp/screen-exchange'" % auch versucht. Bitte fügen Sie einige konkrete Beispiele für Ihr pbcopy in Screen ein.

0voto

yves Baumes Punkte 8506

Sie können eine ältere Version des Macport-Bildschirms installieren, die dieses Problem zu lösen scheint, wie in den Kommentaren zu diesem Artikel angegeben:
Link zum letzten Kommentar, in dem erklärt wird, wie es geht

Ich habe es selbst ausprobiert und der Bildschirm funktioniert jetzt sehr gut mit pbcopy :-)

Überprüfen Sie diesen Schritt:

  1. Installieren Sie Macport mit Hilfe seiner DMG-Datei. DMG des Leoparden

  2. Starten Sie eine neues Terminal et
    $ sudo vi /opt/local/etc/macports/sources.conf
    schließlich bleiben diese 2 Zeilen nur noch in der sources.conf, nicht mehr:

    Datei:///Benutzer/xxxxx/ports
    rsync://rsync.macports.org/release/ports/ [Standard]

  3. $ cd $ mkdir -p ports/sysutils/ (erstellen Sie kein "screen"-Verzeichnis, svn macht das)

  4. $ cd ports/sysutils/ $ svn co -r 45745 http://svn.macports.org/repository/macports/trunk/dports/sysutils/screen

  5. Einmal auschecken:

    $ cd $HOME/ports
    $ portindex
    Software-Index in /Users/keugaerg/ports erstellen Hinzufügen des Ports sysutils/screen

    Total number of ports parsed:   1 
    Ports successfully parsed:  1    
    Ports failed:           0
  6. $ sudo port install screen (kann eine Weile dauern, da der Bildschirm heruntergeladen und aufgebaut werden muss)

Dann ist es fertig, Sie müssen nur noch /opt/local/bin/screen starten.

0 Stimmen

Ich habe alles getan, was Sie mir geraten haben. Allerdings erhalte ich die folgende Fehlermeldung dpaste.com/44754 . Ich habe offenbar den Bildschirm in meinem MacBook, der mit Leopard ausgeliefert wurde. Meine Screen-Version ist 4.00.03.

0 Stimmen

Das stimmt, screen -v liefert mir die gleiche Version sowohl für den vorinstallierten Leopard-Bildschirm als auch für den von macoports. Aber soweit ich verstanden habe, modifizieren die Leute bei Macports jeden Quellcode des Linux-Projekts, bevor sie ihn in das svn stellen.

0 Stimmen

Was Ihren Fehler betrifft, so habe ich die Fehlermeldung nur gegoogelt und das gefunden: trac.macports.org/ticket/18136 Schauen Sie nach, die Person, die das Ticket erstellt hat, sagt, dass ihr Problem auf diese Weise gelöst wurde: "Problem gelöst: Ich habe auf die neueste Version von Apples Entwicklertools aktualisiert." Haben Sie die neueste Version?

0voto

bulljit Punkte 31

Dies scheint in der Snow Leopard-Version von GNU Screen behoben zu sein, obwohl sie die gleiche Versionsnummer 4.00.03 (FAU) 23-Oct-06 behält.

Alternativ können Sie auch auf die Screen-Version 4.01 aktualisieren:

git clone git://git.savannah.gnu.org/screen.git

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X