前言
通常我们在Windows上编写Python代码的时候,喜欢创建一个模板来在代码头部自动生成文件的相关信息注释。虽然在Pythonista中也能创建模板,但是该模板无法动态的获取文件名称,当前时间等信息。每次通过模板创建一个新文件都要手动填上文件名、创建时间等相关信息,之后修改了代码又要手动修改更新时间就更为麻烦了,哎,别问我是怎么知道的…
不过好在Pythonista作者为我们提供了editor模块,可以对Pythonista编辑器本身进行开发,也就为我们编写一个自动化维护文件信息的脚本提供了可能。
正文
代码实现
具体详细的教程我已经通过注释写在代码中了,你只需要按照从上到下的顺序阅览即可了解:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98import os
from datetime import datetime
import editor
import console
CODING='# -*- coding:utf-8 -*-\n' # 编码,该参数将放在第一行,也可修改成别的如python版本之类的
AUTHOR="SiriYang" # 作者,使用前改成自己的名字
TIME_FORMAT="%Y-%m-%d %H:%M:%S" # 符合datetime的时间格式,可按自己喜好修改
# 统计代码文件中有效代码行数(非注释,非空行)
def unCommentLines(textlists):
f=0
count=0
for i in textlists:
i=i.strip()
if(f==0 and (i.startswith('"""') or i.startswith("'''"))):
f=1
elif(f==1 and (i.startswith('"""') or i.startswith("'''"))):
f=0
elif(f==0 and len(i)>2 and not i.startswith('#')):
count+=1
return count
def main():
path=editor.get_path() # 获取当前编辑器页面打开的代码文件路径
if(path==None): # 如果没有文件被打开就返回
console.hud_alert("没有打开的文件","error",1)
return
file=os.path.basename(path) # 从路径中解析出文件名(带后缀)
# 使用editor.open_file()在当前窗口再次打开该文件,
# 其目的是确保之前编辑的缓冲区中的内容意已保存
editor.open_file(path)
text=editor.get_text() # 获取代码文件全部文本
textlines=text.splitlines() # 将代码文本按行切片
nowtime=datetime.strftime(datetime.now(),TIME_FORMAT) # 获取当前时间,之后可能会多次使用
count=0 # 记录当前游标所指向的位置
line=0 # 记录当前游标所在行数
info=CODING # info为我们的文件信息,之后用于文本替换。先初始化为CODING。
info+='"""\n' # 加上多行注释的开头部分
if(text.startswith(info)): # 判断该文本是否已具有文件信息
for i in textlines: # 遍历所有行(其实只遍历了最开始的文件信息部分)
line+=1 # 游标行数加1
count+=len(i)+1 # 游标加上改行字符数,因为换行符在切割的时候被丢掉了,所以要手动加1
# 如果此时找到多行注释符且行数大于2,
# 则判断为注释结束标志
if(i.startswith('"""') and line>2):
#开始收尾工作,准备跳出循环
#以下判断语句主要是了兼容之前模板没有加上的条目
if(not '@updateTime:' in info): # 如果已找到的信息注释中没有更新时间则加上
info+='@updateTime: '+nowtime+'\n'
if(not '@codeLines:' in info): # 如果已找到的信息注释中没有代码统计则加上
info+='@codeLines: '+str(unCommentLines(textlines))+'\n'
info+='"""\n' # 加上多行注释的结尾
break
# 如果找到@file,则更新为新的文件名,并加入info
if(i.startswith('@file:')):
info+='@file: '+file+'\n'
continue
# 如果找到@updateTime,则更新为当前时间,并加入info
if(i.startswith('@updateTime:')):
info+='@updateTime: '+nowtime+'\n'
continue
# 如果找到@codeLines,则重新统计代码行数,并加入info
if(i.startswith('@codeLines:')):
info+='@codeLines: '+str(unCommentLines(textlines))+'\n'
continue
# 但凡找到以@开头的字段都统统加入info,用户可以针对不同文件加入不同的@字段
# 同样也保证了对于之前已存在的用户和创建时间字段不做修改
if(i.startswith('@')):
info+=i+'\n'
else: # 如果没有则重新创建,用户可根据自己需求调整编辑以下初始模板,增删或调整字段顺序
info+='@author: '+AUTHOR+'\n'
info+='@file: '+file+'\n'
info+='@createTime: '+nowtime+'\n'
info+='@updateTime: '+nowtime+'\n'
info+='@codeLines: '+str(unCommentLines(textlines))+'\n'
info+='"""\n\n' # 多加一个换行符,让有效代码与信息注释之间空一行
editor.replace_text(0,count,info) # 替换老旧的文件信息,或创建插入(此时count==0,即在开头插入)
editor.open_file(path) # 再次在当前窗口打开该文件,以保存我们之前更新的信息
if __name__ == "__main__":
main()
最终实现效果如下:
1
2
3
4
5
6
7
8# -*- coding:utf-8 -*-
"""
@author: SiriYang
@file: FileInfo.py
@createTime: 2020-03-28 00:00:05
@updateTime: 2020-03-30 11:47:42
@codeLines: 66
"""
脚本的使用
要使用以上代码我们需要将其加入编辑器右上角的工具栏,即”扳手“按钮,然后切换到想要处理的代码页面,点击工具栏快捷方式执行就行了。
对于加入工具栏的快捷方式,Pythonista会在主程序中为其生成一个快捷键,只需要点击该快捷键就行执行了(估计只有前10个脚本才有快捷键,毕竟数字键就只有10个)。且工具栏中的脚本都是在后台运行,直接呈现结果,执行过程对用户是透明的,使用起来就像是系统原生的功能一样,非常舒服。当然想要使用快捷键的前提是你的iOS设备外接了物理键盘。
结语
该脚本目前只按照我自己的需求开发了一些字段,其还有很大的拓展空间,用户后期可以自由发挥添加自己想要的字段进去。