gocui库地址
https://github.com/jroimartin/gocui
使用原由
最近写文档都用emacs,git客户端用的是magit。
但是写代码现在都用lvim,在lvim和终端下喜欢上了使用lazygit做git客户端。
非常喜欢lazygit在终端上的界面,扒拉了下github上代码,发现是用go语言写的,
就想着用gocui库做一个终端下界面库个人的信息展示:yulook。
基于gocui做一个终端信息展示软件
初步效果是这样的:
把自己常用软件的快捷键收集做一个展示,方便查看,也能方便没事打开记忆下。
英语单词也考虑加进来,通过快捷键把中文隐藏或者显示哈。
中文错乱bug
实际内容是打开和关闭书签栏,结果显示的内容如图。
解决过程
go语言学了一段时间都快忘光了,只好硬着头皮自己解决,因为搜索引擎啥也搜不到。
一开始以为是gocui本身不支持中文,但是代码查看了下,显示还是用的rune,而且lazygit也是支持中文的。
最后在gocui代码关键地方打印了下,发现获取的内容都是正常的中文。只有在输出到view上的时候出现问题。
怀疑是view输出导致,但是代码一开始看没看出问题,后来突然想到lazygit为什么没问题?就尝试看lazygit的代码,
一层层下来,发现lazygit是fork了gocui的一份代码,自己定制了一份gocui。
一开始想偷懒直接用lazygit改造过的gocui库,但是发现改的太多了,api都不一样了,果断放弃了。
最后view代码开始比对和思考,终于发现了问题。
修复bug
在这里做下记录:
//view.go
termbox.SetCell(v.x0+x+1, v.y0+y+1, ch,
termbox.Attribute(fgColor), termbox.Attribute(bgColor))
这段代码是真正把内容输出到终端上,关键在于SetCell函数的第一个参数,是输出的x坐标。
gocui库的做法是对内容循环,每个内容给的x坐标是x+1导致了中文显示错乱,
修复代码:
//view.go 旧代码
if err := v.setRune(x, y, c.chr, fgColor, bgColor); err != nil {
return nil, err
}
x++
//x++修改为
x += runewidth.RuneWidth(c.chr)
再import下 “github.com/mattn/go-runewidth”
我也学lazygit的作者一样,直接fork了一份代码,并且直接添加到自己的yulook工程里。
完美解决。