如何检测emacs是在terminal模式?
在我的.emacs
文件中,我有一些在graphics模式下才有意义的命令(比如(set-frame-size (selected-frame) 166 100)
)。 我如何才能以graphics模式运行这些,而不是terminal模式(即emacs -nw
)。
谢谢!
window-system
variables告诉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-system
和display-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的旧系统。 但我没有时间这样做;-)