Démarrez deux démons emacs distincts pour la console et l'interface graphique

14

En général, je démarre emacs avec l'interface graphique et je démarre immédiatement un serveur avec (server-start). Maintenant, je peux facilement ouvrir des documents dans ma session emacs existante depuis le terminal via emacsclient -n <file>ou depuis le navigateur de fichiers.

De temps en temps, cependant, je veux exécuter emacs dans mon terminal en utilisant emacsclient -t. Cela se produit le plus souvent lors de l'écriture de journaux de validation git ou lors de l'exécution de très petites tâches. Dans ces cas, le fait que mon fichier init ait été chargé dans une instance GUI d'emacs signifie que je n'obtiens aucune de mes personnalisations spécifiques aux emacs TTY.

Je sais que je peux courir

emacs -nw -q -l "some-custom-init-file.el"

mais cela rechargera tous les packages à chaque fois. Puis-je avoir le meilleur des deux mondes? Existe-t-il un moyen de configurer un "démon TTY" afin que je puisse utiliser des personnalisations distinctes pour exécuter à l'intérieur du terminal par rapport à la visite du fichier dans une fenêtre emacs existante?

nispio
la source
1
Pouvez-vous citer un exemple de vos personnalisations différentes entre le mode TTY et le mode GUI?
stsquad
1
@stsquad Un très simple est que j'utilise une frange gauche en mode GUI, mais comme la frange n'existe pas en mode TTY, il n'y a pas d'espace entre les numéros de ligne et le texte. Cela peut être résolu avec (setq linum-format "%d ")dans le fichier de personnalisation TTY. De plus, mon thème de couleur semble toujours étrange en mode TTY, donc je vais certainement choisir un thème différent pour le TTY. En fait, je n'ai pas beaucoup de différences pour le moment, mais maintenant que je sais que je peux avoir différents serveurs, la liste peut s'allonger.
nispio
@nispio: Je vous suggère M-x report-emacs-buget demande de nouvelles fonctionnalités telles que la possibilité d'avoir différents thèmes de visage dans les cadres TTY et GUI (en fait, un thème peut spécifier des couleurs complètement différentes pour ces différents types de cadres, vous pouvez donc également ajuster votre thème) . L'utilisation de plusieurs démons pour ces cas distincts n'est qu'une solution de contournement pour un manque de fonctionnalités correspondantes dans Emacs.
Stefan

Réponses:

14

Permet emacs --daemon=your-server-name -l "custom-init-file"de démarrer un nouveau serveur et de emacsclient -nw -s your-server-names'y connecter à partir du terminal lui-même. La section sur l'utilisation d'Emacs comme serveur dans le manuel contient plus d'options d'initialisation.

Vamsi
la source
Cela marche! Existe-t-il un bon moyen de tuer un serveur démarré de cette façon en plus de rechercher et de supprimer le fichier serveur?
nispio
(J'ai dû ajouter un -qcommutateur pour empêcher mon init.elexécution par défaut de s'exécuter avant le fichier d'initialisation personnalisé.)
nispio
2
Est - emacsclient -s your-server-name -e "(kill-emacs)"ce que vous voulez? Ce qui précède appelle juste emacsclient et evals (kill-emacs). Vous pouvez également remplacer (kill-emacs)par (save-buffers-kill-emacs).
Vamsi
J'avais l'habitude d'avoir un init.el commun pour les emacs terminaux et gui et chargé des fichiers personnalisés séparés pour les personnalisations individuelles. Par conséquent, j'ai raté le-q
Vamsi
1
Ces solutions ont également résolu un problème que j'avais lors de l'utilisation de 'emacsclient -t' avec mutt et, dans un espace de travail séparé, 'emacsclient -c'. Autrement dit: le démon plantait lorsque 'emacsclient -c' était lancé avant 'emacsclient -t'. Merci, Vamsi
Boccaperta-IT
9

En plus de la réponse de @ Vamsi, vous pouvez bénéficier des mêmes avantages tout en n'exécutant qu'un seul serveur en joignant des conseils à make-frame-command.

Par exemple, lors de l'exécution dans le terminal, je veux que la couleur d'arrière-plan soit black(qui correspond à #202020) mais je veux l'utiliser #202020en mode graphique. J'ai implémenté cela avec:

(defadvice make-frame-command (after make-frame-change-background-color last activate)
  "Adjusts the background color for different frame types. 
Graphical (X) frames should have the theme color, while terminal frames should match the terminal color (which matches the theme color...but terminal frames can't directly render this color)"
    (if (display-graphic-p)
        (set-background-color "#202020")
      (set-background-color "black")))

Vous pouvez obtenir beaucoup de kilométrage de cette utilisation make-variable-frame-local( set-background-colordans ce qui précède est déjà cadre local).

Je ne sais pas si c'est le meilleur modèle, mais si vous avez relativement peu de différences entre Emacs en mode TTY et en mode X, cela peut faciliter la gestion de la configuration.

Le code ci - dessus a été tiré de mon .emacs.d .

J David Smith
la source
Je me demandais s'il y avait un moyen de "détecter" le mode dans lequel je me trouvais par image.
nispio
1
Ça va le faire. (display-graphic-p)donne tsi le cadre courant est graphique, nilsinon. Étant donné que les images ne peuvent pas être déplacées entre graphiques et non (afaik), le fait d'attacher des conseils à la création d'images garantit que l'état souhaité est atteint pour l'image donnée.
J David Smith
C'est certainement la réponse la plus pratique.
Malabarba
4

Vous n'avez pas besoin de conseils pour modifier les paramètres de différentes images exécutées dans le même démon emacs. Utilisez simplement le crochet after-make-frame-functionscomme ça

(defvar my/ttheme 'tango-dark)
(defvar my/gtheme 'tango)
(defun my/frame-configuration (frame)
  "configure the current frame depending on the frame type"
  (with-selected-frame frame
    (if (display-graphic-p)
        (progn
          (message "after-make-frame-functions hook: window system")
          (set-frame-size frame 115 60)
          ;; other settings for a graphical frame
          (load-theme my/gtheme t))
      (message "after-make-frame-functions hook: text console")
      (load-theme my/ttheme t)
      (set-frame-parameter frame 'menu-bar-lines 0))))

(add-hook 'after-make-frame-functions 'my/frame-configuration)

;; normal start without daemon
(if (not (daemonp))
  (my/frame-configuration (selected-frame)))

Le définir de cette façon a l'avantage supplémentaire, car il définit la configuration de trame souhaitée même si vous ne démarrez pas en mode démon.

Malheureusement, le cadre load-themen'est pas local et les autres cadres sont également colorés si vous utilisez vraiment des thèmes différents pour le texte et les cadres graphiques.

Informations bonus: configurez vos terminaux avec au moins 256 couleurs pour obtenir la vraie sensation du thème que vous avez sélectionné. Utilisez un paramètre comme celui-ci dans l'un de vos fichiers de démarrage du shell:

TERM=xterm-256color
export TERM
Uwe Koloska
la source
Tous les terminaux ne prennent pas en charge 256 couleurs, par exemple xfce4-terminal n'est encore qu'à 8 (je suis passé à sakura pour les jolies couleurs).
unhammer