Xcode内置代码段编辑

Xcode内置代码段编辑,xcode,code-snippets,Xcode,Code Snippets,有没有办法编辑Xcode的内置代码段?有一个编辑按钮,但按下它似乎不允许更改代码段的文本 任何洞察都将不胜感激。这要么是一个bug,要么是一个特性。我相信是后者。您可以添加自己的代码段,但不能编辑内置代码段。我只需要制作一个新的代码片段,并根据您的需要进行自定义 您可以手动编辑系统代码段: 转到以下目录:“/Developer/Library/Xcode/PrivatePlugIns” 显示“IDECodeSnippetLibrary.ideplugin”的包内容 以文本文件形式打开“Conte

有没有办法编辑Xcode的内置代码段?有一个编辑按钮,但按下它似乎不允许更改代码段的文本


任何洞察都将不胜感激。

这要么是一个bug,要么是一个特性。我相信是后者。您可以添加自己的代码段,但不能编辑内置代码段。我只需要制作一个新的代码片段,并根据您的需要进行自定义

您可以手动编辑系统代码段:

  • 转到以下目录:“/Developer/Library/Xcode/PrivatePlugIns”
  • 显示“IDECodeSnippetLibrary.ideplugin”的包内容
  • 以文本文件形式打开“Contents/Resources/SystemCodeSnippets.codesnippets”
  • 编辑它

  • .codesnippets文件是一个.plist文件,但有些字符串是用CR/LF输入的,不能由标准plist编辑器编辑。

    我今天写了一个脚本,它使用python和uncrustify从Xcode提供的代码中提取代码片段,并根据自己的喜好重新格式化,然后将它们转储到一个目录中,在那里我可以将它们导入~/Library/Developer/Xcode/UserData/codesippets。它位于github上:

    您仍然无法编辑内置的系统代码段。但是,您可以编辑“用户”代码段

    在我看来,最简单的解决方案是创建所有默认代码段的副本,但修改它们,使它们成为“用户”代码段,并覆盖默认版本。我编写了一个小Python脚本来完成这项工作。它非常简单,运行它之后,所有Xcode的代码片段都可以通过Xcode GUI神奇地编辑。无需手动在plist中四处捣乱:

    import plistlib
    import os.path
    
    # Create user snippet directory if needed.
    user_snippet_path = os.path.expanduser("~/Library/Developer/Xcode/UserData/CodeSnippets")
    try: 
        os.makedirs(user_snippet_path)
    except OSError, err:
        if err.errno != errno.EEXIST or not os.path.isdir(user_snippet_path): 
            raise
    
    # Important, you'll need to quit and restart Xcode to notice the effects.
    # Important, change this if you're on a Developer Preview of Xcode.
    system_snippet_path = "/Applications/Xcode.app/Contents/PlugIns/IDECodeSnippetLibrary.ideplugin/Contents/Resources/SystemCodeSnippets.codesnippets"
    
    print("Reading snippets from " + system_snippet_path)
    plist = plistlib.readPlist(system_snippet_path)
    for entry in plist:
    
        # Create a new user snippet file with modified
        # contents of the original snippet. Ignore paths that
        # already contain a user snippet to prevent overwriting
        # previously generated snippets.
        snippet_id = entry["IDECodeSnippetIdentifier"]
        snippet_path = user_snippet_path + "/" + snippet_id + ".codesnippet"
        if os.path.exists(snippet_path):
            print(snippet_path + " already exitsts: Skipping.")
            continue
    
        print("Writing " + snippet_path)
    
        # Marks the snippet as a user snippet. Xcode will
        # crash if a user snippet and a system snippet share
        # the same identifier.
        entry["IDECodeSnippetUserSnippet"] = True
    
        # Given two snippets with the same identifier,
        # Xcode will only show the snippet with the higher
        # "version number". This effectively hides the
        # default version of the snippet.
        entry["IDECodeSnippetVersion"] += 1
    
        plistlib.writePlist(entry, snippet_path)
    
    print("Done writing snippets.")
    

    您会注意到,它实际上并没有更改任何Xcode的内部文件。它只是添加文件,Xcode足够聪明,可以使用添加的文件而不是原始代码段。只需删除代码段的用户版本,即可随时回滚到原始版本。您还可以根据需要多次运行脚本,而无需担心会覆盖以前运行脚本时生成的任何用户代码段。

    有一个很棒的小工具,名为“代码段编辑”。我刚试过,极力推荐。显然,它曾经是一个付费应用,但作者现在免费赠送了它


    您可以使用文本编辑器和 系统代码段文件的位置。在Xcode 5.1.1中 系统代码段文件的位置再次更改为:

    /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/SystemCodeSnippets.codesnippets

    您必须具有
    root
    权限才能在位编辑plist文件,因为它是 所有者和权限如下所示:

    $ ls -l /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/SystemCodeSnippets.codesnippets
    -rw-r--r--  1 root  wheel  190 May 16 18:23 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/SystemCodeSnippets.codesnippets
    
    plist字典键是非常不言自明的,适用于
    idecodesippetidentifier
    key,您可以使用 例如,命令:

    $ uuidgen
    42F6B133-5DA3-41DB-8874-4E10E447F723
    
    使用例如
    sudo
    和您选择的编辑器编辑文件后,您可以 必须重新启动Xcode才能获取更改


    快乐的黑客

    Xcode 4不再属于NDA。在Xcode 4.3.2中,它位于“/Applications/Xcode.app/Contents/PlugIns/IDECodeSnippetLibrary.ideplugin/Contents/Resources”中,用于Xcode的独立应用程序。这是默认代码段的确切文件路径:“/Applications/Xcode4.3.3.app/Contents/PlugIns/idecodesippetlibrary.ideplugin/Contents/Resources/systemcodesippets.codesippets”+1,但脚本中存在错误。我不是python大师,但在terminal下运行脚本时收到一个错误。Python报告未找到(输出plist的)文件或目录的路径。我想您忘记了在尝试在
    plistlib.writePlist(条目,snippet\u路径)
    上写入可写plist之前创建并打开它。顺便说一下,谢谢你的帮助code@anonim.developer,谢谢你的提示。我在一台干净的机器上试过,确实出了问题。实际上,如果用户的snippets目录不存在,就会发生这种情况。plist库将根据需要自动创建文件,但不会创建中间目录。我已经更新了脚本。注意:如果您已经创建了自定义代码段
    os。makedirs(user\u snippet\u path)
    将引发异常,因为目录已经存在。此外,此脚本似乎会影响Xcode的自动缩进。运行它之后,Xcode将不再自动缩进嵌套项,例如if语句下的行或{}括号中的行。如果删除自定义代码段,脚本创建的缩进将再次工作。如果代码段路径已经存在,脚本将捕获并接受异常。你真的看到那种行为了吗?至于自动缩进,这对我来说是新的。我为Xcode 4写了这篇文章,从那以后我们有了一个主要的版本,所以事情可能已经改变了。。。