Visual Studio: 快捷键: 复制行

508

Visual Studio 2008中,是否有一个复制行命令的快捷方式?

一些类似的例子:

  • Notepad++ 中,我可以使用Ctrl+D来复制当前行。
  • EditPlus 中:Ctrl+J
  • NetBeans 中:Ctrl+Shift+/
  • Eclipse 中,Ctrl+Alt+/
  • Vi/Vim 中,yyp
  • 等等。

7
只是提供信息,ReSharper 提供的许多好处之一是能够做到这一点。 - AakashM
2
请下载此链接 https://visualstudiogallery.msdn.microsoft.com/830a6482-3b8f-41a8-97b5-b9c581e5ad8b 并安装,按下 alt + D 将复制您选中的内容,如果未选中任何内容,则复制整行。不幸的是,Visual Basic 宏在 2013 版本中似乎无法使用,只能使用 JS 宏。 - ss7
1
哎呀,为什么在 VS 中赋值组合键和复制行一样麻烦啊?我习惯了 Eclipse。Ctrl + D 在 Eclipse 是删除行的快捷键。 - Andrii Muzychuk
2
@mghhgm,以下是您正在寻找的答案。(shift+alt+向下或shift+alt+向上) - Victor Barrantes
1
vim示例不是复制,而是ctrl+c;ctrl+v。 "Yank"剪切,p粘贴。它与其他示例不完全相同。 - ANeves
现在,这已经成为Visual Studio 2017中的默认命令,绑定到Ctrl-E、V,但您可以将其绑定到任何键。它可以复制行(如果没有选定任何内容),也可以复制选定内容,请参见:https://dailydotnettips.com/did-you-know-now-you-can-duplicate-line-of-code-without-loosing-your-clipboard-content-within-visual-studio/。 - Abel
32个回答

542

在 Visual Studio 2022 中

Ctrl + E, V

在 Visual Studio 2019 中

Ctrl + D

在 Visual Studio 2017(版本号大于等于15.6)中

Ctrl + D

在 Visual Studio 2017(版本号小于15.6)中

(edit) 此功能现在内置于VS2017中:Ctrl + E, V会复制一行,如果没有选择内容,则会复制当前光标所在行。你可以将其分配给不同的快捷键组合,或在菜单中查找:

Duplicate line in VS2017

有关详细信息,请参见此参考资料

在 VS2017 之前使用剪贴板内置方法

如@cand所提到的,您只需执行Ctrl + CCtrl + V即可复制该行。

如果没有选择任何内容,Ctrl + C会复制当前光标所在行。

宏解决方案(VS2017 之前)

如果您想要实现更完整的解决方案,可能是为了创建更简单的键盘快捷方式或者不想影响剪贴板,请参见此指南:

Visual Basic:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
 
Public Module DuplicateLastLineModule
    Sub DuplicateLine()
        Dim line As String
        DTE.ActiveDocument.Selection.StartOfLine(0)
        DTE.ActiveDocument.Selection.EndOfLine(True)
        line = DTE.ActiveDocument.Selection.Text
        DTE.ActiveDocument.Selection.EndOfLine()
        DTE.ActiveDocument.Selection.NewLine()
        DTE.ActiveDocument.Selection.StartOfLine(0)
        DTE.ActiveDocument.Selection.Text = line
    End Sub
End Module

创建宏,只需转到宏浏览器(“工具->宏->宏浏览器”或Alt+F8),并将代码复制粘贴到新模块中。现在只需为其分配键盘快捷键:

  1. 转到“工具->选项…”
  2. 在“环境”下,单击“键盘”
  3. 在“显示包含命令”的文本框中输入“duplicate”(根据您给模块的名称而定)。
  4. 现在您应该能在下面的列表中看到宏
  5. 从“在新快捷方式中使用”列表中选择“文本编辑器”
  6. 在“按键组合”文本框中设置焦点,并按下您希望为其使用的键盘组合(在我的情况下是Ctrl+Shift+D
  7. 点击“分配”按钮
  8. 现在您应该能在“所选命令的快捷键”文本框中看到快捷方式
  9. 点击确定按钮

就是这样。享受吧!


3
我刚试了一下,发现在有短代码的“服务器端代码块”时会重复一些额外字符,比如这样:<div>Profile.UserName: <%=Profile.UserName %></div> - 使用这个宏复制这行后,它就变成了这样:<div>Profile.UserName: <%=Profile.UserName %></div> %></div>。你可以看到,最后部分被“重复”了。当里面没有服务器端代码块时,它能正常工作。你知道如何解决这个问题吗?顺便说一句,我还经历了另一个有趣的事情,就是这个宏相对“慢”,这一点我没想到... :) - Sk8erPeter
6
出于安全考虑,自 2014 年 2 月后,宏被禁用。向下滚动并查看 MasterHD 的答案,以获取绕过安全更新后仍可使用 Wael 方法的解决方法。 - MasterHD
5
我发现在已经复制了某些内容到剪贴板的情况下使用 Ctrl C + Ctrl V 有限制,我希望在粘贴之前可以复制一行。 - sawe
3
为什么实现一个重复操作或按键绑定如此之难,而其他大多数编辑器都可以非常高效和直观地完成呢? :/ - Nasik Shafeek
1
为什么需要这样做呢?我在另一个标签页中复制了一些内容,然后来到这个标签页的特定行,复制了一行并使用 <code> CTRL + V </code> 粘贴了一些代码。否则我就必须再次去复制其他代码部分... - Augustas
显示剩余11条评论

145

有一个免费的扩展程序可供下载,可以在不替换剪贴板内容的情况下复制行。您可以从这里下载。

默认情况下,它绑定到Alt + D,但是您可以通过转到"工具->选项->环境->键盘"来更改快捷键。在搜索框中键入"Duplicate",然后查找"Edit.DuplicateSelection"并编辑快捷方式为所需快捷键。我喜欢使用Ctrl+D以保持与其他编辑器的一致性。


23
这就是你要寻找的真正答案,其他发布在这里的内容都很聪明,但不符合所需求。 - Remco Boom
9
在VSE 2013中似乎没有“Edit.DuplicateSelection”命令,事实上,任何带有“duplicate”这个术语的命令都没有。 - ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
1
http://visualstudiogallery.msdn.microsoft.com/830a6482-3b8f-41a8-97b5-b9c581e5ad8b 适用于 vse2013。 - Anders M.
2
Matthew,您需要点击这里的链接并安装扩展。 然后您必须关闭Visual Studio并重新打开它。 然后您需要转到 工具 ==>选项==>环境==>键盘, 然后您需要输入“Duplicate”,然后您将看到它。 然后您可以按F4键,使其像QEDIT一样工作,或按您想要的方式操作,生活将变得美好。 - ggb667
即使安装另一个工具有点痛苦,但这个工具完成了任务并且做得很好。谢谢! - Sbu
显示剩余4条评论

102

使用简单的快捷键 Ctrl+CCtrl+V 可以实现内容复制和粘贴。如需在 Visual Studio 中复制当前行,只要不选定任何文本,在光标所在行按下 Ctrl+C 即可。此外,您还可以通过链接了解更多信息。


170
有很多情况下,您不想通过剪贴板来复制粘贴内容。比如说,如果您想复制一行并将其中的某些内容替换为剪贴板中的另一段内容,就不需要使用剪贴板了。 - Effata
7
好的,但问题要求一个快捷方式,而不是通用的文本编辑解决方案,因此我认为对于简单的目的来说已经足够了(至少在我的情况下是这样)。 - cand
4
谢谢,但我希望有像Edit Plus中的Ctrl+j或Notepad ++中的Crtl+D这样的功能...在VS2008或VS2010中有吗? - Posto
2
我只找到了这一个。不过它并不那么糟糕——当然,使用ctrl+D会更容易,但如果您想要将一行复制100次,可以使用ctrl+c(无需选择任何内容,只需将命令提示符放在所需的行上)+ 100次ctrl+v。这比ctrl+d解决方案多了一组按键。如果您想要进行更复杂的复制,则可能会更麻烦。 - cand
这根本不起作用,“只要没有选择文本”。不,它只是复制了空白,因此从未更改剪贴板中的内容,然后粘贴任何东西。愚蠢的是,这有76个赞。 - user9993
显示剩余5条评论

86

Ctrl + C + V 组合键在没有扩展插件的情况下,可以在 VS2012 上使用。


也适用于VS2008! - teodron
1
适用于VS2017。 - Kyle Delaney
12
需要一种不会覆盖剪贴板内容的解决方案。 - Pierre de LESPINAY
仅为补充答案,您只需要按下完整的组合键来进行第一次复制。从第二次开始,只需重复按 Ctrl + V 直到您需要复制的行数即可。 - Luty
同样适用于VS2022。 - Melody Magdy
它在V.1.78.2上运行成功。 - MrTo-Kane

34
在 Visual Studio 2013 中,您可以使用 Ctrl+C+V

2
很高兴我走了下来。这就是我想要的。 - Daryl
也可以在VS Code Linux上工作。 - Han
4
需要一种解决方案,可以在不覆盖剪贴板的情况下完成。 - Pierre de LESPINAY
2
最好不要覆盖剪贴板。 - mikus

33

Ctrl + D 是在使用 Resharper 插件时在 VS2012 中的热键组合。


11
不,只是发布后才意识到,但这是Resharper的快捷键。如果安装了Resharper,那么这可能会有所帮助。 - sawe
1
我有resharper,不知道那个快捷键!谢谢。 - DanO
如果您使用的是Resharper的“Resharper 2.x或IntelliJ IDEA”键盘方案,则这是默认的快捷方式。在安装过程中,Resharper会要求您选择键盘映射。其中之一是“Visual Studio”键盘方案。如果您选择了“Visual Studio”键盘方案,则Ctrl+D将映射到其他功能。 - GeoMac
这是对ReSharper问题的答案。 - Antony Booth
请注意,当选择多行时,此功能同样有效,即您可以复制整个代码块,而不仅仅是一行。当然,缺点是Resharper并非免费的(但似乎我来自Java世界的人比.NET世界更习惯这种情况)。 - Amos M. Carpenter

23

这是一个基于Wael发布的链接上的宏的改进版,改进如下:

  • 稍微更短
  • 稍微更快
  • 增加了注释 :)
  • 对以"///"开头的行进行处理
  • 可以通过单个撤消操作来撤销
Imports System
Imports EnvDTE
Imports EnvDTE80

Public Module Module1

    Sub DuplicateLine()
        Dim sel As TextSelection = DTE.ActiveDocument.Selection
        sel.StartOfLine(0) '' move to start
        sel.EndOfLine(True) '' select to end
        Dim line As String = sel.Text
        sel.EndOfLine(False) '' move to end
        sel.Insert(ControlChars.NewLine + line, vsInsertFlags.vsInsertFlagsCollapseToEnd)
    End Sub

End Module

1
是的,这个确实有效,被接受的答案中的那个会将随机内容复制到新行。干得好,谢谢! - zuallauz
我在VS 2010 Express中没有找到宏选项,这个能在那里实现吗? - Joel Peltonen
1
从2014年2月开始,由于安全原因,宏已被禁用。向下滚动并查看MasterHD的答案,以获取在安全更新后使Mark的方法继续工作的解决方法。 - MasterHD

15

在Visual studio 2017和其他版本中无需使用宏或扩展程序

  1. 进入 工具 > 选项 > 环境 > 快捷键
  2. 显示命令包含: 中输入 Edit.Duplicate
  3. 将光标置于 按下快捷键: 处并按下 Ctrl + D,然后点击 分配 按钮
  4. 点击 确定 以保存新的快捷键

输入图像描述


这个答案对我有所帮助,但方式不同。我使用的是VS 2022,之前安装了Resharper试用版,现在已经过期并卸载了。卸载后,所有的宏都变得错误或不存在了。在我选择“从列表中编辑.复制”之后,每个字段都变成了灰色。我不得不按下重置按钮,然后直接从“选定命令的快捷键”字段进行更改。 - Eduard

11

如果你喜欢使用CTRL+ALT+UPCTRL+UP+DOWN来复制Eclipse风格的行(或块),下面是我为此目的发布的宏:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics

Public Module DuplicateLineModule
    Sub DuplicateLineDown()
        Dim selection As TextSelection = DTE.ActiveDocument.Selection
        Dim lineNumber As Integer
        Dim line As String

        If selection.IsEmpty Then
            selection.StartOfLine(0)
            selection.EndOfLine(True)
        Else
            Dim top As Integer = selection.TopLine
            Dim bottom As Integer = selection.BottomLine

            selection.MoveToDisplayColumn(top, 0)
            selection.StartOfLine(0)

            selection.MoveToDisplayColumn(bottom, 0, True)
            selection.EndOfLine(True)
        End If

        lineNumber = selection.TopLine
        line = selection.Text

        selection.MoveToDisplayColumn(selection.BottomLine, 0)
        selection.EndOfLine()
        selection.Insert(vbNewLine & line)
    End Sub
    Sub DuplicateLineUp()
        Dim selection As TextSelection = DTE.ActiveDocument.Selection
        Dim lineNumber As Integer
        Dim line As String

        If selection.IsEmpty Then
            selection.StartOfLine(0)
            selection.EndOfLine(True)
        Else
            Dim top As Integer = selection.TopLine
            Dim bottom As Integer = selection.BottomLine

            selection.MoveToDisplayColumn(top, 0)
            selection.StartOfLine(0)

            selection.MoveToDisplayColumn(bottom, 0, True)
            selection.EndOfLine(True)
        End If

        lineNumber = selection.BottomLine
        line = selection.Text

        selection.MoveToDisplayColumn(selection.BottomLine, 0)
        selection.Insert(vbNewLine & line)
        selection.MoveToDisplayColumn(lineNumber, 0)
    End Sub
End Module

11
在Visual Studio Code(WebMatrix)中:
向下复制行:Shift + Alt + down 向上复制行:Shift + Alt + up 删除行:Ctrl + Shift + k

2
这是目前为止最好的答案;它甚至允许您通过选择多行来复制整个代码块 - 如果您需要的话。在Visual Studio Code 1.7.2中测试过。 - Victor Barrantes

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