2011-02-10 8 views
21

¿Hay alguna manera de editar los fragmentos integrados de Xcode? Hay un botón de edición, pero presionarlo no parece permitir cambiar el texto del fragmento.Xcode built-in snip edit

Cualquier idea es apreciada.

+0

Xcode 4 aún se encuentra bajo NDA –

+0

Xcode 4 ya no se encuentra bajo NDA. –

Respuesta

2

O este es un error, o es una característica. Yo creo que es el último. Puede agregar sus propios fragmentos, pero no puede editar los fragmentos integrados. Solo crearía un nuevo fragmento y lo personalizaría a tu gusto.

6

Puede editar fragmentos de código del sistema manualmente:

  1. Ir a este directorio: "/ Desarrollador/Library/Xcode/PrivatePlugIns".
  2. Mostrar contenido del paquete de "IDECodeSnippetLibrary.ideplugin"
  3. abierto "Contents/Resources/SystemCodeSnippets.codesnippets" como archivo de texto
  4. archivo editarlo

.codesnippets es un .Plist pero algunas cadenas introducidas con CR/LF y no puede ser editado por el editor plist estándar.

+3

En Xcode 4.3.2 esto se encuentra en "/Aplicaciones/Xcode.app/Contents/PlugIns/IDECodeSnippetLibrary.ideplugin/Contents/Resources". – Mundi

+1

Para la aplicación independiente de Xcode. Esta es la ruta exacta del archivo de los fragmentos predeterminados: "/Applications/Xcode4.3.3.app/Contents/PlugIns/IDECodeSnippetLibrary.ideplugin/Contents/Resources/SystemCodeSnippets.codesnippets" – LightMan

1

Escribí un script hoy que usa python y uncrustify para sacar los fragmentos de los que proporciona Xcode, reformatearlos a mi gusto, y volcarlos en un directorio donde luego puedo importarlos a ~/Library/Developer/Xcode/UserData/CodeSnippets. Está en github aquí: Xcode4Customization

17

Aún no puede editar los fragmentos de sistema incorporados. Sin embargo, puede editar fragmentos de "usuario".

La solución más simple en mi mente fue crear copias de todos los fragmentos predeterminados, pero modificarlos para que sean fragmentos de "usuario" y anular las versiones predeterminadas. Escribí un pequeño script de Python para hacer el trabajo. Es muy simple, y después de ejecutarlo, todos los fragmentos de Xcode serán mágicamente editables a través de la GUI de Xcode. No es necesario ir al rededor en el plist con la mano:

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.") 

Se dará cuenta de que en realidad no cambia ninguno de los archivos internos de Xcode. Simplemente agrega archivos y Xcode es lo suficientemente inteligente como para usar los archivos agregados en lugar de los fragmentos originales. Puede volver a los originales en cualquier momento simplemente eliminando la versión de usuario del fragmento. También puede ejecutar el script tantas veces como quiera sin preocuparse por sobrescribir ningún fragmento de usuario generado por ejecuciones previas del script.

+0

+1 ¡Gran solución, gracias! – InsertWittyName

+0

+1, pero hay un error en su script. No soy un gurú de Python, pero recibí un error al ejecutar el script bajo terminal. Python informa que la ruta para el archivo o directorio (de salida plist) no se encuentra. Creo que olvidó crear y abrir pliegos de escritura antes de intentar escribir en 'plistlib.writePlist (entry, snippet_path)'. Por cierto, gracias por su código – anonim

+2

@ anonim.developer, gracias por la sugerencia. Lo probé en una máquina limpia y de hecho hubo un problema. En realidad, ocurrió si el directorio de fragmentos del usuario no existía. El plist lib creará automáticamente el archivo si es necesario, pero no los directorios intermedios. He actualizado el guion. –

12

Hay una gran pequeña herramienta llamada "Edición de fragmentos". Lo probé y lo recomiendo encarecidamente. Al parecer, solía ser una aplicación de pago, pero el autor ahora la está regalando de forma gratuita.

http://cocoaholic.com/snippet_edit/

4

Puede editar los fragmentos del sistema Xcode utilizando un editor de texto y saber la ubicación del código del sistema de fragmentos de archivos. En Xcode 5.1.1 la ubicación del archivo de fragmentos de código del sistema ha cambiado una vez más a:

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

y debe tener root privilegios para editar el archivo plist en su lugar porque su propietario y permisos son los siguientes:

$ 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 

las claves del diccionario plist son bastante explica por sí mismo y por la llave IDECodeSnippetIdentifier, se puede generar por sí mismo utilizando UUID por ejemplo, el comando:

$ uuidgen 
42F6B133-5DA3-41DB-8874-4E10E447F723 

Una vez que haya editado el archivo usando por ejemplo sudo y el editor de su elección, usted tiene que reiniciar Xcode con el fin de recoger los cambios.

Happy hacking!