{"id":28,"date":"2012-07-26T18:17:40","date_gmt":"2012-07-26T18:17:40","guid":{"rendered":"https:\/\/blog.grantdavisinteractive.com\/?p=28"},"modified":"2014-01-02T02:03:19","modified_gmt":"2014-01-02T02:03:19","slug":"adding-custom-key-commands-in-xcode-4","status":"publish","type":"post","link":"https:\/\/blog.grantdavisinteractive.com\/?p=28","title":{"rendered":"Adding Custom Key Commands in Xcode 4"},"content":{"rendered":"<p>One of my favorite IDEs to program in, even if it feels clunky and rough around the edges, is Eclipse. I used it for years and became accustomed it its handy built-in key actions such as Duplicate Line, Delete Current Line, Move Line, etc.<\/p>\n<p>Once I moved into Xcode and began working primarily as an iOS developer I quickly became annoyed at the limitations of the built-in key strokes. I&#8217;ve since discovered a way to add your own custom actions into Xcode which essentially duplicates the functionality of Eclipse, which is awesome!<\/p>\n<p>To do this, you want to start by creating some actions that we&#8217;ll add to Xcode&#8217;s default key commands. Xcode uses plist filled with dictionary objects that represent sets of commands. We&#8217;re going to create our own group of commands and add it to the default set of Xcode key commands.<\/p>\n<p>Here&#8217;s what my commands look like:<\/p>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/><\/div><\/td><td><div class=\"xml codecolorer\"><span class=\"sc3\"><span class=\"re1\">&lt;key<span class=\"re2\">&gt;<\/span><\/span><\/span>GDI Commands<span class=\"sc3\"><span class=\"re1\">&lt;\/key<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n<span class=\"sc3\"><span class=\"re1\">&lt;dict<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;key<span class=\"re2\">&gt;<\/span><\/span><\/span>GDI Duplicate Current Line<span class=\"sc3\"><span class=\"re1\">&lt;\/key<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;string<span class=\"re2\">&gt;<\/span><\/span><\/span>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:<span class=\"sc3\"><span class=\"re1\">&lt;\/string<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;key<span class=\"re2\">&gt;<\/span><\/span><\/span>GDI Delete Current Line<span class=\"sc3\"><span class=\"re1\">&lt;\/key<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;string<span class=\"re2\">&gt;<\/span><\/span><\/span>moveToEndOfLine:, deleteToBeginningOfLine:, deleteBackward:, moveDown:, moveToEndOfLine:<span class=\"sc3\"><span class=\"re1\">&lt;\/string<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;key<span class=\"re2\">&gt;<\/span><\/span><\/span>GDI Move Current Line Up<span class=\"sc3\"><span class=\"re1\">&lt;\/key<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;string<span class=\"re2\">&gt;<\/span><\/span><\/span>selectLine:, cut:, moveUp:, moveToBeginningOfLine:, insertNewLine:, paste:, moveBackward:<span class=\"sc3\"><span class=\"re1\">&lt;\/string<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;key<span class=\"re2\">&gt;<\/span><\/span><\/span>GDI Move Current Line Down<span class=\"sc3\"><span class=\"re1\">&lt;\/key<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;string<span class=\"re2\">&gt;<\/span><\/span><\/span>selectLine:, cut:, moveDown:, moveToBeginningOfLine:, insertNewLine:, paste:, moveBackward:<span class=\"sc3\"><span class=\"re1\">&lt;\/string<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;key<span class=\"re2\">&gt;<\/span><\/span><\/span>GDI Insert Line Above<span class=\"sc3\"><span class=\"re1\">&lt;\/key<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;string<span class=\"re2\">&gt;<\/span><\/span><\/span>moveUp:, moveToEndOfLine:, insertNewline:<span class=\"sc3\"><span class=\"re1\">&lt;\/string<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;key<span class=\"re2\">&gt;<\/span><\/span><\/span>GDI Insert Line Below<span class=\"sc3\"><span class=\"re1\">&lt;\/key<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;string<span class=\"re2\">&gt;<\/span><\/span><\/span>moveToEndOfLine:, insertNewline:<span class=\"sc3\"><span class=\"re1\">&lt;\/string<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n<span class=\"sc3\"><span class=\"re1\">&lt;\/dict<span class=\"re2\">&gt;<\/span><\/span><\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>Once you&#8217;re happy with your commands, locate the plist file we&#8217;re going to modify:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/><\/div><\/td><td><div class=\"text codecolorer\">\/Applications\/Xcode.app\/Contents\/Frameworks\/IDEKit.framework\/Versions\/A\/Resources\/IDETextKeyBindingSet.plist<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>Open this in a text editor and add the xmlandelements we created about to the end of the file, but before the finaltags.<\/p>\n<p>Your file should look similar to this when finished:<\/p>\n<p><a href=\"https:\/\/blog.grantdavisinteractive.com\/wp-content\/uploads\/2012\/07\/Screen-Shot-2012-07-26-at-12.10.54-PM.png\"><img decoding=\"async\" title=\"Screen Shot 2012-07-26 at 12.10.54 PM\" alt=\"\" src=\"https:\/\/blog.grantdavisinteractive.com\/wp-content\/uploads\/2012\/07\/Screen-Shot-2012-07-26-at-12.10.54-PM.png\" width=\"600\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Save the file and then open up Xcode. If you already had it open, you&#8217;ll need to restart. Go into Preferences, Key Bindings.<\/p>\n<p>Here make a new set and search for your commands. I prefixed my commands with GDI so I can do a quick search and see all my custom commands.<\/p>\n<p><a href=\"https:\/\/blog.grantdavisinteractive.com\/wp-content\/uploads\/2012\/07\/Screen-Shot-2012-07-26-at-12.15.50-PM.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-38\" title=\"Screen Shot 2012-07-26 at 12.15.50 PM\" alt=\"\" src=\"https:\/\/blog.grantdavisinteractive.com\/wp-content\/uploads\/2012\/07\/Screen-Shot-2012-07-26-at-12.15.50-PM.png\" width=\"600\" srcset=\"https:\/\/blog.grantdavisinteractive.com\/wp-content\/uploads\/2012\/07\/Screen-Shot-2012-07-26-at-12.15.50-PM.png 864w, https:\/\/blog.grantdavisinteractive.com\/wp-content\/uploads\/2012\/07\/Screen-Shot-2012-07-26-at-12.15.50-PM-300x222.png 300w\" sizes=\"(max-width: 864px) 100vw, 864px\" \/><\/a><\/p>\n<p>Now, just double click the Key column for each command, add your keystroke, and start using your custom commands!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>One of my favorite IDEs to program in, even if it feels clunky and rough around the edges, is Eclipse. I used it for years and became accustomed it its handy built-in key actions such as Duplicate Line, Delete Current Line, Move Line, etc. Once I moved into Xcode and began working primarily as an <span class=\"ellipsis\">&hellip;<\/span> <span class=\"more-link-wrap\"><a href=\"https:\/\/blog.grantdavisinteractive.com\/?p=28\" class=\"more-link\"><span>Read More &rarr;<\/span><\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,6],"tags":[],"class_list":["post-28","post","type-post","status-publish","format-standard","hentry","category-tutorials","category-xcode"],"_links":{"self":[{"href":"https:\/\/blog.grantdavisinteractive.com\/index.php?rest_route=\/wp\/v2\/posts\/28","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.grantdavisinteractive.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.grantdavisinteractive.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.grantdavisinteractive.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.grantdavisinteractive.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=28"}],"version-history":[{"count":10,"href":"https:\/\/blog.grantdavisinteractive.com\/index.php?rest_route=\/wp\/v2\/posts\/28\/revisions"}],"predecessor-version":[{"id":67,"href":"https:\/\/blog.grantdavisinteractive.com\/index.php?rest_route=\/wp\/v2\/posts\/28\/revisions\/67"}],"wp:attachment":[{"href":"https:\/\/blog.grantdavisinteractive.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=28"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.grantdavisinteractive.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=28"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.grantdavisinteractive.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=28"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}