145

编辑菜单中有一个命令(默认快捷方式为Duplicate⌘</kbd>D), but it is (as Halley pointed out) meant for duplication in the Interface Builder part of Xcode.

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


Xcode 3 的相关问题(有一个有效的答案)......并且不适用于 Xcode 4。


为什么不直接复制粘贴?

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

一(1):移动到行首然后按⇧^E,然后用复制⌘C,移动到新行,对齐光标,最后用粘贴⌘V

(2) : ^A(设置光标到行首), ^SPACE(设置标记), ^E(设置光标到行尾), ⇧^W( Select to Mark; 自定义), 复制, 换行等。

正如弗兰克施罗德(在相关问题中)所说:

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

4

18 回答 18

189
  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. 添加一个新字典和一个新命令项,如下图所示(将它们命名为您想要的名称): 编辑 plist

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

  4. 重新启动 Xcode 并转到 Preferences - Key Bindings,搜索您的命令。

  5. 为命令设置组合键: 键绑定

  6. 终于在 Xcode 上释放了键绑定的力量……尽情享受吧!

于 2012-04-27T07:31:20.090 回答
113

2020 年更新

适用于 Xcode 版本:11.3.1 太

适用于 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、10.2.1

操作说明

  1. 授予编辑以下文件的权限。大多数情况下,操作系统不允许您编辑文件。

对于 11.3.1 版本

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/

11.3以下版本


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

sudo chmod 777 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/
  1. 通过编写以下命令来编辑文件:(如果可以,请在 sublime 或文本编辑器中打开它)

对于 11.3.1

open /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
  1. 附加以下 xml 片段:
<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>

截图

在此处输入图像描述

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

在此处输入图像描述

就是这样。

对于unix人来说: -

sudo chmod 755 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/ 
于 2015-12-10T06:51:26.447 回答
27

好的,我想出了这个:

XCode 11 的版本:

selectParagraph:, delete:, undo:, moveRight:, yankAndSelect:
  • 不触摸剪贴板
  • 适用于多行
  • 选择添加的行,因此可以多次使用而无需重新选择
  • XCode 11 中的固定选择
  • 撤消效果更好

由于我在每次 XCode 更新后应用此更改,因此我为此制作了一个脚本。可能它会造成一些损害,但我试图让它相对安全。它制作文件的副本,然后使用 perl 将 line 替换为其副本和附加命令。需要将 XCode 安装在/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

旧版本(我不确定新版本是否与旧版本兼容,所以我会保留在这里):

selectParagraph:, delete:, yank:, moveToBeginningOfLine:, setMark:, yank:, moveToBeginningOfLine:, moveLeft:, selectToMark:

和旧版本的脚本以避免手动文件编辑:

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

编辑:次要修复编辑2:更改为段落选择编辑3:为XCode 11添加了版本

于 2016-12-13T12:40:57.420 回答
17

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

您可以从我的 GitHub 存储库下载它: XcodeKit 插件 - https://github.com/ptfly/XcodeKit

于 2013-11-20T15:13:32.420 回答
15

编辑:2020 年 7 月 12 日 再次更新到 Xcode 11.5 后,我从文件中duplicate line输入的密钥消失了。plist我不得不再次添加它。键绑定仍然存在。

编辑:2019 年 9 月 17 日 再次更新到 Xcode 10.3 后,我从文件中duplicate line输入的密钥消失了。plist我不得不再次添加它。键绑定仍然存在。

编辑:2019 年 5 月 28 日 再次更新到 Xcode 10.2 后,我duplicate line的文件中的密钥条目plist消失了。我不得不再次添加它。键绑定仍然存在。

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

编辑:2018 年 10 月 14 日 Xcode 10:Apple 高层非常喜欢复制/粘贴,并确保在每个版本的 Xcode 更新中,从每个人的安装中删除行重复。我们开发人员一直对 Xcode 中发生的这种胡说八道感到非常沮丧,因为 Xcode 是唯一没有行重复选项的 IDE。我刚刚更新到 Xcode 10,正如您猜到的那样 - 我的所有快捷键都与我的行复制功能一起被删除。但是,它可以像原始答案一样修复。这次的细微差别是您将需要以下行:

<key>Duplicate Current Line</key>
<string>selectLine:, copy:, moveToBeginningOfLine:, paste:, moveToEndOfLine:</string>

编辑: Xcode 9:我不得不重做我的快捷方式以及行重复和删除,但好在现在您可以再次编辑 IDETextKeyBindingSet.plist。当他们发布这个版本时,这个高高在上的苹果公司一定是在度假。

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

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

这是如何完成的:

首先我们需要修改一个位于 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>

在此处输入图像描述

现在打开/重新启动 Xcode,转到 Preferences 并转到“Key Bindings”选项卡。使用搜索栏过滤并查找新的快捷方式。然后在快捷方式描述前面单击,为其分配您喜欢的快捷方式。确保您的快捷方式与现有快捷方式不冲突。

在此处输入图像描述

于 2016-03-30T17:29:13.460 回答
14

@Hailei 的回答非常好,但不幸的是,它破坏了剪贴板内容(让它填充了重复行的内容),这正是我试图避免的手动复制/粘贴方法的一部分.

因此,我将命令序列更改为:

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

如果您设置了 2 以外的内容,则2yank:可能无法按预期工作,但我很确定这是默认设置,您必须做一些重要的工作来更改它(它需要添加一个条目)。NSTextKillRingSize11~/Library/Preferences/.GlobalPreferences.plist

于 2012-11-13T22:04:57.237 回答
9

为什么要复制一行?复制整个段落更好。我的顺序:

复制当前段落

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

删除当前段落

selectParagraph:,
delete:,
moveUp:,
moveToEndOfParagraph:

在 Xcode 4.6 中运行良好

于 2013-06-17T06:28:06.727 回答
9

我想知道为什么没有人提到使用⌘</kbd> along with the arrow keys (←</kbd>↑</kbd>→</kbd>↓</kbd>) to both move the cursor and to select entire lines (by adding ⇧</kbd>).

我通过使用将光标移动到行首来定期复制整行(重复)⌘</kbd>+←</kbd> (instead of ctrl+A) and then use ⌘</kbd>+⇧</kbd>+→</kbd> (instead of ctrl+⇧</kbd>+E) to select the whole line to the end and then copy/paste.

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

于 2013-10-09T16:56:01.720 回答
3

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

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

添加deleteToBeginningOfLine保持重复行的缩进。

于 2012-08-24T19:05:29.513 回答
2

insertLineBreak 至少需要我在新行上制作副本,没有它我在同一行上得到副本

于 2013-04-06T21:04:17.777 回答
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

此处还介绍了其他几种可能的方法。

然后在 nano 编辑器中单击^W并键入“插入”以跳转到“插入和缩进”部分。在<dict>标签下粘贴这个 xml 片段:

<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>
于 2017-12-14T15:27:31.360 回答
1

这是我的 IDETextKeyBindingSet.plist 中的 Delete ( CTRL+ D) 和 Duplicate ( CMD++ SHIFT)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>
于 2013-04-03T04:02:52.257 回答
1

只是为了补充海雷的回答,最适合我的命令是:

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

对我来说,他建议的命令是在下面两行复制所需的行。

于 2017-12-18T15:54:24.020 回答
1

至于 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>
于 2020-01-05T11:29:50.157 回答
0

任何想要在 XCode 中匹配 sublime 的duplicateLineUpduplicateLineDown的 sublime 文本用户,请将以下内容添加到您的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>
于 2016-06-05T21:35:24.947 回答
0

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

sudo chmod 777 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist
于 2017-06-21T14:41:34.233 回答
0
<key>Duplicate Lines</key>    
<string>selectLine:, copy:, moveToBeginningOfLine:, paste:</string>

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

于 2018-03-27T10:04:28.963 回答
0

对于 XCode 13。

将“Vim 模式”映射到 ^⌘V。

然后:^⌘V yyp ^⌘V

于 2021-10-14T09:23:10.753 回答