2011-10-20 10 views
5

Recientemente traté de configurar un flujo de trabajo de iOS basado en Vim.clang_complete: autocompletado de Vim para iOS

He encontrado clang_complete, y se han establecido las opciones de usuario se escuchan en mi .vimrc al igual que

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

como se describe aquí: http://www.zenskg.net/wordpress/?p=199#comment-229

y añadido unas marco caminos lib/cabecera /. No voy a publicar toda la línea porque es enorme.

Así que probó la compilación de uno de los archivos en mi proyecto usando clang desde la línea de comandos (usando las mismas opciones), y se compila bien, pero sólo se si uso la bandera -arch armv6/7. Si no lo hago, intenta compilar para i386 y se queja de que faltan archivos de encabezado.

Hasta ahora todo bien. Ahora solo uso exactamente las mismas opciones que di para clang, para las opciones de usuario clang_complete en mi .vimrc ¿verdad?

Nope. Cuando lo hago y trato de autocompletar una palabra en Vim, que dice

unknown argument: '-arch' 

en la lista Quickfix de Vim. Necesito esta bandera, ¿cómo debo proceder?

Todas las ideas útiles. Me encantaría obtener la finalización del código iOS trabajando bajo Vim.

Respuesta

3

clang_complete ejecuta clang -cc1, lo que hace que se ejecute el front-end del compilador y no el controlador. El front-end del compilador no comprende la opción -arch. clang -cc1 --help le mostrará las opciones posibles. Probablemente deberías especificar -triple o uno de -target-*.

Si no está seguro de qué usar, puede ejecutar clang manualmente como lo hizo, pero en modo detallado (-v). De esta manera imprimirá la línea de comando clang -cc1, donde puede encontrar los argumentos apropiados.

+0

Muchas gracias ... Esto me ha llevado mucho más lejos. Ejecuté xcodebuild en modo detallado, copié las opciones de clang, luego ejecuté clang con estas opciones en modo detallado, luego copié las opciones de clang -cc1 de la salida en mi .vimrc. clang_complete todavía no puede autocompletar mi código, creo que necesito usar la bandera -frameworks que no parece tener un equivalente en -cc1. ¿Podría indicarme alguna documentación? Las páginas man no son muy buenas. Nunca hubiera sabido sobre la opción -cc1 sin que me lo digas. – Sam

+1

Aquí hay algo que puedes probar: abre ~/.vim/plugin/clang_complete.vim (o donde hayas instalado clang_complete), y busca la función ClangCompleteBinary. Hay dos cosas que puedes probar allí: 1. Comenta el bloque de condición v: shell_error. Clang a menudo devuelve buenas opciones de finalización incluso cuando tenía un error de compilación, y clang_complete ignora este hecho. 2. cambie el sistema (l: comando) al sistema (l: comando. '| & Tee /tmp/clang.log') y active una terminación desde vim. Entonces podrá ver en /tmp/clang.log la salida de error exacta de clang. Espero que ayude. –

3

De forma predeterminada, clang_complete está utilizando el clang binario /usr/bin/clang, pero Xcode no lo está. Está utilizando la biblioteca clang /Developer/usr/clang-ide/lib/libclang.dylib. No son lo mismo. Si está copiando las opciones que utiliza XCode, deberá asegurarse de que clang_complete también use la versión de la biblioteca.

Algo como esto en su archivo .vimrc debe hacerlo:

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

Cuando hago eso, -arch i386 se acepta.

(PS - tuve un par de problemas para obtener clang_complete a trabajar por el desarrollo de iOS Usted fuerza quiere ir a este tenedor: https://github.com/krisajenkins/clang_complete soy demasiado nuevo para clang para saber realmente lo que estoy haciendo.. , pero funciona para mí ...)

0

Al usar la sdk 5.1, no pude obtener -arch aceptado incluso cuando se usa libclang.dylib.

Después de algún futzing (es decir, la ejecución manual de los comandos clang producidos por xcodebuild con la bandera -v como se sugiere), mi mejor programa de instalación:

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' 

añadiendo -cc1 es la única cosa que no veo mencionado en otros recursos en Stackoverflow o en otro lugar (aparentemente esta bandera permite que la combinación bastardizada del controlador clang y las banderas raw cc1 pasen). Una vez que esto fue agregado, de repente solo funcionó al menos para la finalización de Cocoa y UIKit (intente escribir [NSString C-x C-u).

Sin embargo, algo todavía está ligeramente roto.

Typing :copen veo esto después de una terminación (con éxito o no):

/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 

Además, a pesar de que he añadido varias banderas -I a cualquiera de mi archivo .clang_complete o directamente a la cadena clang_user_option s, clang_complete solo funciona con algunos, pero no con todos los encabezados de mi proyecto ... sin una razón aparente de por qué uno funciona, pero no otros. (Sugerencias bienvenidas).

Cuestiones relacionadas