前几天在微博上看到有人推荐了lazygit这个工具,让人眼前一亮,何时命令行也能够这么抢到了,🤣,调研了下,发现它使用了gocui,使用它能够作出来不少很炫的命令行工具。linux
现有的hosts工具里面也有switchosts!
,但我是用的时候发现他仍是有bug,也只能用在界面化平台。想了下,准备着手搞一个命令行的hsots配置工具,这个类库彻底能够知足。git
在界面设计上,仍是作个copycat,抄袭switchosts!
的,分两栏,左侧是hosts分组,右边儿是当前聚焦hosts分组内容,控制开关放在左侧,以下所示。左侧开关控制每一个组的开启关闭与否,系统当前的hosts是左侧全部打开hosts的集合。github
*------*-------------------* |×name1|# hosts for name2 | |√name2|1.1.1.1 a.com | |×name3|0.0.0.0 abc.com | | | | | | | | | | *------*-------------------*
原理和switchosts!
的相似,经过修改系统hosts文件来达到目的,每次修改的变更都会实时的体现到系统hosts文件中,这样就实现了控制hosts的目的。golang
hosts 配置软件 系统hosts *------*-------------------* *-------------------------* |×name1|# hosts for name2 | |# hosts for name2 | |√name2|1.1.1.1 a.com | |1.1.1.1 a.com | |√name3|0.0.0.0 abc.com | |0.0.0.0 abc.com | | | | => |# hosts for name3 | | | | |127.0.0.1 localhost | | | | | | *------*-------------------* *-------------------------*
gocui是一个很强大的库,就像他所说的那样Go Console User Interface
,提供一个命令行用户界面。他为咱们赋予了控制刷新terminal的能力,好比将terminal分为多个view(分区),每一个view能够独立控制刷新,响应键盘的事件,因此,只要你愿意,甚至能够作出一些简单的小游戏。windows
目前为止gohosts的功能基本已开发完成,主要有功能就是切换hosts,有以下交互:函数
shift + a
组合键,建立新的hosts分组。tab
键,切换左侧、右侧view。由于要修改hosts,因此运行程序的时候也必需要使用root权限,初次运行的时候,会自动进行初始化,生成backup
分组,并将系统当前已有hosts内容放入其中。工具
gohosts的配置文件会放在运行用户的家目录下面的.gohost
文件夹下,每次启动的时候,会从其中读取配置文件,并展示出来。另外,为了作兼容,区分了windows系统和linux系统,经过getUserHome
函数获取用户家目录。另外做为一个copycat,从switchosts!
哪里了解到,有的windows系统盘不装在C盘,经过getWinSystemDir
获取windows的系统盘目录,作到尽量的全平台、多环境兼容。动画
func getUserHome() string { home := "" if runtime.GOOS == "windows" { home = os.Getenv("USERPROFILE") } else { home = os.Getenv("HOME") } return home } func getWinSystemDir() string { dir := "" if runtime.GOOS == "windows" { dir = os.Getenv("windir") } return dir }
另外这里2次使用了go协程来检验语法,启动软件的时候,启动协程,每隔50ms检测一次输入的内容是否合规,以下所示,协程中是个死循环,若是不合规,标红展现。ui
go func() { for range time.Tick(time.Millisecond * 50) { // do something } }()
好比咱们输入hosts配置的时候,必须知足下面3中正则,否则会提示哪一行有错误。命令行
"^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}(?:[ ]{1,})(?:[ 0-9a-zA-Z._-]{1,}){1,}$" "^[ ]*$" "^#.*"
还有咱们输入新建hosts分组的时候,若是hosts分组名字已经存在了,或者hosts分组名字超过长度了,也会在输入弹层view中提示标红。
golang的协程处理这些内容简直得天独厚,处理起来很轻松,也很简单高效。
另外比较麻烦的地方就是控制光标焦点了,左侧增长hosts分组的时候,还有当分组个数超过最大显示行数的时候,这就至关用画布、画框的状况,当移动焦点的时候,须要对应的作出移动画布仍是移动画框,哈哈,有兴趣的能够看看代码中的逻辑。
本身已经实际使用了几天了,还算好用,比较遗憾的就是不支持中文,中文会出现显示不全的问题,这是依赖库致使的,改起来估计比较费劲,不过对于hosts来讲,全英文也没问题。
原文连接:
http://www.5aikid.com/2018/08/23/gohost-go-开发的命令行hosts配置管理工具/
github地址:
https://github.com/aizuyan/gohosts
另外这是第一次真正的使用golang作出一些有用的东西,感受还挺不错,准备稍微闲点儿了,好好研究下这个 依赖库gocui。