2011-09-30 17 views
6

Voglio richiamare alcune funzioni quando eseguo emacsclient in un emulatore di terminale. Il codice che ho funziona quando Emacs viene avviato in un terminale di solo testo. Quando avvio Emacs in modalità grafica ed eseguo emacsclient -t in un terminale, le funzioni non vengono eseguite quindi non posso utilizzare il mouse nell'emulatore di terminale.anche quando viene avviato emacsclient in un terminale, il sistema di finestre è diverso da zero

Ecco il codice in questione:

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

Questa è una situazione strana. Emacsclient si connette al server e crea un nuovo frame, ma poiché il server è in esecuzione in un ambiente grafico, segnala che window-system è "ns" mentre in un ambiente terminale sarebbe nullo. Pertanto quando eseguo emacsclient -t in un terminale, le funzioni di abilitazione alla segnalazione del mouse non vengono eseguite. Una volta che emacsclient è in esecuzione, se creo un nuovo frame con C-x 5 2, le funzioni di abilitazione alla segnalazione del mouse verranno eseguite perché il sistema delle finestre sarà nullo in quel frame.

Sembra che durante il mixaggio di frame tra terminali e sistemi di finestre, il valore di window-system sia sempre quello del server Emacs.

C'è un modo per eseguire Emacs graficamente ed emacsclient in modalità testo e far funzionare le funzioni del mouse? In altre parole, è possibile rilevare che un frame che viene creato finirà in un ambiente grafico o di testo?

Forse dovrei semplicemente eseguire sempre queste funzioni quando viene creato un frame indipendentemente dal valore di window-system?

+0

problema interessante. Sto usando Emacs 23.2.1 su Linux (RHEL) e quando eseguo emacsclient -t contro un server grafico e ispeziono window-system, è nullo, mentre nella X Emacs grafica è X. In altre parole, sembra per funzionare correttamente. Quali sono i dettagli del tuo setup? –

+0

Sto usando Emacs 23.3 sotto Mac OS X 10.6.8. Ho lo stesso risultato. Una volta che l'emacsclient è in esecuzione window-system è nullo, * ma all'interno * le funzioni after-make-frame-hook sono "ns". Sembra che la cornice non abbia il sistema di finestre di destinazione fino a qualche tempo dopo che l'hook è terminato. – hekevintran

+0

@hekevintran Puoi brevemente capire perché ci sono così tante domande da parte degli utenti Mac sull'uso di Emacs in emulazione terminale? Qual è esattamente lo scenario di utilizzo? Sono davvero curioso perché vedo queste domande MOLTO. –

risposta

10

il trucco è che window-system e display-graphic-p sono ora specifici del frame. devi essere in quella cornice all'interno della funzione di hook (sembra che dovrebbe essere già il caso, ma non credo che lo sia). ho dovuto aggiungere questo all'inizio del mio gancio after-make-frame-functions (per rendere window-system e la visualizzazione-grafica-p si comportano correttamente):

(select-frame frame) 
+1

Hai colpito l'unghia sulla testa! Un modo ancora migliore è di passare direttamente alla visualizzazione-grafica-p del frame: (display-frame-graphic frame). Grazie per la soluzione. Mi stava facendo impazzire. – hekevintran

Problemi correlati