emacsとzshで共有できるクリップボード(キルリング)もどきの自作
sshでサーバにつないでscreen上でzshとかemacs使っていると emacs<->zshとかscreen上のシェル間でkill, yank出来なくてもどかしい。
ホスト側でマウス操作するなりすればいいんだけど、 最近ipadからsshしてるからそれも面倒くさい。 x windowも動かしていないからxselも使えない。
screenにコピーペーストもあるんだけど、 コマンドでやりたいので自作することにする。
実装方針
kill ring用のファイルを用意し、そのファイルで共有することにする。
関数名はshared-yankとshared-killとする。 ショートカットはshared-yankをESC-uとshared-killをESC-jにする。 emacsにしてもzshにしても大したキーバインドが割り当てられていないのでちょうどいい。
kill ring用のファイルは~/.tmp/shared_kill_ringとする。 個人用なので~以下でパーミッションは400推奨。
emacs
(defun shared-yank () "yank from shared kill ring file" (interactive) (with-temp-buffer (insert-file-contents "~/.tmp/shared_kill_ring") (setq shared_kill_ring (read (buffer-string)))) (insert-before-markers (format "%s" shared_kill_ring))) (global-set-key "\M-u" 'shared-yank) (defun shared-kill (beg end) "kill to shared kill ring file" (interactive "r") (if (and mark-active transient-mark-mode) (progn (setq temp (buffer-substring beg end)) (with-temp-buffer (insert (format "%s" temp)) (write-file "~/.tmp/shared_kill_ring"))))) (global-set-key "\M-j" 'shared-kill)
zsh
function shared-kill(){ echo $RBUFFER > ~/.tmp/shared_kill_ring; RBUFFER="" } function shared-yank(){ LBUFFER=$LBUFFER"`cat ~/.tmp/shared_kill_ring`"; } zle -N shared-kill zle -N shared-yank bindkey '^[j' shared-kill bindkey '^[u' shared-yank
最後に
ringと書いているが、あれは嘘だ。 あと、killの方はzshとemacsで挙動が違います。 (emacsの方はcopy-regionの挙動)