本文首先公布在
CSDN的文章编辑器实在太烂了,建议大家用Cmd Markdown。它不但支持markdown。还支持VIM模式。
智能化的命令行工具-betty
betty
tool
command
ruby
betty 是一个用Ruby实现的很easy,好玩的智能化命令行提示工具。
主要解决的问题是将英文翻译成机器能够理解的unix命令。在它的官方文档中,我们能够找到具体的说明和解释。本文的主要目的在于依据betty为基础,定制我们自己的"英语命令"。
基本原理
整个程序的入口是main.rb文件,它的主要功能是
- 接受命令行參数
- 从
lib/*.rb
装载全部能够运行的文件 - 匹配寻找能够运行的命令
- 运行命令
假设你成功安装了,你会发如今~/.bash_profile 或者其它的系统配置文件里。有一行类似于例如以下的代码
alias betty="xxx/betty/main.rb"
从以上的分析能够看出,betty 不负责详细的命令运行,仅仅负责将我们通俗的语言(比方英语)转换成能够被系统运行的命令。
lib/*.rb
中的文件,负责
- 推断命令是否匹配(使用正则match)
-
假设匹配,以JSON形式返回匹配的命令和说明
responses << {
:command => "grep --include=#{ pattern } -Rn #{ contains } #{ directory }",
:explanation => "Find files with extension that contains string."
}
我们以
betty find me all files that contain california
为例解说程序执行流程。 - betty 命令映射到了 main.rb 文件里, 触发了main方法
- main 方法调用 interpret 方法
- interpret 方法的主要职责是在
$executors
中寻找能匹配的命令,它通过调用executor
中的interpret
方法来实现的 - executor就是在lib中定义的module
定制自己的executor
目标:
想实现一个提示命令,比方输入 betty give me a help
就会在屏幕上显示全部的命令提示
依据以上得分析,我们发现实现自己的executor很easy,主要的过程例如以下
- 在lib中定义一个新的module
- 定义一个类方法
interpret(command)
- 假设匹配
command
,则返回response
- 将
executor
注冊到$executors
中
详细的代码请參考 https://github.com/chucai/betty
总结
betty真是一个好玩的工具。实现自己的特定的命令也特别的简单。
并且。这个项目还能够往更复杂的方向发展。比方类似于siri的语音提示,还有我们也能够定制自己的中文提示。
因为这个项目才刚刚開始,所以还是有非常多的不足之处,比方我们在处理特定的语音的时候,用的是正則表達式,还不够智能,逻辑也特别简单,假设想定制自己的需求。须要用户自己实现很多其它的细节。
但总体来说,这是一个非常棒的工具。