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

sli*_*cki 78 emacs terminal configuration

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

谢谢!

kna*_*arf 97

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

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

来自doc.

编辑:似乎不赞成使用window-system display-graphic-p(来源:emacs 23.3.1上的Ch 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).
Run Code Online (Sandbox Code Playgroud)

所以你想要做的是:

(if (display-graphic-p)
    (progn
    ;; if graphic
      (your)
      (code))
    ;; else (optional)
    (your)
    (code))
Run Code Online (Sandbox Code Playgroud)

如果你没有else子句,你可以:

;; more readable :)
(when (display-graphic-p)
    (your)
    (code))
Run Code Online (Sandbox Code Playgroud)


san*_*inc 42

答案提到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)))))
Run Code Online (Sandbox Code Playgroud)

请注意,'after-make-frame-functions钩子不是为初始帧运行的,因此通常还需要添加与上面相关的与帧相关的钩子函数'after-init-hook.

  • Emacs术语使用"frame"来表示通常称为"窗口"的内容,它使用"窗口"来表示通常称为"窗格"的内容.令人困惑,但你最终会习惯它.希望有所帮助.:-) (6认同)
  • 并且,明确地回答你的问题:`split-window-horizo​​ntally`将当前窗口("frame")中当前活动的窗格("窗口")拆分为两个窗格("窗口"). (4认同)
  • 这将不起作用:在创建帧之后运行after-make-frame-functions.这不适用于初始emacs框架(启动时),因为在创建框架后会读取.emacs.http://stackoverflow.com/questions/875667/how-do-i-run-a-command-just-after-the-emacs-frame-has-been-rendered (2认同)

Boz*_*sov 8

window-system是`C源代码'中定义的变量.它的值是x

文档:显示所选框架的窗口系统的名称.该值是一个符号 - 例如,X窗口的"x".如果所选帧位于纯文本终端上,则该值为nil.

基本上做一个:

(if window-system
    (progn
      (something)
      (something-else)))
Run Code Online (Sandbox Code Playgroud)


unc*_*ons 6

如果它处于Gui模式,则以下情况属实.

(如果是窗口系统)