zhuang 自定义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启动后会崩溃;
zhuang 自定义Xcode代码模板:Code Snippet的更多相关文章
- VS自定义代码块Code Snippet
一 .简述 我们在开发当中,避免不了一些重复的开发工作,在你漫长的开发以及学习当中,你会发现有这么一部分代码是你时常会使用到的.我想这个工具也是针对这个原因出来的吧,它就是预先把你需要的这部分代码的 ...
- 创建自己的Code Snippet(代码模板)
一.名词解释 Code Snippet,代码模板,是一种快速生成代码的快捷方式,使用它可以有效地提高编程效率. 编程中可以使用Visual Studio提供的预先设置好的Code Snippet,也可 ...
- xcode自动完成代码 Code Snippet Library
今天发现Xcode里一个好东西:代码片段库 你可以将自己常用的代码放到里面,给它命名,设置快捷键,以后想用这段代码的时候只要按快捷键,就会出现提示,直接将这段代码显示出来,十分高效. 比如我经常会用到 ...
- Xcode的代码片段快捷方式-Code Snippet Library(代码片段库)
最近换了新电脑,装上Xcode敲代码发现很多以前攒的Code Snippet忘记备份了,总结了一下Code Snippet的设置方法,且行且添加,慢慢积累吧. 如下图: Title - Code ...
- 善用VS中的Code Snippet来提高开发效率
http://www.cnblogs.com/anderslly/archive/2009/02/16/vs2008-code-snippets.html http://www.cnblogs.com ...
- 善用VS中的Code Snippet来提高开发效率 分类: C# 2015-01-22 11:06 69人阅读 评论(0) 收藏
前言 在谈谈VS中的模板中,我介绍了如何创建项目/项模板,这种方式可以在创建项目时省却不少重复性的工作,从而提高开发效率.在创建好了项目和文件后,就得开始具体的编码了,这时又有了新的重复性工作,就是 ...
- Xcode10 代码块(Code Snippet)添加和删除
https://blog.csdn.net/lg767201403/article/details/82761448 Code Snippets 使用 https://blog.csdn.net/lv ...
- 使用 Code Snippet 简化 Coding
在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符一个字符敲还是使用 Visual Studio 提 ...
- 如何创建 Code Snippet
比如有一行自定义代码段: @property (nonatomic,copy) NSString *<#string#>; 需要添加到 Code Snippet 上,以帮助开发人员开发更便 ...
随机推荐
- poj2502 最短路
//Accepted 504 KB 16 ms //spfa最短路 //把n个地铁站作为n个顶点,边权为从一个站到另一个站的时间 //注意:地铁在相邻的两站之间是直线行驶,但其他的就不是了 #incl ...
- 安装生物信息学软件-bowtie2
好吧,这是本周(2016.10.21-28)的学习任务之一:安装bowtie2并学习其使用方法&参数设置 所以,啃文档咯,官方文档Version 2.2.9 http://bowtie-bio ...
- 嵌入式linux应用开发完全手册学习笔记一
2015.3.25星期三 晴 有两个星期没写学习日记了,找个时间把这段时间做的电子词典和ARM小项目总结一下. 下面的知识点总结,U-BOOT:参考PDF文档:嵌入式linux应用开发完全手册 当虚拟 ...
- [转]使用 C 编写 Lua 模块
Lua 作为一种小巧的语言,一般都是嵌入到 C/C++ 中作为扩展语言,但是也可以作为独立的脚本语言使用,并且可以使用 C/C++ 编写扩展模块.在参考资料 [1] 中有怎样用 C/C++ 编写模块的 ...
- MYSQL安装--小白教程
这个是mysql的安装过程,其实mysql的安装也很简单,但是我安装了一下午!!一下午!!原因就是,我把mysql的官网都翻遍了,都没找到64bit的.msi安装包,后来才想到好像64bit的电脑可以 ...
- Tomcat 安装--小白教程
因为要进行微信公众号的开发模式,所以需要安装Tomcat Web服务器,现在就把我的安装过程写下来,希望可以帮到有需要的人~首先,我们需要下载tomcat的安装包,直接去官网就好啦,http://to ...
- 16年青岛网络赛 1002 Cure
题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=723 Cure Time Limit: 30 ...
- bootstrap-12
按钮(按钮组) 使用方法:按钮组和下拉菜单组件一样,需要依赖于button.js插件才能正常运行.不过我们同样可以直接只调用bootstrap.js文件.使用一个名为btn-group的容器. < ...
- Remove Element
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- CSS——几个最新解决方案
一.重置默认样式 normalize.css ①不像其他CSSreset,它保存了一些有用的默认样式. ②规范了大量样式,纠正了一下bug与表现形式. ③有详细的注释解释代码的作用. 二.清除浮动 / ...