emacsとzshで共有できるクリップボード(キルリング)もどきの自作

sshでサーバにつないでscreen上でzshとかemacs使っていると emacs<->zshとかscreen上のシェル間でkill, yank出来なくてもどかしい。

ホスト側でマウス操作するなりすればいいんだけど、 最近ipadからsshしてるからそれも面倒くさい。 x windowも動かしていないからxselも使えない。

screenにコピーペーストもあるんだけど、 コマンドでやりたいので自作することにする。

実装方針

kill ring用のファイルを用意し、そのファイルで共有することにする。

  1. ファイルに書き込む用の関数
  2. ファイルから読み込む用の関数 をemacszshでそれぞれ実装する。

関数名は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の方はzshemacsで挙動が違います。 (emacsの方はcopy-regionの挙動)