【问题标题】:clang_complete: Vim autocompletion for iOSclang_complete: 适用于 iOS 的 Vim 自动补全
【发布时间】:2011-12-12 01:14:02
【问题描述】:

所以最近我一直在尝试建立一个基于 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

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

所以我使用命令行中的clang(使用相同的选项)测试了我项目中一个文件的编译(使用相同的选项),它编译得很好,但只有如果我使用@ 987654324@ 标志。如果我不这样做,它会尝试为 i386 编译并抱怨缺少头文件。

到目前为止一切顺利。现在我只使用与clang 完全相同的选项,clang_complete.vimrc 中的用户选项对吗?

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

 unknown argument: '-arch' 

在 Vim 的 QuickFix 列表中。我有点需要这个标志 - 我应该如何进行?

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

【问题讨论】:

    标签: ios vim clang clang-complete


    【解决方案1】:

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

    经过一番折腾(即按照建议手动运行 xcodebuild 生成的带有 -v 标志的 clang 命令),我最好的设置是:

    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_options 字符串中,clang_complete 仅适用于我项目中的一些但不是全部标题。 ..没有明显的理由为什么一个人有效,而其他人无效。 (欢迎提出建议)。

    【讨论】:

      【解决方案2】:

      默认情况下,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 开发工作时遇到了一些其他问题。你可能想看看这个 fork:https://github.com/krisajenkins/clang_complete。我对 clang 太陌生,无法真正知道我在做什么,但它对我有用......)

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 非常感谢...这让我更进一步。我在详细模式下运行 xcodebuild,复制 clang 选项,然后在详细模式下使用这些选项运行 clang,然后将 clang -cc1 选项从输出复制到我的 .vimrc 中。 clang_complete 仍然无法自动完成我的代码,我想我需要使用 -frameworks 标志,它在 -cc1 中似乎没有等效项。你能指点我一些文件吗?手册页不是很好——如果没有你告诉我,我永远不会知道 -cc1 选项。
        • 您可以尝试以下方法:打开 ~/.vim/plugin/clang_complete.vim(或安装 clang_complete 的任何位置),然后查找 ClangCompleteBinary 函数。您可以在那里尝试两件事: 1. 注释掉 v:shell_error 条件块。即使出现编译错误,Clang 通常也会返回良好的完成选项,而 clang_complete 会忽略这一事实。 2. 将 system(l:command) 更改为 system(l:command . '|& tee /tmp/clang.log') 并从 vim 触发完成。然后您将能够在 /tmp/clang.log 中看到 clang 的确切错误输出。希望对您有所帮助。
        猜你喜欢
        • 2012-11-25
        • 2013-05-26
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-28
        相关资源
        最近更新 更多