Grundlegende Einrichtung des Emacs-Servers unter OSX

Grundlegende Einrichtung des Emacs-Servers unter OSX

Ich habe mir vor kurzem meinen ersten Mac seit zehn Jahren gekauft und bin gerade dabei, ihn zu konfigurieren. Ich bin ein Emacs-Benutzer und habe beschlossen, dass ichnur normaler Emacsnicht Aquamacs, damit ich meine vorhandene Konfiguration von anderen Betriebssystemen verwenden kann. Ich habe versucht, viele Anleitungen zu befolgen, die ich online gefunden habe (wieDieses hier,Dieses hierUnddieses hier von der Site, von der ich Emacs heruntergeladen habe) und habe versucht, die Teile auf unterschiedliche Weise zu kombinieren, habe es aber nie geschafft, einen Zustand zu erreichen, der auch nur annähernd dem entspricht, was ich gewohnt bin/auf das ich hoffe:

  1. Ein Emacs-Daemon wird entwederam Anfangodersobald ich es brauche; beides ist in Ordnung. Alle neuen Emacs-Frames werden vom selben Server unterstützt.
  2. Wenn ich eine Textdatei aus dem 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 laufenden 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, führt das Terminal seine Arbeit aus, ohne zu warten, bis ich mit Emacs fertig bin (es sei denn, ich verwende „-nw“).
  5. Soweit ich weiß, sollte Emacs während der oben beschriebenen Vorgänge zu keinem Zeitpunkt in einen Zustand („Server-Bearbeitungsmodus?“) geraten, in dem er darauf wartet, dass ich eingebe C-x #, obwohl ich davon keine tieferen Kenntnisse habe.
  6. (Ich würde dies als Bonus betrachten) Es gibt für mich eine Möglichkeit, Emacs von einem Terminal aus aufzurufen, sodass Emacs nach Möglichkeit einen vorhandenen Frame wiederverwendet.

Wie kann ich Emacs so konfigurieren, dass es sich so verhält?

Besonders ratlos bin ich darüber, wie ich den Finder dazu bringen kann, 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, welche ich dem Finder zum Öffnen von Textdateien mitteilen möchte.

Danke!

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

B.@lawlist fragt: „Möchten Sie, dass der Daemon beim Login ausgeführt wird, oder reicht es aus, Emacs nach dem Login manuell zu laden?“ Das manuelle Ausführen wäre in Ordnung.

Antwort1

Damit Emacs.app Dateien in einem vorhandenen Frame statt in einem neuen Frame öffnet, fügen Sie (setq ns-pop-up-frames nil)einer Konfigurationsdatei wie hinzu ~/.emacs.

Sie können eine Datei von einem Terminal aus mit open -a emacs fileoder öffnen. Wenn Emacs.app nicht geöffnet ist, aber ein Prozess emacsclient -n filevorhanden ist , funktioniert es aus irgendeinem Grund nicht, funktioniert aber.Emacs --daemonemacsclient -n fileemacsclient -nc file

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

Um beim Anmelden einen Emacs-Server zu starten, speichern Sie beispielsweise diese plist als ~/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 plist wird bei Ihrer nächsten Anmeldung automatisch geladen, Sie können sie jedoch sofort laden, indem Sie ausführen launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist.

Bearbeiten: Ich weiß immer noch nicht, warum Leute Dateitypen mit einer AppleScript-Anwendung verknüpfen und nicht nur mit Emacs.app. Das Skript in kuzzooroos Antwort 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önnenSchnabeltierum 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 geändert habe, sodass die Anwendung eine andere Einstellungsdatei verwendet, und den Standardbefehl auf gesetzt habe /usr/local/bin/emacs. Ich habe hinzugefügt (server-start)und ~/.emacsöffne die benutzerdefinierte Emacs-Anwendung beim Anmelden. Ich habe Platypus verwendet, um eine lauffähige Anwendung zu erstellen emacsclient -n "$@";open -b my.emacs, und habe sie zur Standardanwendung für Textdateien gemacht.

Antwort2

Lauris Lösung und die Vorschläge aus den Kommentaren haben meine Probleme weitgehend gelöst. Ich habe unten ein Applescript eingefügt, das ich aus Material zusammengestückelt habe, das ich online gefunden habe. Das Skript hilft, einige verbleibende Probleme zu beseitigen. Beispielsweise ist sein Verhalten etwas besser, wenn kein aktueller Emacs-Frame vorhanden ist.

BEARBEITEN: Der Zweck des Skripts besteht darin, im Finder mit TXT-Dateien verknüpft zu werden.

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

verwandte Informationen