sli*_*cki 78 emacs terminal configuration
在我的.emacs
文件中,我有一些只在图形模式下有意义的命令(比如(set-frame-size (selected-frame) 166 100)
).如何仅在图形模式下运行这些模式,而不是在终端模式下运行(即emacs -nw
).
谢谢!
kna*_*arf 97
该window-system
变量告诉Lisp程序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-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)))))
Run Code Online (Sandbox Code Playgroud)
请注意,'after-make-frame-functions
钩子不是为初始帧运行的,因此通常还需要添加与上面相关的与帧相关的钩子函数'after-init-hook
.
window-system是`C源代码'中定义的变量.它的值是x
文档:显示所选框架的窗口系统的名称.该值是一个符号 - 例如,X窗口的"x".如果所选帧位于纯文本终端上,则该值为nil.
基本上做一个:
(if window-system
(progn
(something)
(something-else)))
Run Code Online (Sandbox Code Playgroud)