理系学生日記

おまえはいつまで学生気分なのか

Emacs との Clipboard 共有

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 されたテキストを送る必要があるので、ちょっとだけ厄介。