超详细的Xcode代码格式化教程,可自定义样式。

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