Partager le presse-papiers entre bash et X11

11

Dans ce fil, la réponse du haut montre comment copier du texte qui a été précédemment sélectionné avec la souris sur un terminal gnome, dans le presse-papiers de X11.

Ma question est la suivante: disons que je copie un morceau de texte à partir du terminal à l'aide de bash set-mark et copiez les raccourcis clavier (c'est-à-dire set-mark+ M-w). Est-il possible de partager ce presse-papiers avec X11?

EDIT : Dans la question d'origine, j'ai parlé de partager le presse-papiers avec GNOME, mais comme Gilles le souligne ci-dessous, GNOME n'a pas spécifiquement de presse-papiers (c'est général pour X), j'ai donc mis à jour la question.

Amelio Vazquez-Reina
la source
Dans gnome-terminal, vous pouvez également taper Ctrl + Maj + C et Ctrl + Maj + V pour copier et coller dans le presse-papiers du système.
Lie Ryan
2
Voir cet article stackoverflow.com/questions/994563/… Mais cela ne fonctionne pas pour moi.
super q

Réponses:

9

Le presse-papiers de Bash est interne à bash, bash ne se connecte pas au serveur X.

Vous pouvez modifier la signification de M-wpour copier la sélection dans le presse-papiers X¹ en plus du presse-papiers interne de bash. Cependant, l'intégration de bash est assez lâche, et je ne pense pas qu'il existe un moyen d'accéder aux informations de la région ou au presse-papiers à partir du code bash. Vous pouvez créer un raccourci clavier pour copier la ligne entière dans le presse-papiers 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

Si vous voulez faire des choses fantaisistes dans le shell, passez à zsh, qui (entre autres avantages) a une bien meilleure intégration entre l'éditeur de ligne et le langage 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

¹ Gnome n'a pas spécifiquement de presse-papiers, c'est général pour X.
² Depuis bash 4.1, il y a un bug dans le code d'analyse des clés: les séquences de touches liées avec bind -xne peuvent pas dépasser deux caractères. Je pense que bash 4.2 corrige certains cas de préfixes plus longs mais pas tous; Je n'ai pas recherché les détails.

Gilles 'SO- arrête d'être méchant'
la source
Merci pour l'idée @Gilles! Je pense qu'il est temps pour moi d'apprendre et de passer à zsh.
Amelio Vazquez-Reina
Finalement! Merci beaucoup! C'est copy_line_to_x_clipboardexactement ce qui me manquait depuis très longtemps: l'équivalent copie de shift + insert. J'ai changé en ctrl-x ( bind -x '"\C-x") parce que Escc'est trop loin à mon goût (et Cc serait le choix le plus stupide possible).
pbarill
Les terminaux ont normalement une méta-clé, qui est liée à la touche alt par défaut. Taper un caractère tout en le maintenant enfoncé est traduit escpar suivi de ce caractère, vous pouvez donc le taper comme alt-w.
DoMiNeLa10
7

@Gilles a déjà donné une excellente réponse. Je voudrais juste mentionner l'existence de xclip, qui est également un moyen très utile de copier la sortie du terminal dans le presse-papiers X, en y insérant simplement quoi que ce soit:

$ cat /etc/passwd | xclip
ℝaphink
la source
1
Juste une note qui xclipcopie par défaut dans le tampon principal. Pour utiliser le presse-papiers, utilisez xclip -selection clipboard.
Sparhawk