如何获得 Xcode 8 的 clang 格式?

Posted

技术标签:

【中文标题】如何获得 Xcode 8 的 clang 格式?【英文标题】:How to get clang format for Xcode 8? 【发布时间】:2017-02-06 10:17:04 【问题描述】:

在 Xcode 更新到版本 8 后。非常有用的 Alcatraz PlugIn Manager 被锁定,并且诸如 clang-format 或突出显示选定的单词出现,或使用快捷方式调整字体大小等一流的实用程序都消失了。

如何重新启用 clang-format 以在保存时使用源文件的任何父目录中的模板 .clang-format 格式化我当前的源代码文件?

【问题讨论】:

【参考方案1】:

看起来 Alcatraz 插件在取消签名后可以在 Xcode 8+ 中恢复工作。因为我没有条件尝试,我只能向您指出该资源:

检查该 github 页面 ClangFormat-Xcode 上的标题 Installation

【讨论】:

我在更新到 Xcode 9.2 后尝试过。我使用工具 update_xcode_plugins 在 ClangFormat-Xcode github 页面上描述了我的 Xcode 签名。所有其他 alcatraz 插件再次工作,但 ClangFormat 插件不起作用。我的解决方案是使用上面的脚本,删除保存功能和延迟条目,并通过 Xcodes Behaviours 将其绑定到快捷方式。现在我先按 CMD+S,然后是在当前文件上外部应用 clangformat 的快捷方式。【参考方案2】:

在此博客中找到了可行的解决方案 - code-beautifier-in-xcode

基本上,我们可以让clang-format 由自动机作为服务运行,并在需要格式化代码时通过 Xcode 调用它。有关详细信息,请参阅博客。

【讨论】:

【参考方案3】:

不幸的是,您的小脚本通常不会更新 Xcode 中的格式化文件,因为它在保存时停止侦听文件更新。增加脚本中的睡眠持续时间不会使其更可靠,并且会为常见的文件保存和文件格式操作引入大量等待时间。

在您的情况下,我所做的是获取我的 mac 备份并将 macOS 和 Xcode 恢复到最后一个版本,其中所有来自 Alcatraz 的生产力插件都可以再次正常工作。这提高了我的工作效率。

【讨论】:

【参考方案4】:

mapbox/XcodeClangFormat 扩展看起来是让 clang 格式与 Xcode8 一起使用的一种很有前途的方法。

由于源代码编辑器扩展的限制,很遗憾您只能为所有项目指定一个 .clang 格式的文件。 “保存时格式化”也不可用。

【讨论】:

我对此进行了测试,它在新 Xcode 插件模型的严格限制下可以做到。我缺少的是“保存时的格式”,根据其作者,这是不可能的。但对于 clang 格式插件来说,这是一个尽可能接近的选项。 @VisorZ,也许有一种方法可以将 osascript 和这个插件结合起来,以便通过按下触发插件的clang-format 按钮的自动化来覆盖命令 Command+S?【参考方案5】:

您可以创建一个 shell 脚本作为行为添加到 Xcode 8:Xcode > 行为 > +(创建新的)> 运行脚本:(在此处选择文件),添加快捷方式,如 Cmd+Shift+S。

脚本要求 Xcode 保存当前文档。然后它提取其文件路径并调用 clang-format 以就地格式化该文件。 Clang 格式必须可用,例如通过使用 brew 作为包管理器来下载它并发布其路径以供命令行访问。像往常一样,clang-format 使用的样式指南必须具有名称 .clang-format 并且必须位于源文件的任何父文件夹中。

这是脚本:

#!/bin/bash

CDP=$(osascript -e '
tell application "Xcode"
    activate
    tell application "System Events" to keystroke "s" using command down
    --wait for Xcode to remove edited flag from filename
    delay 0.3
    set last_word_in_main_window to (word -1 of (get name of window 1))
    set current_document to document 1 whose name ends with last_word_in_main_window
    set current_document_path to path of current_document
    --CDP is assigned last set value: current_document_path
end tell ')

LOGPATH=$(dirname "$0")
LOGNAME=formatWithClangLog.txt
echo "Filepath: $CDP" > $LOGPATH/$LOGNAME
sleep 0.6 ### during save Xcode stops listening for file changes
/usr/local/bin/clang-format -style=file -i -sort-includes $CDP >> $LOGPATH/$LOGNAME 2>&1

# EOF

请将路径 /usr/local/bin 交换为您的 clang 格式可执行文件所在的路径。

编码愉快!

【讨论】:

以上是关于如何获得 Xcode 8 的 clang 格式?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 8 用处不大的新特性:CLANG_WARN_INFINITE_RECURSION

为啥我的 Xcode 插件(如 clang 格式)在更新到新版本的 Xcode 后不再工作了?

使用Xcode开发iOS语法检查的Clang插件

为啥我的 Xcode 插件(例如 clang 格式)在更新到新版本的 Xcode 后,与 Alcatraz 一起安装不再工作?

使用 Mac OS X 10.8.5 Xcode 5.0.2 配置错误:clang:错误:缺少“-V”的参数(预期 1 个值)clang:错误:没有输入文件

Xcode 8 用处不大的新特性:CLANG_WARN_INFINITE_RECURSION