2011-09-30 11 views
6

Chcę wywołać niektóre funkcje, gdy uruchomię emacsclient w emulatorze terminala. Kod, który mam działa, gdy Emacs jest uruchamiany w terminalu tekstowym. Kiedy uruchamiam Emacsa w trybie graficznym i uruchamiam emacsclient -t w terminalu, funkcje nie działają, więc nie mogę używać myszy w emulatorze terminala.nawet gdy emacsclient jest uruchamiany w terminalu, system okien nie jest zerowy

Oto kod w pytaniu:

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

To dziwne sytuacja. Emacsclient łączy się z serwerem i tworzy nową ramkę, ale ponieważ serwer działa w środowisku graficznym, raportuje, że system-okienko ma wartość "ns", podczas gdy w środowisku terminalowym będzie to zero. Dlatego po uruchomieniu emacsclient -t w terminalu funkcje włączania raportowania myszy nie działają. Po uruchomieniu emacsclient, jeśli utworzę nową ramkę z C-x 5 2, funkcje włączania raportowania myszy będą działać, ponieważ system okien będzie zerowy w tej ramce.

Wygląda na to, że podczas mieszania ramek między terminalami i systemami okiennymi wartością window-system będzie zawsze wartość serwera Emacs.

Czy istnieje sposób, w jaki mogę uruchomić Emacs graficznie i emacsclient w trybie tekstowym i uruchomić funkcje myszy? Innymi słowy, czy możliwe jest wykrycie, że tworzona klatka znajdzie się w środowisku graficznym lub tekstowym?

Może powinienem zawsze uruchamiać te funkcje, gdy tworzona jest klatka niezależnie od wartości window-system?

+0

Interesujący problem. Używam Emacs 23.2.1 pod Linuksem (RHEL) i kiedy uruchamiam emacsclient -t na graficznym serwerze i sprawdzam system okien, to jest zerowe, podczas gdy w graficznym X Emacs to X. Innymi słowy, wydaje się działać poprawnie. Jakie są szczegóły twojej konfiguracji? –

+0

Używam Emacsa 23.3 w systemie Mac OS X 10.6.8. Mam taki sam wynik. Po uruchomieniu emacsclient, system-okienko jest zerowe, * ale wewnątrz * funkcji hook-po-make-frame jest "ns". Wygląda na to, że ramka nie ma docelowego systemu okiennego do pewnego czasu po zakończeniu haka. – hekevintran

+0

@hekevintran Czy możesz krótko wyjaśnić, dlaczego jest tak wiele pytań od użytkowników komputerów Mac o używaniu Emacsa pod emulacją terminalu? Czym dokładnie jest scenariusz użycia? Jestem naprawdę ciekawy, ponieważ widzę te pytania DUŻO. –

Odpowiedz

10

Sztuką jest to, że window-system i display-graphic-p są teraz specyficzne dla klatek. musisz być w tej klatce wewnątrz funkcji haka (wygląda na to, że powinno już być, ale nie sądzę, że tak jest). Musiałem dodać to na początku mojego haka after-make-frame-functions (aby system okien i wyświetlacz-grafika-p zachowywały się poprawnie):

(select-frame frame) 
+1

Uderzyłeś paznokciem w głowę! Jeszcze lepszym sposobem jest bezpośrednie przesłanie ramki graficznej: (ramka display-graphic-p). Dzięki za rozwiązanie. To doprowadzało mnie do szału. – hekevintran

Powiązane problemy