2011-09-30 13 views
6

Quiero llamar a algunas funciones cuando ejecuto emacsclient en un emulador de terminal. El código que tengo funciona cuando Emacs se inicia en un terminal de solo texto. Cuando inicio Emacs en modo gráfico y ejecuto emacsclient -t en un terminal, las funciones no se ejecutan, así que no puedo usar el mouse en el emulador de terminal.incluso cuando emacsclient se inicia en un terminal, window-system es no-nil

Aquí está el código en cuestión:

(defun my-terminal-config (&optional frame) 
    "Establish settings for the current terminal." 
    (message (format "%s" window-system)) ;; "ns" (Mac OS X) when Emacs is started graphically 
    (message (format "%s" (display-graphic-p))) ;; nil when Emacs is started graphically 
    (unless (display-graphic-p) 
    ;; enable mouse reporting for terminal emulators 
    (xterm-mouse-mode 1) 
    (global-set-key [mouse-4] '(lambda() 
           (interactive) 
           (scroll-down 1))) 
    (global-set-key [mouse-5] '(lambda() 
           (interactive) 
           (scroll-up 1))))) 
(add-hook 'after-make-frame-functions 'my-terminal-config) 

Ésta es una situación extraña. Emacsclient se conecta al servidor y crea un nuevo marco, pero como el servidor se está ejecutando en un entorno gráfico, informa que el sistema de ventanas es "ns", mientras que en un entorno terminal sería nulo. Por lo tanto, cuando ejecuto emacsclient -t en un terminal, las funciones de habilitación de informe del mouse no se ejecutan. Una vez que emacsclient se esté ejecutando, si creo un nuevo cuadro con C-x 5 2, se ejecutarán las funciones de habilitación del informe del mouse porque el sistema de ventanas será nulo en ese marco.

Parece que al mezclar fotogramas entre terminales y sistemas de ventana, el valor de window-system siempre será el del servidor de Emacs.

¿Hay una manera que puedo correr Emacs gráfica y emacsclient en modo texto y tienen las funciones del ratón se ejecutan allí? En otras palabras, ¿es posible detectar que un cuadro creado se termine en un entorno gráfico o de texto?

Tal vez debería simplemente ejecutar esas funciones cuando se crea un marco, independientemente del valor de window-system?

+0

Problema interesante. Estoy usando Emacs 23.2.1 bajo Linux (RHEL) y cuando ejecuto emacsclient -t contra un servidor gráfico e inspecciono el sistema de ventanas, es nulo, mientras que en el gráfico X Emacs es X. En otras palabras, parece estar trabajando correctamente ¿Cuáles son los detalles de tu configuración? –

+0

Estoy usando Emacs 23.3 en Mac OS X 10.6.8. Tengo el mismo resultado que eso. Una vez que emacsclient se está ejecutando, el sistema de la ventana es nulo, * pero dentro * el enganche after-make-frame-functions es "ns". Parece que el marco no tiene el sistema de ventana de destino hasta algún tiempo después de que se haya terminado el enlace. – hekevintran

+0

@hekevintran ¿Puede repasar brevemente por qué hay tantas preguntas de los usuarios de Mac sobre el uso de Emacs bajo la emulación de terminal? ¿Cuál es exactamente el escenario de uso? Tengo mucha curiosidad porque veo estas preguntas MUCHO. –

Respuesta

10

el truco es que window-system y display-graphic-p ahora son específicos de marcos. necesitas estar en ese marco dentro de tu función de gancho (parece que ya debería ser el caso, pero no creo que sea así). He tenido que añadir esto al comienzo de mi after-make-frame-functions gancho (para hacer la ventana del sistema y la visualización gráfica-p se comportan correctamente):

(select-frame frame) 
+1

¡Pegaste el clavo en la cabeza! Una forma aún mejor es que puede pasar display-graphic-p el marco directamente: (display-graphic-p frame). Gracias por la solución. Me estaba volviendo loco. – hekevintran

Cuestiones relacionadas