6
15
2011
33

让 Vim 在终端下和 GVIM 一样漂亮:gui2term.py 更新至 3.0 版

本文来自依云'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。

Category: Vim | Tags: python vim 配色 | Read Count: 23556
mech 说:
Jun 15, 2011 07:36:41 PM

能否在urxvt下实现同样的效果?我这里即使urxvt支持256色也不行

bofe 说:
Jun 16, 2011 09:39:23 AM

我这边想转个baycomb,但一直很纠结,能否帮转下,谢谢

Avatar_small
依云 说:
Jun 16, 2011 01:35:41 PM

我也觉得纠结。这个配色本身是支持终端的,但是终端下和GUI下是不同的,而且还有各种 if 判断。。。。

邮件已发,不过效果好像不怎么样。

Avatar_small
依云 说:
Jun 16, 2011 01:38:07 PM

我试了下,我的配色在 urxvt 下很正常啊,和 gnome-terminal 下一样,除了字体各种不正常。

bofe 说:
Jun 16, 2011 06:50:33 PM

呵呵,非常感谢!

Morya 说:
Jun 16, 2011 07:15:03 PM

兄弟,说了那么多,
给个截图看看撒

Avatar_small
依云 说:
Jun 16, 2011 07:19:56 PM

开头说过了,Dante 和 muzuiget 截过不少图,我就懒得再截了。

poet 说:
Jun 17, 2011 09:51:57 AM

有个全局量叫 termcolor,一个成员函数也叫 termcolor,看得好纠结。。。

Avatar_small
依云 说:
Jun 17, 2011 01:10:08 PM

这算什么,我经常把局部变量叫作 id 啊 type 啊 str 之类的 :-P

muzuiget 说:
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. 可否直接修改原文件

mech 说:
Jun 17, 2011 06:00:02 PM

那难道是我的配置问题,依云介意分享一下配置不?多谢。不得不说这是个非常棒的程序,在gnome-terminal里写程序感觉比gui界面还爽些

Avatar_small
依云 说:
Jun 17, 2011 06:37:51 PM

urxvt 的?木有配置啊。只有 zshrc 里有修改 TERM 变量:

[[ $TERM == *color* ]] || export TERM=${TERM%%[.-]*}-256color

Avatar_small
依云 说:
Jun 17, 2011 06:51:20 PM

1. 和 2. 已经修改,不过 'none' 在我这里并没有问题。另外,为什么要删除 cterm 的呢?

3. 以前也是有这个功能的,后来考虑到安全性,我把这个功能去掉了。一是以前不太会命令行解析,二是处理起来太麻烦(看看 Vim 怎么做的就知道了;直接覆盖原文件不安全)

mech 说:
Jun 17, 2011 07:00:55 PM

我的urxvt不用任何配置的时候打开vim没有任何颜色配置的效果。echo $TERM的结果为xterm-256color。其实在gnome-terminal中写也不错了,只是好奇为什么urxvt下不行。

muzuiget 说:
Jun 17, 2011 11:33:37 PM

第1点,我在ubuntu和fedora下的gvim7.3是会出错的。
第2点,我习惯把cterm的干掉存成另一份保存,这个无所谓了,顺序不对齐有点强迫而已。

Avatar_small
hosanna 说:
Jul 08, 2011 10:04:48 AM

这个跟 USE="256-color" emerge -av rxvt-unicode 然后在.vimrc里面加入 set t_Co=256 有什么区别吗?

Avatar_small
依云 说:
Jul 08, 2011 01:19:48 PM

那个是在终端下使用 256 色的先决条件。不是所有配色方案都支持 256 色终端的。

荒野无灯 说:
Jul 13, 2011 02:30:41 AM

这个给力,一直在使用中。

Avatar_small
Mike Ma 说:
Jul 21, 2011 02:17:14 AM

不知道是我人品好还是怎么,在我这里终端vim和gvim完全一样(包括配色等)

Avatar_small
依云 说:
Jul 21, 2011 09:16:17 AM

很明显是你人品很好 ;-)

rykka 说:
Jul 23, 2011 02:01:21 AM

很好,研究下

rykka 说:
Jul 29, 2011 06:36:44 PM

我发现delta_e_cie2000的算法太复杂了,速度太慢,如果写成vim脚本的话更慢,python稍好些,有什么算法相对快些?

Avatar_small
依云 说:
Jul 30, 2011 06:51:17 PM

这个我也没有研究,不过估计快的算法效果就不好了。另外,你可以写成 C,然后用 Vim 的 libcall 调用。

不过,这个对每个配色方案只使用一次,速度稍微慢点没什么吧。

rykka 说:
Aug 01, 2011 02:55:26 PM

唔,我写了个delta.so 用libcall()调用。
但是速度比python慢,和用vim运算的速度差不多。
我只能用简化的delta_e_cie76了。
我的插件是通过5个基本色生成colorsheme。

rykka 说:
Aug 01, 2011 03:29:47 PM

如果生成120个颜色,
python cie2000需要3s
vim cie76需要21s
vim cie2000需要32s
libcall cie2000需要28s
libcall简直太弱了。是不是我用指针传递字符串的方式不对?

Avatar_small
依云 说:
Aug 01, 2011 03:56:51 PM

。。。。你还是用 Python 吧,实在不行用 Python 调用 C 好了。

rykka 说:
Aug 01, 2011 04:54:10 PM

还是用最简单的算法
d=abs(r1-r2)+abs(g1-g2)+abs(b1-b2)
120色vim运算需要3s。
生成的terminal配色和cie2000效果差不多。

不得不说前面被这个算法给迷惑了

Avatar_small
依云 说:
Aug 01, 2011 05:45:36 PM

你直接用绝对值了。。。。反正如果你觉得够用的话也行。我当初太挑剔了,连 HSV 都不满意的。

Avatar_small
Rykka 说:
Aug 01, 2011 06:00:23 PM

It works.
并且比HSV效果更好。

Avatar_small
Rykka 说:
Aug 01, 2011 07:32:18 PM

不过动态生成和直接生成文件的要求毕竟不一样,怪我自己没想到。

杜牧 说:
Jul 04, 2012 08:23:56 AM

楼主你好,,urxvt 能实现反色吗,

Avatar_small
依云 说:
Jul 04, 2012 02:04:24 PM

大诗人杜牧你好,我不用 urxvt 的,因此我也不知道它能不能反色。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com