即使在终端中启动emacsclient,窗口系统也是非零的

hek*_*ran 6 emacs emacsclient

我想在终端模拟器中运行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)
Run Code Online (Sandbox Code Playgroud)

这是一个奇怪的情况.Emacsclient连接到服务器并创建一个新框架,但由于服务器在图形环境中运行,它将窗口系统报告为"ns",而在终端环境中它将为零.因此,当我emacsclient -t在终端中运行时,鼠标报告启用功能不会运行.一旦emacsclient运行,如果我创建一个新的框架C-x 5 2,那么鼠标报告启用功能将运行,因为窗口系统将在该框架中为零.

似乎在终端和窗口系统之间混合帧时,值window-system始终是Emacs服务器的值.

有没有办法可以在文本模式下以图形方式运行Emacs并在其中运行鼠标功能?换句话说,是否可以检测到正在创建的帧将最终出现在图形或文本环境中?

也许我应该简单地在创建框架时始终运行这些函数而不管其值是window-system多少?

jta*_*orn 10

诀窍是,window-systemdisplay-graphic-p现在帧内的特定的.你需要在你的钩子函数内的那个框架中(看起来应该已经是这种情况,但我认为不是这样).我必须在我的after-make-frame-functions钩子的开头添加它(使窗口系统和显示图形-p行为正确):

(select-frame frame)
Run Code Online (Sandbox Code Playgroud)