A cópia do tmux xclip não está mais funcionando


8

Nas configurações do mui 12.04, meus comandos de copiar e colar da área de transferência do tmux são os seguintes:

set -g prefix M-a
unbind C-b
bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"
bind C-v run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"

Isso funcionou muito bem por um longo período, até um mês ou mais atrás, quando suspeito que alguma alteração na configuração ou no pacote foi quebrada. No terminal GNOME, colar ainda funciona bem com prefix+ ctrl-ve ctrl-shift-v.

No entanto, o xclipcomando copy não funciona mais, não importa o que eu faça, e tentei remover a ligação do prefixo personalizado acima, usando, em -selectvez de -selnão usar clipboardetc. Isso é praticamente uma rolha de exibição para um usuário do GVim como eu, já que eu não ' até tem a solução alternativa para o terminal GNOME, ctrl-shift-ccom o tmux assumindo o comando. Entro no modo de cópia, seleciono texto com space+ movemente quando executo prefix+ ctrl-cabsolutamente nada acontece. Antes disso, o tmux exibia uma mensagem de confirmação na seção de notificação na parte inferior.

Alguém tem sugestões na medida em que alguém pode depurar isso? Este é um grande sucesso na produtividade. Provavelmente, posso usar o truque de solução temporária de arquivo por enquanto , mas seria ótimo saber exatamente o que aconteceu xclip.


O xclip está realmente disponível? Qual é a saída de type xclip?
28413 Chris Down

A saída é: "xclip é / usr / bin / xclip". Como mencionei, colar através do xclip funciona muito bem por qualquer motivo.
Alexandr Kurilin

1
Você tem o mesmo problema xsel -b?
Gilles 'SO- stop be evil'

@ Gilles, xsel -i -bparece fazer o truque!
Alexandr Kurilin

Heh. Não tenho idéia do por que funciona, pensei xsel -be xclip -selection clipboardfaria a mesma coisa!
Gilles 'SO- stop be evil'

Respostas:


9

O xselutilitário é semelhante xclip, mas implementado de maneira um pouco diferente. Normalmente, eu esperaria que eles se comportassem da mesma maneira, mas eles não fazem exatamente a mesma chamada da biblioteca X, por isso é possível que em alguns casos de canto xselfuncione, mas não xclip, ou vice-versa. Tentar:

bind C-c run "tmux save-buffer - | xsel -ib"
bind C-v run "tmux set-buffer \"$(xsel -ob)\"; tmux paste-buffer"

O mesmo resultado - não funciona para mim - funciona como um comando independente, mas retorna uma string vazia dessa ligação; Ubuntu 14.04, xsel 1.2.0, tmux 1.8-5
Vitaly Zdanevich

6

Adicionar -bao run-shell(ou run) comando corrigiu o problema. Com -bo comando shell é executado em segundo plano.

bind C-c run-shell -b "tmux save-buffer - | xclip -i -sel clipboard"


2

Embora eu não possa mais reproduzi-lo, mas aqui está a resposta técnica que pode ter acontecido no seu caso.

Primeiro, você precisa entender como a área de transferência do X11 funciona. Você pode ler o ensaio de jwz sobre isso: http://www.jwz.org/doc/x-cut-and-paste.html

Em resumo, o aplicativo que contém o conteúdo da área de transferência precisa ser executado até que outro aplicativo confirme a propriedade. Portanto, quando você executa xclip -i <<< test, pode ver o xclip sendo executado em segundo plano até fazer outra seleção:

$ xclip -i <<< test
$ ps
  PID TTY          TIME CMD
10166 pts/8    00:00:00 xclip
10171 pts/8    00:00:00 ps
19345 pts/8    00:00:00 bash

Agora está tudo bem, mas quando você sai desse shell, todos os processos pertencentes a esta sessão são eliminados por padrão, enviando-lhes um sinal HUP. Isso significa que o xclip será eliminado e você não poderá mais acessar o conteúdo da área de transferência.

Portanto, a solução alternativa sugerida (caso você não tenha o xsel) é ignorar o sinal HUP usando a seguinte ligação:

bind C-c run "tmux save-buffer - | nohup >/dev/null 2>/dev/null xclip -i -sel clipboard"

xselnão é afetado por esse problema porque a primeira coisa que faz após o fork () é desassociar-se do terminal de controle para que ele não receba o sinal HUP quando o shell sair (você nem o verá no ps acima saída, mas somente quando você faz a ps -e | grep xsel).


1

Estou com um problema semelhante e o arquivo temporário não vai ajudar nesse caso em particular, receio. Isso ocorre porque xclipparece se comportar de maneira diferente quando gerada pelo tmux do que quando é executada "interativamente" e aguarda que outro aplicativo tome posse da área de transferência. Tente usar xclip -l 1para fazê-lo sair imediatamente (consulte a página de manual para obter detalhes).


Parece que não dá para esse trabalho funcionar. É assim que essa ligação deve ser: bind Cc execute "tmux save-buffer - | xclip -l 1 -i -sel clipboard"?
Alexandr Kurilin

Você poderia postar a solução alternativa que funcionou para você? Isso seria muito útil também!
Alexandr Kurilin

Estou usando bind C-y run-shell "tmux save-buffer - | xclip -l 1 -i".
Peterph 28/05

Sim, ainda nada infelizmente. O Tmux não relata nada, nem o xclip.
Alexandr Kurilin

Para mim, também não está relatando nada, mas funciona. Verifique o que xclipestá fazendo quando você tenta copiar o buffer. Se ele permanece ali esperando por algo, matá-lo ajuda? Além disso, você deve sair do modo de seleção pressionando Enter (e, portanto, armazenando-o no buffer) antes de tentar copiar o buffer na área de transferência do X.
Peterph

1

Esta é uma pergunta antiga, mas suspeito que tenho a solução, retirada da página Tmux do wiki do Arch :

O xclip também pode ser usado para esse fim, ao contrário do xsel, ele funciona melhor na impressão de fluxo de bits bruto que não se encaixa no local atual. No entanto, é melhor usar o xsel em vez do xclip, porque o xclip não fecha o STDOUT após a leitura do buffer do tmux. Como tal, o tmux não sabe que a tarefa de cópia foi concluída e continua aguardando o término do xclip, tornando o tmux sem resposta. Uma solução alternativa é redirecionar o STDOUT do xclip para / dev / null

Portanto, seu comando deve se tornar:

bind C-c run "tmux save-buffer - | xclip -i -sel clipboard >/dev/null"

0

Esta é uma configuração de trabalho que eu uso:

# Yank to copy text with y.
bind-key -t vi-copy y copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Update default binding of `Enter` to also copy with this method.
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# Bind ']' to paste.
bind ] run "tmux set-buffer \"$(xclip -o -sel clipboard)\" && tmux paste-buffer"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# http://askubuntu.com/a/507215/413683
set -g set-clipboard off
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.