最近编写了两个辅助iOS开发的,用于一些自动化处理。
简介
objective-c 方法名格式化器
由于工作有些变动的原因,之前一段时间开发iOS时是在21寸的iMac屏幕上开发,现在自己买了macbook pro之后就在自己的笔记本上开发(其实之前更早的时候我是在19寸的黑苹果显示器下开发)。这样的屏幕尺寸变化,导致一些基于原来屏幕尺寸的代码缩进、换行在另一个屏幕上看起来显得异常混乱。
了解obj-c语法的人都知道,它的方法定义语法导致了它有时看起来比其他语言的方法签名要长得多。这样在那种13寸的笔记本上,看起来总是很别扭(虽然它支持了方法定义可以换行,但在xcode创建一个文件时,它对于包含多个参数的那些默认方法名称也是不换行的)。使用xcode默认的代码格式化器貌似也没有对方法的参数换行(就算有,对于已经存在的项目这种历史遗留问题,一个文件一个文件去手动执行格式化命令,也怪累人的)
于是,我写了个脚本,专门用来做这件事。
它根据配置的项目路径:
#TODO: change the path to your xcode project pathGLOBAL_PROJECT_PATH = '/Users/yanghua/Desktop/weiboDemo'去匹配特定后缀的文件类型:
#want to match GLOBAL_INCLUDE = ['*.h', '*.m']当然,为了小心起见你或许不想动那些你从外部引入的库文件,这里也对此进行了支持(你只需把需要排除的文件夹相对路径或文件的相对路径填写进去即可):
#want to exclude GLOBAL_EXCLUDE = []然后,它就会遍历所有匹配到的文件,打开它们,再遍历所有的行,使用正则来匹配方法签名
注:这里的正则表达式,是自己根据obj-c语法写的。用此脚本格式化了两个项目后,再进行编译没有发现语法错误。本人正则小白,如果有更好的写法,请不吝赐教!
#match method pattern#\s :space#\s* :0 or n space#([\d\w]*) :0 or n number or char such as (void) / ( CGFloat)#(([\d\w]*)\s*\**\s*): such as: (NSString* ) / ( UITableViewController *)#\( :match left '('#\) :match right ')'GLOBAL_METHOD_PATTERN = '^\s*(-|\+)\s*\(\s*(([\d\w]*)\s*\**\s*)\s*\)\s*'#match notation and postilGLOBAL_UNUSED_PATTERN = '^\s*(//|//*)\s*'几点说明:
(1)匹配所有方法名
(2)如果方法没有或只有一个参数则不进行处理
(3)如果方法多于一个参数,从第二个参数开始,任何参数的标签,如果比方法名第一段字符个数多,也不进行处理(因为这样这行,无法基于冒号对齐)
(4)对于被注释的方法名,不进行任何处理
(5)对于方法调用暂时没有进行处理(太复杂了)
(6)其他的方法签名都会被匹配折行处理
效果举例:
-(CGFloat) getHeightWithText:(NSString*)text fontSize:(CGFloat)fontSize constraint:(CGSize)cSize minHeight:(CGFloat)mHeight;to:
-(CGFloat) getHeightWithText:(NSString*)text fontSize:(CGFloat)fontSize constraint:(CGSize)cSize minHeight:(CGFloat)mHeight;
svn missing-file 警告处理器
运行
命令行运行
./Users/yanghua/Desktop/Python/objcFileHandler/objcMethodFormatter.py
Xcode 内置 per/post-action 运行【推荐】
写在最后