Je veux être en mesure d'invoquer Emacs à partir de la ligne de commande et de démarrer Emacs graphique s'il n'est pas en cours d'exécution ou de visiter un fichier dans un Emacs déjà en cours d'exécution. J'ai essayé de faire cela avec emacsclient
lequel je sais que c'est la "bonne" façon de le faire, mais j'ai eu beaucoup de problèmes avec cela sur OS X, il se bloquerait au hasard, ou le emacs --daemon
processus se bloquerait lors de l'arrêt ou du redémarrage de la machine, et la desquamation générale. Bien que j'aimerais que cela fonctionne, pour le moment, cela open -a
fonctionne beaucoup mieux, à l'exception de ce problème que je décrirai ci-dessous:
Utilisation open -a
comme ceci:
$ open -a Emacs file.txt
démarrera Emacs s'il n'est pas en cours d'exécution et visitera le fichier. Mais si je le fais alors que le tampon actuel n'est pas *scratch*
le fichier est ouvert dans un nouveau cadre (c'est-à-dire une nouvelle fenêtre système).
Voici un exemple de session:
$ open -a Emacs file.txt
Cela démarre Emacs et ouvre file.txt, donc il y a une seule image avec ce tampon dedans. Si je passe au *scratch*
tampon et fais ceci:
$ open -a Emacs file1.txt
Il ouvre ce fichier dans le même cadre. Maintenant, il y a un seul cadre avec ce fichier ouvert, et si je fais cela:
$ open -a Emacs file2.txt
Il ouvre un nouveau cadre, résultant en deux cadres ouverts à la fois.
J'ai essayé de jouer avec les arguments de ligne de commande à Emacs en utilisant le --args
commutateur vers open
, mais cela ne semble pas fonctionner pour les appels suivants, par exemple:
$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'
Cela n'imprime que "foo" dans le tampon de messages ... la deuxième fois Emacs est juste mis au premier plan mais aucun message n'est imprimé.
Je ne sais pas comment open
communique avec les applications qui sont déjà en cours d'exécution, est-ce que quelqu'un sait comment je pourrais le savoir? Ou existe-t-il un moyen d'obtenir un journal beaucoup plus détaillé de ce qui se passe que le Messages
tampon? Rien d'intéressant n'est imprimé sur ce tampon pendant la session ci-dessus, donc je ne sais pas comment je pourrais pirater quelques Emacs Lisp pour faire ce que je veux ...
Merci!
find-file
, puis je définiraisdebug-on-error
t et vérifierais la trace de la pile pour savoir comment Emacs est invoqué. Ajouter une erreur àfind-file
pourrait être aussi simple que de copier la définition de la fonction dans le tampon de scratch lisp et d'y ajouter un appelerror
(par exemple(error "cause stack trace")
. NE JAMAIS CHANGER LE FICHIER DE SOURCE POURfind-file
- faites toujours cela dans un scratch scratch!emacsclient
, et commencer avec(server-start)
moninit.el
semble fonctionner mieux qu'auemacs --daemon
démarrage, c'est ce que j'avais essayé la première foisemacsclient
.Réponses:
La réponse est ici: variable emacs pour "ouvrir avec" dans le cadre d'origine
Il s'agit d'une modification des paramètres par défaut dans les nouvelles versions d'emacs. Ajouter:
dans le fichier .emacs.
Très heureux d'avoir trouvé ça.
la source
open -a /Applications/Emacs.app $1
choses semblent bien fonctionner! Notez que je démarre le serveur dans mon init, pour avoir emacs disponible pour git par exemple.