Configuration de base du serveur Emacs sous OSX

9

J'ai récemment acheté mon premier Mac en une décennie et je suis en train de le configurer. Je suis un utilisateur Emacs et j'ai déterminé que je veux juste des Emacs ordinaires et non des Aquamacs afin de pouvoir utiliser ma configuration existante à partir d'autres systèmes d'exploitation. J'ai essayé de suivre de nombreux tutoriels que j'ai trouvés en ligne (comme celui-ci , celui-ci et celui-ci sur le site à partir duquel j'ai téléchargé Emacs ), et j'ai essayé de combiner les pièces de plusieurs façons, mais je n'ai jamais a mis les choses dans un état s'approchant même de ce à quoi je suis habitué / j'espère:

  1. Un démon Emacs démarre en cours d'exécution au démarrage ou dès que j'en ai besoin ; n'importe quel. Toutes les nouvelles trames Emacs sont soutenues par le même serveur.
  2. Lorsque j'ouvre un fichier texte à partir du Finder, le fichier s'ouvre dans Emacs, dans un cadre graphique existant si possible.
  3. Si j'exécute Emacs.app, le système réutilise le démon emacs qui s'exécute en arrière-plan au lieu de démarrer une nouvelle instance et d'ouvrir une nouvelle fenêtre dessus. ( pointe du chapeau )
  4. Lorsque j'exécute Emacs à partir d'un terminal, le terminal vaque à ses affaires sans attendre que je termine avec Emacs (sauf si j'utilise '-nw')
  5. AFAIK à aucun moment au cours des opérations décrites ci-dessus, Emacs ne devrait se retrouver dans un état ("mode d'édition de serveur?") Où il m'attend pour taper C-x #, bien que je n'ai pas une compréhension approfondie de celui-ci.
  6. (Je considérerais cela comme un bonus) Il existe un moyen pour moi d'invoquer Emacs à partir d'un terminal afin qu'Emacs réutilise un cadre existant si possible.

Comment pourrais-je configurer Emacs pour qu'il se comporte comme ça?

Je suis particulièrement perplexe en amenant le Finder à ouvrir les choses dans Emacs comme je le souhaite (# 2), car les guides que j'ai trouvés créent généralement un certain nombre d'alias, d'Applescripts, de scripts bash, etc. et je ne suis pas sûr que je veux dire au Finder d'utiliser pour ouvrir des fichiers texte.

Merci!

A. @lawlist demande: "Un nouveau cadre est-il ouvert par défaut lorsque vous ouvrez un nouveau fichier à partir du terminal même s'il existe un cadre existant?" La réponse est que si je démarre un serveur au démarrage comme décrit ici , ouvre un cadre, puis ouvre un fichier en tapant /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, je peux obtenir le fichier à ouvrir dans un cadre existant. S'il n'y a aucun cadre actuellement ouvert, je dois utiliser "-nc" ou lorsque j'essaye d'ouvrir un fichier, rien ne se passe.

B. @lawlist demande: "Voulez-vous que le démon s'exécute à la connexion, ou serait-il suffisant de charger Emacs manuellement après la connexion?" Courir manuellement serait bien.

kuzzooroo
la source
Pouvez-vous les numéroter s'il vous plaît, 1, 2, 3, 4, 5, 6 et peut-être 7 et 8. En outre, un nouveau cadre est ouvert par défaut lorsque vous ouvrez un nouveau fichier à partir du terminal même s'il existe un cadre existant ? Je connais certaines des réponses, mais pas toutes - donc les chiffres pour les questions seraient utiles. Souhaitez-vous que le démon s'exécute lors de la connexion, ou serait-il suffisant de charger Emacs manuellement après la connexion?
lawlist
@Lauri Ranta a une bonne réponse. M-x server-startdémarrera manuellement le serveur afin de emacsclientpouvoir communiquer avec lui. J'ai placé (server-start)mon init.elfichier au lieu d'utiliser un démon à la connexion - cependant, beaucoup de gens préfèrent l'option de connexion au démon. Et bien sûr, le .emacsfichier serait un endroit approprié pour (server-start).
Lawlist
En ce qui concerne l'ouverture de fichiers à partir du Finder, je suppose que vous êtes bien au-delà du stade d'avoir besoin de quelque chose comme ceci: dummies.com/how-to/content/… Donc, en supposant que ce n'est pas le cas, alors vous allez probablement être très bien avec ns-find-file- qui est activé automatiquement lorsqu'un fichier est associé à Emacs.app. Ma fonction de fichier d'interception dans les liens ci-dessus modifie également ns-find-filesi c'est quelque chose qui vous intéresse. Bien sûr, vous avez besoin de construire Emacs --with-ns.
lawlist

Réponses:

10

Pour que Emacs.app ouvre des fichiers dans un cadre existant au lieu d'un nouveau cadre, ajoutez-le (setq ns-pop-up-frames nil)à un fichier de configuration comme ~/.emacs.

Vous pouvez ouvrir un fichier depuis un terminal avec open -a emacs fileou emacsclient -n file. Si Emacs.app n'est pas ouvert mais qu'il y a un Emacs --daemonprocessus, pour une raison quelconque, emacsclient -n filecela ne fonctionne pas mais le emacsclient -nc filefait.

Assurez-vous d'utiliser le emacsclientbinaire inclus avec la version d'Emacs que vous utilisez, comme /Applications/Emacs.app/Contents/MacOS/bin/emacsclient, ou /usr/local/bin/emacsclientsi vous avez installé Emacs avec Homebrew.

Pour démarrer un serveur Emacs à la connexion, par exemple enregistrez cette liste sous ~/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>

Le plist est chargé automatiquement la prochaine fois que vous vous connectez, mais vous pouvez le charger immédiatement en exécutant launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist.

Edit: je ne sais toujours pas pourquoi les gens associent des types de fichiers à une application AppleScript au lieu de simplement Emacs.app. Le script dans la réponse de kuzzooroo pourrait également être écrit comme un script 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

Vous pouvez utiliser Platypus pour enregistrer le script en tant qu'application:

Je viens de commencer à utiliser Emacs, mais j'ai une configuration complètement différente. J'ai créé ma propre application Emacs en faisant une copie de iTerm.app, en changeant le CFBundleIdentifier dans Info.plist pour que l'application utilise un fichier de préférences différent et en définissant la commande par défaut sur /usr/local/bin/emacs. J'ai ajouté (server-start)à ~/.emacset j'ouvrir l'application Emacs personnalisé lors de la connexion. J'ai utilisé Platypus pour créer une application qui fonctionne emacsclient -n "$@";open -b my.emacset j'en ai fait l'application par défaut pour les fichiers texte.

Lri
la source
2

La solution de Lauri combinée aux suggestions des commentaires ont largement répondu à mes problèmes. J'ai collé ci-dessous un Applescript que j'ai assemblé à partir de choses que j'ai trouvées en ligne. Le script permet de lisser certaines rides restantes, par exemple, son comportement est un peu meilleur s'il n'y a pas de trame Emacs actuelle.

EDIT: le but du script est d'être associé aux fichiers .txt dans le 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
kuzzooroo
la source