даже когда emacsclient запущен в терминале, оконная система не равна нулю - PullRequest
6 голосов
/ 01 октября 2011

Я хочу вызывать некоторые функции, когда я запускаю emacsclient в эмуляторе терминала. У меня работает код, когда Emacs запускается в текстовом терминале. Когда я запускаю Emacs в графическом режиме и запускаю emacsclient -t в терминале, функции не запускаются, поэтому я не могу использовать мышь в эмуляторе терминала.

Вот код, о котором идет речь:

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

Это странная ситуация. Emacsclient подключается к серверу и создает новый фрейм, но, поскольку сервер работает в графической среде, он сообщает оконной системе «ns», тогда как в терминальной среде он будет нулевым. Поэтому, когда я запускаю emacsclient -t в терминале, функции включения отчетов мыши не запускаются. После запуска emacsclient, если я создам новый фрейм с C-x 5 2, то функции включения отчетов о работе мыши будут запущены, потому что в этом фрейме оконная система будет равна нулю.

Похоже, что при смешивании кадров между терминалами и оконными системами значение window-system всегда будет значением сервера Emacs.

Есть ли способ, с помощью которого я могу запускать Emacs графически и emacsclient в текстовом режиме и запускать там функции мыши? Другими словами, возможно ли обнаружить, что создаваемый фрейм окажется в графической или текстовой среде?

Может быть, я просто должен всегда запускать эти функции при создании кадра независимо от значения window-system?

1 Ответ

10 голосов
/ 02 октября 2011

Хитрость в том, что window-system и display-graphic-p теперь зависят от фрейма. Вы должны быть в этом кадре внутри функции хука (кажется, что это уже должно быть, но я не думаю, что это так). мне пришлось добавить это в начале моего after-make-frame-functions хука (чтобы заставить window-system и display-graphic-p вести себя правильно):

(select-frame frame)
...