Configurazione di base del server Emacs sotto OSX


9

Di recente ho acquistato il mio primo Mac in un decennio e sono in procinto di configurarlo. Sono un utente Emacs e ho deciso di voler solo Emacs regolari e non Aquamacs in modo da poter utilizzare la mia configurazione esistente da altri sistemi operativi. Ho provato a seguire molte how-to che ho trovato online (come questo , questo e questo dal sito da cui ho scaricato Emacs ), e ho provato a combinare i pezzi in vari modi, ma non ho mai ho portato le cose in uno stato anche avvicinandomi a ciò a cui sono abituato / sperando:

  1. Un demone Emacs inizia a funzionare all'avvio o appena ne ho bisogno ; o va bene. Tutti i nuovi frame Emacs sono supportati dallo stesso server.
  2. Quando apro un file di testo dal Finder, il file si apre in Emacs, se possibile in una cornice grafica esistente.
  3. Se eseguo Emacs.app, il sistema riutilizza il demone emacs in esecuzione in background invece di avviare una nuova istanza e aprirne una nuova. ( punta del cappello )
  4. Quando eseguo Emacs da un terminale, il terminale fa i suoi affari senza aspettare che finisca con Emacs (a meno che io non usi "-nw")
  5. AFAIK in nessun momento durante le operazioni sopra descritte Emacs dovrebbe finire in uno stato ("modalità di modifica del server?") In cui mi sta aspettando di digitare C-x #, anche se non ho una profonda comprensione di questo.
  6. (Lo considero un bonus) C'è un modo per me di invocare Emacs da un terminale in modo che Emacs riutilizzi un frame esistente, se possibile.

Come posso configurare Emacs per comportarsi in questo modo?

Sono particolarmente perplesso nel far sì che il Finder apra le cose in Emacs nel modo che desidero (n. 2), dal momento che le guide che ho trovato generalmente creano un certo numero di alias, script di Apple, script di bash, ecc. E non sono sicuro che voglio dire al Finder da usare per aprire i file di testo.

Grazie!

A. @lawlist chiede "Viene aperto un nuovo frame per impostazione predefinita quando si apre un nuovo file dal terminale anche se esiste un frame esistente?" La risposta è che se avvio un server all'avvio come descritto qui , apro un frame e quindi apro un file digitando /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, posso ottenere il file da aprire in un frame esistente. Se non ci sono frame attualmente aperti devo usare "-nc" o quando provo ad aprire un file non succede nulla.

B. @lawlist chiede: "Vuoi che il demone sia in esecuzione al login, o sarebbe sufficiente caricare Emacs manualmente dopo il login?" L'esecuzione manuale andrebbe bene.


Puoi numerarli per favore, 1, 2, 3, 4, 5, 6 e forse 7 e 8. Inoltre, un nuovo frame viene aperto per impostazione predefinita quando si apre un nuovo file dal terminale anche se esiste un frame esistente ? Conosco alcune delle risposte, ma non tutte - quindi i numeri per le domande sarebbero utili. Vuoi che il demone sia in esecuzione al login o sarebbe sufficiente caricare manualmente Emacs dopo il login?
elenco delle leggi

@Lauri Ranta ha una buona risposta. M-x server-startavvierà manualmente il server in modo che emacsclientpossa comunicare con esso. Ho inserito il (server-start)mio init.elfile invece di utilizzare un demone al momento del login - tuttavia, molte persone preferiscono l'opzione di accesso al demone. E, naturalmente, il .emacsfile sarebbe un posto adatto per (server-start).
elenco delle leggi

Per quanto riguarda l'apertura dei file da Finder, presumo che tu sia ben oltre la fase di aver bisogno di qualcosa del genere: dummies.com/how-to/content/… Quindi, supponendo che sia fuori mano, allora probabilmente stai andando va bene con ns-find-file- che si attiva automaticamente quando un file è associato a Emacs.app. La mia funzione di intercettazione del file nei collegamenti sopra modifica anche ns-find-filese questo è qualcosa che ti interessa. Certo, hai bisogno di Emacs costruito --with-ns.
elenco legislativo

Risposte:


10

Per fare in modo che Emacs.app apra i file in un frame esistente anziché in un nuovo frame, aggiungi (setq ns-pop-up-frames nil)a un file di configurazione come ~/.emacs.

È possibile aprire un file da un terminale con open -a emacs fileo emacsclient -n file. Se Emacs.app non è aperto ma esiste un Emacs --daemonprocesso, per qualche motivo emacsclient -n filenon funziona ma emacsclient -nc filefunziona.

Assicurati di usare il emacsclientbinario incluso con la versione di Emacs che usi, come /Applications/Emacs.app/Contents/MacOS/bin/emacsclient, o /usr/local/bin/emacsclientse hai installato Emacs con Homebrew.

Per avviare un server Emacs al momento del login, ad esempio salvare questo plist come ~/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>

Il plist viene caricato automaticamente al successivo accesso, ma è possibile caricarlo immediatamente eseguendolo launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist.

Modifica: non so ancora perché le persone associno i tipi di file a un'applicazione AppleScript anziché a Emacs.app. La sceneggiatura nella risposta di kuzzooroo potrebbe anche essere scritta come una shell shell:

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

Puoi usare Platypus per salvare lo script come un'applicazione:

Ho appena iniziato a utilizzare Emacs, ma ho una configurazione completamente diversa. Ho creato la mia applicazione Emacs facendo una copia di iTerm.app, modificando CFBundleIdentifier in Info.plist in modo che l'applicazione utilizzi un file di preferenze diverso e impostando il comando predefinito su /usr/local/bin/emacs. Ho aggiunto (server-start)al ~/.emacse ho aprire l'applicazione Emacs personalizzati login. Ho usato Platypus per creare un'applicazione in esecuzione emacsclient -n "$@";open -b my.emacse l'ho resa l'applicazione predefinita per i file di testo.


2

La soluzione di Lauri unita ai suggerimenti dei commenti hanno ampiamente risolto i miei problemi. Ho incollato qui sotto alcuni appunti di Apple che ho cucito insieme da cose che ho trovato online. Lo script aiuta a appianare alcune rughe rimanenti, ad esempio, il suo comportamento è un po 'migliore se non ci sono frame Emacs correnti.

EDIT: lo scopo dello script è di essere associato ai file .txt nel Finder.

-- 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.