diff --git a/content/posts/ideas-from-my-dev-setup-clipboard.md b/content/posts/ideas-from-my-dev-setup-clipboard.md new file mode 100644 index 0000000..3ecaee7 --- /dev/null +++ b/content/posts/ideas-from-my-dev-setup-clipboard.md @@ -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 +```