2011年12月25日日曜日

ターミナル Emacs - GUIアプリ間のコピペ

参考: http://hakurei-shain.blogspot.com/2010/05/mac.html
うれしい。
blog 作成は、Emacs の org-mode で記事を書いて html 出力して、それをコピーして blog に貼りつけているのですごく便利になりました。
ただ、Emacs 内のペーストも command + V となってしまう。
以下ソースの引用。
; http://blog.lathi.net/articles/2007/11/07/sharing-the-mac-clipboard-with-emacs
(defun copy-from-osx ()
 (shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
 (let ((process-connection-type nil))
     (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
       (process-send-string proc text)
       (process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)

 

初めて読む Emacs Lisp

このコードが読みたくて Emacs Lisp 始めました。
(shell-command-to-string "pbpaste"))

;; シェルコマンドとして pbpaste を実行する。
(let ((process-connection-type nil))
   (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))

;; (process-connection-type nil)はこれから作る非同期サブプロセスとの通信はパイプであることを示す。
;; start-process はプログラム pbcopy(2回目のpbcopy) を非同期サブプロセスとして実行する。
;; サブプロセスの名前は"pbcopy"(1つ目のpbcopy)でバッファ"*Messages*"と対応付けられている。
;; pbcoyp は OSX のコマンドでコマンドラインからクリップボードへコピーする。
;; (let ((proc (start-process ... で変数 proc に start-process が返すプロセスオブジェクトが代入される。

(process-send-string proc text)
(process-send-eof proc)

;; proc すなわち pbcopy に文字列 text を送る。
;; process-send-eof は proc に eof を送る処理。(バッファを flush するため(?))
(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)

;; 変数 interprogram-cut-function は kill した文字列をwindow systemで使用する方法を指定する。
;; 引数として関数名で指定する。kill-new 関数や kill-append 関数が呼ばれたときにこの指定された関数も呼ばれる。
;; 変数 interprogram-paste-function は他のプログラムから kill した文字列を貼り付ける方法を指定する。


追記 (2012/1/15)
Emacs 内で kill して yank する時にも C + y ではなくて Command + V しないといけなかったのが、若干不満でした。試行錯誤しているうちに上記の "copy-from-osx" の定義は不要ということがわかりました。現在では、ターミナルにペースト機能があるので特に定義しなくてもペーストできます。( terminal でも iTerm でもできました。)
なので、
(defun copy-from-osx ()
    (shell-command-to-string "pbpaste"))
と、
(setq interprogram-paste-function 'copy-from-osx)
は削除します。
すると Emacs でコピーしたものを Emacs 内でペーストするときには C + y で出来ます。 (GUI アプリへのペーストは Command + V で貼付けできます。Emacs へのペーストも Command + V でも出来ます。)


参考:やさしいEmacs‐Lisp講座

参考:36.4 非同期プロセスの作成
参考:32.8.5 Low-Level Kill Ring
参考:OSX固有のコマンド






0 件のコメント:

コメントを投稿