diff options
author | Jesse Luehrs <doy@tozt.net> | 2018-05-19 23:08:05 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2018-05-19 23:27:42 -0400 |
commit | 4d817a4e565aa913aa0ebbe8dc597e5521c9b246 (patch) | |
tree | 55c65b6bccdfe89e757ecf54ff27084c8af838f6 | |
parent | 18132d7281dddd98f8dcc298ec742a02ed278d86 (diff) | |
download | conf-4d817a4e565aa913aa0ebbe8dc597e5521c9b246.tar.gz conf-4d817a4e565aa913aa0ebbe8dc597e5521c9b246.zip |
add some keybindings to let tmux interact with the system clipboard
-rwxr-xr-x | bin/tmux-clipboard | 49 | ||||
-rw-r--r-- | tmux.conf | 4 |
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]"; +} + @@ -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 |