Emacsclient: un seul processus emacs tout le temps depuis le démarrage et jamais fermer et mieux masquer l'interface graphique

9

Étant donné qu'emacsclient peut gérer correctement le long temps de chargement des paquets, je veux vraiment garder au moins un processus emacs, et la plupart du temps un seul processus emacs , ouvert en tant que processus d'arrière-plan et mieux masquer l'interface graphique.

En ce moment, j'ai défini la fonction suivante dans .bashrc:

emc () 
{ 
    if [[ $# -eq 0 ]]; then
        emacs --eval "(suspend-frame)" &
        return
    fi
    args=($*);
    setsid emacsclient -c -e "(find-file \"${args[*]}\")"
}

Et aussi avoir la ligne suivante dans .bashrc:

emc

Donc, chaque fois que j'ouvre un shell, je vais finir par avoir un nouveau processus emacs.

Le problème est que j'aurai de nombreux processus emacs inutiles supplémentaires après avoir ouvert de nombreux shells. Cependant, je veux seulement maintenir un seul processus emacs tout le temps depuis le démarrage pour mieux masquer l'interface graphique .

phonycollectibles
la source
5
Je ne connais pas la pratique de emacs --eval "(suspend-frame)"plutôt que emacs --daemon( emacswiki.org/emacs/EmacsAsDaemon ). Y a-t-il une raison pour laquelle vous choisissez de ne pas invoquer emacs en tant que démon? Vous pouvez utiliser quelque chose comme pgrep -U `whoami` emacs || emacs --daemon &pour vous assurer qu'il fonctionne.
ebpa
Consultez les scripts de MJ Wall pour utiliser le client Emacs.
Tianxiang Xiong

Réponses:

13

Je le fais en démarrant un démon emacs lorsque je me connecte. L'endroit où vous placez cette commande dépend de votre gestionnaire de bureau. J'utilise i3, qui est configuré pour exécuter un script à la connexion qui comprend les éléments suivants:

emacs --daemon &

Avec cela, emacs s'exécute toujours en arrière-plan, et j'ouvre un nouveau client avec emacsclient -c -n, lié à un raccourci clavier pratique dans le gestionnaire de fenêtres. Si vous travaillez dans un terminal, vous n'avez besoin que d'un simple alias comme alias emc='emacsclient', éventuellement avec -n, -cou des -targuments, selon la façon dont vous l'utilisez.

Consultez les options pour emacsclient dans le manuel: ( (emacs) emacsclient Options , accessible depuis Emacs par C-h r m emacsclient options <enter>). Vous pouvez utiliser l' -aindicateur pour démarrer automatiquement un démon emacs s'il n'est pas déjà en cours d'exécution, -cou -tpour ouvrir un nouveau cadre ou client terminal, plutôt que de réutiliser un existant (dans la même session):

'-une commande'
'--alternate-editor = COMMAND'
     Spécifiez une commande à exécuter si «emacsclient» ne parvient pas à contacter Emacs.
     Ceci est utile lors de l'exécution de «emacsclient» dans un script.

     À titre d'exception spéciale, si COMMAND est la chaîne vide, alors
     'emacsclient' démarre Emacs en mode démon (comme 'emacs --daemon') et
     essaie ensuite de se reconnecter.

«-c»
'--create-frame'
     Créer un nouveau «cadre client» graphique, au lieu d'utiliser un existant
     Cadre Emacs. Voir ci-dessous pour le comportement spécial de «Cx C-c» dans un
     cadre client. Si Emacs ne peut pas créer un nouveau cadre graphique (par exemple,
     s'il ne peut pas se connecter au serveur X), il essaie de créer un texte
     trame client du terminal, comme si vous aviez fourni l'option '-t'
     au lieu.

'-t'
«--tty»
'-nw'
     Créez un nouveau cadre client sur le terminal de texte actuel, au lieu de
     en utilisant un cadre Emacs existant. Cela se comporte comme le «-c»
     , décrite ci-dessus, sauf qu'elle crée un terminal texte
     cadre (* remarque Terminaux non-fenêtre: :).
Tyler
la source
4

Si vous utilisez un système d'exploitation qui utilise le gestionnaire de services systemd (qui inclut de nos jours la plupart des distributions GNU / Linux), la meilleure solution pourrait être d'utiliser systemd pour démarrer votre démon Emacs au démarrage. Vous pouvez le faire en créant un fichier $HOME/.config/systemd/user/emacs.serviceavec le contenu suivant:

[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

Ensuite, vous devez démarrer le service et le configurer pour qu'il démarre automatiquement pour tous les futurs démarrages:

$ systemctl enable --user emacs
$ systemctl start --user emacs

Vous pouvez maintenant utiliser emacsclientcomme d'habitude. Si vous exécutez normalement avec les -n, -cou les -toptions, vous pouvez définir un alias dans votre shell. Vous pouvez également définir les variables d'environnement EDITORet / ou pour qu'elles VISUALs'exécutent emacsclientcomme vous l'aimez. Par exemple, dans Bash, vous pouvez ajouter les éléments suivants à votre .bashrcfichier:

alias emc="emacsclient -c"
export VISUAL="emacsclient -c"
export EDITOR="emacsclient -t"

Si jamais vous avez besoin d'arrêter le démon Emacs, vous pouvez le faire comme suit:

$ systemctl stop --user emacs

Et si vous voulez l'empêcher définitivement de s'exécuter au démarrage:

$ systemctl disable --user emacs
Psychonaut
la source
1
peut-être que ce lien vers EmacsWiki devrait être reconnu: EmacsAsDaemon
HongboZhu
0

La façon dont je le fais est assez similaire à une réponse précédente, en ayant un alias défini dans mon .bashrc pour emacs --daemon

alias ds="emacs --daemon"

En dehors de cela, j'ai un raccourci clavier ctrl-alt-Edéfini sur emacsclient -c. Lorsque je veux commencer à travailler sur emacs, j'ouvre un terminal et dssaisis et appelle chaque instance emacsclient avec mon raccourci.

J'espère que cela aide quelqu'un.

Nidish Narayanaa
la source