Línea de comando de acceso al portapapeles

10

Estoy construyendo una herramienta de línea de comando para hacer que algunas de mis tareas sean más eficientes. Necesito poder escribir contenido en el portapapeles, pero por alguna razón no me funciona.

He intentado instalar ambos xclipy xsel, pero ambos tienen el mismo comportamiento: pueden leer / escribir bien en el portapapeles, pero no puedo acceder a él desde la GUI principal de Ubuntu.

También lo probé en la terminal ...

echo "hello" | xclip

Entonces, si Ctrl+ Shift+ V, obtengo mi entrada original del portapapeles, no "hola". Pero, si trato de obtener el contenido xclip, funciona bien.

El objetivo principal es conseguir que el contenido se pueda pegar en Firefox o cualquier otro programa basado en GUI que esté usando.

Adrian Schneider
fuente

Respuestas:

16

Bueno, hay algunos portapapeles diferentes en X :) El que xclipcopia el texto de forma predeterminada es "buffer de selección"; por lo general, solo selecciona algo de texto con el mouse y luego puede pegarlo con el botón central del mouse. Este búfer es independiente del que puede pegar con Ctrl-Shift-V.

Tratar

echo "hello" | xclip -selection clipboard

ver también

man xclip

para más detalles sobre xclip

Sergey
fuente
2
FYI, también se puede acortar a xclip -sel clip. Yo personalmente uso eso todo el tiempo
Sergiy Kolodyazhnyy
Dios ¿por qué es esto tan confuso, por qué no fue lo suficientemente portapapeles, verman 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
Parece que la acción frecuente es "seleccionar texto con el mouse". ¿Es posible hacer la misma acción con el teclado?
nilon
3

Para que sea más fácil para mí, creé un alias para xclipimitar la funcionalidad de pbcopyy pbpasteen Mac OS X.

sudo apt-get install xclip -y

Luego edite su ~/.bashrcpara agregar alias:

nano ~/.bashrc

Agregue estas nuevas líneas (puede ponerlas al final del archivo):

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

Guarde y salga, luego abra un nuevo shell o ejecute source ~/.bashrcpara usar los alias.

Mi publicación de blog contiene más detalles.

Gary Woodfine
fuente
2

Solía ​​usar las utilidades wxcopy y wxpaste de windowmaker, pero las versiones recientes de Linux (o versiones X) parecen haberlas roto. Sospecho que la seguridad se ha reforzado y no se han actualizado para que coincidan. Por ejemplo, podrías hacer cosas como:

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

para obtener la salida FRED. (Es un ejemplo artificial, ya que obtendrías lo mismo sin el wxpaste final, pero creo que da el sabor de lo que puedes lograr).

Sin embargo, puede lograr el mismo efecto utilizando el paquete "xcb", que es increíblemente liviano y también proporciona una pequeña pantalla visual (resumida) de 8 portapapeles.

Escribí un par de scripts de shell wcopy / wpaste hace años, para que wxcopy / wxpaste sea un poco más agradable para mi gusto. Los actualicé esta noche para trabajar con wxcopy / wxpaste o xcb. Eso los hace un poco más complejos de lo que necesitan ser, pero los pegaré aquí, espero que no sean demasiado largos para este foro.

Aquí está la copia:

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

Y aquí está la pasta:

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

Si alguien está interesado, también escribí páginas de manual para los guiones, pero probablemente pueda encontrarlos (todavía son válidos) buscando en Google wcopy.1xy wpaste.1x

LukeJKendall
fuente
Puede editar su respuesta para agregar hipervínculos a las páginas de manual. (Debería poder agregar hasta 2 enlaces, aunque sea un nuevo usuario de AU).
Eliah Kagan