Inicie dos demonios emacs separados para consola y GUI

14

Por lo general, inicio emacs con la GUI e inicio un servidor de inmediato (server-start). Ahora puedo abrir fácilmente documentos en mi sesión de emacs existente desde la terminal a través emacsclient -n <file>o desde el Explorador de archivos.

Sin embargo, de vez en cuando, quiero ejecutar emacs dentro de mi terminal usando emacsclient -t. Esto sucede con mayor frecuencia al escribir registros de confirmación de git o al realizar otras tareas muy pequeñas. En esos casos, el hecho de que mi archivo init se haya cargado en una instancia de GUI de emacs significa que no obtengo ninguna de mis personalizaciones que sean específicas de TTY emacs.

Sé que puedo correr

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

pero eso recargará todos los paquetes cada vez. ¿Puedo tener lo mejor de ambos mundos? ¿Hay alguna manera de configurar un "demonio TTY" para que pueda usar personalizaciones separadas para ejecutar dentro del terminal en lugar de visitar el archivo en una ventana de emacs existente?

nispio
fuente
1
¿Puede señalar un ejemplo de sus personalizaciones que sean diferentes entre los modos TTY y GUI?
stsquad
1
@stsquad Una muy simple es que uso un margen izquierdo en modo GUI, pero dado que el margen no existe en el modo TTY, no hay espacio entre los números de línea y el texto. Esto se puede solucionar con (setq linum-format "%d ")el archivo de personalización TTY. Además, mi tema de color siempre se ve extraño en el modo TTY, por lo que definitivamente elegiré un tema diferente para el TTY. En realidad no tengo tantas diferencias en este momento, pero ahora que sé que puedo tener diferentes servidores, la lista puede crecer.
nispio
@nispio: le sugiero que M-x report-emacs-bugsolicite nuevas funciones, como la posibilidad de tener diferentes temas de cara en TTY y en marcos de GUI (en realidad, un tema puede especificar colores completamente diferentes para esos diferentes tipos de marcos, por lo que también puede ajustar su tema) . Usar varios demonios para esos casos separados es solo una solución para la falta de funcionalidad correspondiente en Emacs.
Stefan

Respuestas:

14

Úselo emacs --daemon=your-server-name -l "custom-init-file"para iniciar un nuevo servidor y emacsclient -nw -s your-server-namepara conectarse desde el mismo terminal. La sección sobre el uso de Emacs como servidor en el manual tiene más opciones de inicialización.

Vamsi
fuente
¡Esto funciona! ¿Hay una buena manera de matar un servidor que comenzó de esta manera además de buscar y eliminar el archivo del servidor?
nispio
(He tenido que añadir un -qinterruptor para mantener mi defecto init.elde funcionamiento antes de que el archivo de inicio personalizado.)
nispio
2
¿Hace emacsclient -s your-server-name -e "(kill-emacs)"lo que quieres? Lo anterior solo llama a emacsclient y evals (kill-emacs). Podrías reemplazar (kill-emacs)con (save-buffers-kill-emacs)también.
Vamsi
Solía ​​tener un init.el común para emacs de terminal y de interfaz gráfica de usuario y cargaba archivos personalizados separados para personalizaciones individuales. Por lo tanto, me perdí el-q
Vamsi
1
Estas soluciones también solucionaron un problema que tuve al usar 'emacsclient -t' con mutt y, en un espacio de trabajo separado, 'emacsclient -c'. En pocas palabras: el demonio se bloqueaba cuando se activaba 'emacsclient -c' antes que 'emacsclient -t'. Gracias, Vamsi
Boccaperta-IT
9

Además de la respuesta de @ Vamsi, puede obtener muchos de los mismos beneficios mientras ejecuta un solo servidor adjuntando consejos a make-frame-command.

Por ejemplo, mientras se ejecuta en la terminal, quiero que el color de fondo sea black(que se asigna #202020) pero quiero usarlo #202020en modo gráfico. Implementé esto 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")))

Puede obtener mucho kilometraje de esto usando make-variable-frame-local( set-background-coloren lo anterior ya es frame-local).

No sé si este es el mejor patrón, pero si tiene relativamente pocas diferencias entre el modo TTY y el modo X de Emacs, puede facilitar la administración de la configuración.

El código anterior fue extraído de mi .emacs.d .

J David Smith
fuente
Me había estado preguntando si había alguna forma de "detectar" en qué modo estoy por cuadro.
nispio
1
Esto lo haremos. (display-graphic-p)da tsi el marco actual es gráfico, de lo nilcontrario. Debido a que los cuadros no pueden moverse entre gráficos y no (afaik), adjuntar consejos a la creación de cuadros asegura que se alcance el estado deseado para el cuadro dado.
J David Smith
Esta es definitivamente la respuesta más conveniente.
Malabarba
4

No necesita un consejo para cambiar la configuración de diferentes marcos que se ejecutan en el mismo demonio emacs. Solo usa el gancho after-make-frame-functionsasí

(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 de esta manera tiene la ventaja adicional de que establece la configuración de cuadro deseada, incluso si no comienza en modo demonio.

Desafortunadamente, el load-thememarco no es local y, por lo tanto, los otros cuadros también se colorean si realmente usa diferentes temas para texto y cuadros gráficos.

Información adicional: configure sus terminales con al menos 256 colores para obtener la sensación real del tema seleccionado. Use una configuración como esta en uno de sus archivos de inicio de shell:

TERM=xterm-256color
export TERM
Uwe Koloska
fuente
No todos los terminales admiten 256 colores, por ejemplo, xfce4-terminal sigue siendo solo 8 (cambié a sakura por los bonitos colores).
Martillo