OSXでのEmacsサーバーの基本設定


9

私は最近、10年ぶりに最初のMacを購入し、それを構成しているところです。私はEmacsユーザーであり、他のオペレーティングシステムの既存の構成を使用できるように、Aquamacs ではなく通常のEmacsのみが必要だと判断しました。私はたくさんの次試してみたハウツー私が見つけたオンライン(のように、この1この1私はEmacsのをダウンロードしたサイトからのこの1、そして作品にいくつかの方法を組み合わせて試してみましたが、持っていることはありません)私が慣れている/望んでいるものに近づくことさえある状態に物事を得ました:

  1. Emacsデーモンは、起動時または必要なときに実行を開始します。どちらでもかまいません。新しいEmacsフレームはすべて同じサーバーによってサポートされます。
  2. Finderからテキストファイルを開くと、Emacsで、可能であれば既存のグラフィックフレームでファイルが開かれます。
  3. Emacs.appを実行すると、システムは、新しいインスタンスを起動して新しいウィンドウを開く代わりに、バックグラウンドで実行されているemacsデーモンを再利用します。(帽子の先端
  4. 端末からEmacsを実行すると、Emacsで終了するのを待たずに端末が動作します( '-nw'を使用しない限り)。
  5. 上記の操作中のどの時点でも、Emacsがを入力するのを待機している状態(「サーバー編集モード?」)になることC-x #はありませんが、私はこれについて深く理解していません。
  6. (おまけと思います)Emacsが既存のフレームを可能な限り再利用できるように、ターミナルからEmacsを呼び出す方法がいくつかあります。

このように動作するようにEmacsを構成するにはどうすればよいですか?

私が見つけたガイドが一般にいくつかのエイリアス、Applescript、bashスクリプトなどを作成するので、FinderがEmacsで物を開くようにして(#2)特に困惑します。 Finderにテキストファイルを開くために使用するように指示します。

ありがとう!

A. @lawlistは、「既存のフレームがあるにもかかわらず、ターミナルから新しいファイルを開くと、デフォルトで新しいフレームが開かれますか?」と尋ねます。答えは、ここで説明するように起動時にサーバーを起動し、フレームを開いてから、と入力し/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>てファイルを開くと、既存のフレームでファイルを開くことができるということです。現在開いているフレームがない場合は、「-nc」を使用する必要があります。または、ファイルを開こうとしても何も起こりません。

B. @lawlistは、「ログイン時にデーモンを実行しますか、それともログイン後にEmacsを手動でロードするだけで十分ですか?」と尋ねます。手動で実行しても問題ありません。


1、2、3、4、5、6、7、8の番号を付けてください。また、既存のフレームがあるにもかかわらず、ターミナルから新しいファイルを開くと、デフォルトで新しいフレームが開かれます。 ?私は回答の一部を知っていますが、すべてを知っているわけではありません-したがって、質問の番号は役に立ちます。ログイン時にデーモンを実行しますか、それともログイン後にEmacsを手動でロードするだけで十分ですか?
法律家、2013

@Lauri Rantaは良い答えを持っています。 M-x server-startemacsclient通信できるように手動でサーバーを起動します。ログイン時にデーモンを使用する代わり(server-start)に自分のinit.elファイルに配置しましたが、多くの人はデーモンログインオプションを好みます。そしてもちろん、.emacsファイルはの適切な場所になり(server-start)ます。
法律家2013

Finderからファイルを開くことに関して、私はあなたが次のようなものを必要とする段階をはるかに超えていると想定しています: dummies.com/how-to/content/… したがって、それが邪魔にならないと想定すると、おそらくうまくなければns-find-file、ファイルがEmacs.appに関連付けされたときに自動的に起動されます- 。上記のリンクにある私の傍受ファイル機能は、ns-find-fileそれがあなたの興味を引くものであるかどうかも変更します。もちろん、Emacsをビルドする必要があります--with-ns
法律家2013

回答:


10

Emacs.appが新しいフレームではなく既存のフレームでファイルを開く(setq ns-pop-up-frames nil)ようにするには、などの構成ファイルに追加します~/.emacs

open -a emacs fileまたはを使用して、ターミナルからファイルを開くことができますemacsclient -n file。Emacs.appが開いていなくてもEmacs --daemonプロセスがある場合、何らかの理由でemacsclient -n file機能しませんが、emacsclient -nc file機能します。

emacsclientように/Applications/Emacs.app/Contents/MacOS/bin/emacsclient、または/usr/local/bin/emacsclientHomebrewでEmacsをインストールした場合は、使用しているEmacsのバージョンに含まれているバイナリを使用してください。

ログイン時にEmacsサーバーを起動するには、たとえば、このplistを~/Library/LaunchAgents/my.emacsdaemon.plist次のように保存します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.emacsdaemon</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
    <string>--daemon</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/> <!-- run the program again if it terminates -->
</dict>
</plist>

plistは次回のログイン時に自動的に読み込まれますが、を実行するとすぐに読み込むことができますlaunchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist

編集:なぜEmacs.appだけでなくAppleScriptアプリケーションにファイルの種類を関連付けるのか、私にはまだわかりません。kuzzoorooの答えのスクリプトは、シェルスクリプトとして書くこともできます:

macos=/Applications/Emacs.app/Contents/MacOS
if pgrep -qf 'Emacs.*--daemon'; then
  [[ $($macos/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))') = t ]] && args=-nc || args=-n
else
  $macos/Emacs --daemon
  args=-nc
fi
$macos/bin/emacsclient $args "$@"
open -a /Applications/Emacs.app

Platypusを使用して、スクリプトをアプリケーションとして保存できます。

Emacsを使い始めたばかりですが、セットアップがまったく異なります。私は、iTerm.appのコピーを作成し、Info.plistのCFBundleIdentifierを変更して、アプリケーションが異なる設定ファイルを使用するようにして、デフォルトのコマンドをに設定することにより、独自のEmacsアプリケーションを作成しました/usr/local/bin/emacs。に追加(server-start)~/.emacs、ログイン時にカスタムEmacsアプリケーションを開きます。Platypusを使用して実行するアプリケーションを作成し、emacsclient -n "$@";open -b my.emacsそれをテキストファイルのデフォルトアプリケーションにしました。


2

Lauriのソリューションとコメントからの提案を組み合わせることで、私の問題の大部分が解決されました。オンラインで見つけたものをつなぎ合わせたいくつかのApplescriptの下に貼り付けました。このスクリプトは、残っているしわを滑らかにするのに役立ちます。たとえば、現在のEmacsフレームがない場合、その動作は少し良くなります。

編集:スクリプトの目的は、Finderで.txtファイルに関連付けることです。

-- http://superuser.com/questions/457484/how-to-open-emacs-from-macs-finder
-- https://gist.github.com/ambethia/304964#comment-799519
on run {input}
    set filepath to quoted form of POSIX path of input
    tell application "Terminal"
        try
            -- we look for <= 2 because Emacs --daemon seems to always have an entry in visibile-frame-list even if there isn't
            set frameVisible to do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))'"
            if frameVisible is "t" then
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n " & filepath
            else
                -- there is a not a visible frame, launch one
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n " & filepath
            end if
        on error
            -- daemon is not running, start the daemon and open a frame     
            do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs --daemon"
            do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n"
        end try
    end tell

    -- bring the visible frame to the front
    tell application "Emacs" to activate

    return input
end run
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.