Accès au presse-papiers en ligne de commande

10

Je crée un outil en ligne de commande afin de rendre certaines de mes tâches plus efficaces. Je dois pouvoir écrire du contenu dans le presse-papiers, mais pour une raison quelconque, cela ne fonctionne pas pour moi.

J'ai essayé d'installer les deux xclipet xsel, mais les deux ont le même comportement: ils peuvent bien lire / écrire dans le presse-papiers, mais je ne peux pas y accéder depuis l'interface graphique principale d'Ubuntu.

Je l'ai aussi essayé dans le terminal ...

echo "hello" | xclip

Ensuite, si Ctrl+ Shift+ V, j'obtiens mon entrée de presse-papiers d'origine, pas "bonjour". Mais, si j'essaye de saisir le contenu xclip, cela fonctionne très bien.

L'objectif principal est d'obtenir le contenu collable dans Firefox ou tout autre programme basé sur une interface graphique que j'utilise.

Adrian Schneider
la source

Réponses:

16

Eh bien, il y a quelques presse-papiers différents dans X :) Celui qui xclipcopie le texte par défaut est "tampon de sélection" - généralement vous sélectionnez simplement du texte avec votre souris et vous pouvez ensuite le coller avec le bouton central de la souris. Ce tampon est distinct de celui à partir duquel vous pouvez coller avec Ctrl-Shift-V.

Essayer

echo "hello" | xclip -selection clipboard

regarde aussi

man xclip

pour plus de détails sur xclip

Sergey
la source
2
FYI, peut également être raccourci xclip -sel clip. personnellement, je l'utilise tout le temps
Sergiy Kolodyazhnyy
Dieu pourquoi est-ce si déroutant, pourquoi n'y avait-il pas assez de presse-papiers, voirman 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
Il semble que l'action fréquente consiste à "sélectionner du texte avec votre souris". Est-il possible de faire la même action avec le clavier?
nilon
3

Pour me faciliter la tâche, j'ai créé un alias pour xclipimiter les fonctionnalités de pbcopyet pbpastedans Mac OS X.

sudo apt-get install xclip -y

Modifiez ensuite votre ~/.bashrcpour ajouter des alias:

nano ~/.bashrc

Ajoutez ces nouvelles lignes (vous pouvez les mettre à la fin du fichier):

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

Enregistrez et quittez, puis ouvrez un nouveau shell ou exécutez source ~/.bashrcpour utiliser les alias.

Mon article de blog contient plus de détails.

Gary Woodfine
la source
2

J'avais l'habitude d'utiliser les utilitaires wxcopy et wxpaste de windowmaker, mais les versions récentes de Linux (ou les versions X) semblent les avoir cassées - je soupçonne que la sécurité a été renforcée et qu'elles n'ont pas été mises à jour pour correspondre. Par exemple, vous pourriez faire des choses comme:

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

pour obtenir la sortie FRED. (C'est un exemple artificiel, car vous obtiendriez la même chose sans le wxpaste final, mais je pense que cela donne la saveur de ce que vous pouvez réaliser.)

Cependant, vous pouvez obtenir le même effet en utilisant le package "xcb", qui est incroyablement léger et fournit également un affichage visuel minuscule (résumé) de 8 presse-papiers.

J'ai écrit une paire de scripts shell wcopy / wpaste il y a des années, pour rendre wxcopy / wxpaste un peu plus agréable à mon goût. Je les ai mis à jour ce soir pour fonctionner avec wxcopy / wxpaste ou xcb. Cela les rend un peu plus complexes qu'ils ne devraient l'être, mais je vais les coller ici - j'espère qu'ils ne sont pas trop longs pour ce forum.

Voici 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

Et voici 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

Si quelqu'un est intéressé, j'ai également écrit des pages de manuel pour les scripts - mais vous pouvez probablement les trouver (elles sont toujours valides) en recherchant sur wcopy.1x et wpaste.1x

LukeJKendall
la source
Vous pouvez modifier votre réponse pour ajouter des hyperliens aux pages de manuel. (Vous devriez pouvoir ajouter jusqu'à 2 liens, même si vous êtes un nouvel utilisateur de l'UA.)
Eliah Kagan