摘要:我們都知道和都是文本編輯器中的上古神器,你也許用,配合完成過大型或者的開發(fā),你也許配合過其他插件,完成過,代碼的開發(fā),但是很少有人試過的開發(fā)吧,畢竟的框架包含了很多東西,以及天生很長(zhǎng)的名字,讓我們沒辦法把此神器用起來,今天我就來給大家講下
我們都知道 Vim 和 Emacs 都是文本編輯器中的上古神器,你也許用 ctags,cscopes 配合 Vim 完成過大型 C 或者 C++ 的開發(fā),你也許配合過其他插件,完成過 JavaScript,python 代碼的開發(fā),但是很少有人試過 iOS app 的開發(fā)吧,畢竟 iOS 的框架包含了很多東西,以及 Objective-C 天生很長(zhǎng)的 API 名字,讓我們沒辦法把此神器用起來,今天我就來給大家講下我是怎么使用 Vim 開發(fā) iOS App 的,當(dāng)然 Emacs 也可以
begin使用 Vim 開發(fā) iOS App 并不是特殊的愛好,而是被 Xcode 8 活生生的逼的,剛開始更新了 Xcode 8 以后,Xcode 8 把第三方插件給屏蔽了,導(dǎo)致沒有 XVim 給我用了,沒有 XVim 以后,發(fā)現(xiàn)異常不順手,于是嘗試用了一段時(shí)間的 AppCode,不得不說 AppCode 是一個(gè)非常好的 IDE,但是他有個(gè)很大的缺點(diǎn),那就是 Java,JetBrain 家的東西都很不錯(cuò),唯一缺點(diǎn)就是基于 Java,整個(gè)平臺(tái)都略慢,然后我在不斷的 google 過程中,發(fā)現(xiàn)了有人竟不知何謂恐懼,竟然使用 Vim 開發(fā) iOS App,最后我也學(xué)會(huì)了這個(gè)新姿勢(shì) XDDDD
不過目前,只支持 Objective-C 代碼的開發(fā),swift 的話,沒有解決工程文件自動(dòng)補(bǔ)全的問題,因?yàn)槟壳按蠹沂褂玫牧餍械?swift 自動(dòng)補(bǔ)全工具 SourceKitten 并沒有支持 workspace 所以暫時(shí)還沒用起來
以及,目前不支持調(diào)試,因?yàn)榘l(fā)現(xiàn) Vim 對(duì)調(diào)試的支持確實(shí)好糟糕...
準(zhǔn)備活動(dòng)工欲善其事,必先利其器,主角是 Vim 或者 Emacs,少了其他配角和龍?zhí)讉?,也沒辦法正負(fù)恐懼,我們來看看用到了些什么東西,讓我們的 Vim 成為利器的,這里只是點(diǎn)下他們的名,文章后面會(huì)把鏈接奉上
首先我們來看主角隊(duì)的同學(xué)們,他們是征服恐懼的主力
macOS,沒有神話,開發(fā) iOS 還是只能在 Mac 上
支持 python 的 Vim,可以用 Vim8 或是 neoVim 食用更佳,我就用的 neoVim
YCMD,其實(shí)他是 YouCompleteMe + YouCompelteMeDeamon 的合體,自動(dòng)補(bǔ)全、定義跳轉(zhuǎn)等功能,就依賴他了
接下來我們來看看其他龍?zhí)讉?/p>
Vbundle,裝插件用的,沒他,龍?zhí)缀椭鹘嵌疾挥蒙蠄?chǎng)了
unite + unite-outline + unite-outline-objc,提供了方法導(dǎo)航
auto-pairs,自動(dòng)補(bǔ)全右括號(hào)
ctrlp,文件搜索跳轉(zhuǎn)
Ag,字符串搜索工具
syntastic,語法檢查工具
vim-clang-format,代碼格式工具
恩,需要的東西大概就是這些了,Vim 的配置文件,我是基于好久以前 square 開源的 maximum-awesome 的,所以,配合這個(gè)食用風(fēng)味更佳,我的 dot file 也放到了 github 上,歡迎大家 star
進(jìn)入正題龍?zhí)讉?,基本都可以通過配置 vbundle 來完成安裝,之后只用配置對(duì)應(yīng)的快捷鍵就好了,這里的正題,要搞定難搞的主 YCMD
難搞的主 YCMD 安裝 YCMDYCMD 的安裝很簡(jiǎn)單,主要是需要一定的配置
首先在 vim 的配置文件中加入下面的內(nèi)容,更新配置文件并執(zhí)行 BundleInstall 命令,讓 Vbundle 把 YouCompleteMe 插件裝上
Plugin "Valloric/YouCompleteMe"
然后到這個(gè)路徑 ~/.vim/bundle/YouCompleteMe 這里是 YouCompleteMe 安裝的位置,在這里需要編譯 YCM,一條命令就可以搞定
./install.py --clang-completer --system-libclang
--clang-completer 告訴腳本我們需要 clang 的支持,--system-libclang 告訴編譯腳本使用系統(tǒng)的 clang,因?yàn)橹?clang 升級(jí) 4.0 的時(shí)候,并沒有已經(jīng)編譯好的包給我下載,所以這里不用系統(tǒng) clang 的話,編譯腳本會(huì)下載一個(gè) clang 3.0,這樣就無法支持 iOS 10.0 以后的 sdk 了,因?yàn)?iOS 10.0 以后的 sdk 為了支持 swift 引入了一些 clang 3.0 不支持的新語法,所以這里要加上 --system-libclang
然后等他編譯完成,這樣 YCMD 就配置好了,似乎這里看并不是很難搞,其實(shí)難搞的是如何在 iOS 項(xiàng)目中配置好自動(dòng)提示
為 Xcode 項(xiàng)目配置 YCMD這里進(jìn)入到了真正征服恐懼的地方了
YouCompleteMe 的原理曾經(jīng)有人說過,編輯器再怎么神器是沒辦法超過 IDE 的,因?yàn)?IDE 是通過編譯、解析整個(gè)項(xiàng)目的所有文件,來達(dá)到語法錯(cuò)誤提示,自動(dòng)補(bǔ)全,定義跳轉(zhuǎn)等高級(jí)功能的,而 YCMD 就是來彌補(bǔ)這一個(gè)差距的,YCMD 通過傳入完整的編譯參數(shù),編譯需要提示的文件,來實(shí)現(xiàn)自動(dòng)補(bǔ)全,這樣沒辦法超過 IDE 的部分就被抹平了
配置一個(gè)項(xiàng)目這里我們配置一個(gè)復(fù)雜的項(xiàng)目來練練手,首先 YCMD 是不可能通過 Xcode 的項(xiàng)目文件或是 workspace 文件獲取到編譯參數(shù)的,所以這一步需要手來,當(dāng)然,將來可以做成自動(dòng)的,因?yàn)槟壳笆謩?dòng)的做其實(shí)很方便,所以現(xiàn)在還沒有做成自動(dòng)的
首先,YCMD 是通過每個(gè)項(xiàng)目路徑下的 .ycm_extra_conf.py 腳本文件來獲取編譯參數(shù)的,這個(gè)腳本文件中有一個(gè)叫做 FlagsForFile 的函數(shù),我們通過這個(gè)函數(shù)返回某一個(gè)特定文件需要的編譯參數(shù),一般情況下大部分文件的編譯參數(shù)是一樣的,我們來看一個(gè)配置的列子
import os import ycm_core flags = [ "-resource-dir", "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0", "-x objective-c", "-arch armv7", "-fmessage-length=0", # "-fmodules", # "-gmodules", "-fdiagnostics-show-note-include-stack", "-fmacro-backtrace-limit=0", "-D__arm__=1", "-D__IPHONE_OS_VERSION_MIN_REQUIRED=80000", "-std=gnu99", "-fobjc-arc", "-Wnon-modular-include-in-framework-module", "-Werror=non-modular-include-in-framework-module", "-Wno-trigraphs", "-fpascal-strings", "-Os", "-fno-common", "-Wno-missing-field-initializers", "-Wno-missing-prototypes", "-Werror=return-type", "-Wunreachable-code", "-Wno-implicit-atomic-properties", "-Werror=deprecated-objc-isa-usage", "-Werror=objc-root-class", "-Wno-arc-repeated-use-of-weak", "-Wduplicate-method-match", "-Wno-missing-braces", "-Wparentheses", "-Wswitch", "-Wunused-function", "-Wno-unused-label", "-Wno-unused-parameter", "-Wunused-variable", "-Wunused-value", "-Wempty-body", "-Wconditional-uninitialized", "-Wno-unknown-pragmas", "-Wno-shadow", "-Wno-four-char-constants", "-Wno-conversion", "-Wconstant-conversion", "-Wint-conversion", "-Wbool-conversion", "-Wenum-conversion", "-Wshorten-64-to-32", "-Wpointer-sign", "-Wno-newline-eof", "-Wno-selector", "-Wno-strict-selector-match", "-Wundeclared-selector", "-Wno-deprecated-implementations", "-DOBJC_OLD_DISPATCH_PROTOTYPES=0", "-isysroot", "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk", "-fstrict-aliasing", "-Wprotocol", "-Wdeprecated-declarations", "-miphoneos-version-min=8.0", "-g", "-Wno-sign-conversion", "-Wno-infinite-recursion", "-fembed-bitcode-marker", "-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform", "-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include", "-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks", "-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/include", "-F/Users/apple/Documents/Developer/CloudLifeWorkspace/iOS/Develop/Project_iOS/project", "-MMD", "-MT", "-MF", ] SOURCE_EXTENSIONS = [ ".cpp", ".cxx", ".cc", ".c", ".m", ".mm" ] HEADER_EXTENSIONS = [ ".hpp", ".hxx", ".hh", ".h" ] def FlagsForFile( filename, **kwargs ): staticFlags = flags return { "flags": staticFlags, "do_cache": True }
這里上面的代碼可以當(dāng)作 .ycmd_extra_conf 文件的一個(gè)最小模板,也就是如果我們的項(xiàng)目里面沒有子目錄,沒有第三方庫(kù),那么使用這個(gè)已經(jīng)可以為 iOS 項(xiàng)目提供自動(dòng)提示了
顫抖吧凡人,如此這般的編譯條件,需要你能夠把 Xcode 項(xiàng)目配置中的編譯參數(shù)完完全全翻譯出來才行,但是我也是凡人,所以這個(gè)不是我寫的,而是有方法生成的,方法如下
把需要增加自動(dòng)提示的項(xiàng)目用 Xcode 打開,然后編譯,然后如下圖所示,找到編譯信息然后找到項(xiàng)目中的一個(gè)文件,注意不要是 Pod 中的文件,最右邊,有個(gè)三條橫線的按鈕,點(diǎn)開他,沒錯(cuò),你看到了完整的編譯參數(shù),下圖中 EXPORT PATH =.... 下面的所有內(nèi)容就是完整的編譯參數(shù)
Report View
戳這個(gè)按鈕
我們要的編譯信息
右鍵,copy,找到你熟悉的記事本,參數(shù)都是空格分隔的,所以,這里我們把它轉(zhuǎn)換成上面代碼中的形式,并把不需要的去掉,比如這里我注釋了 -fmodules 和 -gmodules 因?yàn)檫@樣編譯沒辦法使用 module
把這些加入到配置文件中后,再打開 Vim 你就會(huì)發(fā)現(xiàn)自動(dòng)提示變得非常好用了,不過這里還會(huì)有一個(gè)問題,如果編譯的時(shí)候,有無法找到 UIKit,這是因?yàn)?YCMD 默認(rèn)引入了 macOS SDK 的路徑,導(dǎo)致了編譯時(shí) clang 認(rèn)為我們編譯目標(biāo)是 macOS,所以如下圖需要修改 ~/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/cpp/flags.py 文件,去掉默認(rèn)引入 macOS sdk 的編譯參數(shù),這樣就好了
效果圖們至此,最主要的問題已經(jīng)被我們解決了,接下來看下效果如何
首先是自動(dòng)提示
查找文件
方法名稱大綱
搜索字符串
語法檢查
好處這么做自然不是為了花樣炫技,更多的是為了探索 Vim 的使用,以及更多了解 Xcode 項(xiàng)目
完整的 Vim 環(huán)境,寫代碼再也不用碰鼠標(biāo)了
Vim 插件 + 不滿的地方自己動(dòng)手豐衣足食
快速,跟 Vim 比速度,笑話
方便快接的字符串搜索,替換操作
學(xué)了點(diǎn) Python
附贈(zèng)一個(gè) C/C++ 的開發(fā)環(huán)境
已知問題雖然目前已經(jīng)可以達(dá)到寫代碼的程度了,但是還是有很多問題,如下:
沒辦法 debug
不支持 Xcode 中的 group 展示
頭文件的提示有問題
不能使用 @import 的導(dǎo)入,會(huì)報(bào)語法錯(cuò)誤
xib,storyboard 自然是不行的,我的做法是 Xcode 里面拖 UI + 關(guān)聯(lián) Outlet + Debug,Vim 中做大量的代碼編輯操作
[] 方括號(hào)的匹配沒有 Xcode 那么智能
delegate 或是全局的自動(dòng)提示,需要使用 ctrl + 空格打開,并且有時(shí)候會(huì)有點(diǎn)慢
delegate 的自動(dòng)提示有時(shí)候需要輸入前面半部分的方法名才會(huì)有,比如上面截圖的 tableView,需要先輸入 - (void)tableView:(UITableView *)tableView 再使用 ctrl + 空格才會(huì)有非常好的自動(dòng)提示,當(dāng)然輸入前面這部分也會(huì)有一定的提示,整體上看能接受
上面的問題都是一直以來我沒有解決的問題,大家要是發(fā)現(xiàn)有破解的方法,歡迎聯(lián)系
end折騰這么多,相信大家已經(jīng)可以用 Vim 敲 iOS 的代碼了,雖然雖然當(dāng)初開始折騰的時(shí)候,踩了很多坑,比如 clang 3 升級(jí) clang 4 后,原來的配置都不能用了,但是收獲挺多的也并不是這么一篇文章能夠說完的,除了 Vim 大家也可以試試 Emacs 下的配置,我用的 Spacemacs,添加了 ycmd 的 layer,配置后也有了相同的效果
也歡迎大家丟磚
參考資料YouCompleteMe: 自動(dòng)補(bǔ)全插件
Vbundle: 插件管理插件
Unite: 一個(gè)通用的顯示插件,可以用來顯示各種東西,比如文件列表,buffer 列表,outline
Unite-outline: Unite 插件的 outline 插件
Unite-outline-objc: Unite-outline 插件的 Objective-C 插件
auto-pairs: 自動(dòng)補(bǔ)全括號(hào)的插件
ctrlp: 文件查找插件
Ag: 字符串查找插件
syntastic: 語法檢查插件
vim-clang-format: clang format 格式化插件
VimAwesome: 方便的 Vim 插件導(dǎo)航網(wǎng)站
maximum-awesome: 一個(gè)比較有名的 Vim 配置,包括了上面的 Vbundle,Ag,ctrlp,syntastic 等插件,以及一些很方便的配置,我的配置文件是基于這個(gè)配置的,使用前先安裝這個(gè)
我的配置文件: 我的配置文件,除了上文寫的內(nèi)容,還加了些 php,python,js 等開發(fā)配置,以及一些自己覺得用起來方便的配置
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24894.html
摘要:之所以能卓爾不群靠地就是一種自成一派且精悍有效的編輯器哲學(xué)當(dāng)然也是,就好像網(wǎng)游千千萬卻唯有一覽眾山小,那靠地不是技巧與外在,而是與眾不同的世界觀。征服其實(shí)是一種領(lǐng)悟,我融入了的哲學(xué)而已。這也是好東西,它比上一個(gè)更貼近的哲學(xué)。 就在幾個(gè)小時(shí)以前,我回答了一個(gè)關(guān)于推薦開發(fā)工具的問題,很多朋友表示喜歡和鼓勵(lì),非常感謝!我也很想多寫一些細(xì)節(jié),于是便起意開一個(gè)系列來聊聊我多次提到的 Vim。 ...
摘要:目錄如何用提高效率后端掘金經(jīng)常有人說我應(yīng)該學(xué)一門語言,比如之類,但是卻不知道如何入門。本文將通過我是如何開發(fā)公司年會(huì)抽獎(jiǎng)系統(tǒng)的后端掘金需求出現(xiàn)年會(huì)將近,而年會(huì)抽獎(jiǎng)環(huán)節(jié)必不可少,但是抽獎(jiǎng)系統(tǒng)卻還沒有。 云盤一個(gè)個(gè)倒下怎么辦?無需編碼,手把手教你搭建至尊私享云盤 - 工具資源 - 掘金微盤掛了,360倒了,百度云盤也立了Flag。能讓我們?cè)谠贫藘?chǔ)存分享文件的服務(wù)越來越少了。 買一堆移動(dòng)硬盤...
閱讀 2040·2023-04-26 02:15
閱讀 2309·2021-11-19 09:40
閱讀 1051·2021-10-27 14:13
閱讀 3322·2021-08-23 09:44
閱讀 3622·2019-12-27 12:24
閱讀 661·2019-08-30 15:53
閱讀 1175·2019-08-30 10:53
閱讀 2167·2019-08-26 12:14