MacのEmacsdaemonおよびEmacsclient


25

OS:OS X 10.9.5、Mavericks

Rainers-MacBook-Pro-3.local上の2014-04-03のGNU Emacs 24.3.1(x86_64-apple-darwin13.1.0、Carbonバージョン1.6.0 AppKit 1265.19)

railcatからhomebrew経由でemacsをインストールしましたが、問題なく動作します。ターミナルではemacsを使用しません。通常はアプリケーションを使用して開始します。

私が言ったように-私はこれまでのところ幸せです。

うまくいかなかったことが1つあります(以前はLinuxでうまく機能していました)。

  1. ログイン時にemacsデーモンを起動します
  2. emacsclientを使用して開く
  3. emacsdaemonを閉じ、ログオフ時にalファイルを保存します

これをセットアップするのに役立つ実用的なレシピはありますか?

追加情報

ログイン時にemacsデーモンを開始するには

bashコマンドを実行するAutomatorアプリケーションを作成しました

/usr/local/bin/emacs --daemon

それをログインアイテムに追加して、うまく機能するようにしました。

ターミナルからデーモンを利用する

を使用してemacsデーモンを利用できます

emacsclient .bashrc

emacsターミナルセッションで.bashrcを開きます。

GUIからの活用

疑問が残ります。GUIからどのように使用できますか?

emacsclientを理解しているため、開くファイルを指定しない限り、emacsclientを開くことができません。

emacsclient GUIを開き、以前に開いたすべてのファイルを開きたいですか?これは可能ですか?

私は使用できることがわかりました

emacsclient -c

ターミナルで私がやりたいことをする-しかし、私はGUIのために同じことをすることができますか?


ここでは「GUIから」が何を意味するのかわかりません。「Finderでファイルをダブルクリックする」などの意味があります。
タルシウス14

アプリランチャーの使用(例:Spotlight経由)
Rainer 14

アプリランチャーでは、ファイルを選択できますか(ファイルは、そのファイルタイプのデフォルトアプリケーションを使用して開かれます)。または「アプリ」のみですか?emacsclientOS Xに関する限り、アプリではありません(アプリEmacsがそのようにインストールされている場合のみ)。開いているアプリケーション/ウィンドウを選択するためにシステムキーバインディングを使用しないのはなぜですか?(Emacsがデーモンモードで起動され、まだフレーム(「ウィンドウ」)がない場合は機能しません)。
タルシウス14

emacsclientを起動するEmacsclientというアプリを定義しました-アプリEmacsclientがそこにあります。明らかに、実行中のemacsインスタンスに切り替えることができます-しかし、これは上記のワークフローを見て、ポイントのほかです。
レイナー14

1
この質問はその答えよりもほとんど役に立ちます:)
ロイTruelove

回答:


6

Emacs.appが常に実行されていることは本当に気になりませんが、誤ってEmacsサーバーを強制終了せずにウィンドウを閉じることができなかったという事実は迷惑でした。そして、最後のフレームを殺そうとして本当に一生懸命に努力しても、「唯一の可視またはアイコン化されたフレームを削除しようとする」ことはできません。...だからカンニング。

このソリューションは、閉じるボタンをクリックして最後のウィンドウを閉じようとすると、Emacs(Command+などh)を非表示にします。

以下をEmacsのinitのどこかに追加します。

(defadvice handle-delete-frame (around my-handle-delete-frame-advice activate)
  "Hide Emacs instead of closing the last frame"
  (let ((frame   (posn-window (event-start event)))
        (numfrs  (length (frame-list))))
    (if (> numfrs 1)
      ad-do-it
      (do-applescript "tell application \"System Events\" to tell process \"Emacs\" to set visible to false"))))

そして、Emacsを「ユーザーとグループ>ログイン項目」に追加し、「非表示」チェックボックスをクリックします。

Emacsのinitも(start-server)どこかを呼び出す必要があります。

このemacsclientラッパーを使用して、Emacsを最初に前面に表示します。

#!/bin/sh
osascript -e 'tell application "Emacs" to activate'
exec emacsclient "$@"

問題点:

  • Emacsをアクティブ/非表示にすると、すべてのウィンドウが前面に表示されます。これは少し面倒です。
  • DockのEmacsアイコンをクリックすると、時々新しいウィンドウがランダムに作成されるようです。しかしいつもではない。
  • TODO:たぶん作るCommand+ wもEmacsのを隠し、最後のフレームに?
  • 編集の新機能:すべてのウィンドウが最小化されているときにドックアイコンをクリックしても、そのうちの1つが自動的に最大化されるわけではありません。

これは、Emacsを最小化することを示唆する@noahamの回答と、最後のウィンドウを閉じようとする方法を説明するこの回答に基づいています。

編集:

ソースを検索すると、を呼び出す「キーバインディング」がmac-apple-event-map見つかりましたmac-ae-reopen-applicationmac-ae-reopen-application表示され、アイコン化されたフレームをチェックしているようで、何らかの方法で非表示のフレームを見逃す必要があります。これはおそらくバグです。

簡単な修正は、initでキーバインディングを無効にすることです。

(define-key mac-apple-event-map [core-event reopen-application] nil)

これにより、新しいマイナーバグが発生します。すべてのウィンドウが最小化されているときにドックアイコンをクリックしても、そのうちの1つが自動的に最大化されません。正しい修正は書き換えることでしょうがmac-ae-reopen-application、私はほとんどemacsとelispを知りません。


ランダムな新しいウィンドウ(箇条書き2)を停止する方法を誰かが見つけたら、教えてください。おそらく、この設定について私を悩ませているのはおそらく唯一残されたものです。
parent5446 14年

@ parent5446、完了!最初の修正と同じくらいハッキーですが、動作します。
bburky

ありがとう!ほとんどの場合、ドックからEmacsを開始しないので、ハック部分は気にしません。
parent5446 14年

4

emacsの山本光晴ポートは、残念ながらmulti-ttyをサポートしていません(この問題を参照)。これは、ターミナルからemacsデーモンを起動して、emacsclientでGUIウィンドウを起動できないことを意味します。

ここに私がやることがあります:init.elに(server-start)ログイン時にEmacs.appを起動します。ここで迷惑なのは、これによりウィンドウが表示され、手動で最小化する必要があることです。

次にemacsc、次のように呼び出されるbashスクリプトがあります

#!/bin/bash                                                                          
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
emacsclient -n -c

次に、以下を含むapplescriptでアプリを作成します

tell application "Emacs"
    activate
end tell
do shell script "~/bin/emacsc"

-nフラグをemacsclient に渡すことが重要です。そうしないと、emacscアプリを使用して一度に1つのクライアントしか開けなくなります。パス変数を設定すると、OS Xがemacsclientの正しいバージョンを確実に見つけることができます。

Emacsに「アクティブ化」するように指示すると、クライアントウィンドウがフォアグラウンドで起動されます。

面倒なことは、ログイン時にemacsウィンドウを手動で最小化し、それをドックに座っておく必要があることです。これを回避する1つの方法は、ログイン後にEmacsを自動的に「非表示」にすることですが、それをアクティブにすると非表示になります。


2

Railwaycat Emacsが通常の自家製ビールの式とどのように異なるかはわかりませんが、後者ln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgentsではemacs --daemonログイン時に実行されます。

plistは、公式の HEREドキュメントとして含まれています。採用する必要があるのは、行のemacsアプリへのパスを変更することだけです<string>#{opt_bin}/emacs</string>

ところで、--cocoaオプションを付けてインストールすると、Homebrew EmacsでEmacsをOS Xアプリとして取得できます。(brew linkappsあとで実行し、にリンクする/Applicationsか、自分でリンクを作成する必要があります。


1

Macデーモンでは、90%がlaunchdを使用して管理されます。ユーザーのログイン/ログアウトを含む多くのトリガーでそれらを実行できます。launchdが管理しているさまざまなものを表示および編集するためのLingonと呼ばれるかわいいMacアプリケーションがあります。emacs wikiに、これに関するいくつかの言及があり、configファイルの例も含まれています。しかし、それはあなたの懸念、すなわちログアウト時にデーモンをシャットダウンする方法に対処していないように見えます。


0

次のようなAppleScriptアプリケーションを作成します。

tell application "Terminal"
do shell script "/usr/local/bin/emacsclient -c"
endtell

パスを調整する必要がある場合や、パスを完全に除外できる場合があります。デーモンがまだ実行されていない場合は、デーモンを起動するために、より洗練されたものを使用することもできます。


@Rainerこれで何か成功しましたか?また、emacsclientを使用してデーモンに接続する前に、必要に応じてデーモンを起動する、より洗練された実装を検索することもできます。「applescript emacsclient」は、Google検索で良好な結果を提供します。
メガネザル

あなたはまだより良い答えを待っていますか、これを受け入れることは可能でしょうか?
メガネザル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.