Mac の Clipboard と Emacs の kill-ring を互いに共有したい。
これを実現するには、
- Emacs で yank するタイミングで Mac の clipboard にテキストを入れるフック
- Mac の Clipboard にコピーするタイミングで Mac の kill-ring にテキストを入れるフック
があれば楽ですね。
じつはこういう目的のフック用関数は Emacs に用意されていて、それぞれ interprogram-cut-function、interprogram-paste-function といいます。
Mac には、Clipboard 用の CUI コマンドとして pbpaste、pbcopy がありますから、上記 2 つのフック用の関数と組み合わせることで、Mac の Clipboard と Emacs の kill-ring の共有が可能になる。
;;; Mac Clipboard との共有 (defvar prev-yanked-text nil "*previous yanked text") (setq interprogram-cut-function (lambda (text &optional push) ; use pipe (let ((process-connection-type nil)) (let ((proc (start-process "pbcopy" nil "pbcopy"))) (process-send-string proc string) (process-send-eof proc) )))) (setq interprogram-paste-function (lambda () (let ((text (shell-command-to-string "pbpaste"))) (if (string= prev-yanked-text text) nil (setq prev-yanked-text text)))))
interprogram-cut-function の方は、pbcopy に対して yank されたテキストを送る必要があるので、ちょっとだけ厄介。