本文来自依云's Blog,转载请注明。
gui2term.py是我用Python写的一个脚本,用于给仅支持 GVIM 的配色方案添加256色终端支持。介绍文章以及截图可以看Dante的《强烈推荐-将gui配色转化为终端配色的vim插件-gui2term-py》以及muzuiget的《Vim终端配色转换工具》。
缘起
GVIM 比起终端版的 Vim 来,支持丰富的色彩,而且使用 RGB 表示,更易于编辑,所以有很多配色方案都是只适用于 GVIM 的。但很多人不甘心忍受终端下丑陋的 Vim,于是,如muzuiget的博文所述,有好几个插件都尝试让终端版 Vim 能够使用为 GVIM 写的插件。但是,它们无一例外都是在 Vim 运行时动态转换配色的,估计有点影响启动速度。更重要的是,它们都是在 RGB 空间寻找最接近的终端色彩。这样造成的结果是,经常找到的颜色不是视觉上最接近的。甚至,在转换 spring 配色的时候,原本浅绿色的背景变成了灰色!
于是,我决定写一个脚本,永久性地为配色添加终端支持;同时,使用更好的算法来寻找最接近的颜色。所以,gui2term.py 是独立于 Vim 的 Python 脚本。所以,在最初的版本中我使用了 HSL 空间。没办法,不懂相关的色彩知识,只好凭感觉选择算法了。
更新
前天,我收到了一封来自 Eric Pruitt 的邮件。他建议我使用 colormath 这个库来寻找最接近的颜色。我看了下,发现 colormath 依赖于 numpy。我可不喜欢这么大的依赖。于是,我从 colormath 以及别的地方找出了需要用到的三个算法:RGB 空间到 XYZ 空间的转换、XYZ 空间到 CIELab 空间的转换,以及一个名为 delta_e_cie2000
的 delta 算法。
新的算法比原先的要好一些。我测试了三个配色(lilypink、spring、以及另外一个自己修改的)。其中,有两个的转换结果与 GUI 版更为接近(但是其中一个我更喜欢之前的算法转的),另外一个与原来的算法结果相同。
除此之外,我也更改了寻找 rgb.txt 的逻辑,因为不少人用的时候程序报告找不到 rgb.txt 文件。现在,gui2term.py 会首先尝试使用 locate
程序寻找 rgb.txt。
Jun 15, 2011 07:36:41 PM
能否在urxvt下实现同样的效果?我这里即使urxvt支持256色也不行
Jun 16, 2011 09:39:23 AM
我这边想转个baycomb,但一直很纠结,能否帮转下,谢谢
Jun 16, 2011 01:35:41 PM
我也觉得纠结。这个配色本身是支持终端的,但是终端下和GUI下是不同的,而且还有各种 if 判断。。。。
邮件已发,不过效果好像不怎么样。
Jun 16, 2011 01:38:07 PM
我试了下,我的配色在 urxvt 下很正常啊,和 gnome-terminal 下一样,除了字体各种不正常。
Jun 16, 2011 06:50:33 PM
呵呵,非常感谢!
Jun 16, 2011 07:15:03 PM
兄弟,说了那么多,
给个截图看看撒
Jun 16, 2011 07:19:56 PM
开头说过了,Dante 和 muzuiget 截过不少图,我就懒得再截了。
Jun 17, 2011 09:51:57 AM
有个全局量叫 termcolor,一个成员函数也叫 termcolor,看得好纠结。。。
Jun 17, 2011 01:10:08 PM
这算什么,我经常把局部变量叫作 id 啊 type 啊 str 之类的 :-P
Jun 17, 2011 05:01:51 PM
我重新转了一些两点建议:
1. 值为改用全部大写而不是小写,因为小写“none”在gvim启动会卡一下,提示“E254: Cannot allocate color none”,改成大写就没问题。
2. 输出顺序可以我改成'guifg', 'guibg', 'gui', 'ctermfg', 'ctermbg', 'cterm',如果要删除cterm的,简单“cterm.*$”就搞定了。
3. 可否直接修改原文件
Jun 17, 2011 05:02:06 PM
噢是3点建议
Jun 17, 2011 06:00:02 PM
那难道是我的配置问题,依云介意分享一下配置不?多谢。不得不说这是个非常棒的程序,在gnome-terminal里写程序感觉比gui界面还爽些
Jun 17, 2011 06:37:51 PM
urxvt 的?木有配置啊。只有 zshrc 里有修改 TERM 变量:
[[ $TERM == *color* ]] || export TERM=${TERM%%[.-]*}-256color
Jun 17, 2011 06:51:20 PM
1. 和 2. 已经修改,不过 'none' 在我这里并没有问题。另外,为什么要删除 cterm 的呢?
3. 以前也是有这个功能的,后来考虑到安全性,我把这个功能去掉了。一是以前不太会命令行解析,二是处理起来太麻烦(看看 Vim 怎么做的就知道了;直接覆盖原文件不安全)
Jun 17, 2011 07:00:55 PM
我的urxvt不用任何配置的时候打开vim没有任何颜色配置的效果。echo $TERM的结果为xterm-256color。其实在gnome-terminal中写也不错了,只是好奇为什么urxvt下不行。
Jun 17, 2011 11:33:37 PM
第1点,我在ubuntu和fedora下的gvim7.3是会出错的。
第2点,我习惯把cterm的干掉存成另一份保存,这个无所谓了,顺序不对齐有点强迫而已。
Jul 08, 2011 10:04:48 AM
这个跟 USE="256-color" emerge -av rxvt-unicode 然后在.vimrc里面加入 set t_Co=256 有什么区别吗?
Jul 08, 2011 01:19:48 PM
那个是在终端下使用 256 色的先决条件。不是所有配色方案都支持 256 色终端的。
Jul 13, 2011 02:30:41 AM
这个给力,一直在使用中。
Jul 21, 2011 02:17:14 AM
不知道是我人品好还是怎么,在我这里终端vim和gvim完全一样(包括配色等)
Jul 21, 2011 09:16:17 AM
很明显是你人品很好 ;-)
Jul 23, 2011 02:01:21 AM
很好,研究下
Jul 29, 2011 06:36:44 PM
我发现delta_e_cie2000的算法太复杂了,速度太慢,如果写成vim脚本的话更慢,python稍好些,有什么算法相对快些?
Jul 30, 2011 06:51:17 PM
这个我也没有研究,不过估计快的算法效果就不好了。另外,你可以写成 C,然后用 Vim 的 libcall 调用。
不过,这个对每个配色方案只使用一次,速度稍微慢点没什么吧。
Aug 01, 2011 02:55:26 PM
唔,我写了个delta.so 用libcall()调用。
但是速度比python慢,和用vim运算的速度差不多。
我只能用简化的delta_e_cie76了。
我的插件是通过5个基本色生成colorsheme。
Aug 01, 2011 03:29:47 PM
如果生成120个颜色,
python cie2000需要3s
vim cie76需要21s
vim cie2000需要32s
libcall cie2000需要28s
libcall简直太弱了。是不是我用指针传递字符串的方式不对?
Aug 01, 2011 03:56:51 PM
。。。。你还是用 Python 吧,实在不行用 Python 调用 C 好了。
Aug 01, 2011 04:54:10 PM
还是用最简单的算法
d=abs(r1-r2)+abs(g1-g2)+abs(b1-b2)
120色vim运算需要3s。
生成的terminal配色和cie2000效果差不多。
不得不说前面被这个算法给迷惑了
Aug 01, 2011 05:45:36 PM
你直接用绝对值了。。。。反正如果你觉得够用的话也行。我当初太挑剔了,连 HSV 都不满意的。
Aug 01, 2011 06:00:23 PM
It works.
并且比HSV效果更好。
Aug 01, 2011 07:32:18 PM
不过动态生成和直接生成文件的要求毕竟不一样,怪我自己没想到。
Jul 04, 2012 08:23:56 AM
楼主你好,,urxvt 能实现反色吗,
Jul 04, 2012 02:04:24 PM
大诗人杜牧你好,我不用 urxvt 的,因此我也不知道它能不能反色。