Acesso à área de transferência da linha de comando

10

Estou criando uma ferramenta de linha de comando para tornar algumas das minhas tarefas mais eficientes. Eu preciso ser capaz de escrever conteúdo na área de transferência, mas por algum motivo não está funcionando para mim.

Eu tentei instalar os dois xclipe xsel, mas ambos têm o mesmo comportamento: eles podem ler / gravar na área de transferência, mas não consigo acessá-la na GUI principal do Ubuntu.

Eu também tentei no terminal ...

echo "hello" | xclip

Então, se Ctrl+ Shift+ V, recebo minha entrada original da área de transferência, não "olá". Mas, se eu tentar pegar o conteúdo xclip, ele funciona bem.

O objetivo principal é colocar o conteúdo colável no Firefox ou em qualquer outro programa baseado em GUI que estou usando.

Adrian Schneider
fonte

Respostas:

16

Bem, existem algumas pranchetas diferentes no X :) A única que xclipcopia o texto por padrão é "buffer de seleção" - normalmente você apenas seleciona algum texto com o mouse e pode colá-lo com o botão do meio do mouse. Esse buffer é separado daquele em que você pode colar com Ctrl-Shift-V.

Tentar

echo "hello" | xclip -selection clipboard

Veja também

man xclip

para mais detalhes sobre o xclip

Sergey
fonte
2
Para sua informação, também pode ser reduzido para xclip -sel clip. eu pessoalmente uso isso o tempo todo
Sergiy Kolodyazhnyy 31/12/16
Deus, por isso é tão confuso, porque não foi uma prancheta suficiente, vejaman 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 a ação frequente é "selecionar algum texto com o mouse". É possível a mesma ação com o teclado?
nilon 7/01
3

Para facilitar, criei um alias para xclip, a fim de imitar a funcionalidade do pbcopye pbpasteno Mac OS X.

sudo apt-get install xclip -y

Em seguida, edite seu ~/.bashrcpara adicionar aliases:

nano ~/.bashrc

Adicione essas novas linhas (você pode colocá-las no final do arquivo):

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

Salve e saia e abra um novo shell ou execute source ~/.bashrcpara usar os aliases.

Minha postagem no blog contém mais detalhes.

Gary Woodfine
fonte
2

Eu costumava usar os utilitários wxcopy e wxpaste do windowmaker, mas versões recentes do Linux (ou versões X) parecem ter quebrado - suspeito que a segurança foi reforçada e não foram atualizadas para corresponder. Por exemplo, você poderia fazer coisas como:

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

para obter a saída FRED. (É um exemplo artificial, já que você obteria a mesma coisa sem o wxpaste final, mas acho que dá o sabor do que você pode conseguir.)

No entanto, você pode obter o mesmo efeito usando o pacote "xcb", que é incrivelmente leve e também fornece uma pequena exibição (resumida) visual de 8 pranchetas.

Eu escrevi um par de scripts de shell wcopy / wpaste anos atrás, para tornar o wxcopy / wxpaste um pouco mais agradável ao meu gosto. Atualizei-os hoje à noite para trabalhar com wxcopy / wxpaste ou xcb. Isso os torna um pouco mais complexos do que precisam, mas vou colá-los aqui - espero que não demorem muito para este fórum.

Aqui está o 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

E aqui está o 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

Se alguém estiver interessado, também escrevi páginas de manual para os scripts - mas você provavelmente pode encontrá-las (elas ainda são válidas) pesquisando no wcopy.1xe no wpaste.1x

LukeJKendall
fonte
Você pode editar sua resposta para adicionar hiperlinks às páginas de manual. (Você deve ser capaz de adicionar até 2 links, mesmo que você seja um novo usuário UA.)
Elias Kagan