2011-10-20 72 views
5

所以最近我一直在試圖建立一個基於Vim的iOS工作流程。clang_complete:iOS的Vim自動完成

我發現clang_complete,和這裏描述的.vimrc我設置的鐺用戶選項,像這樣

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並抱怨缺少頭文件。

到目前爲止這麼好。現在我只是使用與clang完全相同的選項,以clang_complete的用戶選項在我的.vimrc右邊?

沒有。當我這樣做並嘗試在Vim中自動完成一個單詞時,它說在Vim的QuickFix列表中顯示

unknown argument: '-arch' 

。我有點需要這個標誌 - 我應該如何繼續?

任何想法很有用。我很想在Vim下使用iOS代碼完成工作。

回答

3

clang_complete運行clang -cc1,這會導致編譯器前端運行而不是驅動程序。編譯器前端不理解-arch選項。 clang -cc1 --help會告訴你可能的選擇。您應該指定-triple-target-*之一。

如果您不確定要使用什麼,可以按照以前的方式手動運行clang,但以詳細模式運行(-v)。這樣它將打印clang -cc1命令行,您可以在其中找到適當的參數。

+0

非常感謝...這讓我有了更多的進步。我以詳細模式運行xcodebuild,複製了clang選項,然後在詳細模式下使用這些選項運行clang,然後將輸出中的clang -cc1選項複製到我的.vimrc中。儘管clang_complete仍然無法自動完成我的代碼,但我認爲我需要使用-frameworks標誌,它在-cc1中似乎沒有等效。你能指點我一些文件嗎?手冊頁不是很好 - 我不會在沒有告訴我的情況下知道-cc1選項。 – Sam

+1

下面是你可以嘗試的東西:打開〜/ .vim/plugin/clang_complete.vim(或者你安裝了clang_complete的任何地方),然後查找ClangCompleteBinary函數。有兩件事你可以試試: 1.註釋掉v:shell_error條件塊。 Clang通常會返回完好的選項,即使它有編譯錯誤,clang_complete也會忽略這個事實。 2.將系統(l:命令)更改爲system(l:command。'&tee /tmp/clang.log')並從vim觸發完成。然後,您將能夠在/tmp/clang.log中看到來自clang的確切錯誤輸出。 希望有所幫助。 –

3

默認情況下,clang_complete使用的是clang二進制/usr/bin/clang,但Xcode不是。它使用叮噹庫/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我太新,鐺,真正知道我在做什麼。 ,但它對我很有用......)

0

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

一些把玩後(即手動運行由xcodebuild聯編與所建議的-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或其他地方(顯然這個標誌允許鐺驅動程序和原始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只適用於我的項目中的一些但不是全部的標題......沒有明顯的理由爲什麼一個人工作,而不是其他人。 (歡迎提出建議)。