超详细的Xcode代码格式化教程,可自定义样式
为什么要格式化代码
当团队内有多人开发的时候,每个人写的代码格式都有自己的喜好,也可能会忙着写代码而忽略了格式的问题。
在之前,我们可能会写完代码后,再一点一点去调格式,很浪费时间。
有了ClangFormat插件后,就可以一键把代码格式化成统一的样式,不仅节省了时间,也使得代码更规范。我们还可以定制自己喜欢的样式。
安装ClangFormat插件
可以手动安装(下载GitHub项目编译),也可以用Alcatraz(插件管理器)安装,都很简单,具体可以看我的文章《Xcode方便开发的插件推荐》。
装好后是下图这样的,我们可以看到它内置了LLVM、Google、Chromium、Mozilla、WebKit五种样式。
使用方法
通过菜单可以看到,它可以格式化选中的文字们,或者格式化选择的文件们。下面演示下LLVM样式下的格式化:
使用自定义样式
1、需要先把上面菜单里面的File选中,因为我们需要让它用我们自己写的配置文件。
2、在工程目录下创建配置文件.clang-format文件并编辑。.clang-format文件用的是YAML格式:里面要用的字段在后面会详细解释。
key1: value1# 一个注释key2: value2
当然如果你已经有.clang-format文件的话,直接拖动到项目根目录也可以。 文章结尾有我在用的.clang-format文件。
温馨提示:.clang-format文件是隐藏文件,默认是看不见的。需要在终端输入以下命令:
//显示 隐藏文件defaults write com.apple.finder AppleShowAllFiles -bool truekillall Finder//隐藏www.90168.org 隐藏文件defaults write com.apple.finder AppleShowAllFiles -bool falsekillall Finder
全局配置
上面我们是在项目根目录创建的.clang-format文件,每次建新项目都要有。如果你想让所有的项目公用一个文件,把.clang-format文件放在所有项目都在的一个最大根目录下就可以了。
让一段代码不受格式化影响
如果想让一段代码不受格式化影响,需要将他们包含在// clang-format off 和 // clang-format on这两句注释之间,这样这段代码就不会被格式化,但是这两句注释本身是会被格式化的。
设置快捷键
首先你可以选中菜单中的 Enable Format On Sava,把它点Disable Format On Sava,这样以后每次按⌘+S保存文件时就可以自动格式化了。
我们也可以给一些菜单设置快捷键,使用的时候不用每次去选择各级菜单了。比如我们给Format Selected Text设置快捷键:
你也可以为其他菜单设置快捷键,其实呢,我用Format Selected Text的时候很少,每次都是想格式化的时候直接⌘+S就行了。
配置文件中属性的含义讲解
下面说一些配置文件的常用的参数介绍,其他的可以看官方文档:Clang-Format Style Options,其中小括号内代表他需的是什么类型的值。
BasedOnStyle (string)
基于哪种样式。除了文件中写出的定制属性外,别的没定制的属性都默认用这种样式的。
可选值有五种: LLVM:一种遵循LLVM coding standards的样式。 Google:一种遵循Google’s C++ style guide的样式。 Chromium:一种遵循Chromium’s style guide的样式。 Mozilla:一种遵循Mozilla’s style guide的样式。 WebKit:一种遵循WebKit’s style guide的样式。
AccessModifierOffset (int)
访问修饰词 (比如public)www.90168.org 前面额外需要加的缩进长度。默认为0。
AlignConsecutiveAssignments (bool)
如果是true,把连续的赋值操作按=对齐,默认为false。
AlignConsecutiveDeclarations (bool)
如果是true,把连续行的变量名对齐。默认为false。
AlignTrailingComments (bool)
如果是true,对齐尾部注释。默认为false。
AllowShortCaseLabelsOnASingleLine (bool)
如果是true, 允许一个case在一行写完,默认为false。
BreakBeforeBraces (string)
大括号前面是否换行,具体可选值看文档。一般用Allman,代表所有大括号都换行。
ColumnLimit (unsigned)
每行最多多少个字符,0不限制
IndentWidth (unsigned)
缩进宽度,默认为2,但是我们一般设置为4。
IndentCaseLabels (bool)
switch的case缩进宽度,一般用true。默认为false,case会和switch对齐。
KeepEmptyLinesAtTheStartOfBlocks (bool)
是否保留block里面开始的空行们。默认为true。
MaxEmptyLinesToKeep (unsigned)
最多可以有连续几行空行,默认为1。
ObjCBlockIndentWidth
OC的block里面的缩进宽度,默认为4。
ObjCSpaceAfterProperty (bool)
OC里面,是否在@property后加空格。默认为false。
OC里面,是否在Protocol名字列表前面加空格,默认为true。
PointerAlignment (string)
指针的位置。默认为Right。 可选值: Left:NSString* name Middle:NSString * name Right:NSString *name
SpaceBeforeAssignmentOperators (bool)
= 前面是否有空格。默认为true。
SpaceBeforeParens (string)
是否在(前面加空格。默认ControlStatements。 可选值: Never: 从来不在(前面加空格。 ControlStatements:在控制语句(for/if/while...)的(前面加空格。 Always:总会在(前面加空格。
SpaceInEmptyParentheses (bool)
是否在()里面插入一个空格。默认false。
SpacesBeforeTrailingComments (unsigned)
在尾部//注释前面加几个空格。
SpacesInAngles (bool)
是否在<后边和>前边插入空格,默认为false。
SpacesInContainerLiterals (bool)
@[]里面,是否在 [ 后和 ] 前加空格。默认为true。
SpacesInParentheses (bool)
是否在(后面和)前面加空格,默认为false。
当项目里面有多种语言时,我们可以分别设置样式:
---# 我们默认用 LLVM 样式, 缩进宽度为4。BasedOnStyle: LLVMIndentWidth: 4---Language: Cpp# C++ 设置星号左对齐。PointerAlignment: Left---Language: JavaScript# JavaScript 每行字符限制设置为100。ColumnLimit: 100---Language: Proto# 不格式化Proto文件。DisableFormat: true...
这个是我在用的.clang-format文件。大家可以下载下来自己修改一下再用。