与tty兼容的custom-theme-set-faces

时间:2009-11-02 22:46:13

标签: emacs themes color-scheme dot-emacs emacs-faces

我使用customize-create-theme创建了一个emacs-23自定义主题。它在X(Linux gnome桌面)下工作正常。但是,当在tty(在gnome-terminal内)运行时,某些颜色是错误的。

这不是颜色的准确性是一个问题(虽然在两种情况下匹配它们会很好)但事实上有些是如此不可行。例如,在T下显示为绿色的函数名称在tty下是不可见的,尽管在X下面显示为gold的关键字在tty下也显示为gold(或至少某种黄色)。

也许在tty颜色下不能完全匹配,所以类似的东西被替换?如果是这样,这似乎不会一直有效。

我该如何解决这个问题?是否可以在“自定义”GUI或〜/ .emacs.d / my-theme.el文件中指定某些面仅适用于X上显示的帧,而其他面仅适用于tty,或者某些内容相似?

(我有兴趣获得这个,内置的emacs主题系统工作,而不是使用一些外部颜色主题系统。)

2 个答案:

答案 0 :(得分:1)

如果某个框架上的颜色不可用,emacs应该尝试选择“关闭”的东西,但这在有限的彩色显示屏上通常是非常错误的。您应该使用M-x list-colors-display(实际查看颜色)或在暂存缓冲区中运行(display-color-cells),询问emacs它认为它在gnome-terminal中有多少颜色。如果它说你只有8,你可能要考虑在启动emacs之前将你的TERM环境变量更改为xterm-256color(尽管我不确定它在gnome-terminal中的实际效果如何;我使用xterm)。

这可能有助于emacs能够找到更接近的颜色,但如果它仍然是错误的,你会想做更激烈的事情,比如根据窗口系统设置颜色。

如果您没有使用守护进程模式,则可以使用类似

的内容
(if window-system
    (set-face-foreground 'font-lock-function-name-face "LightSkyBlue"))

如果您使用M-x describe-face,它会询问您想要描述哪个面,默认为当前点。您可以从那里获得名称(通常是颜色)。

如果您正在使用守护进程模式,那么您将需要为每个帧设置不同的颜色,在这种情况下,您需要在新的帧挂钩中设置帧的颜色,更像是:

(defun set-new-frame-colors (frame)
   "Set colors based on frame type."
   (if (window-system frame)
       (set-face-forgeground 'font-lock-function-name-face "LightSkyBlue" frame)
       (set-face-forgeground 'font-lock-function-name-face "blue" frame)))
(add-hook 'after-make-frame-functions 'set-new-frame-colors)

或者,您可以检查(window-system frame),而不是检查(length (defined-colors frame)),并根据系统支持的颜色数量,以便您可以使用不同颜色的8色与256色彩色终端。

答案 1 :(得分:0)

通过检查变量window-system,可以判断当前帧是否与图形窗口相关联。该链接包含文档,但它看起来像:

window-system is a variable defined in `C source code'.
Its value is nil

Documentation:
Name of window system through which the selected frame is displayed.
The value is a symbol--for instance, `x' for X windows.
The value is nil if the selected frame is on a text-only-terminal.

因此,您可以将当前主题包装在

(if window-system
    ;; current theme configuration
)

然后在xterm中创建一个你喜欢的新文件,并将其放在else(或其他if语句中,或unlesswhen

相关问题