Avvia due demoni emacs separati per console e GUI


14

In genere avvio emacs con la GUI e avvio subito un server (server-start). Ora posso facilmente aprire documenti nella mia sessione emacs esistente dal terminale tramite emacsclient -n <file>o dal Browser file.

Di tanto in tanto, tuttavia, voglio eseguire emacs all'interno del mio terminale utilizzando emacsclient -t. Ciò accade più spesso quando si scrivono registri di commit git o si eseguono altre attività molto piccole. In questi casi, il fatto che il mio file init sia stato caricato in un'istanza della GUI di emacs significa che non ottengo nessuna delle mie personalizzazioni specifiche di TTY emacs.

So che posso correre

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

ma ciò ricaricherà tutti i pacchetti ogni volta. Posso avere il meglio di entrambi i mondi? Esiste un modo per impostare un "demone TTY" in modo da poter utilizzare personalizzazioni separate per l'esecuzione all'interno del terminale anziché visitare il file in una finestra di emacs esistente?


1
Puoi indicare un esempio delle tue personalizzazioni che sono diverse tra la modalità TTY e la GUI?
stsquad,

1
@stsquad Uno davvero semplice è che uso una frangia sinistra in modalità GUI, ma poiché la frangia non esiste nella modalità TTY, non c'è spazio tra i numeri di riga e il testo. Questo può essere risolto con (setq linum-format "%d ")nel file di personalizzazione TTY. Inoltre, il mio tema colore appare sempre strano nella modalità TTY, quindi sceglierò sicuramente un tema diverso per il TTY. Al momento non ho molte differenze, ma ora che so che posso avere server diversi, l'elenco potrebbe crescere.
nispio,

@nispio: ti suggerisco M-x report-emacs-buge richiedo nuove funzionalità come la possibilità di avere temi del viso diversi in TTY e nei frame della GUI (in realtà, un tema può specificare colori completamente diversi per questi diversi tipi di frame, quindi puoi anche regolare il tema) . L'uso di più demoni per quei casi separati è solo una soluzione per la mancanza di funzionalità corrispondenti in Emacs.
Stefan,

Risposte:


14

Utilizzare emacs --daemon=your-server-name -l "custom-init-file"per avviare un nuovo server e emacsclient -nw -s your-server-nameconnettersi ad esso dal terminale stesso. La sezione sull'utilizzo di Emacs come server nel manuale ha più opzioni di inizializzazione.


Questo funziona! C'è un buon modo per uccidere un server avviato in questo modo oltre a cercare ed eliminare il file del server?
nispio,

(Ho dovuto aggiungere un -qinterruttore per impedire l' init.elesecuzione del mio predefinito prima del file init personalizzato.)
nispio

2
Fa emacsclient -s your-server-name -e "(kill-emacs)"quello che vuoi? Quanto sopra chiama solo emacsclient ed eval (kill-emacs). Puoi sostituire anche (kill-emacs)con (save-buffers-kill-emacs).
Vamsi,

Avevo un init.el comune sia per emacs terminal che per gui e caricavo file personalizzati separati per personalizzazioni individuali. Quindi ho perso il-q
Vamsi il

1
Questa soluzione ha anche risolto un problema che avevo quando usavo 'emacsclient -t' con mutt e, in uno spazio di lavoro separato, 'emacsclient -c'. In poche parole: il demone si stava arrestando in modo anomalo quando 'emacsclient -c' veniva attivato prima di 'emacsclient -t'. Grazie, Vamsi
-IT

9

Oltre alla risposta di @ Vamsi, puoi ottenere molti degli stessi vantaggi mentre esegui un solo server allegando consigli a make-frame-command.

Ad esempio, mentre corro nel terminale voglio che il colore di sfondo sia black(quale mappa #202020) ma che voglio usare #202020in modalità grafica. Ho implementato questo con:

(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")))

È possibile ottenere un sacco di chilometraggio da questo utilizzando make-variable-frame-local( set-background-colorin quanto sopra è già frame-local).

Non so se questo è il modello migliore, ma se hai relativamente poche differenze tra Emacs in modalità TTY e X-mode, può semplificare la gestione della configurazione.

Il codice sopra è stato estratto dal mio .emacs.d .


Mi chiedevo se esistesse un modo per "rilevare" la modalità in cui mi trovo su una base per fotogramma.
nispio,

1
Questo lo farà. (display-graphic-p)tse il frame corrente è grafico, nilaltrimenti. Poiché i frame non possono essere spostati tra grafici e non (afaik), il collegamento dei consigli alla creazione dei frame assicura che venga raggiunto lo stato desiderato per il frame specificato.
J David Smith,

Questa è sicuramente la risposta più conveniente.
Malabarba,

4

Non hai bisogno di un consiglio per cambiare le impostazioni di diversi frame in esecuzione nello stesso demone emacs. Basta usare il gancio in questo after-make-frame-functionsmodo

(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)))

Definirlo in questo modo ha il vantaggio aggiuntivo, che imposta la configurazione del frame desiderata anche se non si avvia in modalità demone.

Sfortunatamente load-themenon è un frame locale e quindi anche gli altri frame vengono colorati se si utilizzano davvero temi diversi per cornici di testo e grafiche.

Informazioni bonus: configura i tuoi terminali con almeno 256 colori per avere la sensazione reale del tema selezionato. Utilizzare un'impostazione come questa in uno dei file di avvio della shell:

TERM=xterm-256color
export TERM

Non tutti i terminali supportano 256 colori, ad esempio xfce4-terminal è ancora solo 8 (sono passato a sakura per i bei colori).
unhammer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.