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. 微信JS-SDK DEMO页面和示例代码

    <?php require_once "jssdk.php"; $jssdk = new JSSDK("yourAppID", "yourApp ...

  2. CodeForces 688A-Opponents

    题意: Arya在学校有n个敌人(一串含有0,1的数字表示),有一个游戏规则,如果当天这n个敌人全部出席("1"代表出席,),即这串数字全部为"1",则Arya ...

  3. Ubuntu gmake: command not found

    由于ubuntu上取消了gmake(GUNmake)的而全部使用make代替.所以此问题的解决方式是有两种: 1.makefile中 gmake用make代替: 2.创建一个make的gmake连接: ...

  4. 两个小的java程序,用于练习java基本语法

    1.输入两个数,求其加减乘除.用窗口的形式呈现 import javax.swing.JOptionPane; public class JJCC { public static void main( ...

  5. ACM 杂题,思路题 整理

    UVa 11572 - Unique Snowflakes 问一个数组中,无重复数字的最长子串长度是多少. 用map维护某数字上次出现的位置.另外用变量last表示上次出现数字重复的位置. 如果出现重 ...

  6. SQL匹配顺序

    SELECT%DISTINCT%%FIELD%FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%

  7. SVN 文件解锁

    之前一直一个人用svn,后来团队扩编,同事使用svn下载项目后.我却无法提交了,出现以下错误: locked in another working copy No lock on path (Stat ...

  8. Javascript DOM基础(一)概念

    Dom基础概念: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" ...

  9. Linux 进程退出后自动启动

    /********************************************************************** * Linux 进程退出后自动启动 * 说明: * 在系 ...

  10. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...