Xcode强大的代码提示功能是有目共睹的,用过都知道,可是你是否想过添加一些自定义的代码提示模板?你是否想让if默认的左括号挪到下一行?还有for、while、switch等等……如果你有这方面的需求的话,这篇文章刚好可以帮到你!

在Xcode左下角有个花括号的页签,这里面存储了很多代码提示模板,如下图


点击列表里面任一个项目都会弹出一个说明框,里面有个EditDone按钮,这很容易让人产生编辑的想法,其实这是个错觉:这些内置的代码模板是不可编辑的!你看到这里可能会有点着急,因为你可能想问那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 (&lt;#condition#&gt;) {
&lt;#statements#&gt;
}</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 (&lt;#condition#&gt;)
{
&lt;#statements#&gt;
}</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>

你可能注意到类似&lt;#condition#&gt;这样的代码,它们是什么呢?你再写代码遇到代码提示的时候,可能遇到过蓝色泡泡一样的东西,可以用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 (&lt;#condition#&gt;)
{
&lt;#statements#&gt;
}</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的更多相关文章

  1. VS自定义代码块Code Snippet

    一  .简述 我们在开发当中,避免不了一些重复的开发工作,在你漫长的开发以及学习当中,你会发现有这么一部分代码是你时常会使用到的.我想这个工具也是针对这个原因出来的吧,它就是预先把你需要的这部分代码的 ...

  2. 创建自己的Code Snippet(代码模板)

    一.名词解释 Code Snippet,代码模板,是一种快速生成代码的快捷方式,使用它可以有效地提高编程效率. 编程中可以使用Visual Studio提供的预先设置好的Code Snippet,也可 ...

  3. xcode自动完成代码 Code Snippet Library

    今天发现Xcode里一个好东西:代码片段库 你可以将自己常用的代码放到里面,给它命名,设置快捷键,以后想用这段代码的时候只要按快捷键,就会出现提示,直接将这段代码显示出来,十分高效. 比如我经常会用到 ...

  4. Xcode的代码片段快捷方式-Code Snippet Library(代码片段库)

    最近换了新电脑,装上Xcode敲代码发现很多以前攒的Code Snippet忘记备份了,总结了一下Code Snippet的设置方法,且行且添加,慢慢积累吧. 如下图:   Title - Code ...

  5. 善用VS中的Code Snippet来提高开发效率

    http://www.cnblogs.com/anderslly/archive/2009/02/16/vs2008-code-snippets.html http://www.cnblogs.com ...

  6. 善用VS中的Code Snippet来提高开发效率 分类: C# 2015-01-22 11:06 69人阅读 评论(0) 收藏

    前言  在谈谈VS中的模板中,我介绍了如何创建项目/项模板,这种方式可以在创建项目时省却不少重复性的工作,从而提高开发效率.在创建好了项目和文件后,就得开始具体的编码了,这时又有了新的重复性工作,就是 ...

  7. Xcode10 代码块(Code Snippet)添加和删除

    https://blog.csdn.net/lg767201403/article/details/82761448 Code Snippets 使用 https://blog.csdn.net/lv ...

  8. 使用 Code Snippet 简化 Coding

    在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符一个字符敲还是使用 Visual Studio 提 ...

  9. 如何创建 Code Snippet

    比如有一行自定义代码段: @property (nonatomic,copy) NSString *<#string#>; 需要添加到 Code Snippet 上,以帮助开发人员开发更便 ...

随机推荐

  1. 怎么做一个bat文件

    怎么做一个bat文件 | 浏览:639 | 更新:2014-11-25 17:02 1 2 3 4 5 6 7 分步阅读 其实做一个.BAT文件很简单,下面我就以做一个清除系统垃圾.BAT文件为例,给 ...

  2. OC中快速创建NSNumber NSDictionary NSArray的方法

    NSNumber: @()     @小括号 或者        NSNumber * num = @3;    NSValue * value = @4; NSDictionary :@{} @大括 ...

  3. PHP日志扩展 SeasLog-1.6.8, 性能更优

    SeasLog-1.6.8 发布了,性能更优. 改进日志: 1.6.8: 优化内存使用和性能,修复已知Bug. - Fixed issue #97 PHP5.* Cached Block. - Fix ...

  4. 如何利用Cloudera Manager来手动安装parcel包

    1.问题的描述: 当你利用Cloudera Manager部署了CDH的集群后,也许随着你的业务需求,你需要对你的就去哪做一些优化,或者扩展之类的,这个时候你可能需要下载安装一些组件.例如,我最近在阅 ...

  5. pads 扇出

    1 选择BGA器件 2.扇出设置 3 安全间距问题 4 可以区域扇出也可以多点扇出

  6. MySQL数据库2 - 登录MySQL及数据库管理

    一. 登录数据库 1.使用命令窗口登录MySQL 启动Mysql服务 -> 打开命令窗口 -> 输入登录密码 具体步骤:开始菜单 - 控制面板 - 管理工具 - 服务 - Mysql56( ...

  7. centos lamp

    一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...

  8. Web页中table导出到execl(带模板)

    1.将excel另存为html,将其复制到aspx文件中 2.输出格式为excel InitData(); Response.Clear(); Response.Buffer = true; Resp ...

  9. 蓝牙协议栈中的 OSAL

    蓝牙协议栈里的操作系统叫做 OSAL(操作系统抽象层).它并非一个真正意义上的操作系统,它只是实现了操作系统的一些功能,如任务切换.内存管理. OSAL 产生的根源:基于蓝牙协议栈开发的产品,实际上是 ...

  10. 几个排序算法的python实现

    几个排序算法     几个排序算法 几个排序算法 冒泡排序 选择排序 插入排序 快速排序 quick sort 冒泡排序 冒泡排序是比较简单的排序方法,它的思路是重复的走过要排序的序列,一次比较两个元 ...