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

时间:2011-04-26 19:30:55

标签: emacs configuration terminal

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

谢谢!

5 个答案:

答案 0 :(得分:96)

window-system变量告诉Lisp程序Emacs正在运行什么窗口系统。可能的值是

x
Emacs正在使用X显示框架。
W32
Emacs正在使用本机MS-Windows GUI显示框架。
NS
Emacs使用Nextstep界面显示框架(在GNUstep和Mac OS X上使用)。
PC
Emacs正在使用MS-DOS直接屏幕写入显示帧。
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-systemdisplay-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或使用串行终端的旧系统。但我没有时间这样做;-)