clang_complete:iOS的Vim自动完成功能

时间:2011-10-20 18:57:05

标签: ios vim clang clang-complete

所以最近我一直试图建立一个基于Vim的iOS工作流程。

我找到了clang_complete,并在我的.vimrc中设置了clang用户选项,如此

let g:clang_user_options='-fblocks -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -D__IPHONE_OS_VERSION_MIN_REQUIRED=40300'

如此处所述:http://www.zenskg.net/wordpress/?p=199#comment-229

并添加了一些框架/头/ lib路径。我不会发布整条线,因为它很大。

所以我在命令行中使用clang测试了我项目中某个文件的编译(使用相同的选项),并且它编译得很好,但是如果我使用的话只能 -arch armv6/7标志。如果我不这样做,它会尝试编译i386并抱怨缺少头文件。

到目前为止一切顺利。现在,我只使用了clangclang_complete的{​​{1}}用户选项提供的完全相同的选项?

不。当我这样做并尝试在Vim中自动填充一个单词时,它说

.vimrc

在Vim的QuickFix列表中。我有点需要这面旗帜 - 我该怎么办?

任何有用的想法。我希望在Vim下完成iOS代码的完成。

3 个答案:

答案 0 :(得分:3)

clang_complete运行clang -cc1,这会导致编译器前端运行而不是驱动程序。编译器前端不了解-arch选项。 clang -cc1 --help会向您显示可能的选项。您应该指定-triple-target-*之一。

如果你不确定要使用什么,你可以像你一样手动运行clang,但是在详细模式下(-v)。这样它将打印clang -cc1命令行,您可以在其中找到适当的参数。

答案 1 :(得分:3)

默认情况下,clang_complete使用clang二进制文件/usr/bin/clang,但Xcode不是。它正在使用clang库/Developer/usr/clang-ide/lib/libclang.dylib。他们不太一样。如果您正在复制XCode正在使用的选项,您必须确保clang_complete也使用库版本。

你的.vimrc文件中应该这样做:

filetype on
autocmd FileType objc let g:clang_use_library=1
autocmd FileType objc let g:clang_library_path='/Developer/usr/clang-ide/lib'

当我这样做时,-arch i386被接受。

(PS - 我还有一些其他问题让clang_complete用于iOS开发。你可能想要查看这个分支:https://github.com/krisajenkins/clang_complete。我太新了,不能铿锵真的知道我在做什么,但它对我有用......)

答案 2 :(得分:0)

使用5.1 sdk即使使用libclang.dylib,也无法获得-arch接受。

经过一些预测(即手动运行xcodebuild产生的clang命令并建议使用-v标志),我最好的设置是:

let g:clang_complete_auto = 1

"not strictly necessary
set omnifunc=ClangComplete

let g:clang_user_options='clang -cc1 -triple i386-apple-macosx10.6.7 -target-cpu yonah -target-linker-version 128.2 -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/3.1 -fblocks -x objective-c -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk -D __IPHONE_OS_VERSION_MIN_REQUIRED=50100 || exit 0'

添加-cc1是我在Stackoverflow或其他地方的其他资源中没有看到的唯一一件事(显然这个标志允许clang驱动程序和原始cc1标志的混合组合通过)。一旦添加它,它至少在Cocoa和UIKit完成时突然起作用(尝试输入[NSString C-x C-u)。

然而,某些东西仍然被轻微摧毁。

键入:copen我在完成(成功或其他)后看到了这一点:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CFURL.h|654 col 48 error| expected ';' after top level declarator

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CFUtilities.h|14 col 39 error| expected function body after function declarator
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CFBase.h|60 col 32 info| expanded from macro 'CF_AVAILABLE_IOS'
/usr/include/Availability.h|145 col 53 info| expanded from macro '__OSX_AVAILABLE_STARTING'
<scratch space>|25 col 1 info| expanded from macro '__AVAILABILITY_INTERNAL'
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h|92 col 10 error| 'CoreFoundation/CFUserNotification.h' file not found

此外,即使我已将-I.clang_complete个标记添加到我的clang_user_option文件或直接添加到clang_complete字符串,{{1}}仅适用于某些但不适用我项目中的所有标题......没有明显的理由说明为什么一个有效而另一个无效。 (建议欢迎)。