Le emacsclient
programme autorise un indicateur --no-wait
(abrégé en -n
) qui amènera le serveur emacs à visiter le fichier spécifié et à revenir immédiatement.
emacsclient -n ~/.bashrc
Si je fournis un autre éditeur, cela fonctionnera toujours dans les cas où il n'y a pas de serveur Emacs en cours d'exécution
emacsclient -n -a "/usr/local/bin/emacs" ~/.bashrc
Cependant, cela me donne un comportement incohérent car dans les cas où le serveur est en cours d'exécution, cet appel reviendra immédiatement. Dans les cas où aucun serveur n'est en cours d'exécution et où l'éditeur alternatif est utilisé, l'appel devient un appel bloquant et ne reviendra pas tant que je ne quitterai pas Emacs.
Existe-t-il un moyen de dire emacs
(par opposition à emacsclient
) de créer un nouveau cadre, puis de revenir?
emacsclient
server
nispio
la source
la source
-a ''
option «Démarrer le démon Emacs et réessayer emacsclient»?-a ''
démarrera un démon au lieu d'un serveur. Ensuite, il essaie d'ouvrir un terminal Emacs, mais parce que j'ai fourni l'-n
option, il ne reste pas ouvert. Il rebondit juste sur la coque.Réponses:
La description
Le comportement par défaut lors de l'appel à emacsclient est un peu conservateur. Découvrez ce commentaire d' emacsclient.c :
D'après votre description et vos commentaires, il semble que vous essayez de démarrer le serveur Emacs à la demande tout en utilisant le
-n
drapeau. Le commentaire "par exemple" est ici pourquoiemacsclient -n -a '' FILE
ne satisfait pas ce que vous recherchez quand aucun serveur n'est en cours d'exécution.-a ''
logique démarre un démon.emacsclient
dit ensuite de créer un nouveau cadre de terminal, car c'est la valeur par défaut, sauf si vous évaluez elisp.-n
logique tue immédiatement cette nouvelle trame terminale.Si vous pouviez changer l'étape 2 pour créer un nouveau cadre graphique par défaut, alors vous
emacsclient -n -a '' FILE
feriez ce que vous voulez.Elisp Solution
Vous pouvez amener Emacs à créer un nouveau cadre graphique par défaut si vous conseillez la fonction
server-process-filter
comme ceci:Mettez-le dans votre fichier init, puis, comme dit,
emacsclient -n -a '' FILE
et Bob est votre oncle.Comparez avec Shell Solution
D'une part, je peux souligner quelques avantages à utiliser cette approche par défaut par rapport à l'utilisation du script suggéré par Archenoth
comme éditeur alternatif. Avec le defadvice:
save-buffers-kill-terminal
(C-x C-c
par défaut) se comporte de manière cohérente dans toutes les images. Cela ne tue jamais le processus Emacs, car chaque trame est toujours une trame client.find-grep
ce shell vers les processus externes se comportent mieux lorsque le terminal muet est là. Au moins, je ressens moins de maux de tête liés à l'échappement.D'un autre côté ... ouais.
Conclusion
Peut-être y a-t-il un compromis? C'est le mieux que j'ai pu trouver. Vous le définissez comme votre $ EDITOR.
la source
Je ne sais pas comment faire cela strictement dans Emacs, mais heureusement, il existe d'autres façons d'obtenir ce que vous décrivez.
Si vous n'avez pas quelque chose en vous
.emacs
pour démarrer un serveur, vous pouvez toujours créer un petit script qui démarre Emacs avec le fichier que vous souhaitez modifier et démarrer le serveur forké.Quelque chose comme:
Et puis passez ça à
-a
.Cependant ...
Si vous avez le démarrage du serveur dans votre
.emacs
, vous n'avez pas vraiment besoin de créer un script; vous avez une option un peu plus laconique:L'esperluette mettra en arrière-plan le processus et vous rendra instantanément votre coque, même lorsque Emacs démarre pour la première fois.
Vous devrez peut-être
disown
le processus si bash tue les travaux à la sortie. Si tel est le cas, vous ajoutez simplement undisown
à la fin:Sous Windows, l'équivalent le plus proche serait la
start
commande " " ...Ainsi, comme la suggestion de script ci-dessus, vous devrez probablement créer un fichier de commandes contenant quelque chose comme:
Et puis pointez l'
-a
argument.Cela devrait exécuter le fichier de commandes et revenir immédiatement après le démarrage d'Emacs avec le fichier approprié.
la source
&
j'ai été la première chose à essayer. Malheureusement, le texte suivant est envoyé àstderr
: et ensuite les borniers attendent la fin du processus:emacsclient: can't find socket; have you started the server? To start the server in Emacs, type "M-x server-start".
je suppose que laemacsclient
fourche est en arrière-plan, mais ensuite elle invoque celleemacs
qui s'ouvre au premier plan.emacs --eval '(server-start)' $* &
peut-être? De cette façon, le serveur démarre, vous obtenez votre terminal etemacsclient
dispose d'un serveur auquel il peut se connecter.emacs
manière normale. Il me semble que la plupart des gens n'auraient probablement pas cette configuration, c'est donc maintenant la première partie de la réponse. J'espère que cela aide..!