Phenmod Zhu's Blog

注意你的注意力

用 ClangFormat 插件格式化 Objective-C 代码

多人开发的工程中,每人负责一部分,代码风格各异。如果没有统一的约定,在阅读和维护其他人的代码时,会有各种不适。一些简单的排版工作,比如空格有几个、括号是否换行等等,也会不必要地浪费一些精力。于是不少公司会使用一些工具对代码进行自动格式化,比如 Dropbox、Parse。

在 iOS 工程中,我们使用 ClangFormat 工具来格式化代码,Xcode 有方便的插件可用。插件地址:https://github.com/travisjeffery/ClangFormat-Xcode

安装

  • 安装 clang-format
1
brew install clang-format
  • 安装 Xcode 插件 ClangFormat-Xcode。可通过 Alcatraz或者直接下载源代码编译运行,然后重启 Xcode 。

  • 下载本人使用的格式配置文件,文件名为 .clang-format,把它放到 /Users/yourname/ 下,你的所有工程都会使用本配置文件。也可单独放到某工程文件夹里,仅限本工程使用。

或者自己使用 clang-format 导出一份配置文件再自己修改。

1
clang-format -style=WebKit -dump-config > .clang-format

注意,文件名最前面有个点,改名后会变为隐藏文件。如果你的 Finder 不能显示隐藏文件,可运行下面两条命令

defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder
  • 勾选上 Xcode -> Edit -> Clang Format -> File,该插件就会使用我们放到用户文件夹的配置文件对源码进行格式化了。

使用方式

  • 可以手动点选 Xcode -> Edit -> Clang Format -> Format File in Focus 对当前选中的文件进行格式化。也可以选择其它两个选项对当前选中的文本或多个文件进行格式化。
  • 可以选中 Xcode -> Edit -> Clang Format -> Enable Format on Save,使之变为 Disable Format on Save,这样在每次 cmd + s 保存文件时,都会自动格式化文件了。
  • 可以给 Xcode 配置系统快捷键。比如我们可以配置 ctr + i 作为对当前选中文件进行格式化的快捷键。步骤如下:
    • 打开系统偏好设置 -> 键盘 -> 快捷键 -> 应用程序快捷键,并点击 +
    • 设置应用程序为 Xcode,菜单标题为 Format File in Focus,快捷键里按下 ctr + i。当然,你也可以使用为其它命令设置快捷键。

每个人在提交代码之前,必须格式化代码。 用了这个之后,基本上就不用开发者做排版的事情了,哗啦啦写完代码,一键格式化,人生舒爽了很多。

格式配置文件

该插件默认了几种风格可供选用,但都不太符合我们想要的形式,于是自己定义了一个格式配置文件.format

这个是ClangFormat各配置项字段的详细说明,还有个用实例解释各字段的可交互网站

这个是Parse的配置文件,可做参考对比。

我们的这个配置还有很多不足的地方,比如长字符串会因为每行字符数限制被截断成两个字符串,并且每格式化一次,就再多截一段,直至截到某个阶段才不再变化。造成一个好好的字符串,变成了好几个只包含了一个或几个字符的字符串。

关于空行

配置文件里我们现在允许最多连续两行空行,正在考虑只允许一行。

确实有分段视觉需求的,使用pragma mark进行分割,如下:

1
2
3
// =================================================================================================
#pragma mark - <#代码分块注释#>
// =================================================================================================

用它定义个code snippet,来个快捷键(我的是pm),省心啊。

关于每行字符限制

如果你把上面的 pragma 段拷贝到 xcode,会发现上面那一串等号会终止在第 100 列。没错,我们现在每行字符数限制就是 100。

其实我很想定义到 120,但是在某些同学的 macbook air 的小屏幕上不太够显示。