自定义Xcode代码模板:Code Snippet
Xcode強(qiáng)大的代碼提示功能是有目共睹的,用過都知道,可是你是否想過添加一些自定義的代碼提示模板?你是否想讓if默認(rèn)的左括號(hào)挪到下一行?還有for、while、switch等等……如果你有這方面的需求的話,這篇文章剛好可以幫到你!?
在Xcode左下角有個(gè)花括號(hào)的頁簽,這里面存儲(chǔ)了很多代碼提示模板,如下圖
點(diǎn)擊列表里面任一個(gè)項(xiàng)目都會(huì)彈出一個(gè)說明框,里面有個(gè)Edit和Done按鈕,這很容易讓人產(chǎn)生編輯的想法,其實(shí)這是個(gè)錯(cuò)覺:這些內(nèi)置的代碼模板是不可編輯的!你看到這里可能會(huì)有點(diǎn)著急,因?yàn)槟憧赡芟雴柲莍f左括號(hào)是不是不能挪到下一行了?!其實(shí),你如果用過Apple的產(chǎn)品,那你應(yīng)該會(huì)想到Apple不會(huì)這么SB,這些都是可以編輯的!下面我們介紹編輯Xcode內(nèi)置代碼模板。
編輯Xcode內(nèi)置代碼模板
Xcode的所有代碼模板是用一個(gè)plist格式xml文件描述的,這文件存儲(chǔ)在Xcode的安裝目錄:
/Applications/Xcode.app/Contents/PlugIns/IDECodeSnippetLibrary.ideplugin/Contents/Resources/? SystemCodeSnippets.codesnippets
可以用任意文本編輯器打開這個(gè)代碼模板配置文件,這是一段if的代碼模板的XML配置,
<dict><key>IDECodeSnippetVersion</key><integer>1</integer><key>IDECodeSnippetCompletionPrefix</key><string>if</string><key>IDECodeSnippetContents</key><string>if (<#condition#>) { <#statements#> }</string><key>IDECodeSnippetIdentifier</key><string>D70E6D11-0297-4BAB-88AA-86D5D5CBBC5D</string><key>IDECodeSnippetLanguage</key><string>Xcode.SourceCodeLanguage.C</string><key>IDECodeSnippetSummary</key><string>Used for executing code only when a certain condition is true.</string><key>IDECodeSnippetTitle</key><string>If Statement</string><key>IDECodeSnippetCompletionScopes</key><array><string>CodeBlock</string></array> </dict>其中IDECodeSnippetContents字段表示具體代碼模板的內(nèi)容,雖然Xcode不允許編輯內(nèi)置的代碼模板,但是Xcode允許用戶自定義代碼模板,并且每個(gè)模板有一個(gè)唯一標(biāo)識(shí)符IDECodeSnippetIdentifier,其中if模板的唯一標(biāo)記是D70E6D11-0297-4BAB-88AA-86D5D5CBBC5D,那么既然每個(gè)代碼模板是唯一存在的,那么如果自定義的模板的唯一標(biāo)識(shí)符與內(nèi)置代碼模板相同了會(huì)發(fā)生什么情況?覆蓋!這是我們修改內(nèi)置代碼模板的關(guān)鍵入口,也是核心思想!
到這里一切都變得很清晰了:我們只要自定義一個(gè)相同標(biāo)識(shí)符的帶模板就可以覆蓋內(nèi)置的代碼模板。官方文檔介紹了創(chuàng)建自定義模板的方法:在Xcode輸入代碼模板代碼,然后拖拽到Xcode的模板欄,然后點(diǎn)擊“Edit”就是可以做相關(guān)的修改,編輯完后點(diǎn)擊“Done”就可以使用了,然后在下面這個(gè)目錄可以找到模板配置文件。
~/Library/Developer/Xcode/UserData/CodeSnippets/
如果你用上述方法添加了一個(gè)自定義模板,那么你在這個(gè)目錄可能看到類似D70E6D11-0297-4BAB-88AA-86D5D5CBBC5D.codesnippet命名的文件,其實(shí)這個(gè)文件名就是模板的唯一標(biāo)識(shí)符。其實(shí)我們并不想要這樣的命名方式,因?yàn)椴环奖憔S護(hù)以及分享,雖然在Xcode里面可以很方便地編輯他們。慶幸的是這個(gè)文件名是可以修改的,你可以像這樣用一些有含義的字符來修改命名。
但是有個(gè)問題:Xcode會(huì)自動(dòng)為我們的模板分配一個(gè)唯一標(biāo)識(shí)符,這樣就不能達(dá)到覆蓋的目的。有些同學(xué)可能想到從SystemCodeSnippets.codesnippets配置里面查找相關(guān)的標(biāo)識(shí)符,然后黏貼過來,這樣確實(shí)可以達(dá)到目的。不過現(xiàn)在我給大家推薦另外一種方法。
首先,到SystemCodeSnippets.codesnippets里面找到你要修改的模板配置,然后復(fù)制黏貼到如下這段配置中
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"><!--code config here--> </plist>然后修改IDECodeSnippetVersion鍵值為2,暫時(shí)不確定為什么要這么修改,但是Xcode生成的自定義模板配置都是這個(gè)值,保持默認(rèn)1也沒多大問題,只是Xcode有時(shí)會(huì)自動(dòng)用標(biāo)識(shí)符替換你的自定義命名,所以用2是比較合適的。這樣還沒完,因?yàn)檫€要添加一個(gè)鍵值為true的字段IDECodeSnippetUserSnippet,該字段標(biāo)記了模板是否為自定義的,如果是自定義的模板但是沒有這個(gè)字段,你的Xcode啟動(dòng)后可能會(huì)崩潰…orz
<key>IDECodeSnippetUserSnippet</key> <true/>那么如果替換內(nèi)置的if模板,那么完整的配置應(yīng)該是這樣的。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"><dict><key>IDECodeSnippetCompletionPrefix</key><string>if</string><key>IDECodeSnippetCompletionScopes</key><array><string>CodeBlock</string></array><key>IDECodeSnippetContents</key><string>if (<#condition#>) {<#statements#> }</string><key>IDECodeSnippetIdentifier</key><string>5163356F-D409-4EDA-B263-EA2E07A50B9C</string><key>IDECodeSnippetLanguage</key><string>Xcode.SourceCodeLanguage.C</string><key>IDECodeSnippetSummary</key><string>Used for executing code only when a certain condition is true.</string><key>IDECodeSnippetTitle</key><string>If Statement</string><key>IDECodeSnippetUserSnippet</key><true/><key>IDECodeSnippetVersion</key><integer>2</integer></dict> </plist>你可能注意到類似<#condition#>這樣的代碼,它們是什么呢?你再寫代碼遇到代碼提示的時(shí)候,可能遇到過藍(lán)色泡泡一樣的東西,可以用Tab鍵來切換,那么這個(gè)奇怪的字符就是用來添加藍(lán)色泡泡的。因?yàn)檫@是XML配置,所以做了HTML轉(zhuǎn)義;如果你在Xcode里面編輯模板并添加藍(lán)色泡泡的話,直接輸入<#condition#>即可,##符號(hào)之間可以為任意字符。
隱藏代碼模板提示
有時(shí)候你可能想要隱藏某個(gè)內(nèi)置的模板,這樣的需求也是可以完成的。你只需要把IDECodeSnippetCompletionPrefix字段的鍵值留空既可以,如果你把如下這段配置保存到模板目錄,那么你的Xcode將不再彈出if語句的代碼提示。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"><dict><key>IDECodeSnippetCompletionPrefix</key><string></string><key>IDECodeSnippetCompletionScopes</key><array><string>CodeBlock</string></array><key>IDECodeSnippetContents</key><string>if (<#condition#>) {<#statements#> }</string><key>IDECodeSnippetIdentifier</key><string>5163356F-D409-4EDA-B263-EA2E07A50B9C</string><key>IDECodeSnippetLanguage</key><string>Xcode.SourceCodeLanguage.C</string><key>IDECodeSnippetSummary</key><string>Used for executing code only when a certain condition is true.</string><key>IDECodeSnippetTitle</key><string>If Statement</string><key>IDECodeSnippetUserSnippet</key><true/><key>IDECodeSnippetVersion</key><integer>2</integer></dict> </plist>在Xcode里面輸入if,就不見了if statement的提示
是不是很酷?!
最后總結(jié)一下自定義的注意事項(xiàng):
- 自定義目錄不能有相同標(biāo)識(shí)符的模板,否則Xcode啟動(dòng)后會(huì)崩潰;
- 自定義母的模板標(biāo)識(shí)符可以跟系統(tǒng)默認(rèn)模板標(biāo)識(shí)符相同,可以達(dá)到覆蓋效果;
- 若要使用自定義模板覆蓋系統(tǒng)模板,則必須有DECodeSnippetUserSnippet字段,否則Xcode啟動(dòng)后會(huì)崩潰;
總結(jié)
以上是生活随笔為你收集整理的自定义Xcode代码模板:Code Snippet的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在项目里交叉使用Swift和OC
- 下一篇: GCD 深入理解:第一部分