Befehlszeilen-Zwischenablage-Zugriff

10

Ich erstelle ein Befehlszeilentool, um einige meiner Aufgaben effizienter zu gestalten. Ich muss in der Lage sein, Inhalte in die Zwischenablage zu schreiben, aber aus irgendeinem Grund funktioniert es bei mir nicht.

Ich habe versucht , sowohl die Installation xclipund xsel, aber beide haben das gleiche Verhalten: Sie können lesen / schreiben in die Zwischenablage in Ordnung, aber ich kann es nicht von der Haupt Ubuntu GUI zugreifen.

Ich habe es auch im Terminal versucht ...

echo "hello" | xclip

Wenn dann Ctrl+ Shift+ V, bekomme ich meinen ursprünglichen Eintrag in der Zwischenablage, nicht "Hallo". Aber wenn ich versuche, den Inhalt abzurufen xclip, funktioniert es einwandfrei.

Das Hauptziel ist es, den Inhalt in Firefox oder andere von mir verwendete GUI-basierte Programme einzufügen.

Adrian Schneider
quelle

Antworten:

16

Nun, es gibt ein paar verschiedene Zwischenablagen in X :) Diejenige, in die xclipText standardmäßig kopiert wird, ist "Auswahlpuffer" - normalerweise wählen Sie einfach Text mit der Maus aus und können ihn dann mit der mittleren Maustaste einfügen. Dieser Puffer ist von dem Puffer getrennt, aus dem Sie mit Strg-Umschalt-V einfügen können.

Versuchen

echo "hello" | xclip -selection clipboard

siehe auch

man xclip

Weitere Details zu xclip

Sergey
quelle
2
FYI, kann auch auf verkürzt werden xclip -sel clip. Ich persönlich benutze das die ganze Zeit
Sergiy Kolodyazhnyy
Gott, warum ist das so verwirrend, warum war nicht eine Zwischenablage genug, sieheman xclip -selection specify which X selection to use, options are "primary" to use XA_PRIMARY (default), "secondary" for XA_SECONDARY or "clipboard" for XA_CLIPBOARD
mxmlnkn
Es scheint, dass die häufige Aktion darin besteht, "Text mit der Maus auszuwählen". Ist es möglich, die gleiche Aktion mit der Tastatur durchzuführen?
Nilon
3

Um es mir einfacher zu machen, habe ich einen Alias ​​für erstellt xclip, um die Funktionalität von pbcopyund pbpastein Mac OS X nachzuahmen.

sudo apt-get install xclip -y

Bearbeiten Sie dann Ihre ~/.bashrc, um Aliase hinzuzufügen:

nano ~/.bashrc

Fügen Sie diese neuen Zeilen hinzu (Sie können sie am Ende der Datei einfügen):

alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'

Speichern und beenden, dann eine neue Shell öffnen oder ausführen source ~/.bashrc, um die Aliase zu verwenden.

Mein Blogbeitrag enthält weitere Details.

Gary Woodfine
quelle
2

Früher habe ich die Dienstprogramme wxcopy und wxpaste von windowmaker verwendet, aber die neuesten Linux-Versionen (oder X-Versionen) scheinen sie beschädigt zu haben. Ich vermute, die Sicherheit wurde verschärft und sie wurden nicht entsprechend aktualisiert. ZB könnten Sie Dinge tun wie:

echo fred | wxcopy | tr "a-z" "A-Z" | wxpaste

um die Ausgabe FRED zu erhalten. (Es ist ein erfundenes Beispiel, da Sie ohne die endgültige wxpaste dasselbe erhalten würden, aber ich denke, es gibt den Geschmack dessen, was Sie erreichen können.)

Sie können den gleichen Effekt jedoch mit dem "xcb" -Paket erzielen, das unglaublich leicht ist und außerdem eine winzige (zusammengefasste) visuelle Anzeige von 8 Zwischenablagen bietet.

Ich habe vor Jahren ein paar Shell-Skripte wcopy / wpaste geschrieben, um wxcopy / wxpaste ein bisschen angenehmer für meinen Geschmack zu machen. Ich habe sie heute Abend aktualisiert, um entweder mit wxcopy / wxpaste oder xcb zu arbeiten. Das macht sie etwas komplexer als nötig, aber ich werde sie hier einfügen - hoffentlich sind sie nicht zu lang für dieses Forum.

Hier ist wcopy:

#!/bin/sh
#
# Provide some enhancements to the wxcopy command, which copies standard input
# to an X11 clipboard text buffer.
#
# Allow copying from stdin to any of the cutbuffers.  Note that they are
# indexed counting from 0.
#
# Author: Luke Kendall
#

if [ `uname -s` = "Darwin" ]
then
    WXCOPY=pbcopy
    WXPASTE=pbpaste
else
    WXCOPY=wxcopy
    WXPASTE=wxpaste
    BUFSPEC="-cutbuffer"
    xcb -p 0 > /tmp/wc$$
    if echo "fred$$" | wxcopy -cutbuffer 0 && [ `wxpaste` = "fred$$" ]
    then
        : # Great, they're actually working.  Not common on modern Linuxes.
        echo "working" > $HOME/.wcopyok
    else
        rm -f $HOME/.wcopyok
        WXCOPY="xcb -s"
        WXPASTE="xcb -p"
        BUFSPEC=
    fi
    xcb -s 0 < /tmp/wc$$
fi

unset WXARGS
if [ $# = 0 ]
then
    $WXCOPY ${WXCOPY_DEFS:-0}
else
    MYNAME=`basename $0`
    USAGE="usage: $MYNAME [ [0-9]... ] [$WXCOPY's args]"
    numlist=true
    for n
    do
        if $numlist && expr "x$n" : 'x[0-9][0-9]*$' > /dev/null
        then
            NUMARGS="$NUMARGS $n"
        else
            numlist=false
            if [ "x$n" = "x-h" ]
            then
                echo "$USAGE" >&2
                exit 0
            else
                WXARGS="$WXARGS $n"
            fi
        fi
    done
    set - $NUMARGS
    $WXCOPY $WXCOPY_DEFS $WXARGS $BUFSPEC $1
    ORIG="$1"
    shift
    for n
    do
        $WXPASTE $BUFSPEC $ORIG | $WXCOPY $WXCOPY_DEFS $WXARGS $BUFSPEC $n
    done
fi

Und hier ist wpaste:

#!/bin/sh
#
# Provide some enhancements to the wxpaste command, which pastes from X11
# clipboard text buffers to standard output.
#
# Allow pasting to stdout from any of the cutbuffers.  Note that they are
# indexed counting from 0.
#
# Author: Luke Kendall
#

if [ `uname -s` = "Darwin" ]
then
    WXCOPY=pbcopy
    WXPASTE=pbpaste
else
    WXCOPY=wxcopy
    WXPASTE=wxpaste
    BUFSPEC="-cutbuffer"
    if [ -s $HOME/.wcopyok ]
    then
        : # Great, they're actually working.  Not common on modern Linuxes.
    else
        WXCOPY="xcb -s"
        WXPASTE="xcb -p"
        BUFSPEC=
    fi
fi

if [ $# = 0 ]
then
    $WXPASTE ${WXPASTE_DEFS:-0}
else
    MYNAME=`basename $0`
    USAGE="usage: $MYNAME [ [0-9]... ] [$WXPASTE's args]"
    for n
    do
        if expr "x$n" : 'x[0-9][0-9]*$' > /dev/null
        then
            NUMARGS="$NUMARGS $n"
        elif [ "x$n" = "x-h" ]
        then
            echo "$USAGE" >&2
            exit 0
        else
            WXARGS="$WXARGS $n"
        fi
    done
    set - $NUMARGS
    : echo "Num args: $#"
    for n
    do
        : echo "Doing: $WXPASTE $WXPASTE_DEFS $WXARGS $BUFSPEC $n"
        $WXPASTE $WXPASTE_DEFS $WXARGS $BUFSPEC $n
    done
fi

Wenn jemand interessiert ist, habe ich auch Manpages für die Skripte geschrieben - aber Sie können sie wahrscheinlich finden (sie sind noch gültig), indem Sie wcopy.1x und wpaste.1x googeln

LukeJKendall
quelle
Sie können Ihre Antwort bearbeiten, um den Manpages Hyperlinks hinzuzufügen. (Sie sollten in der Lage sein, bis zu 2 Links hinzuzufügen, obwohl Sie ein neuer AU-Benutzer sind.)
Eliah Kagan