Xcode重复行


127

一个Duplicate在编辑菜单(用默认的快捷命令D),但它(如哈雷指出的)意味着在Xcode中的Interface Builder的部分重复。

因此,如何(轻松地)在Xcode 4中复制一行?


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


为什么不只是复制并粘贴?

因为它很乏味并且需要太多的技巧:

任意(1):移动到行的开头,然后按⇧^E,然后使用复制⌘C,移动到新行,指定光标,最后使用粘贴⌘V ;

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

正如FrankSchröder(在相关问题中)所说:

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


1
选择行并复制粘贴?
Dani 2012年

1
@ Dani,CP太多的工作(行复制不是很少需要的事情)。:)我已经更新了问题。
Blaz 2012年

1
Command-D用于Interface Builder中的控件复制。
Hailei 2012年

@Halley,很高兴知道。并等同于mo-mouse-drag(它还会复制界面元素)吗?
Blaz 2012年

@courteous,我是这样认为的。disanji.net/iOS_Doc/#documentation/DeveloperTools/Conceptual/…中的“ 修改键”部分说,“在拖放操作期间按Option键会复制所选对象,而不是移动它们。”
Hailei 2012年

Answers:


173
  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. 在下面的屏幕截图中添加一个新的词典和一个新的命令项(将其命名为您想要的名称): 编辑列表

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

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

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

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


3
@MichalStefanow,您写的位置实际上是别名指向的位置/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources。否则,我将成功遵循Halley在4.3.2版上的步骤...建议您备份原始文件,然后在Xcode本身(而不是在TextEdit中)中打开它。此外,关于权限:在Finder中更改权限(仅针对文件本身;无需递归)也可以。
Blaz

29
大thanx!对于懒惰的用户-selectLine:,copy:,moveToEndOfLine:,insertNewline:,paste:,deleteBackward:
Vlad Tsepelev 2012年

15
如果您的xCode崩溃了!关闭xCode,使用任何文本编辑器打开文件并添加词典: <key>Custom</key> <dict> <key>Duplicate Current Line</key> <string>selectLine:, copy:, moveToEndOfLine:, insertNewline:, paste:, deleteBackward:</string> </dict>
Vlad Tsepelev 2012年

2
在XCode 4.4.1中为我工作!更改权限时遇到了一些麻烦(由于某种原因,finder或chmod 777并从终端以sudo开头无效)。我将文件复制到其他地方,对其进行了编辑,然后覆盖了原来的文件,但仍然有效。
Ixx 2012年

2
我是android开发人员,当我开始尝试ios开发人员时,我意识到android studio(或intellij的想法)是多么的好。
IlyaEremin '16

90

更新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/

对于以下版本

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/ 

它就像一个魅力!我编辑了,IDETextKeyBindingSet.plist并添加了以上字典,然后将键映射到XCode的偏好设置中。
Randika Vishman'7

3
这些是mac用户需要的书呆子答案!
卡·达万佐

1
对于XCode的10.1,我不得不使用下面的字符串:moveToBeginningOfLine :, deleteToEndOfLine :,抽出:, insertNewline:,设置标记:,moveToBeginningOfLine :, selectToMark :,猛拉:。非常感谢@tmsimont
marcelosalloum

1
这是我随时更新Xcode的第一件事。
newDeveloper

1
该解决方案对我有效,而不是被接受的答案
khalid

18

好的,我想到了这个:

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

编辑:次要修订edit2:更改为段落选择edit3:为XCode 11添加了版本


非常感谢您寻找这种组合。这可以复制单行或多行,而无需添加不需要的newLines,而且ctrl-z效果很好。
mkeremkeskin

谢谢,这是最接近IntelliJ行为的恕我直言
OxyFlax

17

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

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


我刚刚下载并安装了此文件-您也可以使用系统偏好设置来设置命令的键盘快捷键。非常好!
Orion Edwards

最好的解决方案是,因为这不会破坏您当前的剪贴板。要添加键绑定:系统偏好设置->键盘->快捷方式->应用程序快捷方式->'+'。在那里选择Xcode和菜单标题,例如“ Delete Selection / Line”
Sjoerd Perfors 2014-2-18

我刚刚安装了这个。令人敬畏的是,由于某种原因,我正在编辑的“重复”菜单显示为灰色。即使我在编辑器中选择了一行,光标也尝试选择整行。
约翰·巴林格

这真是太棒了。谢谢!
2014年

这对我不起作用。“重复项”显示为灰色,键盘快捷键也无法使用。
SquareBox '18

13

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

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

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

yank:如果您将NSTextKillRingSize设置为,则2 s可能无法按预期工作1,但是我敢肯定,这1是默认设置,您必须做一些不平凡的工作来更改它(它需要向添加一个条目~/Library/Preferences/.GlobalPreferences.plist)。


我建议使用该命令,defaults write -g NSTextKillRingSize 1而不要使用GlobalPreferences.plist。;)
dbernard 2013年

@amas您可能需要先将文件复制到其他地方,然后再进行修改,然后覆盖原始文件,除非您想冒风险更改父文件夹的权限。
日本,2013年

这几乎可以正常工作,但是由于某种原因,在重复行的末尾添加了一堆空格。.知道为什么吗?
tmsimont 2014年

5
如果使用此修改对其进行了修复:moveToBeginningOfLine:, deleteToEndOfLine:, yank:, insertNewline:, setMark:, moveToBeginningOfLine:, selectToMark:, yank:
tmsimont 2014年

这应该是建议的答案(遵循@Hailei指南)。谢谢!
brkeyal

9

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

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

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


与仅使用1个动作/按键组合进行复制相比,这需要更多的“手工技巧” ...这是我在文本编辑器或Web浏览器中复制文本的方式,是的,但是我希望从IDE中获得更多的技巧。
Ixx

1
而且,使用重复的行快捷键,您不会覆盖剪贴板的内容。很多时候,我复制了一些东西,重复了代码并想粘贴-使用您的方法,您必须再次复制它。
Ixx

嗯,是。但是少于OP建议的方式。我可以同意,最好使用单个命令。我只是想指出一个替代方案。
Baldur

1
这总比开箱即用要好。我希望没有选择的cmd + C / X能够像其他编辑器一样复制/剪切整行...
manroe 2015年

@Baldur这也是我所做的。cmd +左cmd + shift +右cmd + c cmd +右输入cmd +左cmd + p。只需敲击7次键,就可以在不到3秒的时间内完成操作,但是,相对于ctrl + d而言,相对于许多文本编辑器而言,它还是很繁琐的。不幸的是,这不是xcode的内置功能,或者通常是Mac和Apple软件没有更好的热键。
csga5000

9

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

编辑:2019年9月17日 在再次更新到Xcode 10.3之后,我duplicate lineplist文件中输入的密钥不见了。我不得不再次添加它。密钥绑定仍然在那里。

编辑:2019年5月28日 再次更新到Xcode 10.2之后,我duplicate lineplist文件中输入的密钥就消失了。我不得不再次添加它。密钥绑定仍然在那里。

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

编辑:2018年 10 月14日 Xcode 10:苹果公司的高手真的很喜欢复制/粘贴,并确保在每个版本的Xcode更新中,行复制都从每个人的安装中删除。自从永久以来,这是唯一没有行复制选项的IDE,我们的开发人员对Xcode中的这种废话感到极为沮丧。我刚刚更新到Xcode 10,并且您猜到了-我的所有快捷键以及行复制功能都被删除了。但是,它可以像原始答案一样固定。这次稍有不同,您将需要以下行:

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

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

编辑: Xcode 8:Buggy,您根本不能修改IDETextKeyBindingSet.plist文件。Xcode在启动时将其重置。苹果公司这个高尚的人真的决心让我们使用复制/粘贴,而不是像其他所有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,转到“首选项”,然后转到“键绑定”选项卡。使用搜索栏进行过滤并查找新的快捷方式。然后,单击快捷方式描述前面的,为其分配您喜欢的快捷方式。确保您的快捷方式与现有的快捷方式没有冲突。

在此处输入图片说明


8

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

当前段落重复

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

删除当前段落

selectParagraph:,
delete:,
moveUp:,
moveToEndOfParagraph:

在Xcode 4.6中工作正常


同意的,可操纵的段落优于行。大家好,让您的编辑器缩小到足以包裹文本并尝试使用line命令的程度。
Logan Moseley 2013年

您的代码包装的窗口有多小。如果经常发生,请考虑将您的代码分成几行。
2016年

3

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

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

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


一旦我意识到必须用逗号后的空格交换(好看的)换行符,此功能就很好用了。
McUsr 2014年


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将该文件保存在纳米编辑器。

UPD:我想出了一个更好的决定,它在复制之前添加了另一行(当您要复制下面紧挨着另一行的行时很有用):

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

1

这是我的删除(CTRL+D)和重复(CMD+ SHIFT+D我的IDETextKeyBindingBindingSet.plist中的)条目。(在/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>

0

任何想匹配崇高的崇高文本用户duplicateLineUpduplicateLineDown在Xcode中,请以下添加到您的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>

0

如果其他任何人都无法编辑IDETextKeyBindingSet.plist,则可以通过以下方式授予自己读/写权限:

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

0

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

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

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


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

支持重复行。(这在Xcode 9.2中有效)


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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.