Schowek z terminala

Andrzej Galiński · 2021-05-29

Cel: Jak używać schowka z linii poleceń pod Linuksem?

Motywacja

O ile wklejenie tekstu do terminala nie jest wielkim wyzwaniem, o tyle skopiowanie go może czasem sprawiać problemy.

W MacOS polecenia pbcopy i pbpaste pozwalają na interakcję ze schowkiem systemowym z terminala. Jak robić to pod Linuxem (w X11), gdzie nie ma analogicznych wbudowanych poleceń?

Rozwiązanie

W X11 podstawowym sposobem wymieniania danych między aplikacjami są zaznaczenia (SELECTION). Wg specyfikacji może być ich wiele, w praktyce używane są 2 - PRIMARY, czyli ostatnio zaznaczony tekst i CLIPBOARD, czyli schowek “aplikacyjny”. Każda zmiana zaznaczenia, także przypadkowa, zmienia zawartość schowka PRIMARY. To czasem powoduje błędy i zmusza do ponownego kopiowania; schowek aplikacyjny jest trudniej nadpisać przez pomyłkę.

Zaznaczenie standardowo wkleja się klikając środkowym przyciskiem myszy, a treść schowka aplikacyjnego używając (a) opcji menu, (b) skrótów CTRL+C / CTRL+V (przy wklejaniu do aplikacji okienkowej) albo (c) SHIFT+CTRL+C / SHIFT+CTRL+V (przy wklejaniu do terminala).

Dwa popularne programy do zarządzania schowkem to xsel i xclip, oba można zainistalować APTem.

Jak używać xsel?

  • Możemy podać czy chodzi nam o schowek -p/--primary, -s/secondary czy -b/--clipboard. Domyślnie używany jest PRIMIARY.
  • Możemy podać czy chodzi nam o kopiowanie -i/--input czy o wklejanie -o/--output. Domyślnym trybem jest wklejanie.
$ cat test.txt
ala
ma 
kota
# zaznaczam "ala", wciskam CTRL+SHIFT+C
# zaznaczam "kota"
$ xsel --primary --output
kota
$ xsel --clipboard --output
ala
$ xsel < test.txt
$ xsel
ala
ma 
kota
  • Zaznaczenie “ala” trafiło do schowka aplikacyjnego,
  • zaznaczenie “kota” trafiło do schowka głównego,
  • oczywiście przed zaznaczeniem kota Ala była w obu schowkach.

Jak używać xclip?

  • Tryb: -i/-in (domyślny), -o/-out
  • Wybór schowka -selection, opcje: primary (domyślny), secondary, clipboard
  • Przykład - jak w xsel

Aliasy (dla wygody)

alias pbcopy="xsel --clipboard --input"   
alias pbpaste="xsel --clipboard --output"  
# albo
alias pbcopy="xclip -i -selection clipboard"
alias pbpaste="xclip -o -selection clipboard"

Zastosowania

Można łatwo skopiować zawartość pliku bez otwierania go:

pbcopy < wielka_konfiguracja.yml

Można zapisać skopiowany tekst do pliku albo przekierować do narzędzia shellowego:

pbpaste > produkcyjny_kod_ze_stack_overflow.sh  # :P
pbpaste | jq '.[]' | sort -u

Rozmaitości

  • pbpaste/xsel pozwala wklejać zawartość schowka prawie natychmiast. W VIMie wystarczy wydać polecenie :.!pbpaste; wklejenie za pomocą CTRL+SHIFT+V albo ŚPM jest wyraźnie wolniejsze.
  • schowek można wyczyścić (xsel -c/--clear); domyślnie używany jest PRIMARY, można wskazać inny odpowiednim argumentem.
  • xsel ma ciekawą opcję, tryb -a/--append:
$ echo a | xsel
$ echo b | xsel -a
$ xsel
a
b

Bonus

Jak używać schowka systemowego w VIMie?

  • VIM - schowek: "+y
  • schowek - VIM: "+p

"+ to rejestr specjalny współpracujący ze schowkiem aplikacyjnym; więcej można przeczytać w pomocy - :help registers.

Linki