コマンドラインからEmacsを呼び出して、実行されていない場合はグラフィカルEmacsを起動するか、すでに実行されているEmacs内のファイルにアクセスできるようにしたい。 emacsclient
でこれを実行しようとしましたが、これは「正しい」方法であることがわかっていますが、OS Xで多くの問題が発生したか、ランダムにクラッシュするか、emacs --daemon
マシンのシャットダウンまたは再起動中にプロセスがハングし、一般的なフレークが発生します。これを機能させたいのですが、現時点では、以下で説明するこの1つの問題を除いて、open -a
の方が実際にははるかにうまく機能します。
このようにopen -a
を使用する:
$ open -a Emacs file.txt
実行されていない場合はEmacsを起動し、ファイルにアクセスします。しかし、現在のバッファが*scratch*
でないときにこれを行うと、ファイルは新しいフレーム(つまり、新しいシステムウィンドウ)で開かれます。
セッションの例を次に示します。
$ open -a Emacs file.txt
これによりEmacsが起動し、file.txtが開くため、このバッファーを含む単一のフレームがあります。 *scratch*
バッファーに切り替えて、これを行うと、次のようになります。
$ open -a Emacs file1.txt
このファイルを同じフレームで開きます。これで、このファイルを開いた状態の1つのフレームができました。これを行うと、次のようになります。
$ open -a Emacs file2.txt
新しいフレームが開き、2つのフレームが同時に開きます。
--args
スイッチをopen
に使用して、Emacsへのコマンドライン引数をいじってみましたが、これは後続の呼び出しでは機能しないようです。
$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'
これはメッセージバッファに「foo」を出力するだけです... 2回目はEmacsがフォアグラウンドに移動しただけですが、メッセージは出力されません。
open
がすでに実行されているアプリケーションとどのように通信するのかわかりませんが、どうすればわかるのでしょうか。または、Messages
バッファよりもはるかに詳細なログを取得する方法はありますか?上記のセッション中、そのバッファには興味深いものは何も出力されないので、EmacsLISPをハックしてやりたいことを行う方法がわかりません...
ありがとう!
答えはここにあります: 元のフレームで「開く」ためのemacs変数
これは、新しいバージョンのemacsのデフォルト設定への変更です。追加:
(setq ns-pop-up-frames nil)
.emacsファイルに。
これを見つけてとても幸せです。