在我的.emacs
文件中,我有一些仅在图形模式下才有意义的命令(例如(set-frame-size (selected-frame) 166 100)
)。我如何仅在图形模式下而不在终端模式下(即emacs -nw
)运行它们。
谢谢!
Answers:
该window-system
变量告诉Lisp程序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
和display-graphic-p
并没有错,但是它们并不能说明全部情况。
实际上,单个Emacs实例可以具有多个框架,其中一些框架可能在终端上,而另一些框架可能在窗口系统上。也就是说,window-system
即使在单个Emacs实例中,您也可以获得不同的值。
例如,您可以启动一个窗口系统Emacs,然后通过emacsclient -t
一个终端连接到它。最终的终端帧将看到nil
for的值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
。
split-window-horizontally
将当前窗口(“框架”)中当前活动的窗格(“窗口”)拆分为两个窗格(“窗口”)。
'after-init-hook
。
window-system是在“ C源代码”中定义的变量。它的值是x
说明文件:用来显示所选框架的窗口系统的名称。该值是一个符号-例如,对于X窗口,为'x'。如果所选框架位于纯文本终端上,则该值为nil。
基本上要做:
(if window-system
(progn
(something)
(something-else)))
如果它处于Gui模式,则以下内容将成立。
(如果是window-system)
我定义了一个额外的函数来包装窗口名称功能,因为我在各处都使用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或使用串行终端的旧系统。但是我没有时间这样做;-)