clang-format 的 Xcode 集成
clang-format 的 Xcode 集成
之前文章 Xcode 中配置 clang-format 格式化 C++ 代码 中介绍的格式化方法有两个问题,
- 不能格式化整个文件,必需先选中文本
- 不支持项目中的
.clang-format
配置文件,只能读取全局的
利用 Xcode 自带的 Behaviors 可绑定快捷键执行一些任务,比如执行 shell 脚本。
而这里执行的 shell 脚本较 Automator 中的脚本区别在于,可以解决上面提到的两个问题。
- 脚本中通过执行 Apple Script 获取到当前正在编辑文件的路径,达到格式化整个文件的目的,无需进行文本选择。
- 因为执行上下文不在全局,所以项目中的
.clang-format
配置文件可以生效。这样格式配置可跟着项目走。
创建格式化脚本
首先创建一个 Behavior 中需要执行的脚本,在这个脚本中完成文件路径的获取,clang-format 的执行。
#!/bin/bash
# exec & >> ~/Desktop/test.log
export PATH=/usr/local/bin:$PATH
file=`osascript -e "tell application id \"com.apple.dt.Xcode\"
set CurrentActiveDocument to document 1 whose name ends with (word -1 of (get name of window 1))
set WhatYouWant to path of CurrentActiveDocument
end tell"`
# echo $file >> ~/Desktop/test.log
clang-format -i -style=file $file
将脚本保存到某个位置譬如 x/y/z/foramt.sh
。
赋予脚本可执行权限
然后通过以下命令保证脚本有执行权限:
$ chmod +x x/y/z/foramt.sh
配置 Xcode behavior
- 打开 Xcode behavior
Xcode behavior
-
点击左下角的
+
添加新的 behavior,随便取个名称,再点击名称旁边的 ⌘ 为该项绑定一个快捷键,比如⌘+⇧+M
, -
右边内容区域最下面勾选
Run
并选择前面步骤保存的 shell 文件。
最后完成后看起来是这样:
配置 Xcode behavior
使用
配置完成后,在编码过程中可通过前面配置的快捷键进行整个文件的格式化了。
格式化效果
如果项目根目录有放置 .clang-format
文件,则会正常读取到。同时这种方式还支持不同目录下放置不同的 .clang-format
配置文件,因为 clang-format 在格式化文件是,是会从文件所在目录向上逐级查找格式化配置文件的。
gotchas
实际使用过程中发现该命令会有失效的情况,具体还不知道是 xcode behavior 没执行还是 clang-format 的问题。