如何在Xcode 8中创建删除行的快捷键?Xcode 3的解决方案已经不再适用。

85
在早期版本的 Xcode 中,可以创建一个键绑定来删除当前行。有不同的解决方案,例如在这里描述:Xcode: Delete line hot-key, Xcode duplicate/delete line, http://bigdiver.wordpress.com/2009/09/11/configure-homeend-key-bidings-on-mac-os-x/http://www.betadesigns.co.uk/Blog/2010/02/03/custom-xcode-shortcuts/
所有的解决方案都包括修改以下文件之一:

~/Library/Application Support/Xcode/Key Bindings/*.pbxkeys
~/Library/KeyBindings/DefaultKeyBinding.dict
~/Library/KeyBindings/PBKeyBinding.dict

关于 Xcode 4 中现有快捷键的很好的资源是 http://cocoasamurai.blogspot.com/2011/03/xcode-4-keyboard-shortcuts-now.html。其中列出了许多删除相关的快捷键,但没有 "delete line" 的选项。
但是,这些解决方案自 Xcode 4 以来就不再起作用更新: 截至 Xcode 5.1.1,问题仍未解决。 更新: 截至 Xcode 6.1 GM Seed 2,问题仍未解决。

更新:截至2016年4月26日,适用于Xcode版本7.3(7D175)。

更新:六年后的现在,Xcode 8.3 已经有了内置的解决方案。请参见下面的答案。


与此同时,我决定使用http://www.keyboardmaestro.com/创建一个键盘宏。 - Klaas
我猜下面列出了一些解决方案。我个人正在使用Keyboard Maestro宏。 - Klaas
13个回答

102

在各种搜索后,我找到了以下解决方案:

按住 control 键,然后按下 AKK

(注意:第二个 K 删除了空行)。

实际上这是两个命令的组合:移动到段落开头删除至段落结尾。您也可以使用/设置其他键和其他命令的键绑定,例如移动到行首删除至行尾。我使用了上述(默认)键绑定,因为它们适合我。

编辑:

要删除多个连续的行,首先按住 control 键,然后按下 A(只需到达段落/行的开头),然后按住 K 直到所有行都被删除(光标仍位于开头)。

为了使任务更容易(对我来说),我已将 commandD 设为删除至段落结尾,并且将 home/end 设置为到达段落开头/结尾。


2
不错的解决方案,但我真的在寻找一个单一的快捷方式。例如,如果我想在TextWrangler中删除5行,只需按五次cmd-d即可。奇怪的是,在Xcode中没有使用cmd-d... - Klaas
@Klaas,请查看我的更新答案。它可能不是你所期望的,但仍然是一个好的解决方案。 - Vasu
一旦你的回答得到了某些赞,我会立刻接受它,因为Xcode 4不会很快包含这个。 - Klaas
xCode太糟糕了!——使用Android Studio的Android开发者。 - M'hamed
有史以来最长的快捷键是CTRL+A+K+K,用于删除当前行。 - canbax

88

看起来Xcode 8.3终于添加了删除行命令

默认情况下,它没有分配键盘快捷键,因此您需要自己添加:

  1. 打开 Xcode > 偏好设置 > 按键绑定
  2. 搜索 删除行
  3. 列中添加一个键盘快捷键(例如,controloptionD

Xcode Key Bindings


1
哇!好棒的发现!从没想过这会发生! - Klaas
1
@Klaas 我也是啊,从没想过会看到这个!我在Xcode 8.2.1和Xcode 8.3.2的IDETextKeyBindingSet.plist文件之间运行了差异比较,并且唯一检测到的更改是上面这个删除行命令 :( - Paulo Mattos
@PauloMattos 我没有... - Alexandre G
有人知道 Xcode 9 的解决办法吗?在 beta5 中仍未修复。 - Jason C. Howlin
3
我在 Xcode 9 Beta 中找到了一个解决方法。请查看下面的答案:https://dev59.com/zG025IYBdhLWcg3wvIcn#45868495 - Wooseong Kim
显示剩余5条评论

59

搞定了!这适用于 XCode 4.3 到 4.5,无需额外的应用程序且是 XCode 特有的。

此解决方案基本与此处描述的“复制行”命令相同:

编辑 plist 文件

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

请注意:

  • 链接的答案建议使用 XCode 完成,但我发现这会导致 XCode 崩溃
  • 此路径适用于 Lion - 可能因其他操作系统版本而异
  • 您可能需要使用 sudo 或更改权限才能编辑此文件
  • 在编辑之前关闭 XCode

添加新的 <dict> 元素

将此文本添加到该文件底部结束标记的上方

    <key>Custom</key>
    <dict>
      <key>Delete Current Line In One Hit</key>
      <string>moveToEndOfLine:, deleteToBeginningOfLine:, deleteToEndOfParagraph:</string> 
    </dict>
请注意:
  • 这个代码是嵌套在现有的<dict>标签内部的,因此之后还有一个</dict></plist>
  • 这将把命名为“Delete Current Line In One Hit”的操作与字符串中的三个按键操作关联起来。我尝试了不同的选项以得到正确的组合。例如,如果您尝试moveToBeginningOfLine、deleteToEndOfLine而不是相反顺序,则在空行上使用它将删除该行以及整个下一行,这是不好的。

保存并打开XCode

在XCode中添加新的键绑定

请参见链接的答案中的截图,或者按照以下步骤操作:

  1. 打开XCode首选项
  2. 选择Key Bindings
  3. 点击All
  4. 在搜索框中输入“Delete”,并搜索“Delete Current Line in One Hit”
  5. 添加你的新绑定。

这样应该就可以了,但有一个例外。我从来没能让XCode保存新的绑定。 虽然我的解决方法有些变化,但在这里也描述了同样的问题:

  1. 创建默认绑定的副本(点击Bindings窗口左下角的“+”按钮并创建一个副本)
  2. 在副本中设置新的绑定
  3. 关闭首选项对话框(这就是变化所在!)
  4. 再次打开首选项并复制旧副本的新副本,然后删除旧副本。

真是个麻烦的过程,不是吗?但它起作用了。现在我把Ctrl+D映射到XCode 4.3上删除整个当前行。


是的,它可以在Xcode 5中运行,并保存关键绑定,这可能会鼓励其他人认为它值得一试 :) - RedYeti
@Rhubarb 如果您想要删除多行文本,只需选择这些行中的文本并按下快捷键,然后在命令序列前添加“delete:”即可:delete:, moveToEndOfLine:, deleteToBeginningOfLine:, deleteToEndOfParagraph:。如果您能将此内容编辑到您的答案中,那就太好了。 - Maic López Sáenz
2
这在Xcode 6.2 (6C86e)中有效,而且我也不需要绕过来让Xcode“保存”键绑定的解决方法。耶! :) - Will Hains
这个方法在Xcode 6.4中完美运行:我用它创建了一个“复制行”键绑定。谢谢! - MustangXY
这个解决方案对我很有用,但每次更新XCode后,我都会丢失快捷方式。我该怎么办? - lorenzo
显示剩余6条评论

16

我找到了一个临时解决方案,用于Xcode 9

打开Xcode/Content/Frameworks/IDEKit.framework/Resources/IDETextK‌​eyBindingSet.plist并添加以下行。

它模拟了在具有有限支持的Xcode 8中发生的操作。它只能删除一行,但我还是很满意。希望这个问题可以尽快解决。

<key>Customized</key>
<dict>
    <key>Delete Line</key>
    <string>moveToBeginningOfLine:, deleteToEndOfLine:, moveDown:, deleteBackward:</string>
</dict>
重启 Xcode 后,您可以在 Key Bindings 中看到类似下图的自定义项目。

enter image description here

进行绑定并使用吧!

(编辑)我认为以下版本比原来的更好。

<string>moveToEndOfLine:, deleteToBeginningOfLine:, deleteToEndOfParagraph:</string>

2
这里是Xcode 9的正确答案。它适用于Xcode 9版本9.0(9A235)。 - uspython
为什么这在Xcode 9中出问题了?这在某种程度上对我有效。我不得不替换现有的Delete Line字符串值的值,而不是添加自定义键。 - Alexander Smith

13

好的替代方案是修改 plist 不总是好的选择,而且很容易丢失设置。希望苹果能够改进使其更加适用。 - Albert.Qing
非常好的解决问题的替代方案。不幸的是,它不是原子操作,因此如果您想要撤消,则必须按两次Cmd Z(即两个删除)。此外,窗口管理器附加程序也很有用(我还建议使用Spectacle)。 - Rudolf Real
1
BTT是一个非常棒的工具。只要苹果有可以组合实现你想要的功能,这种方法就非常具有未来性。 - SuperDuperTango
1
我之前没有考虑过使用BTT(作为我已经在使用的东西!)比在应用程序内部编辑要好得多。此外,您可以在机器之间同步配置,这是我需要的功能。 - Relequestual

9

Rhubarb的答案是正确的并且有效,但有一点需要注意,在plist文件中还有更简单的命令。

按照Rhubarb的所有指示操作,但是

不要使用

<string>moveToEndOfLine:, deleteToBeginningOfLine:, deleteToEndOfParagraph:</string>

使用以下内容
<string>selectLine:, delete:</string>

这样更加清晰,并且消除了任何故障的可能性。

我想把这写成注释,但是我的“声望”不允许我这样做。


将您的解决方案与此答案混合使用即可解决问题。非常感谢。 - marcelosalloum

8

尝试以下操作:

  1. 首先打开Xcode->偏好设置

  2. 选择键绑定

  3. 搜索删除段落

  4. 删除段落更改为您的快捷方式

enter image description here


1
我不知道为什么其他人没有使用这个简单的解决方案。请投票支持它,因为其他方法都更加复杂。这个方法也是你应该采用的:通过键绑定实现。 - checklist
在Xcode版本9.0(9A235)中执行“删除段落”时没有任何反应。你在Xcode 9中测试过吗? - Wooseong Kim

3
如果您是Keyboard Maestro用户,只需创建一个宏来执行以下操作:
  • Command Left Arrow
  • Shift Down Arrow
  • Delete
我将其分配为Command-D,并仅在Xcode中可用。

我正在使用Better Touch Tool,你也应该能够在其中分配它。 - abc123

1

看起来现在似乎无法完成...如果我错了,请随意纠正我...但这是我的新解决方案...

进入Xcode首选项,然后选择键绑定选项卡。复制默认设置,这样当我提出的建议破坏你将要使用的东西时,你就不会生气。

找到两个相邻且未用于任何你使用的命令的键...也许是“;”、“'”。(我不使用命令n来创建新文件,所以我选择了n、m)

将第一个键设置为“移动到行首”,将第二个键设置为“删除到行尾”

然后使用该序列删除一行...

另一种方法是将某些内容设置为选择行,然后只需使用删除即可。


1

看起来XCode现在使用plist文件而不是dict文件,新格式不支持将多个命令添加到键绑定中。似乎也没有办法添加自定义命令进行绑定。我发现唯一能让它工作的方法是为单独操作设置按键绑定,例如^D对应deleteToEndOfLine:,然后^L对应moveToBeginningOfLine:,这样就可以得到^L+^D以实现组合效果。


已经有一些默认设置来处理此问题。^k用于“删除至行尾”,cmd-delete用于“删除至行首”。 - Klaas
在常规(全局)keybindings.dict文件中,我们将单独的命令放入数组中,这样就可以使用了。 - McUsr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接