Ideas from my Development Setup: Clipboard
This commit is contained in:
parent
f8d4a30083
commit
d7955b29ae
|
@ -0,0 +1,88 @@
|
||||||
|
+++
|
||||||
|
title = "Ideas from my Development Setup: Clipboard"
|
||||||
|
date = "2020-10-07"
|
||||||
|
author = "Ceda EI"
|
||||||
|
tags = ["xorg", "linux", "development"]
|
||||||
|
keywords = ["xorg", "linux", "development"]
|
||||||
|
description = "Things with clipboards: Implicit copying and swapping"
|
||||||
|
showFullContent = false
|
||||||
|
+++
|
||||||
|
|
||||||
|
|
||||||
|
## Ideas
|
||||||
|
|
||||||
|
The clipboard is a basic yet integral part of every environment. Over time, I
|
||||||
|
have had quite a few ideas regarding clipboards. I have implemented the
|
||||||
|
following ideas currently:
|
||||||
|
|
||||||
|
### Clipboard Swap
|
||||||
|
|
||||||
|
Inspired by vim's registers, I thought about implementing something similar on
|
||||||
|
a system level for Xorg. My current implementation basically swaps the contents
|
||||||
|
of the clipboard with another clipboard. Currently, the workflow looks
|
||||||
|
something like this.
|
||||||
|
|
||||||
|
- Copy text `abc`: Writes `abc` to the main clipboard.
|
||||||
|
- Press ``` Ctrl+` ```: Swaps content of hidden clipboard with main clipboard.
|
||||||
|
- Copy text `def`: Writes `def` to the main clipboard.
|
||||||
|
- Paste with `Ctrl+v`: Pastes text `def` as expected.
|
||||||
|
- Press ``` Ctrl+` ```: Swaps content of hidden clipboard with main clipboard.
|
||||||
|
- Paste: Pastes text `abc`.
|
||||||
|
|
||||||
|
### Implicit Copying
|
||||||
|
|
||||||
|
Some time ago, a realization hit me that I practically always select text for
|
||||||
|
the sake of copying or cutting it. Cutting is just copying and then deleting
|
||||||
|
that text. So everytime I select text, it is for copying it. Due to this, I
|
||||||
|
implemented implicit copying where text is copied just by selecting it. So,
|
||||||
|
the workflow for copying is reduced from select, ctrl+c, paste to select, paste
|
||||||
|
while the workflow for cutting is same.
|
||||||
|
|
||||||
|
## Clipboards in Xorg
|
||||||
|
|
||||||
|
In Xorg, clipboards are called selections. Xorg has three selections:
|
||||||
|
Primary, Secondary and Clipboard.
|
||||||
|
|
||||||
|
- Primary: Whenever text is selected, it is copied into primary selection. You
|
||||||
|
can paste contents of the primary selection by pressing middle mouse button
|
||||||
|
in most applications.
|
||||||
|
- Secondary: There is no consensus on what this is supposed to be used for and
|
||||||
|
hence it is used by practically nothing.
|
||||||
|
- Clipboard: This is the selection that practically every application interacts
|
||||||
|
with. Ctrl-C and Ctrl-V are commonly bound to writing to this clipboard.
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
Secondary selection is the perfect selection to swap the contents of Clipboard
|
||||||
|
selection with. It is practically never used so nothing will overwrite the
|
||||||
|
contents of secondary selection.
|
||||||
|
|
||||||
|
Here is the `clip_swap.sh` which I have bound to ``` Ctrl+` ``` in my i3
|
||||||
|
config.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
x=$(xclip -selection secondary -out)
|
||||||
|
xclip -selection clipboard -out | xclip -selection secondary
|
||||||
|
echo "$x" | xclip -selection clipboard
|
||||||
|
```
|
||||||
|
|
||||||
|
For implementing implicit copying, I basically needed a daemon that watched for
|
||||||
|
changes in primary selection and copies them over to clipboard selection. Here
|
||||||
|
are the contents of `clip_syncd.sh`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Daemon to synchronize PRIMARY selection with CLIPBOARD selection
|
||||||
|
|
||||||
|
old=""
|
||||||
|
while :; do
|
||||||
|
new=$(xclip -selection primary -out) || { sleep 0.5; continue; }
|
||||||
|
if [[ $new != "$old" ]]; then
|
||||||
|
xclip -selection primary -out | xclip -selection clipboard -in
|
||||||
|
old="$new"
|
||||||
|
fi
|
||||||
|
sleep 0.5
|
||||||
|
done
|
||||||
|
```
|
Loading…
Reference in New Issue