我使用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主题系统工作,而不是使用一些外部颜色主题系统。)
答案 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
语句中,或unless
和when
)