The overarching goal is to set up what I believe to be the ideal remote development terminal setup; mosh into remote -> tmux + ability to copy paste to local machine.
To achieve the stated goal, we implement the OSC 52 escape command within the default terminal provided by the Ubuntu OS 16.04 (gnome-terminal) so I could copy and paste to the system clipboard through terminal escapes, ie
printf "\033]52;c;$(printf "%s" "test" | base64)\a" should copy “test” into the local OS clipboard.
This particular version of vte was chosen due to the fact that its the default version of libvte for ubuntu 16.04, which is what I use. This patch won’t work for more modern versions of vte as the code has changed significantly.
Since the goal is for personal use on tmux, this OSC 52 patch does not cover all use cases for OSC 52. In fact this patch only supports the c; option (it assumes all OSC 52 escapes are trying to reach the clipboard). osc 52 documentation
git clone https://github.com/andrewmzhang/vte.git
To Install w/o Overriding Default libvte Install
# Dependencies sudo apt-get install gtk-doc-tools gobject-introspection valac libvala-dev libgnutls-dev libgirepository1.0-dev gperf # Will install to /opt/vte ./autogen.sh --prefix=/opt/vte make sudo make install
Setting Up gnome-terminal
Initially I tried to devise a way to have 2 different gnome-terminal executables, one that would launch with the doctored libvte library and the other untouched, since I don’t have functionality to turn off OSC 52 escapes once implemented. Unfortunately it seems that gnome-terminal uses the system global name “org.gnome.Terminal” to communicate through the dbus. I don’t know how dbus works, so I didn’t attempt to manipulate it.
When gnome-terminal launches, it actually communicates w/ gnome-terminal-server (or launches it) and gnome-terminal exits (see post on this: gnome-terminal-server-explained ). So we actually need to get gnome-terminal-server to use our doctored lib.
gnome-terminal/gnome-terminal-server version 3.18.3 on the defaul Ubuntu install seems to be a bit different from what sits at the gnome gitlab repository. Instead of trying to install whatever patches Ubuntu utilizes, I opted to relink the gnome-terminal-server executable to point to our doctored lib.
# Will show you what libvte links to ldd /usr/lib/gnome-terminal/gnome-terminal-server | grep "vte" # outputs: libvte-2.91.so.0 => /usr/lib/x86_64-linux-gnu/libvte-2.91.so.0 # Backup gnome-terminal-server sudo cp /usr/lib/gnome-terminal/gnome-terminal-server /usr/lib/gnome-terminal/gnome-terminal-server.bak # Relink the library; Run the patchelf on a non libvte based emulator (eg xterm) sudo apt install -y patchelf sudo patchelf --replace-needed libvte-2.91.so.0 /opt/vte/lib/libvte-2.91.so.0 /usr/lib/gnome-terminal/gnome-terminal-server
Fixing the colours
The colours might have changed (for me libvte put up a white background w/ black text). To fix this open gnome-terminal->profile preferences->colors
Change the text color to:
Change the background color to:
Bold color to: [x] Same as text color
Setting Up tmux and mosh
First, we need to tell tmux to copy via OSC 52. To do this we need to set the clipboard.
Tmux supports OSC 52 but does not pass the “c;” option, according to yudai’s post. However we can force it to pass the “c;” option. Mosh is capable of catching the OSC 52 option c (the default mosh only accepts the “c;” option). Thus adding these lines to the tmux.conf should allow us to copy into local clipboard. I think if you install this mosh pr it supports the other OSC 52 options.
Note: This only works for more recent version of tmux.
# sets tmux to use OSC 52 escape set -g set-clipboard on # Forces tmux to use the "c;" option set -ag terminal-overrides "vte*:XT:Ms=\\E]52;c;%p2%s\\7,xterm*:XT:Ms=\\E]52;c;%p2%s\\7"
Big thanks to Kevin Zheng for providing most of the code :)