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

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

私は最近10年ぶりにMacを購入し、設定中です。私はEmacsユーザーで、通常のEmacsAquamacsではなく、他のオペレーティングシステムの既存の設定を使用できる。オンラインで見つけた多くのハウツーに従って試してみた(例えばこれですこれですそしてこれはEmacsをダウンロードしたサイトからのものです)、そしてさまざまな方法でピースを組み合わせてみましたが、私が慣れている/期待している状態に近づくことすらできませんでした。

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

Emacs をこのように動作させるにはどうすればよいでしょうか?

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

ありがとう!

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

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

答え1

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は機能します。

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

ログイン時に 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

使用できますカモノハシスクリプトをアプリケーションとして保存するには:

私は最近 Emacs を使い始めたのですが、セットアップがまったく異なります。iTerm.app のコピーを作成し、Info.plist の CFBundleIdentifier を変更してアプリケーションが別の設定ファイルを使用するようにし、デフォルトのコマンドを に設定して、独自の Emacs アプリケーションを作成しました。を に/usr/local/bin/emacs追加し、ログイン時にカスタム Emacs アプリケーションを開きます。実行するアプリケーションを作成するために Platypus を使用し、それをテキスト ファイルのデフォルト アプリケーションにしました。(server-start)~/.emacsemacsclient -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

関連情報