1 前期教程
2 前言
上面的前期教程当中,对keil的下载,安装以及配置都讲得非常清楚了,但是最近遇到一个问题,那就是网上找的代码非常杂乱,即使使用AStyle插件对其进行格式化之后,行尾空格或者文件末尾空行仍然消除不掉,让强迫症的我非常不适,因为我非常喜欢VSCode中保存文件即删除行尾空格和文件末空行的设置,于是就想给Keil这个“上古编辑器”也整一个。
3 keil插件制作
好在Keil虽然样式老,但还支持插件扩展功能,因此可以自己写一个插件来实现想要的功能,不过首先需要对插件运行原理有一个基本的了解。
插件设置在菜单栏Tools中:
这个界面非常简单,就是三个框设置:运行指令(点击按钮执行的是哪个指令),初始位置(指令执行时所在的位置,可能涉及到当前文件夹的问题),参数(指令运行时需要添加的参数);右边三个复选框,其中Run Minimized
是指运行时不产生黑框(如果有的话),Prompt for Argument
字面意思理解应该是会弹出参数输入的提示,没用过,Run Independent
,独立运行,也没用过。
重点是参数部分,!E
表示当前编辑的文本文件;$E
表示当前编辑的文本文件所在的文件夹。其他的就不怎么常用了。
其他更多指令建议参考这篇文章
OK,理解了基本逻辑,现在就可以开始制作插件,使用的编程语言是最熟悉的python,但是由于这里的Command不支持py脚本,还需要自己导出成执行程序,使用的是pyinstaller这个包。
我想要实现的功能主要是删除每一行的行尾空格以及文件末尾的多余空行(只保留一个空行),代码如下:
## format.py
import chardet, sys, glob
def format_file(filename, default_encoding='gb2312'):
''' @func: 去除文件末空白行, 去除行尾空格
@para filename:文件名; default_encoding:默认编码
@return: None
'''
try:
content = open(filename, 'rb').read() # 以字节方式读取
except:
print("文件"+filename+"打开失败")
source_encoding = chardet.detect(content)['encoding']
string = content.decode(source_encoding if source_encoding else default_encoding, 'ignore')
out = "\n".join(map(str.rstrip, string.rstrip().splitlines())) #删除文件末空行,并去除行尾空格
out = out + "\n" #行尾加一行空行
if out == string:
print("文件"+filename+"不需要格式化")
return
with open(filename, 'w') as f:
f.write(out)
print("文件"+filename+"格式化完成")
if __name__ == "__main__":
try:
filename = sys.argv
filelist = sum(list(map(glob.glob, filename[1:])), []) #获取所有文件名
# print(filelist)
list(map(format_file, filelist))
except Exception as e:
print(str(e))
# print("参数传入错误或没有传入参数")
然后再使用pyinstaller将脚本导出成执行程序:
pyinstaller -Fw ./format.py
参数可以按照下面这张图设置,实现的是一个文件夹中所有.c
和.h
文件都格式化: