Compartilhe a área de transferência entre o bash e o X11

11

Em esta discussão as principais respostas mostra como copiar o texto que foi previamente selecionado com o mouse em um gnome-terminal, para a área de transferência no X11.

Minha pergunta é: Digamos que eu copie um pedaço de texto do terminal usando a marca de ajuste do bash e copie os atalhos do teclado (ou seja, set-mark+ M-w). É possível compartilhar esta área de transferência com o X11?

EDIT : Na pergunta original, eu falei sobre o compartilhamento da área de transferência com o GNOME, mas como Gilles aponta abaixo, o GNOME não possui especificamente uma área de transferência (é geral para o X), então atualizei a questão.

Amelio Vazquez-Reina
fonte
No gnome-terminal, você também pode digitar Ctrl + Shift + C e Ctrl + Shift + V para copiar e colar na área de transferência do sistema.
Lie Ryan
2
Veja este post stackoverflow.com/questions/994563/… Mas não está funcionando para mim.
ótimo q

Respostas:

9

A área de transferência do Bash é interna ao bash, o bash não se conecta ao servidor X.

O que você pode fazer é alterar o significado de M-wcopiar a seleção para a área de transferência do X¹, além da área de transferência interna do bash. No entanto, a integração do bash é bastante flexível, e não acho que haja uma maneira de acessar as informações da região ou a área de transferência a partir do código do bash. Você pode fazer uma ligação de tecla para copiar toda a linha na área de transferência do X.²

if [[ -n $DISPLAY ]]; then
  copy_line_to_x_clipboard () {
    printf %s "$READLINE_LINE" | xsel -ib
  }
  bind -x '"\eW": copy_line_to_x_clipboard'
fi

Se você quiser fazer coisas sofisticadas no shell, mude para zsh, que (entre outras vantagens) tem uma integração muito melhor entre o editor de linha e a linguagem de script.

if [[ -n $DISPLAY ]]; then
  x-copy-region-as-kill () {
    zle copy-region-as-kill
    print -rn -- "$CUTBUFFER" | xsel -ib
  }
  x-kill-region () {
    zle kill-region
    print -rn -- "$CUTBUFFER" | xsel -ib
  }
  zle -N x-copy-region-as-kill
  zle -N x-kill-region
  bindkey '\C-w' x-kill-region
  bindkey '\ew' x-copy-region-as-kill
fi

¹ O Gnome não possui especificamente uma área de transferência, isso é geral para o X.
² A partir do bash 4.1, há um erro no código de análise de chave: as seqüências de teclas vinculadas a bind -xpodem não ter mais de dois caracteres. Eu acho que o bash 4.2 corrige alguns casos de prefixos mais longos, mas nem todos; Eu não pesquisei os detalhes.

Gilles 'SO- parar de ser mau'
fonte
Obrigado pela ideia @Gilles! Acho que é hora de aprender e mudar zsh.
Amelio Vazquez-Reina
Finalmente! Muitíssimo obrigado! Isso copy_line_to_x_clipboardé exatamente o que eu estava perdendo há muito tempo: a cópia equivalente a shift + insert. Mudei para ctrl-x ( bind -x '"\C-x") porque Escé muito longe do meu gosto (e Cc seria a escolha mais burra possível).
Pbarill
Os terminais normalmente possuem uma meta-chave, que é vinculada à tecla alt por padrão. Digitar um caractere enquanto o mantém pressionado é traduzido para escseguido por esse caractere, para que você possa digitá-lo como alt-w.
DoMiNeLa10
7

@Gilles já deu uma excelente resposta. Gostaria apenas de mencionar a existência de xclip, que também é uma maneira muito útil de copiar a saída do terminal para a área de transferência do X, apenas canalizando qualquer coisa para ela:

$ cat /etc/passwd | xclip
ℝaphink
fonte
1
Apenas uma nota que xclipcopia no buffer primário por padrão. Para usar a área de transferência, use xclip -selection clipboard.
Sparhawk 30/05