如何检测emacs是在terminal模式?

在我的.emacs文件中,我有一些在graphics模式下才有意义的命令(比如(set-frame-size (selected-frame) 166 100) )。 我如何才能以graphics模式运行这些,而不是terminal模式(即emacs -nw )。

谢谢!

window-systemvariables告诉Lisp程序在哪个窗口系统下运行Emacs。 可能的值是

X
Emacs使用X显示框架。
W32
Emacs使用本地MS-Windows GUI显示框架。
NS
Emacs使用Nextstep界面显示框架(用于GNUstep和Mac OS X)。
个人计算机
Emacs使用MS-DOS直接屏幕写入显示框架。
Emacs在基于字符的terminal上显示框架。

从文档 。

编辑 :似乎窗口系统已被弃用,以支持display-graphic-p (源:在emacs 23.3.1上的窗口系统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)) 

如果你没有其他条款,你可以:

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

提到window-systemdisplay-graphic-p的答案没有错,但是他们并没有完整的描述。

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

例如,您可以启动一个窗口系统Emacs,然后通过terminal中的emacsclient -t连接到它; 得到的terminal帧将会看到window-system的值nil 。 同样,你可以在守护进程模式下启动emacs,然后再告诉它创build一个graphics框架。

因此,避免将代码放在依赖于window-system .emacs中。 相反,把像set-frame-size这样的代码放入一个在创build框架后运行的钩子函数中:

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

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

window-system是一个在“C源代码”中定义的variables。 它的值是x

文档:显示所选框架的窗口系统的名称。 该值是一个符号 – 例如,X窗口的“x”。 如果所选帧位于纯文本terminal上,则值为零。

基本上做一个:

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

如果它在Gui模式下,那么以下是真实的。

(如果窗口系统)

我已经定义了一个额外的函数来封装窗口名称的function,因为我在任何地方都使用Emacs,例如,从terminal和graphics模式以及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或使用串行terminal的旧系统。 但我没有时间这样做;-)