前几天在微博上看到有人推荐了lazygit这个工具,让人眼前一亮,什么时候命令行也可以这么抢到了,?,调研了下,发现它使用了gocui,使用它可以做出来很多很炫的命令行工具。

现有的hosts工具里面也有switchosts!,但我是用的时候发现他还是有bug,也只能用在界面化平台。想了下,准备着手搞一个命令行的hsots配置工具,这个类库完全可以满足。

界面设计

在界面设计上,还是做个copycat,抄袭switchosts!的,分两栏,左侧是hosts分组,右边儿是当前聚焦hosts分组内容,控制开关放在左侧,如下所示。左侧开关控制每个组的开启关闭与否,系统当前的hosts是左侧所有打开hosts的集合。

*------*-------------------*
|×name1|# hosts for name2  |
|√name2|1.1.1.1 a.com      |
|×name3|0.0.0.0 abc.com    |
|      |                   |
|      |                   |
|      |                   |
*------*-------------------*

hosts实现原理

原理和switchosts!的类似,通过修改系统hosts文件来达到目的,每次修改的变动都会实时的体现到系统hosts文件中,这样就实现了控制hosts的目的。

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为我们提供了什么

gocui是一个很强大的库,就像他所说的那样Go Console User Interface,提供一个命令行用户界面。他为我们赋予了控制刷新terminal的能力,比如将terminal分为多个view(分区),每个view可以独立控制刷新,响应键盘的事件,所以,只要你愿意,甚至可以做出一些简单的小游戏。

gohosts

目前为止gohosts的功能基本已开发完成,主要有功能就是切换hosts,有如下交互:

  1. 聚焦左侧view时,通过shift + a组合键,创建新的hosts分组。
  2. 通过tab键,切换左侧、右侧view。
  3. 聚焦弹层view时,当创建新的hosts分组的时候,会进入弹层view,输入内容后,按下enter键生效。
  4. 聚焦左侧view时,通过上下箭头切换hosts分组。
  5. 聚焦左侧view时候,通过左右箭头切换hosts分组开关。

gohosts实现

因为要修改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检测一次输入的内容是否合规,如下所示,协程中是个死循环,如果不合规,标红展示。

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分组的时候,还有当分组个数超过最大显示行数的时候,这就相当用画布、画框的情况,当移动焦点的时候,需要对应的做出移动画布还是移动画框,哈哈,有兴趣的可以看看代码中的逻辑。

gohosts效果展示

总结

自己已经实际使用了几天了,还算好用,比较遗憾的就是不支持中文,中文会出现显示不全的问题,这是依赖库导致的,改起来估计比较费劲,不过对于hosts来说,全英文也没问题。

原文链接:
http://www.5aikid.com/2018/08...

github地址:https://github.com/aizuyan/go...

另外这是第一次真正的使用golang做出一些有用的东西,感觉还挺不错,准备稍微闲点儿了,好好研究下这个
依赖库gocui。

gohost -- go 开发的命令行hosts配置管理工具 1相关推荐

  1. gohost -- go 开发的命令行hosts配置管理工具

    前几天在微博上看到有人推荐了lazygit这个工具,让人眼前一亮,什么时候命令行也可以这么抢到了,?,调研了下,发现它使用了gocui,使用它可以做出来很多很炫的命令行工具. 现有的hosts工具里面 ...

  2. kotlin编译失败_Kotlin使用GraalVM开发原生命令行应用

    背景 之前用kotlin开发过一款根据建表DDL语句生成plantuml ER图的应用.被问如何使用,答曰"给你一个jar包,然后执行java -jar ddl2plantuml.jar . ...

  3. MacOS开发-用命令行压缩文件

    MacOS开发-用命令行压缩文件 在Mac OS X中,你可以通过右键上下文菜单中的"压缩xxx"选项制作压缩文件,但是,该方式创建的压缩文件和通过命令行zip创建的压缩文件不同. ...

  4. 使用Dart/Flutter语言开发的命令行文字RPG类型小游戏

    使用Dart/Flutter语言开发的命令行文字RPG类型小游戏 项目源码:https://gitee.com/FantasyWind/word_game 介绍 项目背景 本项目为使用Dart/Flu ...

  5. 服务计算 - 3 Golang开发Linux命令行实用程序 - selpg

    文章目录 Golang开发Linux命令行实用程序 - selpg 1. 介绍 2. 设计与实现 2.1 设计思路 2.2 功能模块划分与实现 3. 参考文献 Golang开发Linux命令行实用程序 ...

  6. Java命令行程序构建工具airlift使用

    package com.ilucky.airlift;import java.util.Arrays;import io.airlift.airline.Cli; import io.airlift. ...

  7. 14 个经典的 Linux 终端命令行,这些工具堪称神器!

    作者:int32bit 链接:http://t.cn/R1FKgdN ag:比grep.ack更快的递归搜索文件内容. tig:字符模式下交互查看git项目,可以替代git命令. mycli:mysq ...

  8. Juniper防火墙命令行查错工具snoop的使用

    Juniper防火墙命令行查错工具snoop的使用 摘要:Snoop 是Juniper防火墙另外一个有效的查错工具,它和debug flow basic的区别是: snoop类似于在防火墙的接口上抓包 ...

  9. 超实用的8个Linux命令行性能监测工具

    本文总结了8个非常实用的Linux命令行性能监测工具,这些命令支持所有的Linux系统,不仅可以用于监控系统,还可以发现导致性能问题的原因所在. 对每个系统/网络管理员来说,每天监测Linux系统性能 ...

  10. php解析命令行参数选项,PHP 命令行参数解析工具类的示例代码

    PHP 命令行参数解析工具类的示例代码 /** * 命令行参数解析工具类 * @author guolinchao */ class CommandLine { // 临时记录短选项的选项值 priv ...

最新文章

  1. Linux内存管理:bufferCache和PageCache
  2. 深入理解java中的ArrayList和LinkedList
  3. 零基础学python需要多久-零基础学习Python开发需要多长时间?
  4. python 生成html_Python使用pyh生成HTML文档的方法示例
  5. 【AI自学】 完备的 AI 学习路线,最详细的资源整理!
  6. 拼多多发布一季度廉正白皮书:已移送公安机关3人 开除6人
  7. 其实程序员高工资,好多时候就是加班和自己硬撑出来的
  8. 惠普笔记本电脑好吗_十代酷睿释放强大性能,惠普战66三代助你无往不胜
  9. WritableWorkbook 详细用例 (转)
  10. sqoop导入/导出
  11. 【梦幻西游】12门派版一键端
  12. Linux内核网络UDP数据包发送(四)——Linux netdevice 子系统
  13. go与python的前景_golang程序员前景怎么样?Python、Java、go语言的优势互比
  14. 查看alexa世界排名
  15. 港科夜闻|香港科技大学与越秀集团举行捐赠仪式暨合作框架协议签约仪式,再次捐赠1亿港币...
  16. 再现隐私之争_反谷歌FLoC联盟: selenium谷歌浏览器报错: Error with Permissions-Policy header
  17. 幅度调制(线性调制)原理
  18. 苹果uwb_苹果电子追踪器即将发布,我们扒了扒产品背后的 UWB 超宽频技术
  19. asyne和await
  20. 帝国cms如何域名html的专题,帝国cms整站更换新老域名详细操作方法

热门文章

  1. 原生列表table固定表头
  2. 【项目管理】三点估算
  3. three.js加载OBJ格式模型(vue中使用three.js51)
  4. 将百度地图下载为图片-自定义尺寸
  5. 苹果电脑u盘装win7系统教程
  6. RadAsm模板修改
  7. HTMLCSS字体之引入外部字体
  8. linux降低交叉编译器版本,嵌入式ARM+Linux 多個不同版本的交叉編譯器的切換方法...
  9. (2)公众号开发-基础框架搭建
  10. delphi 热部署_DelphiWebMVC微信公众号开发