A Go library to work with the ANSI OSC52 terminal sequence.
You can use this small library to construct an ANSI OSC52 sequence suitable for your terminal.
import (
"os"
"fmt"
"github.com/aymanbagabas/go-osc52/v2"
)
func main() {
s := "Hello World!"
// Copy `s` to system clipboard
osc52.New(s).WriteTo(os.Stderr)
// Copy `s` to primary clipboard (X11)
osc52.New(s).Primary().WriteTo(os.Stderr)
// Query the clipboard
osc52.Query().WriteTo(os.Stderr)
// Clear system clipboard
osc52.Clear().WriteTo(os.Stderr)
// Use the fmt.Stringer interface to copy `s` to system clipboard
fmt.Fprint(os.Stderr, osc52.New(s))
// Or to primary clipboard
fmt.Fprint(os.Stderr, osc52.New(s).Primary())
}
You can use this over SSH using gliderlabs/ssh for instance:
var sshSession ssh.Session
seq := osc52.New("Hello awesome!")
// Check if term is screen or tmux
pty, _, _ := s.Pty()
if pty.Term == "screen" {
seq = seq.Screen()
} else if isTmux {
seq = seq.Tmux()
}
seq.WriteTo(sshSession.Stderr())
Make sure you have set-clipboard on
in your config, otherwise, tmux won't
allow your application to access the clipboard 1.
Using the tmux option, osc52.TmuxMode
or osc52.New(...).Tmux()
, wraps the
OSC52 sequence in a special tmux DCS sequence and pass it to the outer
terminal. This requires allow-passthrough on
in your config.
allow-passthrough
is no longer enabled by default
since tmux 3.3a 2.
- vim-oscyank this is heavily inspired by vim-oscyank.