web-dev-qa-db-ja.com

OSXでのEmacsサーバーの基本セットアップ

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

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

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

9
kuzzooroo

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

使用するEmacsのバージョンに含まれているemacsclientバイナリを使用してください。たとえば、/Applications/Emacs.app/Contents/MacOS/bin/emacsclient、またはHomebrewでEmacsをインストールした場合は/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

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

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

10
Lri

コメントからの提案と組み合わされた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
2
kuzzooroo