【发布时间】:2011-09-30 22:38:41
【问题描述】:
我想在终端模拟器中运行 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”,而在终端环境中则为 nil。因此,当我在终端中运行emacsclient -t 时,鼠标报告启用功能不会运行。运行 emacsclient 后,如果我使用 C-x 5 2 创建一个新框架,则鼠标报告启用功能将运行,因为该框架中的窗口系统将为零。
似乎在终端和窗口系统之间混合帧时,window-system 的值将始终是 Emacs 服务器的值。
有没有一种方法可以让我以图形方式运行 Emacs 并在文本模式下运行 emacsclient 并让鼠标功能在那里运行?换句话说,是否有可能检测到正在创建的框架最终会出现在图形或文本环境中?
也许无论window-system 的值如何,我都应该在创建框架时始终运行这些函数?
【问题讨论】:
-
有趣的问题。我在 Linux (RHEL) 下使用 Emacs 23.2.1,当我对图形服务器运行 emacsclient -t 并检查窗口系统时,它是 nil,而在图形 X Emacs 中它是 X。换句话说,它似乎正常工作。您的设置的详细信息是什么?
-
我在 Macs OS X 10.6.8 下使用 Emacs 23.3。我有同样的结果。一旦 emacsclient 运行,window-system 为 nil,但在内部 after-make-frame-functions hook 为“ns”。似乎直到钩子完成后的一段时间,框架才具有目标窗口系统。
-
@hekevintran 你能简单介绍一下为什么 Mac 用户有这么多关于在终端仿真下使用 Emacs 的问题吗?使用场景具体是什么?我真的很好奇,因为我经常看到这些问题。
-
我不能代表别人的问题。我在终端仿真下使用 Emacs 的问题与 Mac OS 无关。我希望能够在图形和文本界面中使用 Emacs(作为服务器和客户端)而不会出现奇怪的差异/问题。我经常在命令行和 GUI 之间切换。事实上,直到昨天,我都只在控制台中使用 Emacs。另一个重要的终端使用场景是使用 Emacs + GNU Screen + SSH 进行远程结对编程。让来自不同大洲的 2 人能够一起编码是非常宝贵的。
标签: emacs emacsclient