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

为什么要格式化代码

当团队内有多人开发的时候,每个人写的代码格式都有自己的喜好,也可能会忙着写代码而忽略了格式的问题。
在之前,我们可能会写完代码后,再一点一点去调格式,很浪费时间。

有了ClangFormat插件后,就可以一键把代码格式化成统一的样式,不仅节省了时间,也使得代码更规范。我们还可以定制自己喜欢的样式。

安装ClangFormat插件

可以手动安装(下载GitHub项目编译),也可以用Alcatraz(插件管理器)安装,都很简单,具体可以看我的文章《Xcode方便开发的插件推荐》

装好后是下图这样的,我们可以看到它内置了LLVMGoogleChromiumMozillaWebKit五种样式。

插件菜单

使用方法

通过菜单可以看到,它可以格式化选中的文字们,或者格式化选择的文件们。下面演示下LLVM样式下的格式化:

LLVM样式下的格式化

使用自定义样式

1、需要先把上面菜单里面的File选中,因为我们需要让它用我们自己写的配置文件。

选中File

2、在工程目录下创建配置文件.clang-format文件并编辑。.clang-format文件用的是YAML格式:里面要用的字段在后面会详细解释。

key1: value1
# 一个注释
key2: value2

自定义样式格式化代码

当然如果你已经有.clang-format文件的话,直接拖动到项目根目录也可以。
文章结尾有我在用的.clang-format文件。

温馨提示:.clang-format文件是隐藏文件,默认是看不见的。需要在终端输入以下命令:

//显示 隐藏文件
defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder
//隐藏 隐藏文件
defaults write com.apple.finder AppleShowAllFiles -bool false
killall Finder

全局配置

上面我们是在项目根目录创建的.clang-format文件,每次建新项目都要有。如果你想让所有的项目公用一个文件,把.clang-format文件放在所有项目都在的一个最大根目录下就可以了。

让一段代码不受格式化影响

如果想让一段代码不受格式化影响,需要将他们包含在// clang-format off 和 // clang-format on这两句注释之间,这样这段代码就不会被格式化,但是这两句注释本身是会被格式化的。

让一段代码不受格式化影响

设置快捷键

首先你可以选中菜单中的 Enable Format On Sava,把它点Disable Format On Sava,这样以后每次按⌘+S保存文件时就可以自动格式化了。

屏幕快照 2016-09-10 下午12.43.50.png

我们也可以给一些菜单设置快捷键,使用的时候不用每次去选择各级菜单了。比如我们给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) 前面额外需要加的缩进长度。默认为0。

AlignConsecutiveAssignments (bool)
如果是true,把连续的赋值操作按=对齐,默认为false。

AlignConsecutiveDeclarations-true

AlignConsecutiveDeclarations (bool)
如果是true,把连续行的变量名对齐。默认为false。

AlignConsecutiveDeclarations-true

AlignTrailingComments (bool)
如果是true,对齐尾部注释。默认为false。

AlignTrailingComments-true

AllowShortCaseLabelsOnASingleLine (bool)
如果是true, 允许一个case在一行写完,默认为false。

AllowShortCaseLabelsOnASingleLine-true

BreakBeforeBraces (string)
大括号前面是否换行,具体可选值看文档。一般用Allman,代表所有大括号都换行。

BreakBeforeBraces-Allman

ColumnLimit (unsigned)
每行最多多少个字符,0不限制

IndentWidth (unsigned)
缩进宽度,默认为2,但是我们一般设置为4。

IndentWidth-4

IndentCaseLabels (bool)
switch的case缩进宽度,一般用true。默认为false,case会和switch对齐。

KeepEmptyLinesAtTheStartOfBlocks (bool)
是否保留block里面开始的空行们。默认为true。

KeepEmptyLinesAtTheStartOfBlocks-true

MaxEmptyLinesToKeep (unsigned)
最多可以有连续几行空行,默认为1。

MaxEmptyLinesToKeep-1

ObjCBlockIndentWidth
OC的block里面的缩进宽度,默认为4。

ObjCSpaceAfterProperty (bool)
OC里面,是否在@property后加空格。默认为false。

ObjCSpaceAfterProperty-true

ObjCSpaceBeforeProtocolList (bool)
OC里面,是否在Protocol名字列表前面加空格,默认为true。

ObjCSpaceBeforeProtocolList-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:总会在(前面加空格。

SpaceBeforeParens-ControlStatements

SpaceInEmptyParentheses (bool)
是否在()里面插入一个空格。默认false。

SpacesBeforeTrailingComments (unsigned)
在尾部//注释前面加几个空格。

SpacesBeforeTrailingComments-3

SpacesInAngles (bool)
是否在<后边和>前边插入空格,默认为false。

SpacesInAngles-true

SpacesInContainerLiterals (bool)
@[]里面,是否在 [ 后和 ] 前加空格。默认为true。

SpacesInContainerLiterals-true

SpacesInParentheses (bool)
是否在(后面和)前面加空格,默认为false。

SpacesInParentheses-true

当项目里面有多种语言时,我们可以分别设置样式:

---
# 我们默认用 LLVM 样式, 缩进宽度为4。
BasedOnStyle: LLVM
IndentWidth: 4
---
Language: Cpp
# C++ 设置星号左对齐。
PointerAlignment: Left
---
Language: JavaScript
# JavaScript 每行字符限制设置为100。
ColumnLimit: 100
---
Language: Proto
# 不格式化Proto文件。
DisableFormat: true
...

这个是我在用的.clang-format文件。大家可以下载下来自己修改一下再用。

欢迎关注  和我的专题:iOS技术交流,查看更多好文章。
欢迎加入iOS技术交流群:244122891,这里有很多爱学习爱交流的人。

 
文/iOS_小松哥(简书作者)
原文链接:http://www.jianshu.com/p/a725e24d7835
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

超详细的Xcode代码格式化教程,可自定义样式。的更多相关文章

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

    为什么要格式化代码 当团队内有多人开发的时候,每个人写的代码格式都有自己的喜好,也可能会忙着写代码而忽略了格式的问题. 在之前,我们可能会写完代码后,再一点一点去调格式,很浪费时间. 有了ClangF ...

  2. Xcode代码格式化教程,可自定义样式

    来源:iOS_小松哥 链接:http://www.jianshu.com/p/a725e24d7835 为什么要格式化代码 当团队内有多人开发的时候,每个人写的代码格式都有自己的喜好,也可能会忙着写代 ...

  3. 超详细!Github团队协作教程(Gitkraken版)

    超详细!Github团队协作教程(Gitkraken版) 一.前期工作 1. 在 Github 上创建 organization step1. 登录Github网站,点击右上角头像,选择 " ...

  4. iOS开发-xCode代码格式化xAlign

    xCode默认是可以进行代码格式化的,能满足基础开发需求,如果想要个性一些代码对齐方式宏对齐,等号对齐,属性对齐,xAlign就提供了以上三种功能,参考文中效果~ 基础效果 等号对齐: 属性对齐: 宏 ...

  5. hadoop入门篇---超详细hadoop服务器环境配置教程

    虚拟机以及Linux系统安装在之前的两篇分享中已经详细的介绍了方法,并且每一步的都配图了.如果有朋友还是看不懂,那我也爱莫能助了.本篇主要就hadoop服务器操作系统配置进行详细说明,hadoop安装 ...

  6. 【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由E ...

  7. 超详细的FreeRTOS移植全教程——基于srm32

    ### 准备 在移植之前,我们首先要获取到FreeRTOS的官方的源码包.这里我们提供两个下载链接: > 一个是官网:http://www.freertos.org/ > 另外一个是代码托 ...

  8. 微信支付接口--超详细带注释代码--Demo

    如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 如果对你有帮助的话麻烦点个[推荐]~最好还可以follow一下我的GitHub~感谢观看! 微 ...

  9. 超详细的RNN代码实现(tensorflow)

    一.学习单步的RNN:RNNCell 如果要学习TensorFlow中的RNN,第一站应该就是去了解“RNNCell”,它是TensorFlow中实现RNN的基本单元,每个RNNCell都有一个cal ...

随机推荐

  1. javascript encodeURI和encodeURIComponent的比较

    总结:encodeURI对除三种字符()之外的字符进行编码 encodeURIComponent对除两种字符之外的字符进行编码,保留字符会被转义 在进行SaaS前端开发的时候,大家经常会用到两个Jav ...

  2. windows tomcat 优化

    windows tomcat 优化 1.  tomcat conf server.xml 在server.xml中修改以一部分,增加节点数目,可以很好的提高性能: <Connector port ...

  3. js跨域及解决方案

    本文出自:http://www.cnblogs.com/oneword/archive/2012/12/03/2799443.html 1.什么是跨域 我们经常会在页面上使用ajax请求访问其他服务器 ...

  4. Java EE 锚、表格用法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. python_way day17 jQuery表单验证,事件绑定,插件,文本框架,正则表达式

    python_way day17 1.jQuery表单验证 dom事件绑定 jquery事件绑定 $.each return值的判断 jquery扩展方法 2.前段插件 3.jDango文本框架 4. ...

  6. 对象导论 Thinking in Java 第一章

    1.1 抽象过程 1.人们能够解决问题的复杂性直接取决于抽象的类型和质量. 1.2 每个对象都有一个接口 1.3 每个对象都提供服务 1.4 被隐藏的具体实现 1.程序猿分为:类创建者 和 客户端程序 ...

  7. json与jsonp应用及其他ajax数据交互方式

    1.json是数据交换格式,使用实例如下: $.getJSON( '/manage/asset/asset_delByIds.action', { 'ids':id }, function(data) ...

  8. poj2354Titanic(两点的球面距离)

    链接 球面距离计算公式:d(x1,y1,x2,y2)=r*arccos(sin(x1)*sin(x2)+cos(x1)*cos(x2)*cos(y1-y2)) x1,y1是纬度\经度的弧度单位,r为地 ...

  9. ora-01033:oracle initialization or shutdown in progress 解决方法

    今天研究Oracle遇到了这个问题ora-01033:oracle initialization or shutdown in progress,经过分析研究终于解决了,写下来纪念一下.我的库是ora ...

  10. STM32学习笔记(一) 如何新建一个STM32工程模板

    学习stm32,第一步就是选择开发工具了,GCC,MDK,IAR每一种都有自己的优劣势,这里我选择使用MDK软件实现STM32模板.当然如果想更快的接触stm32实例,领略嵌入式开发的魅力,STM也提 ...