我想在终端模拟器中运行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并在其中运行鼠标功能?换句话说,是否有可能检测到正在创建的帧将最终出现在图形或文本环境中?
也许我应该在创建框架时始终运行这些函数而不管window-system
的值是什么?
答案 0 :(得分:10)
诀窍是window-system
和display-graphic-p
现在是特定于帧的。你需要在你的钩子函数内的那个框架中(看起来应该已经是这种情况,但我认为不是这样)。我必须在after-make-frame-functions
钩子的开头添加它(以使窗口系统和display-graphic-p正确运行):
(select-frame frame)