Dostęp do schowka z wiersza poleceń

10

Buduję narzędzie wiersza poleceń, aby usprawnić niektóre z moich zadań. Muszę być w stanie pisać zawartość do schowka, ale z jakiegoś powodu to nie działa dla mnie.

Próbowałem instalacji zarówno xclipa xsel, ale oba mają ten sam problem: mogą odczytu / zapisu do schowka grzywny, ale nie można uzyskać do niego dostęp z głównego Ubuntu GUI.

Próbowałem też w terminalu ...

echo "hello" | xclip

Następnie, jeśli Ctrl+ Shift+ V, otrzymuję mój oryginalny wpis do schowka, a nie „witaj”. Ale jeśli spróbuję pobrać zawartość xclip, działa dobrze.

Głównym celem jest przeniesienie treści do przeglądarki Firefox lub dowolnego innego programu opartego na graficznym interfejsie użytkownika.

Adrian Schneider
źródło

Odpowiedzi:

16

Cóż, w X jest kilka różnych schowków :) xclipDomyślnie kopiuje się tekst do „bufora wyboru” - zwykle wystarczy zaznaczyć tekst za pomocą myszy, a następnie wkleić go środkowym przyciskiem myszy. Ten bufor jest oddzielny od bufora, z którego można wkleić Ctrl-Shift-V.

Próbować

echo "hello" | xclip -selection clipboard

Zobacz także

man xclip

po więcej szczegółów na temat xclip

Siergiej
źródło
2
Do Twojej wiadomości można również skrócić xclip -sel clip. ja osobiście używam tego cały czas
Sergiy Kolodyazhnyy
Boże, dlaczego to jest takie mylące, dlaczego nie wystarczył jeden schowek, patrzman 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
Wydaje się, że częstym działaniem jest „zaznaczanie tekstu za pomocą myszy”. Czy możliwe jest wykonanie tej samej akcji za pomocą klawiatury?
nilon
3

Aby ułatwić sobie stworzyłem alias xclip, aby naśladować funkcjonalność pbcopya i pbpasteMac OS X.

sudo apt-get install xclip -y

Następnie edytuj, ~/.bashrcaby dodać aliasy:

nano ~/.bashrc

Dodaj te nowe wiersze (możesz umieścić je na końcu pliku):

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

Zapisz i wyjdź, a następnie otwórz nową powłokę lub uruchom, source ~/.bashrcaby użyć aliasów.

Mój post na blogu zawiera dalsze szczegóły.

Gary Woodfine
źródło
2

Kiedyś używałem narzędzi wxcopy i wxpaste z Windowmakera, ale ostatnie wersje Linuksa (lub wersje X) wydają się je zepsuć - podejrzewam, że zabezpieczenia zostały zaostrzone i nie zostały zaktualizowane, aby pasowały. Np. Możesz robić rzeczy takie jak:

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

aby uzyskać wyjściowy FRED. (To wymyślony przykład, ponieważ uzyskałbyś to samo bez końcowej pasty wx, ale myślę, że daje to smak tego, co możesz osiągnąć.)

Jednak ten sam efekt można osiągnąć za pomocą pakietu „xcb”, który jest niewiarygodnie lekki i zapewnia również niewielki (podsumowany) obraz 8 schowków.

Kilka lat temu napisałem parę skryptów powłoki wcopy / wpaste, aby wxcopy / wxpaste było nieco przyjemniejsze dla mojego smaku. Zaktualizowałem je dzisiaj do pracy z wxcopy / wxpaste lub xcb. To sprawia, że ​​są nieco bardziej skomplikowani, niż muszą, ale wkleję je tutaj - mam nadzieję, że nie będą zbyt długo na tym forum.

Oto 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

A oto 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

Jeśli ktoś jest zainteresowany, napisałem również strony podręcznika dla skryptów - ale prawdopodobnie można je znaleźć (nadal są ważne), przeglądając wcopy.1x i wpaste.1x

LukeJKendall
źródło
Możesz edytować swoją odpowiedź, aby dodać hiperłącza do stron podręcznika. (Powinieneś być w stanie dodać do 2 linków, nawet jeśli jesteś nowym użytkownikiem AU.)
Eliah Kagan