Xcode重复行

时间:2012-04-22 07:49:36

标签: xcode4 keyboard-shortcuts xcode5 key-bindings duplication

在<编辑菜单中 Duplicate命令(默认快捷键为 D ),但它是(正如Halley指出的那样)意味着在Xcode的Interface Builder部分重复。

那么,你如何(轻松)在Xcode 4中复制一行?


对于Xcode 3来说,

Related question(有一个有效的答案)......对Xcode 4不起作用。


为什么不只是复制&amp;粘贴?

因为它很乏味而且需要过多的手工杂技:

(1):移至行开头,然后按⇧^ E ,然后使用⌘C复制,移至新行,使用⌘V粘贴光标,最后粘贴;

(2) ^ A (将光标设置为行开始), ^ SPACE (设置标记), ^ E (将光标设置为行尾),⇧^ W Select to Mark;自定义),复制,新行等

正如弗兰克施罗德(related question)所说:

  

重点不是使用Cmd-C / Cmd-V快捷方式。

17 个答案:

答案 0 :(得分:162)

  1. 转到此文件夹,其中包含力量的暗侧:

    • Xcode 4.2或之前:/Developer/Library/PrivateFrameworks/IDEKit.framework/Resources
    • Xcode 4.3或更高版本:/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources
  2. 打开IDETextKeyBindingSet.plist

  3. 添加新词典和新命令项作为下面的屏幕截图(将它们命名为您想要的名称): Editing the plist

    那是:selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:

  4. 重新启动Xcode并转到首选项 - 键绑定,搜索您的命令。

  5. 为命令设置组合键: Key Bindings

  6. 最后释放了Xcode上键绑定的强大功能......尽情享受吧!

答案 1 :(得分:59)

添加重复行适用于Xcode版本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以及

使用persiomission编辑以下文件,大多数时候OS不允许您编辑文件。

sudo chmod 666 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist

sudo chmod 777 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/

编辑以下文件

/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist

编写以下命令。

open /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist

附加以下xml snipets。

<key>Customized</key>
  <dict>
    <key>Duplicate Lines</key>
    <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string>
    <key>Duplicate Current Line</key>
    <string>moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, moveToBeginningOfLine:, yank:</string>
</dict>

已编辑文件的屏幕截图。

enter image description here

并重新启动Xcode并转到Preferences - Key Bindings,搜索我们输入的命令(重复行和重复当前行)。

enter image description here

多数民众赞成。

答案 2 :(得分:17)

今天我为Xcode 5编写了一个非常小的插件,用于删除和复制行和选择。

您可以从我的GitHub回购下载: XcodeKit Plugin - https://github.com/ptfly/XcodeKit

答案 3 :(得分:13)

@ Hailei的答案相当不错,但是有一个令人遗憾的副作用,即破坏剪贴板内容(留下它填充了重复行的内容),这正是我手动复制/粘贴方法的一部分试图避免。

所以,我将命令序列更改为:

moveToBeginningOfLine:,
deleteToEndOfLine:,
yank:,
insertNewline:,
moveToBeginningOfLine:,
yank:

如果yank:设置为除NSTextKillRingSize之外的其他内容,则1可能无法正常工作,但我非常确定1是默认设置,并且你必须做一些非平凡的工作来改变它(它需要在~/Library/Preferences/.GlobalPreferences.plist中添加一个条目。)

答案 4 :(得分:8)

为什么要复制一行?重复整段更好。我的序列:

重复当前段落

selectParagraph:,
delete:,
yank:,
moveToBeginningOfParagraph:,
yank:,
moveUp:,
moveToEndOfParagraph:

删除当前段落

selectParagraph:,
delete:,
moveUp:,
moveToEndOfParagraph:

在Xcode 4.6中正常工作

答案 5 :(得分:7)

编辑:2019年5月28日 在更新到Xcode 10.2后,我的快捷方式消失了。我不得不再次添加它们。

编辑:2018年12月23日 更新到Xcode 10.1后,我的所有快捷方式再次破裂。但不同的是,在更新plist文件以进行行复制后,我没有必要定义我的键绑定,它们已经存在。奇怪。

编辑:2018年10月14日 Xcode 10:苹果公司的高手真的喜欢复制/粘贴,并确保在每个版本的Xcode更新时,都会从每个人的安装中删除行复制。我们的开发人员对Xcode中的这种废话一直非常沮丧,因为永远是唯一没有行重复选项的IDE。我刚刚更新到Xcode 10,正如您猜测的那样 - 我的所有快捷键都与我的行重复功能一起被删除。但是,它像原始答案一样可以修复。这次略有不同,你需要以下几行:

<string>selectLine:, copy:, moveToBeginningOfLine:, paste:, moveToEndOfLine:</string>

编辑: Xcode 9:我不得不重做我的快捷方式和行复制 删除,但好的是现在你可以再次编辑IDETextKeyBindingSet.plist。这个高级苹果公司的家伙在发布这个版本时必须休假。

编辑: Xcode 8:Buggy,你根本无法修改IDETextKeyBindingSet.plist文件。 Xcode在启动时重置它。 Apple的这位高层人士真的决定让我们使用复制/粘贴而不是简单的行复制,就像所有其他IDE一样。

编辑: Xcode 7.1但仍然没有行重复和删除的快捷方式。这是我曾经使用过的唯一没有这种快捷方式的IDE。如果没有这两个关键捷径,我无法想象开发人员的生活。

根据我所阅读的内容,我为这些快捷方式设置了Xcode,并在http://jixte.com/2016/03/30/line-duplicate-and-deletion-in-xcode-7-x/

上发布了博客文章

以下是如何做到的:

首先我们需要修改一个位于Xcode.app包内的plist文件(需要sudo编辑)

/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist

然后查找<key>Insertions and Indentations</key>并在<dict>标记下添加以下内容:

<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>

然后在<key>Deletions</key>标记下的<dict>部分内找到和这些内容:

<key>Delete Current Line</key>
<string>selectLine:, delete:</string>
<string>selectLine:, delete:</string>

enter image description here

现在打开/重新启动Xcode,转到“首选项”并转到“键绑定”选项卡。使用搜索栏过滤并查找新的快捷方式。然后在快捷方式说明前单击,为其指定您喜欢的快捷方式。确保您的快捷方式与现有快捷方式不冲突。

enter image description here

答案 6 :(得分:7)

我想知道为什么没有人提到使用和箭头键( )移动光标并选择整行(通过添加)。

我通过使用 + (而不是 ctrl 将光标移动到行的开头来定期复制整行(复制) + A )然后使用 + + (而不是 ctrl + + E )选择整行到最后然后复制/粘贴。

我遇到了其他似乎没有人使用这些键盘快捷键的线程。它们在OS X中是全球性的,我一直都在使用它们!更少的手工杂技;)

答案 7 :(得分:6)

好的,我已经想到了这个:

selectParagraph:, delete:, yank:, moveToBeginningOfLine:, setMark:, yank:, moveToBeginningOfLine:, moveLeft:, selectToMark:
  • 没有触及剪贴板
  • 使用多行
  • 选择添加的行,因此可以多次使用而无需重新选择

由于我在每次更新XCode后应用此更改,因此我已为此制作了一个脚本。可能会造成一些损害,但我试图让它相对安全。它制作文件的副本,然后使用perl替换行的副本和附加命令。

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

编辑:次要修复 edit2:更改为段落选择

答案 8 :(得分:3)

我会考虑将命令序列修改为:

selectLine:,
copy:,
moveToEndOfLine:,
insertNewline:,
deleteToBeginningOfLine:,
paste:,
moveToBeginningOfLine:, 
deleteBackward:

添加的deleteToBeginningOfLine会保留重复行的缩进。

答案 9 :(得分:2)

insertLineBreak至少需要我在新行上复制,没有它我在同一行上复制

答案 10 :(得分:2)

我在MacOS Sierra和Xcode 9上解锁.plist文件时遇到了很大的麻烦,甚至@Tim的决定也不适用于我。如果您遇到同样的问题,请转到终端并执行以下操作:

cd /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/
sudo chmod -R 777 *
nano IDETextKeyBindingSet.plist

还介绍了其他几种可能的方法here

然后在纳米编辑器中点击^W并输入'insertions'以跳转到'插入和缩进'部分。在<dict>标记下粘贴此xml-snippet:

<key>Duplicate line</key>
<string>selectLine:, copy:, moveToEndOfLine:, insertNewLine:, paste:, deleteBackward:</string>

control + X,然后按Y,然后按Enter将文件保存在nano编辑器中。

UPD:我想出了一个更好的决定,它在复制之前增加了一行(当你想要复制一条在其下面有另一条线的线时很有用):

<key>Duplicate line</key>
<string>selectLine:, copy:, moveToEndOfLine:, insertLineBreak:, moveUp:, paste:, moveToBeginningOfLine:</string>

答案 11 :(得分:1)

这是我的删除( CTRL + D )和重复( CMD + SHIFT + 来自我的IDETextKeyBindingSet.plist的D )条目。 (在/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources)

我只是在Xcode 4.6.1中设置它们(根据上面和其他地方的user570753的回答)

    <key>Custimozed</key>
<dict>
    <key>Delete Current Line</key>
    <string>deleteToBeginningOfLine:, moveToEndOfLine:, deleteToBeginningOfLine:, deleteBackward:, moveDown:, moveToBeginningOfLine:</string>
    <key>Duplicate Current Line</key>
    <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, deleteToBeginningOfLine:, paste:, moveToBeginningOfLine:, deleteBackward:</string>
</dict>

答案 12 :(得分:0)

任何想要在XCode中匹配sublime的 duplicateLineUp duplicateLineDown 的崇高文字用户,请将以下内容添加到 IDETextKeyBindingSet.plist 文件中

<key>Line Duplications</key>
<dict>
    <key>Duplicate Current Line Above</key>
    <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:, moveUp:</string>
    <key>Duplicate Current Line Below</key>
    <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string>
</dict>

答案 13 :(得分:0)

如果其他人被拒绝编辑IDETextKeyBindingSet.plist,您可以通过以下方式给自己读/写权限:

sudo chmod 777 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist

答案 14 :(得分:0)

为了补充Hailei的答案,对我来说最有效的命令是:

selectLine:, copy:, moveRight:, moveLeft:, insertNewline:, paste:, deleteBackward:

他的建议命令是为我复制下面两行所需的行。

答案 15 :(得分:0)

<key>Duplicate Lines</key>    
<string>selectLine:, copy:, moveToBeginningOfLine:, paste:</string>

支持重复的行。 (这适用于Xcode 9.2)

答案 16 :(得分:0)

至于Xcode 11,以上都不对我有用。第一个答案的行为很怪异,因为它是在下一行之后插入行。但是,以下答案对我有用。

<key>Duplication</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>