前几天,依云兄在我博客上推荐了一款插件gui2term.py,用了之后立马叫好,苦于一直没有时间,所以今天特意推荐一下。
这款插件实现了将gvim的配色转化成终端配色的解决方案。下载链接
相信不少朋友和我一样,需要在windows和终端下同时工作,而工具都是vim,所以,保持配色的相同就显得非常重要啦!
我们拿著名的desert配色来测试一下:
1.把desert.vim改成 test.vim,和gui2term.py放到同一目录。打开test.vim,将let g:colors_name="desert" 改为 let g:colors_name="test",并删除掉它的终端配色。
2.将vim根目录下的rgb.txt放到和gui2term.py同一目录。
3.执行./gui2term.py test.vim test2.vim
4.打开test2.vim,将会发现终端配色代码已经生成啦
放最终效果图 windows下gvim:
xshell下vim:
好吧,我甚至觉得xshell下的vim要比windows下的gvim好看……
Then,enjoy it!
眼泪哗哗地 on #
终于看到这个插件了.....
Reply
Dante on #
哈哈,我当时也花了好长时间寻找这个插件呢~~~
Reply
依云 on #
终于看到有回复了。。。
其实我也觉得终端下的比GUI的漂亮,无奈终端下用 Alt 组合键让 Esc 的时候不方便。
其实在 vim.org 上有很多把 GUI 配色转成终端的,但它们都是“实时”的,在载入配色时设置而不改写原文件,按 RGB 算的近似颜色也不准确(比如 spring 的浅绿底色变成了灰色),所以就用自己刚学的 Python 写了这个。
Reply
Dante on #
嘿嘿,这个插件可是解决了我多年萦绕在心头的大问题呢~~
其实我不懂python……,一开始还担心自己用不了,结果发现公司的服务器上居然预装了python的解释器啦,哈哈,真是幸运~~
Reply
依云 on #
一般的 Linux 都会装有 Python 的。你也不一定非要在目标机器上面运行啊。随便找个能跑 Python 的地方转换完毕拿到转换后的文件就可以了。不过你要是在 Windows 下跑估计会有乱码,等到下次更新它时再解决了。
Reply
Dante on #
哈哈,我就是在公司的开发机上转换的哦,一般也不会在windows下做什么开发工作。
哈哈,期待你更新最新版本~~~
Reply
君临天下 on #
今晚尝试了 很受用!
Reply
juagel on #
能否将转换好的文件发我一份???937056191@qq.com 谢了。。。
Reply
fuadam on #
为什么我用了这个以后cmd里面的vim就花屏了呢,还有个问题就是输入的中文显示不出来
Reply
Dante on #
呃,这个在windows下的cmd下用确实会有问题哦,所以其实这个配置是给linux下的终端用的……windows下面那个就是个伪终端,很鸡肋……
Reply
fuadam on #
我想用这个的主要原因是想,利用cygwin+screen,来实现vim和shell在同一个窗口里面,用着方便
Reply
依云 on #
在Linux的screen下色彩也有些不对的,暂时不知道原因。
Reply
Ling on #
哇,这东西,太神了!是不是只要把这个更新好的test.vim放到color下就能用啦?老大能不能直接发一份给我呀?
Reply
球猫 on #
试用了一下,发现颜色变得很利害,觉得是距离定义有问题(比rgb欧式距离还糟糕。。。)
改成圆锥hsv距离,补丁:
--- gui2term2.py 2011-01-11 12:10:19.000000000 +0800
+++ gui2term.py 2011-01-11 12:05:15.000000000 +0800
@@ -4,6 +4,7 @@
import os, sys, re
import colorsys
+import math
termcolor = { 16: '#000000',
17: '#00005f',
@@ -265,6 +266,25 @@
re_hexcolor = re.compile('^#[0-9a-fA-F]{6}$')
re_hiline = re.compile('^\s*hi\w*\s+[A-Z]\w+')
re_name = re.compile('(?<=\s)[A-Z]\w+(?=\s+gui)')
+
+def x2f (s):
+ return int(s, 16)/255.0
+
+def color_norm (c):
+ return x2f(c[1:3]), x2f(c[3:5]), x2f(c[5:])
+
+
+def dis (h1, s1, v1, h2, s2, v2):
+ _2pi = math.pi*2
+ x1 = s1*v1*math.cos(h1*_2pi)
+ y1 = s1*v1*math.sin(h1*_2pi)
+ z1 = v1
+ x2 = s2*v2*math.cos(h2*_2pi)
+ y2 = s2*v2*math.sin(h2*_2pi)
+ z2 = v2
+ return (x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2
+
+
class color:
def __init__(self, r=0, g=0, b=0):
self.r = r
@@ -277,11 +297,12 @@
# TODO 更好的计算法
best_match= 0
smallest_distance = 10000000
- for c in range(16,255):
- # d = (int(termcolor[c][1:3], 16) - self.r) ** 2 + (int(termcolor[c][3:5], 16) - self.g) ** 2 + (int(termcolor[c][5:], 16) - self.b) ** 2
- a = colorsys.rgb_to_hsv(float(int(termcolor[c][1:3], 16)), float(int(termcolor[c][3:5], 16)), float(int(termcolor[c][5:], 16)))
- b = colorsys.rgb_to_hsv(float(self.r), float(self.g), float(self.b))
- d = (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + ((a[2] - b[2]) / 255.0) ** 2
+ for c in range(16,256):
+ #d = (int(termcolor[c][1:3], 16) - self.r) ** 2 + (int(termcolor[c][3:5], 16) - self.g) ** 2 + (int(termcolor[c][5:], 16) - self.b) ** 2
+ a = colorsys.rgb_to_hsv(* color_norm(termcolor[c]))
+ b = colorsys.rgb_to_hsv(self.r/255.0, self.g/255.0, self.b/255.0)
+ #d = (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2
+ d = dis(* (a+b))
if d < smallest_distance:
smallest_distance = d
best_match = c
Reply
Dante on #
哈哈,太好啦~~
评论对代码的支持不是很好哦,能否提供一下文件下载,或者发到我邮箱?
依云看到的话也可以试一下哦
Reply
依云 on #
谢谢,我对颜色的计算没什么概念,所以算法是自己瞎猜的。。。
这个算法我将在下个版本加入。(不过我不知道下个版本什么时候发布。。)
另外,Dante 有时间赶紧给评论加上 <pre> 标签的支持吧。
Reply
依云 on #
评论支持 <pre> 标签?那应该提示下下的。。。
<pre>
def test():
12 - 23 < 34
print('OK?')
</pre>
Reply
Dante on #
汗,我也才发现。。。
<pre lang="cpp" line="1">
int main(int argc, const char *argv[])
{
printf("真的支持!");
return 0;
}
</pre>
Reply
Dante on #
哈哈,看我上面的评论,配色都有~~
方法如下:
<pre lang="cpp" line="1">
int main(int argc, const char *argv[])
{
printf("真的支持!");
return 0;
}
</pre>
Reply
Dante on #
依云,我把你的博客加到友链了哈
Reply
依云 on #
Thanks!
Reply
依云 on #
更新了,不过没采用这个算法,感觉效果不够理想。
Reply
球猫 on #
我也是瞎猜的。。。
Reply
lixf on #
能不能把转换好的配色打包发给我。谢谢。43552719@qq.com
Reply
Dante on #
不好意思啊,很早的文章了,转好的文件都已经扔了,文章已经写了转化方法,自己搞一下也很快的。
Reply
lixf on #
一定要python3吗?我这里是2.5
Reply
Dante on #
python2.5就行
Reply
lixf on #
python2.5.
gui2term.py1.0
desert.vim
终端Putty,试用失败,颜色出不来.
Reply
依云 on #
请设置 $TERM 环境变量或者 term 选项以让 Vim 知道它可以使用 256 色。
Reply
juagel on #
终端下显示的颜色和博主的颜色不一样。。。“删除掉它的终端配色”这是什么意思???
Reply
Dante on #
就是将cterm开头的那些设置删掉哦
Reply
Ace on #
并删除掉它的终端配色 这是什么意思?
Reply
Dante on #
就是将cterm开头的那些设置删掉哦~~
Reply
udonmai on #
马桶哥!
Reply
Ace on #
我靠 好巧啊
Reply
Shmech on #
我生成的colortheme在gnome-terminal中能用,但在urxvt下无效
Reply
依云 on #
我这里两个下面都可以用啊。你设置了 'term' 选项或者 't_Co' 选项没有?$TERM 环境变量的值是?
另外,gui2term.py 更新到 3.0 版本了,使用了更好的算法(基于 CIELab 色彩空间),在寻找 rgb.txt 方面会尝试调用 locate 命令了。
Reply
_______小过期 on #
问一下把第一步并删除掉它的终端配色指的是把
" color terminal definitions 后面的定义删掉吗?我尝试了一下,把文件放在colors目录下然后修改了vimrc文件还是没有用 T_T
Reply
Dante on #
凡是term* 类型的都删掉哈
Reply
_______小过期 on #
3X so much!
Reply
Iceway on #
我用你的介绍方法, 把/usr/share/vim/vim73/colors/desert.vim转换之后, 的确和gvim中的配色一样了。
只是还有一点问题想请教。
看到你文章最后的效果图中, 代码里的变量和一些函数都是彩色的。 比如,变量test和printf函数都是绿色的。另外你的define的宏名称等都是有特殊颜色的。我的gvim和vim都没有这些。你的这些变量名,函数名等的彩色是怎么弄出来的?谢谢!
Reply
suck007 on #
我下载的最新版,rgb.txt到当前目录下,结果还是提示找不到rgb.txt
见鬼。。。。。。。。
Reply