Shammer's Philosophy

My private adversaria

Emacs kill-ring と OS Clipboard

いつの間にか、一緒になっているようで驚いた。なんか複数行をCtrl-Dで削除できないとかおかしい、とか思っていたが、23.xのどこかからか、OSのクリップボードとkill-ringを同じにするような作りに変わったみたいだった。

だが、個人的にこれはものすごく困る。OSのクリップボードとkill-ringが分かれていて、Emacs内の編集内容を間違えて何か別のアプリに貼りつけたり、何か別のアプリでコピーしたとしてもそれがEmacsでのコピペに影響しない、という仕組みが気に入っていたから(特に後者が重要だった)。意図的にEmacsと別のアプリ間でコピペしたい、という場合は、Shift-Insertを使うとか、メニューから明示的に、という使い方をしていただけに、この仕様変更の影響は大きい。なんとか戻せないものか・・・と情報を集めていて、Emacs Wiki にたどり着いた。

 EmacsWiki: Copy And Paste

このサイトはかなりありがたい。Windows の場合は、

(setq x-select-enable-clipboard nil)
(global-set-key [(shift delete)] 'clipboard-kill-region)
(global-set-key [(control insert)] 'clipboard-kill-ring-save)
(global-set-key [(shift insert)] 'clipboard-yank)

とすれば、自分が期待する動きになった。つまり、

という動作。Macの場合は面倒だった。x-select-enable-clipboard nil だけではダメ。Wikiの最後の方に書いてあるが、専用の関数を書いてやらないとダメだった。

(setq interprogram-cut-function nil)
(setq interprogram-paste-function nil)
(defun paste-from-pasteboard ()
  (interactive)
  (and mark-active (filter-buffer-substring (region-beginning) (region-end) t))
  (insert (ns-get-pasteboard))
  )
(defun copy-to-pasteboard (p1 p2)
  (interactive "r*")
  (ns-set-pasteboard (buffer-substring p1 p2))
  (message "Copied selection to pasteboard")
  )
(defun cut-to-pasteboard (p1 p2) (interactive "r*") (ns-set-pasteboard (filter-buffer-substring p1 p2 t)) )
(global-set-key (kbd "s-v") 'paste-from-pasteboard)
(global-set-key (kbd "s-c") 'copy-to-pasteboard)
(global-set-key (kbd "s-x") 'cut-to-pasteboard)

キーバインドは、Ctrl-c + x とか、別のものにした。サイトを探してみると、ほとんど「どうやったらEmacsの内容をクリップボードへ保存できるか」という内容ばかり。むしろクリップボードとkill-ringを分けたい、というような情報はあまり見かけなかった。自分の作業環境って、どれだけ亜流なんだろうか・・・