aboutsummaryrefslogtreecommitdiff
path: root/posts/OSC-52.md
diff options
context:
space:
mode:
authorAkshay <[email protected]>2024-11-27 23:01:48 +0000
committerAkshay <[email protected]>2024-11-27 23:01:48 +0000
commit92a1fd5c5ee1fb0b4079128a0b7c6a1d78a2399d (patch)
tree3d1b106db2ca2824d4afffdc433a084e14675772 /posts/OSC-52.md
parent9828c78d95f2195cd8e1db04887072cd5f48005b (diff)
new post: OSC-52
Diffstat (limited to 'posts/OSC-52.md')
-rw-r--r--posts/OSC-52.md66
1 files changed, 66 insertions, 0 deletions
diff --git a/posts/OSC-52.md b/posts/OSC-52.md
new file mode 100644
index 0000000..8dccef9
--- /dev/null
+++ b/posts/OSC-52.md
@@ -0,0 +1,66 @@
1I use `ssh` a lot. Copying text from the remote machine to
2the host machine always sucked. But OSC-52 makes that easy.
3
4OSC-52 is an ANSI escape sequence to write text to the
5terminal emulator. The terminal emulator, if it understands
6what is going on, will in turn write this text to the system
7clipboard.
8
9What this means is some `printf` magic can send text to your
10clipboard. I store this one-liner in a script called
11`oclip`:
12
13```bash
14printf "\033]52;c;%s\007" "$(base64 <&0)"
15```
16
17and I run it with:
18
19```bash
20remote $ cat some_file.txt | oclip
21
22# some_file.txt's contents are now the host's clipboard
23```
24
25### The catch
26
27Your terminal emulator must support OSC-52, `alacritty` and
28`termux` seem to support this out of the box. In `st`,
29OSC-52 works with this change to `config.h`:
30
31```
32int allowwindowops = 1;
33```
34
35If you are using `tmux`, you need to flip this switch on:
36
37```
38set -s set-clipboard on
39```
40
41If you are inside `nvim`, it may work as expected as long as
42`$SSH_TTY` is set. I sometimes physically start a session,
43and `ssh` into the same session later from another machine,
44and `$SSH_TTY` remains unset, so I force OSC-52 in `nvim` at
45all times (see
46[nvimdoc](https://neovim.io/doc/user/provider.html#clipboard-osc52)):
47
48```lua
49vim.g.clipboard = {
50 name = 'OSC 52',
51 copy = {
52 ['+'] = require('vim.ui.clipboard.osc52').copy('+'),
53 ['*'] = require('vim.ui.clipboard.osc52').copy('*'),
54 },
55 paste = {
56 ['+'] = require('vim.ui.clipboard.osc52').paste('+'),
57 ['*'] = require('vim.ui.clipboard.osc52').paste('*'),
58 },
59}
60```
61
62If you are inside `nvim` inside `tmux` inside an `ssh`
63session inside `st`, you neeed all of the above tweaks.
64`nvim` will pass the contents around to `tmux`, which in
65turn will pass the contents to `st`, which should pass it to
66your system clipboard.