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


81

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

谢谢!

Answers:


101

window-system变量告诉Lisp程序Emacs在哪个窗口系统下运行。可能的值为

X
Emacs使用X显示框架。
w32
Emacs正在使用本机MS-Windows GUI显示框架。
ns
Emacs使用Nextstep界面(在GNUstep和Mac OS X上使用)显示框架。
个人电脑
Emacs使用MS-DOS直接屏幕写入来显示框架。
Emacs在基于字符的终端上显示框架。

文档

编辑:似乎不赞成使用窗口系统,而赞成使用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)==“ ns”在我的Mac上
nicolas

43

答案中提到window-systemdisplay-graphic-p并没有错,但是它们并不能说明全部情况。

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

例如,您可以启动一个窗口系统Emacs,然后通过emacsclient -t一个终端连接到它。最终的终端帧将看到nilfor的值window-system。同样,您可以在守护程序模式下启动emacs,然后告诉它创建一个图形框架。

因此,请避免将依赖于的代码放入.emacs中window-system。而是将类似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


谢谢!我不清楚该术语,但是如果我运行(水平分割窗口),是否会创建一个新框架并因此调用它?还是仅在创建一个附加到此实例的全新窗口(例如通过使用emacsclient)时运行?
sligocki 2011年

6
Emacs术语使用“框架”来表示通常称为“窗口”的内容,并使用“窗口”来表示通常称为“窗格”的内容。令人困惑,但是您最终习惯了。希望能有所帮助。:-)
sanityinc 2011年

4
并且,为明确回答您的问题:split-window-horizontally将当前窗口(“框架”)中当前活动的窗格(“窗口”)拆分为两个窗格(“窗口”)。
sanityinc 2011年

2
这将因为以下原因而无法使用:创建框架后运行after-make-frame-functions。这不适用于初始emacs框架(在启动时),因为在创建框架后会读取您的.emacs。 stackoverflow.com/questions/875667/...
Rubycut

1
@Rubycut同意。我应该提到,通常需要向中添加与框架相关的钩子函数'after-init-hook
sanityinc 2011年

8

window-system是在“ C源代码”中定义的变量。它的值是x

说明文件:用来显示所选框架的窗口系统的名称。该值是一个符号-例如,对于X窗口,为'x'。如果所选框架位于纯文本终端上,则该值为nil。

基本上要做:

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

不推荐使用display-graphic-p
ivo Welch


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或使用串行终端的旧系统。但是我没有时间这样做;-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.