在我的 .emacs
文件中,我有仅在图形模式下才有意义的命令(如 (set-frame-size (selected-frame) 166 100)
)。如何仅在图形模式下而不是在终端模式下(即 emacs -nw
)运行这些。
谢谢!
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
和 display-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
中。
split-window-horizontally
将当前窗口(“框架”)中的当前活动窗格(“窗口”)拆分为两个窗格(“窗口”)。
'after-init-hook
添加类似框架相关的钩子函数。
window-system 是在“C 源代码”中定义的变量。其值为 x 文档:显示所选框架的窗口系统的名称。该值是一个符号——例如,“x”代表 X 窗口。如果所选框架位于纯文本终端上,则该值为 nil。
基本上做一个:
(if window-system
(progn
(something)
(something-else)))
如果它处于 Gui 模式,则以下情况为真。
(如果窗口系统)
我已经定义了一个额外的函数来包装窗口名称功能,因为我在任何地方都使用 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 或使用串行终端的旧系统。但我没有时间这样做;-)
不定期副业成功案例分享