Como anexar apenas à área de transferência (mas não sobregravar os dados atuais)?

8

Eu tenho um arquivo bastante grande, eu preciso copiar todo o conteúdo em algum lugar, mas quando eu rolar a página para baixo, todos os dados que eu selecionei ficam desmarcados. Eu poderia apenas copiar e colar bloco por bloco, mas eu acharia muito mais fácil, pois há muitos dados, apenas para poder anexar o conteúdo ao final dos dados atuais da área de transferência. Isso é possível?

Isso é para que eu possa ter um atalho de teclado que me permita copiar isso para a área de transferência:

I am some nice new text.

Quando isso é o que já está lá:

I am the old text.

E é assim quando colado:

I am the old text.
I am some nice new text.

Portanto, há três coisas que eu realmente gostaria de ter (eu teria três atalhos de teclado separados para fazer isso):

  1. Anexe os dados ao final da área de transferência e coloque-os em um RETURN antes (como mostrado no exemplo acima).

  2. Anexe os dados ao final da área de transferência, mas faça-os para que não haja RETURN antes, para que eles continuem na mesma linha inicialmente.

  3. Tenha tudo isso, mas para que os dados sejam colocados no início da área de transferência antes de todos os dados que estão no momento.

Estou executando o Ubuntu GNOME 16.04 com o GNOME 3.20.

    
por Great Uncle Bulgaria 10.07.2016 / 22:32

3 respostas

10

É simples, mas você precisa instalar a ferramenta xsel primeiro:

sudo apt-get install xsel

TL; DR: Aqui estão os comandos que você provavelmente deseja usar para seus atalhos no final. Estou usando as versões com printf em todos os lugares para uniformidade e personalização mais fácil, mesmo que uma variante mais simples tenha sido suficiente:

  • Anexar seleção ao final da área de transferência diretamente:

    bash -c 'printf "%b%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c'
    
  • Anexar seleção ao final da área de transferência após uma quebra de linha:

    bash -c 'printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c'
    
  • Anexar seleção ao início da área de transferência diretamente:

    bash -c 'printf "%b%b" "$(xsel)" "$(xsel -b)" | xsel -ib ; xsel -c'
    
  • Anexar seleção ao final da área de transferência após uma quebra de linha:

    bash -c 'printf "%b\n%b" "$(xsel)" "$(xsel -b)" | xsel -ib ; xsel -c'
    

Eles estão todos incluindo a redefinição do buffer principal após anexar à área de transferência para evitar o acréscimo duplo do mesmo conteúdo. Se você não quiser isso, remova o ; xsel -c do final de cada comando.

Longa explicação:

Você precisa saber que X contém 3 buffers, a seleção primária , a seleção secundária e a área de transferência .

Você conhece a área de transferência de Ctrl + C , Ctrl + V etc. É o buffer que você normalmente use para copiar e colar coisas.

A seleção principal é o buffer que sempre contém automaticamente o texto selecionado, não importa em qual janela ele esteja e sem nenhuma interação adicional do usuário. Nós temos apenas um problema: o buffer é atualizado No momento em que você seleciona um trecho de texto, ele não é limpo quando você clica em qualquer outro lugar para cancelar a seleção. Ainda conterá o conteúdo da sua última seleção.

A seleção secundária é usada apenas por alguns programas e não é interessante para nós aqui.

Isso significa que podemos imitar o comportamento de Ctrl + C com este comando abaixo que copia a seleção principal (último texto realçado) para a área de transferência:

xsel | xsel -ib

xsel sem nenhum argumento imprime o conteúdo da seleção principal em STDOUT. xsel -ab escreve ( -i ) os dados de STDIN para a área de transferência ( -b ).

Para anexar diretamente os dados ao conteúdo atual da área de transferência (sem quebra de linha no meio) em vez de substituí-los, usamos a opção -a em vez de -i . Este comando anexará o último trecho de texto selecionado ao conteúdo atual da área de transferência:

xsel | xsel -ab

Se você realmente quiser uma quebra de linha adicional ou qualquer outra formatação, podemos enviar os dados por meio de printf ou qualquer outra ferramenta que você queira usar para processá-la. Aqui está um exemplo que lê a última seleção e o conteúdo atual da área de transferência e os une usando uma nova linha:

printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib

xsel -b retorna o conteúdo atual da área de transferência. A string de formato de printf usa %b como espaço reservado para os argumentos, \n representa uma quebra de linha. Você pode descobrir mais sobre printf digitando man printf .

Ao alternar os dois argumentos no final da string, você pode inverter a ordem deles e anexar ao início, em vez de ao fim.

Se você deseja evitar anexar os mesmos dados à área de transferência duas vezes acidentalmente (você terá que selecioná-la novamente se quiser anexá-la duas vezes!), você pode limpar o buffer de seleção principal manualmente após o comando ter sido executado usando isso:

xsel -c

Basta executar isso depois do comando básico anexado da área de transferência, assim:

printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c
Portanto, sabendo tudo isso, você pode escrever comandos para seus atalhos de teclado que fazem exatamente o que você quer, mas lembre-se que os nossos one-liners fazem uso pesado de recursos Bash como tubulações, então você precisa executá-los com Bash: / p>
bash -c 'COMMAND'

Veja a seção TL; DR na parte superior da resposta de uma lista de comandos adequada para criar atalhos.

    
por Byte Commander 11.07.2016 / 00:05
5

O servidor X possui várias pranchetas. Aquele com Ctrl + C é referido como área de transferência, aquele em que você destaca algo é chamado primário. xclip permite colar a saída de ambos. Por exemplo, copiei parte da sua pergunta, mas destaquei outro texto no terminal:

Você ainda pode usar essa ideia em um script conectado ao atalho do teclado. De fato, escrevi um script, que é publicado como githubist

A ideia básica é vinculá-lo ao atalho de teclado. Destaque o que você deseja acrescentar e pressione o atalho. Por exemplo, eu vinculei o meu a Ctrl + Alt + V . O comando exato é python /path/to/file.py

Exemplo de uso:

  1. Destaque a parte I have a rather large file da sua postagem e copie com Ctrl + C
  2. Realce outra coisa, por exemplo, That is so that I can have a keyboard shortcut
  3. Pressione seu atalho (o meu foi Ctrl + Alt + V )
  4. Solte a área de transferência anexada em algum lugar com Ctrl + V . A saída resultante é: I have a rather large fileThat is so that I can have a keyboard shortcut

Fonte de script

 import gi
    gi.require_version('Notify', '0.7')
    from gi.repository import Notify
    import subprocess
    import os
    import sys

    # This script is meant to be bound to keyboard shortcut

    def send_notification(title, text):
        Notify.init(sys.argv[0])
        n = Notify.Notification.new(title, text)
        n.show()


    def run_cmd(cmdlist):
        # function for running 
        try:
            stdout = subprocess.check_output(cmdlist)
        except subprocess.CalledProcessError:
              send_notification(sys.argv[0],"Clipboard error")
              sys.exit(1)
        else:
            if stdout:
                return  stdout



    # get contents of both clipboards
    clip = run_cmd("xclip -o -sel clip".split())
    primary = run_cmd("xclip -o -sel primary".split())

    # write to temp file contents
    # of both clipboards appended
    temp_file = "/tmp/append.clip"
    f = open(temp_file, "w")
    f.write( clip + primary  )
    f.close()

    # Read the new contents into clipboard
    run_cmd(("xclip -sel clip " + temp_file).split())

    # clean up
    os.remove(temp_file)

Notas:

    
por Sergiy Kolodyazhnyy 13.07.2016 / 00:14
2

Aqui está outro método muito fácil que usa um script curto de Bash. Primeiro, verifique se você tem o xclip instalado. Em seguida, crie seu script bash da seguinte forma:

#!bin/bash
p=$(xclip -selection primary -o)
c=$(xclip -selection clipboard -o)
new=$'\n'
echo "$c$new$p" | xclip -selection clip

Vamos nomear este arquivo como apndpc.sh e colocá-lo em alguma pasta, digamos ~ / myscripts Agora, vincule uma chave definida pelo usuário a isso. Faça isso por configurações do sistema & gt; & gt; Teclado e clique na guia Atalhos. Clique em atalhos personalizados e, em seguida, clique no sinal + para adicionar a combinação de teclas desejada. Na caixa de comando, coloque:

bash -c 'bash ~ / myscripts / apndclp.sh'

Em seguida, defina sua combinação de teclas. Eu uso ALT + 3 para acionar a ação.

É isso. Você está pronto para a sua operação de cópia em larga escala. Use o Ctrl + c normal (ou clique direito e selecione copiar) para copiar o primeiro bloco de texto. Selecione o próximo pedaço (selecione somente NÃO copiar) e pressione a tecla de atalho (ATL + 3). Isto irá acrescentar o texto selecionado à área de transferência. Continue fazendo isso até terminar. Em seguida, cole como de costume, ou seja. CTRL + v (ou righclick e select paste) para copiar o texto final acumulado.

Se você não gosta de manipulação de string no script acima, use este script:

#!bin/bash
# this is another version of clipboard append tool
# here we use a temporary file to append highlighted text to the clipboard
# the temporary file is deleted at the end of the operation

tmpfile="file111000111"
xclip -selection clipboard -o  > $tmpfile   # first dump the current clipboard to the tmpfile
printf '\n' >> $tmpfile                     # then add new line
xclip -selection primary -o >> $tmpfile     # and finally add the highlighted text
cat $tmpfile | xclip -selection clip        # now read the file back into the clipboard
rm $tmpfile             # and remove the tempfile
    
por elmclose 22.10.2016 / 11:28