首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在sublimetext3中配置排序顺序

在sublimetext3中配置排序顺序
EN

Stack Overflow用户
提问于 2017-02-05 23:26:40
回答 1查看 461关注 0票数 1

我知道如何在Sublime中对行进行排序(ctrl+p“排序”)。问题是它没有按照我想要的方式对一些字符进行排序。

有什么方法可以改变sublime对文本的排序方式吗?也许是通过特定的语言环境?能够将V和W排序为相等也是一件有趣的事情。

示例:我希望以下单词按此顺序排序:

代码语言:javascript
复制
bår
bär
bör

但Sublime是这样排序的:

代码语言:javascript
复制
bär
bår
bör
EN

回答 1

Stack Overflow用户

发布于 2017-02-06 20:32:13

在ST的问题跟踪器上也记录了类似的请求:https://github.com/SublimeTextIssues/Core/issues/1324

其中一个ST开发人员回答说:

Python3中的

排序使用Unicode代码点作为排序的基础。Sublime Text不知道您的编码代表什么语言,因此它不使用基于区域设置的排序规则。

这似乎最好的解决办法是使用一个专门提供基于区域设置的排序规则的包。

使用https://packagecontrol.io/packages/PackageResourceViewer,我们可以看到Packages/Default/sort.py中的case_sensitive_sort方法使用了Python的内置list.sort方法。在ST的Python控制台(视图菜单->显示控制台)中键入以下内容,我们将得到与您所示相同的结果:

代码语言:javascript
复制
>>> a = ['bår', 'bär', 'bör']
>>> a.sort()
>>> a
['bär', 'bår', 'bör']

因此,答案是没有设置来配置排序行为,将来也不太可能。但是,根据https://docs.python.org/3/howto/sorting.html#odd-and-ends的说法,可以使用locale.strxfrm作为关键函数来使用地区感知排序。

让我们试一试。在Windows上,我必须使用

代码语言:javascript
复制
>>> import locale
>>> locale.setlocale(locale.LC_COLLATE, 'sve')
'Swedish_Sweden.1252'

让Python使用瑞典语语言环境-按照https://stackoverflow.com/a/956084/4473405

代码语言:javascript
复制
>>> a.sort(key=locale.strxfrm)
>>> a
['bår', 'bär', 'bör']

利用这些知识,您可以选择更改case_sensitive_sort方法,以便ST的内置排序功能(编辑菜单->排序行(区分大小写))将使用区域设置感知的排序关键字。请注意,保存从PackageResourceViewer打开的sort.py文件将创建覆盖,因此,如果将来的ST构建包含对sort.py的更改,您将无法看到它们,直到您删除覆盖(您可以通过使用Preferences菜单-> Browse Packages -> Default找到该文件来执行此操作。如果合适,您可以在以后使用完全相同的步骤重新应用您的更改。)

您还可以将case_insensitive_sort方法从

代码语言:javascript
复制
txt.sort(key=lambda x: x.lower())

代码语言:javascript
复制
txt.sort(key=lambda x: locale.strxfrm(x.lower()))

请注意,如果没有自动获取正确的语言环境(可能缺省为C),则使用then setting the locale in this (case_sensitive_sort) method isn't recommended, even if, immediately afterwards, you restore it back to what it was beforehand - so use at your own risk

在一些库例程中调用setlocale()通常不是一个好主意,因为它会影响整个程序。保存和恢复它几乎同样糟糕:它很昂贵,并且会影响在恢复设置之前碰巧运行的其他线程。

您可以将以下内容添加到sort.py文件的末尾:

代码语言:javascript
复制
def plugin_loaded():
    import locale
    locale.setlocale(locale.LC_COLLATE, '')

在加载插件时,它将允许Python根据https://docs.python.org/3/library/locale.html#locale.setlocale从您的LANG环境变量中推断区域设置。优点是你只需要设置它一次,并且希望不会在同时执行的其他插件代码中引入任何问题。

祝你排序愉快!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42053753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档