前言
今天突然想起将Xcode的代码格式化一下,用之前的“XCFormat” Mac app好像不太好使了,于是就要网上找了一个clang-format工具,这个工具非常好用,而且可以根据配置文件高度定制格式化代码的风格,下面我将结合网上的资料,和我集成过程中遇到的问题,记录如下。
本机Mac系统版本:MacOS Sonoma 14.1.1
本机Xcode版本:15.0.1
安装clang-format
在安装之前可以先检查一下你的电脑里面有没有安装过clang-format,使用终端输入下面的命令检查版本
clang-format --version
如果有的话,会出现以下提示
clang-format version 17.0.6
如果没有的话,则会提示找不到,这时候可以使用下面的命令进行安装
brew install clang-format
安装成功之后始可以通过clang-format --version查看版本
成功查看到版本信息就说明安装成功了。
创建格式化配置文件.clang-format并编辑
打开终端,并进入到用户根目录
cd ~
然后创建.clang-format文件
touch .clang-format
打开根目录
open ~
由于这个是隐藏文件,所以需要打开显示隐藏文件功能,使用快捷键command + shift + . 快速隐藏/显示隐藏文件,也可以使用以下命令行显示或隐藏
// Mac系统如何显示隐藏文件?
// 1.显示:
// 打开终端:输入
defaults write com.apple.finder AppleShowAllFiles -bool true
// 回车再次输入
KillAll Finder
// 2.隐藏:
// 打开终端:输入
defaults write com.apple.finder AppleShowAllFiles -bool false
// 回车再次输入
KillAll Finder
找到并打开.clang-format文件,复制以下内容到这个文件,然后保存,可以根据需要进行自定义配置
# 工具 https://github.com/mapbox/XcodeClangFormat(需要添加签名使用)
# 函数名详细地址 英文 http://clang.llvm.org/docs/ClangFormatStyleOptions.html
# 函数名详细地址 中文 https://www.cnblogs.com/PaulpauL/p/5929753.html
# 基于样式
BasedOnStyle: LLVM
# 对齐注释
AlignTrailingComments: true
# 指针和引用的对齐方式
PointerAlignment: Right
# 用于缩进的列数
IndentWidth: 4
# switch的case缩进
IndentCaseLabels: true
# OC里面,在@property后加空格
ObjCSpaceAfterProperty: true
# OC里面,在Protocol前后加空格
ObjCSpaceBeforeProtocolList: true
# 单行注释前的空格数
SpacesBeforeTrailingComments: 1
# 连续的空行保留几行
MaxEmptyLinesToKeep: 1
# 保留block里面的空行
KeepEmptyLinesAtTheStartOfBlocks: false
# 每行字符的限制,0表示没有限制
ColumnLimit: 0
# []中添加空格
SpacesInSquareBrackets: false
# ()中添加空格
SpacesInParentheses : false
# 容器类前添加空格
SpacesInContainerLiterals: true
# 赋值运算符前加空格
SpaceBeforeAssignmentOperators: true
# 在空括号中加空格
SpaceInEmptyParentheses: false
# 在<>中间插入空格
SpacesInAngles: false
# 换行的时候对齐操作符
AlignOperands: true
# 括号中的(),{},[]代码对齐方式
#AlignAfterOpenBracket: Align
#ContinuationIndentWidth: 0
# 赋值=对齐
AlignConsecutiveAssignments: false
# 声明参数对齐
AlignConsecutiveDeclarations: false
# 运算符位置
BreakBeforeBinaryOperators: None
# 允许短的函数放在同一行
#AllowShortFunctionsOnASingleLine: None
# 允许case在同一行
AllowShortCaseLabelsOnASingleLine: false
# 允许if在同一行
AllowShortIfStatementsOnASingleLine: false
# 允许while在同一行
AllowShortLoopsOnASingleLine: false
# 允许将简单的语句块放到同一行
AllowShortBlocksOnASingleLine: false
#缩进函数名
IndentWrappedFunctionNames: false
# 形参 如果为false要么都在同一行,要么各有一行
BinPackParameters: false
# 实参 如果为false要么都在同一行,要么各有一行
BinPackArguments: false
# 大括号换行
BreakBeforeBraces: Custom
BraceWrapping:
# class定义后面
AfterClass: true
# 控制语句后面
AfterControlStatement: false
# enum定义后面
AfterEnum: false
# 函数定义后面
AfterFunction: false
# 命名空间定义后面
AfterNamespace: false
# struct定义后面
AfterStruct: false
# union定义后面
AfterUnion: false
# catch之前
BeforeCatch: false
使用
1、添加自动化服务
在Mac上找到自动操作app,并打开

选择快速操作,点击选取

然后根据下图完成操作

脚本内容如下:
export PATH=/usr/local/bin:$PATH
clang-format
完成之后保存退出,起一个名字,比如"xcode_format",之后设置快捷键的时候需要用到。
可以使用下面的命令找到这个文件的位置
open ~/Library/Services
完成之后,就可以打开Xcode使用了,command+A选中文件中的全部代码,右键-弹出的Services中,选择刚才的xcode_format即可以开始格式化

2、添加快截键
此时你们这里应该还没有^F快捷键的图标,需要的同学可以设置快捷键
系统偏好设置->键盘->快捷键->app快捷键->选择添加->选择Xcode

此时,应该就可以使用快捷键进行格式化了。
3、在Xcode中使用clang-format
如果你觉得每次都只能对某个选中文件进行格式化还不够简单方便快捷的话,下面将介绍一个终级武器,添加Xcode自动运行脚本,这个脚本会在每次构建项目时,自动运行,所以当我们使用command+B或者command+R运行的时候,这个脚本会找到你的项目中的所有.h、.m和.mm文件,然后使用clang-format来格式化这些文件。
你可以在Xcode中创建一个新的"Run Script"构建阶段,来在每次构建时运行clang-format。以下是具体的步骤:
-
在Xcode中,选择你的项目,然后选择你的目标。
-
切换到"Build Phases"标签。
-
点击"+"按钮,然后选择"New Run Script Phase"。
-
在新的构建阶段中,你可以输入以下的脚本:
if which clang-format > /dev/null; then
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.mm" \) -print0 | xargs -0 clang-format -i
else
echo "warning: clang-format not installed, download from http://llvm.org/releases/download.html"
fi
注意事项
如果报以下错误

- 查看 /usr/local/bin 文件夹下是否存在 clang-format 可执行文件,命令如下
cd /usr/local/bin
open .
如果不存在,尝试以下命令,
查找clang-format的具体路径
which clang-format
输出结果如下
/opt/homebrew/bin/clang-format
然后将clang-format软连接到/usr/local/bin路径下,命令行如下
ln -s /opt/homebrew/bin/clang-format /usr/local/bin
如果被拒绝没有权限的话,尝试在命令行前面加上sudo
sudo ln -s /opt/homebrew/bin/clang-format /usr/local/bin
此时/usr/local/bin这个目录下应该有clang-format的可执行文件了。
再次运行,应该就可以解决上面的错误了。
网友评论