解决gocui库的中文显示缺少的bug

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工程里。
完美解决。

效果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余很多之很多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值