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 jestPRIMIARY
. - 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
- Część specyfikacji X11, “Inter-Client Communication Conventions Manual” - Peer-to-Peer Communication by Means of Selections
- https://www.jwz.org/doc/x-cut-and-paste.html
- https://github.com/kfish/xsel
- https://github.com/astrand/xclip/