summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2018-05-19 23:08:05 -0400
committerJesse Luehrs <doy@tozt.net>2018-05-19 23:27:42 -0400
commit4d817a4e565aa913aa0ebbe8dc597e5521c9b246 (patch)
tree55c65b6bccdfe89e757ecf54ff27084c8af838f6
parent18132d7281dddd98f8dcc298ec742a02ed278d86 (diff)
downloadconf-4d817a4e565aa913aa0ebbe8dc597e5521c9b246.tar.gz
conf-4d817a4e565aa913aa0ebbe8dc597e5521c9b246.zip
add some keybindings to let tmux interact with the system clipboard
-rwxr-xr-xbin/tmux-clipboard49
-rw-r--r--tmux.conf4
2 files changed, 53 insertions, 0 deletions
diff --git a/bin/tmux-clipboard b/bin/tmux-clipboard
new file mode 100755
index 0000000..455fa1a
--- /dev/null
+++ b/bin/tmux-clipboard
@@ -0,0 +1,49 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use 5.014;
+
+use Config;
+use Path::Class;
+use POSIX qw(mkfifo);
+
+use constant {
+ FIFO_PATH => "$ENV{HOME}/.cache/tmux/clipboard/",
+ COPY_CMD => ($Config{osname} eq 'linux' ? 'xclip -i' : 'pbcopy'),
+ PASTE_CMD => ($Config{osname} eq 'linux' ? 'xclip -o' : 'pbpaste'),
+};
+
+my $fifo_file = file(FIFO_PATH, $$);
+$fifo_file->dir->mkpath;
+$fifo_file->remove;
+END { $fifo_file->remove }
+mkfifo("$fifo_file", 0700);
+
+if ($ARGV[0] eq 'copy') {
+ if (fork) {
+ open my $clipboard, '|-', COPY_CMD
+ or die "can't copy from clipboard using ${\COPY_CMD}: $!";
+ $clipboard->print($fifo_file->slurp);
+ $clipboard->close;
+ }
+ else {
+ exec("tmux save-buffer -a $fifo_file");
+ }
+}
+elsif ($ARGV[0] eq 'paste') {
+ if (fork) {
+ open my $clipboard, '-|', PASTE_CMD
+ or die "can't paste from clipboard using ${\PASTE_CMD}: $!";
+ my $contents = do { local $/; <$clipboard> };
+ $clipboard->close;
+ $fifo_file->spew(iomode => 'a', $contents);
+ }
+ else {
+ system("tmux load-buffer -b tmux-clipboard $fifo_file");
+ exec("tmux paste-buffer -b tmux-clipboard -dp");
+ }
+}
+else {
+ die "usage: $0 [copy|paste]";
+}
+
diff --git a/tmux.conf b/tmux.conf
index b8bb589..a9ae155 100644
--- a/tmux.conf
+++ b/tmux.conf
@@ -43,6 +43,10 @@ bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
bind -T copy-mode-vi ) send-keys -X start-of-line
bind -T copy-mode-vi _ send-keys -X back-to-indentation
+bind -T copy-mode-vi ^C run "tmux send-keys -X copy-selection-and-cancel; tmux-clipboard copy"
+bind ^C run "tmux-clipboard copy"
+bind ^V run "tmux-clipboard paste"
+
unbind ^B
# set up default sessions