从Visual Studio上下文菜单中对选定的文本进行排序

57

目前,Visual Studio拥有一个非常有用的功能:对using进行排序(C#)。

我希望能够针对任意文本实现相同的功能,例如配置文件中的XML节点。

实现这个功能有多复杂?需要使用VS插件,对吗?是否可能调用一些用于对using进行排序的VS API?


2
快速而简单的方法:复制到Notepad ++中,选择“编辑”>“行操作”,单击您想要排序的方式,然后将其复制回Visual Studio。 - user1007074
7个回答

40

VS 2019 & VS 2022:

  1. 选择行。光标所在的最后一个选择的行会被考虑在内,即使它是空的并且没有可见的选择。
  2. Shift + Alt + L, Shift + Alt + S => 升序排序。
  3. Shift + Alt + L, Shift + Alt + S(相同的选择和相同的按键)=> 降序排序。

该命令也可以从菜单中调用(@sharpener):编辑 | 高级 | 排序行

此快捷方式适用于最常用的方案:Visual C++ 6键盘映射方案(可能还有其他方案)。您可以在 选项| 键盘| 应用以下其他键盘映射方案:中检查您的方案。

您可以在 选项| 键盘| 显示包含命令:Edit.SortLines的命令|所选命令的快捷方式:中检查快捷方式。


3
或者:如果快捷键被分配给其他功能,则编辑|高级|排序行... - sharpener
4
这个回答需要更多的赞,它现在已经集成到VS中了,这是大多数人会寻找的!(谢天谢地,这个答案在Google中被显示出来了。) - Issung
@zdf - 现在如果您知道这在VS中代表哪些命令,那将更方便,因为我们可以为其创建自己的工具栏按钮。 - PKD
1
如果您想覆盖键盘快捷方式;在Visual Studio 2019/2022中,可以在键盘命令键“Edit.SortLines”下找到。相同的按键绑定根据当前选择文本进行升序/降序排序。 - Aaron
我不理解 "(same selection same keys) => Descending sort." 这部分,我尝试了两次以为它会改变排序方向。但它并没有。有人能解释一下吗?非常感谢。 - EBDS
@EBDS 你要么做错了什么,要么你的命令绑定不同。要检查绑定,请转到“工具|自定义|键盘...|显示包含命令:Edit.SortLines”的选项卡,并检查“所选命令的快捷方式:”。 - zdf

26

一个很棒的Visual Studio插件是Code Maid

你可以选择一些行,然后从上下文菜单中选择“排序行”

输入图像描述

然后,你的行就以字母顺序漂亮地排序了:

输入图像描述


当编辑C++源文件时,Code Maid 10.2在VisualStudio 2013上无法正常工作。所选行未更改。 - Eponymous

24

编辑:请注意,此解决方案不适用于VS2013或更高版本,因为支持宏已被移除。

您并不一定需要编写一个VS插件来实现此功能:Visual Studio内置了宏。要开始使用,请使用“工具”、“宏”、“记录临时宏”。

以下是我根据“记录临时宏”给出的代码整合出来的“排序行”命令:

Imports System
Imports EnvDTE

Public Module TimModule
    Sub SortLines()
        Dim Selection As TextSelection = DTE.ActiveDocument.Selection
        Dim Lines() As String = Selection.Text.Replace(Environment.NewLine, Chr(13)).Split(Chr(13))
        Array.Sort(Lines)
        DTE.UndoContext.Open("Sort Lines")
        ' Edit - see comments
        ' Selection.Text = String.Join(Environment.NewLine, Lines)
        Selection.Delete
        Selection.Insert(String.Join(Environment.NewLine, Lines)) 
        DTE.UndoContext.Close()
    End Sub
End Module

6
你正在使用TextSelection.Text属性来更改文本。这通常是执行速度非常慢的原因。可能需要几秒钟甚至更长时间。更好的方法是使用TextSelection.Insert和Delete方法。虽然我没有测试过,但我建议用以下两行替换一行代码: Selection.Text = String.Join(Environment.NewLine, Lines) Selection.Delete Selection.Insert(String.Join(Environment.NewLine, Lines))接下来,你可以将宏放置在工具栏或菜单上(http://www.helixoft.com/blog/archives/7),或为其分配快捷键(http://www.helixoft.com/blog/archives/8)。 - Peter Macej
2
@Peter,谢谢。我没有花太长时间写这个 - 如果你在原帖中添加一个答案,我会投票支持它。 - Tim Robinson
好的,我在正确的轨道上:我的文档使用LF作为行尾(又称'\n')。因此,Environment.NewLine与我的行分隔符不同。是否有一种方法可以按文件访问每个文件的行分隔符?当我打开具有不一致行结尾的文件时,VS会询问我是否要对其进行规范化,因此我认为当前打开的文档可能有一个属性,保存行分隔符。有人知道如何找到它吗? - Anton Daneyko
我的当前解决方法是使用Chr(10)代替Environment.NewLine。 - Anton Daneyko
9
VS 2012不再支持宏。 - Doug Domeny
显示剩余3条评论

14
刚找到一个好用的免费插件:Menees VS Tools 2012 (或2010版本) - 它可以完成你所需的所有操作,还有一些文字技巧。 安装时出现了一些小问题,但在我在评论页面上留言后,它在几天内就得到解决。 好极了! =)

现在有一个2017版本:Menees VS Tools 2017


@zdf 的回答非常完美,因为它是直接内置在 Studio 中的。 - PKD

7

这个问题仍然出现在搜索结果的顶部,因此我将添加最新的解决方案。 如果您正在运行当前的VS Code(为什么不呢?),则可以使用内置的排序器,方法是按下ctrl-shift-p(Mac为cmd-shift-p),在随后的搜索框中输入“sort”即可。有许多选项可供选择。


6

您可以将代码复制到Sublime Text中,选择代码部分并按F9键(或转到编辑 > 排序行)。 然后您可以将其复制回Visual Studio。


好主意。对于Emacs也是一样的:标记区域,然后按Alt-X键,再输入sort-lines即可排序。 - user829755
遗憾的是,这就是我所做的...但是我想跳过复制粘贴 :) - Noctis

5
我个人正在使用 Mads Kristensen 开发的 Web Essentials 扩展程序。 您只需选择要排序的行,按下 Alt+3 或 Alt+4(升序/降序)。

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