ChatGPT解决这个技术问题 Extra ChatGPT

如何检测 emacs 是否处于终端模式?

在我的 .emacs 文件中,我有仅在图形模式下才有意义的命令(如 (set-frame-size (selected-frame) 166 100))。如何仅在图形模式下而不是在终端模式下(即 emacs -nw)运行这些。

谢谢!


k
knarf

window-system 变量告诉 Lisp 程序 Emacs 在哪个窗口系统下运行。可能的值为

Emacs 使用 X 显示框架。 w32 Emacs 使用本机 MS-Windows GUI 显示框架。 ns Emacs 正在使用 Nextstep 界面(在 GNUstep 和 Mac OS X 上使用)显示框架。 pc Emacs 正在使用 MS-DOS 直接屏幕写入来显示框架。 nil Emacs 在基于字符的终端上显示框架。

the doc

编辑:似乎不推荐使用窗口系统以支持 display-graphic-p(来源:emacs 23.3.1 上的 Ch f 窗口系统 RET)。

(display-graphic-p &optional DISPLAY)

Return non-nil if DISPLAY is a graphic display.
Graphical displays are those which are capable of displaying several
frames and several different fonts at once.  This is true for displays
that use a window system such as X, and false for text-only terminals.
DISPLAY can be a display name, a frame, or nil (meaning the selected
frame's display).

所以你想要做的是:

(if (display-graphic-p)
    (progn
    ;; if graphic
      (your)
      (code))
    ;; else (optional)
    (your)
    (code))

如果你没有 else 子句,你可以:

;; more readable :)
(when (display-graphic-p)
    (your)
    (code))

(window-system) == "ns" 在我的 Mac 上
s
sanityinc

提到 window-systemdisplay-graphic-p 的答案没有错,但它们并不能说明完整的情况。

实际上,一个 Emacs 实例可以有多个框架,其中一些可能在终端上,而另一些可能在窗口系统上。也就是说,即使在单个 Emacs 实例中,您也可以获得不同的 window-system 值。

例如,您可以启动一个窗口系统 Emacs,然后在终端中通过 emacsclient -t 连接到它;生成的终端框架将看到 window-system 的值 nil。同样,您可以在守护程序模式下启动 emacs,然后告诉它创建一个图形框架。

因此,请避免将依赖于 window-system 的代码放入 .emacs。相反,将您的 set-frame-size 示例之类的代码放在一个钩子函数中,该函数在创建框架后运行:

(add-hook 'after-make-frame-functions
  (lambda ()
    (if window-system
      (set-frame-size (selected-frame) 166 100)))))

请注意,'after-make-frame-functions 挂钩不会针对初始帧运行,因此通常还需要将上述与帧相关的挂钩函数添加到 'after-init-hook 中。


谢谢!我不清楚术语,但是如果我运行(水平拆分窗口),是否会创建一个新框架并因此调用它?还是仅在创建附加到此实例的全新窗口时才运行(例如使用 emacsclient)?
Emacs 术语使用“框架”来表示您通常称为“窗口”的内容,它使用“窗口”来表示您通常称为“窗格”的内容。令人困惑,但你最终会习惯它。希望有帮助。 :-)
而且,要明确回答您的问题:split-window-horizontally 将当前窗口(“框架”)中的当前活动窗格(“窗口”)拆分为两个窗格(“窗口”)。
这将不起作用,因为:after-make-frame-functions 在创建框架后运行。这不适用于初始 emacs 框架(在启动时),因为您的 .emacs 是在框架创建后读取的。 stackoverflow.com/questions/875667/…
@Rubycut 同意了。我应该提到,经常需要向 'after-init-hook 添加类似框架相关的钩子函数。
B
Bozhidar Batsov

window-system 是在“C 源代码”中定义的变量。其值为 x 文档:显示所选框架的窗口系统的名称。该值是一个符号——例如,“x”代表 X 窗口。如果所选框架位于纯文本终端上,则该值为 nil。

基本上做一个:

(if window-system
    (progn
      (something)
      (something-else)))

不推荐使用 display-graphic-p
u
uncaught_exceptions

如果它处于 Gui 模式,则以下情况为真。

(如果窗口系统)


p
paaguti

我已经定义了一个额外的函数来包装窗口名称功能,因为我在任何地方都使用 Emacs,即从终端和图形模式以及 Linux 和 MacOS:

(defun window-system-name()
  (cond ((eq system-type 'gnu/linux) (if (display-graphic-p) "x"   "nox"))
    ((eq system-type 'darwin)    (if (display-graphic-p) "mac" "nox"))
    (t (error "Unsupported window-system") nil)))

它可以扩展到覆盖其他系统,如 Windows 或使用串行终端的旧系统。但我没有时间这样做;-)