New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/...

20
Extending Xcode Boris Bügling - @NeoNacho

Transcript of New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/...

Page 1: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

Extending XcodeBoris Bügling - @NeoNacho

Page 2: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

Possibilities• Color Schemes

• File Templates

• Project Templates

• Plugins

Page 3: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

What are we building?

Page 4: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

Getting startedClone https://github.com/kattrali/Xcode5-Plugin-

Template into plugin templates directory

Page 5: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

Run it for the first time

Page 6: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

Your only friends…

• Debugging from the command line…

• … or from another Xcode instance

$ tail -f /var/log/system.log

$ rm -rf ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/*

Page 7: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID
Page 8: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

$ defaults read /Applications/Xcode51-DP2.app/Contents/Info DVTPlugInCompatibilityUUID 640F884E-CE55-4B40-87C0-8869546CAB7A

Compatibility UUIDs[MT] PluginLoading: Required plug-in compatibility UUID 640F884E-CE55-4B40-87C0-8869546CAB7A for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs

Add that ID to your plugin’s Info.plist

Page 9: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

Back to our pluginStep One: how to hide the debugger?

Page 10: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

Headers

• class-dump them yourself

• or just use https://github.com/luisobo/Xcode5-RuntimeHeaders

Page 11: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

@interface IDEWorkspaceWindowController : NSWindowController <NSWindowDelegate, IDEEditorAreaContainer, DVTStatefulObject, DVTTabbedWindowControlling, DVTEditor, DVTInvalidation> ![...] !@property(readonly) IDEEditorArea *editorArea; ![...] !@end

Page 12: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

@interface IDEEditorArea : IDEViewController <IDEDebuggerBarEditorInfoProvider> ![...] !- (void)toggleDebuggerVisibility:(id)arg1; - (void)activateConsole:(id)arg1; @property BOOL showDebuggerArea; ![...] !@end

Page 13: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

- (void)toggleDebuggersIfNeeded { for (NSWindowController *workspaceWindowController in [objc_getClass("IDEWorkspaceWindowController") workspaceWindowControllers]) { id editorArea = [workspaceWindowController editorArea]; if ([editorArea showDebuggerArea]) { [editorArea toggleDebuggerVisibility:nil]; } } }

Page 14: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

Step Two: detecting if the user typed into the source code editor

Page 15: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

[ AF O P LU ] h=--- v=--- NSClipView 0x7f822e93e990 f=(35,0,885,662) b=(0,637,-,-) TIME drawRect: min/mean/max 0.00/0.00/0.00 ms [ AF O LU ] h=-&- v=-&- DVTSourceTextView 0x7f822c723f00 f=(0,0,885,1339) b=(-) TIME drawRect: min/mean/max 0.00/0.00/0.00 ms [ A LU ] h=--- v=--- DVTMessageBubbleView 0x7f822eb5c080 f=(638,975,247,12) b=(-) TIME drawRect: min/mean/max 0.23/0.42/0.68 ms

Grepping through _subtreeDescription

Page 16: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

- (void)swizzleDidChangeTextInSourceTextView { [[objc_getClass("DVTSourceTextView") new] yl_swizzleSelector:@selector(didChangeText) withBlock:^void(id sself) { [self toggleDebuggersIfNeeded]; [sself yl_performSelector:@selector(didChangeText) returnAddress:NULL argumentAddresses:NULL]; }]; }

Page 17: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

Finally…

Page 18: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

Ship it{! "name": "My Life-Changing Xcode Plugin",! "url": "https://github.com/me/xcode-life-changing-plugin",! "description": "Makes Xcode stop, collaborate and listen."!}

Send a pull request to the Alcatraz packages repo

https://github.com/mneorr/alcatraz-packages

Page 19: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

AlcatrazThe Xcode package

manager !

http://mneorr.github.io/Alcatraz/

Page 20: New Extending Xcode - Vu0.Orgvu0.org/Extending Xcode.pdf · 2014. 1. 21. · Shared/Xcode/Plug-ins/ CocoaPodsPlugIn.xcplugin' not present in DVTPlugInCompatibilityUUIDs Add that ID

Thank you!

http://buegling.com/xcode