在我的.emacs
文件中,我的命令只在图形模式下有意义(如(set-frame-size (selected-frame) 166 100)
)。如何仅在图形模式下运行这些模式,而不是在终端模式下运行(即emacs -nw
)。
谢谢!
答案 0 :(得分:96)
window-system
变量告诉Lisp程序Emacs正在运行什么窗口系统。可能的值是
来自the doc。
编辑:似乎不推荐使用window-system而使用display-graphic-p
(来源:emacs 23.3.1上的C-h f window-system 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))
答案 1 :(得分:42)
提及window-system
和display-graphic-p
的答案没有错,但他们并没有说出完整的图片。
实际上,单个Emacs实例可以有多个帧,其中一些可能在终端上,而其他一些可能在窗口系统上。也就是说,即使在单个Emacs实例中,您也可以获得window-system
的不同值。
例如,您可以启动窗口系统Emacs,然后通过终端中的emacsclient -t
连接到它。生成的终端框架将nil
的值window-system
。同样,您可以在守护进程模式下启动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
。
答案 2 :(得分:8)
window-system是一个定义的变量 `C源代码'。它的值是x
文档:窗口系统的名称 选定的框架是通过哪个 显示。值是一个符号 - for 例如,X窗口的“x”。价值 如果所选框架在a上,则为nil 仅文本末端。
基本上做一个:
(if window-system
(progn
(something)
(something-else)))
答案 3 :(得分:6)
如果它处于Gui模式,则以下情况属实。
(如果是窗口系统)
答案 4 :(得分:2)
我已经定义了一个额外的函数来包装窗口名称功能,因为我在任何地方都使用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或使用串行终端的旧系统。但我没有时间这样做;-)