Emacs ouvre les fichiers dans un nouveau cadre lorsqu'il est ouvert avec «open -a»

20

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 emacsclientlequel 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 --daemonprocessus 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 -afonctionne beaucoup mieux, à l'exception de ce problème que je décrirai ci-dessous:

Utilisation open -acomme 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 --argscommutateur 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 opencommunique 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 Messagestampon? 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!

michiakig
la source
Je ne connais rien à OSX donc je ne peux rien fournir de concret. Si je devais déboguer cela, cependant, je jetterais une erreur de syntaxe find-file, puis je définirais debug-on-errort et vérifierais la trace de la pile pour savoir comment Emacs est invoqué. Ajouter une erreur à find-filepourrait être aussi simple que de copier la définition de la fonction dans le tampon de scratch lisp et d'y ajouter un appel error(par exemple (error "cause stack trace"). NE JAMAIS CHANGER LE FICHIER DE SOURCE POUR find-file- faites toujours cela dans un scratch scratch!
Joe Casadonte
@Joe Merci! C'est une assez bonne idée, je vais m'en souvenir pour l'avenir. En fait, j'ai fini par essayer de réutiliser emacsclient, et commencer avec (server-start)mon init.elsemble fonctionner mieux qu'au emacs --daemondémarrage, c'est ce que j'avais essayé la première fois emacsclient.
michiakig

Réponses:

26

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:

(setq ns-pop-up-frames nil)

dans le fichier .emacs.

Très heureux d'avoir trouvé ça.

Colin
la source
C'était très utile! Avec un alias, les open -a /Applications/Emacs.app $1choses semblent bien fonctionner! Notez que je démarre le serveur dans mon init, pour avoir emacs disponible pour git par exemple.
Dror