仅适用于GUI /终端emacs的设置

时间:2013-04-11 20:39:31

标签: emacs elisp

我正在尝试设置一个主题 - 一个仅用于终端,一个仅用于gui。 我读过这个帖子:Run certain Emacs init commands only in GUI mode

这导致我在这里:https://superuser.com/questions/165335/how-can-i-show-the-emacs-menu-in-gui-emacs-frames-but-not-in-tty-frames-when-usi

并尝试创建一个适合我需要的功能。

(defun set-frame-theme (frame)
  (let ((want-theme (memq (framep frame) '(x w32 ns))))
    (set-frame-parameter frame '(load-theme '(if want-theme monokai solarized-dark) t))))
(add-hook 'after-make-frame-functions 'set-frame-theme)

它不起作用。 我正在尝试他加载monokai只有gui,否则加载solarized-dark。 它确实适用于GUI界面,但会导致终端看起来崩溃。

建议?

5 个答案:

答案 0 :(得分:11)

emacs lisp功能,     (显示图形-P) 如果emacs在GUI中运行,则返回true。

在.emacs中,添加以下内容以在GUI和终端主题之间切换

(if (display-graphic-p)
    (load-GUI-theme)
  (load-Terminal-theme))

为了便于配置,我有一个名为is-in-terminal的简单函数

(defun is-in-terminal()
    (not (display-graphic-p)))

您可以使用它来编写更易于阅读的功能

(if (is-in-terminal)
    (load-Terminal-theme)
  (load-GUI-theme))

对于更完整的终端配置方法,我有一个像progn一样工作的宏,但只在没有GUI的情况下运行Emacs时评估主体

(defmacro when-term (&rest body)
  "Works just like `progn' but will only evaluate expressions in VAR when Emacs is running in a terminal else just nil."
  `(when (is-in-terminal) ,@body))

示例用法:

(when-term
    (load-my-term-theme)
    (set-some-keybindings)
    (foo-bar))

如果在GUI中运行,则整个块将被完全忽略,但如果在终端中则将运行。

所有这些代码都来自我的配置中的文件,如果有兴趣,可以在这里查看:

https://github.com/jordonbiondo/Emacs/blob/master/Jorbi/jorbi-util.el

答案 1 :(得分:0)

看起来像主题本身的问题 - 仅此而已。嗯。

答案 2 :(得分:0)

在选择颜色主题时,我也遇到了在终端模式下运行时emacs崩溃的问题。 我想说这不是色彩主题的问题,而是emacs本身。 在撰写本文时,从HEAD更新到最新版本确实对我有用。

答案 3 :(得分:0)

https://www.emacswiki.org/emacs/CustomizingFaces

所述

"如果您想为不同的显示器设置不同的配色方案,您也可以自定义它。在自定义缓冲区中,单击[状态]按钮,然后选择“显示所有显示规格”。现在,您可以为不同的显示器使用不同的规格。"

答案 4 :(得分:0)

我可以通过以下方式解决问题:

(if (display-graphic-p) (load-theme 'solarized-dark t))

最后的t是要覆盖主题选择中的确认提示。

更多here