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

Cri*_*ing 5 emacs elisp

我正在尝试设置一个主题 - 一个仅用于终端,一个仅用于gui.我已经读过这个帖子:只在GUI模式下运行某些Emacs init命令

这导致我在这里: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)
Run Code Online (Sandbox Code Playgroud)

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

建议?

Jor*_*ndo 11

emacs lisp函数,(display-graphic-p)如果emacs在GUI中运行,则返回true.

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

(if (display-graphic-p)
    (load-GUI-theme)
  (load-Terminal-theme))
Run Code Online (Sandbox Code Playgroud)

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

(defun is-in-terminal()
    (not (display-graphic-p)))
Run Code Online (Sandbox Code Playgroud)

你可以用它来编写一个更容易阅读的功能

(if (is-in-terminal)
    (load-Terminal-theme)
  (load-GUI-theme))
Run Code Online (Sandbox Code Playgroud)

对于更完整的终端配置方法,我有一个宏,它只是工作,progn但只在Emacs运行时只评估正文而没有GUI

(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))
Run Code Online (Sandbox Code Playgroud)

用法示例:

(when-term
    (load-my-term-theme)
    (set-some-keybindings)
    (foo-bar))
Run Code Online (Sandbox Code Playgroud)

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

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

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