diff options
author | Akshay <[email protected]> | 2024-11-27 23:01:48 +0000 |
---|---|---|
committer | Akshay <[email protected]> | 2024-11-27 23:01:48 +0000 |
commit | 92a1fd5c5ee1fb0b4079128a0b7c6a1d78a2399d (patch) | |
tree | 3d1b106db2ca2824d4afffdc433a084e14675772 /docs/posts/OSC-52/index.html | |
parent | 9828c78d95f2195cd8e1db04887072cd5f48005b (diff) |
new post: OSC-52
Diffstat (limited to 'docs/posts/OSC-52/index.html')
-rw-r--r-- | docs/posts/OSC-52/index.html | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/docs/posts/OSC-52/index.html b/docs/posts/OSC-52/index.html new file mode 100644 index 0000000..6c87fef --- /dev/null +++ b/docs/posts/OSC-52/index.html | |||
@@ -0,0 +1,119 @@ | |||
1 | <!DOCTYPE html> | ||
2 | <html lang="en"> | ||
3 | <head> | ||
4 | <link rel="stylesheet" href="/style.css"> | ||
5 | <link rel="stylesheet" href="/syntax.css"> | ||
6 | <meta charset="UTF-8"> | ||
7 | <meta name="viewport" content="initial-scale=1"> | ||
8 | <meta content="#ffffff" name="theme-color"> | ||
9 | <meta name="HandheldFriendly" content="true"> | ||
10 | <meta property="og:title" content="OSC-52"> | ||
11 | <meta property="og:type" content="website"> | ||
12 | <meta property="og:description" content="a static site {for, by, about} me "> | ||
13 | <meta property="og:url" content="https://peppe.rs"> | ||
14 | <link rel="icon" type="image/x-icon" href="/favicon.png"> | ||
15 | <title>OSC-52 · peppe.rs</title> | ||
16 | <body> | ||
17 | <div class="posts"> | ||
18 | <div class="post"> | ||
19 | <a href="/" class="post-end-link">Home</a> | ||
20 | <span>/</span> | ||
21 | <a href="/posts" class="post-end-link">Posts</a> | ||
22 | <span>/</span> | ||
23 | <a class="post-end-link">OSC-52</a> | ||
24 | <a class="stats post-end-link" href="https://git.peppe.rs/web/site/plain/posts/OSC-52.md | ||
25 | ">View Raw</a> | ||
26 | <div class="separator"></div> | ||
27 | <div class="date"> | ||
28 | 28/11 — 2024 | ||
29 | <div class="stats"> | ||
30 | <span class="stats-number"> | ||
31 | 26.37 | ||
32 | </span> | ||
33 | <span class="stats-unit">cm</span> | ||
34 |   | ||
35 | <span class="stats-number"> | ||
36 | 1.9 | ||
37 | </span> | ||
38 | <span class="stats-unit">min</span> | ||
39 | </div> | ||
40 | </div> | ||
41 | <h1> | ||
42 | OSC-52 | ||
43 | </h1> | ||
44 | <div class="post-text"> | ||
45 | <p>I use <code>ssh</code> a lot. Copying text from the remote machine to | ||
46 | the host machine always sucked. But OSC-52 makes that easy.</p> | ||
47 | <p>OSC-52 is an ANSI escape sequence to write text to the terminal | ||
48 | emulator. The terminal emulator, if it understands what is going on, | ||
49 | will in turn write this text to the system clipboard.</p> | ||
50 | <p>What this means is some <code>printf</code> magic can send text to | ||
51 | your clipboard. I store this one-liner in a script called | ||
52 | <code>oclip</code>:</p> | ||
53 | <div class="sourceCode" id="cb1"><pre | ||
54 | class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="bu">printf</span> <span class="st">"\033]52;c;%s\007"</span> <span class="st">"</span><span class="va">$(</span><span class="fu">base64</span> <span class="op"><&</span><span class="dv">0</span><span class="va">)</span><span class="st">"</span></span></code></pre></div> | ||
55 | <p>and I run it with:</p> | ||
56 | <div class="sourceCode" id="cb2"><pre | ||
57 | class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="ex">remote</span> $ cat some_file.txt <span class="kw">|</span> <span class="ex">oclip</span></span> | ||
58 | <span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a></span> | ||
59 | <span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="co"># some_file.txt's contents are now the host's clipboard</span></span></code></pre></div> | ||
60 | <h3 id="the-catch">The catch</h3> | ||
61 | <p>Your terminal emulator must support OSC-52, <code>alacritty</code> | ||
62 | and <code>termux</code> seem to support this out of the box. In | ||
63 | <code>st</code>, OSC-52 works with this change to | ||
64 | <code>config.h</code>:</p> | ||
65 | <pre><code>int allowwindowops = 1;</code></pre> | ||
66 | <p>If you are using <code>tmux</code>, you need to flip this switch | ||
67 | on:</p> | ||
68 | <pre><code>set -s set-clipboard on</code></pre> | ||
69 | <p>If you are inside <code>nvim</code>, it may work as expected as long | ||
70 | as <code>$SSH_TTY</code> is set. I sometimes physically start a session, | ||
71 | and <code>ssh</code> into the same session later from another machine, | ||
72 | and <code>$SSH_TTY</code> remains unset, so I force OSC-52 in | ||
73 | <code>nvim</code> at all times (see <a | ||
74 | href="https://neovim.io/doc/user/provider.html#clipboard-osc52">nvimdoc</a>):</p> | ||
75 | <div class="sourceCode" id="cb5"><pre | ||
76 | class="sourceCode lua"><code class="sourceCode lua"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="va">vim</span><span class="op">.</span><span class="va">g</span><span class="op">.</span><span class="va">clipboard</span> <span class="op">=</span> <span class="op">{</span></span> | ||
77 | <span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a> <span class="va">name</span> <span class="op">=</span> <span class="st">'OSC 52'</span><span class="op">,</span></span> | ||
78 | <span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a> <span class="va">copy</span> <span class="op">=</span> <span class="op">{</span></span> | ||
79 | <span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="st">'+'</span><span class="op">]</span> <span class="op">=</span> <span class="fu">require</span><span class="op">(</span><span class="st">'vim.ui.clipboard.osc52'</span><span class="op">).</span>copy<span class="op">(</span><span class="st">'+'</span><span class="op">),</span></span> | ||
80 | <span id="cb5-5"><a href="#cb5-5" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="st">'*'</span><span class="op">]</span> <span class="op">=</span> <span class="fu">require</span><span class="op">(</span><span class="st">'vim.ui.clipboard.osc52'</span><span class="op">).</span>copy<span class="op">(</span><span class="st">'*'</span><span class="op">),</span></span> | ||
81 | <span id="cb5-6"><a href="#cb5-6" aria-hidden="true" tabindex="-1"></a> <span class="op">},</span></span> | ||
82 | <span id="cb5-7"><a href="#cb5-7" aria-hidden="true" tabindex="-1"></a> <span class="va">paste</span> <span class="op">=</span> <span class="op">{</span></span> | ||
83 | <span id="cb5-8"><a href="#cb5-8" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="st">'+'</span><span class="op">]</span> <span class="op">=</span> <span class="fu">require</span><span class="op">(</span><span class="st">'vim.ui.clipboard.osc52'</span><span class="op">).</span>paste<span class="op">(</span><span class="st">'+'</span><span class="op">),</span></span> | ||
84 | <span id="cb5-9"><a href="#cb5-9" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="st">'*'</span><span class="op">]</span> <span class="op">=</span> <span class="fu">require</span><span class="op">(</span><span class="st">'vim.ui.clipboard.osc52'</span><span class="op">).</span>paste<span class="op">(</span><span class="st">'*'</span><span class="op">),</span></span> | ||
85 | <span id="cb5-10"><a href="#cb5-10" aria-hidden="true" tabindex="-1"></a> <span class="op">},</span></span> | ||
86 | <span id="cb5-11"><a href="#cb5-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div> | ||
87 | <p>If you are inside <code>nvim</code> inside <code>tmux</code> inside | ||
88 | an <code>ssh</code> session inside <code>st</code>, you neeed all of the | ||
89 | above tweaks. <code>nvim</code> will pass the contents around to | ||
90 | <code>tmux</code>, which in turn will pass the contents to | ||
91 | <code>st</code>, which should pass it to your system clipboard.</p> | ||
92 | |||
93 | </div> | ||
94 | |||
95 | <div class="intro"> | ||
96 | Hi. | ||
97 | <div class="hot-links"> | ||
98 | <a href="/index.xml" class="feed-button">Subscribe</a> | ||
99 | </div> | ||
100 | <p>I'm Akshay, programmer and pixel-artist. | ||
101 | I write <a href="https://git.peppe.rs">open-source stuff</a>. | ||
102 | I also design fonts: | ||
103 | <a href="https://git.peppe.rs/fonts/scientifica/about">scientifica</a>, | ||
104 | <a href="https://git.peppe.rs/fonts/curie/about">curie</a>. | ||
105 | </p> | ||
106 | <p>Reach out at [email protected].</p> | ||
107 | </div> | ||
108 | |||
109 | <a href="/" class="post-end-link">Home</a> | ||
110 | <span>/</span> | ||
111 | <a href="/posts" class="post-end-link">Posts</a> | ||
112 | <span>/</span> | ||
113 | <a class="post-end-link">OSC-52</a> | ||
114 | <a class="stats post-end-link" href="https://git.peppe.rs/web/site/plain/posts/OSC-52.md | ||
115 | ">View Raw</a> | ||
116 | </div> | ||
117 | </div> | ||
118 | </body> | ||
119 | </html> | ||