Grundeinstellung des Emacs-Servers unter OSX

9

Ich habe kürzlich meinen ersten Mac seit einem Jahrzehnt gekauft und bin dabei, ihn zu konfigurieren. Ich bin ein Emacs-Benutzer und habe festgestellt, dass ich nur normale Emacs und keine Aquamacs verwenden möchte, damit ich meine vorhandene Konfiguration von anderen Betriebssystemen aus verwenden kann. Ich habe versucht, viele Anleitungen zu befolgen, die ich online gefunden habe (wie diese , diese und diese von der Site, von der ich Emacs heruntergeladen habe ), und habe versucht, die Teile auf verschiedene Arten zu kombinieren, aber noch nie Dinge in einen Zustand gebracht, der sich sogar dem nähert, was ich gewohnt bin / auf das ich gehofft habe:

  1. Ein Emacs-Daemon wird entweder beim Start oder sobald ich ihn benötige ausgeführt . entweder ist in Ordnung. Alle neuen Emacs-Frames werden von demselben Server unterstützt.
  2. Wenn ich eine Textdatei über den Finder öffne, wird die Datei in Emacs geöffnet, wenn möglich in einem vorhandenen grafischen Rahmen.
  3. Wenn ich Emacs.app ausführe, verwendet das System den im Hintergrund ausgeführten Emacs-Daemon erneut, anstatt eine neue Instanz zu starten und ein neues Fenster darauf zu öffnen. ( Hutspitze )
  4. Wenn ich Emacs von einem Terminal aus starte, erledigt das Terminal seine Geschäfte, ohne darauf zu warten, dass ich mit Emacs fertig bin (es sei denn, ich verwende '-nw').
  5. AFAIK sollte Emacs zu keinem Zeitpunkt während der oben beschriebenen Vorgänge in einem Zustand ("Server-Bearbeitungsmodus?") Befinden, in dem ich auf die Eingabe warte C-x #, obwohl ich kein tiefes Verständnis für diesen habe.
  6. (Ich würde dies als Bonus betrachten.) Es gibt eine Möglichkeit für mich, Emacs von einem Terminal aus aufzurufen, damit Emacs einen vorhandenen Frame nach Möglichkeit wiederverwendet.

Wie könnte ich Emacs so konfigurieren, dass es sich so verhält?

Ich bin besonders ratlos, wenn ich den Finder dazu bringe, Dinge in Emacs so zu öffnen, wie ich es möchte (# 2), da die Anleitungen, die ich gefunden habe, im Allgemeinen eine Reihe von Aliasnamen, Applescripts, Bash-Skripten usw. erstellen und ich nicht sicher bin Ich möchte dem Finder mitteilen, dass er zum Öffnen von Textdateien verwendet werden soll.

Vielen Dank!

A. @lawlist fragt: "Wird standardmäßig ein neuer Frame geöffnet, wenn Sie eine neue Datei vom Terminal aus öffnen, obwohl ein Frame vorhanden ist?" Die Antwort lautet: Wenn ich einen Server wie hier beschrieben beim Start starte , einen Frame öffne und dann eine Datei durch Eingabe öffne /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, kann ich die Datei in einem vorhandenen Frame öffnen. Wenn derzeit kein Frame geöffnet ist, muss ich "-nc" verwenden oder wenn ich versuche, eine Datei zu öffnen, passiert nichts.

B. @lawlist fragt: "Möchten Sie, dass der Dämon beim Anmelden ausgeführt wird, oder reicht es aus, Emacs nach dem Anmelden manuell zu laden?" Manuell laufen wäre in Ordnung.

kuzzooroo
quelle
Können Sie sie bitte nummerieren, 1, 2, 3, 4, 5, 6 und vielleicht 7 und 8. Außerdem wird standardmäßig ein neuer Frame geöffnet, wenn Sie eine neue Datei vom Terminal aus öffnen, obwohl ein Frame vorhanden ist ? Ich kenne einige der Antworten, aber nicht alle - daher wären Zahlen für die Fragen hilfreich. Möchten Sie, dass der Dämon bei der Anmeldung ausgeführt wird, oder reicht es aus, Emacs nach der Anmeldung manuell zu laden?
Lawlist
@Lauri Ranta hat eine gute Antwort. M-x server-startstartet den Server manuell, emacsclientdamit er mit ihm kommunizieren kann. Ich habe (server-start)in meine init.elDatei eingefügt, anstatt beim Anmelden einen Daemon zu verwenden. Viele Benutzer bevorzugen jedoch die Anmeldeoption für den Daemon. Und natürlich .emacswäre die Datei ein geeigneter Ort für (server-start).
Lawlist
In Bezug auf das Öffnen von Dateien aus dem Finder gehe ich davon aus, dass Sie weit über das Stadium hinausgehen, in dem Sie so etwas benötigen: dummies.com/how-to/content/… Wenn Sie also davon ausgehen, dass dies nicht im Weg ist, werden Sie wahrscheinlich gehen in Ordnung zu sein ns-find-file- wird automatisch aktiviert, wenn eine Datei mit Emacs.app verknüpft ist. Meine Intercept-Datei-Funktion in den obigen Links ändert sich auch, ns-find-filewenn Sie daran interessiert sind. Natürlich muss Emacs gebaut werden --with-ns.
Lawlist

Antworten:

10

Fügen Sie (setq ns-pop-up-frames nil)einer Konfigurationsdatei wie z ~/.emacs. B. Emacs.app Dateien in einem vorhandenen Frame anstelle eines neuen Frames öffnen .

Sie können eine Datei von einem Terminal mit open -a emacs fileoder öffnen emacsclient -n file. Wenn Emacs.app nicht geöffnet ist, aber ein Emacs --daemonProzess vorliegt , emacsclient -n filefunktioniert dies aus irgendeinem Grund nicht emacsclient -nc file.

Stellen Sie sicher, dass Sie die emacsclientBinärdatei verwenden, die in der von Ihnen verwendeten Emacs-Version enthalten ist /Applications/Emacs.app/Contents/MacOS/bin/emacsclient, oder /usr/local/bin/emacsclientwenn Sie Emacs mit Homebrew installiert haben.

Um einen Emacs-Server bei der Anmeldung zu starten, speichern Sie diese Liste beispielsweise wie folgt ~/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>

Die Liste wird beim nächsten Anmelden automatisch geladen, Sie können sie jedoch sofort durch Ausführen laden launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist.

Bearbeiten: Ich weiß immer noch nicht, warum Leute Dateitypen mit einer AppleScript-Anwendung anstatt nur mit Emacs.app verknüpfen. Das Skript in der Antwort von kuzzooroo könnte jedoch auch als Shell-Skript geschrieben werden:

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

Sie können Platypus verwenden , um das Skript als Anwendung zu speichern:

Ich habe gerade angefangen, Emacs zu verwenden, aber ich habe ein völlig anderes Setup. Ich habe meine eigene Emacs-Anwendung erstellt, indem ich eine Kopie von iTerm.app erstellt, den CFBundleIdentifier in der Info.plist so geändert habe, dass die Anwendung eine andere Voreinstellungsdatei verwendet, und den Standardbefehl auf gesetzt habe /usr/local/bin/emacs. Ich habe hinzugefügt (server-start)zu ~/.emacsund ich öffne die benutzerdefinierte Emacs Anwendung bei der Anmeldung. Ich habe Platypus verwendet, um eine Anwendung zu erstellen, die ausgeführt wird, emacsclient -n "$@";open -b my.emacsund sie zur Standardanwendung für Textdateien gemacht.

Lri
quelle
2

Lauris Lösung in Kombination mit den Vorschlägen aus den Kommentaren hat meine Probleme weitgehend gelöst. Ich habe unten ein Applescript eingefügt, das ich aus Sachen zusammengefügt habe, die ich online gefunden habe. Das Skript hilft dabei, einige verbleibende Falten auszugleichen, z. B. ist das Verhalten etwas besser, wenn kein aktueller Emacs-Frame vorhanden ist.

BEARBEITEN: Der Zweck des Skripts besteht darin, TXT-Dateien im Finder zuzuordnen.

-- 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
kuzzooroo
quelle