最近开始做项目布署和发布方面的工作,Dreamforce本着提高工作效率的立场出发,觉得有必要提高一下CMD工作效率。
Window自带的CMD有什么缺点:
1. 没有代码高亮显示,不好看
2. Tab键功能很鸡胁,不能列出当前文件目录,也不能进行命令扩展
3.自动补全功能也不行
最终实现蓝图:
当我在命令行下 输入 ‘maven -’ 按下TAB键,系统会自动提示我Maven相关的参数,这样效率将会是极大的提高,而Dreamforce本人在Google上搜了很久,用了很多关键字,无果。所以下定决心,自己做一个了。
技术剖析:
获取命令行的输入
执行命令并输出结果。
关键字处理及匹配。
1.获取命令行的输入
raw_input()与input()
一般来说raw_input()可以获取来自于控制台的任何输入,而input()只能接受Python认为的合法的输入。所以这里我们要果断的选择raw_input()来实现命令输入。
当然Python也有众多的LIB可供选择,对于想了解CMD构造全过程的细节的话,推荐使用Python内建库,因为有些需求它不能满足,而这是这种瓶颈才能够有个中体会。
2.执行命令并输出结果
Python执行命令可以使用os.system(‘cmd’),而且它会自动输出执行结果。但当你试图使用CD命令来改变路径的时候却没有任何改变,这和os.system的函数原理有关。它并不是在同一个Shell下面执行的,而是每次都会新开一个Shell,执行完毕后关闭Shell,返回结果。所以当试图使用CD这种命令时就不会有任何效果,当然subprocess可以将所有Shell执行放在同一个进程但还是不能从根本上解决问题,而这里我给出的解决方案是:
将每一个命令集存为单独一个token ,比如 ‘cd D:\’ 这就应该是两个tokens,然后判断tokens[0] = ‘cd’ 时就执行os.chdir(tokens[1]),相当于将CD命令转义执行。这样就可以保证路径切换正常执行。同理其它的处理方式相当,而将命令保存为TokenList将会有非常多的好处。
3.关键字处理及匹配
上面提到的Tokens,这里就可以很好的进行匹配处理了
这里匹配可以使用正则进行匹配
matcher = wildcard_to_regex(prefix + '*') def wildcard_to_regex(pattern): """ Transform a wildcard pattern into a compiled regex object. This also handles escaping as needed. """ # Transform pattern into regexp translations = [('\\', '\\\\'), ('(', '\\('), (')', '\\)'), ('[', '\\['), (']', '\\]'), ('.', '\\.'), ('+', '\\+'), ('^', '\\^'), ('$', '\\$'), ('?', '(.)'), ('*', '(.*)')] re_pattern = pattern for src, dest in translations: re_pattern = re_pattern.replace(src, dest) re_pattern += '$' return re.compile(re_pattern, re.IGNORECASE) for elem in os.listdir(dir_to_complete) if matcher.match(elem)
读取配置:
def readCrossLineCommands(): global crossLine_commands file_object = open('cross_line_commands.properties') try: for line in file_object: crossLine_commands.append(mytrim(line)) finally: file_object.close( )
为防止每次重复读取文件,加一个缓存
def getCrossLineCommands(): if(len(crossLine_commands)==0): readCrossLineCommands() return crossLine_commands
匹配关键字:
# Add internal commands internal_commands =getCustomizationCommands() if sys.getwindowsversion()[0] >= 6: # Windows 7 or newer internal_commands.append('mklink') completions_path += [elem for elem in internal_commands if matcher.match(elem) and not elem in completions and not elem in completions_path]
自动完成项过滤
completions_path_nice = [] for i in range(0, len(completions_path_no_ext)): similar = [elem for elem in completions_path_no_ext if elem == completions_path_no_ext[i]] similar += [elem for elem in completions if strip_extension(elem) == completions_path_no_ext[i]] if len(similar) == 1 and has_exec_extension(completions_path[i]) and len(prefix) < len(completions_path[i]) - 3: # No similar executables, don't use extension completions_path_nice.append(completions_path_no_ext[i]) else: # Similar executables found, keep extension completions_path_nice.append(completions_path[i]) completions += completions_path_nice
完成自动匹配
if completions != []: # Find the longest common sequence common_string = find_common_prefix(prefix, completions) if path_to_complete == '': completed_file = common_string elif path_to_complete == '\\': completed_file = '\\' + common_string else: completed_file = path_to_complete + '\\' + common_string
主要技术点就在此。提供一个Win7-64位的EXE测试
http://dl.dbank.com/c085pfzdmm
好文拜读. dreamforce.me 好样的.
开发人员要找开源软件及相关资料,介绍个好去处 http://www.boyunjian.com/?fm=9003