« Firefoxのブックマークバーを折り返して表示する | メイン | WebSocketを使ってリモートデスクっぽいVNCっぽいWebSocketRemoteというものを作ってみました »

Gitのcore.editorにEmacsを指定する試行錯誤(Macの場合)

これまで、.gitconfigのeditorには次のような設定をしていた。
[core]
    editor = emacs
これで「COMMIT_EDITMSG」というファイルがEmacsで開く。
しかしこれだと、Emacs.app(Carbon Emacs)が起動していても、ターミナル上でMac OS X標準のEmacsが起動する。
これまでは気にもしていなかったのだけど、Emacsに色々な拡張をした結果起動時間が遅くなってしまった。
「git commit」を実行する度にEmacsが起動するまで待つのが嫌になって、コミットが億劫になってきていた。

Macの場合、次の様にすると「/Applications」ディレクトリ内の「Emacs.app」を探し出して起動してくれる。
[core]
    editor = open -a emacs
詳細は「man open」を参照のこと。
Tiger(Mac OS X 10.4)時代の書籍だけど、「入門 Unix for Mac OS X 第4版」にも少し解説されている。
Mac OS X固有のコマンドをきちんと解説している書籍は少ないので、この本の改訂版を出版して欲しい...。

話を元に戻す。
この方法だと確かに「git commit」実行時にEmacs.appが開きコミットメッセージの入力ができる。
しかし、コミットすることができない。
Emacs.appが起動した直後に、ターミナル側のGitが次のエラーを吐いて終了してしまう。
% git commit
Aborting commit due to empty commit message.
%
Emacs.appが別プロセルで立ち上がっているのが原因だと思う。

そこで、次の様に設定した。
[core]
    editor = open -W -a emacs
これだと、Git側はEmacs.appが終了するまで待ってくれる。
しかし、この方法にも問題がある。
「COMMIT_EDITMSG」を閉じてもGitはコミットを継続してくれず、Emacs.appの終了まで待ってしまう。
他のファイルをEmacs.appで開いていた場合、それも終了させないといけなくなる。
これじゃあ、本末転倒。

emacssclientというのを使うことにした。
emacssclientの詳細は割愛。
以前、gnuclientというのを使ったことがあったけど、これはemacssclient/emacsserverの機能拡張版らしい。
まず、次のelispをEmacsの設定に追加。
;;;サーバ起動
(server-start)
;;;クライアントを終了するとき終了するかどうかを聞かない
(remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)
次にcore.editorにemacssclientを指定する。
「open -a」はMac OS X向けのアプリケーション(Aqua対応のみ?)しか対応していないので、フルパスで指定する必要がある。
Carbon Emacs版のemacsclientはEmacs.appのパッケージ内にある。
[core]
    editor = /Applications/Emacs.app/Contents/MacOS/bin/emacsclient
まだ、問題がある。
Emacs.appが既に起動している場合(正確にはserver-startが実行された場合)はこれでいいけど、起動していなかった場合は、以下の様なエラーとなってしまう。
% git commit
/Applications/Emacs.app/Contents/MacOS/bin/emacsclient: connect: Connection refused
/Applications/Emacs.app/Contents/MacOS/bin/emacsclient: No socket or alternate editor.  Please use:

    --socket-name
    --server-file      (or environment variable EMACS_SERVER_FILE)
    --alternate-editor (or environment variable ALTERNATE_EDITOR)
error: There was a problem with the editor '/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'.
Please supply the message using either -m or -F option.
emacsclientが起動指定かなった時のために代わりのエディタを「--alternate-editor」で指定する。
ここではEmacs.appパッケージ内のCarcon Emacsの本体を指定してる。
[core]
    editor = /Applications/Emacs.app/Contents/MacOS/bin/emacsclient --alternate-editor /Applications/Emacs.app/Contents/MacOS/Emacs
本当は、テキストエディット等の軽量なものを指定したいところだけど、TextEdit.appを直接指定しても起動せず、TextEdit本体を指定するとEmacs同様にアプリケーションを終了しないとコミットを継続してくれない。
しかも「--alternate-editor」にオプション付のopenコマンドが何故か指定できないため、「--new」による新規インスタンスでの起動や、「--wait-apps」によるブロックができなかった。
普段はEmacsを使用しているけど、viも使える人は、次の様にしておくと良いと思う。
[core]
    editor = /Applications/Emacs.app/Contents/MacOS/bin/emacsclient --alternate-editor vi

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google

タグ クラウド