我知道如何在Sublime中对行进行排序(ctrl + p“sort”)。问题是它没有按照我的意愿对某些字符进行排序,即åäö。
有没有办法改变sublime命令文本的方式?也许是通过特定的区域设置?能够将V和W排序为相等也很有趣。
示例:我希望按以下顺序对以下单词进行排序:
proc_a
但Sublime对此进行排序:
bår
bär
bör
答案 0 :(得分:0)
在ST&#39的问题跟踪器上记录了类似的请求:https://github.com/SublimeTextIssues/Core/issues/1324
其中一位ST开发商回复说:
Python 3中的排序使用Unicode代码点作为排序的基础。 Sublime Text不知道您的编码所代表的语言,因此它不会使用基于区域设置的排序规则。
这似乎最好通过专用于提供基于区域设置的归类规则的包来解决。
使用https://packagecontrol.io/packages/PackageResourceViewer,我们可以看到case_sensitive_sort
中的Packages/Default/sort.py
方法使用了内置list.sort
方法的Python。在ST的Python控制台(View菜单 - > Show Console)中键入以下内容,我们得到的结果与您所示的相同:
>>> 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上,我不得不使用
>>> import locale
>>> locale.setlocale(locale.LC_COLLATE, 'sve')
'Swedish_Sweden.1252'
让Python使用瑞典语语言环境 - 按照https://stackoverflow.com/a/956084/4473405
>>> a.sort(key=locale.strxfrm)
>>> a
['bår', 'bär', 'bör']
使用这些知识,您可以选择更改case_sensitive_sort
方法,以便ST内置的排序功能(编辑菜单 - >排序行(区分大小写))将使用区域设置感知排序键。请注意,保存从PackageResourceViewer打开的sort.py
文件将创建一个覆盖,因此如果ST的未来版本包含对sort.py
的更改,您将无法看到它们,直到您删除覆盖(您可以通过使用“首选项”菜单查找文件来完成 - >浏览包 - >默认。您可以使用完全相同的步骤,然后在适当的时候重新应用您的更改。)
您也可以从
更改case_insensitive_sort
方法
txt.sort(key=lambda x: x.lower())
到
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
文件的末尾:
def plugin_loaded():
import locale
locale.setlocale(locale.LC_COLLATE, '')
这将在加载插件时允许Python根据https://docs.python.org/3/library/locale.html#locale.setlocale推断LANG
env var中的区域设置。优点是你只设置一次,并希望不会同时引入其他插件代码的任何问题。
快乐排序!