Emacs kill-ring と OS Clipboard
いつの間にか、一緒になっているようで驚いた。なんか複数行をCtrl-Dで削除できないとかおかしい、とか思っていたが、23.xのどこかからか、OSのクリップボードとkill-ringを同じにするような作りに変わったみたいだった。
だが、個人的にこれはものすごく困る。OSのクリップボードとkill-ringが分かれていて、Emacs内の編集内容を間違えて何か別のアプリに貼りつけたり、何か別のアプリでコピーしたとしてもそれがEmacsでのコピペに影響しない、という仕組みが気に入っていたから(特に後者が重要だった)。意図的にEmacsと別のアプリ間でコピペしたい、という場合は、Shift-Insertを使うとか、メニューから明示的に、という使い方をしていただけに、この仕様変更の影響は大きい。なんとか戻せないものか・・・と情報を集めていて、Emacs Wiki にたどり着いた。
このサイトはかなりありがたい。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を分けたい、というような情報はあまり見かけなかった。自分の作業環境って、どれだけ亜流なんだろうか・・・