Xcode duplicate line
Solution 1
-
Go to this folder which contains dark side of the force:
- Xcode 4.2 or prior:
/Developer/Library/PrivateFrameworks/IDEKit.framework/Resources
- Xcode 4.3 or later:
/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources
.
- Xcode 4.2 or prior:
Open
IDETextKeyBindingSet.plist
.-
Add a new dictionary and a new command item as the screenshot below (name them what you want):
That's:
selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:
Restart Xcode and go to Preferences - Key Bindings, search for your command.
Set a key combination for the command:
Finally unleashed the power of key bindings on Xcode... Enjoy it!
Solution 2
Update 2020
Works on Xcode versions: 11.3.1 too
Works in Xcode versions: 7.1, 7.3, 7.3.1, 8.0, 8.1, 8.2, 8.3, 9.0, 9.1, 9.2, 10.0, 10.1, 10.2.1
Instruction
- Give permissions to edit the following files. Most of the time OS will not allow you to edit the files.
for 11.3.1 version
sudo chmod 666 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources//IDETextKeyBindingSet.plist
sudo chmod 777 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/
below 11.3 versions
sudo chmod 666 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist
sudo chmod 777 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/
- Edit the the file, by writing the following command: (Open it in sublime or text editor if you can)
for 11.3.1
open /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist
for below versions
open /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist
- Append the following xml snippets:
<key>custom</key>
<dict>
<key>Duplicate Current Line</key>
<string>moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, moveToBeginningOfLine:, yank:</string>
<key>Duplicate Lines</key>
<string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string>
<key>Delete Line</key>
<string>selectLine:, deleteBackward:</string>
</dict>
Screenshots
and Restart Xcode and go to Preferences - Key Bindings
, search for the command we typed (Duplicate Lines&Duplicate Current Line).
Thats it.
For unix people to note :-
sudo chmod 755 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/
Solution 3
Ok, I've came up with this:
Version for XCode 11:
selectParagraph:, delete:, undo:, moveRight:, yankAndSelect:
- doesn't touch clipboard
- works with multiple lines
- selects added lines, so can be used multiple times without reselecting
- fixed selection in XCode 11
- works better with undo
Since I'm applying this change after every XCode update, I've made a script for that. Possibly it can cause some damage, but I've tried to make it relatively safe. It makes a copy of the file, and then replaces line with its copy and additional command using perl. Requires XCode to be installed at /Applications/Xcode.app
cp /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist ~/Desktop/IDETextKeyBindingSet.plist; sudo perl -pi -e 's/\<string\>selectWord:\<\/string>/'$'\<string\>selectWord:\<\/string\>\n\t\t\<key\>Duplicate Selection\<\/key\>\n\t\t\<string\>selectParagraph:, delete:, undo:, moveRight:, yankAndSelect:\<\/string>/g' /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist
Older version (I'm not sure if the new one is compatible with older versions, so I'll keep it here):
selectParagraph:, delete:, yank:, moveToBeginningOfLine:, setMark:, yank:, moveToBeginningOfLine:, moveLeft:, selectToMark:
and script for older version to avoid manual file editing:
cp /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist ~/Desktop/IDETextKeyBindingSet.plist; sudo perl -pi -e 's/\<string\>selectWord:\<\/string>/'$'\<string\>selectWord:\<\/string\>\n\t\t\<key\>Duplicate Selection\<\/key\>\n\t\t\<string\>selectParagraph:, delete:, yank:, moveToBeginningOfLine:, setMark:, yank:, moveToBeginningOfLine:, moveLeft:, selectToMark:\<\/string>/g' /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist
edit: minor fix edit2: changed to paragraph selection edit3: added version for XCode 11
Solution 4
Today I wrote a very small plugin for Xcode 5 that delete and duplicate lines and selections.
You can download it from my GitHub repo: XcodeKit Plugin - https://github.com/ptfly/XcodeKit
Solution 5
EDIT: Jul 12, 2020
After update to Xcode 11.5 again my duplicate line
key entry from the plist
file was gone. I had to add it again. The key binding was still there though.
EDIT: Sep 17, 2019
After update to Xcode 10.3 again my duplicate line
key entry from the plist
file was gone. I had to add it again. The key binding was still there though.
EDIT: May 28, 2019
After update to Xcode 10.2 again my duplicate line
key entry from the plist
file was gone. I had to add it again. The key binding was still there though.
EDIT: Dec 23, 2018 After update to Xcode 10.1 all my shortcuts broke again. But something different was that after updating the plist file for line duplication, I didn't have to define my key bindings, they were already there. Strange.
EDIT: OCT 14, 2018 Xcode 10: Somebody high up at Apple really loves copy/paste, and makes sure that with every version of Xcode update, the line duplication is removed from everyone's install. We developers have been extremely frustrated by this nonsense going on in Xcode since forever, the only IDE with no line duplication option. I just updated to Xcode 10, and as you guessed it - all my shortcut keys are removed along with my line duplication functionality. However, it is fixable like in the original answer. A slight difference this time is that you will need the following line:
<key>Duplicate Current Line</key>
<string>selectLine:, copy:, moveToBeginningOfLine:, paste:, moveToEndOfLine:</string>
EDIT: Xcode 9: I had to redo my shortcuts and line duplication and deletion, but good thing is that now you can edit IDETextKeyBindingSet.plist again. This high up Apple guy must be on vacation when they released this version.
EDIT: Xcode 8: Buggy, you can't modify the IDETextKeyBindingSet.plist file at all. Xcode resets it on start. This high up guy at Apple is really determined to make us use copy/paste instead of simple line duplication like in all other IDEs out there.
EDIT: Xcode 7.1 and still there are no shortcuts for line duplication and deletion. This is the only IDE I have ever worked with with no such shortcuts. And I can't imagine life of a developer without these two critical shortcuts.
Here is how it can be done:
First we need to modify a plist file that lives inside the Xcode.app bundle (needs sudo to edit)
/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist
Then look for <key>Insertions and Indentations</key>
and under the <dict>
tag add the following:
<key>Insert New Line Below</key>
<string>moveToEndOfLine:, insertNewline:</string>
<key>Insert New Line Above</key>
<string>moveUp:, moveToEndOfLine:, insertNewline:</string>
<key>Duplicate Current Line</key>
<string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string>
Then find the and these inside the section <key>Deletions</key>
under the <dict>
tag:
<key>Delete Current Line</key>
<string>selectLine:, delete:</string>
<string>selectLine:, delete:</string>
Now Open/Restart Xcode, go to Preferences and go to the “Key Bindings” tab. Use the search bar to filter and look for the new shortcuts. Then click in front of the shortcut description to assign it a shortcut of your liking. Make sure your shortcut doesn't conflict with existing shortcuts.
Blaz
Software developer focused on backend development, primarily using Elixir & OTP. Contact me.
Updated on March 30, 2022Comments
-
Blaz about 2 years
There is a
Duplicate
command in the Edit Menu (with a default shortcut of ⌘D), but it is (as Halley pointed out) meant for duplication in the Interface Builder part of Xcode.So, how do you (easily) duplicate a line in Xcode 4?
Related question (with a working answer) for Xcode 3 ... and which does not work for Xcode 4.
Why not just copy & paste?
Because it is tedious and entails too much hand-acrobatics:
either (1): moving to line beginning and then pressing ⇧^E, then copying with ⌘C, moving to new line, alligning cursor, and finally pasting with ⌘V;
or (2): ^A (set cursor to line begining), ^SPACE (set mark), ^E (set cursor to line ending), ⇧^W (
Select to Mark
; customized), copy, new line, etc.As Frank Schröder (in the related question) put it:
The whole point is NOT to use the Cmd-C/Cmd-V shortcuts.
-
Daniel about 12 yearsSelect the line and copy paste?
-
Blaz about 12 years@Dani, CP is just too much work (and line duplication isn't something for which need arises only rarely). :) I've updated the question.
-
Hailei about 12 yearsCommand-D is for control duplication in Interface Builder.
-
Blaz about 12 years@Halley, this is good to know. And is it the equivalent of ⌥-mouse-drag (which also copies interface elements)?
-
Hailei about 12 years@courteous I think so. Modifier Keys section in disanji.net/iOS_Doc/#documentation/DeveloperTools/Conceptual/… says that "pressing the Option key during drag-and-drop operations copies the selected objects instead of moving them."
-
Blaz about 12 years@Halley, I was just wondering whether there was any difference between the two (⌘D and ⌥-mouse-drag) with regard to outlets, etc.
-
duongel about 6 yearsFor the latest Xcode 9.3, see my accepted answer
-
Pervez Alam over 3 yearsAnd third good reason I can think of is not over writing the clipboard which might be needed to edit the new duplicate lines. Its pretty simple and handy in Android-Studio.
-
-
Michal Stefanow about 12 yearsI don't know why but it crashes my Xcode. Note that the file is located here
/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/
and you need to change permissions recursivelysudo chmod 777 -R *
otherwise you cannot edit this file... -
Blaz about 12 years@MichalStefanow, the location that you wrote is actually the same location that
/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources
alias points to. Otherwise, I've successfully followed Halley's steps on version 4.3.2 ... I suggest you backup up the original file and then open it in Xcode itself (and not in TextEdit). Also, regarding the permissions: changing them (only for the file itself; no recursion needed) in Finder worked just fine. -
Vlad Tsepelev about 12 yearsBig thanx! For lazy users - selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:
-
Vlad Tsepelev about 12 yearsIf your xCode crashes! Close xCode, open file with any text editor and add your dictionary:
<key>Custom</key> <dict> <key>Duplicate Current Line</key> <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string> </dict>
-
User almost 12 yearsWorks for me in XCode 4.4.1! Had some trouble changing permissions (finder or chmod 777 and start with sudo from terminal didn't work, for some reason). I copied the file to somewhere else, edited it, and overwrote the original one, that worked.
-
Rafał Sroka over 11 yearsIn Xcode 4.5 works but I could not change the permissions. I used sudo nano console text editor to edit a file.
-
Rich Apodaca over 11 yearsIn Xcode 4.5.1, I added the new command in the plist, but it did not show up in the Key Bindings dialog. The plist file was successfully saved, though.
-
dbernard over 11 yearsI suggest using the command
defaults write -g NSTextKillRingSize 1
instead of playing with the GlobalPreferences.plist. ;) -
trkaplan about 11 yearschmod command in @MichalStefanow 's comment doesn't work. Put -R before 777.
sudo chmod -R 777 *
-
nipponese about 11 years@amas It's likely you need to copy the file somewhere else before you modify it then overwrite the original file, unless you want to risk changing permissions on parent folder(s).
-
User over 10 yearsThis requires much more "hand-acrobatics" than duplicating with only 1 action/key combination... it's the way I duplicate text in a text editor or webbrowser, yes, but I expect a bit more from IDE.
-
User over 10 yearsAnd also, with duplicate line shortcut you don't overwrite the content of the clipboard. Many times I you copy something, duplicate code and want to paste it - with your method you have to copy it again.
-
Baldur over 10 yearsWell yes. But less than the way suggested by the OP. I can agree that a single command would be best. I just thought I would point out an alternative.
-
Logan Moseley over 10 yearsAgreed, manipulating paragraphs is superior to lines. Everyone, make your editor narrow enough to wrap text and try to use the line commands.
-
Mitkins over 10 yearsI just downloaded and installed this - You can use System preferences to set keyboard shortcuts for the commands too. Very nice!
-
McUsr over 10 yearsThis worked great once I realized I had to exchange the (good looking) newlines with a space after the comma.
-
Sjoerd Perfors over 10 yearsBest solution there is because this one won't break you current clipboard. To add keybindings: System preferences -> keyboard -> shortcuts -> app shortcuts -> '+'. There choose Xcode and menu title for example 'Delete Selection / Line'
-
John Ballinger over 10 yearsI just installed this. AWESOME, for some reason though, my "Duplicate" menu under edit is greyed out. Even though I have selected a line in the editor, cursor and have tried selecting whole line.
-
tmsimont almost 10 yearsthis almost works, but for some reason a bunch of whitespace gets added to the end of the duplicated line.. any idea why?
-
tmsimont almost 10 yearswhat is this magical syntax? where do these commands "moveToEndOfLine, insertNewLine, etc" come from?
-
tmsimont almost 10 yearsif fixed it with this modification :
moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, setMark:, moveToBeginningOfLine:, selectToMark:, yank:
-
Hailei almost 10 yearsThese are actually Objective-C methods of NSResponder class. See developer.apple.com/library/mac/documentation/Cocoa/Reference/…
-
manroe about 9 yearsthis is still better than nothing out-of-the-box. i wish that cmd+C/X with no selection would just copy/cut the whole line like other editors do...
-
csga5000 almost 9 years@Baldur This is what I do as well. cmd+left cmd+shift+right cmd+c cmd+right enter cmd+left cmd+p. At 7 keystrokes it can easily be done in less than 3 seconds, however, it's still quite tedious relative to ctrl+d like in many text editors. It's unfortunate this isn't build in to xcode, or that in general macs and apple software don't have better hot keys.
-
Ivan Caravanio over 8 yearsFor some reason in Xcode 7.1.1 the
insertNewLine:
statement doesn't work. UseinsertLineBreak:
instead:selectLine:, copy:, moveToEndOfLine:, insertLineBreak:, paste:, deleteBackward:
-
Randika Vishman almost 8 yearsIt works like a charm! I edited the
IDETextKeyBindingSet.plist
and added the above dictionary and then mapped the keys in Preferences of XCode. -
IlyaEremin almost 8 yearsI am android dev and when I started to trying ios dev I realized how android studio (or intellij idea) is good.
-
quemeful almost 8 yearsHow small is your window that your code is wrapping. Consider breaking your code up into smaller lines if that is happening so often.
-
SquareBox over 6 yearsit doesn't work for me. The "Duplicate" is greyed out and keyboard shortcut won't work also.
-
Alex about 6 yearsI had to add this instead to simulate sublime text's
Duplicate Line
functionality in Xcode 9.2:selectLine:, copy:, moveToEndOfLine:, moveToBeginningOfLine:, paste:, insertLineBreak:, deleteBackward:, moveLeft:
-
mkeremkeskin about 6 yearsReally thanks for this, looking for this combination. This can duplicate single line or multiple lines without adding unwanted newLines and also ctrl-z works well.
-
Kaptain almost 6 yearsThis configuration works the best way for me:
moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, moveToBeginningOfLine:, yank:
-
lenooh over 5 yearsThis will overwrite your copy/paste buffer! Use
yank
instead. -
marcelosalloum over 5 yearsFor XCode 10.1, I had to use the following string: moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, setMark:, moveToBeginningOfLine:, selectToMark:, yank:. Big thanks to @tmsimont
-
marcelosalloum over 5 yearsFor XCode 10.1, I had to use the following string: moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, setMark:, moveToBeginningOfLine:, selectToMark:, yank:. Big thanks to @tmsimont
-
kkaun over 4 yearsSeems this is the most legit solution without butching config files which in some way speeds up the action. Still wondering why it doesn't work out-of-the-box like in some same-class IDEs (greetings Android Studio).
-
nrx over 4 yearsUnfortunately IDETextKeyBindingSet.plist disappeared in 11.3.1. Does anybody know where to find it (or some modern stuff which replaced it)?
-
Dirk Bester about 4 yearssudo chmod 755 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/ to reset the folder permissions and chmod 644 for the file for unix noobs like me.
-
OxyFlax about 4 yearsThanks, that's what is closest to IntelliJ behavior IMHO
-
Dirk Bester about 4 yearsThe point here is to be productive. You copy a snippet that then replaces a part of some line that you just duplicated without affecting the snippet in the copy buffer. Select, Cmd-C, click, Cmd-D (Duplicate), select, Cmd-V. Yes, everyone knows how to tediously type your 5 billion commands and move the mouse around a lot. We are instead looking for Duplicate Line. Something you will use multiple times a day while coding.
-
fsb over 2 yearsThis worked fine all the way thru v13.1. I just tried it with v13.2 and it didn't work. Specifically, it's the key mapping for Duplicate Current Line that I couldn't get to work properly.
-
NewestStackOverflowUser over 2 yearsI just googled how to duplicate line in xcode. Was expecting a simple answer like command + D like in IntelliJ. This however looks like shooting fish in a barrel.
-
Fabian over 2 yearsFor debugging, check whether the plist is malformed with
plutil <PATH_TO_FILE>
and check whether you use xcode-beta or xcode.