自定义Xcode代码模板:Code Snippet
Xcode強大的代碼提示功能是有目共睹的,用過都知道,可是你是否想過添加一些自定義的代碼提示模板?你是否想讓if默認的左括號挪到下一行?還有for、while、switch等等……如果你有這方面的需求的話,這篇文章剛好可以幫到你!?
在Xcode左下角有個花括號的頁簽,這里面存儲了很多代碼提示模板,如下圖
點擊列表里面任一個項目都會彈出一個說明框,里面有個Edit和Done按鈕,這很容易讓人產生編輯的想法,其實這是個錯覺:這些內置的代碼模板是不可編輯的!你看到這里可能會有點著急,因為你可能想問那if左括號是不是不能挪到下一行了?!其實,你如果用過Apple的產品,那你應該會想到Apple不會這么SB,這些都是可以編輯的!下面我們介紹編輯Xcode內置代碼模板。
編輯Xcode內置代碼模板
Xcode的所有代碼模板是用一個plist格式xml文件描述的,這文件存儲在Xcode的安裝目錄:
/Applications/Xcode.app/Contents/PlugIns/IDECodeSnippetLibrary.ideplugin/Contents/Resources/? SystemCodeSnippets.codesnippets
可以用任意文本編輯器打開這個代碼模板配置文件,這是一段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字段表示具體代碼模板的內容,雖然Xcode不允許編輯內置的代碼模板,但是Xcode允許用戶自定義代碼模板,并且每個模板有一個唯一標識符IDECodeSnippetIdentifier,其中if模板的唯一標記是D70E6D11-0297-4BAB-88AA-86D5D5CBBC5D,那么既然每個代碼模板是唯一存在的,那么如果自定義的模板的唯一標識符與內置代碼模板相同了會發生什么情況?覆蓋!這是我們修改內置代碼模板的關鍵入口,也是核心思想!
到這里一切都變得很清晰了:我們只要自定義一個相同標識符的帶模板就可以覆蓋內置的代碼模板。官方文檔介紹了創建自定義模板的方法:在Xcode輸入代碼模板代碼,然后拖拽到Xcode的模板欄,然后點擊“Edit”就是可以做相關的修改,編輯完后點擊“Done”就可以使用了,然后在下面這個目錄可以找到模板配置文件。
~/Library/Developer/Xcode/UserData/CodeSnippets/
如果你用上述方法添加了一個自定義模板,那么你在這個目錄可能看到類似D70E6D11-0297-4BAB-88AA-86D5D5CBBC5D.codesnippet命名的文件,其實這個文件名就是模板的唯一標識符。其實我們并不想要這樣的命名方式,因為不方便維護以及分享,雖然在Xcode里面可以很方便地編輯他們。慶幸的是這個文件名是可以修改的,你可以像這樣用一些有含義的字符來修改命名。
但是有個問題:Xcode會自動為我們的模板分配一個唯一標識符,這樣就不能達到覆蓋的目的。有些同學可能想到從SystemCodeSnippets.codesnippets配置里面查找相關的標識符,然后黏貼過來,這樣確實可以達到目的。不過現在我給大家推薦另外一種方法。
首先,到SystemCodeSnippets.codesnippets里面找到你要修改的模板配置,然后復制黏貼到如下這段配置中
<?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,暫時不確定為什么要這么修改,但是Xcode生成的自定義模板配置都是這個值,保持默認1也沒多大問題,只是Xcode有時會自動用標識符替換你的自定義命名,所以用2是比較合適的。這樣還沒完,因為還要添加一個鍵值為true的字段IDECodeSnippetUserSnippet,該字段標記了模板是否為自定義的,如果是自定義的模板但是沒有這個字段,你的Xcode啟動后可能會崩潰…orz
<key>IDECodeSnippetUserSnippet</key> <true/>那么如果替換內置的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>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#>這樣的代碼,它們是什么呢?你再寫代碼遇到代碼提示的時候,可能遇到過藍色泡泡一樣的東西,可以用Tab鍵來切換,那么這個奇怪的字符就是用來添加藍色泡泡的。因為這是XML配置,所以做了HTML轉義;如果你在Xcode里面編輯模板并添加藍色泡泡的話,直接輸入<#condition#>即可,##符號之間可以為任意字符。
隱藏代碼模板提示
有時候你可能想要隱藏某個內置的模板,這樣的需求也是可以完成的。你只需要把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的提示
是不是很酷?!
最后總結一下自定義的注意事項:
- 自定義目錄不能有相同標識符的模板,否則Xcode啟動后會崩潰;
- 自定義母的模板標識符可以跟系統默認模板標識符相同,可以達到覆蓋效果;
- 若要使用自定義模板覆蓋系統模板,則必須有DECodeSnippetUserSnippet字段,否則Xcode啟動后會崩潰;
總結
以上是生活随笔為你收集整理的自定义Xcode代码模板:Code Snippet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在项目里交叉使用Swift和OC
- 下一篇: GCD 深入理解:第一部分